From a17ca8260aa4a1e414b6a19d3faeb18f914c3f31 Mon Sep 17 00:00:00 2001
From: brad kittenbrink <brad@lindenlab.com>
Date: Mon, 26 Oct 2009 16:08:43 -0400
Subject: [PATCH 001/557] Beginning work for DEV-41722 normalizing shared lib
 staging on all 3 platforms.  Renamed CopyWinLibs.cmake to
 Copy3rdPartyLibs.cmake.

---
 indra/cmake/CMakeLists.txt         |   2 +-
 indra/cmake/Copy3rdPartyLibs.cmake | 223 +++++++++++++++++++++++++++++
 indra/llcommon/CMakeLists.txt      |   4 +-
 3 files changed, 225 insertions(+), 4 deletions(-)
 create mode 100644 indra/cmake/Copy3rdPartyLibs.cmake

diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt
index 4563b59ad2b..4fc25dcc241 100644
--- a/indra/cmake/CMakeLists.txt
+++ b/indra/cmake/CMakeLists.txt
@@ -16,7 +16,7 @@ set(cmake_SOURCE_FILES
     CARes.cmake
     CURL.cmake
     CMakeCopyIfDifferent.cmake
-    CopyWinLibs.cmake
+    Copy3rdPartyLibs.cmake
     CSharpMacros.cmake
     DBusGlib.cmake
     DirectX.cmake
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
new file mode 100644
index 00000000000..8f27c706109
--- /dev/null
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -0,0 +1,223 @@
+# -*- cmake -*-
+
+# The copy_win_libs folder contains file lists and a script used to
+# copy dlls, exes and such needed to run the SecondLife from within
+# VisualStudio.
+
+include(CMakeCopyIfDifferent)
+
+if(WINDOWS)
+#*******************************
+# VIVOX - *NOTE: no debug version
+set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-win32")
+set(vivox_files
+    SLVoice.exe
+    alut.dll
+    vivoxsdk.dll
+    ortp.dll
+    wrap_oal.dll
+    )
+copy_if_different(
+    ${vivox_src_dir}
+    "${SHARED_LIB_STAGING_DIR}/Debug"
+    out_targets 
+   ${vivox_files}
+    )
+set(third_party_targets ${third_party_targets} ${out_targets})
+
+copy_if_different(
+    ${vivox_src_dir}
+    "${SHARED_LIB_STAGING_DIR}/Release"
+    out_targets
+    ${vivox_files}
+    )
+set(third_party_targets ${third_party_targets} ${out_targets})
+
+copy_if_different(
+    ${vivox_src_dir}
+    "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo"
+    out_targets
+    ${vivox_files}
+    )
+set(third_party_targets ${third_party_targets} ${out_targets})
+
+#*******************************
+# Misc shared libs 
+set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug")
+set(debug_files
+    openjpegd.dll
+    libtcmalloc_minimal-debug.dll
+    libapr-1.dll
+    libaprutil-1.dll
+    libapriconv-1.dll
+    )
+if (FMOD_SDK_DIR)
+    set(fmod_files fmod.dll)
+    copy_if_different(
+        ${FMOD_SDK_DIR} 
+        "${CMAKE_CURRENT_BINARY_DIR}/Debug"
+        out_targets 
+        ${fmod_files}
+        )
+    set(all_targets ${all_targets} ${out_targets})
+    copy_if_different(
+        ${FMOD_SDK_DIR} 
+        "${CMAKE_CURRENT_BINARY_DIR}/Release"
+        out_targets 
+        ${fmod_files}
+        )
+    set(all_targets ${all_targets} ${out_targets})
+    copy_if_different(
+        ${FMOD_SDK_DIR} 
+        "${CMAKE_CURRENT_BINARY_DIR}/RelWithDbgInfo"
+        out_targets 
+        ${fmod_files}
+        )
+    set(all_targets ${all_targets} ${out_targets})
+endif (FMOD_SDK_DIR)
+
+copy_if_different(
+    ${debug_src_dir}
+    "${SHARED_LIB_STAGING_DIR}/Debug"
+    out_targets
+    ${debug_files}
+    )
+set(third_party_targets ${third_party_targets} ${out_targets})
+
+set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
+set(release_files
+    openjpeg.dll
+    libtcmalloc_minimal.dll
+    libapr-1.dll
+    libaprutil-1.dll
+    libapriconv-1.dll
+    )
+
+copy_if_different(
+    ${release_src_dir}
+    "${SHARED_LIB_STAGING_DIR}/Release"
+    out_targets
+    ${release_files}
+    )
+set(third_party_targets ${third_party_targets} ${out_targets})
+
+copy_if_different(
+    ${release_src_dir}
+    "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo"
+    out_targets
+    ${release_files}
+    )
+set(third_party_targets ${third_party_targets} ${out_targets})
+
+#*******************************
+# LLKDU
+set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu")
+if(NOT EXISTS ${internal_llkdu_path})
+    if (EXISTS "${debug_src_dir}/llkdu.dll")
+        set(debug_llkdu_src "${debug_src_dir}/llkdu.dll")
+        set(debug_llkdu_dst "${SHARED_LIB_STAGING_DIR}/Debug/llkdu.dll")
+        ADD_CUSTOM_COMMAND(
+            OUTPUT  ${debug_llkdu_dst}
+            COMMAND ${CMAKE_COMMAND} -E copy_if_different ${debug_llkdu_src} ${debug_llkdu_dst}
+            DEPENDS ${debug_llkdu_src}
+            COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR}/Debug"
+            )
+        set(third_party_targets ${third_party_targets} $} ${debug_llkdu_dst})
+    endif (EXISTS "${debug_src_dir}/llkdu.dll")
+
+    if (EXISTS "${release_src_dir}/llkdu.dll")
+        set(release_llkdu_src "${release_src_dir}/llkdu.dll")
+        set(release_llkdu_dst "${SHARED_LIB_STAGING_DIR}/Release/llkdu.dll")
+        ADD_CUSTOM_COMMAND(
+            OUTPUT  ${release_llkdu_dst}
+            COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${release_llkdu_dst}
+            DEPENDS ${release_llkdu_src}
+            COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR}/Release"
+            )
+        set(third_party_targets ${third_party_targets} ${release_llkdu_dst})
+
+        set(relwithdebinfo_llkdu_dst "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/llkdu.dll")
+        ADD_CUSTOM_COMMAND(
+            OUTPUT  ${relwithdebinfo_llkdu_dst}
+            COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${relwithdebinfo_llkdu_dst}
+            DEPENDS ${release_llkdu_src}
+            COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo"
+            )
+        set(third_party_targets ${third_party_targets} ${relwithdebinfo_llkdu_dst})
+    endif (EXISTS "${release_src_dir}/llkdu.dll")
+
+endif (NOT EXISTS ${internal_llkdu_path})
+
+#*******************************
+# Copy MS C runtime dlls, required for packaging.
+# *TODO - Adapt this to support VC9
+if (MSVC80)
+    FIND_PATH(debug_msvc8_redist_path msvcr80d.dll
+        PATHS
+         [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0\\Setup\\VC;ProductDir]/redist/Debug_NonRedist/x86/Microsoft.VC80.DebugCRT
+        NO_DEFAULT_PATH
+        NO_DEFAULT_PATH
+        )
+
+    if(EXISTS ${debug_msvc8_redist_path})
+        set(debug_msvc8_files
+            msvcr80d.dll
+            msvcp80d.dll
+            Microsoft.VC80.DebugCRT.manifest
+            )
+
+        copy_if_different(
+            ${debug_msvc8_redist_path}
+            "${SHARED_LIB_STAGING_DIR}/Debug"
+            out_targets
+            ${debug_msvc8_files}
+            )
+        set(third_party_targets ${third_party_targets} ${out_targets})
+
+    endif (EXISTS ${debug_msvc8_redist_path})
+
+    FIND_PATH(release_msvc8_redist_path msvcr80.dll
+        PATHS
+         [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0\\Setup\\VC;ProductDir]/redist/x86/Microsoft.VC80.CRT
+        NO_DEFAULT_PATH
+        NO_DEFAULT_PATH
+        )
+
+    if(EXISTS ${release_msvc8_redist_path})
+        set(release_msvc8_files
+            msvcr80.dll
+            msvcp80.dll
+            Microsoft.VC80.CRT.manifest
+            )
+
+        copy_if_different(
+            ${release_msvc8_redist_path}
+            "${SHARED_LIB_STAGING_DIR}/Release"
+            out_targets
+            ${release_msvc8_files}
+            )
+        set(third_party_targets ${third_party_targets} ${out_targets})
+
+        copy_if_different(
+            ${release_msvc8_redist_path}
+            "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo"
+            out_targets
+            ${release_msvc8_files}
+            )
+        set(third_party_targets ${third_party_targets} ${out_targets})
+          
+    endif (EXISTS ${release_msvc8_redist_path})
+endif (MSVC80)
+
+elseif(DARWIN)
+    
+elseif(LINUX)
+    
+else(WINDOWS)
+    message(STATUS "WARNING: unrecognized platform for staging 3rd party libs, skipping...")
+endif(WINDOWS)
+
+add_custom_target(stage_third_party_libs ALL
+  DEPENDS 
+    ${third_party_targets}
+  )
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index e7aaf3c984d..7a7281a4a7e 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -8,9 +8,7 @@ include(Linking)
 include(Boost)
 include (Pth)
 
-if (WINDOWS)
-    include(CopyWinLibs)
-endif (WINDOWS)
+include(Copy3rdPartyLibs)
 
 include_directories(
     ${EXPAT_INCLUDE_DIRS}
-- 
GitLab


From 89e3523052a9b1ac5534e3e30fa312ef11a78f69 Mon Sep 17 00:00:00 2001
From: brad kittenbrink <brad@lindenlab.com>
Date: Mon, 26 Oct 2009 18:13:20 -0400
Subject: [PATCH 002/557] More work for DEV-41722 normalizing shared lib
 staging on all 3 platforms. Started refactoring Copy3rdPartyLibs.cmake to use
 common commands with platform specific variables.

---
 indra/cmake/Copy3rdPartyLibs.cmake | 177 ++++++++++++++++++-----------
 1 file changed, 111 insertions(+), 66 deletions(-)

diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index 8f27c706109..cb8ed4f05f2 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -7,6 +7,10 @@
 include(CMakeCopyIfDifferent)
 
 if(WINDOWS)
+    set(SHARED_LIB_STAGING_DIR_DEBUG            "${SHARED_LIB_STAGING_DIR}/Debug")
+    set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO   "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo")
+    set(SHARED_LIB_STAGING_DIR_RELEASE          "${SHARED_LIB_STAGING_DIR}/Release")
+
 #*******************************
 # VIVOX - *NOTE: no debug version
 set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-win32")
@@ -17,32 +21,11 @@ set(vivox_files
     ortp.dll
     wrap_oal.dll
     )
-copy_if_different(
-    ${vivox_src_dir}
-    "${SHARED_LIB_STAGING_DIR}/Debug"
-    out_targets 
-   ${vivox_files}
-    )
-set(third_party_targets ${third_party_targets} ${out_targets})
-
-copy_if_different(
-    ${vivox_src_dir}
-    "${SHARED_LIB_STAGING_DIR}/Release"
-    out_targets
-    ${vivox_files}
-    )
-set(third_party_targets ${third_party_targets} ${out_targets})
-
-copy_if_different(
-    ${vivox_src_dir}
-    "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo"
-    out_targets
-    ${vivox_files}
-    )
-set(third_party_targets ${third_party_targets} ${out_targets})
 
 #*******************************
 # Misc shared libs 
+
+# *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
 set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug")
 set(debug_files
     openjpegd.dll
@@ -51,6 +34,17 @@ set(debug_files
     libaprutil-1.dll
     libapriconv-1.dll
     )
+
+# *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
+set(release_files
+    openjpeg.dll
+    libtcmalloc_minimal.dll
+    libapr-1.dll
+    libaprutil-1.dll
+    libapriconv-1.dll
+    )
+
 if (FMOD_SDK_DIR)
     set(fmod_files fmod.dll)
     copy_if_different(
@@ -76,38 +70,6 @@ if (FMOD_SDK_DIR)
     set(all_targets ${all_targets} ${out_targets})
 endif (FMOD_SDK_DIR)
 
-copy_if_different(
-    ${debug_src_dir}
-    "${SHARED_LIB_STAGING_DIR}/Debug"
-    out_targets
-    ${debug_files}
-    )
-set(third_party_targets ${third_party_targets} ${out_targets})
-
-set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
-set(release_files
-    openjpeg.dll
-    libtcmalloc_minimal.dll
-    libapr-1.dll
-    libaprutil-1.dll
-    libapriconv-1.dll
-    )
-
-copy_if_different(
-    ${release_src_dir}
-    "${SHARED_LIB_STAGING_DIR}/Release"
-    out_targets
-    ${release_files}
-    )
-set(third_party_targets ${third_party_targets} ${out_targets})
-
-copy_if_different(
-    ${release_src_dir}
-    "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo"
-    out_targets
-    ${release_files}
-    )
-set(third_party_targets ${third_party_targets} ${out_targets})
 
 #*******************************
 # LLKDU
@@ -115,33 +77,33 @@ set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu")
 if(NOT EXISTS ${internal_llkdu_path})
     if (EXISTS "${debug_src_dir}/llkdu.dll")
         set(debug_llkdu_src "${debug_src_dir}/llkdu.dll")
-        set(debug_llkdu_dst "${SHARED_LIB_STAGING_DIR}/Debug/llkdu.dll")
+        set(debug_llkdu_dst "${SHARED_LIB_STAGING_DIR_DEBUG}/llkdu.dll")
         ADD_CUSTOM_COMMAND(
             OUTPUT  ${debug_llkdu_dst}
             COMMAND ${CMAKE_COMMAND} -E copy_if_different ${debug_llkdu_src} ${debug_llkdu_dst}
             DEPENDS ${debug_llkdu_src}
-            COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR}/Debug"
+            COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR_DEBUG}"
             )
         set(third_party_targets ${third_party_targets} $} ${debug_llkdu_dst})
     endif (EXISTS "${debug_src_dir}/llkdu.dll")
 
     if (EXISTS "${release_src_dir}/llkdu.dll")
         set(release_llkdu_src "${release_src_dir}/llkdu.dll")
-        set(release_llkdu_dst "${SHARED_LIB_STAGING_DIR}/Release/llkdu.dll")
+        set(release_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELEASE}/llkdu.dll")
         ADD_CUSTOM_COMMAND(
             OUTPUT  ${release_llkdu_dst}
             COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${release_llkdu_dst}
             DEPENDS ${release_llkdu_src}
-            COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR}/Release"
+            COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR_RELEASE}"
             )
         set(third_party_targets ${third_party_targets} ${release_llkdu_dst})
 
-        set(relwithdebinfo_llkdu_dst "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/llkdu.dll")
+        set(relwithdebinfo_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}/llkdu.dll")
         ADD_CUSTOM_COMMAND(
             OUTPUT  ${relwithdebinfo_llkdu_dst}
             COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${relwithdebinfo_llkdu_dst}
             DEPENDS ${release_llkdu_src}
-            COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo"
+            COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}"
             )
         set(third_party_targets ${third_party_targets} ${relwithdebinfo_llkdu_dst})
     endif (EXISTS "${release_src_dir}/llkdu.dll")
@@ -168,7 +130,7 @@ if (MSVC80)
 
         copy_if_different(
             ${debug_msvc8_redist_path}
-            "${SHARED_LIB_STAGING_DIR}/Debug"
+            "${SHARED_LIB_STAGING_DIR_DEBUG}"
             out_targets
             ${debug_msvc8_files}
             )
@@ -192,7 +154,7 @@ if (MSVC80)
 
         copy_if_different(
             ${release_msvc8_redist_path}
-            "${SHARED_LIB_STAGING_DIR}/Release"
+            "${SHARED_LIB_STAGING_DIR_RELEASE}"
             out_targets
             ${release_msvc8_files}
             )
@@ -200,7 +162,7 @@ if (MSVC80)
 
         copy_if_different(
             ${release_msvc8_redist_path}
-            "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo"
+            "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}"
             out_targets
             ${release_msvc8_files}
             )
@@ -210,13 +172,96 @@ if (MSVC80)
 endif (MSVC80)
 
 elseif(DARWIN)
-    
+    set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/universal-darwin")
+    set(vivox_files
+       )
+    # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+    set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib/debug")
+    set(debug_files
+       )
+    # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+    set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib/release")
+    set(release_files
+       )
 elseif(LINUX)
-    
+    set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-linux")
+    set(vivox_files
+       )
+    # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+    set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/debug")
+    set(debug_files
+       )
+    # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+    set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/release")
+    set(release_files
+       )
 else(WINDOWS)
     message(STATUS "WARNING: unrecognized platform for staging 3rd party libs, skipping...")
+    set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-linux")
+    set(vivox_files
+       )
+    # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+    set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/debug")
+    set(debug_files
+       )
+    # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+    set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/release")
+    set(release_files
+       )
 endif(WINDOWS)
 
+
+copy_if_different(
+    ${vivox_src_dir}
+    "${SHARED_LIB_STAGING_DIR_DEBUG}"
+    out_targets 
+   ${vivox_files}
+    )
+set(third_party_targets ${third_party_targets} ${out_targets})
+
+copy_if_different(
+    ${vivox_src_dir}
+    "${SHARED_LIB_STAGING_DIR_RELEASE}"
+    out_targets
+    ${vivox_files}
+    )
+set(third_party_targets ${third_party_targets} ${out_targets})
+
+copy_if_different(
+    ${vivox_src_dir}
+    "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}"
+    out_targets
+    ${vivox_files}
+    )
+set(third_party_targets ${third_party_targets} ${out_targets})
+
+
+
+copy_if_different(
+    ${debug_src_dir}
+    "${SHARED_LIB_STAGING_DIR_DEBUG}"
+    out_targets
+    ${debug_files}
+    )
+set(third_party_targets ${third_party_targets} ${out_targets})
+
+copy_if_different(
+    ${release_src_dir}
+    "${SHARED_LIB_STAGING_DIR_RELEASE}"
+    out_targets
+    ${release_files}
+    )
+set(third_party_targets ${third_party_targets} ${out_targets})
+
+copy_if_different(
+    ${release_src_dir}
+    "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}"
+    out_targets
+    ${release_files}
+    )
+set(third_party_targets ${third_party_targets} ${out_targets})
+
+
 add_custom_target(stage_third_party_libs ALL
   DEPENDS 
     ${third_party_targets}
-- 
GitLab


From cddf7f19c5741272f4d1cc2b124ff77f11b873a6 Mon Sep 17 00:00:00 2001
From: brad kittenbrink <brad@lindenlab.com>
Date: Fri, 30 Oct 2009 18:14:58 -0400
Subject: [PATCH 003/557] continuing work on DEV-41722 normalizing shared lib
 staging. started factoring out copying into common section while file lists
 are initialized above in platform specific sections.

---
 indra/cmake/Copy3rdPartyLibs.cmake | 254 ++++++++++++++++++-----------
 1 file changed, 155 insertions(+), 99 deletions(-)

diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index cb8ed4f05f2..5f9d386a4f9 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -11,104 +11,59 @@ if(WINDOWS)
     set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO   "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo")
     set(SHARED_LIB_STAGING_DIR_RELEASE          "${SHARED_LIB_STAGING_DIR}/Release")
 
-#*******************************
-# VIVOX - *NOTE: no debug version
-set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-win32")
-set(vivox_files
-    SLVoice.exe
-    alut.dll
-    vivoxsdk.dll
-    ortp.dll
-    wrap_oal.dll
-    )
-
-#*******************************
-# Misc shared libs 
-
-# *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
-set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug")
-set(debug_files
-    openjpegd.dll
-    libtcmalloc_minimal-debug.dll
-    libapr-1.dll
-    libaprutil-1.dll
-    libapriconv-1.dll
-    )
-
-# *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
-set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
-set(release_files
-    openjpeg.dll
-    libtcmalloc_minimal.dll
-    libapr-1.dll
-    libaprutil-1.dll
-    libapriconv-1.dll
-    )
-
-if (FMOD_SDK_DIR)
-    set(fmod_files fmod.dll)
-    copy_if_different(
-        ${FMOD_SDK_DIR} 
-        "${CMAKE_CURRENT_BINARY_DIR}/Debug"
-        out_targets 
-        ${fmod_files}
-        )
-    set(all_targets ${all_targets} ${out_targets})
-    copy_if_different(
-        ${FMOD_SDK_DIR} 
-        "${CMAKE_CURRENT_BINARY_DIR}/Release"
-        out_targets 
-        ${fmod_files}
-        )
-    set(all_targets ${all_targets} ${out_targets})
-    copy_if_different(
-        ${FMOD_SDK_DIR} 
-        "${CMAKE_CURRENT_BINARY_DIR}/RelWithDbgInfo"
-        out_targets 
-        ${fmod_files}
+    #*******************************
+    # VIVOX - *NOTE: no debug version
+    set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-win32")
+    set(vivox_files
+        SLVoice.exe
+        alut.dll
+        vivoxsdk.dll
+        ortp.dll
+        wrap_oal.dll
         )
-    set(all_targets ${all_targets} ${out_targets})
-endif (FMOD_SDK_DIR)
-
 
-#*******************************
-# LLKDU
-set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu")
-if(NOT EXISTS ${internal_llkdu_path})
-    if (EXISTS "${debug_src_dir}/llkdu.dll")
-        set(debug_llkdu_src "${debug_src_dir}/llkdu.dll")
-        set(debug_llkdu_dst "${SHARED_LIB_STAGING_DIR_DEBUG}/llkdu.dll")
-        ADD_CUSTOM_COMMAND(
-            OUTPUT  ${debug_llkdu_dst}
-            COMMAND ${CMAKE_COMMAND} -E copy_if_different ${debug_llkdu_src} ${debug_llkdu_dst}
-            DEPENDS ${debug_llkdu_src}
-            COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR_DEBUG}"
-            )
-        set(third_party_targets ${third_party_targets} $} ${debug_llkdu_dst})
-    endif (EXISTS "${debug_src_dir}/llkdu.dll")
+    #*******************************
+    # Misc shared libs 
 
-    if (EXISTS "${release_src_dir}/llkdu.dll")
-        set(release_llkdu_src "${release_src_dir}/llkdu.dll")
-        set(release_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELEASE}/llkdu.dll")
-        ADD_CUSTOM_COMMAND(
-            OUTPUT  ${release_llkdu_dst}
-            COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${release_llkdu_dst}
-            DEPENDS ${release_llkdu_src}
-            COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR_RELEASE}"
-            )
-        set(third_party_targets ${third_party_targets} ${release_llkdu_dst})
+    # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+    set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug")
+    set(debug_files
+        openjpegd.dll
+        libtcmalloc_minimal-debug.dll
+        libapr-1.dll
+        libaprutil-1.dll
+        libapriconv-1.dll
+        )
 
-        set(relwithdebinfo_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}/llkdu.dll")
-        ADD_CUSTOM_COMMAND(
-            OUTPUT  ${relwithdebinfo_llkdu_dst}
-            COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${relwithdebinfo_llkdu_dst}
-            DEPENDS ${release_llkdu_src}
-            COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}"
-            )
-        set(third_party_targets ${third_party_targets} ${relwithdebinfo_llkdu_dst})
-    endif (EXISTS "${release_src_dir}/llkdu.dll")
+    # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+    set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
+    set(release_files
+        openjpeg.dll
+        libtcmalloc_minimal.dll
+        libapr-1.dll
+        libaprutil-1.dll
+        libapriconv-1.dll
+        )
 
-endif (NOT EXISTS ${internal_llkdu_path})
+    if (FMOD_SDK_DIR)
+        set(fmod_files fmod.dll)
+    endif (FMOD_SDK_DIR)
+
+    #*******************************
+    # LLKDU
+    set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu")
+    if(NOT EXISTS ${internal_llkdu_path})
+        if (EXISTS "${debug_src_dir}/llkdu.dll")
+            set(debug_llkdu_src "${debug_src_dir}/llkdu.dll")
+            set(debug_llkdu_dst "${SHARED_LIB_STAGING_DIR_DEBUG}/llkdu.dll")
+        endif (EXISTS "${debug_src_dir}/llkdu.dll")
+
+        if (EXISTS "${release_src_dir}/llkdu.dll")
+            set(release_llkdu_src "${release_src_dir}/llkdu.dll")
+            set(release_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELEASE}/llkdu.dll")
+            set(relwithdebinfo_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}/llkdu.dll")
+        endif (EXISTS "${release_src_dir}/llkdu.dll")
+    endif (NOT EXISTS ${internal_llkdu_path})
 
 #*******************************
 # Copy MS C runtime dlls, required for packaging.
@@ -183,6 +138,25 @@ elseif(DARWIN)
     set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib/release")
     set(release_files
        )
+
+    # fmod is statically linked on darwin
+    set(fmod_files "")
+
+    #*******************************
+    # LLKDU
+    set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu")
+    if(NOT EXISTS ${internal_llkdu_path})
+        if (EXISTS "${debug_src_dir}/libllkdu.dylib")
+            set(debug_llkdu_src "${debug_src_dir}/libllkdu.dylib")
+            set(debug_llkdu_dst "${SHARED_LIB_STAGING_DIR_DEBUG}/libllkdu.dylib")
+        endif (EXISTS "${debug_src_dir}/libllkdu.dylib")
+
+        if (EXISTS "${release_src_dir}/libllkdu.dylib")
+            set(release_llkdu_src "${release_src_dir}/libllkdu.dylib")
+            set(release_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELEASE}/libllkdu.dylib")
+            set(relwithdebinfo_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}/libllkdu.dylib")
+        endif (EXISTS "${release_src_dir}/libllkdu.dylib")
+    endif (NOT EXISTS ${internal_llkdu_path})
 elseif(LINUX)
     set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-linux")
     set(vivox_files
@@ -195,19 +169,43 @@ elseif(LINUX)
     set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/release")
     set(release_files
        )
+
+    if (FMOD_SDK_DIR)
+        set(fmod_files "libfmod-3.75.so")
+    endif (FMOD_SDK_DIR)
+
+    #*******************************
+    # LLKDU
+    set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu")
+    if(NOT EXISTS ${internal_llkdu_path})
+        if (EXISTS "${debug_src_dir}/libllkdu.so")
+            set(debug_llkdu_src "${debug_src_dir}/libllkdu.so")
+            set(debug_llkdu_dst "${SHARED_LIB_STAGING_DIR_DEBUG}/libllkdu.so")
+        endif (EXISTS "${debug_src_dir}/libllkdu.so")
+
+        if (EXISTS "${release_src_dir}/libllkdu.so")
+            set(release_llkdu_src "${release_src_dir}/libllkdu.so")
+            set(release_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELEASE}/libllkdu.so")
+            set(relwithdebinfo_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}/libllkdu.so")
+        endif (EXISTS "${release_src_dir}/libllkdu.so")
 else(WINDOWS)
     message(STATUS "WARNING: unrecognized platform for staging 3rd party libs, skipping...")
     set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-linux")
-    set(vivox_files
-       )
+    set(vivox_files "")
     # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
     set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/debug")
-    set(debug_files
-       )
+    set(debug_files "")
     # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
     set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/release")
-    set(release_files
-       )
+    set(release_files "")
+
+    set(fmod_files "")
+
+    set(debug_llkdu_src "")
+    set(debug_llkdu_dst "")
+    set(release_llkdu_src "")
+    set(release_llkdu_dst "")
+    set(relwithdebinfo_llkdu_dst "")
 endif(WINDOWS)
 
 
@@ -261,6 +259,64 @@ copy_if_different(
     )
 set(third_party_targets ${third_party_targets} ${out_targets})
 
+if (FMOD_SDK_DIR)
+    copy_if_different(
+        ${FMOD_SDK_DIR} 
+        "${CMAKE_CURRENT_BINARY_DIR}/Debug"
+        out_targets 
+        ${fmod_files}
+        )
+    set(all_targets ${all_targets} ${out_targets})
+    copy_if_different(
+        ${FMOD_SDK_DIR} 
+        "${CMAKE_CURRENT_BINARY_DIR}/Release"
+        out_targets 
+        ${fmod_files}
+        )
+    set(all_targets ${all_targets} ${out_targets})
+    copy_if_different(
+        ${FMOD_SDK_DIR} 
+        "${CMAKE_CURRENT_BINARY_DIR}/RelWithDbgInfo"
+        out_targets 
+        ${fmod_files}
+        )
+    set(all_targets ${all_targets} ${out_targets})
+endif (FMOD_SDK_DIR)
+
+#*******************************
+# LLKDU
+set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu")
+if(NOT EXISTS ${internal_llkdu_path})
+    if (EXISTS "${debug_llkdu_src}")
+        ADD_CUSTOM_COMMAND(
+            OUTPUT  ${debug_llkdu_dst}
+            COMMAND ${CMAKE_COMMAND} -E copy_if_different ${debug_llkdu_src} ${debug_llkdu_dst}
+            DEPENDS ${debug_llkdu_src}
+            COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR_DEBUG}"
+            )
+        set(third_party_targets ${third_party_targets} $} ${debug_llkdu_dst})
+    endif (EXISTS "${debug_llkdu_src}")
+
+    if (EXISTS "${release_llkdu_src}")
+        ADD_CUSTOM_COMMAND(
+            OUTPUT  ${release_llkdu_dst}
+            COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${release_llkdu_dst}
+            DEPENDS ${release_llkdu_src}
+            COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR_RELEASE}"
+            )
+        set(third_party_targets ${third_party_targets} ${release_llkdu_dst})
+
+        ADD_CUSTOM_COMMAND(
+            OUTPUT  ${relwithdebinfo_llkdu_dst}
+            COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${relwithdebinfo_llkdu_dst}
+            DEPENDS ${release_llkdu_src}
+            COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}"
+            )
+        set(third_party_targets ${third_party_targets} ${relwithdebinfo_llkdu_dst})
+    endif (EXISTS "${release_llkdu_src}")
+
+endif (NOT EXISTS ${internal_llkdu_path})
+
 
 add_custom_target(stage_third_party_libs ALL
   DEPENDS 
-- 
GitLab


From f3d13666f611c92fe175d14b3d6bb89f5841845d Mon Sep 17 00:00:00 2001
From: brad kittenbrink <brad@lindenlab.com>
Date: Fri, 30 Oct 2009 18:21:35 -0400
Subject: [PATCH 004/557] continuing work on DEV-41722 normalizing shared lib
 staging.  fixed copy/paste error in the last commit(f5da14574943).

---
 indra/cmake/Copy3rdPartyLibs.cmake | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index 5f9d386a4f9..e7b5d097d37 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -188,6 +188,7 @@ elseif(LINUX)
             set(release_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELEASE}/libllkdu.so")
             set(relwithdebinfo_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}/libllkdu.so")
         endif (EXISTS "${release_src_dir}/libllkdu.so")
+    endif(NOT EXISTS ${internal_llkdu_path})
 else(WINDOWS)
     message(STATUS "WARNING: unrecognized platform for staging 3rd party libs, skipping...")
     set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-linux")
-- 
GitLab


From 35469b04a0cc9225788c71f341a7d44937d880e8 Mon Sep 17 00:00:00 2001
From: brad kittenbrink <brad@lindenlab.com>
Date: Mon, 2 Nov 2009 13:52:44 -0500
Subject: [PATCH 005/557] Implemented mac staging for DEV-41722 normalizing
 shared lib staging. also added a bunch of comments.

---
 indra/cmake/Copy3rdPartyLibs.cmake | 38 ++++++++++++++++++++++++++++--
 1 file changed, 36 insertions(+), 2 deletions(-)

diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index e7b5d097d37..9eb19b35471 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -6,6 +6,9 @@
 
 include(CMakeCopyIfDifferent)
 
+###################################################################
+# set up platform specific lists of files that need to be copied
+###################################################################
 if(WINDOWS)
     set(SHARED_LIB_STAGING_DIR_DEBUG            "${SHARED_LIB_STAGING_DIR}/Debug")
     set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO   "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo")
@@ -26,6 +29,7 @@ if(WINDOWS)
     # Misc shared libs 
 
     # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+    # or ARCH_PREBUILT_DIRS
     set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug")
     set(debug_files
         openjpegd.dll
@@ -36,6 +40,7 @@ if(WINDOWS)
         )
 
     # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+    # or ARCH_PREBUILT_DIRS
     set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
     set(release_files
         openjpeg.dll
@@ -127,16 +132,37 @@ if (MSVC80)
 endif (MSVC80)
 
 elseif(DARWIN)
+    set(SHARED_LIB_STAGING_DIR_DEBUG            "${SHARED_LIB_STAGING_DIR}/Debug")
+    set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO   "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo")
+    set(SHARED_LIB_STAGING_DIR_RELEASE          "${SHARED_LIB_STAGING_DIR}/Release")
+
     set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/universal-darwin")
     set(vivox_files
+        SLVoice
+        libalut.dylib
+        libopenal.dylib
+        libortp.dylib
+        libvivoxsdk.dylib
        )
     # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
-    set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib/debug")
+    # or ARCH_PREBUILT_DIRS
+    set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_debug")
     set(debug_files
        )
     # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
-    set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib/release")
+    # or ARCH_PREBUILT_DIRS
+    set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release")
     set(release_files
+        libapr-1.0.3.7.dylib
+        libapr-1.0.3.8.dylib
+        libapr-1.dylib
+        libaprutil-1.0.3.8.dylib
+        libaprutil-1.0.3.9.dylib
+        libaprutil-1.dylib
+        libexpat.0.5.0.dylib
+        libexpat.dylib
+        libllqtwebkit.dylib
+        libndofdev.dylib
        )
 
     # fmod is statically linked on darwin
@@ -162,10 +188,12 @@ elseif(LINUX)
     set(vivox_files
        )
     # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+    # or ARCH_PREBUILT_DIRS
     set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/debug")
     set(debug_files
        )
     # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+    # or ARCH_PREBUILT_DIRS
     set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/release")
     set(release_files
        )
@@ -194,9 +222,11 @@ else(WINDOWS)
     set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-linux")
     set(vivox_files "")
     # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+    # or ARCH_PREBUILT_DIRS
     set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/debug")
     set(debug_files "")
     # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
+    # or ARCH_PREBUILT_DIRS
     set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/release")
     set(release_files "")
 
@@ -210,6 +240,10 @@ else(WINDOWS)
 endif(WINDOWS)
 
 
+################################################################
+# Done building the file lists, now set up the copy commands.
+################################################################
+
 copy_if_different(
     ${vivox_src_dir}
     "${SHARED_LIB_STAGING_DIR_DEBUG}"
-- 
GitLab


From 90ea3d3b35de1463a00d60a257bc5723bddf780e Mon Sep 17 00:00:00 2001
From: brad kittenbrink <brad@lindenlab.com>
Date: Mon, 2 Nov 2009 16:53:50 -0500
Subject: [PATCH 006/557] Implemented linux staging for DEV-41722 normalizing
 shared lib staging.

---
 indra/cmake/Copy3rdPartyLibs.cmake | 34 ++++++++++++++++++++++++++++--
 1 file changed, 32 insertions(+), 2 deletions(-)

diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index 9eb19b35471..995bf79406b 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -184,18 +184,48 @@ elseif(DARWIN)
         endif (EXISTS "${release_src_dir}/libllkdu.dylib")
     endif (NOT EXISTS ${internal_llkdu_path})
 elseif(LINUX)
+    # linux is weird, multiple side by side configurations aren't supported
+    # and we don't seem to have any debug shared libs built yet anyways...
+    set(SHARED_LIB_STAGING_DIR_DEBUG            "${SHARED_LIB_STAGING_DIR}")
+    set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO   "${SHARED_LIB_STAGING_DIR}")
+    set(SHARED_LIB_STAGING_DIR_RELEASE          "${SHARED_LIB_STAGING_DIR}")
+
     set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-linux")
     set(vivox_files
+        libalut.so
+        libopenal.so.1
+        libortp.so
+        libvivoxsdk.so
+        SLVoice
        )
     # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
     # or ARCH_PREBUILT_DIRS
-    set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/debug")
+    set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib_debug")
     set(debug_files
        )
     # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
     # or ARCH_PREBUILT_DIRS
-    set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/release")
+    set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib_release_client")
+    # *FIX - figure out what to do with duplicate libalut.so here -brad
     set(release_files
+        libapr-1.so
+        libaprutil-1.so
+        libatk-1.0.so
+        libcrypto.so
+        libexpat.so
+        libgmock_main.so
+        libgmock.so
+        libgmodule-2.0.so
+        libgobject-2.0.so
+        libgtest_main.so
+        libgtest.so
+        libopenal.so
+        libopenjpeg.so
+        libssl.so
+        libstacktrace.so
+        libtcmalloc.so
+        libuuid.so
+        libz.so
        )
 
     if (FMOD_SDK_DIR)
-- 
GitLab


From f9c4682fb3ef489a1f22472b1295ca596626f78a Mon Sep 17 00:00:00 2001
From: brad kittenbrink <brad@lindenlab.com>
Date: Tue, 3 Nov 2009 18:35:36 -0500
Subject: [PATCH 007/557] Continuing work on DEV-41724/DEV-41725 normalizing
 shared lib staging. It's basically working on linux.

---
 indra/cmake/Copy3rdPartyLibs.cmake | 16 +++++++++-------
 indra/cmake/LLAddBuildTest.cmake   | 13 ++++++++++---
 indra/cmake/Linking.cmake          |  5 ++++-
 3 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index 995bf79406b..b26d4cbefb4 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -132,9 +132,9 @@ if (MSVC80)
 endif (MSVC80)
 
 elseif(DARWIN)
-    set(SHARED_LIB_STAGING_DIR_DEBUG            "${SHARED_LIB_STAGING_DIR}/Debug")
-    set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO   "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo")
-    set(SHARED_LIB_STAGING_DIR_RELEASE          "${SHARED_LIB_STAGING_DIR}/Release")
+    set(SHARED_LIB_STAGING_DIR_DEBUG            "${SHARED_LIB_STAGING_DIR}/Debug/Resources")
+    set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO   "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/Resources")
+    set(SHARED_LIB_STAGING_DIR_RELEASE          "${SHARED_LIB_STAGING_DIR}/Release/Resources")
 
     set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/universal-darwin")
     set(vivox_files
@@ -208,17 +208,18 @@ elseif(LINUX)
     set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib_release_client")
     # *FIX - figure out what to do with duplicate libalut.so here -brad
     set(release_files
-        libapr-1.so
-        libaprutil-1.so
+        libapr-1.so.0
+        libaprutil-1.so.0
         libatk-1.0.so
         libcrypto.so
+        libdb-4.2.so
         libexpat.so
         libgmock_main.so
-        libgmock.so
+        libgmock.so.0
         libgmodule-2.0.so
         libgobject-2.0.so
         libgtest_main.so
-        libgtest.so
+        libgtest.so.0
         libopenal.so
         libopenjpeg.so
         libssl.so
@@ -226,6 +227,7 @@ elseif(LINUX)
         libtcmalloc.so
         libuuid.so
         libz.so
+        libssl.so.0.9.7
        )
 
     if (FMOD_SDK_DIR)
diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake
index d8f64199cf6..bf4d9b72a9f 100644
--- a/indra/cmake/LLAddBuildTest.cmake
+++ b/indra/cmake/LLAddBuildTest.cmake
@@ -107,6 +107,8 @@ INCLUDE(GoogleMock)
 
     # Setup target
     ADD_EXECUTABLE(PROJECT_${project}_TEST_${name} ${${name}_test_SOURCE_FILES})
+    SET_TARGET_PROPERTIES(PROJECT_${project}_TEST_${name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${EXE_STAGING_DIR})
+
     #
     # Per-codefile additional / external project dep and lib dep property extraction
     #
@@ -142,8 +144,10 @@ INCLUDE(GoogleMock)
     
     IF(WINDOWS)
       set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
+    ELSEIF(DARWIN)
+      set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources:/usr/lib)
     ELSE(WINDOWS)
-      set(LD_LIBRARY_PATH ${ARCH_PREBUILT_DIRS}:${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}:/usr/lib)
+      set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}:/usr/lib)
     ENDIF(WINDOWS)
 
     LL_TEST_COMMAND("${LD_LIBRARY_PATH}" ${TEST_CMD})
@@ -200,6 +204,7 @@ FUNCTION(LL_ADD_INTEGRATION_TEST
     message(STATUS "ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})")
   endif(TEST_DEBUG)
   ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})
+  SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${EXE_STAGING_DIR})
 
   # Add link deps to the executable
   if(TEST_DEBUG)
@@ -230,8 +235,10 @@ FUNCTION(LL_ADD_INTEGRATION_TEST
 
   IF(WINDOWS)
     set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
+  ELSEIF(DARWIN)
+    set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources:/usr/lib)
   ELSE(WINDOWS)
-    set(LD_LIBRARY_PATH ${ARCH_PREBUILT_DIRS}:${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}:/usr/lib)
+    set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}:/usr/lib)
   ENDIF(WINDOWS)
 
   LL_TEST_COMMAND("${LD_LIBRARY_PATH}" ${test_command})
@@ -250,4 +257,4 @@ FUNCTION(LL_ADD_INTEGRATION_TEST
   # Use CTEST? Not sure how to yet...
   # ADD_TEST(INTEGRATION_TEST_RUNNER_${testname} ${TEST_SCRIPT_CMD})
 
-ENDFUNCTION(LL_ADD_INTEGRATION_TEST)
\ No newline at end of file
+ENDFUNCTION(LL_ADD_INTEGRATION_TEST)
diff --git a/indra/cmake/Linking.cmake b/indra/cmake/Linking.cmake
index 1f3553539f7..cce73ba08bc 100644
--- a/indra/cmake/Linking.cmake
+++ b/indra/cmake/Linking.cmake
@@ -6,6 +6,7 @@ if (NOT STANDALONE)
     set(ARCH_PREBUILT_DIRS_RELEASE ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib/release)
     set(ARCH_PREBUILT_DIRS_DEBUG ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib/debug)
     set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs CACHE FILEPATH "Location of staged DLLs")
+    set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs CACHE FILEPATH "Location of staged executables")
   elseif (LINUX)
     if (VIEWER)
       set(ARCH_PREBUILT_DIRS ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release_client)
@@ -14,12 +15,14 @@ if (NOT STANDALONE)
     endif (VIEWER)
     set(ARCH_PREBUILT_DIRS_RELEASE ${ARCH_PREBUILT_DIRS})
     set(ARCH_PREBUILT_DIRS_DEBUG ${ARCH_PREBUILT_DIRS})
-    set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs CACHE FILEPATH "Location of staged .sos")
+    set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/lib CACHE FILEPATH "Location of staged .sos")
+    set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/bin CACHE FILEPATH "Location of staged executables")
   elseif (DARWIN)
     set(ARCH_PREBUILT_DIRS_RELEASE ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release)
     set(ARCH_PREBUILT_DIRS ${ARCH_PREBUILT_DIRS_RELEASE})
     set(ARCH_PREBUILT_DIRS_DEBUG ${ARCH_PREBUILT_DIRS_RELEASE})
     set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs CACHE FILEPATH "Location of staged DLLs")
+    set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs CACHE FILEPATH "Location of staged executables")
   endif (WINDOWS)
 endif (NOT STANDALONE)
 
-- 
GitLab


From 4bff7b085381a514afb7e8546beaac5ad6117f9b Mon Sep 17 00:00:00 2001
From: brad kittenbrink <brad@lindenlab.com>
Date: Wed, 4 Nov 2009 18:50:35 -0500
Subject: [PATCH 008/557] Wrap-up work for DEV-41724/DEV-41725 - normalizing
 shared library staging on all 3 platforms. Should now work out of the box on
 all 3 platforms and in the debugger.

---
 indra/cmake/Linking.cmake     | 2 +-
 indra/llcommon/CMakeLists.txt | 9 ++++++++-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/indra/cmake/Linking.cmake b/indra/cmake/Linking.cmake
index cce73ba08bc..bca99caf2a5 100644
--- a/indra/cmake/Linking.cmake
+++ b/indra/cmake/Linking.cmake
@@ -22,7 +22,7 @@ if (NOT STANDALONE)
     set(ARCH_PREBUILT_DIRS ${ARCH_PREBUILT_DIRS_RELEASE})
     set(ARCH_PREBUILT_DIRS_DEBUG ${ARCH_PREBUILT_DIRS_RELEASE})
     set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs CACHE FILEPATH "Location of staged DLLs")
-    set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs CACHE FILEPATH "Location of staged executables")
+    set(EXE_STAGING_DIR "${CMAKE_BINARY_DIR}/sharedlibs/\$(CONFIGURATION)" CACHE FILEPATH "Location of staged executables")
   endif (WINDOWS)
 endif (NOT STANDALONE)
 
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index 7a7281a4a7e..1e39a4474fe 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -248,6 +248,13 @@ if(LLCOMMON_LINK_SHARED)
         if(NOT WINDOWS)
           get_target_property(LLCOMMON_PATH llcommon LOCATION)
           get_filename_component(LLCOMMON_FILE ${LLCOMMON_PATH} NAME)
+          if(DARWIN)
+            set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources)
+          else(DARWIN)
+            set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
+          endif(DARWIN)
+
+          # *TODO - maybe make this a symbolic link? -brad
           add_custom_command(
             TARGET llcommon POST_BUILD
             COMMAND ${CMAKE_COMMAND}
@@ -255,7 +262,7 @@ if(LLCOMMON_LINK_SHARED)
               -E
               copy_if_different
               ${LLCOMMON_PATH}
-              ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/${LLCOMMON_FILE}
+              ${SHARED_LIB_STAGING_DIR_CONFIG}/${LLCOMMON_FILE}
             COMMENT "Copying llcommon to the staging folder."
             )
         endif(NOT WINDOWS)
-- 
GitLab


From ecd482d24b63d9658ac71d2bf4155e3ed9175bb9 Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Thu, 5 Nov 2009 14:08:31 +0200
Subject: [PATCH 009/557] Implemented major sub-task EXT-2250 - Implement
 Classifieds list in Picks panel.

--HG--
branch : product-engine
---
 indra/newview/llavatarpropertiesprocessor.cpp |  90 ++++-
 indra/newview/llavatarpropertiesprocessor.h   |  50 ++-
 indra/newview/llpanelpicks.cpp                | 344 +++++++++++++++++-
 indra/newview/llpanelpicks.h                  |  66 +++-
 indra/newview/llstartup.cpp                   |   5 +-
 .../skins/default/xui/en/menu_picks_plus.xml  |  22 ++
 .../skins/default/xui/en/notifications.xml    |  12 +
 .../xui/en/panel_classifieds_list_item.xml    |  83 +++++
 .../skins/default/xui/en/panel_picks.xml      |  43 ++-
 9 files changed, 685 insertions(+), 30 deletions(-)
 create mode 100644 indra/newview/skins/default/xui/en/menu_picks_plus.xml
 create mode 100644 indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml

diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp
index 73e24ca8e76..98a6a4b92ad 100644
--- a/indra/newview/llavatarpropertiesprocessor.cpp
+++ b/indra/newview/llavatarpropertiesprocessor.cpp
@@ -158,6 +158,11 @@ void LLAvatarPropertiesProcessor::sendAvatarTexturesRequest(const LLUUID& avatar
 	removePendingRequest(avatar_id, APT_TEXTURES);
 }
 
+void LLAvatarPropertiesProcessor::sendAvatarClassifiedsRequest(const LLUUID& avatar_id)
+{
+	sendGenericRequest(avatar_id, APT_CLASSIFIEDS, "avatarclassifiedsrequest");
+}
+
 void LLAvatarPropertiesProcessor::sendAvatarPropertiesUpdate(const LLAvatarData* avatar_props)
 {
 	llinfos << "Sending avatarinfo update" << llendl;
@@ -284,12 +289,60 @@ void LLAvatarPropertiesProcessor::processAvatarInterestsReply(LLMessageSystem* m
 */
 }
 
-void LLAvatarPropertiesProcessor::processAvatarClassifiedReply(LLMessageSystem* msg, void**)
+void LLAvatarPropertiesProcessor::processAvatarClassifiedsReply(LLMessageSystem* msg, void**)
 {
-	// avatarclassifiedsrequest is not sent according to new UI design but
-	// keep this method according to resolved issues. 
+	LLAvatarClassifieds classifieds;
+
+	msg->getUUID(_PREHASH_AgentData, _PREHASH_AgentID, classifieds.agent_id);
+	msg->getUUID(_PREHASH_AgentData, _PREHASH_TargetID, classifieds.target_id);
+
+	S32 block_count = msg->getNumberOfBlocks(_PREHASH_Data);
+
+	for(int n = 0; n < block_count; ++n)
+	{
+		LLAvatarClassifieds::classified_data data;
+
+		msg->getUUID(_PREHASH_Data, _PREHASH_ClassifiedID, data.classified_id, n);
+		msg->getString(_PREHASH_Data, _PREHASH_Name, data.name, n);
+
+		classifieds.classifieds_list.push_back(data);
+	}
+
+	LLAvatarPropertiesProcessor* self = getInstance();
+	// Request processed, no longer pending
+	self->removePendingRequest(classifieds.target_id, APT_CLASSIFIEDS);
+	self->notifyObservers(classifieds.target_id,&classifieds,APT_CLASSIFIEDS);
 }
 
+void LLAvatarPropertiesProcessor::processClassifiedInfoReply(LLMessageSystem* msg, void**)
+{
+	LLAvatarClassifiedInfo c_info;
+
+	msg->getUUID(_PREHASH_AgentData, _PREHASH_AgentID, c_info.agent_id);
+
+	msg->getUUID(_PREHASH_Data, _PREHASH_ClassifiedID, c_info.classified_id);
+	msg->getUUID(_PREHASH_Data, _PREHASH_CreatorID, c_info.creator_id);
+	msg->getU32(_PREHASH_Data, _PREHASH_CreationDate, c_info.creation_date);
+	msg->getU32(_PREHASH_Data, _PREHASH_ExpirationDate, c_info.expiration_date);
+	msg->getU32(_PREHASH_Data, _PREHASH_Category, c_info.category);
+	msg->getString(_PREHASH_Data, _PREHASH_Name, c_info.name);
+	msg->getString(_PREHASH_Data, _PREHASH_Desc, c_info.description);
+	msg->getUUID(_PREHASH_Data, _PREHASH_ParcelID, c_info.parcel_id);
+	msg->getU32(_PREHASH_Data, _PREHASH_ParentEstate, c_info.parent_estate);
+	msg->getUUID(_PREHASH_Data, _PREHASH_SnapshotID, c_info.snapshot_id);
+	msg->getString(_PREHASH_Data, _PREHASH_SimName, c_info.sim_name);
+	msg->getVector3d(_PREHASH_Data, _PREHASH_PosGlobal, c_info.pos_global);
+	msg->getString(_PREHASH_Data, _PREHASH_ParcelName, c_info.parcel_name);
+	msg->getU8(_PREHASH_Data, _PREHASH_ClassifiedFlags, c_info.classified_flags);
+	msg->getS32(_PREHASH_Data, _PREHASH_PriceForListing, c_info.price_for_listing);
+
+	LLAvatarPropertiesProcessor* self = getInstance();
+	// Request processed, no longer pending
+	self->removePendingRequest(c_info.agent_id, APT_CLASSIFIED_INFO);
+	self->notifyObservers(c_info.agent_id, &c_info, APT_CLASSIFIED_INFO);
+}
+
+
 void LLAvatarPropertiesProcessor::processAvatarNotesReply(LLMessageSystem* msg, void**)
 {
 	LLAvatarNotes avatar_notes;
@@ -451,6 +504,22 @@ void LLAvatarPropertiesProcessor::sendPickDelete( const LLUUID& pick_id )
 	LLAgentPicksInfo::getInstance()->decrementNumberOfPicks();
 }
 
+void LLAvatarPropertiesProcessor::sendClassifiedDelete(const LLUUID& classified_id)
+{
+	LLMessageSystem* msg = gMessageSystem; 
+
+	msg->newMessage(_PREHASH_ClassifiedDelete);
+
+	msg->nextBlock(_PREHASH_AgentData);
+	msg->addUUID(_PREHASH_AgentID, gAgent.getID());
+	msg->addUUID(_PREHASH_SessionID, gAgent.getSessionID());
+
+	msg->nextBlock(_PREHASH_Data);
+	msg->addUUID(_PREHASH_ClassifiedID, classified_id);
+
+	gAgent.sendReliableMessage();
+}
+
 void LLAvatarPropertiesProcessor::sendPickInfoUpdate(const LLPickData* new_pick)
 {
 	if (!new_pick) return;
@@ -495,6 +564,21 @@ void LLAvatarPropertiesProcessor::sendPickInfoRequest(const LLUUID& creator_id,
 	send_generic_message("pickinforequest", request_params);
 }
 
+void LLAvatarPropertiesProcessor::sendClassifiedInfoRequest(const LLUUID& avatar_id, const LLUUID& classified_id)
+{
+	LLMessageSystem* msg = gMessageSystem;
+
+	msg->newMessage(_PREHASH_ClassifiedInfoRequest);
+	msg->nextBlock(_PREHASH_AgentData);
+	
+	msg->addUUID(_PREHASH_AgentID, gAgent.getID());
+	msg->addUUID(_PREHASH_SessionID, gAgent.getSessionID());
+
+	msg->nextBlock(_PREHASH_Data);
+	msg->addUUID(_PREHASH_ClassifiedID, classified_id);
+
+	gAgent.sendReliableMessage();
+}
 
 bool LLAvatarPropertiesProcessor::isPendingRequest(const LLUUID& avatar_id, EAvatarProcessorType type)
 {
diff --git a/indra/newview/llavatarpropertiesprocessor.h b/indra/newview/llavatarpropertiesprocessor.h
index e6563024b28..3c6b4e17d9d 100644
--- a/indra/newview/llavatarpropertiesprocessor.h
+++ b/indra/newview/llavatarpropertiesprocessor.h
@@ -53,7 +53,9 @@ enum EAvatarProcessorType
 	APT_GROUPS,
 	APT_PICKS,
 	APT_PICK_INFO,
-	APT_TEXTURES
+	APT_TEXTURES,
+	APT_CLASSIFIEDS,
+	APT_CLASSIFIED_INFO
 };
 
 struct LLAvatarData
@@ -136,6 +138,43 @@ struct LLAvatarGroups
 	};
 };
 
+struct LLAvatarClassifieds
+{
+	LLUUID agent_id;
+	LLUUID target_id;
+
+	struct classified_data;
+	typedef std::list<classified_data> classifieds_list_t;
+
+	classifieds_list_t classifieds_list;
+
+	struct classified_data
+	{
+		LLUUID classified_id;
+		std::string name;
+	};
+};
+
+struct LLAvatarClassifiedInfo
+{
+	LLUUID agent_id;
+	LLUUID classified_id;
+	LLUUID creator_id;
+	U32 creation_date;
+	U32 expiration_date;
+	U32 category;
+	std::string name;
+	std::string description;
+	LLUUID parcel_id;
+	U32 parent_estate;
+	LLUUID snapshot_id;
+	std::string sim_name;
+	LLVector3d pos_global;
+	std::string parcel_name;
+	U8 classified_flags;
+	S32 price_for_listing;
+};
+
 class LLAvatarPropertiesObserver
 {
 public:
@@ -162,10 +201,13 @@ class LLAvatarPropertiesProcessor
 	void sendAvatarNotesRequest(const LLUUID& avatar_id);
 	void sendAvatarGroupsRequest(const LLUUID& avatar_id);
 	void sendAvatarTexturesRequest(const LLUUID& avatar_id);
+	void sendAvatarClassifiedsRequest(const LLUUID& avatar_id);
 
 	// Duplicate pick info requests are not suppressed.
 	void sendPickInfoRequest(const LLUUID& creator_id, const LLUUID& pick_id);
 
+	void sendClassifiedInfoRequest(const LLUUID& avatar_id, const LLUUID& classified_id);
+
 	void sendAvatarPropertiesUpdate(const LLAvatarData* avatar_props);
 
 	void sendPickInfoUpdate(const LLPickData* new_pick);
@@ -176,6 +218,8 @@ class LLAvatarPropertiesProcessor
 
 	void sendPickDelete(const LLUUID& pick_id);
 
+	void sendClassifiedDelete(const LLUUID& classified_id);
+
 	// Returns translated, human readable string for account type, such
 	// as "Resident" or "Linden Employee".  Used for profiles, inspectors.
 	static std::string accountType(const LLAvatarData* avatar_data);
@@ -189,7 +233,9 @@ class LLAvatarPropertiesProcessor
 
 	static void processAvatarInterestsReply(LLMessageSystem* msg, void**);
 
-	static void processAvatarClassifiedReply(LLMessageSystem* msg, void**);
+	static void processAvatarClassifiedsReply(LLMessageSystem* msg, void**);
+
+	static void processClassifiedInfoReply(LLMessageSystem* msg, void**);
 
 	static void processAvatarGroupsReply(LLMessageSystem* msg, void**);
 
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 6181531f82e..526c604bb44 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -45,6 +45,8 @@
 #include "llviewermenu.h"
 #include "llregistry.h"
 
+#include "llaccordionctrl.h"
+#include "llaccordionctrltab.h"
 #include "llpanelpicks.h"
 #include "llavatarpropertiesprocessor.h"
 #include "llpanelavatar.h"
@@ -62,6 +64,9 @@ static const std::string PICK_ID("pick_id");
 static const std::string PICK_CREATOR_ID("pick_creator_id");
 static const std::string PICK_NAME("pick_name");
 
+static const std::string CLASSIFIED_ID("classified_id");
+static const std::string CLASSIFIED_NAME("classified_name");
+
 
 static LLRegisterPanelClassWrapper<LLPanelPicks> t_panel_picks("panel_picks");
 
@@ -74,9 +79,13 @@ LLPanelPicks::LLPanelPicks()
 	mProfilePanel(NULL),
 	mPickPanel(NULL),
 	mPicksList(NULL),
+	mClassifiedsList(NULL),
 	mPanelPickInfo(NULL),
 	mPanelPickEdit(NULL),
-	mOverflowMenu(NULL)
+	mOverflowMenu(NULL),
+	mPlusMenu(NULL),
+	mPicksAccTab(NULL),
+	mClassifiedsAccTab(NULL)
 {
 }
 
@@ -100,6 +109,9 @@ void LLPanelPicks::updateData()
 	{
 		mPicksList->clear();
 		LLAvatarPropertiesProcessor::getInstance()->sendAvatarPicksRequest(getAvatarId());
+
+		mClassifiedsList->clear();
+		LLAvatarPropertiesProcessor::getInstance()->sendAvatarClassifiedsRequest(getAvatarId());
 	}
 }
 
@@ -138,13 +150,47 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
 
 				mPicksList->addItem(picture, pick_value);
 
-				picture->setDoubleClickCallback(boost::bind(&LLPanelPicks::onDoubleClickItem, this, _1));
+				picture->setDoubleClickCallback(boost::bind(&LLPanelPicks::onDoubleClickPickItem, this, _1));
 				picture->setRightMouseUpCallback(boost::bind(&LLPanelPicks::onRightMouseUpItem, this, _1, _2, _3, _4));
 				picture->setMouseUpCallback(boost::bind(&LLPanelPicks::updateButtons, this));
 			}
 
+			showAccordion("tab_picks", mPicksList->size());
+
+			resetDirty();
+			updateButtons();
+		}
+	}
+	else if(APT_CLASSIFIEDS == type)
+	{
+		LLAvatarClassifieds* c_info = static_cast<LLAvatarClassifieds*>(data);
+		if(c_info && getAvatarId() == c_info->target_id)
+		{
+			mClassifiedsList->clear();
+
+			LLAvatarClassifieds::classifieds_list_t::const_iterator it = c_info->classifieds_list.begin();
+			for(; c_info->classifieds_list.end() != it; ++it)
+			{
+				LLAvatarClassifieds::classified_data c_data = *it;
+
+				LLClassifiedItem* c_item = new LLClassifiedItem(getAvatarId(), c_data.classified_id);
+				c_item->childSetAction("info_chevron", boost::bind(&LLPanelPicks::onClickInfo, this));
+				c_item->setName(c_data.name);
+
+				LLSD pick_value = LLSD();
+				pick_value.insert(CLASSIFIED_ID, c_data.classified_id);
+				pick_value.insert(CLASSIFIED_NAME, c_data.name);
+
+				mClassifiedsList->addItem(c_item, pick_value);
+
+				c_item->setDoubleClickCallback(boost::bind(&LLPanelPicks::onDoubleClickClassifiedItem, this, _1));
+				c_item->setRightMouseUpCallback(boost::bind(&LLPanelPicks::onRightMouseUpItem, this, _1, _2, _3, _4));
+				c_item->setMouseUpCallback(boost::bind(&LLPanelPicks::updateButtons, this));
+			}
+
+			showAccordion("tab_classifieds", mClassifiedsList->size());
+
 			resetDirty();
-			LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this);
 			updateButtons();
 		}
 	}
@@ -158,16 +204,44 @@ LLPickItem* LLPanelPicks::getSelectedPickItem()
 	return dynamic_cast<LLPickItem*>(selected_item);
 }
 
+LLClassifiedItem* LLPanelPicks::getSelectedClassifiedItem()
+{
+	LLPanel* selected_item = mClassifiedsList->getSelectedItem();
+	if (!selected_item) 
+	{
+		return NULL;
+	}
+	return dynamic_cast<LLClassifiedItem*>(selected_item);
+}
+
 BOOL LLPanelPicks::postBuild()
 {
 	mPicksList = getChild<LLFlatListView>("picks_list");
+	mClassifiedsList = getChild<LLFlatListView>("classifieds_list");
+
+	mPicksList->setCommitOnSelectionChange(true);
+	mClassifiedsList->setCommitOnSelectionChange(true);
+
+	mPicksList->setCommitCallback(boost::bind(&LLPanelPicks::onListCommit, this, mPicksList));
+	mClassifiedsList->setCommitCallback(boost::bind(&LLPanelPicks::onListCommit, this, mClassifiedsList));
 
-	childSetAction(XML_BTN_NEW, boost::bind(&LLPanelPicks::onClickNew, this));
+	mPicksList->setNoItemsCommentText(getString("no_picks"));
+	mClassifiedsList->setNoItemsCommentText(getString("no_classifieds"));
+
+	childSetAction(XML_BTN_NEW, boost::bind(&LLPanelPicks::onClickPlusBtn, this));
 	childSetAction(XML_BTN_DELETE, boost::bind(&LLPanelPicks::onClickDelete, this));
 	childSetAction(XML_BTN_TELEPORT, boost::bind(&LLPanelPicks::onClickTeleport, this));
 	childSetAction(XML_BTN_SHOW_ON_MAP, boost::bind(&LLPanelPicks::onClickMap, this));
 	childSetAction(XML_BTN_INFO, boost::bind(&LLPanelPicks::onClickInfo, this));
 	childSetAction(XML_BTN_OVERFLOW, boost::bind(&LLPanelPicks::onOverflowButtonClicked, this));
+
+	mPicksAccTab = getChild<LLAccordionCtrlTab>("tab_picks");
+	mPicksAccTab->setDropDownStateChangedCallback(boost::bind(&LLPanelPicks::onAccordionStateChanged, this, mPicksAccTab));
+	mPicksAccTab->setDisplayChildren(true);
+
+	mClassifiedsAccTab = getChild<LLAccordionCtrlTab>("tab_classifieds");
+	mClassifiedsAccTab->setDropDownStateChangedCallback(boost::bind(&LLPanelPicks::onAccordionStateChanged, this, mClassifiedsAccTab));
+	mClassifiedsAccTab->setDisplayChildren(false);
 	
 	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registar;
 	registar.add("Pick.Info", boost::bind(&LLPanelPicks::onClickInfo, this));
@@ -180,6 +254,10 @@ BOOL LLPanelPicks::postBuild()
 	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar overflow_registar;
 	overflow_registar.add("PicksList.Overflow", boost::bind(&LLPanelPicks::onOverflowMenuItemClicked, this, _2));
 	mOverflowMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_picks_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+
+	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar plus_registar;
+	plus_registar.add("Picks.Plus.Action", boost::bind(&LLPanelPicks::onPlusMenuItemClicked, this, _2));
+	mPlusMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_picks_plus.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 	
 	return TRUE;
 }
@@ -202,6 +280,50 @@ void LLPanelPicks::onOverflowMenuItemClicked(const LLSD& param)
 	}
 }
 
+void LLPanelPicks::onPlusMenuItemClicked(const LLSD& param)
+{
+	std::string value = param.asString();
+
+	if("new_pick" == value)
+	{
+		createNewPick();
+	}
+	else if("new_classified" == value)
+	{
+		createNewClassified();
+	}
+}
+
+void LLPanelPicks::onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab)
+{
+	if(acc_tab->getDisplayChildren())
+	{
+		if(acc_tab != mPicksAccTab && mPicksAccTab->getDisplayChildren())
+		{
+			mPicksAccTab->setDisplayChildren(false);
+		}
+
+		if(acc_tab != mClassifiedsAccTab && mClassifiedsAccTab->getDisplayChildren())
+		{
+			mClassifiedsAccTab->setDisplayChildren(false);
+		}
+
+		LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("accordion");
+		accordion->arrange();
+	}
+
+	if(!mPicksAccTab->getDisplayChildren())
+	{
+		mPicksList->resetSelection(true);
+	}
+	if(!mClassifiedsAccTab->getDisplayChildren())
+	{
+		mClassifiedsList->resetSelection(true);
+	}
+
+	updateButtons();
+}
+
 void LLPanelPicks::onOverflowButtonClicked()
 {
 	LLRect rect;
@@ -250,21 +372,50 @@ void LLPanelPicks::onOpen(const LLSD& key)
 	LLPanelProfileTab::onOpen(key);
 }
 
+void LLPanelPicks::onListCommit(const LLFlatListView* f_list)
+{
+	// Make sure only one of the lists has selection.
+	if(f_list == mPicksList)
+	{
+		mClassifiedsList->resetSelection(true);
+	}
+	else if(f_list == mClassifiedsList)
+	{
+		mPicksList->resetSelection(true);
+	}
+	else
+	{
+		llwarns << "Unknown list" << llendl;
+	}
+
+	updateButtons();
+}
+
 //static
 void LLPanelPicks::onClickDelete()
 {
-	LLSD pick_value = mPicksList->getSelectedValue();
-	if (pick_value.isUndefined()) return;
+	LLSD value = mPicksList->getSelectedValue();
+	if (value.isDefined())
+	{
+		LLSD args; 
+		args["PICK"] = value[PICK_NAME]; 
+		LLNotifications::instance().add("DeleteAvatarPick", args, LLSD(), boost::bind(&LLPanelPicks::callbackDeletePick, this, _1, _2)); 
+		return;
+	}
 
-	LLSD args; 
-	args["PICK"] = pick_value[PICK_NAME]; 
-	LLNotifications::instance().add("DeleteAvatarPick", args, LLSD(), boost::bind(&LLPanelPicks::callbackDelete, this, _1, _2)); 
+	value = mClassifiedsList->getSelectedValue();
+	if(value.isDefined())
+	{
+		LLSD args; 
+		args["NAME"] = value[CLASSIFIED_NAME]; 
+		LLNotifications::instance().add("DeleteClassified", args, LLSD(), boost::bind(&LLPanelPicks::callbackDeleteClassified, this, _1, _2)); 
+		return;
+	}
 }
 
-bool LLPanelPicks::callbackDelete(const LLSD& notification, const LLSD& response) 
+bool LLPanelPicks::callbackDeletePick(const LLSD& notification, const LLSD& response) 
 {
 	S32 option = LLNotification::getSelectedOption(notification, response);
-
 	LLSD pick_value = mPicksList->getSelectedValue();
 
 	if (0 == option)
@@ -276,6 +427,20 @@ bool LLPanelPicks::callbackDelete(const LLSD& notification, const LLSD& response
 	return false;
 }
 
+bool LLPanelPicks::callbackDeleteClassified(const LLSD& notification, const LLSD& response) 
+{
+	S32 option = LLNotification::getSelectedOption(notification, response);
+	LLSD value = mClassifiedsList->getSelectedValue();
+
+	if (0 == option)
+	{
+		LLAvatarPropertiesProcessor::instance().sendClassifiedDelete(value[CLASSIFIED_ID]);
+		mClassifiedsList->removeItemByValue(value);
+	}
+	updateButtons();
+	return false;
+}
+
 bool LLPanelPicks::callbackTeleport( const LLSD& notification, const LLSD& response )
 {
 	S32 option = LLNotification::getSelectedOption(notification, response);
@@ -291,9 +456,14 @@ bool LLPanelPicks::callbackTeleport( const LLSD& notification, const LLSD& respo
 void LLPanelPicks::onClickTeleport()
 {
 	LLPickItem* pick_item = getSelectedPickItem();
-	if (!pick_item) return;
+	LLClassifiedItem* c_item = getSelectedClassifiedItem();
+
+	LLVector3d pos;
+	if(pick_item)
+		pos = pick_item->getPosGlobal();
+	else if(c_item)
+		pos = c_item->getPosGlobal();
 
-	LLVector3d pos = pick_item->getPosGlobal();
 	if (!pos.isExactlyZero())
 	{
 		gAgent.teleportViaLocation(pos);
@@ -305,9 +475,15 @@ void LLPanelPicks::onClickTeleport()
 void LLPanelPicks::onClickMap()
 {
 	LLPickItem* pick_item = getSelectedPickItem();
-	if (!pick_item) return;
+	LLClassifiedItem* c_item = getSelectedClassifiedItem();
+
+	LLVector3d pos;
+	if (pick_item)
+		pos = pick_item->getPosGlobal();
+	else if(c_item)
+		pos = c_item->getPosGlobal();
 
-	LLFloaterWorldMap::getInstance()->trackLocation(pick_item->getPosGlobal());
+	LLFloaterWorldMap::getInstance()->trackLocation(pos);
 	LLFloaterReg::showInstance("world_map", "center");
 }
 
@@ -325,7 +501,7 @@ void LLPanelPicks::onRightMouseUpItem(LLUICtrl* item, S32 x, S32 y, MASK mask)
 	}
 }
 
-void LLPanelPicks::onDoubleClickItem(LLUICtrl* item)
+void LLPanelPicks::onDoubleClickPickItem(LLUICtrl* item)
 {
 	LLSD pick_value = mPicksList->getSelectedValue();
 	if (pick_value.isUndefined()) return;
@@ -335,9 +511,19 @@ void LLPanelPicks::onDoubleClickItem(LLUICtrl* item)
 	LLNotifications::instance().add("TeleportToPick", args, LLSD(), boost::bind(&LLPanelPicks::callbackTeleport, this, _1, _2)); 
 }
 
+void LLPanelPicks::onDoubleClickClassifiedItem(LLUICtrl* item)
+{
+	LLSD value = mClassifiedsList->getSelectedValue();
+	if (value.isUndefined()) return;
+
+	LLSD args; 
+	args["CLASSIFIED"] = value[CLASSIFIED_NAME]; 
+	LLNotifications::instance().add("TeleportToClassified", args, LLSD(), boost::bind(&LLPanelPicks::callbackTeleport, this, _1, _2)); 
+}
+
 void LLPanelPicks::updateButtons()
 {
-	bool has_selected = mPicksList->numSelected();
+	bool has_selected = mPicksList->numSelected() > 0 || mClassifiedsList->numSelected() > 0;
 
 	if (getAvatarId() == gAgentID)
 	{
@@ -366,14 +552,41 @@ void LLPanelPicks::buildPickPanel()
 // 	}
 }
 
-void LLPanelPicks::onClickNew()
+void LLPanelPicks::onClickPlusBtn()
+{
+	LLRect rect;
+	childGetRect(XML_BTN_NEW, rect);
+
+	mPlusMenu->updateParent(LLMenuGL::sMenuContainer);
+	mPlusMenu->setButtonRect(rect, this);
+	LLMenuGL::showPopup(this, mPlusMenu, rect.mLeft, rect.mTop);
+}
+
+void LLPanelPicks::createNewPick()
 {
 	createPickEditPanel();
 
 	getProfilePanel()->openPanel(mPanelPickEdit, LLSD());
 }
 
+void LLPanelPicks::createNewClassified()
+{
+	LLNotifications::instance().add("ClickUnimplemented");
+}
+
 void LLPanelPicks::onClickInfo()
+{
+	if(mPicksList->numSelected() > 0)
+	{
+		openPickInfo();
+	}
+	else if(mClassifiedsList->numSelected() > 0)
+	{
+		openClassifiedInfo();
+	}
+}
+
+void LLPanelPicks::openPickInfo()
 {
 	LLSD selected_value = mPicksList->getSelectedValue();
 	if (selected_value.isUndefined()) return;
@@ -392,6 +605,19 @@ void LLPanelPicks::onClickInfo()
 	getProfilePanel()->openPanel(mPanelPickInfo, params);
 }
 
+void LLPanelPicks::openClassifiedInfo()
+{
+	LLNotifications::instance().add("ClickUnimplemented");
+}
+
+void LLPanelPicks::showAccordion(const std::string& name, bool show)
+{
+	LLAccordionCtrlTab* tab = getChild<LLAccordionCtrlTab>(name);
+	tab->setVisible(show);
+	LLAccordionCtrl* acc = getChild<LLAccordionCtrl>("accordion");
+	acc->arrange();
+}
+
 void LLPanelPicks::onPanelPickClose(LLPanel* panel)
 {
 	panel->setVisible(FALSE);
@@ -475,7 +701,14 @@ void LLPanelPicks::onPanelPickEdit()
 
 void LLPanelPicks::onClickMenuEdit()
 {
-	onPanelPickEdit();
+	if(getSelectedPickItem())
+	{
+		onPanelPickEdit();
+	}
+	else if(getSelectedClassifiedItem())
+	{
+		LLNotifications::instance().add("ClickUnimplemented");
+	}
 }
 
 inline LLPanelProfile* LLPanelPicks::getProfilePanel()
@@ -610,3 +843,76 @@ void LLPickItem::setValue(const LLSD& value)
 	if (!value.has("selected")) return;
 	childSetVisible("selected_icon", value["selected"]);
 }
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLClassifiedItem::LLClassifiedItem(const LLUUID& avatar_id, const LLUUID& classified_id)
+ : LLPanel()
+ , mAvatarId(avatar_id)
+ , mClassifiedId(classified_id)
+{
+	LLUICtrlFactory::getInstance()->buildPanel(this,"panel_classifieds_list_item.xml");
+
+	LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(), this);
+	LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(getAvatarId(), getClassifiedId());
+}
+
+LLClassifiedItem::~LLClassifiedItem()
+{
+	LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this);
+}
+
+void LLClassifiedItem::processProperties(void* data, EAvatarProcessorType type)
+{
+	if(APT_CLASSIFIED_INFO != type)
+	{
+		return;
+	}
+
+	LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data);
+	if( !(c_info && c_info->agent_id == getAvatarId() 
+		&& c_info->classified_id == getClassifiedId()) )
+	{
+		return;
+	}
+
+	setName(c_info->name);
+	setDescription(c_info->description);
+	setSnapshotId(c_info->snapshot_id);
+	setPosGlobal(c_info->pos_global);
+
+	LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this);
+}
+
+BOOL LLClassifiedItem::postBuild()
+{
+	setMouseEnterCallback(boost::bind(&LLPanelPickInfo::childSetVisible, this, "hovered_icon", true));
+	setMouseLeaveCallback(boost::bind(&LLPanelPickInfo::childSetVisible, this, "hovered_icon", false));
+	return TRUE;
+}
+
+void LLClassifiedItem::setValue(const LLSD& value)
+{
+	if (!value.isMap()) return;;
+	if (!value.has("selected")) return;
+	childSetVisible("selected_icon", value["selected"]);
+}
+
+void LLClassifiedItem::setName(const std::string& name)
+{
+	childSetValue("name", name);
+}
+
+void LLClassifiedItem::setDescription(const std::string& desc)
+{
+	childSetValue("description", desc);
+}
+
+void LLClassifiedItem::setSnapshotId(const LLUUID& snapshot_id)
+{
+	childSetValue("picture", snapshot_id);
+}
+
+//EOF
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index 06a0f0a0fdb..d6321a475ca 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -40,6 +40,7 @@
 #include "llpanelavatar.h"
 #include "llregistry.h"
 
+class LLAccordionCtrlTab;
 class LLPanelProfile;
 class LLMessageSystem;
 class LLVector3d;
@@ -47,6 +48,7 @@ class LLPanelProfileTab;
 class LLAgent;
 class LLMenuGL;
 class LLPickItem;
+class LLClassifiedItem;
 class LLFlatListView;
 class LLPanelPickInfo;
 class LLPanelPickEdit;
@@ -71,6 +73,7 @@ class LLPanelPicks
 
 	// returns the selected pick item
 	LLPickItem* getSelectedPickItem();
+	LLClassifiedItem* getSelectedClassifiedItem();
 
 	//*NOTE top down approch when panel toggling is done only by 
 	// parent panels failed to work (picks related code was in me profile panel)
@@ -83,25 +86,39 @@ class LLPanelPicks
 
 	void onOverflowMenuItemClicked(const LLSD& param);
 	void onOverflowButtonClicked();
+	void onPlusMenuItemClicked(const LLSD& param);
+
+	void onListCommit(const LLFlatListView* f_list);
+	void onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab);
 
 	//------------------------------------------------
 	// Callbacks which require panel toggling
 	//------------------------------------------------
-	void onClickNew();
+	void onClickPlusBtn();
 	void onClickInfo();
 	void onPanelPickClose(LLPanel* panel);
 	void onPanelPickSave(LLPanel* panel);
 	void onPanelPickEdit();
 	void onClickMenuEdit();
 
+	void createNewPick();
+	void createNewClassified();
+
+	void openPickInfo();
+	void openClassifiedInfo();
+
+	void showAccordion(const std::string& name, bool show);
+
 	void buildPickPanel();
 
-	bool callbackDelete(const LLSD& notification, const LLSD& response);
+	bool callbackDeletePick(const LLSD& notification, const LLSD& response);
+	bool callbackDeleteClassified(const LLSD& notification, const LLSD& response);
 	bool callbackTeleport(const LLSD& notification, const LLSD& response);
 
 	void updateButtons();
 
-	virtual void onDoubleClickItem(LLUICtrl* item);
+	virtual void onDoubleClickPickItem(LLUICtrl* item);
+	virtual void onDoubleClickClassifiedItem(LLUICtrl* item);
 	virtual void onRightMouseUpItem(LLUICtrl* item, S32 x, S32 y, MASK mask);
 
 	LLPanelProfile* getProfilePanel();
@@ -115,9 +132,14 @@ class LLPanelPicks
 	LLPanelProfile* mProfilePanel;
 	LLPanelPickInfo* mPickPanel;
 	LLFlatListView* mPicksList;
+	LLFlatListView* mClassifiedsList;
 	LLPanelPickInfo* mPanelPickInfo;
 	LLPanelPickEdit* mPanelPickEdit;
 	LLToggleableMenu* mOverflowMenu;
+	LLToggleableMenu* mPlusMenu;
+
+	LLAccordionCtrlTab* mPicksAccTab;
+	LLAccordionCtrlTab* mClassifiedsAccTab;
 };
 
 class LLPickItem : public LLPanel, public LLAvatarPropertiesObserver
@@ -189,4 +211,42 @@ class LLPickItem : public LLPanel, public LLAvatarPropertiesObserver
 	std::string mSimName;
 };
 
+class LLClassifiedItem : public LLPanel, public LLAvatarPropertiesObserver
+{
+public:
+
+	LLClassifiedItem(const LLUUID& avatar_id, const LLUUID& classified_id);
+	
+	virtual ~LLClassifiedItem();
+
+	/*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
+
+	/*virtual*/ BOOL postBuild();
+
+	/*virtual*/ void setValue(const LLSD& value);
+
+	LLUUID getAvatarId() {return mAvatarId;}
+	
+	void setAvatarId(const LLUUID& avatar_id) {mAvatarId = avatar_id;}
+
+	LLUUID getClassifiedId() {return mClassifiedId;}
+
+	void setClassifiedId(const LLUUID& classified_id) {mClassifiedId = classified_id;}
+
+	void setPosGlobal(const LLVector3d& pos) { mPosGlobal = pos; }
+
+	const LLVector3d& getPosGlobal() { return mPosGlobal; }
+
+	void setName (const std::string& name);
+
+	void setDescription(const std::string& desc);
+
+	void setSnapshotId(const LLUUID& snapshot_id);
+
+private:
+	LLUUID mAvatarId;
+	LLUUID mClassifiedId;
+	LLVector3d mPosGlobal;
+};
+
 #endif // LL_LLPANELPICKS_H
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 9aa74e8b9f9..0ffea6d600b 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -2469,7 +2469,7 @@ void register_viewer_callbacks(LLMessageSystem* msg)
 	msg->setHandlerFunc("AvatarPicksReply",
 						&LLAvatarPropertiesProcessor::processAvatarPicksReply);
  	msg->setHandlerFunc("AvatarClassifiedReply",
- 						&LLAvatarPropertiesProcessor::processAvatarClassifiedReply);
+ 						&LLAvatarPropertiesProcessor::processAvatarClassifiedsReply);
 
 	msg->setHandlerFuncFast(_PREHASH_CreateGroupReply,
 						LLGroupMgr::processCreateGroupReply);
@@ -2535,7 +2535,8 @@ void register_viewer_callbacks(LLMessageSystem* msg)
 
 	msg->setHandlerFunc("EventInfoReply", LLPanelEvent::processEventInfoReply);
 	msg->setHandlerFunc("PickInfoReply", &LLAvatarPropertiesProcessor::processPickInfoReply);
-	msg->setHandlerFunc("ClassifiedInfoReply", LLPanelClassified::processClassifiedInfoReply);
+//	msg->setHandlerFunc("ClassifiedInfoReply", LLPanelClassified::processClassifiedInfoReply);
+	msg->setHandlerFunc("ClassifiedInfoReply", LLAvatarPropertiesProcessor::processClassifiedInfoReply);
 	msg->setHandlerFunc("ParcelInfoReply", LLRemoteParcelInfoProcessor::processParcelInfoReply);
 	msg->setHandlerFunc("ScriptDialog", process_script_dialog);
 	msg->setHandlerFunc("LoadURL", process_load_url);
diff --git a/indra/newview/skins/default/xui/en/menu_picks_plus.xml b/indra/newview/skins/default/xui/en/menu_picks_plus.xml
new file mode 100644
index 00000000000..3065239615c
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_picks_plus.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ height="201"
+ layout="topleft"
+ mouse_opaque="false"
+ name="picks_plus_menu"
+ width="120">
+    <menu_item_call 
+     name="create_pick" 
+     label="New Pick">
+        <menu_item_call.on_click 
+         function="Picks.Plus.Action" 
+         userdata="new_pick" />
+        </menu_item_call>
+    <menu_item_call 
+     name="create_classified" 
+     label="New Classified">
+        <menu_item_call.on_click 
+         function="Picks.Plus.Action" 
+         userdata="new_classified" />
+    </menu_item_call>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index babed28f10e..d479acb20cc 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -3050,6 +3050,18 @@ Teleport to [PICK]?
      yestext="Teleport"/>
   </notification>
 
+  <notification
+   icon="alertmodal.tga"
+   name="TeleportToClassified"
+   type="alertmodal">
+    Teleport to [CLASSIFIED]?
+    <usetemplate
+     ignoretext="Confirm that I want to teleport to a location in Classifieds"
+     name="okcancelignore"
+     notext="Cancel"
+     yestext="Teleport"/>
+  </notification>
+
   <notification
    icon="alert.tga"
    label="Message everyone in your Estate"
diff --git a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
new file mode 100644
index 00000000000..ee333be0cb0
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ bevel_style="none"
+ follows="top|left|right"
+ height="85"
+ layout="topleft"
+ left="0"
+ name="classified_item"
+ top="0"
+ width="313">
+    <icon
+     follows="all"
+     height="85"
+     image_name="ListItem_Over"
+     right="-3"
+     mouse_opaque="false"
+     name="hovered_icon"
+     top="1"
+     scale_image="true"
+     visible="false"
+     width="307"/>
+    <icon
+     follows="all"
+     height="85"
+     image_name="ListItem_Select"
+     right="-3"
+     mouse_opaque="false"
+     name="selected_icon"
+     top="1"
+     scale_image="true"
+     visible="false"
+     width="307"/>
+    <texture_picker
+     allow_no_texture="true"
+     border_enabled="true"
+     default_image_name="TabIcon_Places_Large"
+     enabled="false"
+     follows="left|top"
+     height="80"
+     layout="topleft"
+     left="10"
+     mouse_opaque="false"
+     name="picture"
+     tab_stop="false"
+     top="10"
+     top_pad="10"
+     width="90" />
+    <text
+     follows="top|left|right"
+     font="SansSerifSmallBold"
+     height="16"
+     layout="topleft"
+     left="110"
+     name="name"
+     text_color="white"
+     top="9"
+     use_ellipses="false"
+     width="197"
+     word_wrap="false" />
+    <expandable_text
+     follows="top|left|right"
+     font="SansSerifSmall"
+     height="40"
+     layout="topleft"
+     left="110"
+     name="description"
+     top_pad="3"
+     width="178"
+     word_wrap="true" />
+    <button
+     follows="top|right"
+     height="16"
+     image_selected="BuyArrow_Press"
+     image_pressed="BuyArrow_Press"
+     image_unselected="BuyArrow_Press"
+     layout="topleft"
+     name="info_chevron"
+     picture_style="true"
+     right="-7"
+     tab_stop="false"
+     top="27"
+     width="16" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index cbe1f11e3d7..a2296edc2ff 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -8,16 +8,57 @@
  name="panel_picks"
  top="0"
  width="313">
+ <string
+  name="no_picks"
+  value="No Picks" />
+ <string
+  name="no_classifieds"
+  value="No Classifieds" />
+     
+ <accordion
+  follows="all"
+  height="465"
+  layout="topleft"
+  left="0"
+  name="accordion"
+  top="0"
+  width="313">
+    <accordion_tab
+     can_resize="false"
+     layout="topleft"
+     height="235"
+     min_height="150"
+     name="tab_picks"
+     title="Picks"
+     visible="false">
  <flat_list_view
          color="DkGray2"
          follows="all"
-         height="465"
          layout="topleft"
          left="0"
          name="picks_list"
          opaque="true"
          top="0"
          width="313" />
+    </accordion_tab>
+    <accordion_tab
+     can_resize="false"
+     layout="topleft"
+     height="235"
+     name="tab_classifieds"
+     title="Classified"
+     visible="false">
+            <flat_list_view
+             color="DkGray2"
+             follows="all"
+             layout="topleft"
+             left="0"
+             name="classifieds_list"
+             opaque="true"
+             top="0"
+             width="313" />
+    </accordion_tab>
+ </accordion>
    <panel
          background_visible="true"
          bevel_style="none"
-- 
GitLab


From 9e69702fe74f8107e6ac2ee800f234f8a956a781 Mon Sep 17 00:00:00 2001
From: "Mark Palange (Mani)" <palange@lindenlab.com>
Date: Thu, 5 Nov 2009 08:52:07 -0800
Subject: [PATCH 010/557] Added calls to ll_deploy_sharedlibs_command Using
 viewer_manifest.py for windows dependency deployment during build. Added
 SHARED_LIBS_REL_PATH var to cmake cache.

---
 indra/cmake/DeploySharedLibs.cmake          |  42 +++---
 indra/cmake/LLSharedLibs.cmake              |  24 ++-
 indra/lib/python/indra/util/llmanifest.py   |   5 +-
 indra/mac_crash_logger/CMakeLists.txt       |   1 +
 indra/newview/CMakeLists.txt                | 153 ++++++++++----------
 indra/newview/viewer_manifest.py            |  94 ++++++------
 indra/test_apps/llplugintest/CMakeLists.txt |  47 ++----
 indra/win_crash_logger/CMakeLists.txt       |   6 +
 indra/win_updater/CMakeLists.txt            |   6 +
 9 files changed, 197 insertions(+), 181 deletions(-)

diff --git a/indra/cmake/DeploySharedLibs.cmake b/indra/cmake/DeploySharedLibs.cmake
index a7e772bd750..663c272e502 100644
--- a/indra/cmake/DeploySharedLibs.cmake
+++ b/indra/cmake/DeploySharedLibs.cmake
@@ -6,8 +6,14 @@
 # BIN_NAME= The full path the the binary to search for dependecies.
 # SEARCH_DIRS= The full paths to dirs to search for dependencies.
 # DST_PATH= The full path where the dependecies will be copied. 
-include(GetPrerequisites)
+
+# *FIX:Mani - I pulled in the CMake 2.8 GetPrerequisites.cmake script here, because it works on windows where 2.6 did not.
+# Once we have officially upgraded to 2.8 we can just use that version of GetPrerequisites.cmake.
+get_filename_component(current_dir ${CMAKE_CURRENT_LIST_FILE} PATH)
+include(${current_dir}/GetPrerequisites_2_8.cmake)
+
 message("Getting recursive dependencies for file: ${BIN_NAME}")
+
 set(EXCLUDE_SYSTEM 1)
 set(RECURSE 1)
 get_filename_component(EXE_PATH ${BIN_NAME} PATH)
@@ -26,42 +32,42 @@ endif(DEP_FILES)
 
 foreach(DEP_FILE ${DEP_FILES})
   if(FOUND_FILES)
-	list(FIND FOUND_FILES ${DEP_FILE} FOUND)
+    list(FIND FOUND_FILES ${DEP_FILE} FOUND)
   else(FOUND_FILES)
-	set(FOUND -1)
+    set(FOUND -1)
   endif(FOUND_FILES)
 
   if(FOUND EQUAL -1)
-	find_path(DEP_PATH ${DEP_FILE} PATHS ${SEARCH_DIRS} NO_DEFAULT_PATH)
-	if(DEP_PATH)
-	  set(FOUND_FILES ${FOUND_FILES} "${DEP_PATH}/${DEP_FILE}")
-	  set(DEP_PATH NOTFOUND) #reset DEP_PATH for the next find_path call.
-	else(DEP_PATH)
-	  set(MISSING_FILES ${MISSING_FILES} ${DEP_FILE})
-	endif(DEP_PATH)
+    find_path(DEP_PATH ${DEP_FILE} PATHS ${SEARCH_DIRS} NO_DEFAULT_PATH)
+    if(DEP_PATH)
+      set(FOUND_FILES ${FOUND_FILES} "${DEP_PATH}/${DEP_FILE}")
+      set(DEP_PATH NOTFOUND) #reset DEP_PATH for the next find_path call.
+    else(DEP_PATH)
+      set(MISSING_FILES ${MISSING_FILES} ${DEP_FILE})
+    endif(DEP_PATH)
   endif(FOUND EQUAL -1)
 endforeach(DEP_FILE)
 
 if(MISSING_FILES)
   message("Missing:")
   foreach(FILE ${MISSING_FILES})
-	message("  ${FILE}")
+    message("  ${FILE}")
   endforeach(FILE)
   message("Searched in:")
   foreach(SEARCH_DIR ${SEARCH_DIRS})
-	message("  ${SEARCH_DIR}")
+    message("  ${SEARCH_DIR}")
   endforeach(SEARCH_DIR)
   message(FATAL_ERROR "Failed")
 endif(MISSING_FILES)
 
 if(FOUND_FILES)
   foreach(FILE ${FOUND_FILES})
-	get_filename_component(DST_FILE ${FILE} NAME)
-	set(DST_FILE "${DST_PATH}/${DST_FILE}")
-	message("Copying ${FILE} to ${DST_FILE}")
-	execute_process(
-	  COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FILE} ${DST_FILE}
-	  )
+    get_filename_component(DST_FILE ${FILE} NAME)
+    set(DST_FILE "${DST_PATH}/${DST_FILE}")
+    message("Copying ${FILE} to ${DST_FILE}")
+    execute_process(
+      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FILE} ${DST_FILE}
+      )
   endforeach(FILE ${FOUND_FILES})
 endif(FOUND_FILES)
 message("Success!")
diff --git a/indra/cmake/LLSharedLibs.cmake b/indra/cmake/LLSharedLibs.cmake
index a8c81609bb9..28f0e7ad12b 100644
--- a/indra/cmake/LLSharedLibs.cmake
+++ b/indra/cmake/LLSharedLibs.cmake
@@ -1,9 +1,21 @@
+
+if(DARWIN)
+  set(TMP_PATH "../Resource")
+elseif(LINUX)
+  set(TMP_PATH "../lib")
+else(DARWIN)
+  set(TMP_PATH ".")
+endif(DARWIN)
+
+ set(SHARED_LIB_REL_PATH ${TMP_PATH} CACHE STRING "Relative path from executable to shared libs")
+
 # ll_deploy_sharedlibs_command
 # target_exe: the cmake target of the executable for which the shared libs will be deployed.
 # search_dirs: a list of dirs to search for the dependencies
 # dst_path: path to copy deps to, relative to the output location of the target_exe
 macro(ll_deploy_sharedlibs_command target_exe search_dirs dst_path) 
   get_target_property(OUTPUT_LOCATION ${target_exe} LOCATION)
+  get_filename_component(OUTPUT_PATH ${OUTPUT_LOCATION} PATH)
 
   if(DARWIN)
     get_target_property(IS_BUNDLE ${target_exe} MACOSX_BUNDLE)
@@ -12,16 +24,22 @@ macro(ll_deploy_sharedlibs_command target_exe search_dirs dst_path)
       set(OUTPUT_PATH ${OUTPUT_LOCATION}.app/Contents/MacOS)
       set(OUTPUT_LOCATION ${OUTPUT_PATH}/${TARGET_FILE})
     endif(IS_BUNDLE)
-  else(DARWIN)
-    message(FATAL_ERROR "Only darwin currently supported!")
   endif(DARWIN)
+
+  if(WINDOWS)
+    set(REAL_SEARCH_DIRS ${search_dirs} "$ENV{SystemRoot}/system32")
+  endif(WINDOWS)
+
+  if(LINUX)
+    message(FATAL_ERROR "LINUX Unsupported!?!")
+  endif(LINUX)
   
   add_custom_command(
     TARGET ${target_exe} POST_BUILD
     COMMAND ${CMAKE_COMMAND} 
     ARGS
     "-DBIN_NAME=\"${OUTPUT_LOCATION}\""
-    "-DSEARCH_DIRS=\"${search_dirs}\""
+    "-DSEARCH_DIRS=\"${REAL_SEARCH_DIRS}\""
     "-DDST_PATH=\"${OUTPUT_PATH}/${dst_path}\""
     "-P"
     "${CMAKE_SOURCE_DIR}/cmake/DeploySharedLibs.cmake"
diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py
index 59c84e571b6..8c052106189 100644
--- a/indra/lib/python/indra/util/llmanifest.py
+++ b/indra/lib/python/indra/util/llmanifest.py
@@ -120,9 +120,8 @@ def get_channel(srctree):
          default=""),
     dict(name='build', description='Build directory.', default=DEFAULT_SRCTREE),
     dict(name='configuration',
-         description="""The build configuration used. Only used on OS X for
-        now, but it could be used for other platforms as well.""",
-         default="Universal"),
+         description="""The build configuration used.""",
+         default="Release"),
     dict(name='dest', description='Destination directory.', default=DEFAULT_SRCTREE),
     dict(name='grid',
          description="""Which grid the client will try to connect to. Even
diff --git a/indra/mac_crash_logger/CMakeLists.txt b/indra/mac_crash_logger/CMakeLists.txt
index 1d6494fecff..1c5a37c4c5d 100644
--- a/indra/mac_crash_logger/CMakeLists.txt
+++ b/indra/mac_crash_logger/CMakeLists.txt
@@ -79,3 +79,4 @@ ll_deploy_sharedlibs_command(
   mac-crash-logger
   "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR};${ARCH_PREBUILT_DIRS}" 
   "../Resources") 
+
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 0133d2222d9..7b69bfc6ddc 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -185,7 +185,7 @@ set(viewer_SOURCE_FILES
     llfloatermediasettings.cpp
     llfloatermemleak.cpp
     llfloaternamedesc.cpp
-	llfloaternearbymedia.cpp
+        llfloaternearbymedia.cpp
     llfloaternotificationsconsole.cpp
     llfloateropenobject.cpp
     llfloaterparcel.cpp
@@ -666,7 +666,7 @@ set(viewer_HEADER_FILES
     llfloatermediasettings.h
     llfloatermemleak.h
     llfloaternamedesc.h
-	llfloaternearbymedia.h
+        llfloaternearbymedia.h
     llfloaternotificationsconsole.h
     llfloateropenobject.h
     llfloaterparcel.h
@@ -1140,7 +1140,7 @@ if (WINDOWS)
 
     if (NOT STANDALONE)
         list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES})
-    endif (NOT STANDALONE)	
+    endif (NOT STANDALONE)      
 
     find_library(DINPUT_LIBRARY dinput8 ${DIRECTX_LIBRARY_DIR})
     find_library(DXGUID_LIBRARY dxguid ${DIRECTX_LIBRARY_DIR})
@@ -1322,7 +1322,7 @@ file(GLOB EVENT_HOST_SCRIPT_GLOB_LIST
      ${CMAKE_CURRENT_SOURCE_DIR}/../viewer_components/*.py)
 list(APPEND EVENT_HOST_SCRIPTS ${EVENT_HOST_SCRIPT_GLOB_LIST})
 
-set(PACKAGE OFF CACHE BOOL
+set(PACKAGE ON CACHE BOOL
     "Add a package target that builds an installer package.")
 
 if (WINDOWS)
@@ -1351,7 +1351,7 @@ if (WINDOWS)
               ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln
               --workingdir
               ${VIEWER_BINARY_NAME}
-              ${CMAKE_CURRENT_SOURCE_DIR}
+              "./${CMAKE_CFG_INTDIR}"
             COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging."
             )
     endif (NOT UNATTENDED)
@@ -1368,85 +1368,87 @@ if (WINDOWS)
         )
 
     add_custom_command(
-        TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
-        COMMAND ${CMAKE_COMMAND}
-        ARGS
-          -E
-          copy_if_different
-          ${CMAKE_CURRENT_SOURCE_DIR}/../../etc/message.xml
-          ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message.xml
-        COMMENT "Copying message.xml to the runtime folder."
-        )
+      TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
+      COMMAND ${CMAKE_COMMAND}
+      ARGS
+        -E
+        copy_if_different
+        ${CMAKE_CURRENT_SOURCE_DIR}/../../etc/message.xml
+        ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message.xml
+      COMMENT "Copying message.xml to the runtime folder."
+      )
        
-    if(WINDOWS)
-      # Copy Win Libs...
-      # This happens at build time, not config time. We can't glob files in this cmake.
-      # *FIX:Mani Write a sub script to glob the files...
-      # *FIX:Mani Use actually dependencies rather than bulk copy.
-      add_custom_command(
-        TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
-        COMMAND ${CMAKE_COMMAND}
-        ARGS
-          -E
-          copy_directory
-          ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}
-          ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
-        COMMENT "Copying staged dlls."
-        )
+    add_custom_command(
+      TARGET ${VIEWER_BINARY_NAME} POST_BUILD
+      COMMAND ${PYTHON_EXECUTABLE}
+      ARGS
+        ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+        --actions=copy
+        --artwork=${ARTWORK_DIR}
+        --build=${CMAKE_CURRENT_BINARY_DIR}
+        --configuration=${CMAKE_CFG_INTDIR}
+        --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
+        --grid=${GRID}
+        --source=${CMAKE_CURRENT_SOURCE_DIR}
+      DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+      COMMENT "Performing viewer_manifest copy"
+      )
 
-      add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon)
-      if(LLKDU_LIBRARY)
-	# kdu may not exist!
-	add_dependencies(${VIEWER_BINARY_NAME} llkdu)
-      endif(LLKDU_LIBRARY)
-    endif(WINDOWS)    
+    add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon)
+    
+    if(LLKDU_LIBRARY)
+      # kdu may not exist!
+      add_dependencies(${VIEWER_BINARY_NAME} llkdu)
+    endif(LLKDU_LIBRARY)
 
     if (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
       add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts)
     endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
         
-    add_custom_command(
+    add_dependencies(${VIEWER_BINARY_NAME} 
+      SLPlugin 
+      media_plugin_quicktime 
+      media_plugin_webkit
+      windows-updater 
+      windows-crash-logger
+      )
+
+    if (PACKAGE)
+      add_custom_command(
+        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2
+        COMMAND ${PYTHON_EXECUTABLE}
+        ARGS
+          ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py
+          ${CMAKE_CURRENT_SOURCE_DIR}/..
+          ${CMAKE_CURRENT_BINARY_DIR}
+          ${CMAKE_CFG_INTDIR}
+        DEPENDS 
+          lleventhost 
+          ${EVENT_HOST_SCRIPTS}
+          ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py
+        )
+
+      add_custom_command(
         OUTPUT ${CMAKE_CFG_INTDIR}/touched.bat
         COMMAND ${PYTHON_EXECUTABLE}
         ARGS
           ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
-          --configuration=${CMAKE_CFG_INTDIR}
+          --artwork=${ARTWORK_DIR}
+          --build=${CMAKE_CURRENT_BINARY_DIR}
           --channel=${VIEWER_CHANNEL}
-          --login_channel=${VIEWER_LOGIN_CHANNEL}
+          --configuration=${CMAKE_CFG_INTDIR}
+          --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
           --grid=${GRID}
+          --login_channel=${VIEWER_LOGIN_CHANNEL}
           --source=${CMAKE_CURRENT_SOURCE_DIR}
-              --artwork=${ARTWORK_DIR}
-              --build=${CMAKE_CURRENT_BINARY_DIR}
-              --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
-              --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat
+          --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat
         DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
         )
 
-    add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit)
-
-    if (PACKAGE)
-      add_custom_command(
-          OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2
-          COMMAND ${PYTHON_EXECUTABLE}
-          ARGS
-            ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py
-            ${CMAKE_CURRENT_SOURCE_DIR}/..
-            ${CMAKE_CURRENT_BINARY_DIR}
-            ${CMAKE_CFG_INTDIR}
-
-          DEPENDS 
-            lleventhost 
-            ${EVENT_HOST_SCRIPTS}
-            ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py)
-
-      add_custom_target(package ALL 
-          DEPENDS 
-            ${CMAKE_CFG_INTDIR}/touched.bat)
-            # temporarily disable packaging of event_host until hg subrepos get
-            # sorted out on the parabuild cluster...
-            #${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2)
-      add_dependencies(package windows-updater windows-crash-logger)
-
+      add_custom_target(package ALL DEPENDS ${CMAKE_CFG_INTDIR}/touched.bat)
+        # temporarily disable packaging of event_host until hg subrepos get
+        # sorted out on the parabuild cluster...
+        #${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2)
 
     endif (PACKAGE)
 endif (WINDOWS)
@@ -1509,15 +1511,16 @@ if (LINUX)
       COMMAND ${PYTHON_EXECUTABLE}
       ARGS
         ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
-        --grid=${GRID}
-        --channel=${VIEWER_CHANNEL}
-        --login_channel=${VIEWER_LOGIN_CHANNEL}
-        --installer_name=${product}
         --arch=${ARCH}
-        --source=${CMAKE_CURRENT_SOURCE_DIR}
         --artwork=${ARTWORK_DIR}
         --build=${CMAKE_CURRENT_BINARY_DIR}
+        --channel=${VIEWER_CHANNEL}
+        --configuration=${CMAKE_CFG_INTDIR}
         --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged
+        --grid=${GRID}
+        --installer_name=${product}
+        --login_channel=${VIEWER_LOGIN_CHANNEL}
+        --source=${CMAKE_CURRENT_SOURCE_DIR}
         --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched
       DEPENDS secondlife-stripped ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
       )
@@ -1552,13 +1555,13 @@ if (DARWIN)
     COMMAND ${PYTHON_EXECUTABLE}
     ARGS
       ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
-      --grid=${GRID}
       --actions=copy
-      --configuration=${CMAKE_CFG_INTDIR}
-      --source=${CMAKE_CURRENT_SOURCE_DIR}
       --artwork=${ARTWORK_DIR}
       --build=${CMAKE_CURRENT_BINARY_DIR}
+      --configuration=${CMAKE_CFG_INTDIR}
       --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app
+      --grid=${GRID}
+      --source=${CMAKE_CURRENT_SOURCE_DIR}
     DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
     )
 
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index b85d31d1ac6..7e5c30a9789 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -231,8 +231,21 @@ def construct(self):
                                'llplugin', 'slplugin', self.args['configuration'], "slplugin.exe"),
                   "slplugin.exe")
         
-        # need to get the llcommon.dll from the build directory as well
-        if self.prefix(src=self.args['configuration'], dst=""):
+        self.disable_manifest_check()
+
+        # Get shared libs from the shared libs staging directory
+        if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']),
+                       dst=""):
+
+            self.enable_crt_manifest_check()
+            
+            # Get kdu dll, continue if missing.
+            try:
+                self.path('%s/llkdu.dll' % self.args['configuration'], dst='llkdu.dll')
+            except RuntimeError:
+                print "Skipping llkdu.dll"
+
+            # Get llcommon and deps. If missing assume static linkage and continue.
             try:
                 self.path('llcommon.dll')
                 self.path('libapr-1.dll')
@@ -242,22 +255,41 @@ def construct(self):
                 print err.message
                 print "Skipping llcommon.dll (assuming llcommon was linked statically)"
 
-            self.end_prefix()
+            self.disable_manifest_check()
 
-        # need to get the kdu dll from the build directory as well
-        try:
-            self.path('%s/llkdu.dll' % self.args['configuration'], dst='llkdu.dll')
-        except RuntimeError:
-            print "Skipping llkdu.dll"
-
-        self.disable_manifest_check()
-
-        # For textures
-        if self.prefix(src=self.args['configuration'], dst=""):
-            if(self.args['configuration'].lower() == 'debug'):
+            # For textures
+            if self.args['configuration'].lower() == 'debug':
                 self.path("openjpegd.dll")
             else:
                 self.path("openjpeg.dll")
+
+            # These need to be installed as a SxS assembly, currently a 'private' assembly.
+            # See http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx
+            if self.args['configuration'].lower() == 'debug':
+                self.path("msvcr80d.dll")
+                self.path("msvcp80d.dll")
+                self.path("Microsoft.VC80.DebugCRT.manifest")
+            else:
+                self.path("msvcr80.dll")
+                self.path("msvcp80.dll")
+                self.path("Microsoft.VC80.CRT.manifest")
+
+            # Vivox runtimes
+            self.path("SLVoice.exe")
+            self.path("alut.dll")
+            self.path("vivoxsdk.dll")
+            self.path("ortp.dll")
+            self.path("wrap_oal.dll")
+
+            # For google-perftools tcmalloc allocator.
+            try:
+                if self.args['configuration'].lower() == 'debug':
+                    self.path('libtcmalloc_minimal-debug.dll')
+                else:
+                    self.path('libtcmalloc_minimal.dll')
+            except:
+                print "Skipping libtcmalloc_minimal.dll"
+
             self.end_prefix()
 
         self.path(src="licenses-win32.txt", dst="licenses.txt")
@@ -270,6 +302,7 @@ def construct(self):
         self.path("fmod.dll")
 
         self.enable_no_crt_manifest_check()
+        
         # Media plugins - QuickTime
         if self.prefix(src='../media_plugins/quicktime/%s' % self.args['configuration'], dst="llplugin"):
             self.path("media_plugin_quicktime.dll")
@@ -302,28 +335,6 @@ def construct(self):
 
         self.disable_manifest_check()
 
-        # These need to be installed as a SxS assembly, currently a 'private' assembly.
-        # See http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx
-        if self.prefix(src=self.args['configuration'], dst=""):
-            if self.args['configuration'] == 'Debug':
-                self.path("msvcr80d.dll")
-                self.path("msvcp80d.dll")
-                self.path("Microsoft.VC80.DebugCRT.manifest")
-            else:
-                self.path("msvcr80.dll")
-                self.path("msvcp80.dll")
-                self.path("Microsoft.VC80.CRT.manifest")
-            self.end_prefix()
-
-        # Vivox runtimes
-        if self.prefix(src=self.args['configuration'], dst=""):
-            self.path("SLVoice.exe")
-            self.path("alut.dll")
-            self.path("vivoxsdk.dll")
-            self.path("ortp.dll")
-            self.path("wrap_oal.dll")
-            self.end_prefix()
-
         # pull in the crash logger and updater from other projects
         # tag:"crash-logger" here as a cue to the exporter
         self.path(src='../win_crash_logger/%s/windows-crash-logger.exe' % self.args['configuration'],
@@ -331,17 +342,6 @@ def construct(self):
         self.path(src='../win_updater/%s/windows-updater.exe' % self.args['configuration'],
                   dst="updater.exe")
 
-        # For google-perftools tcmalloc allocator.
-        if self.prefix(src=self.args['configuration'], dst=""):
-            try:
-                if self.args['configuration'] == 'Debug':
-                    self.path('libtcmalloc_minimal-debug.dll')
-                else:
-                    self.path('libtcmalloc_minimal.dll')
-            except:
-                print "Skipping libtcmalloc_minimal.dll"
-            self.end_prefix()
-
     def nsi_file_commands(self, install=True):
         def wpath(path):
             if path.endswith('/') or path.endswith(os.path.sep):
diff --git a/indra/test_apps/llplugintest/CMakeLists.txt b/indra/test_apps/llplugintest/CMakeLists.txt
index 53b981cccde..400f63cef0e 100644
--- a/indra/test_apps/llplugintest/CMakeLists.txt
+++ b/indra/test_apps/llplugintest/CMakeLists.txt
@@ -7,6 +7,7 @@ include(FindOpenGL)
 include(LLCommon)
 include(LLPlugin)
 include(Linking)
+include(LLSharedLibs)
 include(PluginAPI)
 include(LLImage)
 include(LLMath)
@@ -324,27 +325,7 @@ if (DARWIN)
       make_directory
       ${PLUGINS_DESTINATION_DIR}
     COMMENT "Creating Resources directory in app bundle."
-  )
-
-  # copy the llcommon dylib and its dependencies to Contents/Resources.
-  get_target_property(BUILT_LLCOMMON llcommon LOCATION)
-  add_custom_command(TARGET llmediaplugintest POST_BUILD
-    COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_LLCOMMON}  ${PLUGINS_DESTINATION_DIR}
-    DEPENDS ${BUILT_LLCOMMON}
-  )
-  # FIXME: these paths should come from somewhere reliable.  The canonical list seems to be in indra/newview/viewer_manifest.py
-  add_custom_command(TARGET llmediaplugintest POST_BUILD
-    COMMAND ${CMAKE_COMMAND} -E copy ${ARCH_PREBUILT_DIRS_RELEASE}/libapr-1.0.3.7.dylib  ${PLUGINS_DESTINATION_DIR}
-    DEPENDS ${ARCH_PREBUILT_DIRS_RELEASE}/libapr-1.0.3.7.dylib
-  )
-  add_custom_command(TARGET llmediaplugintest POST_BUILD
-    COMMAND ${CMAKE_COMMAND} -E copy ${ARCH_PREBUILT_DIRS_RELEASE}/libaprutil-1.0.3.8.dylib  ${PLUGINS_DESTINATION_DIR}
-    DEPENDS ${ARCH_PREBUILT_DIRS_RELEASE}/libaprutil-1.0.3.8.dylib
-  )
-  add_custom_command(TARGET llmediaplugintest POST_BUILD
-    COMMAND ${CMAKE_COMMAND} -E copy ${ARCH_PREBUILT_DIRS_RELEASE}/libexpat.0.5.0.dylib  ${PLUGINS_DESTINATION_DIR}
-    DEPENDS ${ARCH_PREBUILT_DIRS_RELEASE}/libexpat.0.5.0.dylib
-  )
+  ) 
 else (DARWIN)
   set(PLUGINS_DESTINATION_DIR
     ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/
@@ -497,22 +478,18 @@ if(WINDOWS)
     ${plugintest_release_files}
     )
   set(plugin_test_targets ${plugin_test_targets} ${out_targets})
-
-  copy_if_different(
-    "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}"
-    "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}"
-    out_targets
-    llcommon.dll libapr-1.dll libaprutil-1.dll libapriconv-1.dll
-    )
-  set(plugin_test_targets ${plugin_test_targets} ${out_targets})
-
-  add_custom_target(copy_plugintest_libs ALL
-    DEPENDS 
-      ${plugin_test_targets}
-      llcommon
-    )
+ 
+   add_custom_target(copy_plugintest_libs ALL
+     DEPENDS 
+     ${plugin_test_targets}
+     )
 
   add_dependencies(llmediaplugintest copy_plugintest_libs)
 
 endif(WINDOWS)
 
+ll_deploy_sharedlibs_command(
+  llmediaplugintest
+  "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR};${ARCH_PREBUILT_DIRS}" 
+  ${SHARED_LIB_REL_PATH}
+  ) 
diff --git a/indra/win_crash_logger/CMakeLists.txt b/indra/win_crash_logger/CMakeLists.txt
index 0bd59f09908..e141d7aa52e 100644
--- a/indra/win_crash_logger/CMakeLists.txt
+++ b/indra/win_crash_logger/CMakeLists.txt
@@ -11,6 +11,7 @@ include(LLVFS)
 include(LLWindow)
 include(LLXML)
 include(Linking)
+include(LLSharedLibs)
 
 include_directories(
     ${LLCOMMON_INCLUDE_DIRS}
@@ -87,3 +88,8 @@ if (WINDOWS)
         LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\""
         )
 endif (WINDOWS)
+
+ll_deploy_sharedlibs_command(
+  windows-crash-logger
+  "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}" 
+  ".") 
diff --git a/indra/win_updater/CMakeLists.txt b/indra/win_updater/CMakeLists.txt
index dedb7cfcc72..9e18555ea97 100644
--- a/indra/win_updater/CMakeLists.txt
+++ b/indra/win_updater/CMakeLists.txt
@@ -33,3 +33,9 @@ set_target_properties(windows-updater
     LINK_FLAGS "/NODEFAULTLIB:LIBCMT"
     LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\""
     )
+
+# The windows-updater
+#ll_deploy_sharedlibs_command(
+#  windows-updater
+#  "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}" 
+#  ".") 
-- 
GitLab


From 953b7ea550bb59f5ebc12c0dfc4e0a454da4f601 Mon Sep 17 00:00:00 2001
From: "Mark Palange (Mani)" <palange@lindenlab.com>
Date: Thu, 5 Nov 2009 16:00:47 -0800
Subject: [PATCH 011/557] Belated addition of GetPrerequisites_2_8.cmake

---
 indra/cmake/GetPrerequisites_2_8.cmake | 786 +++++++++++++++++++++++++
 1 file changed, 786 insertions(+)
 create mode 100644 indra/cmake/GetPrerequisites_2_8.cmake

diff --git a/indra/cmake/GetPrerequisites_2_8.cmake b/indra/cmake/GetPrerequisites_2_8.cmake
new file mode 100644
index 00000000000..5a24842c896
--- /dev/null
+++ b/indra/cmake/GetPrerequisites_2_8.cmake
@@ -0,0 +1,786 @@
+# GetPrerequisites.cmake
+#
+# This script provides functions to list the .dll, .dylib or .so files that an
+# executable or shared library file depends on. (Its prerequisites.)
+#
+# It uses various tools to obtain the list of required shared library files:
+#   dumpbin (Windows)
+#   ldd (Linux/Unix)
+#   otool (Mac OSX)
+#
+# The following functions are provided by this script:
+#   gp_append_unique
+#   is_file_executable
+#   gp_item_default_embedded_path
+#     (projects can override with gp_item_default_embedded_path_override)
+#   gp_resolve_item
+#     (projects can override with gp_resolve_item_override)
+#   gp_resolved_file_type
+#   gp_file_type
+#   get_prerequisites
+#   list_prerequisites
+#   list_prerequisites_by_glob
+#
+# Requires CMake 2.6 or greater because it uses function, break, return and
+# PARENT_SCOPE.
+
+#=============================================================================
+# Copyright 2008-2009 Kitware, Inc.
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distributed this file outside of CMake, substitute the full
+#  License text for the above reference.)
+
+# gp_append_unique list_var value
+#
+# Append value to the list variable ${list_var} only if the value is not
+# already in the list.
+#
+function(gp_append_unique list_var value)
+  set(contains 0)
+
+  foreach(item ${${list_var}})
+    if("${item}" STREQUAL "${value}")
+      set(contains 1)
+      break()
+    endif("${item}" STREQUAL "${value}")
+  endforeach(item)
+
+  if(NOT contains)
+    set(${list_var} ${${list_var}} "${value}" PARENT_SCOPE)
+  endif(NOT contains)
+endfunction(gp_append_unique)
+
+
+# is_file_executable file result_var
+#
+# Return 1 in ${result_var} if ${file} is a binary executable.
+#
+# Return 0 in ${result_var} otherwise.
+#
+function(is_file_executable file result_var)
+  #
+  # A file is not executable until proven otherwise:
+  #
+  set(${result_var} 0 PARENT_SCOPE)
+
+  get_filename_component(file_full "${file}" ABSOLUTE)
+  string(TOLOWER "${file_full}" file_full_lower)
+
+  # If file name ends in .exe on Windows, *assume* executable:
+  #
+  if(WIN32)
+    if("${file_full_lower}" MATCHES "\\.exe$")
+      set(${result_var} 1 PARENT_SCOPE)
+      return()
+    endif("${file_full_lower}" MATCHES "\\.exe$")
+
+    # A clause could be added here that uses output or return value of dumpbin
+    # to determine ${result_var}. In 99%+? practical cases, the exe name
+    # match will be sufficient...
+    #
+  endif(WIN32)
+
+  # Use the information returned from the Unix shell command "file" to
+  # determine if ${file_full} should be considered an executable file...
+  #
+  # If the file command's output contains "executable" and does *not* contain
+  # "text" then it is likely an executable suitable for prerequisite analysis
+  # via the get_prerequisites macro.
+  #
+  if(UNIX)
+    if(NOT file_cmd)
+      find_program(file_cmd "file")
+    endif(NOT file_cmd)
+
+    if(file_cmd)
+      execute_process(COMMAND "${file_cmd}" "${file_full}"
+        OUTPUT_VARIABLE file_ov
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+        )
+
+      # Replace the name of the file in the output with a placeholder token
+      # (the string " _file_full_ ") so that just in case the path name of
+      # the file contains the word "text" or "executable" we are not fooled
+      # into thinking "the wrong thing" because the file name matches the
+      # other 'file' command output we are looking for...
+      #
+      string(REPLACE "${file_full}" " _file_full_ " file_ov "${file_ov}")
+      string(TOLOWER "${file_ov}" file_ov)
+
+      #message(STATUS "file_ov='${file_ov}'")
+      if("${file_ov}" MATCHES "executable")
+        #message(STATUS "executable!")
+        if("${file_ov}" MATCHES "text")
+          #message(STATUS "but text, so *not* a binary executable!")
+        else("${file_ov}" MATCHES "text")
+          set(${result_var} 1 PARENT_SCOPE)
+          return()
+        endif("${file_ov}" MATCHES "text")
+      endif("${file_ov}" MATCHES "executable")
+    else(file_cmd)
+      message(STATUS "warning: No 'file' command, skipping execute_process...")
+    endif(file_cmd)
+  endif(UNIX)
+endfunction(is_file_executable)
+
+
+# gp_item_default_embedded_path item default_embedded_path_var
+#
+# Return the path that others should refer to the item by when the item
+# is embedded inside a bundle.
+#
+# Override on a per-project basis by providing a project-specific
+# gp_item_default_embedded_path_override function.
+#
+function(gp_item_default_embedded_path item default_embedded_path_var)
+
+  # On Windows and Linux, "embed" prerequisites in the same directory
+  # as the executable by default:
+  #
+  set(path "@executable_path")
+  set(overridden 0)
+
+  # On the Mac, relative to the executable depending on the type
+  # of the thing we are embedding:
+  #
+  if(APPLE)
+    #
+    # The assumption here is that all executables in the bundle will be
+    # in same-level-directories inside the bundle. The parent directory
+    # of an executable inside the bundle should be MacOS or a sibling of
+    # MacOS and all embedded paths returned from here will begin with
+    # "@executable_path/../" and will work from all executables in all
+    # such same-level-directories inside the bundle.
+    #
+
+    # By default, embed things right next to the main bundle executable:
+    #
+    set(path "@executable_path/../../Contents/MacOS")
+
+    # Embed .dylibs right next to the main bundle executable:
+    #
+    if(item MATCHES "\\.dylib$")
+      set(path "@executable_path/../MacOS")
+      set(overridden 1)
+    endif(item MATCHES "\\.dylib$")
+
+    # Embed frameworks in the embedded "Frameworks" directory (sibling of MacOS):
+    #
+    if(NOT overridden)
+      if(item MATCHES "[^/]+\\.framework/")
+        set(path "@executable_path/../Frameworks")
+        set(overridden 1)
+      endif(item MATCHES "[^/]+\\.framework/")
+    endif(NOT overridden)
+  endif()
+
+  # Provide a hook so that projects can override the default embedded location
+  # of any given library by whatever logic they choose:
+  #
+  if(COMMAND gp_item_default_embedded_path_override)
+    gp_item_default_embedded_path_override("${item}" path)
+  endif(COMMAND gp_item_default_embedded_path_override)
+
+  set(${default_embedded_path_var} "${path}" PARENT_SCOPE)
+endfunction(gp_item_default_embedded_path)
+
+
+# gp_resolve_item context item exepath dirs resolved_item_var
+#
+# Resolve an item into an existing full path file.
+#
+# Override on a per-project basis by providing a project-specific
+# gp_resolve_item_override function.
+#
+function(gp_resolve_item context item exepath dirs resolved_item_var)
+  set(resolved 0)
+  set(resolved_item "${item}")
+
+  # Is it already resolved?
+  #
+  if(EXISTS "${resolved_item}")
+    set(resolved 1)
+  endif(EXISTS "${resolved_item}")
+
+  if(NOT resolved)
+    if(item MATCHES "@executable_path")
+      #
+      # @executable_path references are assumed relative to exepath
+      #
+      string(REPLACE "@executable_path" "${exepath}" ri "${item}")
+      get_filename_component(ri "${ri}" ABSOLUTE)
+
+      if(EXISTS "${ri}")
+        #message(STATUS "info: embedded item exists (${ri})")
+        set(resolved 1)
+        set(resolved_item "${ri}")
+      else(EXISTS "${ri}")
+        message(STATUS "warning: embedded item does not exist '${ri}'")
+      endif(EXISTS "${ri}")
+    endif(item MATCHES "@executable_path")
+  endif(NOT resolved)
+
+  if(NOT resolved)
+    if(item MATCHES "@loader_path")
+      #
+      # @loader_path references are assumed relative to the
+      # PATH of the given "context" (presumably another library)
+      #
+      get_filename_component(contextpath "${context}" PATH)
+      string(REPLACE "@loader_path" "${contextpath}" ri "${item}")
+      get_filename_component(ri "${ri}" ABSOLUTE)
+
+      if(EXISTS "${ri}")
+        #message(STATUS "info: embedded item exists (${ri})")
+        set(resolved 1)
+        set(resolved_item "${ri}")
+      else(EXISTS "${ri}")
+        message(STATUS "warning: embedded item does not exist '${ri}'")
+      endif(EXISTS "${ri}")
+    endif(item MATCHES "@loader_path")
+  endif(NOT resolved)
+
+  if(NOT resolved)
+    set(ri "ri-NOTFOUND")
+    find_file(ri "${item}" ${exepath} ${dirs} NO_DEFAULT_PATH)
+    find_file(ri "${item}" ${exepath} ${dirs} /usr/lib)
+    if(ri)
+      #message(STATUS "info: 'find_file' in exepath/dirs (${ri})")
+      set(resolved 1)
+      set(resolved_item "${ri}")
+      set(ri "ri-NOTFOUND")
+    endif(ri)
+  endif(NOT resolved)
+
+  if(NOT resolved)
+    if(item MATCHES "[^/]+\\.framework/")
+      set(fw "fw-NOTFOUND")
+      find_file(fw "${item}"
+        "~/Library/Frameworks"
+        "/Library/Frameworks"
+        "/System/Library/Frameworks"
+      )
+      if(fw)
+        #message(STATUS "info: 'find_file' found framework (${fw})")
+        set(resolved 1)
+        set(resolved_item "${fw}")
+        set(fw "fw-NOTFOUND")
+      endif(fw)
+    endif(item MATCHES "[^/]+\\.framework/")
+  endif(NOT resolved)
+
+  # Using find_program on Windows will find dll files that are in the PATH.
+  # (Converting simple file names into full path names if found.)
+  #
+  if(WIN32)
+  if(NOT resolved)
+    set(ri "ri-NOTFOUND")
+    find_program(ri "${item}" PATHS "${exepath};${dirs}" NO_DEFAULT_PATH)
+    find_program(ri "${item}" PATHS "${exepath};${dirs}")
+    if(ri)
+      #message(STATUS "info: 'find_program' in exepath/dirs (${ri})")
+      set(resolved 1)
+      set(resolved_item "${ri}")
+      set(ri "ri-NOTFOUND")
+    endif(ri)
+  endif(NOT resolved)
+  endif(WIN32)
+
+  # Provide a hook so that projects can override item resolution
+  # by whatever logic they choose:
+  #
+  if(COMMAND gp_resolve_item_override)
+    gp_resolve_item_override("${context}" "${item}" "${exepath}" "${dirs}" resolved_item resolved)
+  endif(COMMAND gp_resolve_item_override)
+
+  if(NOT resolved)
+    message(STATUS "
+warning: cannot resolve item '${item}'
+
+  possible problems:
+    need more directories?
+    need to use InstallRequiredSystemLibraries?
+    run in install tree instead of build tree?
+")
+#    message(STATUS "
+#******************************************************************************
+#warning: cannot resolve item '${item}'
+#
+#  possible problems:
+#    need more directories?
+#    need to use InstallRequiredSystemLibraries?
+#    run in install tree instead of build tree?
+#
+#    context='${context}'
+#    item='${item}'
+#    exepath='${exepath}'
+#    dirs='${dirs}'
+#    resolved_item_var='${resolved_item_var}'
+#******************************************************************************
+#")
+  endif(NOT resolved)
+
+  set(${resolved_item_var} "${resolved_item}" PARENT_SCOPE)
+endfunction(gp_resolve_item)
+
+
+# gp_resolved_file_type original_file file exepath dirs type_var
+#
+# Return the type of ${file} with respect to ${original_file}. String
+# describing type of prerequisite is returned in variable named ${type_var}.
+#
+# Use ${exepath} and ${dirs} if necessary to resolve non-absolute ${file}
+# values -- but only for non-embedded items.
+#
+# Possible types are:
+#   system
+#   local
+#   embedded
+#   other
+#
+function(gp_resolved_file_type original_file file exepath dirs type_var)
+  #message(STATUS "**")
+
+  if(NOT IS_ABSOLUTE "${original_file}")
+    message(STATUS "warning: gp_resolved_file_type expects absolute full path for first arg original_file")
+  endif()
+
+  set(is_embedded 0)
+  set(is_local 0)
+  set(is_system 0)
+
+  set(resolved_file "${file}")
+
+  if("${file}" MATCHES "^@(executable|loader)_path")
+    set(is_embedded 1)
+  endif()
+
+  if(NOT is_embedded)
+    if(NOT IS_ABSOLUTE "${file}")
+      gp_resolve_item("${original_file}" "${file}" "${exepath}" "${dirs}" resolved_file)
+    endif()
+
+    string(TOLOWER "${original_file}" original_lower)
+    string(TOLOWER "${resolved_file}" lower)
+
+    if(UNIX)
+      if(resolved_file MATCHES "^(/lib/|/lib32/|/lib64/|/usr/lib/|/usr/lib32/|/usr/lib64/|/usr/X11R6/)")
+        set(is_system 1)
+      endif()
+    endif()
+
+    if(APPLE)
+      if(resolved_file MATCHES "^(/System/Library/|/usr/lib/)")
+        set(is_system 1)
+      endif()
+    endif()
+
+    if(WIN32)
+      string(TOLOWER "$ENV{SystemRoot}" sysroot)
+      string(REGEX REPLACE "\\\\" "/" sysroot "${sysroot}")
+
+      string(TOLOWER "$ENV{windir}" windir)
+      string(REGEX REPLACE "\\\\" "/" windir "${windir}")
+
+      if(lower MATCHES "^(${sysroot}/system|${windir}/system|${sysroot}/syswow|${windir}/syswow|(.*/)*msvc[^/]+dll)")
+        set(is_system 1)
+      endif()
+    endif()
+
+    if(NOT is_system)
+      get_filename_component(original_path "${original_lower}" PATH)
+      get_filename_component(path "${lower}" PATH)
+      if("${original_path}" STREQUAL "${path}")
+        set(is_local 1)
+      endif()
+    endif()
+  endif()
+
+  # Return type string based on computed booleans:
+  #
+  set(type "other")
+
+  if(is_system)
+    set(type "system")
+  elseif(is_embedded)
+    set(type "embedded")
+  elseif(is_local)
+    set(type "local")
+  endif()
+
+  #message(STATUS "gp_resolved_file_type: '${file}' '${resolved_file}'")
+  #message(STATUS "                type: '${type}'")
+
+  if(NOT is_embedded)
+    if(NOT IS_ABSOLUTE "${resolved_file}")
+      if(lower MATCHES "^msvc[^/]+dll" AND is_system)
+        message(STATUS "info: non-absolute msvc file '${file}' returning type '${type}'")
+      else()
+        message(STATUS "warning: gp_resolved_file_type non-absolute file '${file}' returning type '${type}' -- possibly incorrect")
+      endif()
+    endif()
+  endif()
+
+  set(${type_var} "${type}" PARENT_SCOPE)
+
+  #message(STATUS "**")
+endfunction()
+
+
+# gp_file_type original_file file type_var
+#
+# Return the type of ${file} with respect to ${original_file}. String
+# describing type of prerequisite is returned in variable named ${type_var}.
+#
+# Possible types are:
+#   system
+#   local
+#   embedded
+#   other
+#
+function(gp_file_type original_file file type_var)
+  if(NOT IS_ABSOLUTE "${original_file}")
+    message(STATUS "warning: gp_file_type expects absolute full path for first arg original_file")
+  endif()
+
+  get_filename_component(exepath "${original_file}" PATH)
+
+  set(type "")
+  gp_resolved_file_type("${original_file}" "${file}" "${exepath}" "" type)
+
+  set(${type_var} "${type}" PARENT_SCOPE)
+endfunction(gp_file_type)
+
+
+# get_prerequisites target prerequisites_var exclude_system recurse dirs
+#
+# Get the list of shared library files required by ${target}. The list in
+# the variable named ${prerequisites_var} should be empty on first entry to
+# this function. On exit, ${prerequisites_var} will contain the list of
+# required shared library files.
+#
+#  target is the full path to an executable file
+#
+#  prerequisites_var is the name of a CMake variable to contain the results
+#
+#  exclude_system is 0 or 1: 0 to include "system" prerequisites , 1 to
+#   exclude them
+#
+#  recurse is 0 or 1: 0 for direct prerequisites only, 1 for all prerequisites
+#   recursively
+#
+#  exepath is the path to the top level executable used for @executable_path
+#   replacment on the Mac
+#
+#  dirs is a list of paths where libraries might be found: these paths are
+#   searched first when a target without any path info is given. Then standard
+#   system locations are also searched: PATH, Framework locations, /usr/lib...
+#
+function(get_prerequisites target prerequisites_var exclude_system recurse exepath dirs)
+  set(verbose 0)
+  set(eol_char "E")
+
+  if(NOT IS_ABSOLUTE "${target}")
+    message("warning: target '${target}' is not absolute...")
+  endif(NOT IS_ABSOLUTE "${target}")
+
+  if(NOT EXISTS "${target}")
+    message("warning: target '${target}' does not exist...")
+  endif(NOT EXISTS "${target}")
+
+  # <setup-gp_tool-vars>
+  #
+  # Try to choose the right tool by default. Caller can set gp_tool prior to
+  # calling this function to force using a different tool.
+  #
+  if("${gp_tool}" STREQUAL "")
+    set(gp_tool "ldd")
+    if(APPLE)
+      set(gp_tool "otool")
+    endif(APPLE)
+    if(WIN32)
+      set(gp_tool "dumpbin")
+    endif(WIN32)
+  endif("${gp_tool}" STREQUAL "")
+
+  set(gp_tool_known 0)
+
+  if("${gp_tool}" STREQUAL "ldd")
+    set(gp_cmd_args "")
+    set(gp_regex "^[\t ]*[^\t ]+ => ([^\t ]+).*${eol_char}$")
+    set(gp_regex_cmp_count 1)
+    set(gp_tool_known 1)
+  endif("${gp_tool}" STREQUAL "ldd")
+
+  if("${gp_tool}" STREQUAL "otool")
+    set(gp_cmd_args "-L")
+    set(gp_regex "^\t([^\t]+) \\(compatibility version ([0-9]+.[0-9]+.[0-9]+), current version ([0-9]+.[0-9]+.[0-9]+)\\)${eol_char}$")
+    set(gp_regex_cmp_count 3)
+    set(gp_tool_known 1)
+  endif("${gp_tool}" STREQUAL "otool")
+
+  if("${gp_tool}" STREQUAL "dumpbin")
+    set(gp_cmd_args "/dependents")
+    set(gp_regex "^    ([^ ].*[Dd][Ll][Ll])${eol_char}$")
+    set(gp_regex_cmp_count 1)
+    set(gp_tool_known 1)
+    set(ENV{VS_UNICODE_OUTPUT} "") # Block extra output from inside VS IDE.
+  endif("${gp_tool}" STREQUAL "dumpbin")
+
+  if(NOT gp_tool_known)
+    message(STATUS "warning: gp_tool='${gp_tool}' is an unknown tool...")
+    message(STATUS "CMake function get_prerequisites needs more code to handle '${gp_tool}'")
+    message(STATUS "Valid gp_tool values are dumpbin, ldd and otool.")
+    return()
+  endif(NOT gp_tool_known)
+
+  set(gp_cmd_paths ${gp_cmd_paths}
+    "C:/Program Files/Microsoft Visual Studio 9.0/VC/bin"
+    "C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/bin"
+    "C:/Program Files/Microsoft Visual Studio 8/VC/BIN"
+    "C:/Program Files (x86)/Microsoft Visual Studio 8/VC/BIN"
+    "C:/Program Files/Microsoft Visual Studio .NET 2003/VC7/BIN"
+    "C:/Program Files (x86)/Microsoft Visual Studio .NET 2003/VC7/BIN"
+    "/usr/local/bin"
+    "/usr/bin"
+    )
+
+  find_program(gp_cmd ${gp_tool} PATHS ${gp_cmd_paths})
+
+  if(NOT gp_cmd)
+    message(STATUS "warning: could not find '${gp_tool}' - cannot analyze prerequisites...")
+    return()
+  endif(NOT gp_cmd)
+
+  if("${gp_tool}" STREQUAL "dumpbin")
+    # When running dumpbin, it also needs the "Common7/IDE" directory in the
+    # PATH. It will already be in the PATH if being run from a Visual Studio
+    # command prompt. Add it to the PATH here in case we are running from a
+    # different command prompt.
+    #
+    get_filename_component(gp_cmd_dir "${gp_cmd}" PATH)
+    get_filename_component(gp_cmd_dlls_dir "${gp_cmd_dir}/../../Common7/IDE" ABSOLUTE)
+    if(EXISTS "${gp_cmd_dlls_dir}")
+      # only add to the path if it is not already in the path
+      if(NOT "$ENV{PATH}" MATCHES "${gp_cmd_dlls_dir}")
+        set(ENV{PATH} "$ENV{PATH};${gp_cmd_dlls_dir}")
+      endif(NOT "$ENV{PATH}" MATCHES "${gp_cmd_dlls_dir}")
+    endif(EXISTS "${gp_cmd_dlls_dir}")
+  endif("${gp_tool}" STREQUAL "dumpbin")
+  #
+  # </setup-gp_tool-vars>
+
+  if("${gp_tool}" STREQUAL "ldd")
+    set(old_ld_env "$ENV{LD_LIBRARY_PATH}")
+    foreach(dir ${exepath} ${dirs})
+      set(ENV{LD_LIBRARY_PATH} "${dir}:$ENV{LD_LIBRARY_PATH}")
+    endforeach(dir)
+  endif("${gp_tool}" STREQUAL "ldd")
+
+
+  # Track new prerequisites at each new level of recursion. Start with an
+  # empty list at each level:
+  #
+  set(unseen_prereqs)
+
+  # Run gp_cmd on the target:
+  #
+  execute_process(
+    COMMAND ${gp_cmd} ${gp_cmd_args} ${target}
+    OUTPUT_VARIABLE gp_cmd_ov
+    )
+
+  if("${gp_tool}" STREQUAL "ldd")
+    set(ENV{LD_LIBRARY_PATH} "${old_ld_env}")
+  endif("${gp_tool}" STREQUAL "ldd")
+
+  if(verbose)
+    message(STATUS "<RawOutput cmd='${gp_cmd} ${gp_cmd_args} ${target}'>")
+    message(STATUS "gp_cmd_ov='${gp_cmd_ov}'")
+    message(STATUS "</RawOutput>")
+  endif(verbose)
+
+  get_filename_component(target_dir "${target}" PATH)
+
+  # Convert to a list of lines:
+  #
+  string(REGEX REPLACE ";" "\\\\;" candidates "${gp_cmd_ov}")
+  string(REGEX REPLACE "\n" "${eol_char};" candidates "${candidates}")
+
+  # Analyze each line for file names that match the regular expression:
+  #
+  foreach(candidate ${candidates})
+  if("${candidate}" MATCHES "${gp_regex}")
+    # Extract information from each candidate:
+    string(REGEX REPLACE "${gp_regex}" "\\1" raw_item "${candidate}")
+
+    if(gp_regex_cmp_count GREATER 1)
+      string(REGEX REPLACE "${gp_regex}" "\\2" raw_compat_version "${candidate}")
+      string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\1" compat_major_version "${raw_compat_version}")
+      string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\2" compat_minor_version "${raw_compat_version}")
+      string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\3" compat_patch_version "${raw_compat_version}")
+    endif(gp_regex_cmp_count GREATER 1)
+
+    if(gp_regex_cmp_count GREATER 2)
+      string(REGEX REPLACE "${gp_regex}" "\\3" raw_current_version "${candidate}")
+      string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\1" current_major_version "${raw_current_version}")
+      string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\2" current_minor_version "${raw_current_version}")
+      string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\3" current_patch_version "${raw_current_version}")
+    endif(gp_regex_cmp_count GREATER 2)
+
+    # Use the raw_item as the list entries returned by this function. Use the
+    # gp_resolve_item function to resolve it to an actual full path file if
+    # necessary.
+    #
+    set(item "${raw_item}")
+
+    # Add each item unless it is excluded:
+    #
+    set(add_item 1)
+
+    if(${exclude_system})
+      set(type "")
+      gp_resolved_file_type("${target}" "${item}" "${exepath}" "${dirs}" type)
+      if("${type}" STREQUAL "system")
+        set(add_item 0)
+      endif("${type}" STREQUAL "system")
+    endif(${exclude_system})
+
+    if(add_item)
+      list(LENGTH ${prerequisites_var} list_length_before_append)
+      gp_append_unique(${prerequisites_var} "${item}")
+      list(LENGTH ${prerequisites_var} list_length_after_append)
+
+      if(${recurse})
+        # If item was really added, this is the first time we have seen it.
+        # Add it to unseen_prereqs so that we can recursively add *its*
+        # prerequisites...
+        #
+        # But first: resolve its name to an absolute full path name such
+        # that the analysis tools can simply accept it as input.
+        #
+        if(NOT list_length_before_append EQUAL list_length_after_append)
+          gp_resolve_item("${target}" "${item}" "${exepath}" "${dirs}" resolved_item)
+          set(unseen_prereqs ${unseen_prereqs} "${resolved_item}")
+        endif(NOT list_length_before_append EQUAL list_length_after_append)
+      endif(${recurse})
+    endif(add_item)
+  else("${candidate}" MATCHES "${gp_regex}")
+    if(verbose)
+      message(STATUS "ignoring non-matching line: '${candidate}'")
+    endif(verbose)
+  endif("${candidate}" MATCHES "${gp_regex}")
+  endforeach(candidate)
+
+  list(LENGTH ${prerequisites_var} prerequisites_var_length)
+  if(prerequisites_var_length GREATER 0)
+    list(SORT ${prerequisites_var})
+  endif(prerequisites_var_length GREATER 0)
+  if(${recurse})
+    set(more_inputs ${unseen_prereqs})
+    foreach(input ${more_inputs})
+      get_prerequisites("${input}" ${prerequisites_var} ${exclude_system} ${recurse} "${exepath}" "${dirs}")
+    endforeach(input)
+  endif(${recurse})
+
+  set(${prerequisites_var} ${${prerequisites_var}} PARENT_SCOPE)
+endfunction(get_prerequisites)
+
+
+# list_prerequisites target all exclude_system verbose
+#
+#  ARGV0 (target) is the full path to an executable file
+#
+#  optional ARGV1 (all) is 0 or 1: 0 for direct prerequisites only,
+#   1 for all prerequisites recursively
+#
+#  optional ARGV2 (exclude_system) is 0 or 1: 0 to include "system"
+#   prerequisites , 1 to exclude them
+#
+#  optional ARGV3 (verbose) is 0 or 1: 0 to print only full path
+#   names of prerequisites, 1 to print extra information
+#
+function(list_prerequisites target)
+  if("${ARGV1}" STREQUAL "")
+    set(all 1)
+  else("${ARGV1}" STREQUAL "")
+    set(all "${ARGV1}")
+  endif("${ARGV1}" STREQUAL "")
+
+  if("${ARGV2}" STREQUAL "")
+    set(exclude_system 0)
+  else("${ARGV2}" STREQUAL "")
+    set(exclude_system "${ARGV2}")
+  endif("${ARGV2}" STREQUAL "")
+
+  if("${ARGV3}" STREQUAL "")
+    set(verbose 0)
+  else("${ARGV3}" STREQUAL "")
+    set(verbose "${ARGV3}")
+  endif("${ARGV3}" STREQUAL "")
+
+  set(count 0)
+  set(count_str "")
+  set(print_count "${verbose}")
+  set(print_prerequisite_type "${verbose}")
+  set(print_target "${verbose}")
+  set(type_str "")
+
+  get_filename_component(exepath "${target}" PATH)
+
+  set(prereqs "")
+  get_prerequisites("${target}" prereqs ${exclude_system} ${all} "${exepath}" "")
+
+  if(print_target)
+    message(STATUS "File '${target}' depends on:")
+  endif(print_target)
+
+  foreach(d ${prereqs})
+    math(EXPR count "${count} + 1")
+
+    if(print_count)
+      set(count_str "${count}. ")
+    endif(print_count)
+
+    if(print_prerequisite_type)
+      gp_file_type("${target}" "${d}" type)
+      set(type_str " (${type})")
+    endif(print_prerequisite_type)
+
+    message(STATUS "${count_str}${d}${type_str}")
+  endforeach(d)
+endfunction(list_prerequisites)
+
+
+# list_prerequisites_by_glob glob_arg glob_exp
+#
+#  glob_arg is GLOB or GLOB_RECURSE
+#
+#  glob_exp is a globbing expression used with "file(GLOB" to retrieve a list
+#   of matching files. If a matching file is executable, its prerequisites are
+#   listed.
+#
+# Any additional (optional) arguments provided are passed along as the
+# optional arguments to the list_prerequisites calls.
+#
+function(list_prerequisites_by_glob glob_arg glob_exp)
+  message(STATUS "=============================================================================")
+  message(STATUS "List prerequisites of executables matching ${glob_arg} '${glob_exp}'")
+  message(STATUS "")
+  file(${glob_arg} file_list ${glob_exp})
+  foreach(f ${file_list})
+    is_file_executable("${f}" is_f_executable)
+    if(is_f_executable)
+      message(STATUS "=============================================================================")
+      list_prerequisites("${f}" ${ARGN})
+      message(STATUS "")
+    endif(is_f_executable)
+  endforeach(f)
+endfunction(list_prerequisites_by_glob)
-- 
GitLab


From ec32310c8602bf4dc69ed27e8c177cbd32c24411 Mon Sep 17 00:00:00 2001
From: palange <palange@lindenlab.com>
Date: Thu, 5 Nov 2009 17:51:50 -0800
Subject: [PATCH 012/557] Removed search_dirs and dst_path arguments from
 ll_deploy_sharedlibs_command() Fixed mac breakage.

---
 indra/cmake/LLSharedLibs.cmake              | 87 +++++++++++++--------
 indra/llcommon/CMakeLists.txt               | 42 +---------
 indra/mac_crash_logger/CMakeLists.txt       |  6 +-
 indra/mac_updater/CMakeLists.txt            |  5 +-
 indra/test_apps/llplugintest/CMakeLists.txt |  6 +-
 indra/win_crash_logger/CMakeLists.txt       |  5 +-
 indra/win_updater/CMakeLists.txt            |  7 +-
 7 files changed, 67 insertions(+), 91 deletions(-)

diff --git a/indra/cmake/LLSharedLibs.cmake b/indra/cmake/LLSharedLibs.cmake
index 28f0e7ad12b..6f602680f49 100644
--- a/indra/cmake/LLSharedLibs.cmake
+++ b/indra/cmake/LLSharedLibs.cmake
@@ -1,49 +1,74 @@
-
-if(DARWIN)
-  set(TMP_PATH "../Resource")
-elseif(LINUX)
-  set(TMP_PATH "../lib")
-else(DARWIN)
-  set(TMP_PATH ".")
-endif(DARWIN)
-
- set(SHARED_LIB_REL_PATH ${TMP_PATH} CACHE STRING "Relative path from executable to shared libs")
-
 # ll_deploy_sharedlibs_command
 # target_exe: the cmake target of the executable for which the shared libs will be deployed.
-# search_dirs: a list of dirs to search for the dependencies
-# dst_path: path to copy deps to, relative to the output location of the target_exe
-macro(ll_deploy_sharedlibs_command target_exe search_dirs dst_path) 
-  get_target_property(OUTPUT_LOCATION ${target_exe} LOCATION)
-  get_filename_component(OUTPUT_PATH ${OUTPUT_LOCATION} PATH)
-
+macro(ll_deploy_sharedlibs_command target_exe) 
+  get_target_property(TARGET_LOCATION ${target_exe} LOCATION)
+  get_filename_component(OUTPUT_PATH ${TARGET_LOCATION} PATH)
+  
   if(DARWIN)
+	set(SEARCH_DIRS "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources")
     get_target_property(IS_BUNDLE ${target_exe} MACOSX_BUNDLE)
     if(IS_BUNDLE)
-      get_filename_component(TARGET_FILE ${OUTPUT_LOCATION} NAME)
-      set(OUTPUT_PATH ${OUTPUT_LOCATION}.app/Contents/MacOS)
-      set(OUTPUT_LOCATION ${OUTPUT_PATH}/${TARGET_FILE})
+	  # If its a bundle the exe is not in the target location, this should find it.
+      get_filename_component(TARGET_FILE ${TARGET_LOCATION} NAME)
+      set(OUTPUT_PATH ${TARGET_LOCATION}.app/Contents/MacOS)
+      set(TARGET_LOCATION ${OUTPUT_PATH}/${TARGET_FILE})
+	  set(OUTPUT_PATH ${OUTPUT_PATH}/../Resources)
     endif(IS_BUNDLE)
+  elseif(WINDOWS)
+    set(SEARCH_DIRS "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}" "$ENV{SystemRoot}/system32")
+  elseif(LINUX)
+	set(SEARCH_DIRS "${SHARED_LIB_STAGING_DIR}")
+	set(OUTPUT_PATH ${OUTPUT_PATH}/lib)
   endif(DARWIN)
 
-  if(WINDOWS)
-    set(REAL_SEARCH_DIRS ${search_dirs} "$ENV{SystemRoot}/system32")
-  endif(WINDOWS)
-
-  if(LINUX)
-    message(FATAL_ERROR "LINUX Unsupported!?!")
-  endif(LINUX)
-  
   add_custom_command(
     TARGET ${target_exe} POST_BUILD
     COMMAND ${CMAKE_COMMAND} 
     ARGS
-    "-DBIN_NAME=\"${OUTPUT_LOCATION}\""
-    "-DSEARCH_DIRS=\"${REAL_SEARCH_DIRS}\""
-    "-DDST_PATH=\"${OUTPUT_PATH}/${dst_path}\""
+    "-DBIN_NAME=\"${TARGET_LOCATION}\""
+    "-DSEARCH_DIRS=\"${SEARCH_DIRS}\""
+    "-DDST_PATH=\"${OUTPUT_PATH}\""
     "-P"
     "${CMAKE_SOURCE_DIR}/cmake/DeploySharedLibs.cmake"
     )
 
 endmacro(ll_deploy_sharedlibs_command)
 
+# ll_stage_sharedlib
+# Performs config and adds a copy command for a sharedlib target.
+macro(ll_stage_sharedlib DSO_TARGET)
+  if(SHARED_LIB_STAGING_DIR)
+    # target gets written to the DLL staging directory.
+    # Also this directory is shared with RunBuildTest.cmake, y'know, for the tests.
+    set_target_properties(${DSO_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SHARED_LIB_STAGING_DIR})
+    if(NOT WINDOWS)
+      get_target_property(DSO_PATH ${DSO_TARGET} LOCATION)
+      get_filename_component(DSO_FILE ${DSO_PATH} NAME)
+      if(DARWIN)
+        set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources)
+      else(DARWIN)
+        set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
+      endif(DARWIN)
+	  
+      # *TODO - maybe make this a symbolic link? -brad
+      add_custom_command(
+        TARGET ${DSO_TARGET} POST_BUILD
+        COMMAND ${CMAKE_COMMAND}
+        ARGS
+          -E
+          copy_if_different
+          ${DSO_PATH}
+          ${SHARED_LIB_STAGING_DIR_CONFIG}/${DSO_FILE}
+          COMMENT "Copying llcommon to the staging folder."
+        )
+    endif(NOT WINDOWS)
+  endif(SHARED_LIB_STAGING_DIR)
+
+  if (DARWIN)
+    set_target_properties(${DSO_TARGET} PROPERTIES
+      BUILD_WITH_INSTALL_RPATH 1
+      INSTALL_NAME_DIR "@executable_path/../Resources"
+      )
+  endif(DARWIN)
+
+endmacro(ll_stage_sharedlib)
\ No newline at end of file
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index ea36e657293..f40359790aa 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -1,3 +1,4 @@
+
 # -*- cmake -*-
 
 project(llcommon)
@@ -6,8 +7,8 @@ include(00-Common)
 include(LLCommon)
 include(Linking)
 include(Boost)
-include (Pth)
-
+include(Pth)
+include(LLSharedLibs)
 include(Copy3rdPartyLibs)
 
 include_directories(
@@ -241,42 +242,7 @@ list(APPEND llcommon_SOURCE_FILES ${llcommon_HEADER_FILES})
 
 if(LLCOMMON_LINK_SHARED)
     add_library (llcommon SHARED ${llcommon_SOURCE_FILES})
-
-    if(SHARED_LIB_STAGING_DIR)
-        # *FIX:Mani ---
-        # llcommon.dll get written to the DLL staging directory.
-        # Also this directory is shared with RunBuildTest.cmake, y'know, for the tests.
-        set_target_properties(llcommon PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SHARED_LIB_STAGING_DIR})
-        if(NOT WINDOWS)
-          get_target_property(LLCOMMON_PATH llcommon LOCATION)
-          get_filename_component(LLCOMMON_FILE ${LLCOMMON_PATH} NAME)
-          if(DARWIN)
-            set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources)
-          else(DARWIN)
-            set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
-          endif(DARWIN)
-
-          # *TODO - maybe make this a symbolic link? -brad
-          add_custom_command(
-            TARGET llcommon POST_BUILD
-            COMMAND ${CMAKE_COMMAND}
-            ARGS
-              -E
-              copy_if_different
-              ${LLCOMMON_PATH}
-              ${SHARED_LIB_STAGING_DIR_CONFIG}/${LLCOMMON_FILE}
-            COMMENT "Copying llcommon to the staging folder."
-            )
-        endif(NOT WINDOWS)
-    endif(SHARED_LIB_STAGING_DIR)
-
-    if (DARWIN)
-      set_target_properties(llcommon PROPERTIES
-        BUILD_WITH_INSTALL_RPATH 1
-        INSTALL_NAME_DIR "@executable_path/../Resources"
-        )
-    endif(DARWIN)
-
+	ll_stage_sharedlib(llcommon)
 else(LLCOMMON_LINK_SHARED)
     add_library (llcommon ${llcommon_SOURCE_FILES})
 endif(LLCOMMON_LINK_SHARED)
diff --git a/indra/mac_crash_logger/CMakeLists.txt b/indra/mac_crash_logger/CMakeLists.txt
index 1c5a37c4c5d..420e836e368 100644
--- a/indra/mac_crash_logger/CMakeLists.txt
+++ b/indra/mac_crash_logger/CMakeLists.txt
@@ -75,8 +75,6 @@ add_custom_command(
     ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-crash-logger.app/Contents/Resources/CrashReporter.nib
   )
 
-ll_deploy_sharedlibs_command(
-  mac-crash-logger
-  "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR};${ARCH_PREBUILT_DIRS}" 
-  "../Resources") 
+ll_deploy_sharedlibs_command(mac-crash-logger)
+
 
diff --git a/indra/mac_updater/CMakeLists.txt b/indra/mac_updater/CMakeLists.txt
index d7bd6f993ce..57d426aa24d 100644
--- a/indra/mac_updater/CMakeLists.txt
+++ b/indra/mac_updater/CMakeLists.txt
@@ -77,7 +77,4 @@ add_custom_command(
     ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-updater.app/Contents/Resources/AutoUpdater.nib
   )
 
-ll_deploy_sharedlibs_command(
-  mac-updater
-  "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR};${ARCH_PREBUILT_DIRS}" 
-  "../Resources") 
+ll_deploy_sharedlibs_command(mac-updater) 
diff --git a/indra/test_apps/llplugintest/CMakeLists.txt b/indra/test_apps/llplugintest/CMakeLists.txt
index 400f63cef0e..0011daaec6e 100644
--- a/indra/test_apps/llplugintest/CMakeLists.txt
+++ b/indra/test_apps/llplugintest/CMakeLists.txt
@@ -488,8 +488,4 @@ if(WINDOWS)
 
 endif(WINDOWS)
 
-ll_deploy_sharedlibs_command(
-  llmediaplugintest
-  "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR};${ARCH_PREBUILT_DIRS}" 
-  ${SHARED_LIB_REL_PATH}
-  ) 
+ll_deploy_sharedlibs_command(llmediaplugintest) 
diff --git a/indra/win_crash_logger/CMakeLists.txt b/indra/win_crash_logger/CMakeLists.txt
index e141d7aa52e..990dc6783ee 100644
--- a/indra/win_crash_logger/CMakeLists.txt
+++ b/indra/win_crash_logger/CMakeLists.txt
@@ -89,7 +89,4 @@ if (WINDOWS)
         )
 endif (WINDOWS)
 
-ll_deploy_sharedlibs_command(
-  windows-crash-logger
-  "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}" 
-  ".") 
+ll_deploy_sharedlibs_command(windows-crash-logger)
\ No newline at end of file
diff --git a/indra/win_updater/CMakeLists.txt b/indra/win_updater/CMakeLists.txt
index 9e18555ea97..82347adf201 100644
--- a/indra/win_updater/CMakeLists.txt
+++ b/indra/win_updater/CMakeLists.txt
@@ -34,8 +34,5 @@ set_target_properties(windows-updater
     LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\""
     )
 
-# The windows-updater
-#ll_deploy_sharedlibs_command(
-#  windows-updater
-#  "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}" 
-#  ".") 
+# The windows-updater doesn't link against anything non-system, apparently
+#ll_deploy_sharedlibs_command(windows-updater)
\ No newline at end of file
-- 
GitLab


From 4dbd16953719ec30004d3df45486c51aa65981db Mon Sep 17 00:00:00 2001
From: Denis Serdjuk <dserduk@productengine.com>
Date: Fri, 6 Nov 2009 21:38:16 +0200
Subject: [PATCH 013/557] fixed bug EXT-2239   Preferences > Graphics has 2
 entry fields for UI Size

--HG--
branch : product-engine
---
 .../default/xui/en/panel_preferences_graphics1.xml | 14 +-------------
 1 file changed, 1 insertion(+), 13 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index b1308a19428..9b10edde339 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -109,19 +109,7 @@
      name="ui_scale_slider"
      top_pad="2"
      width="180" />
-    <spinner
-     control_name="UIScaleFactor"
-     height="16"
-     increment="0.025"
-     initial_value="1"
-     layout="topleft"
-     left_pad="10"
-     max_val="1.4"
-     min_val="0.75"
-     name="ui_scale_slider"
-     top_delta="0"
-     width="58" />
-     <text
+    <text
      type="string"
      length="1"
      follows="left|top"
-- 
GitLab


From 06ba4927aa8d288b843ed1380132c14938708707 Mon Sep 17 00:00:00 2001
From: "palange@eniac62.lindenlab.com" <palange@eniac62.lindenlab.com>
Date: Fri, 6 Nov 2009 17:19:47 -0800
Subject: [PATCH 014/557] Changed copy of libuuid.so to libuuid.so.1

---
 indra/cmake/Copy3rdPartyLibs.cmake | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index b26d4cbefb4..d6299bbb7d8 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -225,7 +225,7 @@ elseif(LINUX)
         libssl.so
         libstacktrace.so
         libtcmalloc.so
-        libuuid.so
+        libuuid.so.1
         libz.so
         libssl.so.0.9.7
        )
-- 
GitLab


From eecf91653b679b83add99c08a20da5d2d8891436 Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Sat, 7 Nov 2009 15:01:04 +0200
Subject: [PATCH 015/557] Fixed low bug EXT-1963 "Unexpected gray square in the
 bottom of Places panel": - Fixed reference to a missing texture.

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_places.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index cbbcfe50681..5efacb68bea 100644
--- a/indra/newview/skins/default/xui/en/panel_places.xml
+++ b/indra/newview/skins/default/xui/en/panel_places.xml
@@ -104,7 +104,7 @@ background_visible="true"
          follows="bottom|right"
          font="SansSerifSmall"
          height="19"
-         image_disabled="ForwardArrow_Disabled"
+         image_disabled="ForwardArrow_Off"
          image_selected="ForwardArrow_Press"
          image_unselected="ForwardArrow_Off"
          layout="topleft"
-- 
GitLab


From e360a444648dfa57c446e7714ea7eaf4db4a1d44 Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Sat, 7 Nov 2009 17:20:52 +0200
Subject: [PATCH 016/557] Fixed normal bug EXT-2314 "Restore maturity rating in
 "Landmark" and "Teleport History" views": - Added rating icons and text to
 "Landmark" and "Teleport History" views. - Removed code for "Last Visited"
 from Teleport History.

--HG--
branch : product-engine
---
 indra/newview/llpanellandmarkinfo.cpp         | 31 +++++++++++-
 indra/newview/llpanelplaceinfo.cpp            | 17 ++-----
 indra/newview/llpanelplaceinfo.h              |  2 +
 indra/newview/llpanelplaceprofile.cpp         | 48 ++++++++++---------
 indra/newview/llpanelplaceprofile.h           |  4 +-
 indra/newview/llpanelplaces.cpp               |  1 -
 .../default/xui/en/panel_landmark_info.xml    | 28 +++++++++++
 .../default/xui/en/panel_place_profile.xml    | 18 +++++++
 8 files changed, 107 insertions(+), 42 deletions(-)

diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp
index 49856638339..f94a59ecef5 100644
--- a/indra/newview/llpanellandmarkinfo.cpp
+++ b/indra/newview/llpanellandmarkinfo.cpp
@@ -35,6 +35,7 @@
 #include "llpanellandmarkinfo.h"
 
 #include "llcombobox.h"
+#include "lliconctrl.h"
 #include "lllineeditor.h"
 #include "lltextbox.h"
 #include "lltexteditor.h"
@@ -58,6 +59,11 @@ static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats);
 
 static LLRegisterPanelClassWrapper<LLPanelLandmarkInfo> t_landmark_info("panel_landmark_info");
 
+// Statics for textures filenames
+static std::string icon_pg;
+static std::string icon_m;
+static std::string icon_r;
+
 LLPanelLandmarkInfo::LLPanelLandmarkInfo()
 :	LLPanelPlaceInfo()
 {}
@@ -79,6 +85,10 @@ BOOL LLPanelLandmarkInfo::postBuild()
 	mNotesEditor = getChild<LLTextEditor>("notes_editor");
 	mFolderCombo = getChild<LLComboBox>("folder_combo");
 
+	icon_pg = getString("icon_PG");
+	icon_m = getString("icon_M");
+	icon_r = getString("icon_R");
+
 	return TRUE;
 }
 
@@ -101,9 +111,8 @@ void LLPanelLandmarkInfo::setInfoType(INFO_TYPE type)
 	LLPanel* landmark_info_panel = getChild<LLPanel>("landmark_info_panel");
 
 	bool is_info_type_create_landmark = type == CREATE_LANDMARK;
-	bool is_info_type_landmark = type == LANDMARK;
 
-	landmark_info_panel->setVisible(is_info_type_landmark);
+	landmark_info_panel->setVisible(type == LANDMARK);
 
 	getChild<LLTextBox>("folder_label")->setVisible(is_info_type_create_landmark);
 	mFolderCombo->setVisible(is_info_type_create_landmark);
@@ -136,6 +145,24 @@ void LLPanelLandmarkInfo::processParcelInfo(const LLParcelData& parcel_data)
 {
 	LLPanelPlaceInfo::processParcelInfo(parcel_data);
 
+	// HACK: Flag 0x2 == adult region,
+	// Flag 0x1 == mature region, otherwise assume PG
+	if (parcel_data.flags & 0x2)
+	{
+		mMaturityRatingIcon->setValue(icon_r);
+		mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_ADULT));
+	}
+	else if (parcel_data.flags & 0x1)
+	{
+		mMaturityRatingIcon->setValue(icon_m);
+		mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_MATURE));
+	}
+	else
+	{
+		mMaturityRatingIcon->setValue(icon_pg);
+		mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_PG));
+	}
+
 	S32 region_x;
 	S32 region_y;
 	S32 region_z;
diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp
index c6006510158..906f8d084bd 100644
--- a/indra/newview/llpanelplaceinfo.cpp
+++ b/indra/newview/llpanelplaceinfo.cpp
@@ -40,6 +40,7 @@
 
 #include "llsdutil_math.h"
 
+#include "lliconctrl.h"
 #include "llscrollcontainer.h"
 #include "lltextbox.h"
 
@@ -81,6 +82,7 @@ BOOL LLPanelPlaceInfo::postBuild()
 	mParcelName = getChild<LLTextBox>("parcel_title");
 	mDescEditor = getChild<LLExpandableTextBox>("description");
 
+	mMaturityRatingIcon = getChild<LLIconCtrl>("maturity_icon");
 	mMaturityRatingText = getChild<LLTextBox>("maturity_value");
 
 	LLScrollContainer* scroll_container = getChild<LLScrollContainer>("place_scroll");
@@ -98,6 +100,7 @@ void LLPanelPlaceInfo::resetLocation()
 	mPosRegion.clearVec();
 
 	std::string not_available = getString("not_available");
+	mMaturityRatingIcon->setValue(not_available);
 	mMaturityRatingText->setValue(not_available);
 	mRegionName->setText(not_available);
 	mParcelName->setText(not_available);
@@ -204,20 +207,6 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)
 		mDescEditor->setText(parcel_data.desc);
 	}
 
-	// HACK: Flag 0x2 == adult region,
-	// Flag 0x1 == mature region, otherwise assume PG
-	std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG);
-	if (parcel_data.flags & 0x2)
-	{
-		rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT);
-	}
-	else if (parcel_data.flags & 0x1)
-	{
-		rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE);
-	}
-
-	mMaturityRatingText->setValue(rating);
-
 	S32 region_x;
 	S32 region_y;
 	S32 region_z;
diff --git a/indra/newview/llpanelplaceinfo.h b/indra/newview/llpanelplaceinfo.h
index ec30397cff5..ba32cc4c34c 100644
--- a/indra/newview/llpanelplaceinfo.h
+++ b/indra/newview/llpanelplaceinfo.h
@@ -41,6 +41,7 @@
 #include "llremoteparcelrequest.h"
 
 class LLExpandableTextBox;
+class LLIconCtrl;
 class LLInventoryItem;
 class LLPanelPickEdit;
 class LLParcel;
@@ -117,6 +118,7 @@ class LLPanelPlaceInfo : public LLPanel, LLRemoteParcelInfoObserver
 	LLTextBox*				mRegionName;
 	LLTextBox*				mParcelName;
 	LLExpandableTextBox*	mDescEditor;
+	LLIconCtrl*				mMaturityRatingIcon;
 	LLTextBox*				mMaturityRatingText;
 };
 
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
index 2a9ba4697d6..61501cc1b1b 100644
--- a/indra/newview/llpanelplaceprofile.cpp
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -97,7 +97,6 @@ BOOL LLPanelPlaceProfile::postBuild()
 				setMouseDownCallback(boost::bind(&LLPanelPlaceProfile::onForSaleBannerClick, this));
 
 	mParcelOwner = getChild<LLTextBox>("owner_value");
-	mLastVisited = getChild<LLTextBox>("last_visited_value");
 
 	mParcelRatingIcon = getChild<LLIconCtrl>("rating_icon");
 	mParcelRatingText = getChild<LLTextBox>("rating_value");
@@ -165,7 +164,6 @@ void LLPanelPlaceProfile::resetLocation()
 
 	std::string not_available = getString("not_available");
 	mParcelOwner->setValue(not_available);
-	mLastVisited->setValue(not_available);
 
 	mParcelRatingIcon->setValue(not_available);
 	mParcelRatingText->setText(not_available);
@@ -209,17 +207,13 @@ void LLPanelPlaceProfile::resetLocation()
 void LLPanelPlaceProfile::setInfoType(INFO_TYPE type)
 {
 	bool is_info_type_agent = type == AGENT;
-	bool is_info_type_teleport_history = type == TELEPORT_HISTORY;
 
-	getChild<LLTextBox>("maturity_label")->setVisible(!is_info_type_agent);
+	mMaturityRatingIcon->setVisible(!is_info_type_agent);
 	mMaturityRatingText->setVisible(!is_info_type_agent);
 
 	getChild<LLTextBox>("owner_label")->setVisible(is_info_type_agent);
 	mParcelOwner->setVisible(is_info_type_agent);
 
-	getChild<LLTextBox>("last_visited_label")->setVisible(is_info_type_teleport_history);
-	mLastVisited->setVisible(is_info_type_teleport_history);
-
 	getChild<LLAccordionCtrl>("advanced_info_accordion")->setVisible(is_info_type_agent);
 
 	switch(type)
@@ -238,6 +232,30 @@ void LLPanelPlaceProfile::setInfoType(INFO_TYPE type)
 	LLPanelPlaceInfo::setInfoType(type);
 }
 
+// virtual
+void LLPanelPlaceProfile::processParcelInfo(const LLParcelData& parcel_data)
+{
+	LLPanelPlaceInfo::processParcelInfo(parcel_data);
+
+	// HACK: Flag 0x2 == adult region,
+	// Flag 0x1 == mature region, otherwise assume PG
+	if (parcel_data.flags & 0x2)
+	{
+		mMaturityRatingIcon->setValue(icon_r);
+		mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_ADULT));
+	}
+	else if (parcel_data.flags & 0x1)
+	{
+		mMaturityRatingIcon->setValue(icon_m);
+		mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_MATURE));
+	}
+	else
+	{
+		mMaturityRatingIcon->setValue(icon_pg);
+		mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_PG));
+	}
+}
+
 void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
 													LLViewerRegion* region,
 													const LLVector3d& pos_global,
@@ -521,22 +539,6 @@ void LLPanelPlaceProfile::updateCovenantText(const std::string &text)
 	mCovenantText->setText(text);
 }
 
-void LLPanelPlaceProfile::updateLastVisitedText(const LLDate &date)
-{
-	if (date.isNull())
-	{
-		mLastVisited->setText(getString("unknown"));
-	}
-	else
-	{
-		std::string timeStr = getString("acquired_date");
-		LLSD substitution;
-		substitution["datetime"] = (S32) date.secondsSinceEpoch();
-		LLStringUtil::format (timeStr, substitution);
-		mLastVisited->setText(timeStr);
-	}
-}
-
 void LLPanelPlaceProfile::onForSaleBannerClick()
 {
 	LLViewerParcelMgr* mgr = LLViewerParcelMgr::getInstance();
diff --git a/indra/newview/llpanelplaceprofile.h b/indra/newview/llpanelplaceprofile.h
index b3ef4acf511..8c30ca92fb8 100644
--- a/indra/newview/llpanelplaceprofile.h
+++ b/indra/newview/llpanelplaceprofile.h
@@ -50,6 +50,8 @@ class LLPanelPlaceProfile : public LLPanelPlaceInfo
 
 	/*virtual*/ void setInfoType(INFO_TYPE type);
 
+	/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
+
 	// Displays information about the currently selected parcel
 	// without sending a request to the server.
 	// If is_current_parcel true shows "You Are Here" banner.
@@ -61,7 +63,6 @@ class LLPanelPlaceProfile : public LLPanelPlaceInfo
 	void updateEstateName(const std::string& name);
 	void updateEstateOwnerName(const std::string& name);
 	void updateCovenantText(const std::string &text);
-	void updateLastVisitedText(const LLDate &date);
 
 private:
 	void onForSaleBannerClick();
@@ -78,7 +79,6 @@ class LLPanelPlaceProfile : public LLPanelPlaceInfo
 	LLPanel*			mYouAreHerePanel;
 
 	LLTextBox*			mParcelOwner;
-	LLTextBox*			mLastVisited;
 
 	LLIconCtrl*			mParcelRatingIcon;
 	LLTextBox*			mParcelRatingText;
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index 8d117afcfe0..3d0fba9426a 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -293,7 +293,6 @@ void LLPanelPlaces::onOpen(const LLSD& key)
 		mPosGlobal = hist_items[index].mGlobalPos;
 
 		mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY);
-		mPlaceProfile->updateLastVisitedText(hist_items[index].mDate);
 		mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
 	}
 
diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
index 0c24adfad59..b01ddbf75aa 100644
--- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
@@ -43,6 +43,16 @@
      name="acquired_date">
         [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
     </string>
+    <!-- Texture names for rating icons -->
+    <string
+     name="icon_PG"
+     value="parcel_drk_PG" />
+    <string
+     name="icon_M"
+     value="parcel_drk_M" />
+    <string
+     name="icon_R"
+     value="parcel_drk_R" />
     <button
      follows="top|right"
      height="23"
@@ -125,6 +135,24 @@
              top_pad="10"
              value="Du waltz die spritz"
              width="300" />
+            <icon
+             follows="top|left"
+             height="16"
+             image_name="unknown"
+             layout="topleft"
+             left="10"
+             name="maturity_icon"
+             top_pad="10"
+             width="18" />
+            <text
+             follows="right|top"
+             height="16"
+             layout="topleft"
+             left_pad="8"
+             name="maturity_value"
+             top_delta="0"
+             value="unknown"
+             width="268" />
             <panel
              follows="left|top|right"
              height="55"
diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml
index 65f150b33c6..14d138fe4c8 100644
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -296,6 +296,24 @@
              top_delta="0"
              value="Alex Superduperlongenamenton"
              width="205" />
+            <icon
+             follows="top|left"
+             height="16"
+             image_name="unknown"
+             layout="topleft"
+             left="10"
+             name="maturity_icon"
+             top_delta="0"
+             width="18" />
+            <text
+             follows="right|top"
+             height="16"
+             layout="topleft"
+             left_pad="8"
+             name="maturity_value"
+             top_delta="0"
+             value="unknown"
+             width="268" />
             <accordion
              follows="all"
              height="230"
-- 
GitLab


From c4a5030caa5951b6fe1e985eea234412e157cf68 Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Sat, 7 Nov 2009 18:01:38 +0200
Subject: [PATCH 017/557] Fix for low bug EXT-2248 "Redundant vertical
 scroll-bar in Place Profile panel".

--HG--
branch : product-engine
---
 .../default/xui/en/panel_place_profile.xml    | 409 +++++++++---------
 1 file changed, 199 insertions(+), 210 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml
index 14d138fe4c8..b5ae05fe6c3 100644
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -326,222 +326,211 @@
                  layout="topleft"
                  name="parcel_characteristics_tab"
                  title="Parcel">
-                    <scroll_container
-                     color="DkGray2"
+                    <panel
                      follows="all"
-                     height="132"
+                     height="160"
                      layout="topleft"
                      left="0"
-                     name="parcel_scroll"
-                     opaque="true"
                      top="0"
-                     width="290">
-                        <panel
-                         follows="all"
-                         height="165"
+                     width="275">
+                        <icon
+                         follows="top|left"
+                         height="16"
+                         image_name="parcel_drk_PG"
                          layout="topleft"
-                         left="0"
+                         left="20"
+                         name="rating_icon"
                          top="0"
-                         width="275">
-                            <icon
-                             follows="top|left"
-                             height="16"
-                             image_name="parcel_drk_PG"
-                             layout="topleft"
-                             left="20"
-                             name="rating_icon"
-                             top="0"
-                             width="18" />
-                            <text
-                             follows="left|top"
-                             height="16"
-                             layout="topleft"
-                             left_pad="8"
-                             name="rating_label"
-                             value="Rating:"
-                             width="80" />
-                            <text
-                             follows="right|top"
-                             height="16"
-                             layout="topleft"
-                             left_pad="0"
-                             name="rating_value"
-                             top_delta="0"
-                             value="unknown"
-                             width="120" />
-                            <icon
-                             follows="top|left"
-                             height="18"
-                             image_name="parcel_drk_Voice"
-                             layout="topleft"
-                             left="20"
-                             name="voice_icon"
-                             top_pad="5"
-                             width="22" />
-                            <text
-                             follows="left|top"
-                             height="18"
-                             layout="topleft"
-                             left_pad="8"
-                             name="voice_label"
-                             top_delta="0"
-                             value="Voice:"
-                             width="76" />
-                            <text
-                             follows="right|top"
-                             height="18"
-                             layout="topleft"
-                             left_pad="0"
-                             name="voice_value"
-                             top_delta="0"
-                             value="On"
-                             width="60" />
-                            <icon
-                             follows="top|left"
-                             height="18"
-                             image_name="parcel_drk_Fly"
-                             layout="topleft"
-                             left="20"
-                             name="fly_icon"
-                             top_pad="3"
-                             width="22" />
-                            <text
-                             follows="left|top"
-                             height="16"
-                             layout="topleft"
-                             left_pad="8"
-                             name="fly_label"
-                             value="Fly:"
-                             width="76" />
-                            <text
-                             follows="right|top"
-                             height="16"
-                             layout="topleft"
-                             left_pad="0"
-                             name="fly_value"
-                             top_delta="0"
-                             value="On"
-                             width="60" />
-                            <icon
-                             follows="top|left"
-                             height="18"
-                             image_name="parcel_drk_Push"
-                             layout="topleft"
-                             left="20"
-                             name="push_icon"
-                             top_pad="3"
-                             width="22" />
-                            <text
-                             follows="left|top"
-                             height="14"
-                             layout="topleft"
-                             left_pad="8"
-                             name="push_label"
-                             value="Push:"
-                             width="76" />
-                            <text
-                             follows="right|top"
-                             height="14"
-                             layout="topleft"
-                             left_pad="0"
-                             name="push_value"
-                             top_delta="0"
-                             value="Off"
-                             width="60" />
-                            <icon
-                             follows="top|left"
-                             height="18"
-                             image_name="parcel_drk_Build"
-                             layout="topleft"
-                             left="20"
-                             name="build_icon"
-                             top_pad="3"
-                             width="22" />
-                            <text
-                             follows="left|top"
-                             height="14"
-                             layout="topleft"
-                             left_pad="8"
-                             name="build_label"
-                             value="Build:"
-                             width="76" />
-                            <text
-                             follows="right|top"
-                             height="15"
-                             layout="topleft"
-                             left_pad="0"
-                             name="build_value"
-                             top_delta="0"
-                             value="On"
-                             width="60" />
-                            <icon
-                             follows="top|left"
-                             height="18"
-                             image_name="parcel_drk_Scripts"
-                             layout="topleft"
-                             left="20"
-                             name="scripts_icon"
-                             top_pad="3"
-                             width="22" />
-                            <text
-                             follows="left|top"
-                             height="14"
-                             layout="topleft"
-                             left_pad="8"
-                             name="scripts_label"
-                             value="Scripts:"
-                             width="76" />
-                            <text
-                             follows="right|top"
-                             height="14"
-                             layout="topleft"
-                             left_pad="0"
-                             name="scripts_value"
-                             top_delta="0"
-                             value="On"
-                             width="60" />
-                            <icon
-                             follows="top|left"
-                             height="18"
-                             image_name="parcel_drk_Damage"
-                             layout="topleft"
-                             left="20"
-                             name="damage_icon"
-                             top_pad="7"
-                             width="22" />
-                            <text
-                             follows="left|top"
-                             height="14"
-                             layout="topleft"
-                             left_pad="8"
-                             name="damage_label"
-                             value="Damage:"
-                             width="76" />
-                            <text
-                             follows="right|top"
-                             height="14"
-                             layout="topleft"
-                             left_pad="0"
-                             name="damage_value"
-                             top_delta="0"
-                             value="Off"
-                             width="60" />
-                            <button
-                             follows="bottom|right"
-                             height="19"
-                             label="About Land"
-                             layout="topleft"
-                             name="about_land_btn"
-                             right="-5"
-                             tab_stop="false"
-                             top="138"
-                             width="90">
-                                <click_callback
-                                 function="ShowFloater"
-                                 parameter="about_land" />
-                            </button>
-                        </panel>
-                    </scroll_container>
+                         width="18" />
+                        <text
+                         follows="left|top"
+                         height="16"
+                         layout="topleft"
+                         left_pad="8"
+                         name="rating_label"
+                         value="Rating:"
+                         width="80" />
+                        <text
+                         follows="right|top"
+                         height="16"
+                         layout="topleft"
+                         left_pad="0"
+                         name="rating_value"
+                         top_delta="0"
+                         value="unknown"
+                         width="120" />
+                        <icon
+                         follows="top|left"
+                         height="18"
+                         image_name="parcel_drk_Voice"
+                         layout="topleft"
+                         left="20"
+                         name="voice_icon"
+                         top_pad="5"
+                         width="22" />
+                        <text
+                         follows="left|top"
+                         height="18"
+                         layout="topleft"
+                         left_pad="8"
+                         name="voice_label"
+                         top_delta="0"
+                         value="Voice:"
+                         width="76" />
+                        <text
+                         follows="right|top"
+                         height="18"
+                         layout="topleft"
+                         left_pad="0"
+                         name="voice_value"
+                         top_delta="0"
+                         value="On"
+                         width="60" />
+                        <icon
+                         follows="top|left"
+                         height="18"
+                         image_name="parcel_drk_Fly"
+                         layout="topleft"
+                         left="20"
+                         name="fly_icon"
+                         top_pad="3"
+                         width="22" />
+                        <text
+                         follows="left|top"
+                         height="16"
+                         layout="topleft"
+                         left_pad="8"
+                         name="fly_label"
+                         value="Fly:"
+                         width="76" />
+                        <text
+                         follows="right|top"
+                         height="16"
+                         layout="topleft"
+                         left_pad="0"
+                         name="fly_value"
+                         top_delta="0"
+                         value="On"
+                         width="60" />
+                        <icon
+                         follows="top|left"
+                         height="18"
+                         image_name="parcel_drk_Push"
+                         layout="topleft"
+                         left="20"
+                         name="push_icon"
+                         top_pad="3"
+                         width="22" />
+                        <text
+                         follows="left|top"
+                         height="14"
+                         layout="topleft"
+                         left_pad="8"
+                         name="push_label"
+                         value="Push:"
+                         width="76" />
+                        <text
+                         follows="right|top"
+                         height="14"
+                         layout="topleft"
+                         left_pad="0"
+                         name="push_value"
+                         top_delta="0"
+                         value="Off"
+                         width="60" />
+                        <icon
+                         follows="top|left"
+                         height="18"
+                         image_name="parcel_drk_Build"
+                         layout="topleft"
+                         left="20"
+                         name="build_icon"
+                         top_pad="3"
+                         width="22" />
+                        <text
+                         follows="left|top"
+                         height="14"
+                         layout="topleft"
+                         left_pad="8"
+                         name="build_label"
+                         value="Build:"
+                         width="76" />
+                        <text
+                         follows="right|top"
+                         height="15"
+                         layout="topleft"
+                         left_pad="0"
+                         name="build_value"
+                         top_delta="0"
+                         value="On"
+                         width="60" />
+                        <icon
+                         follows="top|left"
+                         height="18"
+                         image_name="parcel_drk_Scripts"
+                         layout="topleft"
+                         left="20"
+                         name="scripts_icon"
+                         top_pad="3"
+                         width="22" />
+                        <text
+                         follows="left|top"
+                         height="14"
+                         layout="topleft"
+                         left_pad="8"
+                         name="scripts_label"
+                         value="Scripts:"
+                         width="76" />
+                        <text
+                         follows="right|top"
+                         height="14"
+                         layout="topleft"
+                         left_pad="0"
+                         name="scripts_value"
+                         top_delta="0"
+                         value="On"
+                         width="60" />
+                        <icon
+                         follows="top|left"
+                         height="18"
+                         image_name="parcel_drk_Damage"
+                         layout="topleft"
+                         left="20"
+                         name="damage_icon"
+                         top_pad="7"
+                         width="22" />
+                        <text
+                         follows="left|top"
+                         height="14"
+                         layout="topleft"
+                         left_pad="8"
+                         name="damage_label"
+                         value="Damage:"
+                         width="76" />
+                        <text
+                         follows="right|top"
+                         height="14"
+                         layout="topleft"
+                         left_pad="0"
+                         name="damage_value"
+                         top_delta="0"
+                         value="Off"
+                         width="60" />
+                        <button
+                         follows="bottom|right"
+                         height="19"
+                         label="About Land"
+                         layout="topleft"
+                         name="about_land_btn"
+                         right="-5"
+                         tab_stop="false"
+                         top="138"
+                         width="90">
+                            <click_callback
+                             function="ShowFloater"
+                             parameter="about_land" />
+                        </button>
+                    </panel>
                 </accordion_tab>
                 <accordion_tab
                  expanded="false"
-- 
GitLab


From b9bf48774899377ceee90d7e0538dc7dcbe86461 Mon Sep 17 00:00:00 2001
From: Denis Serdjuk <dserduk@productengine.com>
Date: Mon, 9 Nov 2009 13:17:37 +0200
Subject: [PATCH 018/557] fixed bug EXT-2016  Place Profile panel isn't resized

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_place_profile.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml
index b5ae05fe6c3..d3eb5482076 100644
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -172,7 +172,7 @@
      width="313">
         <panel
          bg_alpha_color="DkGray2"
-         follows="all"
+         follows="top|left|right"
          height="533"
          layout="topleft"
          left="0"
-- 
GitLab


From f2f57797482bb22c6aa857f7af6f65510573ffff Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Mon, 9 Nov 2009 13:55:55 +0200
Subject: [PATCH 019/557] Fixed low bug EXT-2319 - Unable to save new Pick.

--HG--
branch : product-engine
---
 indra/newview/llpanelpick.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp
index 103f0416865..726c47b6781 100644
--- a/indra/newview/llpanelpick.cpp
+++ b/indra/newview/llpanelpick.cpp
@@ -438,7 +438,8 @@ void LLPanelPickEdit::resetDirty()
 
 BOOL LLPanelPickEdit::isDirty() const
 {
-	if( LLPanelPickInfo::isDirty()
+	if( mNewPick
+		|| LLPanelPickInfo::isDirty()
 		|| mLocationChanged
 		|| mSnapshotCtrl->isDirty()
 		|| getChild<LLLineEditor>("pick_name")->isDirty()
-- 
GitLab


From cd328841106734938dd747e9a7fd2575cd6c1b85 Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Mon, 9 Nov 2009 14:44:56 +0200
Subject: [PATCH 020/557] Update for major task EXT-2250 Classifieds list in
 Picks panel. Fixed viewing classifieds of other avatars.

--HG--
branch : product-engine
---
 indra/newview/llavatarpropertiesprocessor.cpp |  8 ++++----
 indra/newview/llavatarpropertiesprocessor.h   |  4 ++--
 indra/newview/llpanelpicks.cpp                | 19 +++++++++++++------
 indra/newview/llpanelpicks.h                  |  8 +++++++-
 4 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp
index 98a6a4b92ad..2942e436efc 100644
--- a/indra/newview/llavatarpropertiesprocessor.cpp
+++ b/indra/newview/llavatarpropertiesprocessor.cpp
@@ -333,13 +333,13 @@ void LLAvatarPropertiesProcessor::processClassifiedInfoReply(LLMessageSystem* ms
 	msg->getString(_PREHASH_Data, _PREHASH_SimName, c_info.sim_name);
 	msg->getVector3d(_PREHASH_Data, _PREHASH_PosGlobal, c_info.pos_global);
 	msg->getString(_PREHASH_Data, _PREHASH_ParcelName, c_info.parcel_name);
-	msg->getU8(_PREHASH_Data, _PREHASH_ClassifiedFlags, c_info.classified_flags);
+	msg->getU8(_PREHASH_Data, _PREHASH_ClassifiedFlags, c_info.flags);
 	msg->getS32(_PREHASH_Data, _PREHASH_PriceForListing, c_info.price_for_listing);
 
 	LLAvatarPropertiesProcessor* self = getInstance();
 	// Request processed, no longer pending
-	self->removePendingRequest(c_info.agent_id, APT_CLASSIFIED_INFO);
-	self->notifyObservers(c_info.agent_id, &c_info, APT_CLASSIFIED_INFO);
+	self->removePendingRequest(c_info.creator_id, APT_CLASSIFIED_INFO);
+	self->notifyObservers(c_info.creator_id, &c_info, APT_CLASSIFIED_INFO);
 }
 
 
@@ -564,7 +564,7 @@ void LLAvatarPropertiesProcessor::sendPickInfoRequest(const LLUUID& creator_id,
 	send_generic_message("pickinforequest", request_params);
 }
 
-void LLAvatarPropertiesProcessor::sendClassifiedInfoRequest(const LLUUID& avatar_id, const LLUUID& classified_id)
+void LLAvatarPropertiesProcessor::sendClassifiedInfoRequest(const LLUUID& classified_id)
 {
 	LLMessageSystem* msg = gMessageSystem;
 
diff --git a/indra/newview/llavatarpropertiesprocessor.h b/indra/newview/llavatarpropertiesprocessor.h
index 3c6b4e17d9d..64964b16655 100644
--- a/indra/newview/llavatarpropertiesprocessor.h
+++ b/indra/newview/llavatarpropertiesprocessor.h
@@ -171,7 +171,7 @@ struct LLAvatarClassifiedInfo
 	std::string sim_name;
 	LLVector3d pos_global;
 	std::string parcel_name;
-	U8 classified_flags;
+	U8 flags;
 	S32 price_for_listing;
 };
 
@@ -206,7 +206,7 @@ class LLAvatarPropertiesProcessor
 	// Duplicate pick info requests are not suppressed.
 	void sendPickInfoRequest(const LLUUID& creator_id, const LLUUID& pick_id);
 
-	void sendClassifiedInfoRequest(const LLUUID& avatar_id, const LLUUID& classified_id);
+	void sendClassifiedInfoRequest(const LLUUID& classified_id);
 
 	void sendAvatarPropertiesUpdate(const LLAvatarData* avatar_props);
 
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 88c1d17a025..78f8152b101 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -175,7 +175,7 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
 
 				LLClassifiedItem* c_item = new LLClassifiedItem(getAvatarId(), c_data.classified_id);
 				c_item->childSetAction("info_chevron", boost::bind(&LLPanelPicks::onClickInfo, this));
-				c_item->setName(c_data.name);
+				c_item->setClassifiedName(c_data.name);
 
 				LLSD pick_value = LLSD();
 				pick_value.insert(CLASSIFIED_ID, c_data.classified_id);
@@ -364,6 +364,9 @@ void LLPanelPicks::onOpen(const LLSD& key)
 
 	if(getAvatarId() != id)
 	{
+		showAccordion("tab_picks", false);
+		showAccordion("tab_classifieds", false);
+
 		mPicksList->goToTop();
 		// Set dummy value to make panel dirty and make it reload picks
 		setValue(LLSD());
@@ -856,7 +859,7 @@ LLClassifiedItem::LLClassifiedItem(const LLUUID& avatar_id, const LLUUID& classi
 	LLUICtrlFactory::getInstance()->buildPanel(this,"panel_classifieds_list_item.xml");
 
 	LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(), this);
-	LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(getAvatarId(), getClassifiedId());
+	LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(getClassifiedId());
 }
 
 LLClassifiedItem::~LLClassifiedItem()
@@ -872,13 +875,12 @@ void LLClassifiedItem::processProperties(void* data, EAvatarProcessorType type)
 	}
 
 	LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data);
-	if( !(c_info && c_info->agent_id == getAvatarId() 
-		&& c_info->classified_id == getClassifiedId()) )
+	if( !c_info || c_info->classified_id != getClassifiedId() )
 	{
 		return;
 	}
 
-	setName(c_info->name);
+	setClassifiedName(c_info->name);
 	setDescription(c_info->description);
 	setSnapshotId(c_info->snapshot_id);
 	setPosGlobal(c_info->pos_global);
@@ -900,7 +902,7 @@ void LLClassifiedItem::setValue(const LLSD& value)
 	childSetVisible("selected_icon", value["selected"]);
 }
 
-void LLClassifiedItem::setName(const std::string& name)
+void LLClassifiedItem::setClassifiedName(const std::string& name)
 {
 	childSetValue("name", name);
 }
@@ -915,4 +917,9 @@ void LLClassifiedItem::setSnapshotId(const LLUUID& snapshot_id)
 	childSetValue("picture", snapshot_id);
 }
 
+LLUUID LLClassifiedItem::getSnapshotId()
+{
+	return childGetValue("picture");
+}
+
 //EOF
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index ef7ba9e7006..daf8059feea 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -237,12 +237,18 @@ class LLClassifiedItem : public LLPanel, public LLAvatarPropertiesObserver
 
 	const LLVector3d& getPosGlobal() { return mPosGlobal; }
 
-	void setName (const std::string& name);
+	void setClassifiedName (const std::string& name);
+
+	std::string getClassifiedName() { return childGetValue("name").asString(); }
 
 	void setDescription(const std::string& desc);
 
+	std::string getDescription() { return childGetValue("description").asString(); }
+
 	void setSnapshotId(const LLUUID& snapshot_id);
 
+	LLUUID getSnapshotId();
+
 private:
 	LLUUID mAvatarId;
 	LLUUID mClassifiedId;
-- 
GitLab


From 0f1c5aebd5c68bcaefdcc26b9050fa19c7444d06 Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Mon, 9 Nov 2009 15:02:16 +0200
Subject: [PATCH 021/557] Implemented low task EXT-1155 (Implement option to
 sort the nearby people list by distance and most recent speakers)

--HG--
branch : product-engine
---
 indra/newview/llpanelpeople.cpp               | 120 +++++++++++++++++-
 indra/newview/llpanelpeople.h                 |   3 +
 .../xui/en/menu_people_nearby_view_sort.xml   |  39 ++++--
 3 files changed, 148 insertions(+), 14 deletions(-)

diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index bb6cdd2f78e..b08eb27b9fb 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -60,6 +60,7 @@
 #include "llviewermenu.h"			// for gMenuHolder
 #include "llvoiceclient.h"
 #include "llworld.h"
+#include "llspeakers.h"
 
 #define FRIEND_LIST_UPDATE_TIMEOUT	0.5
 #define NEARBY_LIST_UPDATE_INTERVAL 1
@@ -119,8 +120,84 @@ class LLAvatarItemStatusComparator : public LLAvatarItemComparator
 	}
 };
 
+/** Compares avatar items by distance between you and them */
+class LLAvatarItemDistanceComparator : public LLAvatarItemComparator
+{
+public:
+	typedef std::map < LLUUID, LLVector3d > id_to_pos_map_t;
+	LLAvatarItemDistanceComparator() {};
+
+	void updateAvatarsPositions(std::vector<LLVector3d>& positions, std::vector<LLUUID>& uuids)
+	{
+		std::vector<LLVector3d>::const_iterator
+			pos_it = positions.begin(),
+			pos_end = positions.end();
+
+		std::vector<LLUUID>::const_iterator
+			id_it = uuids.begin(),
+			id_end = uuids.end();
+
+		LLAvatarItemDistanceComparator::id_to_pos_map_t pos_map;
+
+		mAvatarsPositions.clear();
+
+		for (;pos_it != pos_end && id_it != id_end; ++pos_it, ++id_it )
+		{
+			mAvatarsPositions[*id_it] = *pos_it;
+		}
+	};
+
+protected:
+	virtual bool doCompare(const LLAvatarListItem* item1, const LLAvatarListItem* item2) const
+	{
+		const LLVector3d& me_pos = gAgent.getPositionGlobal();
+		const LLVector3d& item1_pos = mAvatarsPositions.find(item1->getAvatarId())->second;
+		const LLVector3d& item2_pos = mAvatarsPositions.find(item2->getAvatarId())->second;
+		F32 dist1 = dist_vec(item1_pos, me_pos);
+		F32 dist2 = dist_vec(item2_pos, me_pos);
+		return dist1 < dist2;
+	}
+private:
+	id_to_pos_map_t mAvatarsPositions;
+};
+
+/** Comparator for comparing nearby avatar items by last spoken time */
+class LLAvatarItemRecentSpeakerComparator : public  LLAvatarItemNameComparator
+{
+public:
+	LLAvatarItemRecentSpeakerComparator() {};
+	virtual ~LLAvatarItemRecentSpeakerComparator() {};
+
+protected:
+	virtual bool doCompare(const LLAvatarListItem* item1, const LLAvatarListItem* item2) const
+	{
+		LLPointer<LLSpeaker> lhs = LLLocalSpeakerMgr::instance().findSpeaker(item1->getAvatarId());
+		LLPointer<LLSpeaker> rhs = LLLocalSpeakerMgr::instance().findSpeaker(item2->getAvatarId());
+		if ( lhs.notNull() && rhs.notNull() )
+		{
+			// Compare by last speaking time
+			if( lhs->mLastSpokeTime != rhs->mLastSpokeTime )
+				return ( lhs->mLastSpokeTime > rhs->mLastSpokeTime );
+		}
+		else if ( lhs.notNull() )
+		{
+			// True if only item1 speaker info available
+			return true;
+		}
+		else if ( rhs.notNull() )
+		{
+			// False if only item2 speaker info available
+			return false;
+		}
+		// By default compare by name.
+		return LLAvatarItemNameComparator::doCompare(item1, item2);
+	}
+};
+
 static const LLAvatarItemRecentComparator RECENT_COMPARATOR;
 static const LLAvatarItemStatusComparator STATUS_COMPARATOR;
+static LLAvatarItemDistanceComparator DISTANCE_COMPARATOR;
+static const LLAvatarItemRecentSpeakerComparator RECENT_SPEAKER_COMPARATOR;
 
 static LLRegisterPanelClassWrapper<LLPanelPeople> t_people("panel_people");
 
@@ -434,6 +511,7 @@ BOOL LLPanelPeople::postBuild()
 
 	setSortOrder(mRecentList,		(ESortOrder)gSavedSettings.getU32("RecentPeopleSortOrder"),	false);
 	setSortOrder(mAllFriendList,	(ESortOrder)gSavedSettings.getU32("FriendsSortOrder"),		false);
+	setSortOrder(mNearbyList,		(ESortOrder)gSavedSettings.getU32("NearbyPeopleSortOrder"),	false);
 
 	LLPanel* groups_panel = getChild<LLPanel>(GROUP_TAB_NAME);
 	groups_panel->childSetAction("activate_btn", boost::bind(&LLPanelPeople::onActivateButtonClicked,	this));
@@ -494,7 +572,8 @@ BOOL LLPanelPeople::postBuild()
 
 	enable_registrar.add("People.Friends.ViewSort.CheckItem",	boost::bind(&LLPanelPeople::onFriendsViewSortMenuItemCheck,	this, _2));
 	enable_registrar.add("People.Recent.ViewSort.CheckItem",	boost::bind(&LLPanelPeople::onRecentViewSortMenuItemCheck,	this, _2));
-	
+	enable_registrar.add("People.Nearby.ViewSort.CheckItem",	boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemCheck,	this, _2));
+
 	LLMenuGL* plus_menu  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_group_plus.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 	mGroupPlusMenuHandle  = plus_menu->getHandle();
 
@@ -573,8 +652,13 @@ void LLPanelPeople::updateNearbyList()
 	if (!mNearbyList)
 		return;
 
-	LLWorld::getInstance()->getAvatars(&mNearbyList->getIDs(), NULL, gAgent.getPositionGlobal(), gSavedSettings.getF32("NearMeRange"));
+	std::vector<LLVector3d> positions;
+
+	LLWorld::getInstance()->getAvatars(&mNearbyList->getIDs(), &positions, gAgent.getPositionGlobal(), gSavedSettings.getF32("NearMeRange"));
 	mNearbyList->setDirty();
+
+	DISTANCE_COMPARATOR.updateAvatarsPositions(positions, mNearbyList->getIDs());
+	LLLocalSpeakerMgr::instance().update(TRUE);
 }
 
 void LLPanelPeople::updateRecentList()
@@ -760,6 +844,14 @@ void LLPanelPeople::setSortOrder(LLAvatarList* list, ESortOrder order, bool save
 		list->setComparator(&RECENT_COMPARATOR);
 		list->sort();
 		break;
+	case E_SORT_BY_RECENT_SPEAKERS:
+		list->setComparator(&RECENT_SPEAKER_COMPARATOR);
+		list->sort();
+		break;
+	case E_SORT_BY_DISTANCE:
+		list->setComparator(&DISTANCE_COMPARATOR);
+		list->sort();
+		break;
 	default:
 		llwarns << "Unrecognized people sort order for " << list->getName() << llendl;
 		return;
@@ -774,7 +866,7 @@ void LLPanelPeople::setSortOrder(LLAvatarList* list, ESortOrder order, bool save
 		else if (list == mRecentList)
 			setting = "RecentPeopleSortOrder";
 		else if (list == mNearbyList)
-			setting = "NearbyPeopleSortOrder"; // *TODO: unused by current implementation
+			setting = "NearbyPeopleSortOrder";
 
 		if (!setting.empty())
 			gSavedSettings.setU32(setting, order);
@@ -1010,12 +1102,13 @@ void LLPanelPeople::onNearbyViewSortMenuItemClicked(const LLSD& userdata)
 {
 	std::string chosen_item = userdata.asString();
 
-	if (chosen_item == "sort_recent")
+	if (chosen_item == "sort_by_recent_speakers")
 	{
+		setSortOrder(mNearbyList, E_SORT_BY_RECENT_SPEAKERS);
 	}
 	else if (chosen_item == "sort_name")
 	{
-		mNearbyList->sortByName();
+		setSortOrder(mNearbyList, E_SORT_BY_NAME);
 	}
 	else if (chosen_item == "view_icons")
 	{
@@ -1023,8 +1116,25 @@ void LLPanelPeople::onNearbyViewSortMenuItemClicked(const LLSD& userdata)
 	}
 	else if (chosen_item == "sort_distance")
 	{
+		setSortOrder(mNearbyList, E_SORT_BY_DISTANCE);
 	}
 }
+
+bool LLPanelPeople::onNearbyViewSortMenuItemCheck(const LLSD& userdata)
+{
+	std::string item = userdata.asString();
+	U32 sort_order = gSavedSettings.getU32("NearbyPeopleSortOrder");
+
+	if (item == "sort_by_recent_speakers")
+		return sort_order == E_SORT_BY_RECENT_SPEAKERS;
+	if (item == "sort_name")
+		return sort_order == E_SORT_BY_NAME;
+	if (item == "sort_distance")
+		return sort_order == E_SORT_BY_DISTANCE;
+
+	return false;
+}
+
 void LLPanelPeople::onRecentViewSortMenuItemClicked(const LLSD& userdata)
 {
 	std::string chosen_item = userdata.asString();
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index 9bf9befe906..faed573eca3 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -62,6 +62,8 @@ class LLPanelPeople : public LLPanel
 		E_SORT_BY_NAME = 0,
 		E_SORT_BY_STATUS = 1,
 		E_SORT_BY_MOST_RECENT = 2,
+		E_SORT_BY_DISTANCE = 3,
+		E_SORT_BY_RECENT_SPEAKERS = 4,
 	} ESortOrder;
 
 	// methods indirectly called by the updaters
@@ -115,6 +117,7 @@ class LLPanelPeople : public LLPanel
 
 	bool					onFriendsViewSortMenuItemCheck(const LLSD& userdata);
 	bool					onRecentViewSortMenuItemCheck(const LLSD& userdata);
+	bool					onNearbyViewSortMenuItemCheck(const LLSD& userdata);
 
 	// misc callbacks
 	static void				onAvatarPicked(
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
index c002cd078f7..39f9e486093 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
@@ -2,15 +2,36 @@
 <menu name="menu_group_plus"
      left="0" bottom="0" visible="false"
      mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
-  <menu_item_call name="sort_recent" label="Sort by Recent Speakers">
-    <menu_item_call.on_click function="People.Nearby.ViewSort.Action" userdata="sort_recent" />
-  </menu_item_call>
-  <menu_item_call name="sort_name" label="Sort by Name">
-    <menu_item_call.on_click function="People.Nearby.ViewSort.Action" userdata="sort_name" />
-  </menu_item_call>
-  <menu_item_call name="sort_distance" label="Sort by Distance">
-    <menu_item_call.on_click function="People.Nearby.ViewSort.Action" userdata="sort_distance" />
-  </menu_item_call>
+  <menu_item_check
+     label="Sort by Recent Speakers"
+     name="sort_by_recent_speakers">
+    <menu_item_check.on_click
+       function="People.Nearby.ViewSort.Action"
+       parameter="sort_by_recent_speakers"/>
+    <menu_item_check.on_check
+       function="People.Nearby.ViewSort.CheckItem"
+       parameter="sort_by_recent_speakers"/>
+  </menu_item_check>
+  <menu_item_check
+     label="Sort by Name"
+     name="sort_name">
+    <menu_item_check.on_click
+       function="People.Nearby.ViewSort.Action"
+       parameter="sort_name"/>
+    <menu_item_check.on_check
+       function="People.Nearby.ViewSort.CheckItem"
+       parameter="sort_name"/>
+  </menu_item_check>
+  <menu_item_check
+     label="Sort by Distance"
+     name="sort_distance">
+    <menu_item_check.on_click
+       function="People.Nearby.ViewSort.Action"
+       parameter="sort_distance"/>
+    <menu_item_check.on_check
+       function="People.Nearby.ViewSort.CheckItem"
+       parameter="sort_distance"/>
+  </menu_item_check>
   <menu_item_separator layout="topleft" />
   <menu_item_check name="view_icons" label="View People Icons">
     <menu_item_check.on_click
-- 
GitLab


From b72c3f3d08326870e1a3d6444d2dcccb57ec4e3d Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Mon, 9 Nov 2009 15:43:50 +0200
Subject: [PATCH 022/557] Fixed normal bug EXT-2252 ([BSI] "Set to current
 location" button on Edit Pick panel has no effect)

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_edit_pick.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
index f4a212ba0a6..d6de5af32d3 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
@@ -53,7 +53,7 @@
      layout="topleft"
      top="0"
      background_visible="false"
-     height="470"
+     height="510"
      left="0"
      width="295">
     <texture_picker
-- 
GitLab


From 148a29ea1ec97922180ca8f0f6ced9a4a9e05c07 Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Mon, 9 Nov 2009 15:54:54 +0200
Subject: [PATCH 023/557] Implemented major task EXT-2251 - Implement panels
 for creating, editing and viewing Classifieds.

--HG--
branch : product-engine
---
 indra/newview/llavatarpropertiesprocessor.cpp |  30 ++
 indra/newview/llavatarpropertiesprocessor.h   |   2 +
 indra/newview/llpanelclassified.cpp           | 490 ++++++++++++++++++
 indra/newview/llpanelclassified.h             | 126 +++++
 indra/newview/llpanelpicks.cpp                | 143 ++++-
 indra/newview/llpanelpicks.h                  |  10 +-
 indra/newview/llpanelprofile.cpp              |   5 +
 .../default/xui/en/panel_classified_info.xml  | 175 +++++++
 .../default/xui/en/panel_edit_classified.xml  | 251 +++++++++
 9 files changed, 1226 insertions(+), 6 deletions(-)
 create mode 100644 indra/newview/skins/default/xui/en/panel_classified_info.xml
 create mode 100644 indra/newview/skins/default/xui/en/panel_edit_classified.xml

diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp
index 2942e436efc..7cda2d31e66 100644
--- a/indra/newview/llavatarpropertiesprocessor.cpp
+++ b/indra/newview/llavatarpropertiesprocessor.cpp
@@ -554,6 +554,36 @@ void LLAvatarPropertiesProcessor::sendPickInfoUpdate(const LLPickData* new_pick)
 	LLAgentPicksInfo::getInstance()->requestNumberOfPicks();
 }
 
+void LLAvatarPropertiesProcessor::sendClassifiedInfoUpdate(const LLAvatarClassifiedInfo* c_data)
+{
+	if(!c_data)
+	{
+		return;
+	}
+
+	LLMessageSystem* msg = gMessageSystem;
+
+	msg->newMessage(_PREHASH_ClassifiedInfoUpdate);
+
+	msg->nextBlock(_PREHASH_AgentData);
+	msg->addUUID(_PREHASH_AgentID, gAgent.getID());
+	msg->addUUID(_PREHASH_SessionID, gAgent.getSessionID());
+
+	msg->nextBlock(_PREHASH_Data);
+	msg->addUUID(_PREHASH_ClassifiedID, c_data->classified_id);
+	msg->addU32(_PREHASH_Category, c_data->category);
+	msg->addString(_PREHASH_Name, c_data->name);
+	msg->addString(_PREHASH_Desc, c_data->description);
+	msg->addUUID(_PREHASH_ParcelID, c_data->parcel_id);
+	msg->addU32(_PREHASH_ParentEstate, 0);
+	msg->addUUID(_PREHASH_SnapshotID, c_data->snapshot_id);
+	msg->addVector3d(_PREHASH_PosGlobal, c_data->pos_global);
+	msg->addU8(_PREHASH_ClassifiedFlags, c_data->flags);
+	msg->addS32(_PREHASH_PriceForListing, c_data->price_for_listing);
+
+	gAgent.sendReliableMessage();
+}
+
 void LLAvatarPropertiesProcessor::sendPickInfoRequest(const LLUUID& creator_id, const LLUUID& pick_id)
 {
 	// Must ask for a pick based on the creator id because
diff --git a/indra/newview/llavatarpropertiesprocessor.h b/indra/newview/llavatarpropertiesprocessor.h
index 64964b16655..716c1b80658 100644
--- a/indra/newview/llavatarpropertiesprocessor.h
+++ b/indra/newview/llavatarpropertiesprocessor.h
@@ -212,6 +212,8 @@ class LLAvatarPropertiesProcessor
 
 	void sendPickInfoUpdate(const LLPickData* new_pick);
 
+	void sendClassifiedInfoUpdate(const LLAvatarClassifiedInfo* c_data);
+
 	void sendFriendRights(const LLUUID& avatar_id, S32 rights);
 
 	void sendNotes(const LLUUID& avatar_id, const std::string notes);
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index a29c9752e6d..b118c6813cb 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -1142,3 +1142,493 @@ void LLPanelClassified::setDefaultAccessCombo()
 			break;
 	}
 }
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+
+std::string SET_LOCATION_NOTICE1("(will update after save)");
+
+LLPanelClassifiedInfo::LLPanelClassifiedInfo()
+ : LLPanel()
+{
+}
+
+LLPanelClassifiedInfo::~LLPanelClassifiedInfo()
+{
+}
+
+// static
+LLPanelClassifiedInfo* LLPanelClassifiedInfo::create()
+{
+	LLPanelClassifiedInfo* panel = new LLPanelClassifiedInfo();
+	LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_classified_info.xml");
+	return panel;
+}
+
+BOOL LLPanelClassifiedInfo::postBuild()
+{
+	childSetAction("back_btn", boost::bind(&LLPanelClassifiedInfo::onExit, this), NULL);
+
+	return TRUE;
+}
+
+void LLPanelClassifiedInfo::setExitCallback(const commit_callback_t& cb)
+{
+	getChild<LLButton>("back_btn")->setClickedCallback(cb);
+}
+
+void LLPanelClassifiedInfo::onOpen(const LLSD& key)
+{
+	LLUUID avatar_id = key["avatar_id"];
+	if(avatar_id.isNull())
+	{
+		return;
+	}
+
+	if(getAvatarId().notNull())
+	{
+		LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this);
+	}
+
+	setAvatarId(avatar_id);
+
+	resetData();
+	resetControls();
+
+	setClassifiedId(key["classified_id"]);
+	setClassifiedName(key["name"]);
+	setDescription(key["desc"]);
+	setSnapshotId(key["snapshot_id"]);
+
+	LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(), this);
+	LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(getClassifiedId());
+}
+
+void LLPanelClassifiedInfo::processProperties(void* data, EAvatarProcessorType type)
+{
+	if(APT_CLASSIFIED_INFO == type)
+	{
+		LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data);
+		if(data && getClassifiedId() == c_info->classified_id)
+		{
+			setClassifiedName(c_info->name);
+			setDescription(c_info->description);
+			setSnapshotId(c_info->snapshot_id);
+			setClassifiedLocation(createLocationText(c_info->parcel_name, c_info->sim_name, c_info->pos_global));
+			childSetValue("category", LLClassifiedInfo::sCategories[c_info->category]);
+
+			bool mature = is_cf_mature(c_info->flags);
+			childSetValue("content_type", mature ? "Mature" : "PG Content");
+			childSetValue("auto_renew", is_cf_auto_renew(c_info->flags));
+
+			childSetTextArg("price_for_listing", "[PRICE]", llformat("%d", c_info->price_for_listing));
+		}
+	}
+}
+
+void LLPanelClassifiedInfo::resetData()
+{
+	setClassifiedName(LLStringUtil::null);
+	setDescription(LLStringUtil::null);
+	setClassifiedLocation(LLStringUtil::null);
+	setClassifiedId(LLUUID::null);
+	setSnapshotId(LLUUID::null);
+	mPosGlobal.clearVec();
+}
+
+void LLPanelClassifiedInfo::resetControls()
+{
+	if(getAvatarId() == gAgent.getID())
+	{
+		childSetEnabled("edit_btn", TRUE);
+		childSetVisible("edit_btn", TRUE);
+	}
+	else
+	{
+		childSetEnabled("edit_btn", FALSE);
+		childSetVisible("edit_btn", FALSE);
+	}
+}
+
+void LLPanelClassifiedInfo::setClassifiedName(const std::string& name)
+{
+	childSetValue("classified_name", name);
+}
+
+std::string LLPanelClassifiedInfo::getClassifiedName()
+{
+	return childGetValue("classified_name").asString();
+}
+
+void LLPanelClassifiedInfo::setDescription(const std::string& desc)
+{
+	childSetValue("classified_desc", desc);
+}
+
+std::string LLPanelClassifiedInfo::getDescription()
+{
+	return childGetValue("classified_desc").asString();
+}
+
+void LLPanelClassifiedInfo::setClassifiedLocation(const std::string& location)
+{
+	childSetValue("classified_location", location);
+}
+
+void LLPanelClassifiedInfo::setSnapshotId(const LLUUID& id)
+{
+	childSetValue("classified_snapshot", id);
+}
+
+LLUUID LLPanelClassifiedInfo::getSnapshotId()
+{
+	return childGetValue("classified_snapshot").asUUID();
+}
+
+// static
+std::string LLPanelClassifiedInfo::createLocationText(
+	const std::string& original_name, 
+	const std::string& sim_name, 
+	const LLVector3d& pos_global)
+{
+	std::string location_text;
+	
+	location_text.append(original_name);
+
+	if (!sim_name.empty())
+	{
+		if (!location_text.empty()) 
+			location_text.append(", ");
+		location_text.append(sim_name);
+	}
+
+	if (!location_text.empty()) 
+		location_text.append(" ");
+
+	if (!pos_global.isNull())
+	{
+		S32 region_x = llround((F32)pos_global.mdV[VX]) % REGION_WIDTH_UNITS;
+		S32 region_y = llround((F32)pos_global.mdV[VY]) % REGION_WIDTH_UNITS;
+		S32 region_z = llround((F32)pos_global.mdV[VZ]);
+		location_text.append(llformat(" (%d, %d, %d)", region_x, region_y, region_z));
+	}
+
+	return location_text;
+}
+
+void LLPanelClassifiedInfo::onExit()
+{
+	LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this);
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLPanelClassifiedEdit::LLPanelClassifiedEdit()
+ : LLPanelClassifiedInfo()
+ , mSnapshotCtrl(NULL)
+ , mNewClassified(false)
+{
+}
+
+LLPanelClassifiedEdit::~LLPanelClassifiedEdit()
+{
+}
+
+//static
+LLPanelClassifiedEdit* LLPanelClassifiedEdit::create()
+{
+	LLPanelClassifiedEdit* panel = new LLPanelClassifiedEdit();
+	LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_edit_classified.xml");
+	return panel;
+}
+
+BOOL LLPanelClassifiedEdit::postBuild()
+{
+	LLPanelClassifiedInfo::postBuild();
+
+	mSnapshotCtrl = getChild<LLTextureCtrl>("classified_snapshot");
+	mSnapshotCtrl->setOnSelectCallback(boost::bind(&LLPanelClassifiedEdit::onSnapshotChanged, this, _1));
+
+	LLLineEditor* line_edit = getChild<LLLineEditor>("classified_name");
+	line_edit->setKeystrokeCallback(boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this), NULL);
+
+	LLTextEditor* text_edit = getChild<LLTextEditor>("classified_desc");
+	text_edit->setKeystrokeCallback(boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this));
+
+	LLComboBox* combobox = getChild<LLComboBox>( "category");
+	LLClassifiedInfo::cat_map::iterator iter;
+	for (iter = LLClassifiedInfo::sCategories.begin();
+		iter != LLClassifiedInfo::sCategories.end();
+		iter++)
+	{
+		combobox->add(LLTrans::getString(iter->second), (void *)((intptr_t)iter->first), ADD_BOTTOM);
+	}
+	
+	combobox->setCurrentByIndex(0);
+	combobox->setCommitCallback(boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this));
+
+	combobox = getChild<LLComboBox>("content_type");
+	combobox->setCommitCallback(boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this));
+
+	childSetCommitCallback("price_for_listing", boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this), NULL);
+	childSetCommitCallback("auto_renew", boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this), NULL);
+
+	childSetAction("save_changes_btn", boost::bind(&LLPanelClassifiedEdit::onClickSave, this));
+	childSetAction("set_to_curr_location_btn", boost::bind(&LLPanelClassifiedEdit::onClickSetLocation, this));
+
+	return TRUE;
+}
+
+void LLPanelClassifiedEdit::onOpen(const LLSD& key)
+{
+	LLUUID classified_id = key["classified_id"];
+
+	if(classified_id.isNull())
+	{
+		mNewClassified = true;
+		setAvatarId(gAgent.getID());
+
+		resetData();
+		resetControls();
+
+		setPosGlobal(gAgent.getPositionGlobal());
+
+		LLUUID snapshot_id = LLUUID::null;
+		std::string desc;
+		LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+
+		if(parcel)
+		{
+			desc = parcel->getDesc();
+			snapshot_id = parcel->getSnapshotID();
+		}
+
+		std::string region_name = LLTrans::getString("ClassifiedUpdateAfterPublish");
+		LLViewerRegion* region = gAgent.getRegion();
+		if (region)
+		{
+			region_name = region->getName();
+		}
+
+		childSetValue("classified_name", makeClassifiedName());
+		childSetValue("classified_desc", desc);
+		setSnapshotId(snapshot_id);
+		setClassifiedLocation(createLocationText(region_name, LLStringUtil::null, getPosGlobal()));
+		setParcelId(LLUUID::null);
+
+		enableSaveButton(true);
+	}
+	else
+	{
+		mNewClassified = false;
+
+		LLPanelClassifiedInfo::onOpen(key);
+		enableSaveButton(false);
+	}
+
+	resetDirty();
+}
+
+void LLPanelClassifiedEdit::processProperties(void* data, EAvatarProcessorType type)
+{
+	if(APT_CLASSIFIED_INFO == type)
+	{
+		LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data);
+		if(data && getClassifiedId() == c_info->classified_id)
+		{
+			setClassifiedName(c_info->name);
+			setDescription(c_info->description);
+			setSnapshotId(c_info->snapshot_id);
+			setClassifiedLocation(createLocationText(c_info->parcel_name, c_info->sim_name, c_info->pos_global));
+			getChild<LLComboBox>("category")->setCurrentByIndex(c_info->category + 1);
+			getChild<LLComboBox>("category")->resetDirty();
+
+			bool mature = is_cf_mature(c_info->flags);
+			bool auto_renew = is_cf_auto_renew(c_info->flags);
+
+			getChild<LLComboBox>("content_type")->setCurrentByIndex(mature ? 0 : 1);
+			childSetValue("auto_renew", auto_renew);
+			childSetValue("price_for_listing", c_info->price_for_listing);
+
+			resetDirty();
+		}
+	}
+}
+
+BOOL LLPanelClassifiedEdit::isDirty() const
+{
+	if(mNewClassified)
+		return TRUE;
+
+	BOOL dirty = false;
+
+	dirty |= LLPanelClassifiedInfo::isDirty();
+	dirty |= mSnapshotCtrl->isDirty();
+	dirty |= getChild<LLLineEditor>("classified_name")->isDirty();
+	dirty |= getChild<LLTextEditor>("classified_desc")->isDirty();
+	dirty |= getChild<LLComboBox>("category")->isDirty();
+	dirty |= getChild<LLComboBox>("content_type")->isDirty();
+	dirty |= getChild<LLUICtrl>("auto_renew")->isDirty();
+	dirty |= getChild<LLUICtrl>("price_for_listing")->isDirty();
+
+	return dirty;
+}
+
+void LLPanelClassifiedEdit::resetDirty()
+{
+	LLPanelClassifiedInfo::resetDirty();
+	mSnapshotCtrl->resetDirty();
+	getChild<LLUICtrl>("classified_name")->resetDirty();
+	getChild<LLUICtrl>("classified_desc")->resetDirty();
+	getChild<LLUICtrl>("category")->resetDirty();
+	getChild<LLUICtrl>("content_type")->resetDirty();
+	getChild<LLUICtrl>("auto_renew")->resetDirty();
+	getChild<LLUICtrl>("price_for_listing")->resetDirty();
+}
+
+void LLPanelClassifiedEdit::setSaveCallback(const commit_callback_t& cb)
+{
+	getChild<LLButton>("save_changes_btn")->setClickedCallback(cb);
+}
+
+void LLPanelClassifiedEdit::setCancelCallback(const commit_callback_t& cb)
+{
+	getChild<LLButton>("cancel_btn")->setClickedCallback(cb);
+}
+
+void LLPanelClassifiedEdit::resetControls()
+{
+	LLPanelClassifiedInfo::resetControls();
+
+	getChild<LLComboBox>("category")->setCurrentByIndex(0);
+	getChild<LLComboBox>("content_type")->setCurrentByIndex(0);
+	childSetValue("auto_renew", false);
+	childSetValue("price_for_listing", MINIMUM_PRICE_FOR_LISTING);
+}
+
+void LLPanelClassifiedEdit::sendUpdate()
+{
+	LLAvatarClassifiedInfo c_data;
+
+	if(getClassifiedId().isNull())
+	{
+		LLUUID id = getClassifiedId();
+		id.generate();
+		setClassifiedId(id);
+	}
+
+	c_data.agent_id = gAgent.getID();
+	c_data.classified_id = getClassifiedId();
+	c_data.category = getCategory();
+	c_data.name = getClassifiedName();
+	c_data.description = getDescription();
+	c_data.parcel_id = getParcelId();
+	c_data.snapshot_id = getSnapshotId();
+	c_data.pos_global = getPosGlobal();
+	c_data.flags = getClassifiedFlags();
+	c_data.price_for_listing = getPriceForListing();
+
+	LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoUpdate(&c_data);
+}
+
+U32 LLPanelClassifiedEdit::getCategory()
+{
+	LLComboBox* cat_cb = getChild<LLComboBox>("category");
+	return cat_cb->getCurrentIndex() + 1;
+}
+
+U8 LLPanelClassifiedEdit::getClassifiedFlags()
+{
+	bool auto_renew = childGetValue("auto_renew").asBoolean();
+
+	LLComboBox* content_cb = getChild<LLComboBox>("content_type");
+	bool mature = content_cb->getCurrentIndex() == 0;
+	
+	return pack_classified_flags_request(auto_renew, false, mature, false);;
+}
+
+void LLPanelClassifiedEdit::enableSaveButton(bool enable)
+{
+	childSetEnabled("save_changes_btn", enable);
+}
+
+std::string LLPanelClassifiedEdit::makeClassifiedName()
+{
+	std::string name;
+
+	LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+	if(parcel)
+	{
+		name = parcel->getName();
+	}
+
+	if(!name.empty())
+		return name;
+
+	LLViewerRegion* region = gAgent.getRegion();
+	if(region)
+	{
+		name = region->getName();
+	}
+
+	return name;
+}
+
+S32 LLPanelClassifiedEdit::getPriceForListing()
+{
+	return childGetValue("price_for_listing").asInteger();
+}
+
+void LLPanelClassifiedEdit::onClickSetLocation()
+{
+	setPosGlobal(gAgent.getPositionGlobal());
+	setParcelId(LLUUID::null);
+
+	std::string region_name = LLTrans::getString("ClassifiedUpdateAfterPublish");
+	LLViewerRegion* region = gAgent.getRegion();
+	if (region)
+	{
+		region_name = region->getName();
+	}
+
+	setClassifiedLocation(createLocationText(region_name, LLStringUtil::null, getPosGlobal()));
+
+	// mark classified as dirty
+	setValue(LLSD());
+
+	onClassifiedChanged();
+}
+
+void LLPanelClassifiedEdit::onSnapshotChanged(LLUICtrl* ctrl)
+{
+
+}
+
+void LLPanelClassifiedEdit::onClassifiedChanged()
+{
+	if(isDirty())
+	{
+		enableSaveButton(true);
+	}
+	else
+	{
+		enableSaveButton(false);
+	}
+}
+
+void LLPanelClassifiedEdit::onClickSave()
+{
+	sendUpdate();
+
+//	LLAvatarPropertiesProcessor::getInstance()->sendAvatarClassifiedsRequest(getAvatarId());
+
+	LLSD params;
+	params["action"] = "save_classified";
+	notifyParent(params);
+}
+
+//EOF
diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h
index 417eddf4606..eccc83cf539 100644
--- a/indra/newview/llpanelclassified.h
+++ b/indra/newview/llpanelclassified.h
@@ -198,5 +198,131 @@ class LLFloaterPriceForListing
 	void* mUserData;
 };
 
+#include "llavatarpropertiesprocessor.h"
+
+class LLPanelClassifiedInfo : public LLPanel, public LLAvatarPropertiesObserver
+{
+public:
+
+	static LLPanelClassifiedInfo* create();
+
+	virtual ~LLPanelClassifiedInfo();
+
+	virtual void setExitCallback(const commit_callback_t& cb);
+
+	/*virtual*/ void onOpen(const LLSD& key);
+
+	/*virtual*/ BOOL postBuild();
+
+	/*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
+
+	virtual void setAvatarId(const LLUUID& avatar_id) { mAvatarId = avatar_id; }
+
+	LLUUID& getAvatarId() { return mAvatarId; }
+
+	virtual void setSnapshotId(const LLUUID& id);
+
+	virtual LLUUID getSnapshotId();
+
+	virtual void setClassifiedId(const LLUUID& id) { mClassifiedId = id; }
+
+	virtual LLUUID& getClassifiedId() { return mClassifiedId; }
+
+	virtual void setClassifiedName(const std::string& name);
+
+	virtual std::string getClassifiedName();
+
+	virtual void setDescription(const std::string& desc);
+
+	virtual std::string getDescription();
+
+	virtual void setClassifiedLocation(const std::string& location);
+
+	virtual void setPosGlobal(const LLVector3d& pos) { mPosGlobal = pos; }
+
+	virtual LLVector3d& getPosGlobal() { return mPosGlobal; }
+
+protected:
+
+	LLPanelClassifiedInfo();
+
+	virtual void resetData();
+
+	virtual void resetControls();
+
+	static std::string createLocationText(
+		const std::string& original_name,
+		const std::string& sim_name, 
+		const LLVector3d& pos_global);
+
+	void onClickMap();
+	void onClickTeleport();
+	void onClickBack();
+	void onExit();
+
+private:
+
+	LLUUID mAvatarId;
+	LLUUID mClassifiedId;
+	LLVector3d mPosGlobal;
+};
+
+class LLPanelClassifiedEdit : public LLPanelClassifiedInfo
+{
+public:
+
+	static LLPanelClassifiedEdit* create();
+
+	virtual ~LLPanelClassifiedEdit();
+
+	BOOL postBuild();
+
+	void onOpen(const LLSD& key);
+
+	void processProperties(void* data, EAvatarProcessorType type);
+
+	BOOL isDirty() const;
+
+	void resetDirty();
+
+	void setSaveCallback(const commit_callback_t& cb);
+
+	void setCancelCallback(const commit_callback_t& cb);
+
+	void resetControls();
+
+	virtual bool isNewClassified() { return mNewClassified; }
+
+protected:
+
+	LLPanelClassifiedEdit();
+
+	void sendUpdate();
+
+	U32 getCategory();
+
+	void enableSaveButton(bool enable);
+
+	std::string makeClassifiedName();
+
+	void setParcelId(const LLUUID& id) { mParcelId = id; }
+
+	LLUUID getParcelId() { return mParcelId; }
+
+	S32 getPriceForListing();
+
+	U8 getClassifiedFlags();
+
+	void onClickSetLocation();
+	void onSnapshotChanged(LLUICtrl* ctrl);
+	void onClassifiedChanged();
+	void onClickSave();
+
+private:
+	LLTextureCtrl* mSnapshotCtrl;
+
+	LLUUID mParcelId;
+	bool mNewClassified;
+};
 
 #endif // LL_LLPANELCLASSIFIED_H
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 78f8152b101..7b7667c147c 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -52,6 +52,7 @@
 #include "llpanelavatar.h"
 #include "llpanelprofile.h"
 #include "llpanelpick.h"
+#include "llpanelclassified.h"
 
 static const std::string XML_BTN_NEW = "new_btn";
 static const std::string XML_BTN_DELETE = "trash_btn";
@@ -70,6 +71,33 @@ static const std::string CLASSIFIED_NAME("classified_name");
 
 static LLRegisterPanelClassWrapper<LLPanelPicks> t_panel_picks("panel_picks");
 
+//////////////////////////////////////////////////////////////////////////
+
+class LLClassifiedClickThrough : public LLDispatchHandler
+{
+public:
+	virtual bool operator()(
+		const LLDispatcher* dispatcher,
+		const std::string& key,
+		const LLUUID& invoice,
+		const sparam_t& strings)
+	{
+		if (strings.size() != 4) 
+			return false;
+
+		// 		LLUUID classified_id(strings[0]);
+		// 		S32 teleport_clicks = atoi(strings[1].c_str());
+		// 		S32 map_clicks = atoi(strings[2].c_str());
+		// 		S32 profile_clicks = atoi(strings[3].c_str());
+		// 		LLPanelClassified::setClickThrough(classified_id, teleport_clicks,
+		// 			map_clicks,
+		// 			profile_clicks,
+		// 			false);
+
+		return true;
+	}
+};
+
 //-----------------------------------------------------------------------------
 // LLPanelPicks
 //-----------------------------------------------------------------------------
@@ -85,8 +113,12 @@ LLPanelPicks::LLPanelPicks()
 	mOverflowMenu(NULL),
 	mPlusMenu(NULL),
 	mPicksAccTab(NULL),
-	mClassifiedsAccTab(NULL)
+	mClassifiedsAccTab(NULL),
+	mPanelClassifiedInfo(NULL),
+	mPanelClassifiedEdit(NULL)
 {
+	gGenericDispatcher.addHandler("classifiedclickthrough", 
+		new LLClassifiedClickThrough());
 }
 
 LLPanelPicks::~LLPanelPicks()
@@ -574,7 +606,9 @@ void LLPanelPicks::createNewPick()
 
 void LLPanelPicks::createNewClassified()
 {
-	LLNotifications::instance().add("ClickUnimplemented");
+	createClassifiedEditPanel();
+
+	getProfilePanel()->openPanel(mPanelClassifiedEdit, LLSD());
 }
 
 void LLPanelPicks::onClickInfo()
@@ -610,7 +644,21 @@ void LLPanelPicks::openPickInfo()
 
 void LLPanelPicks::openClassifiedInfo()
 {
-	LLNotifications::instance().add("ClickUnimplemented");
+	LLSD selected_value = mClassifiedsList->getSelectedValue();
+	if (selected_value.isUndefined()) return;
+
+	LLClassifiedItem* c_item = getSelectedClassifiedItem();
+
+	createClassifiedInfoPanel();
+
+	LLSD params;
+ 	params["classified_id"] = c_item->getClassifiedId();
+ 	params["avatar_id"] = c_item->getAvatarId();
+ 	params["snapshot_id"] = c_item->getSnapshotId();
+ 	params["name"] = c_item->getClassifiedName();
+ 	params["desc"] = c_item->getDescription();
+
+	getProfilePanel()->openPanel(mPanelClassifiedInfo, params);
 }
 
 void LLPanelPicks::showAccordion(const std::string& name, bool show)
@@ -632,6 +680,49 @@ void LLPanelPicks::onPanelPickSave(LLPanel* panel)
 	updateButtons();
 }
 
+void LLPanelPicks::onPanelClassifiedSave(LLPanelClassifiedEdit* panel)
+{
+	if(panel->isNewClassified())
+	{
+		LLClassifiedItem* c_item = new LLClassifiedItem(getAvatarId(), panel->getClassifiedId());
+		
+		c_item->setClassifiedName(panel->getClassifiedName());
+		c_item->setDescription(panel->getDescription());
+		c_item->setSnapshotId(panel->getSnapshotId());
+
+		LLSD c_value;
+		c_value.insert(CLASSIFIED_ID, c_item->getClassifiedId());
+		c_value.insert(CLASSIFIED_NAME, c_item->getClassifiedName());
+		mClassifiedsList->addItem(c_item, c_value);
+
+		c_item->setDoubleClickCallback(boost::bind(&LLPanelPicks::onDoubleClickClassifiedItem, this, _1));
+		c_item->setRightMouseUpCallback(boost::bind(&LLPanelPicks::onRightMouseUpItem, this, _1, _2, _3, _4));
+		c_item->setMouseUpCallback(boost::bind(&LLPanelPicks::updateButtons, this));
+		c_item->childSetAction("info_chevron", boost::bind(&LLPanelPicks::onClickInfo, this));
+	}
+	else
+	{
+		std::vector<LLSD> values;
+		mClassifiedsList->getValues(values);
+		for(size_t n = 0; n < values.size(); ++n)
+		{
+			LLUUID c_id = values[n][CLASSIFIED_ID].asUUID();
+			if(panel->getClassifiedId() == c_id)
+			{
+				LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(
+					mClassifiedsList->getItemByValue(values[n]));
+
+				c_item->setClassifiedName(panel->getClassifiedName());
+				c_item->setDescription(panel->getDescription());
+				c_item->setSnapshotId(panel->getSnapshotId());
+			}
+		}
+	}
+
+	onPanelPickClose(panel);
+	updateButtons();
+}
+
 void LLPanelPicks::createPickInfoPanel()
 {
 	if(!mPanelPickInfo)
@@ -643,6 +734,28 @@ void LLPanelPicks::createPickInfoPanel()
 	}
 }
 
+void LLPanelPicks::createClassifiedInfoPanel()
+{
+	if(!mPanelClassifiedInfo)
+	{
+		mPanelClassifiedInfo = LLPanelClassifiedInfo::create();
+		mPanelClassifiedInfo->setExitCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelClassifiedInfo));
+		mPanelClassifiedInfo->setVisible(FALSE);
+	}
+}
+
+void LLPanelPicks::createClassifiedEditPanel()
+{
+	if(!mPanelClassifiedEdit)
+	{
+		mPanelClassifiedEdit = LLPanelClassifiedEdit::create();
+		mPanelClassifiedEdit->setExitCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelClassifiedEdit));
+		mPanelClassifiedEdit->setSaveCallback(boost::bind(&LLPanelPicks::onPanelClassifiedSave, this, mPanelClassifiedEdit));
+		mPanelClassifiedEdit->setCancelCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelClassifiedEdit));
+		mPanelClassifiedEdit->setVisible(FALSE);
+	}
+}
+
 void LLPanelPicks::createPickEditPanel()
 {
 	if(!mPanelPickEdit)
@@ -702,6 +815,28 @@ void LLPanelPicks::onPanelPickEdit()
 	getProfilePanel()->openPanel(mPanelPickEdit, params);
 }
 
+void LLPanelPicks::onPanelClassifiedEdit()
+{
+	LLSD selected_value = mClassifiedsList->getSelectedValue();
+	if (selected_value.isUndefined()) 
+	{
+		return;
+	}
+
+	LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(mClassifiedsList->getSelectedItem());
+
+	createClassifiedEditPanel();
+
+	LLSD params;
+	params["classified_id"] = c_item->getClassifiedId();
+	params["avatar_id"] = c_item->getAvatarId();
+	params["snapshot_id"] = c_item->getSnapshotId();
+	params["name"] = c_item->getClassifiedName();
+	params["desc"] = c_item->getDescription();
+
+	getProfilePanel()->openPanel(mPanelClassifiedEdit, params);
+}
+
 void LLPanelPicks::onClickMenuEdit()
 {
 	if(getSelectedPickItem())
@@ -710,7 +845,7 @@ void LLPanelPicks::onClickMenuEdit()
 	}
 	else if(getSelectedClassifiedItem())
 	{
-		LLNotifications::instance().add("ClickUnimplemented");
+		onPanelClassifiedEdit();
 	}
 }
 
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index daf8059feea..b30036c6037 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -53,6 +53,8 @@ class LLFlatListView;
 class LLPanelPickInfo;
 class LLPanelPickEdit;
 class LLToggleableMenu;
+class LLPanelClassifiedInfo;
+class LLPanelClassifiedEdit;
 
 class LLPanelPicks 
 	: public LLPanelProfileTab
@@ -98,7 +100,9 @@ class LLPanelPicks
 	void onClickInfo();
 	void onPanelPickClose(LLPanel* panel);
 	void onPanelPickSave(LLPanel* panel);
+	void onPanelClassifiedSave(LLPanelClassifiedEdit* panel);
 	void onPanelPickEdit();
+	void onPanelClassifiedEdit();
 	void onClickMenuEdit();
 
 	void createNewPick();
@@ -125,8 +129,8 @@ class LLPanelPicks
 
 	void createPickInfoPanel();
 	void createPickEditPanel();
-// 	void openPickEditPanel(LLPickItem* pick);
-// 	void openPickInfoPanel(LLPickItem* pick);
+	void createClassifiedInfoPanel();
+	void createClassifiedEditPanel();
 
 	LLMenuGL* mPopupMenu;
 	LLPanelProfile* mProfilePanel;
@@ -134,6 +138,8 @@ class LLPanelPicks
 	LLFlatListView* mPicksList;
 	LLFlatListView* mClassifiedsList;
 	LLPanelPickInfo* mPanelPickInfo;
+	LLPanelClassifiedInfo* mPanelClassifiedInfo;
+	LLPanelClassifiedEdit* mPanelClassifiedEdit;
 	LLPanelPickEdit* mPanelPickEdit;
 	LLToggleableMenu* mOverflowMenu;
 	LLToggleableMenu* mPlusMenu;
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index bec670cdaa7..b404c8db4c3 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -199,5 +199,10 @@ void LLPanelProfile::notifyParent(const LLSD& info)
 		onOpen(info);
 		return;
 	}
+	else if("save_classified" == action)
+	{
+	//	onOpen(info);
+		return;
+	}
 	LLPanel::notifyParent(info);
 }
diff --git a/indra/newview/skins/default/xui/en/panel_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml
new file mode 100644
index 00000000000..b7a54a7eeac
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ follows="all"
+ height="570"
+ layout="topleft"
+ left="0"
+ min_height="350"
+ name="panel_classified_info"
+ top="0"
+ width="333">
+    <button
+     follows="top|right"
+     height="23"
+     image_overlay="BackArrow_Off"
+     layout="topleft"
+     name="back_btn"
+     picture_style="true"
+     left="10"
+     tab_stop="false"
+     top="2"
+     width="23" />
+    <text
+     follows="top|left|right"
+     font="SansSerifHugeBold"
+     height="26"
+     layout="topleft"
+     left_pad="10"
+     name="title"
+     text_color="white"
+     top="0"
+     value="Classified Info"
+     use_ellipses="true"
+     width="275" />
+    <scroll_container
+     color="DkGray2"
+     opaque="true"
+     follows="all"
+     height="500"
+     layout="topleft"
+     left="10"
+     top_pad="10"
+     name="profile_scroll"
+     reserve_scroll_corner="false"
+     width="313">
+    <panel
+     name="scroll_content_panel"
+     follows="left|top"
+     min_height="300"
+     layout="topleft"
+     top="0"
+     background_visible="false"
+     height="500"
+     left="0"
+     width="295">
+        <texture_picker
+         enabled="false"
+         follows="left|top"
+         height="197"
+         layout="topleft"
+         left="10"
+         name="classified_snapshot"
+         top="20"
+         width="290" />
+        <text
+         follows="left|top|right"
+         height="35"
+         width="290"
+         layout="topleft"
+         font="SansSerifBig"
+         font.style="BOLD"
+         left="10"
+         top_pad="10"
+         name="classified_name"
+         text_color="white"
+         value="[name]"
+         use_ellipses="true" />
+        <text
+         follows="left|top"
+         height="25"
+         layout="topleft"
+         left="10"
+         name="classified_location"
+         width="290"
+         word_wrap="true"
+         value="[loading...]" />
+        <text
+         follows="left|top|right"
+         height="18"
+         layout="topleft"
+         left="10"
+         name="content_type"
+         width="290"
+         top_pad="5"
+         value="[content type]" />
+        <text
+         follows="left|top|right"
+         height="18"
+         layout="topleft"
+         left="10"
+         name="category"
+         width="290"
+         top_pad="5"
+         value="[category]" />
+        <check_box
+         enabled="false"
+         height="16"
+         label="Auto renew each week"
+         layout="topleft"
+         left="10"
+         name="auto_renew"
+         top_pad="5"
+         width="290" />
+        <text
+         follows="left|top"
+         halign="left"
+         height="16"
+         layout="topleft"
+         left="10"
+         name="price_for_listing"
+         top_pad="5"
+         tool_tip="Price for listing."
+         width="105">
+         L$[PRICE]
+        </text>
+        <text
+         follows="left|top|right"
+         height="200"
+         layout="topleft"
+         left="10"
+         name="classified_desc"
+         width="290"
+         value="[description]"
+         word_wrap="true" />
+    </panel>
+    </scroll_container>
+    <panel
+     follows="left|right|bottom"
+     height="20"
+     layout="topleft"
+     top_pad="8"
+     left="10"
+     name="buttons">
+        <button
+         follows="bottom|left"
+         font="SansSerifSmall"
+         height="19"
+         label="Teleport"
+         layout="topleft"
+         left="0"
+         name="teleport_btn"
+         top="0"
+         width="90" />
+        <button
+         follows="bottom|left"
+         font="SansSerifSmall"
+         height="19"
+         label="Map"
+         layout="topleft"
+         left_pad="10"
+         name="show_on_map_btn"
+         top="0"
+         width="90" />
+        <button
+         follows="bottom|left"
+         font="SansSerifSmall"
+         height="19"
+         label="Edit"
+         layout="topleft"
+         right="-1"
+         name="edit_btn"
+         top="0"
+         width="90" />
+    </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_classified.xml b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
new file mode 100644
index 00000000000..4741243addf
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
@@ -0,0 +1,251 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ bevel_style="in"
+ follows="left|top|right|bottom"
+ height="570"
+ label="Edit Classified"
+ layout="topleft"
+ left="0"
+ min_height="350"
+ name="panel_edit_classified"
+ top="0"
+ width="333">
+  <button
+     follows="top|right"
+     height="23"
+     image_overlay="BackArrow_Off"
+     layout="topleft"
+     name="back_btn"
+     picture_style="true"
+     left="10"
+     tab_stop="false"
+     top="2"
+     width="23" />
+   <text
+     type="string"
+     length="1"
+     follows="top"
+     font="SansSerifHuge"
+     height="15"
+     layout="topleft"
+     left_pad="10"
+     name="title"
+     text_color="white"
+     top="5"
+     width="250">
+        Edit Classified
+    </text>
+   <scroll_container
+     color="DkGray2"
+     follows="all"
+     height="510"
+     layout="topleft"
+     left="10"
+     top_pad="10"
+     name="profile_scroll"
+     reserve_scroll_corner="false"
+     opaque="true"
+     width="313">
+    <panel
+     name="scroll_content_panel"
+     follows="left|top"
+     min_height="300"
+     layout="topleft"
+     top="0"
+     background_visible="false"
+     height="600"
+     left="0"
+     width="295">
+    <texture_picker
+     follows="left|top|right"
+     height="197"
+     width="290"
+     layout="topleft"
+     top="20"
+     left="10"
+     name="classified_snapshot" />
+          <button
+           height="18"
+           image_overlay="AddItem_Off"
+           layout="topleft"
+           right="-5"
+           name="edit_icon"
+           label=""
+           tool_tip="Click to select an image"
+           top="27"
+           width="18" />
+        <text
+         type="string"
+         length="1"
+         follows="left|top"
+         height="15"
+         font="SansSerifSmall"
+         font.style="BOLD"
+         layout="topleft"
+         left="10"
+         top="215"
+         name="Name:"
+         text_color="white"
+         width="290">
+            Title:
+        </text>
+        <line_editor
+         follows="left|top|right"
+         font="SansSerif"
+         height="20"
+         layout="topleft"
+         left="10"
+         top_pad="2"
+         max_length="63"
+         name="classified_name"
+         text_color="black"
+         width="290" />
+        <text
+         type="string"
+         length="1"
+         follows="left|top"
+         height="15"
+         font="SansSerifSmall"
+         font.style="BOLD"
+         layout="topleft"
+         left="10"
+         top_pad="20"
+         name="description_label"
+         text_color="white"
+         width="290">
+            Description:
+        </text>
+        <text_editor
+         follows="left|top|right"
+         height="100"
+         width="290"
+         hide_scrollbar="false"
+         layout="topleft"
+         left="10"
+         top_pad="2"
+         max_length="1023"
+         name="classified_desc"
+         text_color="black"
+         word_wrap="true" />
+        <text
+         type="string"
+         length="1"
+         font="SansSerifSmall"
+         font.style="BOLD"
+         follows="left|top"
+         height="15"
+         layout="topleft"
+         left="10"
+         name="location_label"
+         text_color="white"
+         top_pad="20"
+         width="290">
+            Location:
+        </text>
+        <text
+         type="string"
+         length="1"
+         follows="left|top"
+         height="50"
+         layout="topleft"
+         left="10"
+         name="classified_location"
+         right="-10"
+         top_pad="2"
+         width="290"
+         word_wrap="true">
+            loading...
+        </text>
+        <button
+         follows="left|top"
+         height="20"
+         label="Set to Current Location"
+         layout="topleft"
+         left="8"
+         top_pad="5"
+         name="set_to_curr_location_btn"
+         width="200" />
+        <combo_box
+         follows="left|top" 
+         height="18" 
+         label=""
+	     left="10" 
+         name="category" 
+         top_pad="5"
+         width="200" />
+        <combo_box 
+         allow_text_entry="false" 
+         follows="left|top" 
+         height="18" 
+         left="10"
+         name="content_type" 
+         top_pad="5"
+         width="200">
+         <combo_item 
+          name="mature_ci" 
+          value="Mature">
+           Mature Content
+         </combo_item>
+         <combo_item 
+          name="pg_ci" 
+          value="PG">
+           PG Content
+         </combo_item>
+        </combo_box>
+        <spinner
+         decimal_digits="0"
+         follows="left|top"
+         halign="left"
+         height="16"
+         increment="1"
+         label_width="20"
+         label="L$"
+         layout="topleft"
+         left="10"
+         value="50"
+         min_val="50"
+         max_val="99999"
+         name="price_for_listing"
+         top_pad="5"
+         tool_tip="Price for listing."
+         width="105" />
+        <check_box
+         height="16"
+         label="Auto renew each week"
+         layout="topleft"
+         left="10"
+         name="auto_renew"
+         top_pad="5"
+         width="250" />
+    </panel>
+    </scroll_container>
+    <panel
+     follows="left|right|bottom"
+     height="20"
+     label="bottom_panel"
+     layout="topleft"
+     left="10"
+     name="bottom_panel"
+     top_pad="5"
+     width="303">
+        <button
+         follows="bottom|left"
+         height="19"
+         label="Save"
+         layout="topleft"
+         name="save_changes_btn"
+         left="0"
+         top="0"
+         width="130" />
+        <button
+         follows="bottom|left"
+         height="19"
+         label="Cancel"
+         layout="topleft"
+         name="cancel_btn"
+         left_pad="5"
+         right="-1"
+         width="130" />
+    </panel>
+</panel>
-- 
GitLab


From 622eb8643bcc4ec00de8e3927eb5629e0b5c6077 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Mon, 9 Nov 2009 15:56:49 +0200
Subject: [PATCH 024/557] Fixed windows build for M_PI constant. Macro
 definitions for common math constants (e.g. M_PI) are declared under the
 _USE_MATH_DEFINES in math.h Added "#define _USE_MATH_DEFINES" before
 including math.h (for Windows build only)

--HG--
branch : product-engine
---
 indra/llmath/llinterp.h | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/indra/llmath/llinterp.h b/indra/llmath/llinterp.h
index 8beeef480b5..36ca2e98655 100644
--- a/indra/llmath/llinterp.h
+++ b/indra/llmath/llinterp.h
@@ -32,6 +32,13 @@
 #ifndef LL_LLINTERP_H
 #define LL_LLINTERP_H
 
+#if defined(LL_WINDOWS)
+// macro definitions for common math constants (e.g. M_PI) are declared under the _USE_MATH_DEFINES
+// on Windows system.
+// So, let's define _USE_MATH_DEFINES before including math.h
+	#define _USE_MATH_DEFINES
+#endif
+
 #include "math.h"
 
 // Class from which different types of interpolators can be derived
-- 
GitLab


From 60389a85e545575d6ca0abbaa4b5fcadd449793f Mon Sep 17 00:00:00 2001
From: Andrew Polunin <apolunin@productengine.com>
Date: Mon, 9 Nov 2009 16:48:00 +0200
Subject: [PATCH 025/557] fixed normal bug EXT-2148 [BSI] Teleport button
 clickable although friend is offline

--HG--
branch : product-engine
---
 indra/newview/llpanelpeople.cpp | 8 +++++++-
 indra/newview/llpanelpeople.h   | 2 ++
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index b08eb27b9fb..f20ffa75591 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -696,6 +696,12 @@ void LLPanelPeople::buttonSetAction(const std::string& btn_name, const commit_si
 	button->setClickedCallback(cb);
 }
 
+bool LLPanelPeople::isFriendOnline(const LLUUID& id)
+{
+	LLAvatarList::uuid_vector_t ids = mOnlineFriendList->getIDs();
+	return std::find(ids.begin(), ids.end(), id) != ids.end();
+}
+
 void LLPanelPeople::updateButtons()
 {
 	std::string cur_tab		= getActiveTabName();
@@ -746,7 +752,7 @@ void LLPanelPeople::updateButtons()
 		childSetEnabled("add_friend_btn",	!is_friend);
 	}
 
-	buttonSetEnabled("teleport_btn",		friends_tab_active && item_selected);
+	buttonSetEnabled("teleport_btn",		friends_tab_active && item_selected && isFriendOnline(selected_uuids.front()));
 	buttonSetEnabled("view_profile_btn",	item_selected);
 	buttonSetEnabled("im_btn",				(selected_uuids.size() >= 1)); // allow starting the friends conference for multiple selection
 	buttonSetEnabled("call_btn",			item_selected && false); // not implemented yet
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index faed573eca3..a369bcd3e2a 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -71,6 +71,8 @@ class LLPanelPeople : public LLPanel
 	void					updateNearbyList();
 	void					updateRecentList();
 
+	bool					isFriendOnline(const LLUUID& id);
+
 	void					updateButtons();
 	std::string				getActiveTabName() const;
 	LLUUID					getCurrentItemID() const;
-- 
GitLab


From 92d3e335dcdf9cff143cf507c79925733254c896 Mon Sep 17 00:00:00 2001
From: Dmitry Oleshko <doleshko@productengine.com>
Date: Mon, 9 Nov 2009 17:44:55 +0200
Subject: [PATCH 026/557] partial implementation for the major task (EXT-989)
 IM chiclets should expand to show active voice indicator

--HG--
branch : product-engine
---
 indra/newview/llchiclet.cpp      | 225 ++++++++++++++++++-------------
 indra/newview/llchiclet.h        |  88 +++++++-----
 indra/newview/llvoicechannel.cpp |   3 +
 indra/newview/llvoicechannel.h   |   7 +
 4 files changed, 198 insertions(+), 125 deletions(-)

diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 53c4bb32ca7..9b27ea47282 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -55,6 +55,11 @@ static LLDefaultChildRegistry::Register<LLNotificationChiclet> t2("chiclet_notif
 static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t3("chiclet_im_p2p");
 static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t4("chiclet_im_group");
 
+static const LLRect CHICLET_RECT(0, 25, 25, 0);
+static const LLRect CHICLET_ICON_RECT(0, 24, 24, 0);
+static const LLRect VOICE_INDICATOR_RECT(25, 25, 45, 0);
+static const LLRect PANEL_SCROLL_BUTTON_RECT(0, 25, 19, 5);
+
 S32 LLNotificationChiclet::mUreadSystemNotifications = 0;
 
 boost::signals2::signal<LLChiclet* (const LLUUID&),
@@ -199,7 +204,9 @@ void LLChiclet::setValue(const LLSD& value)
 
 LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p)
 : LLChiclet(p)
+, mShowSpeaker(false)
 , mNewMessagesIcon(NULL)
+, mSpeakerCtrl(NULL)
 , mCounterCtrl(NULL)
 {
 	// initialize an overlay icon for new messages
@@ -218,6 +225,40 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p)
 	setShowCounter(false);
 }
 
+void LLIMChiclet::setShowSpeaker(bool show)
+{
+	bool needs_resize = getShowSpeaker() != show;
+	if(needs_resize)
+	{		
+		mShowSpeaker = show;
+		toggleSpeakerControl();
+		onChicletSizeChanged();		
+	}
+}
+void LLIMChiclet::initSpeakerControl()
+{
+	// virtual
+}
+
+void LLIMChiclet::toggleSpeakerControl()
+{
+	LLRect speaker_rect = mSpeakerCtrl->getRect();
+	S32 required_width = getRect().getWidth();
+
+	if(getShowSpeaker())
+	{
+		required_width = required_width + speaker_rect.getWidth();
+		initSpeakerControl();		
+	}
+	else
+	{
+		required_width = required_width - speaker_rect.getWidth();
+	}
+	
+	reshape(required_width, getRect().getHeight());
+	mSpeakerCtrl->setVisible(getShowSpeaker());
+}
+
 void LLIMChiclet::setShowNewMessagesIcon(bool show)
 {
 	if(mNewMessagesIcon)
@@ -300,7 +341,7 @@ LLIMP2PChiclet::Params::Params()
 , show_speaker("show_speaker")
 {
 	// *TODO Vadim: Get rid of hardcoded values.
-	rect(LLRect(0, 25, 25, 0));
+	rect(CHICLET_RECT);
 
 	avatar_icon.name("avatar_icon");
 	avatar_icon.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP | FOLLOWS_BOTTOM);
@@ -309,11 +350,10 @@ LLIMP2PChiclet::Params::Params()
 	// Changed icon height from 25 to 24 to fix ticket EXT-794.
 	// In some cases(after changing UI scale) 25 pixel height icon was 
 	// drawn incorrectly, i'm not sure why.
-	avatar_icon.rect(LLRect(0, 24, 25, 0));
+	avatar_icon.rect(CHICLET_ICON_RECT);
 	avatar_icon.mouse_opaque(false);
 
 	unread_notifications.name("unread");
-	unread_notifications.rect(LLRect(25, 25, 45, 0));
 	unread_notifications.font(LLFontGL::getFontSansSerif());
 	unread_notifications.font_halign(LLFontGL::HCENTER);
 	unread_notifications.v_pad(5);
@@ -322,7 +362,9 @@ LLIMP2PChiclet::Params::Params()
 	unread_notifications.visible(false);
 
 	speaker.name("speaker");
-	speaker.rect(LLRect(45, 25, 65, 0));
+	speaker.rect(VOICE_INDICATOR_RECT);
+	speaker.auto_update(true);
+	speaker.draw_border(false);
 
 	show_speaker = false;
 }
@@ -330,7 +372,6 @@ LLIMP2PChiclet::Params::Params()
 LLIMP2PChiclet::LLIMP2PChiclet(const Params& p)
 : LLIMChiclet(p)
 , mChicletIconCtrl(NULL)
-, mSpeakerCtrl(NULL)
 , mPopupMenu(NULL)
 {
 	LLChicletAvatarIconCtrl::Params avatar_params = p.avatar_icon;
@@ -358,18 +399,9 @@ void LLIMP2PChiclet::setCounter(S32 counter)
 	setShowNewMessagesIcon(counter);
 }
 
-LLRect LLIMP2PChiclet::getRequiredRect()
+void LLIMP2PChiclet::initSpeakerControl()
 {
-	LLRect rect(0, 0, mChicletIconCtrl->getRect().getWidth(), 0);
-	if(getShowCounter())
-	{
-		rect.mRight += mCounterCtrl->getRequiredRect().getWidth();
-	}
-	if(getShowSpeaker())
-	{
-		rect.mRight += mSpeakerCtrl->getRect().getWidth();
-	}
-	return rect;
+	mSpeakerCtrl->setSpeakerId(getOtherParticipantId());
 }
 
 void LLIMP2PChiclet::setOtherParticipantId(const LLUUID& other_participant_id)
@@ -446,18 +478,6 @@ void LLIMP2PChiclet::onMenuItemClicked(const LLSD& user_data)
 	}
 }
 
-void LLIMP2PChiclet::setShowSpeaker(bool show)
-{
-	LLIMChiclet::setShowSpeaker(show);
-
-	bool needs_resize = getShowSpeaker() != show;
-	mSpeakerCtrl->setVisible(getShowSpeaker());
-	if(needs_resize)
-	{
-		onChicletSizeChanged();
-	}
-}
-
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
@@ -470,7 +490,7 @@ LLAdHocChiclet::Params::Params()
 , avatar_icon_color("avatar_icon_color", LLColor4::green)
 {
 	// *TODO Vadim: Get rid of hardcoded values.
-	rect(LLRect(0, 25, 25, 0));
+	rect(CHICLET_RECT);
 
 	avatar_icon.name("avatar_icon");
 	avatar_icon.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP | FOLLOWS_BOTTOM);
@@ -479,11 +499,10 @@ LLAdHocChiclet::Params::Params()
 	// Changed icon height from 25 to 24 to fix ticket EXT-794.
 	// In some cases(after changing UI scale) 25 pixel height icon was 
 	// drawn incorrectly, i'm not sure why.
-	avatar_icon.rect(LLRect(0, 24, 25, 0));
+	avatar_icon.rect(CHICLET_ICON_RECT);
 	avatar_icon.mouse_opaque(false);
 
 	unread_notifications.name("unread");
-	unread_notifications.rect(LLRect(25, 25, 45, 0));
 	unread_notifications.font(LLFontGL::getFontSansSerif());
 	unread_notifications.font_halign(LLFontGL::HCENTER);
 	unread_notifications.v_pad(5);
@@ -493,7 +512,9 @@ LLAdHocChiclet::Params::Params()
 
 
 	speaker.name("speaker");
-	speaker.rect(LLRect(45, 25, 65, 0));
+	speaker.rect(VOICE_INDICATOR_RECT);
+	speaker.auto_update(true);
+	speaker.draw_border(false);
 
 	show_speaker = false;
 }
@@ -501,7 +522,6 @@ LLAdHocChiclet::Params::Params()
 LLAdHocChiclet::LLAdHocChiclet(const Params& p)
 : LLIMChiclet(p)
 , mChicletIconCtrl(NULL)
-, mSpeakerCtrl(NULL)
 , mPopupMenu(NULL)
 {
 	LLChicletAvatarIconCtrl::Params avatar_params = p.avatar_icon;
@@ -532,24 +552,40 @@ void LLAdHocChiclet::setSessionId(const LLUUID& session_id)
 	mChicletIconCtrl->setValue(im_session->mOtherParticipantID);
 }
 
-void LLAdHocChiclet::setCounter(S32 counter)
+void LLAdHocChiclet::draw()
 {
-	mCounterCtrl->setCounter(counter);
-	setShowNewMessagesIcon(counter);
+	switchToCurrentSpeaker();
+	LLIMChiclet::draw();
 }
 
-LLRect LLAdHocChiclet::getRequiredRect()
+void LLAdHocChiclet::initSpeakerControl()
 {
-	LLRect rect(0, 0, mChicletIconCtrl->getRect().getWidth(), 0);
-	if(getShowCounter())
-	{
-		rect.mRight += mCounterCtrl->getRequiredRect().getWidth();
-	}
-	if(getShowSpeaker())
+	switchToCurrentSpeaker();
+}
+
+void LLAdHocChiclet::switchToCurrentSpeaker()
+{
+	LLUUID speaker_id;
+	LLSpeakerMgr::speaker_list_t speaker_list;
+
+	LLIMModel::getInstance()->findIMSession(getSessionId())->mSpeakers->getSpeakerList(&speaker_list, FALSE);
+	for (LLSpeakerMgr::speaker_list_t::iterator i = speaker_list.begin(); i != speaker_list.end(); ++i)
 	{
-		rect.mRight += mSpeakerCtrl->getRect().getWidth();
+		LLPointer<LLSpeaker> s = *i;
+		if (s->mSpeechVolume > 0 || s->mStatus == LLSpeaker::STATUS_SPEAKING)
+		{
+			speaker_id = s->mID;
+			break;
+		}
 	}
-	return rect;
+
+	mSpeakerCtrl->setSpeakerId(speaker_id);
+}
+
+void LLAdHocChiclet::setCounter(S32 counter)
+{
+	mCounterCtrl->setCounter(counter);
+	setShowNewMessagesIcon(counter);
 }
 
 BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
@@ -564,7 +600,7 @@ BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
 LLIMGroupChiclet::Params::Params()
 : group_icon("group_icon")
 {
-	rect(LLRect(0, 25, 25, 0));
+	rect(CHICLET_RECT);
 
 	group_icon.name("group_icon");
 	
@@ -572,10 +608,9 @@ LLIMGroupChiclet::Params::Params()
 	// Changed icon height from 25 to 24 to fix ticket EXT-794.
 	// In some cases(after changing UI scale) 25 pixel height icon was 
 	// drawn incorrectly, i'm not sure why.
-	group_icon.rect(LLRect(0, 24, 25, 0));
+	group_icon.rect(CHICLET_ICON_RECT);
 
 	unread_notifications.name("unread");
-	unread_notifications.rect(LLRect(25, 25, 45, 0));
 	unread_notifications.font(LLFontGL::getFontSansSerif());
 	unread_notifications.font_halign(LLFontGL::HCENTER);
 	unread_notifications.v_pad(5);
@@ -583,7 +618,9 @@ LLIMGroupChiclet::Params::Params()
 	unread_notifications.visible(false);
 
 	speaker.name("speaker");
-	speaker.rect(LLRect(45, 25, 65, 0));
+	speaker.rect(VOICE_INDICATOR_RECT);
+	speaker.auto_update(true);
+	speaker.draw_border(false);
 
 	show_speaker = false;
 }
@@ -592,7 +629,6 @@ LLIMGroupChiclet::LLIMGroupChiclet(const Params& p)
 : LLIMChiclet(p)
 , LLGroupMgrObserver(LLUUID::null)
 , mChicletIconCtrl(NULL)
-, mSpeakerCtrl(NULL)
 , mPopupMenu(NULL)
 {
 	LLChicletGroupIconCtrl::Params avatar_params = p.group_icon;
@@ -625,18 +661,34 @@ void LLIMGroupChiclet::setCounter(S32 counter)
 	setShowNewMessagesIcon(counter);
 }
 
-LLRect LLIMGroupChiclet::getRequiredRect()
+void LLIMGroupChiclet::draw()
 {
-	LLRect rect(0, 0, mChicletIconCtrl->getRect().getWidth(), 0);
-	if(getShowCounter())
-	{
-		rect.mRight += mCounterCtrl->getRequiredRect().getWidth();
-	}
-	if(getShowSpeaker())
+	switchToCurrentSpeaker();
+	LLIMChiclet::draw();
+}
+
+void LLIMGroupChiclet::initSpeakerControl()
+{
+	switchToCurrentSpeaker();
+}
+
+void LLIMGroupChiclet::switchToCurrentSpeaker()
+{
+	LLUUID speaker_id;
+	LLSpeakerMgr::speaker_list_t speaker_list;
+
+	LLIMModel::getInstance()->findIMSession(getSessionId())->mSpeakers->getSpeakerList(&speaker_list, FALSE);
+	for (LLSpeakerMgr::speaker_list_t::iterator i = speaker_list.begin(); i != speaker_list.end(); ++i)
 	{
-		rect.mRight += mSpeakerCtrl->getRect().getWidth();
+		LLPointer<LLSpeaker> s = *i;
+		if (s->mSpeechVolume > 0 || s->mStatus == LLSpeaker::STATUS_SPEAKING)
+		{
+			speaker_id = s->mID;
+			break;
+		}
 	}
-	return rect;
+
+	mSpeakerCtrl->setSpeakerId(speaker_id);
 }
 
 void LLIMGroupChiclet::setSessionId(const LLUUID& session_id)
@@ -723,17 +775,6 @@ void LLIMGroupChiclet::onMenuItemClicked(const LLSD& user_data)
 	}
 }
 
-void LLIMGroupChiclet::setShowSpeaker(bool show)
-{
-	LLIMChiclet::setShowSpeaker(show);
-
-	bool needs_resize = getShowSpeaker() != show;
-	mSpeakerCtrl->setVisible(getShowSpeaker());
-	if(needs_resize)
-	{
-		onChicletSizeChanged();
-	}
-}
 
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
@@ -755,11 +796,9 @@ LLChicletPanel::Params::Params()
 		min_width = 179 + 3*chiclet_padding;
 	}
 
-	LLRect scroll_button_rect(0, 25, 19, 5);
-
 	left_scroll_button.name("left_scroll");
 	left_scroll_button.label(LLStringUtil::null);
-	left_scroll_button.rect(scroll_button_rect);
+	left_scroll_button.rect(PANEL_SCROLL_BUTTON_RECT);
 	left_scroll_button.tab_stop(false);
 	left_scroll_button.image_selected(LLUI::getUIImage("bottom_tray_scroll_left.tga"));
 	left_scroll_button.image_unselected(LLUI::getUIImage("bottom_tray_scroll_left.tga"));
@@ -767,7 +806,7 @@ LLChicletPanel::Params::Params()
 
 	right_scroll_button.name("right_scroll");
 	right_scroll_button.label(LLStringUtil::null);
-	right_scroll_button.rect(scroll_button_rect);
+	right_scroll_button.rect(PANEL_SCROLL_BUTTON_RECT);
 	right_scroll_button.tab_stop(false);
 	right_scroll_button.image_selected(LLUI::getUIImage("bottom_tray_scroll_right.tga"));
 	right_scroll_button.image_unselected(LLUI::getUIImage("bottom_tray_scroll_right.tga"));
@@ -849,10 +888,28 @@ BOOL LLChicletPanel::postBuild()
 	LLIMModel::instance().addNewMsgCallback(boost::bind(im_chiclet_callback, this, _1));
 	LLIMModel::instance().addNoUnreadMsgsCallback(boost::bind(im_chiclet_callback, this, _1));
 	LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLChicletPanel::findChiclet<LLChiclet>, this, _1));
+	LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLChicletPanel::onCurrentVoiceChannelChanged, this, _1));
 
 	return TRUE;
 }
 
+void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id)
+{
+	for(chiclet_list_t::iterator it = mChicletList.begin(); it != mChicletList.end(); ++it)
+	{
+		LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it);
+		if(chiclet)
+		{
+			if(chiclet->getSessionId() == session_id)
+			{
+				chiclet->setShowSpeaker(true);
+				continue;
+			}
+			chiclet->setShowSpeaker(false);
+		}
+	}
+}
+
 S32 LLChicletPanel::calcChickletPanleWidth()
 {
 	S32 res = 0;
@@ -896,23 +953,7 @@ bool LLChicletPanel::addChiclet(LLChiclet* chiclet, S32 index)
 
 void LLChicletPanel::onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param)
 {
-	S32 chiclet_width = ctrl->getRect().getWidth();
-	S32 chiclet_new_width = ctrl->getRequiredRect().getWidth();
-
-	if(chiclet_new_width == chiclet_width)
-	{
-		return;
-	}
-
-	LLRect chiclet_rect = ctrl->getRect();
-	chiclet_rect.mRight = chiclet_rect.mLeft + chiclet_new_width;	
-
-	ctrl->setRect(chiclet_rect);
-
-	S32 offset = chiclet_new_width - chiclet_width;
-	S32 index = getChicletIndex(ctrl);
-
-	shiftChiclets(offset, index + 1);
+	arrange();
 	trimChiclets();
 	showScrollButtonsIfNeeded();
 }
@@ -1327,6 +1368,6 @@ void LLChicletGroupIconCtrl::setValue(const LLSD& value )
 //////////////////////////////////////////////////////////////////////////
 
 LLChicletSpeakerCtrl::LLChicletSpeakerCtrl(const Params&p)
- : LLIconCtrl(p)
+ : LLOutputMonitorCtrl(p)
 {
 }
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index b50702205cd..15c9a0bad87 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -147,13 +147,13 @@ class LLChicletGroupIconCtrl : public LLIconCtrl
 };
 
 /*
- * Class for displaying status of Voice Chat 
+ * Class for displaying of speaker's voice indicator 
 */
-class LLChicletSpeakerCtrl : public LLIconCtrl
+class LLChicletSpeakerCtrl : public LLOutputMonitorCtrl
 {
 public:
 
-	struct Params : public LLInitParam::Block<Params, LLIconCtrl::Params>
+	struct Params : public LLInitParam::Block<Params, LLOutputMonitorCtrl::Params>
 	{
 		Params(){};
 	};
@@ -266,8 +266,6 @@ class LLChiclet : public LLUICtrl
 * Base class for Instant Message chiclets.
 * IMChiclet displays icon, number of unread messages(optional)
 * and voice chat status(optional).
-* Every chiclet should override LLUICtrl::getRequiredRect and return 
-* desired width.
 */
 class LLIMChiclet : public LLChiclet
 {
@@ -306,15 +304,25 @@ class LLIMChiclet : public LLChiclet
 	virtual LLUUID getOtherParticipantId() { return mOtherParticipantId; }
 
 	/*
-	 * Shows/hides voice chat status control.
+	* Init Speaker Control with speaker's ID
 	*/
-	virtual void setShowSpeaker(bool show) { mShowSpeaker = show; }
+	virtual void initSpeakerControl();
+
+	/*
+	 * set status (Shows/Hide) for voice control.
+	*/
+	virtual void setShowSpeaker(bool show);
 
 	/*
 	 * Returns voice chat status control visibility.
 	*/
 	virtual bool getShowSpeaker() {return mShowSpeaker;};
 
+	/*
+	* Shows/Hides for voice control for a chiclet.
+	*/
+	virtual void toggleSpeakerControl();
+
 	/*
 	* Shows/hides overlay icon concerning new unread messages.
 	*/
@@ -325,10 +333,7 @@ class LLIMChiclet : public LLChiclet
 	*/
 	virtual bool getShowNewMessagesIcon();
 
-	/*
-	 * Draws border around chiclet.
-	*/
-	/*virtual*/ void draw();
+	virtual void draw();
 
 	/**
 	 * Determine whether given ID refers to a group or an IM chat session.
@@ -363,6 +368,8 @@ class LLIMChiclet : public LLChiclet
 
 	LLIconCtrl* mNewMessagesIcon;
 	LLChicletNotificationCounterCtrl* mCounterCtrl;
+	LLChicletSpeakerCtrl* mSpeakerCtrl;
+
 
 	/** the id of another participant, either an avatar id or a group id*/
 	LLUUID mOtherParticipantId;
@@ -410,8 +417,6 @@ class LLIMP2PChiclet : public LLIMChiclet
 
 	/* virtual */ void setOtherParticipantId(const LLUUID& other_participant_id);
 
-	/*virtual*/ void setShowSpeaker(bool show);
-
 	/*
 	* Sets number of unread messages. Will update chiclet's width if number text 
 	* exceeds size of counter and notify it's parent about size change.
@@ -419,15 +424,14 @@ class LLIMP2PChiclet : public LLIMChiclet
 	/*virtual*/ void setCounter(S32);
 
 	/*
-	* Returns number of unread messages.
+	* Init Speaker Control with speaker's ID
 	*/
-	/*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
+	/*virtual*/ void initSpeakerControl();
 
 	/*
-	* Returns rect, required to display chiclet.
-	* Width is the only valid value.
+	* Returns number of unread messages.
 	*/
-	/*virtual*/ LLRect getRequiredRect();
+	/*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
 
 protected:
 	LLIMP2PChiclet(const Params& p);
@@ -457,7 +461,6 @@ class LLIMP2PChiclet : public LLIMChiclet
 private:
 
 	LLChicletAvatarIconCtrl* mChicletIconCtrl;
-	LLChicletSpeakerCtrl* mSpeakerCtrl;
 	LLMenuGL* mPopupMenu;
 };
 
@@ -495,15 +498,19 @@ class LLAdHocChiclet : public LLIMChiclet
 	/*virtual*/ void setCounter(S32);
 
 	/*
-	* Returns number of unread messages.
+	* Keep Speaker Control with actual speaker's ID
 	*/
-	/*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
+	/*virtual*/ void draw();
 
 	/*
-	* Returns rect, required to display chiclet.
-	* Width is the only valid value.
+	* Init Speaker Control with speaker's ID
 	*/
-	/*virtual*/ LLRect getRequiredRect();
+	/*virtual*/ void initSpeakerControl();
+
+	/*
+	* Returns number of unread messages.
+	*/
+	/*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
 
 protected:
 	LLAdHocChiclet(const Params& p);
@@ -514,10 +521,14 @@ class LLAdHocChiclet : public LLIMChiclet
 	*/
 	virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
 
+	/*
+	* Finds a current speaker and resets the SpeakerControl with speaker's ID
+	*/
+	/*virtual*/ void switchToCurrentSpeaker();
+
 private:
 
 	LLChicletAvatarIconCtrl* mChicletIconCtrl;
-	LLChicletSpeakerCtrl* mSpeakerCtrl;
 	LLMenuGL* mPopupMenu;
 };
 
@@ -547,14 +558,17 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver
 	 */
 	/*virtual*/ void setSessionId(const LLUUID& session_id);
 
+	/*
+	* Keep Speaker Control with actual speaker's ID
+	*/
+	/*virtual*/ void draw();
+
 	/**
 	 * Callback for LLGroupMgrObserver, we get this when group data is available or changed.
 	 * Sets group icon.
 	 */
 	/*virtual*/ void changed(LLGroupChange gc);
 
-	/*virtual*/ void setShowSpeaker(bool show);
-
 	/*
 	* Sets number of unread messages. Will update chiclet's width if number text 
 	* exceeds size of counter and notify it's parent about size change.
@@ -562,15 +576,14 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver
 	/*virtual*/ void setCounter(S32);
 
 	/*
-	* Returns number of unread messages.
+	* Init Speaker Control with speaker's ID
 	*/
-	/*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
+	/*virtual*/ void initSpeakerControl();
 
 	/*
-	* Returns rect, required to display chiclet.
-	* Width is the only valid value.
+	* Returns number of unread messages.
 	*/
-	/*virtual*/ LLRect getRequiredRect();
+	/*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
 
 	~LLIMGroupChiclet();
 
@@ -578,6 +591,11 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver
 	LLIMGroupChiclet(const Params& p);
 	friend class LLUICtrlFactory;
 
+	/*
+	* Finds a current speaker and resets the SpeakerControl with speaker's ID
+	*/
+	/*virtual*/ void switchToCurrentSpeaker();
+
 	/*
 	* Creates chiclet popup menu. Will create P2P or Group IM Chat menu 
 	* based on other participant's id.
@@ -597,7 +615,6 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver
 private:
 
 	LLChicletGroupIconCtrl* mChicletIconCtrl;
-	LLChicletSpeakerCtrl* mSpeakerCtrl;
 	LLMenuGL* mPopupMenu;
 };
 
@@ -735,6 +752,11 @@ class LLChicletPanel : public LLPanel
 
 	/*virtual*/ BOOL postBuild();
 
+	/*
+	* Handler for the Voice Client's signal. Finds a corresponding chiclet and toggles its SpeakerControl
+	*/
+	void onCurrentVoiceChannelChanged(const LLUUID& session_id);
+
 	/*
 	 * Reshapes controls and rearranges chiclets if needed.
 	*/
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index cefc88ebee8..89649407ff0 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -46,6 +46,7 @@ LLVoiceChannel::voice_channel_map_t LLVoiceChannel::sVoiceChannelMap;
 LLVoiceChannel::voice_channel_map_uri_t LLVoiceChannel::sVoiceChannelURIMap;
 LLVoiceChannel* LLVoiceChannel::sCurrentVoiceChannel = NULL;
 LLVoiceChannel* LLVoiceChannel::sSuspendedVoiceChannel = NULL;
+LLVoiceChannel::channel_changed_signal_t LLVoiceChannel::sCurrentVoiceChannelChangedSignal;
 
 BOOL LLVoiceChannel::sSuspended = FALSE;
 
@@ -320,6 +321,8 @@ void LLVoiceChannel::activate()
 	{
 		setState(STATE_CALL_STARTED);
 	}
+
+	sCurrentVoiceChannelChangedSignal(this->mSessionID);
 }
 
 void LLVoiceChannel::getChannelInfo()
diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h
index 8f1e9ff02d3..20b6157b48b 100644
--- a/indra/newview/llvoicechannel.h
+++ b/indra/newview/llvoicechannel.h
@@ -54,6 +54,13 @@ class LLVoiceChannel : public LLVoiceClientStatusObserver
 
 	typedef boost::function<void(const EState& old_state, const EState& new_state)> state_changed_callback_t;
 
+	// on current channel changed signal
+	typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t;
+	typedef boost::signals2::signal<void(const LLUUID& session_id)> channel_changed_signal_t;
+	static channel_changed_signal_t sCurrentVoiceChannelChangedSignal;
+	static boost::signals2::connection setCurrentVoiceChannelChangedCallback(channel_changed_callback_t cb) { return sCurrentVoiceChannelChangedSignal.connect(cb); }
+
+
 	LLVoiceChannel(const LLUUID& session_id, const std::string& session_name);
 	virtual ~LLVoiceChannel();
 
-- 
GitLab


From 3c8270c4dd60938c16c6f25110a10f71352156c5 Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Mon, 9 Nov 2009 18:32:17 +0200
Subject: [PATCH 027/557] Implemented Sub-task EXT-1906 All speakers handling
 functional in old IM Floaters (Communicate) should be present in new IM
 Floaters/IM control panels, EXCLUDING voice related mute/moderation stuff

--HG--
branch : product-engine
---
 indra/newview/llparticipantlist.cpp           | 146 ++++++++++++++++++
 indra/newview/llparticipantlist.h             |  23 +++
 .../default/xui/en/menu_participant_list.xml  |  31 ++++
 3 files changed, 200 insertions(+)
 create mode 100644 indra/newview/skins/default/xui/en/menu_participant_list.xml

diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 2be0781487c..21b40e25a06 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -32,14 +32,19 @@
 
 #include "llviewerprecompiledheaders.h"
 
+#include "llmenugl.h"
+#include "lluictrlfactory.h"
+
 // common includes
 #include "lltrans.h"
 #include "llavataractions.h"
 #include "llagent.h"
+#include "llimview.h"
 
 #include "llparticipantlist.h"
 #include "llavatarlist.h"
 #include "llspeakers.h"
+#include "llviewermenu.h"
 
 //LLParticipantList retrieves add, clear and remove events and updates view accordingly 
 #if LL_MSVC
@@ -64,6 +69,9 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
 	mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
 	mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2));
 
+	mParticipantListMenu = new LLParticipantListMenu(*this);
+	mAvatarList->setContextMenu(mParticipantListMenu);
+
 	//Lets fill avatarList with existing speakers
 	LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
 
@@ -83,6 +91,8 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
 
 LLParticipantList::~LLParticipantList()
 {
+	delete mParticipantListMenu;
+	mParticipantListMenu = NULL;
 }
 
 void LLParticipantList::onAvatarListDoubleClicked(LLAvatarList* list)
@@ -265,3 +275,139 @@ bool LLParticipantList::SpeakerModeratorUpdateListener::handleEvent(LLPointer<LL
 {
 		return mParent.onModeratorUpdateEvent(event, userdata);
 }
+
+LLContextMenu* LLParticipantList::LLParticipantListMenu::createMenu()
+{
+	// set up the callbacks for all of the avatar menu items
+	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+	LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+	
+	registrar.add("ParticipantList.ToggleAllowTextChat", boost::bind(&LLParticipantList::LLParticipantListMenu::toggleAllowTextChat, this, _2));
+	registrar.add("ParticipantList.ToggleMuteText", boost::bind(&LLParticipantList::LLParticipantListMenu::toggleMuteText, this, _2));
+
+	enable_registrar.add("ParticipantList.EnableItem", boost::bind(&LLParticipantList::LLParticipantListMenu::enableContextMenuItem,	this, _2));
+	enable_registrar.add("ParticipantList.CheckItem",  boost::bind(&LLParticipantList::LLParticipantListMenu::checkContextMenuItem,	this, _2));
+
+	// create the context menu from the XUI
+	return LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>(
+		"menu_participant_list.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
+}
+
+void LLParticipantList::LLParticipantListMenu::toggleAllowTextChat(const LLSD& userdata)
+{
+	const LLUUID speaker_id = mUUIDs.front();
+
+	std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
+	LLSD data;
+	data["method"] = "mute update";
+	data["session-id"] = mParent.mSpeakerMgr->getSessionID();
+	data["params"] = LLSD::emptyMap();
+	data["params"]["agent_id"] = speaker_id;
+	data["params"]["mute_info"] = LLSD::emptyMap();
+	//current value represents ability to type, so invert
+	data["params"]["mute_info"]["text"] = !mParent.mSpeakerMgr->findSpeaker(speaker_id)->mModeratorMutedText;
+
+	class MuteTextResponder : public LLHTTPClient::Responder
+	{
+	public:
+		MuteTextResponder(const LLUUID& session_id)
+		{
+			mSessionID = session_id;
+		}
+
+		virtual void error(U32 status, const std::string& reason)
+		{
+			llwarns << status << ": " << reason << llendl;
+
+			if ( gIMMgr )
+			{
+				//403 == you're not a mod
+				//should be disabled if you're not a moderator
+				if ( 403 == status )
+				{
+					gIMMgr->showSessionEventError(
+						"mute",
+						"not_a_moderator",
+						mSessionID);
+				}
+				else
+				{
+					gIMMgr->showSessionEventError(
+						"mute",
+						"generic",
+						mSessionID);
+				}
+			}
+		}
+
+	private:
+		LLUUID mSessionID;
+	};
+
+	LLHTTPClient::post(
+		url,
+		data,
+		new MuteTextResponder(mParent.mSpeakerMgr->getSessionID()));
+}
+
+void LLParticipantList::LLParticipantListMenu::toggleMuteText(const LLSD& userdata)
+{
+	const LLUUID speaker_id = mUUIDs.front();
+	BOOL is_muted = LLMuteList::getInstance()->isMuted(speaker_id, LLMute::flagTextChat);
+	std::string name;
+
+	//fill in name using voice client's copy of name cache
+	LLPointer<LLSpeaker> speakerp = mParent.mSpeakerMgr->findSpeaker(speaker_id);
+	if (speakerp.isNull())
+	{
+		return;
+	}
+
+	name = speakerp->mDisplayName;
+
+	LLMute mute(speaker_id, name, speakerp->mType == LLSpeaker::SPEAKER_AGENT ? LLMute::AGENT : LLMute::OBJECT);
+
+	if (!is_muted)
+	{
+		LLMuteList::getInstance()->add(mute, LLMute::flagTextChat);
+	}
+	else
+	{
+		LLMuteList::getInstance()->remove(mute, LLMute::flagTextChat);
+	}
+}
+
+bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& userdata)
+{
+	std::string item = userdata.asString();
+	if (item == "can_mute_text")
+	{
+		return mUUIDs.front() != gAgentID;
+	}
+	else
+		if (item == "can_allow_text_chat")
+		{
+			LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mParent.mSpeakerMgr->getSessionID());
+			return im_session->mType == IM_SESSION_GROUP_START && mParent.mSpeakerMgr->findSpeaker(gAgentID)->mIsModerator;
+		}
+	return true;
+}
+
+bool LLParticipantList::LLParticipantListMenu::checkContextMenuItem(const LLSD& userdata)
+{
+	std::string item = userdata.asString();
+	const LLUUID& id = mUUIDs.front();
+	if (item == "is_muted")
+		return LLMuteList::getInstance()->isMuted(id, LLMute::flagTextChat); 
+	else
+		if (item == "is_allowed_text_chat")
+		{
+			LLPointer<LLSpeaker> selected_speakerp = mParent.mSpeakerMgr->findSpeaker(id);
+
+			if (selected_speakerp.notNull())
+			{
+				return !selected_speakerp->mModeratorMutedText;
+			}
+		}
+	return false;
+}
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
index fc34dd308ba..1ff1515d16d 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -32,6 +32,8 @@
 
 #include "llviewerprecompiledheaders.h"
 #include "llevent.h"
+#include "llpanelpeoplemenus.h"
+#include "llimview.h"
 
 class LLSpeakerMgr;
 class LLAvatarList;
@@ -105,6 +107,25 @@ class LLParticipantList
 			SpeakerModeratorUpdateListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}
 			/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
 		};
+		
+		/**
+		 * Menu used in the participant list.
+		 */
+		class LLParticipantListMenu : public LLPanelPeopleMenus::ContextMenu
+		{
+		public:
+			LLParticipantListMenu(LLParticipantList& parent):mParent(parent){};
+			/*virtual*/ LLContextMenu* createMenu();
+		protected:
+			LLParticipantList& mParent;
+		private:
+			bool enableContextMenuItem(const LLSD& userdata);
+			bool checkContextMenuItem(const LLSD& userdata);
+
+			void toggleAllowTextChat(const LLSD& userdata);
+			void toggleMuteText(const LLSD& userdata);
+		
+		};
 
 	private:
 		void onAvatarListDoubleClicked(LLAvatarList* list);
@@ -121,5 +142,7 @@ class LLParticipantList
 		LLPointer<SpeakerClearListener>				mSpeakerClearListener;
 		LLPointer<SpeakerModeratorUpdateListener>	mSpeakerModeratorListener;
 
+		LLParticipantListMenu*    mParticipantListMenu;
+
 		EParticipantSortOrder	mSortOrder;
 };
diff --git a/indra/newview/skins/default/xui/en/menu_participant_list.xml b/indra/newview/skins/default/xui/en/menu_participant_list.xml
new file mode 100644
index 00000000000..802064992e6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_participant_list.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Participant List Context Menu">
+    <menu_item_check
+     label="Mute Text"
+     layout="topleft"
+     name="MuteText">
+        <menu_item_check.on_click
+         function="ParticipantList.ToggleMuteText" />
+        <menu_item_check.on_check
+         function="ParticipantList.CheckItem"
+         parameter="is_muted" />
+        <menu_item_check.on_enable
+         function="ParticipantList.EnableItem"
+         parameter="can_mute_text" />
+    </menu_item_check>
+    <menu_item_check
+     label="Allow text chat"
+     layout="topleft"
+     name="AllowTextChat">
+        <menu_item_check.on_click
+         function="ParticipantList.ToggleAllowTextChat" />
+        <menu_item_check.on_check
+         function="ParticipantList.CheckItem"
+         parameter="is_allowed_text_chat" />
+        <menu_item_check.on_enable
+         function="ParticipantList.EnableItem"
+         parameter="can_allow_text_chat" />
+    </menu_item_check>
+</context_menu>
-- 
GitLab


From b56f497098aca38ce8f0023b297dfd7171f8d7f4 Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Mon, 9 Nov 2009 18:39:26 +0200
Subject: [PATCH 028/557] No ticket. Removed unused includes. Formatted xml.

--HG--
branch : product-engine
---
 indra/newview/llparticipantlist.cpp              |  3 ---
 .../default/xui/en/menu_participant_list.xml     | 16 ++++++++--------
 2 files changed, 8 insertions(+), 11 deletions(-)

diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 21b40e25a06..8155766b491 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -32,9 +32,6 @@
 
 #include "llviewerprecompiledheaders.h"
 
-#include "llmenugl.h"
-#include "lluictrlfactory.h"
-
 // common includes
 #include "lltrans.h"
 #include "llavataractions.h"
diff --git a/indra/newview/skins/default/xui/en/menu_participant_list.xml b/indra/newview/skins/default/xui/en/menu_participant_list.xml
index 802064992e6..c3283c60143 100644
--- a/indra/newview/skins/default/xui/en/menu_participant_list.xml
+++ b/indra/newview/skins/default/xui/en/menu_participant_list.xml
@@ -6,12 +6,12 @@
      label="Mute Text"
      layout="topleft"
      name="MuteText">
-        <menu_item_check.on_click
-         function="ParticipantList.ToggleMuteText" />
-        <menu_item_check.on_check
+        <on_check
          function="ParticipantList.CheckItem"
          parameter="is_muted" />
-        <menu_item_check.on_enable
+        <on_click
+         function="ParticipantList.ToggleMuteText" />
+        <on_enable
          function="ParticipantList.EnableItem"
          parameter="can_mute_text" />
     </menu_item_check>
@@ -19,12 +19,12 @@
      label="Allow text chat"
      layout="topleft"
      name="AllowTextChat">
-        <menu_item_check.on_click
-         function="ParticipantList.ToggleAllowTextChat" />
-        <menu_item_check.on_check
+        <on_check
          function="ParticipantList.CheckItem"
          parameter="is_allowed_text_chat" />
-        <menu_item_check.on_enable
+        <on_click
+         function="ParticipantList.ToggleAllowTextChat" />
+        <on_enable
          function="ParticipantList.EnableItem"
          parameter="can_allow_text_chat" />
     </menu_item_check>
-- 
GitLab


From 9c5d1fd3bd9f9cfb20341b9fb7b1046784206432 Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Mon, 9 Nov 2009 18:50:55 +0200
Subject: [PATCH 029/557] - Reverted fix for normal bug EXT-2016 "Place Profile
 panel isn't resized". The reason is that some unnecessary free space is left
 in Place Profile panel. - Cleaned up obsolete code from Place Profile panel.

--HG--
branch : product-engine
---
 indra/newview/llpanelplaceinfo.cpp                        | 8 +-------
 indra/newview/llpanelplaceinfo.h                          | 1 -
 .../newview/skins/default/xui/en/panel_place_profile.xml  | 2 +-
 3 files changed, 2 insertions(+), 9 deletions(-)

diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp
index 906f8d084bd..963d39de8aa 100644
--- a/indra/newview/llpanelplaceinfo.cpp
+++ b/indra/newview/llpanelplaceinfo.cpp
@@ -41,7 +41,6 @@
 #include "llsdutil_math.h"
 
 #include "lliconctrl.h"
-#include "llscrollcontainer.h"
 #include "lltextbox.h"
 
 #include "llagent.h"
@@ -58,8 +57,7 @@ LLPanelPlaceInfo::LLPanelPlaceInfo()
 :	LLPanel(),
 	mParcelID(),
 	mRequestedID(),
-	mPosRegion(),
-	mMinHeight(0)
+	mPosRegion()
 {}
 
 //virtual
@@ -85,10 +83,6 @@ BOOL LLPanelPlaceInfo::postBuild()
 	mMaturityRatingIcon = getChild<LLIconCtrl>("maturity_icon");
 	mMaturityRatingText = getChild<LLTextBox>("maturity_value");
 
-	LLScrollContainer* scroll_container = getChild<LLScrollContainer>("place_scroll");
-	scroll_container->setBorderVisible(FALSE);
-	mMinHeight = scroll_container->getScrolledViewRect().getHeight();
-
 	return TRUE;
 }
 
diff --git a/indra/newview/llpanelplaceinfo.h b/indra/newview/llpanelplaceinfo.h
index ba32cc4c34c..133933a880d 100644
--- a/indra/newview/llpanelplaceinfo.h
+++ b/indra/newview/llpanelplaceinfo.h
@@ -110,7 +110,6 @@ class LLPanelPlaceInfo : public LLPanel, LLRemoteParcelInfoObserver
 	LLUUID					mRequestedID;
 	LLVector3				mPosRegion;
 	std::string				mCurrentTitle;
-	S32						mMinHeight;
 	INFO_TYPE 				mInfoType;
 
 	LLTextBox*				mTitle;
diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml
index d3eb5482076..b5ae05fe6c3 100644
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -172,7 +172,7 @@
      width="313">
         <panel
          bg_alpha_color="DkGray2"
-         follows="top|left|right"
+         follows="all"
          height="533"
          layout="topleft"
          left="0"
-- 
GitLab


From 7e3cc1374795bc43646aecd29a0d4152b750c68e Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Mon, 9 Nov 2009 19:07:15 +0200
Subject: [PATCH 030/557] Fixed normal bug EXT-2103 (There are no arrow icons
 on the Chiclets overflow buttons), but Erica will have to set appropriate
 icon.

--HG--
branch : product-engine
---
 indra/newview/llchiclet.cpp                   | 55 +++++--------------
 indra/newview/llchiclet.h                     |  3 -
 .../skins/default/textures/textures.xml       |  2 +
 .../skins/default/xui/en/panel_bottomtray.xml | 27 ++++++++-
 4 files changed, 43 insertions(+), 44 deletions(-)

diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 9b27ea47282..0d724e32fb1 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -58,7 +58,6 @@ static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t4("chiclet_im_group")
 static const LLRect CHICLET_RECT(0, 25, 25, 0);
 static const LLRect CHICLET_ICON_RECT(0, 24, 24, 0);
 static const LLRect VOICE_INDICATOR_RECT(25, 25, 45, 0);
-static const LLRect PANEL_SCROLL_BUTTON_RECT(0, 25, 19, 5);
 
 S32 LLNotificationChiclet::mUreadSystemNotifications = 0;
 
@@ -783,8 +782,6 @@ void LLIMGroupChiclet::onMenuItemClicked(const LLSD& user_data)
 LLChicletPanel::Params::Params()
 : chiclet_padding("chiclet_padding")
 , scrolling_offset("scrolling_offset")
-, left_scroll_button("left_scroll_button")
-, right_scroll_button("right_scroll_button")
 , min_width("min_width")
 {
 	chiclet_padding = 3;
@@ -795,22 +792,6 @@ LLChicletPanel::Params::Params()
 		// min_width = 4 chiclets + 3 paddings
 		min_width = 179 + 3*chiclet_padding;
 	}
-
-	left_scroll_button.name("left_scroll");
-	left_scroll_button.label(LLStringUtil::null);
-	left_scroll_button.rect(PANEL_SCROLL_BUTTON_RECT);
-	left_scroll_button.tab_stop(false);
-	left_scroll_button.image_selected(LLUI::getUIImage("bottom_tray_scroll_left.tga"));
-	left_scroll_button.image_unselected(LLUI::getUIImage("bottom_tray_scroll_left.tga"));
-	left_scroll_button.image_hover_selected(LLUI::getUIImage("bottom_tray_scroll_left.tga"));
-
-	right_scroll_button.name("right_scroll");
-	right_scroll_button.label(LLStringUtil::null);
-	right_scroll_button.rect(PANEL_SCROLL_BUTTON_RECT);
-	right_scroll_button.tab_stop(false);
-	right_scroll_button.image_selected(LLUI::getUIImage("bottom_tray_scroll_right.tga"));
-	right_scroll_button.image_unselected(LLUI::getUIImage("bottom_tray_scroll_right.tga"));
-	right_scroll_button.image_hover_selected(LLUI::getUIImage("bottom_tray_scroll_right.tga"));
 };
 
 LLChicletPanel::LLChicletPanel(const Params&p)
@@ -823,23 +804,6 @@ LLChicletPanel::LLChicletPanel(const Params&p)
 , mMinWidth(p.min_width)
 , mShowControls(true)
 {
-	LLButton::Params scroll_button_params = p.left_scroll_button;
-
-	mLeftScrollButton = LLUICtrlFactory::create<LLButton>(scroll_button_params);
-	addChild(mLeftScrollButton);
-	LLTransientFloaterMgr::getInstance()->addControlView(mLeftScrollButton);
-
-	mLeftScrollButton->setClickedCallback(boost::bind(&LLChicletPanel::onLeftScrollClick,this));
-	mLeftScrollButton->setEnabled(false);
-
-	scroll_button_params = p.right_scroll_button;
-	mRightScrollButton = LLUICtrlFactory::create<LLButton>(scroll_button_params);
-	addChild(mRightScrollButton);
-	LLTransientFloaterMgr::getInstance()->addControlView(mRightScrollButton);
-
-	mRightScrollButton->setClickedCallback(boost::bind(&LLChicletPanel::onRightScrollClick,this));
-	mRightScrollButton->setEnabled(false);
-
 	LLPanel::Params panel_params;
 	mScrollArea = LLUICtrlFactory::create<LLPanel>(panel_params,this);
 
@@ -890,6 +854,16 @@ BOOL LLChicletPanel::postBuild()
 	LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLChicletPanel::findChiclet<LLChiclet>, this, _1));
 	LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLChicletPanel::onCurrentVoiceChannelChanged, this, _1));
 
+	mLeftScrollButton=getChild<LLButton>("chicklet_left_scroll_button");
+	LLTransientFloaterMgr::getInstance()->addControlView(mLeftScrollButton);
+	mLeftScrollButton->setClickedCallback(boost::bind(&LLChicletPanel::onLeftScrollClick,this));
+	mLeftScrollButton->setEnabled(false);
+
+	mRightScrollButton=getChild<LLButton>("chicklet_right_scroll_button");
+	LLTransientFloaterMgr::getInstance()->addControlView(mRightScrollButton);
+	mRightScrollButton->setClickedCallback(boost::bind(&LLChicletPanel::onRightScrollClick,this));
+	mRightScrollButton->setEnabled(false);	
+
 	return TRUE;
 }
 
@@ -1065,23 +1039,24 @@ void LLChicletPanel::reshape(S32 width, S32 height, BOOL called_from_parent )
 
 	static const S32 SCROLL_BUTTON_PAD = 5;
 
+	//Needed once- to avoid error at first call of reshape() before postBuild()
+	if(!mLeftScrollButton||!mRightScrollButton)
+		return;
+	
 	LLRect scroll_button_rect = mLeftScrollButton->getRect();
 	mLeftScrollButton->setRect(LLRect(0,height,scroll_button_rect.getWidth(),
 		height - scroll_button_rect.getHeight()));
-
 	scroll_button_rect = mRightScrollButton->getRect();
 	mRightScrollButton->setRect(LLRect(width - scroll_button_rect.getWidth(),height,
 		width, height - scroll_button_rect.getHeight()));
-
 	mScrollArea->setRect(LLRect(scroll_button_rect.getWidth() + SCROLL_BUTTON_PAD,
 		height, width - scroll_button_rect.getWidth() - SCROLL_BUTTON_PAD, 0));
-
 	mShowControls = width > mMinWidth;
 	mScrollArea->setVisible(mShowControls);
 
 	trimChiclets();
-
 	showScrollButtonsIfNeeded();
+
 }
 
 void LLChicletPanel::arrange()
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index 15c9a0bad87..97af82fe2f9 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -677,9 +677,6 @@ class LLChicletPanel : public LLPanel
 		Optional<S32> chiclet_padding,
 					  scrolling_offset;
 
-		Optional<LLButton::Params> left_scroll_button,
-								   right_scroll_button;
-
 		Optional<S32> min_width;
 
 		Params();
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index fba8e0b06c5..0e533b1c0e0 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -30,6 +30,8 @@
   <texture name="Blank" file_name="Blank.png" preload="false" />
 
   <texture name="BottomTray_BG" file_name="bottomtray/BottomTray_BG.png" preload="false" />
+  <texture name="BottomTray_Scroll_Right" file_name="navbar/Arrow_Right_Off.png" preload="false" />
+  <texture name="BottomTray_Scroll_Left" file_name="navbar/Arrow_Left_Off.png" preload="false" />
 
   <texture name="BuyArrow_Off" file_name="navbar/BuyArrow_Off.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0"  />
   <texture name="BuyArrow_Over" file_name="navbar/BuyArrow_Over.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0"  />
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index f833e0a1cbb..ef91c6cd6e2 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -233,7 +233,32 @@
              top="0"
              chiclet_padding="3"
              scrolling_offset="40"
-             width="189" />
+             width="189">
+                <button
+                 auto_resize="true"
+                 follows="right"
+                 height="23"
+                 image_selected="BottomTray_Scroll_Left"
+                 image_unselected="BottomTray_Scroll_Left"
+                 layout="topleft"
+                 name="chicklet_left_scroll_button"
+                 tab_stop="false"
+                 top="3"
+                 visible="false"
+                 width="20" />
+                <button
+                 auto_resize="true"
+                 follows="right"
+                 height="23"
+                 image_selected="BottomTray_Scroll_Right"
+                 image_unselected="BottomTray_Scroll_Right"
+                 layout="topleft"
+                 name="chicklet_right_scroll_button"
+                 tab_stop="false"
+                 top="3"
+                 visible="false"
+                 width="20" />
+            </chiclet_panel>
         </layout_panel>
         <icon
          auto_resize="false"
-- 
GitLab


From 53094499529a665706c3670a628eaf8b77e8c62d Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Mon, 9 Nov 2009 19:14:34 +0200
Subject: [PATCH 031/557] Fixed Nice to have bug EXT-1907-Context menu for
 avatar in Friends tab appears only if right mouse click was performed over
 avatar's icon area. Remove default avatar context menu.

--HG--
branch : product-engine
---
 indra/newview/llavatariconctrl.cpp | 73 ------------------------------
 indra/newview/llavatariconctrl.h   |  5 --
 indra/newview/llpanelpeople.cpp    |  2 +
 3 files changed, 2 insertions(+), 78 deletions(-)

diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index 0ee3e784095..46902006a61 100644
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -195,14 +195,6 @@ LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p)
 	{
 		LLIconCtrl::setValue("default_profile_picture.j2c");
 	}
-
-	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
-
-	registrar.add("AvatarIcon.Action", boost::bind(&LLAvatarIconCtrl::onAvatarIconContextMenuItemClicked, this, _2));
-
-	LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_avatar_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-
-	mPopupMenuHandle = menu->getHandle();
 }
 
 LLAvatarIconCtrl::~LLAvatarIconCtrl()
@@ -212,8 +204,6 @@ LLAvatarIconCtrl::~LLAvatarIconCtrl()
 		LLAvatarPropertiesProcessor::getInstance()->removeObserver(mAvatarId, this);
 		// Name callbacks will be automatically disconnected since LLUICtrl is trackable
 	}
-
-	LLView::deleteViewByHandle(mPopupMenuHandle);
 }
 
 //virtual
@@ -295,32 +285,6 @@ void LLAvatarIconCtrl::processProperties(void* data, EAvatarProcessorType type)
 	}
 }
 
-BOOL LLAvatarIconCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
-{
-	LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
-
-	if(menu)
-	{
-		bool is_friend = LLAvatarTracker::instance().getBuddyInfo(mAvatarId) != NULL;
-		
-		menu->setItemEnabled("Add Friend", !is_friend);
-		menu->setItemEnabled("Remove Friend", is_friend);
-
-		if(gAgentID == mAvatarId)
-		{
-			menu->setItemEnabled("Add Friend", false);
-			menu->setItemEnabled("Send IM", false);
-			menu->setItemEnabled("Remove Friend", false);
-		}
-
-		menu->buildDrawLabels();
-		menu->updateParent(LLMenuGL::sMenuContainer);
-		LLMenuGL::showPopup(this, menu, x, y);
-	}
-
-	return TRUE;
-}
-
 void LLAvatarIconCtrl::nameUpdatedCallback(
 	const LLUUID& id,
 	const std::string& first,
@@ -338,40 +302,3 @@ void LLAvatarIconCtrl::nameUpdatedCallback(
 		}
 	}
 }
-
-void LLAvatarIconCtrl::onAvatarIconContextMenuItemClicked(const LLSD& userdata)
-{
-	std::string level = userdata.asString();
-	LLUUID id = getAvatarId();
-
-	if (level == "profile")
-	{
-		LLAvatarActions::showProfile(id);
-	}
-	else if (level == "im")
-	{
-		std::string name;
-		name.assign(getFirstName());
-		name.append(" ");
-		name.append(getLastName());
-
-		LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id);
-		if (session_id != LLUUID::null)
-		{
-			LLIMFloater::show(session_id);
-		}
-	}
-	else if (level == "add")
-	{
-		std::string name;
-		name.assign(getFirstName());
-		name.append(" ");
-		name.append(getLastName());
-
-		LLAvatarActions::requestFriendshipDialog(id, name);
-	}
-	else if (level == "remove")
-	{
-		LLAvatarActions::removeFriendDialog(id);
-	}
-}
diff --git a/indra/newview/llavatariconctrl.h b/indra/newview/llavatariconctrl.h
index 65b5c86ed54..5eb830df4bc 100644
--- a/indra/newview/llavatariconctrl.h
+++ b/indra/newview/llavatariconctrl.h
@@ -81,8 +81,6 @@ class LLAvatarIconCtrl
 	LLAvatarIconCtrl(const Params&);
 	friend class LLUICtrlFactory;
 
-	void onAvatarIconContextMenuItemClicked(const LLSD& userdata);
-
 public:
 	virtual ~LLAvatarIconCtrl();
 
@@ -91,8 +89,6 @@ class LLAvatarIconCtrl
 	// LLAvatarPropertiesProcessor observer trigger
 	virtual void processProperties(void* data, EAvatarProcessorType type);
 
-	BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
-
 	void nameUpdatedCallback(
 		const LLUUID& id,
 		const std::string& first,
@@ -109,7 +105,6 @@ class LLAvatarIconCtrl
 	LLUUID				mAvatarId;
 	std::string			mFirstName;
 	std::string			mLastName;
-	LLHandle<LLView>	mPopupMenuHandle;
 	bool				mDrawTooltip;
 
 
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index f20ffa75591..fd643cdcc9d 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -508,6 +508,8 @@ BOOL LLPanelPeople::postBuild()
 
 	mNearbyList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
 	mRecentList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
+	mAllFriendList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
+	mOnlineFriendList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
 
 	setSortOrder(mRecentList,		(ESortOrder)gSavedSettings.getU32("RecentPeopleSortOrder"),	false);
 	setSortOrder(mAllFriendList,	(ESortOrder)gSavedSettings.getU32("FriendsSortOrder"),		false);
-- 
GitLab


From a1a08e1846c745d108a59c17d3a93378d01e53dc Mon Sep 17 00:00:00 2001
From: Andrew Polunin <apolunin@productengine.com>
Date: Mon, 9 Nov 2009 19:48:05 +0200
Subject: [PATCH 032/557] fixed normal bug EXT-2171 Group list - View Profile
 icon should only appear on Group item hover

--HG--
branch : product-engine
---
 indra/newview/llgrouplist.cpp | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp
index 010ed23918d..cdb85f5b1c2 100644
--- a/indra/newview/llgrouplist.cpp
+++ b/indra/newview/llgrouplist.cpp
@@ -181,13 +181,9 @@ void LLGroupList::addNewItem(const LLUUID& id, const std::string& name, const LL
 //	item->setContextMenu(mContextMenu);
 
 	item->childSetVisible("info_btn", false);
+	item->childSetVisible("profile_btn", false);
 	item->setGroupIconVisible(mShowIcons);
 
-	if (id.isNull())
-	{
-		item->childSetVisible("profile_btn", false);
-	}
-
 	addItem(item, id, pos);
 
 //	setCommentVisible(false);
@@ -254,7 +250,10 @@ void LLGroupListItem::onMouseEnter(S32 x, S32 y, MASK mask)
 {
 	childSetVisible("hovered_icon", true);
 	if (mGroupID.notNull()) // don't show the info button for the "none" group
+	{
 		mInfoBtn->setVisible(true);
+		childSetVisible("profile_btn", true);
+	}
 
 	LLPanel::onMouseEnter(x, y, mask);
 }
@@ -263,6 +262,7 @@ void LLGroupListItem::onMouseLeave(S32 x, S32 y, MASK mask)
 {
 	childSetVisible("hovered_icon", false);
 	mInfoBtn->setVisible(false);
+	childSetVisible("profile_btn", false);
 
 	LLPanel::onMouseLeave(x, y, mask);
 }
-- 
GitLab


From 34771c04c375afabac4a59573bdd58081081ef8e Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Mon, 9 Nov 2009 20:20:18 +0200
Subject: [PATCH 033/557] - Fix for low bug EXT-1965 "Place Profile: Accordions
 has different alignment".

--HG--
branch : product-engine
---
 .../default/xui/en/panel_place_profile.xml    | 142 +++++++++---------
 1 file changed, 72 insertions(+), 70 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml
index b5ae05fe6c3..e6084202d7c 100644
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -179,7 +179,6 @@
          min_height="300"
          name="scrolling_panel"
          top="0"
-         value="&gt;"
          width="313">
             <texture_picker
              enabled="false"
@@ -338,7 +337,7 @@
                          height="16"
                          image_name="parcel_drk_PG"
                          layout="topleft"
-                         left="20"
+                         left="10"
                          name="rating_icon"
                          top="0"
                          width="18" />
@@ -346,25 +345,25 @@
                          follows="left|top"
                          height="16"
                          layout="topleft"
-                         left_pad="8"
+                         left_pad="12"
                          name="rating_label"
                          value="Rating:"
-                         width="80" />
+                         width="60" />
                         <text
-                         follows="right|top"
+                         follows="left|right|top"
                          height="16"
                          layout="topleft"
                          left_pad="0"
                          name="rating_value"
                          top_delta="0"
                          value="unknown"
-                         width="120" />
+                         width="60" />
                         <icon
                          follows="top|left"
                          height="18"
                          image_name="parcel_drk_Voice"
                          layout="topleft"
-                         left="20"
+                         left="10"
                          name="voice_icon"
                          top_pad="5"
                          width="22" />
@@ -376,9 +375,9 @@
                          name="voice_label"
                          top_delta="0"
                          value="Voice:"
-                         width="76" />
+                         width="60" />
                         <text
-                         follows="right|top"
+                         follows="left|right|top"
                          height="18"
                          layout="topleft"
                          left_pad="0"
@@ -391,7 +390,7 @@
                          height="18"
                          image_name="parcel_drk_Fly"
                          layout="topleft"
-                         left="20"
+                         left="10"
                          name="fly_icon"
                          top_pad="3"
                          width="22" />
@@ -402,9 +401,9 @@
                          left_pad="8"
                          name="fly_label"
                          value="Fly:"
-                         width="76" />
+                         width="60" />
                         <text
-                         follows="right|top"
+                         follows="left|right|top"
                          height="16"
                          layout="topleft"
                          left_pad="0"
@@ -417,7 +416,7 @@
                          height="18"
                          image_name="parcel_drk_Push"
                          layout="topleft"
-                         left="20"
+                         left="10"
                          name="push_icon"
                          top_pad="3"
                          width="22" />
@@ -428,9 +427,9 @@
                          left_pad="8"
                          name="push_label"
                          value="Push:"
-                         width="76" />
+                         width="60" />
                         <text
-                         follows="right|top"
+                         follows="left|right|top"
                          height="14"
                          layout="topleft"
                          left_pad="0"
@@ -443,7 +442,7 @@
                          height="18"
                          image_name="parcel_drk_Build"
                          layout="topleft"
-                         left="20"
+                         left="10"
                          name="build_icon"
                          top_pad="3"
                          width="22" />
@@ -454,9 +453,9 @@
                          left_pad="8"
                          name="build_label"
                          value="Build:"
-                         width="76" />
+                         width="60" />
                         <text
-                         follows="right|top"
+                         follows="left|right|top"
                          height="15"
                          layout="topleft"
                          left_pad="0"
@@ -469,7 +468,7 @@
                          height="18"
                          image_name="parcel_drk_Scripts"
                          layout="topleft"
-                         left="20"
+                         left="10"
                          name="scripts_icon"
                          top_pad="3"
                          width="22" />
@@ -480,9 +479,9 @@
                          left_pad="8"
                          name="scripts_label"
                          value="Scripts:"
-                         width="76" />
+                         width="60" />
                         <text
-                         follows="right|top"
+                         follows="left|right|top"
                          height="14"
                          layout="topleft"
                          left_pad="0"
@@ -495,7 +494,7 @@
                          height="18"
                          image_name="parcel_drk_Damage"
                          layout="topleft"
-                         left="20"
+                         left="10"
                          name="damage_icon"
                          top_pad="7"
                          width="22" />
@@ -506,9 +505,9 @@
                          left_pad="8"
                          name="damage_label"
                          value="Damage:"
-                         width="76" />
+                         width="60" />
                         <text
-                         follows="right|top"
+                         follows="left|right|top"
                          height="14"
                          layout="topleft"
                          left_pad="0"
@@ -552,7 +551,7 @@
                          name="region_name_label"
                          top_pad="5"
                          value="Region:"
-                         width="80" />
+                         width="90" />
                         <text
                          follows="left|top|right"
                          height="15"
@@ -561,7 +560,7 @@
                          name="region_name"
                          top_delta="0"
                          value="Mooseland"
-                         width="195" />
+                         width="187" />
                         <text
                          follows="left|top"
                          height="15"
@@ -570,7 +569,7 @@
                          name="region_type_label"
                          top_pad="5"
                          value="Type:"
-                         width="80" />
+                         width="90" />
                         <text
                          follows="left|top|right"
                          height="15"
@@ -579,7 +578,7 @@
                          name="region_type"
                          top_delta="0"
                          value="Moose"
-                         width="195" />
+                         width="187" />
                         <text
                          follows="left|top"
                          height="15"
@@ -588,7 +587,7 @@
                          name="region_rating_label"
                          top_pad="7"
                          value="Rating:"
-                         width="80" />
+                         width="90" />
                         <icon
                          follows="top|left"
                          height="16"
@@ -604,7 +603,7 @@
                          left_pad="10"
                          name="region_rating"
                          value="Explicit"
-                         width="100" />
+                         width="159" />
                         <text
                          follows="left|top"
                          height="15"
@@ -613,7 +612,7 @@
                          name="region_owner_label"
                          top_pad="5"
                          value="Owner:"
-                         width="80" />
+                         width="90" />
                         <text
                          follows="left|top|right"
                          height="15"
@@ -622,7 +621,7 @@
                          name="region_owner"
                          top_delta="0"
                          value="moose Van Moose"
-                         width="195" />
+                         width="187" />
                         <text
                          follows="left|top"
                          height="15"
@@ -631,7 +630,7 @@
                          name="region_group_label"
                          top_pad="5"
                          value="Group:"
-                         width="80" />
+                         width="90" />
                         <text
                          follows="left|top|right"
                          height="15"
@@ -640,7 +639,7 @@
                          name="region_group"
                          top_delta="0"
                          use_ellipses="true"
-                         width="195">
+                         width="187">
                             The Mighty Moose of mooseville soundvillemoose
                         </text>
                         <button
@@ -678,15 +677,15 @@
                          name="estate_name_label"
                          top_pad="5"
                          value="Estate:"
-                         width="80" />
+                         width="90" />
                         <text
                          follows="left|top|right"
                          height="15"
                          layout="topleft"
-                         left="90"
+                         left_pad="0"
                          name="estate_name"
                          top_delta="0"
-                         width="160" />
+                         width="187" />
                         <text
                          follows="left|top"
                          height="15"
@@ -695,15 +694,15 @@
                          name="estate_rating_label"
                          top_pad="5"
                          value="Rating:"
-                         width="80" />
+                         width="90" />
                         <text
                          follows="left|top|right"
                          height="15"
                          layout="topleft"
-                         left="90"
+                         left_pad="0"
                          name="estate_rating"
                          top_delta="0"
-                         width="160" />
+                         width="187" />
                         <text
                          follows="left|top"
                          height="15"
@@ -712,15 +711,15 @@
                          name="estate_owner_label"
                          top_pad="5"
                          value="Owner:"
-                         width="80" />
+                         width="90" />
                         <text
                          follows="left|top|right"
                          height="15"
                          layout="topleft"
-                         left="90"
+                         left_pad="0"
                          name="estate_owner"
                          top_delta="0"
-                         width="160" />
+                         width="187" />
                         <text
                          follows="left|top"
                          height="15"
@@ -729,7 +728,7 @@
                          name="covenant_label"
                          top_pad="5"
                          value="Covenant:"
-                         width="220" />
+                         width="277" />
                         <text_editor
                          bg_focus_color="DkGray2"
                          bg_readonly_color="DkGray2"
@@ -742,7 +741,8 @@
                          name="covenant"
                          read_only="true"
                          top_pad="0"
-                         width="280" />
+                         width="277"
+                         word_wrap="true" />
                     </panel>
                 </accordion_tab>
                 <accordion_tab
@@ -765,15 +765,15 @@
                          name="sales_price_label"
                          top_pad="5"
                          value="Price:"
-                         width="100" />
+                         width="90" />
                         <text
                          follows="left|top|right"
                          height="15"
                          layout="topleft"
-                         left="110"
+                         left_pad="0"
                          name="sales_price"
                          top_delta="0"
-                         width="140" />
+                         width="187" />
                         <text
                          follows="left|top"
                          height="15"
@@ -782,15 +782,15 @@
                          name="area_label"
                          top_pad="5"
                          value="Area:"
-                         width="100" />
+                         width="90" />
                         <text
                          follows="left|top|right"
                          height="15"
                          layout="topleft"
-                         left="110"
+                         left_pad="0"
                          name="area"
                          top_delta="0"
-                         width="140" />
+                         width="187" />
                         <text
                          follows="left|top"
                          height="15"
@@ -799,15 +799,15 @@
                          name="traffic_label"
                          top_pad="5"
                          value="Traffic:"
-                         width="100" />
+                         width="90" />
                         <text
                          follows="left|top|right"
                          height="15"
                          layout="topleft"
-                         left="110"
+                         left_pad="0"
                          name="traffic"
                          top_delta="0"
-                         width="140" />
+                         width="187" />
                         <text
                          follows="left|top"
                          height="15"
@@ -816,15 +816,15 @@
                          name="primitives_label"
                          top_pad="5"
                          value="Primitives:"
-                         width="100" />
+                         width="90" />
                         <text
                          follows="left|top|right"
                          height="15"
                          layout="topleft"
-                         left="110"
+                         left_pad="0"
                          name="primitives"
                          top_delta="0"
-                         width="140" />
+                         width="187" />
                         <text
                          follows="left|top"
                          height="15"
@@ -833,15 +833,15 @@
                          name="parcel_scripts_label"
                          top_pad="5"
                          value="Scripts:"
-                         width="100" />
+                         width="90" />
                         <text
                          follows="left|top|right"
                          height="15"
                          layout="topleft"
-                         left="110"
+                         left_pad="0"
                          name="parcel_scripts"
                          top_delta="0"
-                         width="140" />
+                         width="187" />
                         <text
                          follows="left|top"
                          height="15"
@@ -850,15 +850,15 @@
                          name="terraform_limits_label"
                          top_pad="5"
                          value="Terraform limits:"
-                         width="100" />
+                         width="90" />
                         <text
                          follows="left|top|right"
                          height="15"
                          layout="topleft"
-                         left="110"
+                         left_pad="0"
                          name="terraform_limits"
                          top_delta="0"
-                         width="140" />
+                         width="187" />
                         <text
                          follows="left|top"
                          height="15"
@@ -867,7 +867,7 @@
                          name="subdivide_label"
                          top_pad="5"
                          value="Subdivide/Join ability:"
-                         width="220" />
+                         width="277" />
                         <text_editor
                          bg_focus_color="DkGray2"
                          bg_readonly_color="DkGray2"
@@ -879,7 +879,8 @@
                          name="subdivide"
                          read_only="true"
                          top_pad="5"
-                         width="245" />
+                         width="277"
+                         word_wrap="true" />
                         <text
                          follows="left|top"
                          height="15"
@@ -888,7 +889,7 @@
                          name="resale_label"
                          top_pad="5"
                          value="ReSale ability:"
-                         width="80" />
+                         width="277" />
                         <text_editor
                          bg_focus_color="DkGray2"
                          bg_readonly_color="DkGray2"
@@ -900,7 +901,8 @@
                          name="resale"
                          read_only="true"
                          top_pad="5"
-                         width="245" />
+                         width="277"
+                         word_wrap="true" />
                         <text
                          follows="left|top"
                          height="15"
@@ -909,15 +911,15 @@
                          name="sale_to_label"
                          top_pad="5"
                          value="For sale to:"
-                         width="80" />
+                         width="90" />
                         <text
                          follows="left|top|right"
                          height="15"
                          layout="topleft"
-                         left="90"
+                         left_pad="0"
                          name="sale_to"
                          top_delta="0"
-                         width="160" />
+                         width="187" />
                     </panel>
                 </accordion_tab>
             </accordion>
-- 
GitLab


From 31cc68ecd373d4deae85bbd223f5d47ffef34a24 Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Mon, 9 Nov 2009 22:04:23 +0200
Subject: [PATCH 034/557] Fixed normal bug EXT-2327 "Incoming call dialog
 crashes after logout". - Added NULL pointer checks.

--HG--
branch : product-engine
---
 indra/newview/llimview.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index fdf119fbeeb..d91fc1a06b3 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1157,6 +1157,9 @@ void LLIncomingCallDialog::onStartIM(void* user_data)
 
 void LLIncomingCallDialog::processCallResponse(S32 response)
 {
+	if (!gIMMgr)
+		return;
+
 	LLUUID session_id = mPayload["session_id"].asUUID();
 	EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
 	LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)mPayload["inv_type"].asInteger();
@@ -1254,6 +1257,9 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
 
 bool inviteUserResponse(const LLSD& notification, const LLSD& response)
 {
+	if (!gIMMgr)
+		return false;
+
 	const LLSD& payload = notification["payload"];
 	LLUUID session_id = payload["session_id"].asUUID();
 	EInstantMessage type = (EInstantMessage)payload["type"].asInteger();
-- 
GitLab


From ff8fc7309a88b970eae2b4621724a2b24e9413fe Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Mon, 9 Nov 2009 22:23:28 +0200
Subject: [PATCH 035/557] Fixed EXT-2104 (Chiclets overflow buttons overlap
 lower tray elements)- in this changeset and  in 4466:3ad0401e16a5. Here I
 changed height of buuttons.

--HG--
branch : product-engine
---
 indra/newview/llchiclet.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 0d724e32fb1..fe4859ead00 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -1044,11 +1044,11 @@ void LLChicletPanel::reshape(S32 width, S32 height, BOOL called_from_parent )
 		return;
 	
 	LLRect scroll_button_rect = mLeftScrollButton->getRect();
-	mLeftScrollButton->setRect(LLRect(0,height,scroll_button_rect.getWidth(),
-		height - scroll_button_rect.getHeight()));
+	mLeftScrollButton->setRect(LLRect(0,scroll_button_rect.mTop,scroll_button_rect.getWidth(),
+		scroll_button_rect.mBottom));
 	scroll_button_rect = mRightScrollButton->getRect();
-	mRightScrollButton->setRect(LLRect(width - scroll_button_rect.getWidth(),height,
-		width, height - scroll_button_rect.getHeight()));
+	mRightScrollButton->setRect(LLRect(width - scroll_button_rect.getWidth(),scroll_button_rect.mTop,
+		width, scroll_button_rect.mBottom));
 	mScrollArea->setRect(LLRect(scroll_button_rect.getWidth() + SCROLL_BUTTON_PAD,
 		height, width - scroll_button_rect.getWidth() - SCROLL_BUTTON_PAD, 0));
 	mShowControls = width > mMinWidth;
-- 
GitLab


From 2b5faa0b9cac3736b9d96a68cd13e05ee39ab7d1 Mon Sep 17 00:00:00 2001
From: "Mark Palange (Mani)" <palange@lindenlab.com>
Date: Mon, 9 Nov 2009 13:12:43 -0800
Subject: [PATCH 036/557] Changed SRV Request timeout to respond with an event
 instead of an error

---
 indra/viewer_components/login/lllogin.cpp | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp
index 7a30315b9a8..ea1e3ff3f99 100644
--- a/indra/viewer_components/login/lllogin.cpp
+++ b/indra/viewer_components/login/lllogin.cpp
@@ -141,9 +141,14 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
         LL_INFOS("LLLogin") << "Requesting SRV record from " << uri << LL_ENDL;
 
         // *NOTE:Mani - Completely arbitrary timeout value for SRV request.
-        filter.errorAfter(5, "SRV Request timed out!");
-
-        // Make request
+        // filter.errorAfter(5, "SRV Request timed out!");
+	
+		// 
+		F32 seconds_to_timeout = 5.0f;
+		filter.actionAfter(seconds_to_timeout, 
+			sendProgressEvent("offline", "fail.login", LLSD()));
+
+		// Make request
         LLSD request;
         request["op"] = "rewriteURI";
         request["uri"] = uri;
-- 
GitLab


From 5292a3181191179de180fd36bd248a3dba6113b1 Mon Sep 17 00:00:00 2001
From: angela <angela@lindenlab.com>
Date: Tue, 10 Nov 2009 14:45:10 +0800
Subject: [PATCH 037/557] EXT-2078

---
 .../newview/skins/default/xui/en/panel_bottomtray.xml | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index c5e129cf2fc..dbbf7ebede6 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -203,7 +203,7 @@
          name="snapshot_panel"
          width="40">
             <button
-         follows="left|right"
+			 follows="left|right"
              height="23"
              left="0"
              label=""
@@ -212,9 +212,12 @@
              width="36"
              top="3"
              image_overlay="Snapshot_Off"
-            tool_tip="Take snapshot"
-                 />
-        </layout_panel>
+             tool_tip="Take snapshot">
+				<button.commit_callback
+				 function="Floater.Toggle"
+				 parameter="snapshot" />
+			</button>
+		</layout_panel>
         <layout_panel
          mouse_opaque="false"
          follows="left|right"
-- 
GitLab


From 9dacb6b79e8c7568e7a9aaa9cb12090383241a47 Mon Sep 17 00:00:00 2001
From: Andrew Polunin <apolunin@productengine.com>
Date: Tue, 10 Nov 2009 09:32:39 +0200
Subject: [PATCH 038/557] fixed normal bug EXT-1649 Groups you chatted in
 recently show up in the Recent People tab

--HG--
branch : product-engine
---
 indra/newview/llrecentpeople.cpp | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llrecentpeople.cpp b/indra/newview/llrecentpeople.cpp
index b491c7e1092..bd46b5b56aa 100644
--- a/indra/newview/llrecentpeople.cpp
+++ b/indra/newview/llrecentpeople.cpp
@@ -33,6 +33,7 @@
 #include "llviewerprecompiledheaders.h"
 
 #include "llrecentpeople.h"
+#include "llgroupmgr.h"
 
 #include "llagent.h"
 
@@ -43,12 +44,18 @@ bool LLRecentPeople::add(const LLUUID& id)
 	if (id == gAgent.getID())
 		return false;
 
-	LLDate date_added = LLDate::now();
+	bool is_not_group_id = LLGroupMgr::getInstance()->getGroupData(id) == NULL;
 
-	//[] instead of insert to replace existing id->date with new date value
-	mPeople[id] = date_added;
-	mChangedSignal();
-	return true;
+	if (is_not_group_id)
+	{
+		LLDate date_added = LLDate::now();
+
+		//[] instead of insert to replace existing id->date with new date value
+		mPeople[id] = date_added;
+		mChangedSignal();
+	}
+
+	return is_not_group_id;
 }
 
 bool LLRecentPeople::contains(const LLUUID& id) const
-- 
GitLab


From e808f41bafed708df0bee494193cbcbfb245c620 Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Tue, 10 Nov 2009 11:37:10 +0200
Subject: [PATCH 039/557] Fixed line endings from 4df44e70aa9d

--HG--
branch : product-engine
---
 indra/newview/llchiclet.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index fe4859ead00..97447a85c65 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -1047,8 +1047,8 @@ void LLChicletPanel::reshape(S32 width, S32 height, BOOL called_from_parent )
 	mLeftScrollButton->setRect(LLRect(0,scroll_button_rect.mTop,scroll_button_rect.getWidth(),
 		scroll_button_rect.mBottom));
 	scroll_button_rect = mRightScrollButton->getRect();
-	mRightScrollButton->setRect(LLRect(width - scroll_button_rect.getWidth(),scroll_button_rect.mTop,
-		width, scroll_button_rect.mBottom));
+	mRightScrollButton->setRect(LLRect(width - scroll_button_rect.getWidth(),scroll_button_rect.mTop,
+		width, scroll_button_rect.mBottom));
 	mScrollArea->setRect(LLRect(scroll_button_rect.getWidth() + SCROLL_BUTTON_PAD,
 		height, width - scroll_button_rect.getWidth() - SCROLL_BUTTON_PAD, 0));
 	mShowControls = width > mMinWidth;
-- 
GitLab


From f15767bbef4e0a87aa032e265b3a0a8d4db907e1 Mon Sep 17 00:00:00 2001
From: Yuri Chebotarev <ychebotarev@productengine.com>
Date: Tue, 10 Nov 2009 12:43:17 +0200
Subject: [PATCH 040/557] merge

--HG--
branch : product-engine
---
 indra/newview/llsidetray.cpp | 43 ++++++++++++++++++++++++++++++++----
 indra/newview/llsidetray.h   |  2 ++
 2 files changed, 41 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index a11ee05532f..b25dea92cce 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -460,16 +460,51 @@ void	LLSideTray::createButtons	()
 	}
 }
 
+void		LLSideTray::processTriState ()
+{
+	if(mCollapsed)
+		expandSideBar();
+	else
+	{
+		//!!!!!!!!!!!!!!!!!
+		//** HARDCODED!!!!!
+		//!!!!!!!!!!!!!!!!!
+
+		//there is no common way to determine "default" panel for tab
+		//so default panels for now will be hardcoded
+
+		//hardcoded for people tab and profile tab
+
+		/*if(mActiveTab == getTab("sidebar_people"))
+		{
+			LLSideTrayPanelContainer* container = findChild<LLSideTrayPanelContainer>("panel_container");
+			if(container && container->getCurrentPanelIndex()>0)
+			{
+				container->onOpen(LLSD().insert("sub_panel_name","panel_people"));
+			}
+			else
+				collapseSideBar();
+		}
+		else if(mActiveTab == getTab("sidebar_me"))
+		{
+			LLTabContainer* tab_container = findChild<LLTabContainer>("tabs");
+			if(tab_container && tab_container->getCurrentPanelIndex()>0)
+				tab_container->selectFirstTab();
+			else
+				collapseSideBar();
+		}
+		else*/
+			collapseSideBar();
+	}
+}
+
 void		LLSideTray::onTabButtonClick(string name)
 {
 	LLSideTrayTab* side_bar = getTab(name);
 
 	if(side_bar == mActiveTab)
 	{
-		if(mCollapsed)
-			expandSideBar();
-		else
-			collapseSideBar();
+		processTriState ();
 		return;
 	}
 	selectTabByName	(name);
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index b49251ec79b..246979ac54b 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -135,6 +135,8 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>
 	S32			getTrayWidth();
 
 	void		resetPanelRect	();
+
+	void		processTriState ();
 	
 
 protected:
-- 
GitLab


From d04539f74a2922db40a6f90f16929b29056f666b Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Tue, 10 Nov 2009 13:21:02 +0200
Subject: [PATCH 041/557] Update for major task EXT-2251 - Implement panels for
 creating, editing and viewing Classifieds. Fixed bugs, improved
 functionality.

--HG--
branch : product-engine
---
 indra/newview/llpanelclassified.cpp           | 73 ++++++++++---------
 indra/newview/llpanelclassified.h             | 24 +++---
 indra/newview/llpanelpicks.cpp                | 50 ++++++++-----
 indra/newview/llpanelpicks.h                  |  4 +
 indra/newview/llpanelprofile.cpp              |  6 +-
 .../default/xui/en/panel_classified_info.xml  |  8 ++
 6 files changed, 97 insertions(+), 68 deletions(-)

diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index b118c6813cb..f03e7da2ece 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -1147,11 +1147,9 @@ void LLPanelClassified::setDefaultAccessCombo()
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 
-
-std::string SET_LOCATION_NOTICE1("(will update after save)");
-
 LLPanelClassifiedInfo::LLPanelClassifiedInfo()
  : LLPanel()
+ , mInfoLoaded(false)
 {
 }
 
@@ -1204,6 +1202,7 @@ void LLPanelClassifiedInfo::onOpen(const LLSD& key)
 
 	LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(), this);
 	LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(getClassifiedId());
+	setInfoLoaded(false);
 }
 
 void LLPanelClassifiedInfo::processProperties(void* data, EAvatarProcessorType type)
@@ -1211,19 +1210,25 @@ void LLPanelClassifiedInfo::processProperties(void* data, EAvatarProcessorType t
 	if(APT_CLASSIFIED_INFO == type)
 	{
 		LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data);
-		if(data && getClassifiedId() == c_info->classified_id)
+		if(c_info && getClassifiedId() == c_info->classified_id)
 		{
 			setClassifiedName(c_info->name);
 			setDescription(c_info->description);
 			setSnapshotId(c_info->snapshot_id);
+			setParcelId(c_info->parcel_id);
 			setClassifiedLocation(createLocationText(c_info->parcel_name, c_info->sim_name, c_info->pos_global));
 			childSetValue("category", LLClassifiedInfo::sCategories[c_info->category]);
 
+			static std::string mature_str = getString("type_mature");
+			static std::string pg_str = getString("type_pg");
+
 			bool mature = is_cf_mature(c_info->flags);
-			childSetValue("content_type", mature ? "Mature" : "PG Content");
+			childSetValue("content_type", mature ? mature_str : pg_str);
 			childSetValue("auto_renew", is_cf_auto_renew(c_info->flags));
 
 			childSetTextArg("price_for_listing", "[PRICE]", llformat("%d", c_info->price_for_listing));
+
+			setInfoLoaded(true);
 		}
 	}
 }
@@ -1240,6 +1245,9 @@ void LLPanelClassifiedInfo::resetData()
 
 void LLPanelClassifiedInfo::resetControls()
 {
+	childSetValue("category", LLStringUtil::null);
+	childSetValue("content_type", LLStringUtil::null);
+
 	if(getAvatarId() == gAgent.getID())
 	{
 		childSetEnabled("edit_btn", TRUE);
@@ -1327,9 +1335,12 @@ void LLPanelClassifiedInfo::onExit()
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 
+static const S32 CB_ITEM_MATURE = 0;
+static const S32 CB_ITEM_PG	   = 1;
+static std::string SET_LOCATION_NOTICE("(will update after save)");
+
 LLPanelClassifiedEdit::LLPanelClassifiedEdit()
  : LLPanelClassifiedInfo()
- , mSnapshotCtrl(NULL)
  , mNewClassified(false)
 {
 }
@@ -1350,8 +1361,8 @@ BOOL LLPanelClassifiedEdit::postBuild()
 {
 	LLPanelClassifiedInfo::postBuild();
 
-	mSnapshotCtrl = getChild<LLTextureCtrl>("classified_snapshot");
-	mSnapshotCtrl->setOnSelectCallback(boost::bind(&LLPanelClassifiedEdit::onSnapshotChanged, this, _1));
+	LLTextureCtrl* snapshot = getChild<LLTextureCtrl>("classified_snapshot");
+	snapshot->setOnSelectCallback(boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this));
 
 	LLLineEditor* line_edit = getChild<LLLineEditor>("classified_name");
 	line_edit->setKeystrokeCallback(boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this), NULL);
@@ -1365,15 +1376,12 @@ BOOL LLPanelClassifiedEdit::postBuild()
 		iter != LLClassifiedInfo::sCategories.end();
 		iter++)
 	{
-		combobox->add(LLTrans::getString(iter->second), (void *)((intptr_t)iter->first), ADD_BOTTOM);
+		combobox->add(LLTrans::getString(iter->second));
 	}
-	
-	combobox->setCurrentByIndex(0);
-	combobox->setCommitCallback(boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this));
 
-	combobox = getChild<LLComboBox>("content_type");
 	combobox->setCommitCallback(boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this));
 
+	childSetCommitCallback("content_type", boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this), NULL);
 	childSetCommitCallback("price_for_listing", boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this), NULL);
 	childSetCommitCallback("auto_renew", boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this), NULL);
 
@@ -1417,7 +1425,8 @@ void LLPanelClassifiedEdit::onOpen(const LLSD& key)
 		childSetValue("classified_name", makeClassifiedName());
 		childSetValue("classified_desc", desc);
 		setSnapshotId(snapshot_id);
-		setClassifiedLocation(createLocationText(region_name, LLStringUtil::null, getPosGlobal()));
+		setClassifiedLocation(createLocationText(SET_LOCATION_NOTICE, region_name, getPosGlobal()));
+		// server will set valid parcel id
 		setParcelId(LLUUID::null);
 
 		enableSaveButton(true);
@@ -1431,6 +1440,7 @@ void LLPanelClassifiedEdit::onOpen(const LLSD& key)
 	}
 
 	resetDirty();
+	setInfoLoaded(false);
 }
 
 void LLPanelClassifiedEdit::processProperties(void* data, EAvatarProcessorType type)
@@ -1438,11 +1448,14 @@ void LLPanelClassifiedEdit::processProperties(void* data, EAvatarProcessorType t
 	if(APT_CLASSIFIED_INFO == type)
 	{
 		LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data);
-		if(data && getClassifiedId() == c_info->classified_id)
+		if(c_info && getClassifiedId() == c_info->classified_id)
 		{
 			setClassifiedName(c_info->name);
 			setDescription(c_info->description);
 			setSnapshotId(c_info->snapshot_id);
+		//	setParcelId(c_info->parcel_id);
+			setPosGlobal(c_info->pos_global);
+
 			setClassifiedLocation(createLocationText(c_info->parcel_name, c_info->sim_name, c_info->pos_global));
 			getChild<LLComboBox>("category")->setCurrentByIndex(c_info->category + 1);
 			getChild<LLComboBox>("category")->resetDirty();
@@ -1450,11 +1463,12 @@ void LLPanelClassifiedEdit::processProperties(void* data, EAvatarProcessorType t
 			bool mature = is_cf_mature(c_info->flags);
 			bool auto_renew = is_cf_auto_renew(c_info->flags);
 
-			getChild<LLComboBox>("content_type")->setCurrentByIndex(mature ? 0 : 1);
+			getChild<LLComboBox>("content_type")->setCurrentByIndex(mature ? CB_ITEM_MATURE : CB_ITEM_PG);
 			childSetValue("auto_renew", auto_renew);
 			childSetValue("price_for_listing", c_info->price_for_listing);
 
 			resetDirty();
+			setInfoLoaded(true);
 		}
 	}
 }
@@ -1467,11 +1481,11 @@ BOOL LLPanelClassifiedEdit::isDirty() const
 	BOOL dirty = false;
 
 	dirty |= LLPanelClassifiedInfo::isDirty();
-	dirty |= mSnapshotCtrl->isDirty();
-	dirty |= getChild<LLLineEditor>("classified_name")->isDirty();
-	dirty |= getChild<LLTextEditor>("classified_desc")->isDirty();
-	dirty |= getChild<LLComboBox>("category")->isDirty();
-	dirty |= getChild<LLComboBox>("content_type")->isDirty();
+	dirty |= getChild<LLUICtrl>("classified_snapshot")->isDirty();
+	dirty |= getChild<LLUICtrl>("classified_name")->isDirty();
+	dirty |= getChild<LLUICtrl>("classified_desc")->isDirty();
+	dirty |= getChild<LLUICtrl>("category")->isDirty();
+	dirty |= getChild<LLUICtrl>("content_type")->isDirty();
 	dirty |= getChild<LLUICtrl>("auto_renew")->isDirty();
 	dirty |= getChild<LLUICtrl>("price_for_listing")->isDirty();
 
@@ -1481,7 +1495,7 @@ BOOL LLPanelClassifiedEdit::isDirty() const
 void LLPanelClassifiedEdit::resetDirty()
 {
 	LLPanelClassifiedInfo::resetDirty();
-	mSnapshotCtrl->resetDirty();
+	getChild<LLUICtrl>("classified_snapshot")->resetDirty();
 	getChild<LLUICtrl>("classified_name")->resetDirty();
 	getChild<LLUICtrl>("classified_desc")->resetDirty();
 	getChild<LLUICtrl>("category")->resetDirty();
@@ -1546,7 +1560,7 @@ U8 LLPanelClassifiedEdit::getClassifiedFlags()
 	bool auto_renew = childGetValue("auto_renew").asBoolean();
 
 	LLComboBox* content_cb = getChild<LLComboBox>("content_type");
-	bool mature = content_cb->getCurrentIndex() == 0;
+	bool mature = content_cb->getCurrentIndex() == CB_ITEM_MATURE;
 	
 	return pack_classified_flags_request(auto_renew, false, mature, false);;
 }
@@ -1595,7 +1609,7 @@ void LLPanelClassifiedEdit::onClickSetLocation()
 		region_name = region->getName();
 	}
 
-	setClassifiedLocation(createLocationText(region_name, LLStringUtil::null, getPosGlobal()));
+	setClassifiedLocation(createLocationText(SET_LOCATION_NOTICE, region_name, getPosGlobal()));
 
 	// mark classified as dirty
 	setValue(LLSD());
@@ -1603,11 +1617,6 @@ void LLPanelClassifiedEdit::onClickSetLocation()
 	onClassifiedChanged();
 }
 
-void LLPanelClassifiedEdit::onSnapshotChanged(LLUICtrl* ctrl)
-{
-
-}
-
 void LLPanelClassifiedEdit::onClassifiedChanged()
 {
 	if(isDirty())
@@ -1623,12 +1632,6 @@ void LLPanelClassifiedEdit::onClassifiedChanged()
 void LLPanelClassifiedEdit::onClickSave()
 {
 	sendUpdate();
-
-//	LLAvatarPropertiesProcessor::getInstance()->sendAvatarClassifiedsRequest(getAvatarId());
-
-	LLSD params;
-	params["action"] = "save_classified";
-	notifyParent(params);
 }
 
 //EOF
diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h
index eccc83cf539..7e384824ab4 100644
--- a/indra/newview/llpanelclassified.h
+++ b/indra/newview/llpanelclassified.h
@@ -208,8 +208,6 @@ class LLPanelClassifiedInfo : public LLPanel, public LLAvatarPropertiesObserver
 
 	virtual ~LLPanelClassifiedInfo();
 
-	virtual void setExitCallback(const commit_callback_t& cb);
-
 	/*virtual*/ void onOpen(const LLSD& key);
 
 	/*virtual*/ BOOL postBuild();
@@ -218,7 +216,7 @@ class LLPanelClassifiedInfo : public LLPanel, public LLAvatarPropertiesObserver
 
 	virtual void setAvatarId(const LLUUID& avatar_id) { mAvatarId = avatar_id; }
 
-	LLUUID& getAvatarId() { return mAvatarId; }
+	virtual LLUUID& getAvatarId() { return mAvatarId; }
 
 	virtual void setSnapshotId(const LLUUID& id);
 
@@ -242,6 +240,16 @@ class LLPanelClassifiedInfo : public LLPanel, public LLAvatarPropertiesObserver
 
 	virtual LLVector3d& getPosGlobal() { return mPosGlobal; }
 
+	virtual void setParcelId(const LLUUID& id) { mParcelId = id; }
+
+	virtual LLUUID getParcelId() { return mParcelId; }
+
+	virtual bool getInfoLoaded() { return mInfoLoaded; }
+
+	virtual void setInfoLoaded(bool loaded) { mInfoLoaded = loaded; }
+
+	virtual void setExitCallback(const commit_callback_t& cb);
+
 protected:
 
 	LLPanelClassifiedInfo();
@@ -265,6 +273,8 @@ class LLPanelClassifiedInfo : public LLPanel, public LLAvatarPropertiesObserver
 	LLUUID mAvatarId;
 	LLUUID mClassifiedId;
 	LLVector3d mPosGlobal;
+	LLUUID mParcelId;
+	bool mInfoLoaded;
 };
 
 class LLPanelClassifiedEdit : public LLPanelClassifiedInfo
@@ -305,23 +315,15 @@ class LLPanelClassifiedEdit : public LLPanelClassifiedInfo
 
 	std::string makeClassifiedName();
 
-	void setParcelId(const LLUUID& id) { mParcelId = id; }
-
-	LLUUID getParcelId() { return mParcelId; }
-
 	S32 getPriceForListing();
 
 	U8 getClassifiedFlags();
 
 	void onClickSetLocation();
-	void onSnapshotChanged(LLUICtrl* ctrl);
 	void onClassifiedChanged();
 	void onClickSave();
 
 private:
-	LLTextureCtrl* mSnapshotCtrl;
-
-	LLUUID mParcelId;
 	bool mNewClassified;
 };
 
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 7b7667c147c..2129fe473af 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -73,9 +73,19 @@ static LLRegisterPanelClassWrapper<LLPanelPicks> t_panel_picks("panel_picks");
 
 //////////////////////////////////////////////////////////////////////////
 
+/**
+ * Copy&Pasted from old LLPanelClassified. This class does nothing at the moment.
+ * Subscribing to "classifiedclickthrough" removes a few warnings.
+ */
 class LLClassifiedClickThrough : public LLDispatchHandler
 {
 public:
+
+	// "classifiedclickthrough"
+	// strings[0] = classified_id
+	// strings[1] = teleport_clicks
+	// strings[2] = map_clicks
+	// strings[3] = profile_clicks
 	virtual bool operator()(
 		const LLDispatcher* dispatcher,
 		const std::string& key,
@@ -85,15 +95,6 @@ class LLClassifiedClickThrough : public LLDispatchHandler
 		if (strings.size() != 4) 
 			return false;
 
-		// 		LLUUID classified_id(strings[0]);
-		// 		S32 teleport_clicks = atoi(strings[1].c_str());
-		// 		S32 map_clicks = atoi(strings[2].c_str());
-		// 		S32 profile_clicks = atoi(strings[3].c_str());
-		// 		LLPanelClassified::setClickThrough(classified_id, teleport_clicks,
-		// 			map_clicks,
-		// 			profile_clicks,
-		// 			false);
-
 		return true;
 	}
 };
@@ -115,10 +116,11 @@ LLPanelPicks::LLPanelPicks()
 	mPicksAccTab(NULL),
 	mClassifiedsAccTab(NULL),
 	mPanelClassifiedInfo(NULL),
-	mPanelClassifiedEdit(NULL)
+	mPanelClassifiedEdit(NULL),
+	mClickThroughDisp(NULL)
 {
-	gGenericDispatcher.addHandler("classifiedclickthrough", 
-		new LLClassifiedClickThrough());
+	mClickThroughDisp = new LLClassifiedClickThrough();
+	gGenericDispatcher.addHandler("classifiedclickthrough", mClickThroughDisp);
 }
 
 LLPanelPicks::~LLPanelPicks()
@@ -127,6 +129,8 @@ LLPanelPicks::~LLPanelPicks()
 	{
 		LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this);
 	}
+
+	delete mClickThroughDisp;
 }
 
 void* LLPanelPicks::create(void* data /* = NULL */)
@@ -693,14 +697,26 @@ void LLPanelPicks::onPanelClassifiedSave(LLPanelClassifiedEdit* panel)
 		LLSD c_value;
 		c_value.insert(CLASSIFIED_ID, c_item->getClassifiedId());
 		c_value.insert(CLASSIFIED_NAME, c_item->getClassifiedName());
-		mClassifiedsList->addItem(c_item, c_value);
+		mClassifiedsList->addItem(c_item, c_value, ADD_TOP);
 
 		c_item->setDoubleClickCallback(boost::bind(&LLPanelPicks::onDoubleClickClassifiedItem, this, _1));
 		c_item->setRightMouseUpCallback(boost::bind(&LLPanelPicks::onRightMouseUpItem, this, _1, _2, _3, _4));
 		c_item->setMouseUpCallback(boost::bind(&LLPanelPicks::updateButtons, this));
 		c_item->childSetAction("info_chevron", boost::bind(&LLPanelPicks::onClickInfo, this));
 	}
-	else
+	else 
+	{
+		onPanelClassifiedClose(panel);
+		return;
+	}
+
+	onPanelPickClose(panel);
+	updateButtons();
+}
+
+void LLPanelPicks::onPanelClassifiedClose(LLPanelClassifiedInfo* panel)
+{
+	if(panel->getInfoLoaded())
 	{
 		std::vector<LLSD> values;
 		mClassifiedsList->getValues(values);
@@ -739,7 +755,7 @@ void LLPanelPicks::createClassifiedInfoPanel()
 	if(!mPanelClassifiedInfo)
 	{
 		mPanelClassifiedInfo = LLPanelClassifiedInfo::create();
-		mPanelClassifiedInfo->setExitCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelClassifiedInfo));
+		mPanelClassifiedInfo->setExitCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, mPanelClassifiedInfo));
 		mPanelClassifiedInfo->setVisible(FALSE);
 	}
 }
@@ -749,9 +765,9 @@ void LLPanelPicks::createClassifiedEditPanel()
 	if(!mPanelClassifiedEdit)
 	{
 		mPanelClassifiedEdit = LLPanelClassifiedEdit::create();
-		mPanelClassifiedEdit->setExitCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelClassifiedEdit));
+		mPanelClassifiedEdit->setExitCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, mPanelClassifiedEdit));
 		mPanelClassifiedEdit->setSaveCallback(boost::bind(&LLPanelPicks::onPanelClassifiedSave, this, mPanelClassifiedEdit));
-		mPanelClassifiedEdit->setCancelCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelClassifiedEdit));
+		mPanelClassifiedEdit->setCancelCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, mPanelClassifiedEdit));
 		mPanelClassifiedEdit->setVisible(FALSE);
 	}
 }
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index b30036c6037..68ad2436ee8 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -55,6 +55,7 @@ class LLPanelPickEdit;
 class LLToggleableMenu;
 class LLPanelClassifiedInfo;
 class LLPanelClassifiedEdit;
+class LLClassifiedClickThrough;
 
 class LLPanelPicks 
 	: public LLPanelProfileTab
@@ -101,6 +102,7 @@ class LLPanelPicks
 	void onPanelPickClose(LLPanel* panel);
 	void onPanelPickSave(LLPanel* panel);
 	void onPanelClassifiedSave(LLPanelClassifiedEdit* panel);
+	void onPanelClassifiedClose(LLPanelClassifiedInfo* panel);
 	void onPanelPickEdit();
 	void onPanelClassifiedEdit();
 	void onClickMenuEdit();
@@ -146,6 +148,8 @@ class LLPanelPicks
 
 	LLAccordionCtrlTab* mPicksAccTab;
 	LLAccordionCtrlTab* mClassifiedsAccTab;
+
+	LLClassifiedClickThrough* mClickThroughDisp;
 };
 
 class LLPickItem : public LLPanel, public LLAvatarPropertiesObserver
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index b0a71f1ebe7..02f45c1b487 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -243,10 +243,6 @@ void LLPanelProfile::notifyParent(const LLSD& info)
 		onOpen(info);
 		return;
 	}
-	else if("save_classified" == action)
-	{
-	//	onOpen(info);
-		return;
-	}
+
 	LLPanel::notifyParent(info);
 }
diff --git a/indra/newview/skins/default/xui/en/panel_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml
index b7a54a7eeac..bdca8531dc5 100644
--- a/indra/newview/skins/default/xui/en/panel_classified_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml
@@ -9,6 +9,14 @@
  name="panel_classified_info"
  top="0"
  width="333">
+ <panel.string
+  name="type_mature">
+    Mature
+ </panel.string>
+ <panel.string
+  name="type_pg">
+    PG Content
+ </panel.string>
     <button
      follows="top|right"
      height="23"
-- 
GitLab


From 7dabb3c46e6cdf208ce7dc46b89f431a247d6ba6 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Tue, 10 Nov 2009 13:33:16 +0200
Subject: [PATCH 042/557] No Ticket: added possibility to resize a floater in
 UI Preview Tool (if can_resize attribute is set in xml)

--HG--
branch : product-engine
---
 indra/newview/llfloateruipreview.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index 663bd232f74..3613ac803ef 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -849,6 +849,7 @@ void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID, bool save)
 		{
 			LLUICtrlFactory::getInstance()->buildFloater(*floaterp, path, NULL);	// just build it
 			(*floaterp)->openFloater((*floaterp)->getKey());
+			(*floaterp)->setCanResize((*floaterp)->isResizable());
 		}
 
 	}
-- 
GitLab


From 3eafbeaac57c952b674fb134124354036c9bb967 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Tue, 10 Nov 2009 15:02:42 +0200
Subject: [PATCH 043/557] Work on major sub-task EXT-991 (Update bottom bar
 behavior on resize)  Initial refactoring of functionality:   - Re-Fixed bug
 with visibility of chiclet panel of the min size   - updated bottomtray xml
 to make buttons identical to each other   - Imroved logic while resizing of
 bottom tray (changing width of chiclet & nearby panels, hide/show buttons)

--HG--
branch : product-engine
---
 indra/newview/app_settings/logcontrol.xml     |   1 +
 indra/newview/llbottomtray.cpp                | 419 ++++++++++++++++--
 indra/newview/llbottomtray.h                  |  13 +-
 indra/newview/llchiclet.cpp                   |  10 +-
 indra/newview/llnearbychatbar.cpp             |   3 +
 .../skins/default/xui/en/panel_bottomtray.xml |  21 +-
 .../default/xui/en/panel_nearby_chat_bar.xml  |   2 +-
 7 files changed, 423 insertions(+), 46 deletions(-)

diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml
index d7bb64ce8a7..ec80d2d0140 100644
--- a/indra/newview/app_settings/logcontrol.xml
+++ b/indra/newview/app_settings/logcontrol.xml
@@ -34,6 +34,7 @@
 						</array>
 					<key>classes</key>
 						<array>
+							<string>LLBottomTray</string>
 						</array>
 					<key>files</key>
 						<array>
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index a17ba79078b..d0fdf244036 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -50,6 +50,8 @@ LLBottomTray::LLBottomTray(const LLSD&)
 	mSpeakBtn(NULL),
 	mNearbyChatBar(NULL),
 	mToolbarStack(NULL)
+,	mMovementButton(NULL)
+// Add more members
 
 {
 	mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL);
@@ -253,12 +255,28 @@ void LLBottomTray::showSnapshotButton(BOOL visible)
 	mSnapshotPanel->setVisible(visible);
 }
 
+typedef enum e_resize_status_type
+{
+	RS_NORESIZE			= 0x0000
+	, RS_CHICLET_PANEL		= 0x0001
+	, RS_CHATBAR_INPUT		= 0x0002
+	, RS_BUTTON_SNAPSHOT	= 0x0004
+	, RS_BUTTON_CAMERA		= 0x0008
+	, RS_BUTTON_MOVEMENT	= 0x0010
+	, RS_BUTTON_GESTURES	= 0x0020
+	, RS_BUTTON_SPEAK		= 0x0040
+	, RS_RESIZABLE_BUTTONS			= /*RS_BUTTON_SNAPSHOT | */RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES
+}EResizeState;
+
+
+
 namespace
 {
-	const std::string& PANEL_CHICLET_NAME = "chiclet_list_panel";
-	const std::string& PANEL_CHATBAR_NAME = "chat_bar";
-	const std::string& PANEL_MOVEMENT_NAME = "movement_panel";
-	const std::string& PANEL_CAMERA_NAME = "cam_panel";
+	const std::string& PANEL_CHICLET_NAME	= "chiclet_list_panel";
+	const std::string& PANEL_CHATBAR_NAME	= "chat_bar";
+	const std::string& PANEL_MOVEMENT_NAME	= "movement_panel";
+	const std::string& PANEL_CAMERA_NAME	= "cam_panel";
+	const std::string& PANEL_GESTURE_NAME	= "gesture_panel";
 }
 
 BOOL LLBottomTray::postBuild()
@@ -284,63 +302,133 @@ BOOL LLBottomTray::postBuild()
 	return TRUE;
 }
 
+void LLBottomTray::log(LLView* panel, const std::string& descr)
+{
+	if (NULL == panel) return;
+	LLView* layout = panel->getParent();
+	llwarns << descr << ": "
+		<< "panel: " << panel->getName()
+		<< ", rect: " << panel->getRect()
+ 
+ 
+		<< "layout: " << layout->getName()
+		<< ", rect: " << layout->getRect()
+		<< llendl
+		; 
+}
+
 void LLBottomTray::verifyChildControlsSizes()
 {
 	LLRect rect = mChicletPanel->getRect();
 	if (rect.getWidth() < mChicletPanel->getMinWidth())
 	{
+		llwarns << "QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ: chiclet panel less then min" << llendl;
 		mChicletPanel->reshape(mChicletPanel->getMinWidth(), rect.getHeight());
 	}
 
 	rect = mNearbyChatBar->getRect();
 	if (rect.getWidth() < mNearbyChatBar->getMinWidth())
 	{
+		llwarns << "WWWWWWWWWWWWWWWWWWWWWWWWWWWWW: near chat panel less then min" << llendl;
 		mNearbyChatBar->reshape(mNearbyChatBar->getMinWidth(), rect.getHeight());
 	}
-	else if (rect.getWidth() > mNearbyChatBar->getMaxWidth())
+	else 
+		if (rect.getWidth() > mNearbyChatBar->getMaxWidth())
 	{
 		rect.setLeftTopAndSize(rect.mLeft, rect.mTop, mNearbyChatBar->getMaxWidth(), rect.getHeight());
 		mNearbyChatBar->reshape(mNearbyChatBar->getMaxWidth(), rect.getHeight());
 		mNearbyChatBar->setRect(rect);
 	}
 }
-
+#define __FEATURE_EXT_991
 void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
 {
+	static S32 depth = 0;
+if (0 == depth) lldebugs << "" << llendl;
+
+	lldebugs << "Reshaping: depth: " << ++depth
+		<< ", width: " << width
+		<< ", height: " << height
+		<< ", called_from_parent" << called_from_parent
+		<< ", cur width: " << getRect().getWidth()
+		<< ", cur height: " << getRect().getHeight()
+		<< llendl;
+
+	if (mNearbyChatBar)			log(mNearbyChatBar, "before");
+	if (mChicletPanel)			log(mChicletPanel, "before");
 
 	if (mChicletPanel && mToolbarStack && mNearbyChatBar)
 	{
-#ifdef __FEATURE_EXT_991__
+//		S32 delta_width = width - getRect().getWidth();
 		BOOL shrink = width < getRect().getWidth();
+#ifdef __FEATURE_EXT_991__
 		const S32 MIN_RENDERED_CHARS = 3;
 #endif
 
-		verifyChildControlsSizes();
-		updateResizeState(width, height);
+
+
+ 		verifyChildControlsSizes();
+ 		updateResizeState(width, height);
+		if (RS_NORESIZE == mResizeState && !called_from_parent)
+		{
+			// this can be in case nearby
+			lldebugs << "width was not changed & !called_from_parent" << llendl;
+
+		}
+
+
+
+
+		if (RS_NORESIZE != mResizeState)
+		{
+
+//		mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, mResizeState & RS_CHICLET_PANEL);
+		mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE);
+
+//		mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, mResizeState & RS_CHATBAR_INPUT);
+
+/*
+		mToolbarStack->updatePanelAutoResize(PANEL_GESTURE_NAME, mResizeState & RS_BUTTON_GESTURES);
+		mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, mResizeState & RS_BUTTON_CAMERA);
+		mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, mResizeState & RS_BUTTON_MOVEMENT);
+*/
+
+		bool show_button = !shrink;
+		if (width != getRect().getWidth() && show_button)
+		{
+			if (mResizeState & RS_BUTTON_SNAPSHOT)	showSnapshotButton(show_button);
+			if (mResizeState & RS_BUTTON_CAMERA)	showCameraButton(show_button);
+			if (mResizeState & RS_BUTTON_MOVEMENT)	showMoveButton(show_button);
+			if (mResizeState & RS_BUTTON_GESTURES)	showGestureButton(show_button);
+		}
 
 		switch (mResizeState)
 		{
-		case STATE_CHICLET_PANEL:
+		case RS_CHICLET_PANEL:
+/*
 			mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE);
 
 			mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, FALSE);
 			mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, FALSE);
 			mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, FALSE);
+*/
 
 			break;
-		case STATE_CHATBAR_INPUT:
+		case RS_CHATBAR_INPUT:
+/*
 			mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, TRUE);
 
 			mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, FALSE);
 			mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, FALSE);
 			mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, FALSE);
 
+*/
 			break;
 
 #ifdef __FEATURE_EXT_991__
 
-		case STATE_BUTTONS:
-			mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, TRUE);
+		case RS_RESIZABLE_BUTTONS:
+//			mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, TRUE);
 			mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, TRUE);
 
 			mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, FALSE);
@@ -352,6 +440,8 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
 				if (mSnapshotPanel->getVisible())
 				{
 					showSnapshotButton(FALSE);
+// 					mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE);
+// 					mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, FALSE);
 				}
 
 				if (mCamPanel->getVisible() && mCamButton->getLastDrawCharsCount() < MIN_RENDERED_CHARS)
@@ -368,6 +458,12 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
 			else
 			{
 				showMoveButton(TRUE);
+				S32 button_delta = delta_width / 4;
+
+				LLRect panel_rect = mMovementPanel->getRect();
+//				panel_rect.mRight += button_delta;
+				mMovementPanel->reshape(panel_rect.getWidth() + button_delta, panel_rect.getHeight()/*, FALSE*/);
+
 				mMovementPanel->draw();
 
 				if (mMovementButton->getLastDrawCharsCount() >= MIN_RENDERED_CHARS)
@@ -378,6 +474,7 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
 				{
 					showMoveButton(FALSE);
 				}
+				mMovementPanel->reshape(panel_rect.getWidth() , panel_rect.getHeight()/*, FALSE*/);
 			}
 			break;
 #endif
@@ -385,58 +482,326 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
 		default:
 			break;
 		}
+		}
+		else
+		{
+			lldebugs << "Nothing changed" << llendl;
+		}
+
 	}
 
 	LLPanel::reshape(width, height, called_from_parent);
+
+	// *TODO: ïðîâåðèòü øèðèíó nearby ïîñëå ðåñàéçà íà ïðåäìåò âûõîäà çà ìàêñèìàëüíûé ïðåäåë
+
+//	if (mMovementButton)		log(mMovementButton, "after");
+	if (mNearbyChatBar)			log(mNearbyChatBar, "after");
+	if (mChicletPanel)			log(mChicletPanel, "after");
+
+	if (mToolbarStack)
+	{
+/*
+		mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, FALSE);
+		mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, FALSE);
+*/
+	}
+	--depth;
 }
 
 void LLBottomTray::updateResizeState(S32 width, S32 height)
 {
-	mResizeState = STATE_BUTTONS;
+	mResizeState = RS_NORESIZE;
+	static MASK prev_resize_state = mResizeState;
+	MASK compensative_view_item_mask = RS_CHATBAR_INPUT;
+	LLPanel* compansative_view = mNearbyChatBar;
+	S32 compensative_delta_width = 0;
 
-	const S32 chiclet_panel_width = mChicletPanel->getRect().getWidth();
+	S32 delta_width = width - getRect().getWidth();
+//	if (delta_width == 0) return;
+
+	const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
 	const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
 
 	const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
 	const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
 	const S32 chatbar_panel_max_width = mNearbyChatBar->getMaxWidth();
 
+	lldebugs << "chatbar_panel_width: " << chatbar_panel_width
+		<< llendl;
+
+	bool still_should_be_processed = true;
 	// bottom tray is narrowed
 	if (width < getRect().getWidth())
 	{
 		if (chiclet_panel_width > chiclet_panel_min_width)
 		{
-			mResizeState = STATE_CHICLET_PANEL;
+			// we have some space to decrease chiclet panel
+			S32 panel_delta_min = chiclet_panel_width - chiclet_panel_min_width;
+			mResizeState |= RS_CHICLET_PANEL;
+
+			S32 delta_panel = llmin(-delta_width, panel_delta_min);
+
+			lldebugs << "delta_width: " << delta_width
+				<< ", panel_delta_min: " << panel_delta_min
+				<< ", delta_panel: " << delta_panel
+				<< llendl;
+
+			// is chiclet panel width enough to process resizing?
+			delta_width += panel_delta_min;
+
+			still_should_be_processed = delta_width < 0;
+
+			mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - delta_panel, mChicletPanel->getParent()->getRect().getHeight());
+			log(mChicletPanel, "after processing panel decreasing via chiclet panel");
+
+			lldebugs << "RS_CHICLET_PANEL" 
+				<< ", delta_width: " << delta_width
+				<< llendl;
 		}
-		else if (chatbar_panel_width > chatbar_panel_min_width)
+		
+		if (still_should_be_processed && chatbar_panel_width > chatbar_panel_min_width)
 		{
-			mResizeState = STATE_CHATBAR_INPUT;
+			// we have some space to decrease chatbar panel
+			S32 panel_delta_min = chatbar_panel_width - chatbar_panel_min_width;
+			mResizeState |= RS_CHATBAR_INPUT;
+
+			S32 delta_panel = llmin(-delta_width, panel_delta_min);
+
+			// is chatbar panel width enough to process resizing?
+			delta_width += panel_delta_min;
+			
+
+			still_should_be_processed = delta_width < 0;
+
+			mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mNearbyChatBar->getRect().getHeight());
+
+			lldebugs << "RS_CHATBAR_INPUT"
+				<< ", delta_panel: " << delta_panel
+				<< ", delta_width: " << delta_width
+				<< llendl;
+
+			log(mChicletPanel, "after nearby was processed");
+
 		}
-		else
+		if (still_should_be_processed)
 		{
-			mResizeState = STATE_BUTTONS;
+			mResizeState |= compensative_view_item_mask;
+
+			if (mSnapshotPanel->getVisible())
+			{
+				mResizeState |= RS_BUTTON_SNAPSHOT;
+				delta_width += mSnapshotPanel->getRect().getWidth();
+				compensative_delta_width += mSnapshotPanel->getRect().getWidth();
+				lldebugs << "RS_BUTTON_SNAPSHOT" 
+					<< ", compensative_delta_width: " << compensative_delta_width
+					<< ", delta_width: " << delta_width
+					<< llendl;
+				showSnapshotButton(false);
+			}
+
+			if (delta_width < 0 && mCamPanel->getVisible())
+			{
+				mResizeState |= RS_BUTTON_CAMERA;
+				delta_width += mCamPanel->getRect().getWidth();
+				compensative_delta_width += mCamPanel->getRect().getWidth();
+				lldebugs << "RS_BUTTON_CAMERA"
+					<< ", compensative_delta_width: " << compensative_delta_width
+					<< ", delta_width: " << delta_width
+					<< llendl;
+				showCameraButton(false);
+			}
+
+			if (delta_width < 0 && mMovementPanel->getVisible())
+			{
+				mResizeState |= RS_BUTTON_MOVEMENT;
+				delta_width += mMovementPanel->getRect().getWidth();
+				compensative_delta_width += mMovementPanel->getRect().getWidth();
+				lldebugs << "RS_BUTTON_MOVEMENT"
+					<< ", compensative_delta_width: " << compensative_delta_width
+					<< ", delta_width: " << delta_width
+					<< llendl;
+				showMoveButton(false);
+			}
+
+			if (delta_width < 0 && mGesturePanel->getVisible())
+			{
+				mResizeState |= RS_BUTTON_GESTURES;
+				delta_width += mGesturePanel->getRect().getWidth();
+				compensative_delta_width += mGesturePanel->getRect().getWidth();
+				lldebugs << "RS_BUTTON_GESTURES"
+					<< ", compensative_delta_width: " << compensative_delta_width
+					<< ", delta_width: " << delta_width
+					<< llendl;
+				showGestureButton(false);
+			}
+
+			if (delta_width < 0)
+			{
+				llwarns << "WARNING: there is no enough room for bottom tray, resizing still should be processed" << llendl;
+			}
+
+			if (compensative_delta_width != 0)
+			{
+				if (compansative_view)			log(compansative_view, "before applying compensative width: ");
+				compansative_view->reshape(compansative_view->getRect().getWidth() + compensative_delta_width, compansative_view->getRect().getHeight() );
+				if (compansative_view)			log(compansative_view, "after applying compensative width: ");
+				lldebugs << compensative_delta_width << llendl;
+
+			}
+
+/*
+			switch (mResizeState)
+			{
+			case:
+			}
+*/
+
+//			mResizeState = RS_RESIZABLE_BUTTONS;
 		}
 	}
 	// bottom tray is widen
 	else
 	{
+// 		const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
+// 		const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
+// 		//		const S32 chatbar_panel_max_width = mNearbyChatBar->getMaxWidth();
+		S32 available_width_chat = chatbar_panel_width - chatbar_panel_min_width;
+		S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width;
+		S32 available_width = delta_width + available_width_chat + available_width_chiclet;
+		
+		if (available_width > 0 && processShowButton(mGesturePanel, &available_width))
+		{
+			mResizeState |= RS_BUTTON_GESTURES | compensative_view_item_mask;
+			delta_width -= mGesturePanel->getRect().getWidth();
+			compensative_delta_width -= mGesturePanel->getRect().getWidth();
+			lldebugs << "RS_BUTTON_GESTURES"
+				<< ", compensative_delta_width: " << compensative_delta_width
+				<< ", delta_width: " << delta_width
+				<< llendl;
+		}
+
+		if (available_width > 0 && processShowButton(mMovementPanel, &available_width))
+		{
+			mResizeState |= RS_BUTTON_MOVEMENT | compensative_view_item_mask;
+			delta_width -= mMovementPanel->getRect().getWidth();
+			compensative_delta_width -= mMovementPanel->getRect().getWidth();
+
+			lldebugs << "RS_BUTTON_MOVEMENT"
+				<< ", compensative_delta_width: " << compensative_delta_width
+				<< ", delta_width: " << delta_width
+				<< llendl;
+		}
+
+		if (available_width > 0 && processShowButton(mCamPanel, &available_width))
+		{
+			mResizeState |= RS_BUTTON_CAMERA | compensative_view_item_mask;
+			delta_width -= mCamPanel->getRect().getWidth();
+			compensative_delta_width -= mCamPanel->getRect().getWidth();
+
+			lldebugs << "RS_BUTTON_CAMERA "
+				<< ", compensative_delta_width: " << compensative_delta_width
+				<< ", delta_width: " << delta_width
+				<< llendl;
+		}
+
+		if (available_width > 0 && processShowButton(mSnapshotPanel, &available_width))
+		{
+			mResizeState |= RS_BUTTON_SNAPSHOT | compensative_view_item_mask;
+			delta_width -= mSnapshotPanel->getRect().getWidth();
+			compensative_delta_width -= mSnapshotPanel->getRect().getWidth();
+
+			lldebugs << "RS_BUTTON_SNAPSHOT"
+				<< ", compensative_delta_width: " << compensative_delta_width
+				<< ", delta_width: " << delta_width
+				<< llendl;
+		}
+
+		if (compensative_delta_width != 0)
+		{
+			S32 required_to_process_width = -compensative_delta_width;
+			S32 total_delta_width = width - getRect().getWidth();
+
+			// 1. use delta width of resizing
+			required_to_process_width -= total_delta_width;
+
+			// 2. use delta width of chatbar
+
+
+			S32 chatbar_compensative_delta_width = required_to_process_width;
+			if (available_width_chat < chatbar_compensative_delta_width)
+			{
+				chatbar_compensative_delta_width = available_width_chat;
+			}
+
+			log(compansative_view, "increase width: before applying compensative width: ");
+			compansative_view->reshape(compansative_view->getRect().getWidth() - chatbar_compensative_delta_width, compansative_view->getRect().getHeight() );
+			if (compansative_view)			log(compansative_view, "after applying compensative width: ");
+			lldebugs << chatbar_compensative_delta_width << llendl;
+
+			// 3. use delta width of chiclet panel
+			required_to_process_width -= chatbar_compensative_delta_width;
+
+			mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - required_to_process_width, mChicletPanel->getParent()->getRect().getHeight());
+			log(mChicletPanel, "after applying compensative width for chiclets: ");
+			lldebugs << required_to_process_width << llendl;
+
+		}
+
+
 #ifdef __FEATURE_EXT_991__
-		if (!mMovementPanel->getVisible())
+		//S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_chars, BOOL end_on_word_boundary) const 
+		static S32 DEFAULT_BUTTON_WIDTH = 80;
+		if (!mMovementPanel->getVisible() || mMovementPanel->getRect().getWidth() < DEFAULT_BUTTON_WIDTH)
 		{
-			mResizeState = STATE_BUTTONS;
+			mResizeState = RS_RESIZABLE_BUTTONS;
 		}
 		else
 #endif
-		if (chatbar_panel_width < chatbar_panel_max_width)
+		if (delta_width > 0 && chatbar_panel_width < chatbar_panel_max_width)
 		{
-			mResizeState = STATE_CHATBAR_INPUT;
+			mResizeState |= RS_CHATBAR_INPUT;
+			// how many space can nearby chat take?
+			S32 chatbar_panel_width_ = mNearbyChatBar->getRect().getWidth();
+			S32 delta_panel_max = chatbar_panel_max_width - chatbar_panel_width_;
+			S32 delta_panel = llmin(delta_width, delta_panel_max);
+			delta_width -= delta_panel_max;
+			mNearbyChatBar->reshape(chatbar_panel_width_ + delta_panel, mNearbyChatBar->getRect().getHeight());
 		}
-		else
+
+		if (delta_width > 0)
 		{
-			mResizeState = STATE_CHICLET_PANEL;
+			mResizeState |= RS_CHICLET_PANEL;
 		}
 	}
 
+	prev_resize_state = mResizeState;
+	lldebugs << "New resize state: " << mResizeState << llendl;
+}
 
-	// TODO: finish implementation
+bool LLBottomTray::processShowButton(LLPanel* panel, S32* available_width)
+{
+	bool can_be_shown = canButtonBeShown(panel);
+	if (can_be_shown)
+	{
+		//validate if we have enough room to show this button
+		const S32 required_width = panel->getRect().getWidth();
+		can_be_shown = *available_width >= required_width;
+		if (can_be_shown)
+		{
+			*available_width -= required_width;
+		}
+
+	}
+	return can_be_shown;
+}
+
+bool LLBottomTray::canButtonBeShown(LLPanel* panel) const
+{
+	bool can_be_shown = !panel->getVisible();
+	if (can_be_shown)
+	{
+		// *TODO: mantipov: synchronize with situation when button was hidden via context menu;
+	}
+	return can_be_shown;
 }
+//EOF
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 02588a1975f..4a763e6c7cc 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -52,6 +52,7 @@ class LLBottomTray
 	, public LLPanel
 	, public LLIMSessionObserver
 {
+	LOG_CLASS(LLBottomTray);
 	friend class LLSingleton<LLBottomTray>;
 public:
 	~LLBottomTray();
@@ -83,17 +84,13 @@ class LLBottomTray
 
 private:
 
-	enum EResizeState
-	{
-		STATE_CHICLET_PANEL = 1,
-		STATE_CHATBAR_INPUT,
-		STATE_BUTTONS
-	};
-
 	void updateResizeState(S32 width, S32 height);
 	void verifyChildControlsSizes();
+	void log(LLView* panel, const std::string& descr);
+	bool processShowButton(LLPanel* panel, S32* available_width);
+	bool canButtonBeShown(LLPanel* panel) const;
 
-	EResizeState mResizeState;
+	MASK mResizeState;
 
 protected:
 
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 97447a85c65..16ee9a00072 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -787,11 +787,13 @@ LLChicletPanel::Params::Params()
 	chiclet_padding = 3;
 	scrolling_offset = 40;
 
+/*
 	if (!min_width.isProvided())
 	{
 		// min_width = 4 chiclets + 3 paddings
-		min_width = 179 + 3*chiclet_padding;
+		min_width = 180 + 3*chiclet_padding;
 	}
+*/
 };
 
 LLChicletPanel::LLChicletPanel(const Params&p)
@@ -805,6 +807,10 @@ LLChicletPanel::LLChicletPanel(const Params&p)
 , mShowControls(true)
 {
 	LLPanel::Params panel_params;
+// *TODO: remove color settings 
+panel_params.background_visible(true);
+panel_params.bg_alpha_color(LLColor4::red);
+	panel_params.follows.flags(FOLLOWS_LEFT | FOLLOWS_RIGHT);
 	mScrollArea = LLUICtrlFactory::create<LLPanel>(panel_params,this);
 
 	// important for Show/Hide Camera and Move controls menu in bottom tray to work properly
@@ -1051,7 +1057,7 @@ void LLChicletPanel::reshape(S32 width, S32 height, BOOL called_from_parent )
 		width, scroll_button_rect.mBottom));
 	mScrollArea->setRect(LLRect(scroll_button_rect.getWidth() + SCROLL_BUTTON_PAD,
 		height, width - scroll_button_rect.getWidth() - SCROLL_BUTTON_PAD, 0));
-	mShowControls = width > mMinWidth;
+	mShowControls = width >= mMinWidth;
 	mScrollArea->setVisible(mShowControls);
 
 	trimChiclets();
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index bcb4edd7c18..47441191f5b 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -260,6 +260,8 @@ bool LLNearbyChatBar::instanceExists()
 
 void LLNearbyChatBar::draw()
 {
+// TODO: mantipov: remove
+/*
 	LLRect rect = getRect();
 	S32 max_width = getMaxWidth();
 
@@ -269,6 +271,7 @@ void LLNearbyChatBar::draw()
 		reshape(rect.getWidth(), rect.getHeight(), FALSE);
 		setRect(rect);
 	}
+*/
 
 	displaySpeakingIndicator();
 	LLPanel::draw();
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index ef91c6cd6e2..1c1065bc11a 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -44,7 +44,7 @@
          min_height="23"
          width="310"
          top="0"
-         min_width="300"
+         min_width="192"
          name="chat_bar"
          user_resize="false"
          filename="panel_nearby_chat_bar.xml" />
@@ -57,7 +57,7 @@
          min_height="28"
          width="100"
          top_delta="0"
-         min_width="96"
+         min_width="100"
          name="speak_panel"
          user_resize="false">
          <talk_button
@@ -90,11 +90,11 @@
          min_height="28"
          width="80"
          top_delta="0"
-         min_width="76"
+         min_width="80"
          name="gesture_panel"
          user_resize="false">
          <button
-           follows="right"
+          follows="left|right"
           height="23"
           label="Gesture"
           layout="topleft"
@@ -123,8 +123,9 @@
          layout="topleft"
          min_height="28"
          name="movement_panel"
+         user_resize="false"
          width="80"
-         min_width="76">
+         min_width="80">
             <button
              follows="left|right"
              height="23"
@@ -159,10 +160,10 @@
          height="28"
          layout="topleft"
          min_height="28"
-         min_width="76"
+         min_width="80"
          name="cam_panel"
-         top_delta="-10"
-         width="100">
+         user_resize="false"
+         width="80">
             <button
              follows="left|right"
              height="23"
@@ -197,6 +198,7 @@
          follows="left|right"
          height="28"
          layout="topleft"
+         min_width="40"
          name="snapshot_panel"
          width="40">
             <button
@@ -213,6 +215,8 @@
                  />
         </layout_panel>
         <layout_panel
+background_visible="true"
+bg_alpha_color="green"  
          mouse_opaque="false"
          follows="left|right"
          height="28"
@@ -229,6 +233,7 @@
              height="28"
              layout="topleft"
              left="0"
+             min_width="129"
              name="chiclet_list"
              top="0"
              chiclet_padding="3"
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
index 555fedb1ffb..eb12178ca09 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
@@ -9,7 +9,7 @@
  top="21"
  width="310">
     <string name="min_width">
-        310
+        192
     </string>
     <string name="max_width">
         320
-- 
GitLab


From 60a7a1d891b5c019aa6fc0f7d54046976f31a9f3 Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Tue, 10 Nov 2009 15:25:39 +0200
Subject: [PATCH 044/557] Implemented Sub-task EXT-2214-Refactor IM Control
 Panels

--HG--
branch : product-engine
---
 indra/newview/llpanelimcontrolpanel.cpp | 22 +++++++++++-----------
 indra/newview/llpanelimcontrolpanel.h   |  3 ++-
 indra/newview/llparticipantlist.h       |  3 ++-
 3 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index c9168670d5c..6479f462832 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -86,10 +86,8 @@ void LLPanelChatControlPanel::draw()
 
 	bool session_initialized = session->mSessionInitialized;
 	bool callback_enabled = session->mCallBackEnabled;
-	LLViewerRegion* region = gAgent.getRegion();
 
-	BOOL enable_connect = (region && region->getCapability("ChatSessionRequest") != "")
-		&& session_initialized
+	BOOL enable_connect = session_initialized
 		&& voice_enabled
 		&& callback_enabled;
 	childSetEnabled("call_btn", enable_connect);
@@ -190,7 +188,8 @@ void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::str
 	}
 }
 
-LLPanelGroupControlPanel::LLPanelGroupControlPanel(const LLUUID& session_id)
+LLPanelGroupControlPanel::LLPanelGroupControlPanel(const LLUUID& session_id):
+mParticipantList(NULL)
 {
 	mSpeakerManager = LLIMModel::getInstance()->getSpeakerManager(session_id);
 }
@@ -199,9 +198,6 @@ BOOL LLPanelGroupControlPanel::postBuild()
 {
 	childSetAction("group_info_btn", boost::bind(&LLPanelGroupControlPanel::onGroupInfoButtonClicked, this));
 
-	mAvatarList = getChild<LLAvatarList>("speakers_list");
-	mParticipantList = new LLParticipantList(mSpeakerManager, mAvatarList);
-
 	return LLPanelChatControlPanel::postBuild();
 }
 
@@ -214,6 +210,8 @@ LLPanelGroupControlPanel::~LLPanelGroupControlPanel()
 // virtual
 void LLPanelGroupControlPanel::draw()
 {
+	//Remove event does not raised until speakerp->mActivityTimer.hasExpired() is false, see LLSpeakerManager::update()
+	//so we need update it to raise needed event
 	mSpeakerManager->update(true);
 	LLPanelChatControlPanel::draw();
 }
@@ -241,7 +239,7 @@ void LLPanelGroupControlPanel::onSortMenuItemClicked(const LLSD& userdata)
 void LLPanelGroupControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
 {
 	LLPanelChatControlPanel::onVoiceChannelStateChanged(old_state, new_state);
-	mAvatarList->setSpeakingIndicatorsVisible(new_state >= LLVoiceChannel::STATE_CALL_STARTED);
+	mParticipantList->setSpeakingIndicatorsVisible(new_state >= LLVoiceChannel::STATE_CALL_STARTED);
 }
 
 void LLPanelGroupControlPanel::setSessionId(const LLUUID& session_id)
@@ -249,6 +247,10 @@ void LLPanelGroupControlPanel::setSessionId(const LLUUID& session_id)
 	LLPanelChatControlPanel::setSessionId(session_id);
 
 	mGroupID = LLIMModel::getInstance()->getOtherParticipantID(session_id);
+
+	if(!mParticipantList)
+		mParticipantList = new LLParticipantList(LLIMModel::getInstance()->getSpeakerManager(session_id),
+													getChild<LLAvatarList>("speakers_list"));
 }
 
 
@@ -258,9 +260,7 @@ LLPanelAdHocControlPanel::LLPanelAdHocControlPanel(const LLUUID& session_id):LLP
 
 BOOL LLPanelAdHocControlPanel::postBuild()
 {
-	mAvatarList = getChild<LLAvatarList>("speakers_list");
-	mParticipantList = new LLParticipantList(mSpeakerManager, mAvatarList);
-
+	//We don't need LLPanelGroupControlPanel::postBuild() to be executed as there is no group_info_btn at AdHoc chat
 	return LLPanelChatControlPanel::postBuild();
 }
 
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index ac5d86345e8..12de21a46a8 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -100,10 +100,11 @@ class LLPanelGroupControlPanel : public LLPanelChatControlPanel
 protected:
 	LLUUID mGroupID;
 	LLSpeakerMgr* mSpeakerManager;
-	LLAvatarList* mAvatarList;
+
 	LLParticipantList* mParticipantList;
 
 private:
+	void onVisibilityChange(const LLSD& new_visibility);
 	void onGroupInfoButtonClicked();
 	void onSortMenuItemClicked(const LLSD& userdata);
 	/*virtual*/ void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
index 1ff1515d16d..6fe178b0233 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -34,9 +34,9 @@
 #include "llevent.h"
 #include "llpanelpeoplemenus.h"
 #include "llimview.h"
+#include "llavatarlist.h"
 
 class LLSpeakerMgr;
-class LLAvatarList;
 class LLUICtrl;
 
 class LLParticipantList
@@ -45,6 +45,7 @@ class LLParticipantList
 	public:
 		LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list);
 		~LLParticipantList();
+		void setSpeakingIndicatorsVisible(BOOL visible){ mAvatarList->setSpeakingIndicatorsVisible(visible); };
 
 		typedef enum e_participant_sort_oder {
 			E_SORT_BY_NAME = 0,
-- 
GitLab


From e292f310fbd1c98d62237eef27d284e024abe7ee Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Tue, 10 Nov 2009 15:35:58 +0200
Subject: [PATCH 045/557] No ticket. Cleaned up the code after last commit

--HG--
branch : product-engine
---
 indra/newview/llpanelimcontrolpanel.cpp | 3 +--
 indra/newview/llpanelimcontrolpanel.h   | 1 -
 indra/newview/llparticipantlist.cpp     | 5 +++++
 indra/newview/llparticipantlist.h       | 4 ++--
 4 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index 6479f462832..350b78ee3da 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -249,8 +249,7 @@ void LLPanelGroupControlPanel::setSessionId(const LLUUID& session_id)
 	mGroupID = LLIMModel::getInstance()->getOtherParticipantID(session_id);
 
 	if(!mParticipantList)
-		mParticipantList = new LLParticipantList(LLIMModel::getInstance()->getSpeakerManager(session_id),
-													getChild<LLAvatarList>("speakers_list"));
+		mParticipantList = new LLParticipantList(mSpeakerManager, getChild<LLAvatarList>("speakers_list"));
 }
 
 
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index 12de21a46a8..a0d3420d231 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -104,7 +104,6 @@ class LLPanelGroupControlPanel : public LLPanelChatControlPanel
 	LLParticipantList* mParticipantList;
 
 private:
-	void onVisibilityChange(const LLSD& new_visibility);
 	void onGroupInfoButtonClicked();
 	void onSortMenuItemClicked(const LLSD& userdata);
 	/*virtual*/ void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 8155766b491..f5367c04772 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -92,6 +92,11 @@ LLParticipantList::~LLParticipantList()
 	mParticipantListMenu = NULL;
 }
 
+void LLParticipantList::setSpeakingIndicatorsVisible(BOOL visible)
+{
+	mAvatarList->setSpeakingIndicatorsVisible(visible);
+};
+
 void LLParticipantList::onAvatarListDoubleClicked(LLAvatarList* list)
 {
 	LLUUID clicked_id = list->getSelectedUUID();
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
index 6fe178b0233..5e26c39fc81 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -34,9 +34,9 @@
 #include "llevent.h"
 #include "llpanelpeoplemenus.h"
 #include "llimview.h"
-#include "llavatarlist.h"
 
 class LLSpeakerMgr;
+class LLAvatarList;
 class LLUICtrl;
 
 class LLParticipantList
@@ -45,7 +45,7 @@ class LLParticipantList
 	public:
 		LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list);
 		~LLParticipantList();
-		void setSpeakingIndicatorsVisible(BOOL visible){ mAvatarList->setSpeakingIndicatorsVisible(visible); };
+		void setSpeakingIndicatorsVisible(BOOL visible);
 
 		typedef enum e_participant_sort_oder {
 			E_SORT_BY_NAME = 0,
-- 
GitLab


From 729df1aa330a50fa4f4b887e46c32a94a01880d7 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Tue, 10 Nov 2009 16:13:20 +0200
Subject: [PATCH 046/557] Work on major sub-task EXT-991 (Update bottom bar
 behavior on resize)  Initial refactoring of functionality:   - cleaning   -
 Imroved logic while resizing of bottom tray

--HG--
branch : product-engine
---
 indra/newview/llbottomtray.cpp | 155 +++++----------------------------
 1 file changed, 23 insertions(+), 132 deletions(-)

diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index d0fdf244036..b74b1d900b8 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -344,12 +344,12 @@ void LLBottomTray::verifyChildControlsSizes()
 void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
 {
 	static S32 depth = 0;
-if (0 == depth) lldebugs << "" << llendl;
+if (0 == depth) lldebugs << "****************************************" << llendl;
 
 	lldebugs << "Reshaping: depth: " << ++depth
 		<< ", width: " << width
 		<< ", height: " << height
-		<< ", called_from_parent" << called_from_parent
+		<< ", called_from_parent: " << called_from_parent
 		<< ", cur width: " << getRect().getWidth()
 		<< ", cur height: " << getRect().getHeight()
 		<< llendl;
@@ -361,9 +361,6 @@ if (0 == depth) lldebugs << "" << llendl;
 	{
 //		S32 delta_width = width - getRect().getWidth();
 		BOOL shrink = width < getRect().getWidth();
-#ifdef __FEATURE_EXT_991__
-		const S32 MIN_RENDERED_CHARS = 3;
-#endif
 
 
 
@@ -376,9 +373,6 @@ if (0 == depth) lldebugs << "" << llendl;
 
 		}
 
-
-
-
 		if (RS_NORESIZE != mResizeState)
 		{
 
@@ -387,11 +381,6 @@ if (0 == depth) lldebugs << "" << llendl;
 
 //		mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, mResizeState & RS_CHATBAR_INPUT);
 
-/*
-		mToolbarStack->updatePanelAutoResize(PANEL_GESTURE_NAME, mResizeState & RS_BUTTON_GESTURES);
-		mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, mResizeState & RS_BUTTON_CAMERA);
-		mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, mResizeState & RS_BUTTON_MOVEMENT);
-*/
 
 		bool show_button = !shrink;
 		if (width != getRect().getWidth() && show_button)
@@ -402,109 +391,16 @@ if (0 == depth) lldebugs << "" << llendl;
 			if (mResizeState & RS_BUTTON_GESTURES)	showGestureButton(show_button);
 		}
 
-		switch (mResizeState)
-		{
-		case RS_CHICLET_PANEL:
-/*
-			mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE);
-
-			mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, FALSE);
-			mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, FALSE);
-			mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, FALSE);
-*/
-
-			break;
-		case RS_CHATBAR_INPUT:
-/*
-			mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, TRUE);
-
-			mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, FALSE);
-			mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, FALSE);
-			mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, FALSE);
-
-*/
-			break;
-
-#ifdef __FEATURE_EXT_991__
-
-		case RS_RESIZABLE_BUTTONS:
-//			mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, TRUE);
-			mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, TRUE);
-
-			mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, FALSE);
-			mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, FALSE);
-
-			if (shrink)
-			{
-
-				if (mSnapshotPanel->getVisible())
-				{
-					showSnapshotButton(FALSE);
-// 					mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE);
-// 					mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, FALSE);
-				}
-
-				if (mCamPanel->getVisible() && mCamButton->getLastDrawCharsCount() < MIN_RENDERED_CHARS)
-				{
-					showCameraButton(FALSE);
-				}
-
-				if (mMovementPanel->getVisible() && mMovementButton->getLastDrawCharsCount() < MIN_RENDERED_CHARS)
-				{
-					showMoveButton(FALSE);
-				}
-
-			}
-			else
-			{
-				showMoveButton(TRUE);
-				S32 button_delta = delta_width / 4;
-
-				LLRect panel_rect = mMovementPanel->getRect();
-//				panel_rect.mRight += button_delta;
-				mMovementPanel->reshape(panel_rect.getWidth() + button_delta, panel_rect.getHeight()/*, FALSE*/);
-
-				mMovementPanel->draw();
-
-				if (mMovementButton->getLastDrawCharsCount() >= MIN_RENDERED_CHARS)
-				{
-					showMoveButton(TRUE);
-				}
-				else
-				{
-					showMoveButton(FALSE);
-				}
-				mMovementPanel->reshape(panel_rect.getWidth() , panel_rect.getHeight()/*, FALSE*/);
-			}
-			break;
-#endif
-
-		default:
-			break;
-		}
 		}
-		else
-		{
-			lldebugs << "Nothing changed" << llendl;
-		}
-
 	}
 
 	LLPanel::reshape(width, height, called_from_parent);
 
 	// *TODO: ïðîâåðèòü øèðèíó nearby ïîñëå ðåñàéçà íà ïðåäìåò âûõîäà çà ìàêñèìàëüíûé ïðåäåë
 
-//	if (mMovementButton)		log(mMovementButton, "after");
 	if (mNearbyChatBar)			log(mNearbyChatBar, "after");
 	if (mChicletPanel)			log(mChicletPanel, "after");
 
-	if (mToolbarStack)
-	{
-/*
-		mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, FALSE);
-		mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, FALSE);
-*/
-	}
 	--depth;
 }
 
@@ -527,6 +423,10 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 	const S32 chatbar_panel_max_width = mNearbyChatBar->getMaxWidth();
 
 	lldebugs << "chatbar_panel_width: " << chatbar_panel_width
+		<< ", chatbar_panel_min_width: " << chatbar_panel_min_width
+		<< ", chatbar_panel_max_width: " << chatbar_panel_max_width
+		<< ", chiclet_panel_width: " << chiclet_panel_width
+		<< ", chiclet_panel_min_width: " << chiclet_panel_min_width
 		<< llendl;
 
 	bool still_should_be_processed = true;
@@ -591,7 +491,11 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 			{
 				mResizeState |= RS_BUTTON_SNAPSHOT;
 				delta_width += mSnapshotPanel->getRect().getWidth();
-				compensative_delta_width += mSnapshotPanel->getRect().getWidth();
+
+				if (delta_width > 0)
+				{
+					compensative_delta_width += delta_width;
+				}
 				lldebugs << "RS_BUTTON_SNAPSHOT" 
 					<< ", compensative_delta_width: " << compensative_delta_width
 					<< ", delta_width: " << delta_width
@@ -603,7 +507,10 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 			{
 				mResizeState |= RS_BUTTON_CAMERA;
 				delta_width += mCamPanel->getRect().getWidth();
-				compensative_delta_width += mCamPanel->getRect().getWidth();
+				if (delta_width > 0)
+				{
+					compensative_delta_width += delta_width;
+				}
 				lldebugs << "RS_BUTTON_CAMERA"
 					<< ", compensative_delta_width: " << compensative_delta_width
 					<< ", delta_width: " << delta_width
@@ -615,7 +522,10 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 			{
 				mResizeState |= RS_BUTTON_MOVEMENT;
 				delta_width += mMovementPanel->getRect().getWidth();
-				compensative_delta_width += mMovementPanel->getRect().getWidth();
+				if (delta_width > 0)
+				{
+					compensative_delta_width += delta_width;
+				}
 				lldebugs << "RS_BUTTON_MOVEMENT"
 					<< ", compensative_delta_width: " << compensative_delta_width
 					<< ", delta_width: " << delta_width
@@ -627,7 +537,10 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 			{
 				mResizeState |= RS_BUTTON_GESTURES;
 				delta_width += mGesturePanel->getRect().getWidth();
-				compensative_delta_width += mGesturePanel->getRect().getWidth();
+				if (delta_width > 0)
+				{
+					compensative_delta_width += delta_width;
+				}
 				lldebugs << "RS_BUTTON_GESTURES"
 					<< ", compensative_delta_width: " << compensative_delta_width
 					<< ", delta_width: " << delta_width
@@ -648,23 +561,11 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 				lldebugs << compensative_delta_width << llendl;
 
 			}
-
-/*
-			switch (mResizeState)
-			{
-			case:
-			}
-*/
-
-//			mResizeState = RS_RESIZABLE_BUTTONS;
 		}
 	}
 	// bottom tray is widen
 	else
 	{
-// 		const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
-// 		const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
-// 		//		const S32 chatbar_panel_max_width = mNearbyChatBar->getMaxWidth();
 		S32 available_width_chat = chatbar_panel_width - chatbar_panel_min_width;
 		S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width;
 		S32 available_width = delta_width + available_width_chat + available_width_chiclet;
@@ -747,16 +648,6 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 
 		}
 
-
-#ifdef __FEATURE_EXT_991__
-		//S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_chars, BOOL end_on_word_boundary) const 
-		static S32 DEFAULT_BUTTON_WIDTH = 80;
-		if (!mMovementPanel->getVisible() || mMovementPanel->getRect().getWidth() < DEFAULT_BUTTON_WIDTH)
-		{
-			mResizeState = RS_RESIZABLE_BUTTONS;
-		}
-		else
-#endif
 		if (delta_width > 0 && chatbar_panel_width < chatbar_panel_max_width)
 		{
 			mResizeState |= RS_CHATBAR_INPUT;
-- 
GitLab


From 63195e76cae04f4eb98a3ce3230caae17fa79eca Mon Sep 17 00:00:00 2001
From: angela <angela@lindenlab.com>
Date: Tue, 10 Nov 2009 22:46:58 +0800
Subject: [PATCH 047/557] check for NULL to prevent crashing

---
 indra/newview/lltexturecache.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 69a2d1d7a6b..6a4b967487c 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -1543,6 +1543,8 @@ bool LLTextureCache::readComplete(handle_t handle, bool abort)
 	handle_map_t::iterator iter = mReaders.find(handle);
 	llassert_always(iter != mReaders.end() || abort);
 	LLTextureCacheWorker* worker = iter->second;
+	if (!worker)
+		return false;
 	bool res = worker->complete();
 	if (res || abort)
 	{
-- 
GitLab


From 26d481f3850ded5a20e183260eced4c32c9b7a84 Mon Sep 17 00:00:00 2001
From: angela <angela@lindenlab.com>
Date: Tue, 10 Nov 2009 22:49:25 +0800
Subject: [PATCH 048/557] (EXT-2343) Preference > Chat > ColorSwatch 's
 LLUIColorTable is not working

---
 indra/llui/lluicolortable.cpp                 | 13 ++-
 indra/newview/llfloaterpreference.cpp         | 69 ++++------------
 indra/newview/llfloaterpreference.h           |  5 +-
 .../default/xui/en/panel_preferences_chat.xml | 82 +++++++++++++++----
 4 files changed, 93 insertions(+), 76 deletions(-)

diff --git a/indra/llui/lluicolortable.cpp b/indra/llui/lluicolortable.cpp
index 851091f0ca2..f1e3000547d 100644
--- a/indra/llui/lluicolortable.cpp
+++ b/indra/llui/lluicolortable.cpp
@@ -69,7 +69,14 @@ void LLUIColorTable::insertFromParams(const Params& p)
 		ColorEntryParams color_entry = *it;
 		if(color_entry.color.value.isChosen())
 		{
-			setColor(color_entry.name, color_entry.color.value, mLoadedColors);
+			if(mUserSetColors.find(color_entry.name)!=mUserSetColors.end())
+			{
+				setColor(color_entry.name, color_entry.color.value);
+			}
+			else
+			{
+				setColor(color_entry.name, color_entry.color.value, mLoadedColors);
+			}
 		}
 		else
 		{
@@ -213,7 +220,7 @@ bool LLUIColorTable::loadFromSettings()
 		result |= loadFromFilename(current_filename);
 	}
 
-	std::string user_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SKIN, "colors.xml");
+	std::string user_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "colors.xml");
 	loadFromFilename(user_filename);
 
 	return result;
@@ -239,7 +246,7 @@ void LLUIColorTable::saveUserSettings() const
 
 	if(!output_node->isNull())
 	{
-		const std::string& filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SKIN, "colors.xml");
+		const std::string& filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "colors.xml");
 		LLFILE *fp = LLFile::fopen(filename, "w");
 
 		if(fp != NULL)
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 2af1313db45..7bd13118158 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -348,6 +348,8 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
 	mCommitCallbackRegistrar.add("Pref.AutoDetectAspect",       boost::bind(&LLFloaterPreference::onCommitAutoDetectAspect, this));	
 	mCommitCallbackRegistrar.add("Pref.onSelectAspectRatio",    boost::bind(&LLFloaterPreference::onKeystrokeAspectRatio, this));	
 	mCommitCallbackRegistrar.add("Pref.QualityPerformance",     boost::bind(&LLFloaterPreference::onChangeQuality, this, _2));	
+	mCommitCallbackRegistrar.add("Pref.applyUIColor",			boost::bind(&LLFloaterPreference::applyUIColor, this ,_1, _2));
+	mCommitCallbackRegistrar.add("Pref.getUIColor",				boost::bind(&LLFloaterPreference::getUIColor, this ,_1, _2));
 	
 	sSkin = gSavedSettings.getString("SkinCurrent");
 	
@@ -1356,18 +1358,24 @@ void LLFloaterPreference::initWindowSizeControls(LLPanel* panelp)
 }
 
 
+void LLFloaterPreference::applyUIColor(LLUICtrl* ctrl, const LLSD& param)
+{
+	LLUIColorTable::instance().setColor(param.asString(), LLColor4(ctrl->getValue()));
+}
+
+void LLFloaterPreference::getUIColor(LLUICtrl* ctrl, const LLSD& param)
+{
+	LLColorSwatchCtrl* color_swatch = (LLColorSwatchCtrl*) ctrl;
+	color_swatch->setOriginal(LLUIColorTable::instance().getColor(param.asString()));
+}
+
 
 //----------------------------------------------------------------------------
 static LLRegisterPanelClassWrapper<LLPanelPreference> t_places("panel_preference");
 LLPanelPreference::LLPanelPreference()
 : LLPanel()
 {
-	mCommitCallbackRegistrar.add("Pref.setControlFalse",		boost::bind(&LLPanelPreference::setControlFalse,this, _2));
-}
-
-static void applyUIColor(const std::string& color_name, LLUICtrl* ctrl, const LLSD& param)
-{
-	LLUIColorTable::instance().setColor(color_name, LLColor4(param));
+	mCommitCallbackRegistrar.add("Pref.setControlFalse",	boost::bind(&LLPanelPreference::setControlFalse,this, _2));
 }
 
 //virtual
@@ -1496,55 +1504,6 @@ BOOL LLPanelPreference::postBuild()
 		refresh();
 	}
 	
-
-	if(hasChild("user") && hasChild("agent") && hasChild("im") 
-	&& hasChild("system") && hasChild("script_error") && hasChild("objects") 
-	&& hasChild("owner") && hasChild("background") && hasChild("links"))
-	{
-		LLColorSwatchCtrl* color_swatch = getChild<LLColorSwatchCtrl>("user");
-		color_swatch->setCommitCallback(boost::bind(&applyUIColor, "UserChatColor", _1, _2));
-		color_swatch->setOriginal(LLUIColorTable::instance().getColor("UserChatColor"));
-
-		color_swatch = getChild<LLColorSwatchCtrl>("agent");
-		color_swatch->setCommitCallback(boost::bind(&applyUIColor, "AgentChatColor", _1, _2));
-		color_swatch->setOriginal(LLUIColorTable::instance().getColor("AgentChatColor"));
-
-		color_swatch = getChild<LLColorSwatchCtrl>("im");
-		color_swatch->setCommitCallback(boost::bind(&applyUIColor, "IMChatColor", _1, _2));
-		color_swatch->setOriginal(LLUIColorTable::instance().getColor("IMChatColor"));
-
-		color_swatch = getChild<LLColorSwatchCtrl>("system");
-		color_swatch->setCommitCallback(boost::bind(&applyUIColor, "SystemChatColor", _1, _2));
-		color_swatch->setOriginal(LLUIColorTable::instance().getColor("SystemChatColor"));
-
-		color_swatch = getChild<LLColorSwatchCtrl>("script_error");
-		color_swatch->setCommitCallback(boost::bind(&applyUIColor, "ScriptErrorColor", _1, _2));
-		color_swatch->setOriginal(LLUIColorTable::instance().getColor("ScriptErrorColor"));
-
-		color_swatch = getChild<LLColorSwatchCtrl>("objects");
-		color_swatch->setCommitCallback(boost::bind(&applyUIColor, "ObjectChatColor", _1, _2));
-		color_swatch->setOriginal(LLUIColorTable::instance().getColor("ObjectChatColor"));
-
-		color_swatch = getChild<LLColorSwatchCtrl>("owner");
-		color_swatch->setCommitCallback(boost::bind(&applyUIColor, "llOwnerSayChatColor", _1, _2));
-		color_swatch->setOriginal(LLUIColorTable::instance().getColor("llOwnerSayChatColor"));
-
-		color_swatch = getChild<LLColorSwatchCtrl>("background");
-		color_swatch->setCommitCallback(boost::bind(&applyUIColor, "BackgroundChatColor", _1, _2));
-		color_swatch->setOriginal(LLUIColorTable::instance().getColor("BackgroundChatColor"));
-
-		color_swatch = getChild<LLColorSwatchCtrl>("links");
-		color_swatch->setCommitCallback(boost::bind(&applyUIColor, "HTMLLinkColor", _1, _2));
-		color_swatch->setOriginal(LLUIColorTable::instance().getColor("HTMLLinkColor"));
-	}
-
-	if(hasChild("effect_color_swatch"))
-	{
-		LLColorSwatchCtrl* color_swatch = getChild<LLColorSwatchCtrl>("effect_color_swatch");
-		color_swatch->setCommitCallback(boost::bind(&applyUIColor, "EffectColor", _1, _2));
-		color_swatch->setOriginal(LLUIColorTable::instance().getColor("EffectColor"));
-	}
-
 	apply();
 	return true;
 }
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index b1ad0348c0d..10f39e46f14 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -133,7 +133,9 @@ class LLFloaterPreference : public LLFloater
 	void onCommitAutoDetectAspect();
 	void applyResolution();
 	void applyWindowSize();
-
+	void applyUIColor(LLUICtrl* ctrl, const LLSD& param);
+	void getUIColor(LLUICtrl* ctrl, const LLSD& param);	
+	
 	static void initWindowSizeControls(LLPanel* panelp);
 	
 	static void buildLists(void* data);
@@ -159,6 +161,7 @@ class LLPanelPreference : public LLPanel
 	virtual void apply();
 	virtual void cancel();
 	void setControlFalse(const LLSD& user_data);
+
 private:
 	typedef std::map<LLControlVariable*, LLSD> control_values_map_t;
 	control_values_map_t mSavedValues;
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index 645863e7a4a..5a4b0a3892d 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -45,14 +45,20 @@
     <color_swatch
      border_color="0.45098 0.517647 0.607843 1"
      can_apply_immediately="true"
-     control_name="UserChatColor"
      follows="left|top"
      height="47"
      layout="topleft"
      left="30"
      name="user"
      top_pad="10"
-     width="44" />
+     width="44" >
+		<color_swatch.init_callback
+		 function="Pref.getUIColor"
+		 parameter="UserChatColor" />
+		<color_swatch.commit_callback
+		 function="Pref.applyUIColor"
+		 parameter="UserChatColor" />
+	</color_swatch>
     <text
      type="string"
      length="1"
@@ -69,14 +75,20 @@
     <color_swatch
      border_color="0.45098 0.517647 0.607843 1"
      can_apply_immediately="true"
-     control_name="AgentChatColor"
      follows="left|top"
      height="47"
      layout="topleft"
      left="180"
      name="agent"
      top_pad="-17"
-     width="44" />
+     width="44" >
+		<color_swatch.init_callback
+		 function="Pref.getUIColor"
+		 parameter="AgentChatColor" />
+		<color_swatch.commit_callback
+		 function="Pref.applyUIColor"
+		 parameter="AgentChatColor" />
+	</color_swatch>
     <text
      type="string"
      length="1"
@@ -94,7 +106,6 @@
      border_color="0.45098 0.517647 0.607843 1"
      can_apply_immediately="true"
      color="0.6 0.6 1 1"
-     control_name="IMChatColor"
      follows="left|top"
      height="47"
      label_width="60"
@@ -102,8 +113,15 @@
      left="350"
      name="im"
      top_pad="-17"
-     width="44" />
-        <text
+     width="44">
+		<color_swatch.init_callback
+		 function="Pref.getUIColor"
+		 parameter="IMChatColor" />
+		<color_swatch.commit_callback
+		 function="Pref.applyUIColor"
+		 parameter="IMChatColor" />
+	</color_swatch>
+	<text
      type="string"
      length="1"
      follows="left|top"
@@ -120,7 +138,6 @@
      border_color="0.45098 0.517647 0.607843 1"
      can_apply_immediately="true"
      color="0.8 1 1 1"
-     control_name="SystemChatColor"
      follows="left|top"
      height="47"
      label_width="44"
@@ -128,7 +145,14 @@
      left="30"
      name="system"
      top_pad="40"
-     width="44" />
+     width="44" >
+		<color_swatch.init_callback
+		 function="Pref.getUIColor"
+		 parameter="SystemChatColor" />
+		<color_swatch.commit_callback
+		 function="Pref.applyUIColor"
+		 parameter="SystemChatColor" />
+	</color_swatch>
     <text
      type="string"
      length="1"
@@ -146,14 +170,20 @@
      border_color="0.45098 0.517647 0.607843 1"
      can_apply_immediately="true"
      color="0.82 0.82 0.99 1"
-     control_name="ScriptErrorColor"
      follows="left|top"
      height="47"
      layout="topleft"
      left="180"
      name="script_error"
      top_pad="-17"
-     width="44" />
+     width="44">
+		<color_swatch.init_callback
+		 function="Pref.getUIColor"
+		 parameter="ScriptErrorColor" />
+		<color_swatch.commit_callback
+		 function="Pref.applyUIColor"
+		 parameter="ScriptErrorColor" />
+	</color_swatch>
     <text
      type="string"
      length="1"
@@ -171,14 +201,20 @@
      border_color="0.45098 0.517647 0.607843 1"
      can_apply_immediately="true"
      color="0.7 0.9 0.7 1"
-     control_name="ObjectChatColor"
      follows="left|top"
      height="47"
      layout="topleft"
      left="350"
      name="objects"
      top_pad="-17"
-     width="44" />
+     width="44" >
+		<color_swatch.init_callback
+		 function="Pref.getUIColor"
+		 parameter="ObjectChatColor" />
+		<color_swatch.commit_callback
+		 function="Pref.applyUIColor"
+		 parameter="ObjectChatColor" />
+	</color_swatch>
     <text
      type="string"
      length="1"
@@ -196,14 +232,20 @@
      border_color="0.45098 0.517647 0.607843 1"
      can_apply_immediately="true"
      color="0.7 0.9 0.7 1"
-     control_name="llOwnerSayChatColor"
      follows="left|top"
      height="47"
      layout="topleft"
      left="30"
      name="owner"
      top_pad="40"
-     width="44" />
+     width="44" >
+		<color_swatch.init_callback
+		 function="Pref.getUIColor"
+		 parameter="llOwnerSayChatColor" />
+		<color_swatch.commit_callback
+		 function="Pref.applyUIColor"
+		 parameter="llOwnerSayChatColor" />
+	</color_swatch>
     <text
      type="string"
      length="1"
@@ -221,14 +263,20 @@
      border_color="0.45098 0.517647 0.607843 1"
      can_apply_immediately="true"
      color="0.6 0.6 1 1"
-     control_name="HTMLLinkColor"
      follows="left|top"
      height="47"
      layout="topleft"
      left="180"
      name="links"
      top_pad="-17"
-     width="44" />
+     width="44" >
+		<color_swatch.init_callback
+		 function="Pref.getUIColor"
+		 parameter="HTMLLinkColor" />
+		<color_swatch.commit_callback
+		 function="Pref.applyUIColor"
+		 parameter="HTMLLinkColor" />
+	</color_swatch>
     <text
      type="string"
      length="1"
-- 
GitLab


From 107525aa5a82b1cd4b2152e498d93d5db6577a15 Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Tue, 10 Nov 2009 17:00:29 +0200
Subject: [PATCH 049/557] Update for major task EXT-2251 - Implement panels for
 creating, editing and viewing Classifieds. Fixed bugs, cleared code.

--HG--
branch : product-engine
---
 indra/newview/llpanelclassified.cpp           | 115 +++++++++++-------
 indra/newview/llpanelclassified.h             |  72 ++++++-----
 indra/newview/llpanelpicks.cpp                |   4 +-
 indra/newview/llpanelpicks.h                  |   4 +
 .../default/xui/en/panel_edit_classified.xml  |   8 +-
 5 files changed, 126 insertions(+), 77 deletions(-)

diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index f03e7da2ece..5679233844c 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -1241,13 +1241,12 @@ void LLPanelClassifiedInfo::resetData()
 	setClassifiedId(LLUUID::null);
 	setSnapshotId(LLUUID::null);
 	mPosGlobal.clearVec();
+	childSetValue("category", LLStringUtil::null);
+	childSetValue("content_type", LLStringUtil::null);
 }
 
 void LLPanelClassifiedInfo::resetControls()
 {
-	childSetValue("category", LLStringUtil::null);
-	childSetValue("content_type", LLStringUtil::null);
-
 	if(getAvatarId() == gAgent.getID())
 	{
 		childSetEnabled("edit_btn", TRUE);
@@ -1337,11 +1336,10 @@ void LLPanelClassifiedInfo::onExit()
 
 static const S32 CB_ITEM_MATURE = 0;
 static const S32 CB_ITEM_PG	   = 1;
-static std::string SET_LOCATION_NOTICE("(will update after save)");
 
 LLPanelClassifiedEdit::LLPanelClassifiedEdit()
  : LLPanelClassifiedInfo()
- , mNewClassified(false)
+ , mIsNew(false)
 {
 }
 
@@ -1362,13 +1360,18 @@ BOOL LLPanelClassifiedEdit::postBuild()
 	LLPanelClassifiedInfo::postBuild();
 
 	LLTextureCtrl* snapshot = getChild<LLTextureCtrl>("classified_snapshot");
-	snapshot->setOnSelectCallback(boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this));
+	snapshot->setOnSelectCallback(boost::bind(&LLPanelClassifiedEdit::onChange, this));
+
+	LLUICtrl* edit_icon = getChild<LLUICtrl>("edit_icon");
+	snapshot->setMouseEnterCallback(boost::bind(&LLPanelClassifiedEdit::onTexturePickerMouseEnter, this, edit_icon));
+	snapshot->setMouseLeaveCallback(boost::bind(&LLPanelClassifiedEdit::onTexturePickerMouseLeave, this, edit_icon));
+	edit_icon->setVisible(false);
 
 	LLLineEditor* line_edit = getChild<LLLineEditor>("classified_name");
-	line_edit->setKeystrokeCallback(boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this), NULL);
+	line_edit->setKeystrokeCallback(boost::bind(&LLPanelClassifiedEdit::onChange, this), NULL);
 
 	LLTextEditor* text_edit = getChild<LLTextEditor>("classified_desc");
-	text_edit->setKeystrokeCallback(boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this));
+	text_edit->setKeystrokeCallback(boost::bind(&LLPanelClassifiedEdit::onChange, this));
 
 	LLComboBox* combobox = getChild<LLComboBox>( "category");
 	LLClassifiedInfo::cat_map::iterator iter;
@@ -1379,14 +1382,14 @@ BOOL LLPanelClassifiedEdit::postBuild()
 		combobox->add(LLTrans::getString(iter->second));
 	}
 
-	combobox->setCommitCallback(boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this));
+	combobox->setCommitCallback(boost::bind(&LLPanelClassifiedEdit::onChange, this));
 
-	childSetCommitCallback("content_type", boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this), NULL);
-	childSetCommitCallback("price_for_listing", boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this), NULL);
-	childSetCommitCallback("auto_renew", boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this), NULL);
+	childSetCommitCallback("content_type", boost::bind(&LLPanelClassifiedEdit::onChange, this), NULL);
+	childSetCommitCallback("price_for_listing", boost::bind(&LLPanelClassifiedEdit::onChange, this), NULL);
+	childSetCommitCallback("auto_renew", boost::bind(&LLPanelClassifiedEdit::onChange, this), NULL);
 
-	childSetAction("save_changes_btn", boost::bind(&LLPanelClassifiedEdit::onClickSave, this));
-	childSetAction("set_to_curr_location_btn", boost::bind(&LLPanelClassifiedEdit::onClickSetLocation, this));
+	childSetAction("save_changes_btn", boost::bind(&LLPanelClassifiedEdit::onSaveClick, this));
+	childSetAction("set_to_curr_location_btn", boost::bind(&LLPanelClassifiedEdit::onSetLocationClick, this));
 
 	return TRUE;
 }
@@ -1395,9 +1398,10 @@ void LLPanelClassifiedEdit::onOpen(const LLSD& key)
 {
 	LLUUID classified_id = key["classified_id"];
 
-	if(classified_id.isNull())
+	mIsNew = classified_id.isNull();
+
+	if(mIsNew)
 	{
-		mNewClassified = true;
 		setAvatarId(gAgent.getID());
 
 		resetData();
@@ -1425,18 +1429,20 @@ void LLPanelClassifiedEdit::onOpen(const LLSD& key)
 		childSetValue("classified_name", makeClassifiedName());
 		childSetValue("classified_desc", desc);
 		setSnapshotId(snapshot_id);
-		setClassifiedLocation(createLocationText(SET_LOCATION_NOTICE, region_name, getPosGlobal()));
+		
+		setClassifiedLocation(createLocationText(getLocationNotice(), region_name, getPosGlobal()));
+		
 		// server will set valid parcel id
 		setParcelId(LLUUID::null);
 
-		enableSaveButton(true);
+		enableVerbs(true);
+		enableEditing(true);
 	}
 	else
 	{
-		mNewClassified = false;
-
 		LLPanelClassifiedInfo::onOpen(key);
-		enableSaveButton(false);
+		enableVerbs(false);
+		enableEditing(false);
 	}
 
 	resetDirty();
@@ -1450,10 +1456,11 @@ void LLPanelClassifiedEdit::processProperties(void* data, EAvatarProcessorType t
 		LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data);
 		if(c_info && getClassifiedId() == c_info->classified_id)
 		{
+			enableEditing(true);
+
 			setClassifiedName(c_info->name);
 			setDescription(c_info->description);
 			setSnapshotId(c_info->snapshot_id);
-		//	setParcelId(c_info->parcel_id);
 			setPosGlobal(c_info->pos_global);
 
 			setClassifiedLocation(createLocationText(c_info->parcel_name, c_info->sim_name, c_info->pos_global));
@@ -1475,8 +1482,10 @@ void LLPanelClassifiedEdit::processProperties(void* data, EAvatarProcessorType t
 
 BOOL LLPanelClassifiedEdit::isDirty() const
 {
-	if(mNewClassified)
+	if(mIsNew) 
+	{
 		return TRUE;
+	}
 
 	BOOL dirty = false;
 
@@ -1530,7 +1539,7 @@ void LLPanelClassifiedEdit::sendUpdate()
 
 	if(getClassifiedId().isNull())
 	{
-		LLUUID id = getClassifiedId();
+		LLUUID id;
 		id.generate();
 		setClassifiedId(id);
 	}
@@ -1543,7 +1552,7 @@ void LLPanelClassifiedEdit::sendUpdate()
 	c_data.parcel_id = getParcelId();
 	c_data.snapshot_id = getSnapshotId();
 	c_data.pos_global = getPosGlobal();
-	c_data.flags = getClassifiedFlags();
+	c_data.flags = getFlags();
 	c_data.price_for_listing = getPriceForListing();
 
 	LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoUpdate(&c_data);
@@ -1555,21 +1564,33 @@ U32 LLPanelClassifiedEdit::getCategory()
 	return cat_cb->getCurrentIndex() + 1;
 }
 
-U8 LLPanelClassifiedEdit::getClassifiedFlags()
+U8 LLPanelClassifiedEdit::getFlags()
 {
 	bool auto_renew = childGetValue("auto_renew").asBoolean();
 
 	LLComboBox* content_cb = getChild<LLComboBox>("content_type");
 	bool mature = content_cb->getCurrentIndex() == CB_ITEM_MATURE;
 	
-	return pack_classified_flags_request(auto_renew, false, mature, false);;
+	return pack_classified_flags_request(auto_renew, false, mature, false);
 }
 
-void LLPanelClassifiedEdit::enableSaveButton(bool enable)
+void LLPanelClassifiedEdit::enableVerbs(bool enable)
 {
 	childSetEnabled("save_changes_btn", enable);
 }
 
+void LLPanelClassifiedEdit::enableEditing(bool enable)
+{
+	childSetEnabled("classified_snapshot", enable);
+	childSetEnabled("classified_name", enable);
+	childSetEnabled("classified_desc", enable);
+	childSetEnabled("set_to_curr_location_btn", enable);
+	childSetEnabled("category", enable);
+	childSetEnabled("content_type", enable);
+	childSetEnabled("price_for_listing", enable);
+	childSetEnabled("auto_renew", enable);
+}
+
 std::string LLPanelClassifiedEdit::makeClassifiedName()
 {
 	std::string name;
@@ -1581,7 +1602,9 @@ std::string LLPanelClassifiedEdit::makeClassifiedName()
 	}
 
 	if(!name.empty())
+	{
 		return name;
+	}
 
 	LLViewerRegion* region = gAgent.getRegion();
 	if(region)
@@ -1597,7 +1620,7 @@ S32 LLPanelClassifiedEdit::getPriceForListing()
 	return childGetValue("price_for_listing").asInteger();
 }
 
-void LLPanelClassifiedEdit::onClickSetLocation()
+void LLPanelClassifiedEdit::onSetLocationClick()
 {
 	setPosGlobal(gAgent.getPositionGlobal());
 	setParcelId(LLUUID::null);
@@ -1609,29 +1632,39 @@ void LLPanelClassifiedEdit::onClickSetLocation()
 		region_name = region->getName();
 	}
 
-	setClassifiedLocation(createLocationText(SET_LOCATION_NOTICE, region_name, getPosGlobal()));
+	setClassifiedLocation(createLocationText(getLocationNotice(), region_name, getPosGlobal()));
 
 	// mark classified as dirty
 	setValue(LLSD());
 
-	onClassifiedChanged();
+	onChange();
 }
 
-void LLPanelClassifiedEdit::onClassifiedChanged()
+void LLPanelClassifiedEdit::onChange()
 {
-	if(isDirty())
-	{
-		enableSaveButton(true);
-	}
-	else
-	{
-		enableSaveButton(false);
-	}
+	enableVerbs(isDirty());
 }
 
-void LLPanelClassifiedEdit::onClickSave()
+void LLPanelClassifiedEdit::onSaveClick()
 {
 	sendUpdate();
+	resetDirty();
+}
+
+std::string LLPanelClassifiedEdit::getLocationNotice()
+{
+	static std::string location_notice = getString("location_notice");
+	return location_notice;
+}
+
+void LLPanelClassifiedEdit::onTexturePickerMouseEnter(LLUICtrl* ctrl)
+{
+	ctrl->setVisible(TRUE);
+}
+
+void LLPanelClassifiedEdit::onTexturePickerMouseLeave(LLUICtrl* ctrl)
+{
+	ctrl->setVisible(FALSE);
 }
 
 //EOF
diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h
index 7e384824ab4..187bdbb37e7 100644
--- a/indra/newview/llpanelclassified.h
+++ b/indra/newview/llpanelclassified.h
@@ -37,6 +37,7 @@
 #ifndef LL_LLPANELCLASSIFIED_H
 #define LL_LLPANELCLASSIFIED_H
 
+#include "llavatarpropertiesprocessor.h"
 #include "llpanel.h"
 #include "llclassifiedinfo.h"
 #include "v3dmath.h"
@@ -55,6 +56,8 @@ class LLTextureCtrl;
 class LLUICtrl;
 class LLMessageSystem;
 
+// *TODO deprecated, should be removed.
+// New class implemented in ticket EXT-2095
 class LLPanelClassified : public LLPanel
 {
 public:
@@ -198,8 +201,6 @@ class LLFloaterPriceForListing
 	void* mUserData;
 };
 
-#include "llavatarpropertiesprocessor.h"
-
 class LLPanelClassifiedInfo : public LLPanel, public LLAvatarPropertiesObserver
 {
 public:
@@ -214,39 +215,39 @@ class LLPanelClassifiedInfo : public LLPanel, public LLAvatarPropertiesObserver
 
 	/*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
 
-	virtual void setAvatarId(const LLUUID& avatar_id) { mAvatarId = avatar_id; }
+	void setAvatarId(const LLUUID& avatar_id) { mAvatarId = avatar_id; }
 
-	virtual LLUUID& getAvatarId() { return mAvatarId; }
+	LLUUID& getAvatarId() { return mAvatarId; }
 
-	virtual void setSnapshotId(const LLUUID& id);
+	void setSnapshotId(const LLUUID& id);
 
-	virtual LLUUID getSnapshotId();
+	LLUUID getSnapshotId();
 
-	virtual void setClassifiedId(const LLUUID& id) { mClassifiedId = id; }
+	void setClassifiedId(const LLUUID& id) { mClassifiedId = id; }
 
-	virtual LLUUID& getClassifiedId() { return mClassifiedId; }
+	LLUUID& getClassifiedId() { return mClassifiedId; }
 
-	virtual void setClassifiedName(const std::string& name);
+	void setClassifiedName(const std::string& name);
 
-	virtual std::string getClassifiedName();
+	std::string getClassifiedName();
 
-	virtual void setDescription(const std::string& desc);
+	void setDescription(const std::string& desc);
 
-	virtual std::string getDescription();
+	std::string getDescription();
 
-	virtual void setClassifiedLocation(const std::string& location);
+	void setClassifiedLocation(const std::string& location);
 
-	virtual void setPosGlobal(const LLVector3d& pos) { mPosGlobal = pos; }
+	void setPosGlobal(const LLVector3d& pos) { mPosGlobal = pos; }
 
-	virtual LLVector3d& getPosGlobal() { return mPosGlobal; }
+	LLVector3d& getPosGlobal() { return mPosGlobal; }
 
-	virtual void setParcelId(const LLUUID& id) { mParcelId = id; }
+	void setParcelId(const LLUUID& id) { mParcelId = id; }
 
-	virtual LLUUID getParcelId() { return mParcelId; }
+	LLUUID getParcelId() { return mParcelId; }
 
-	virtual bool getInfoLoaded() { return mInfoLoaded; }
+	bool getInfoLoaded() { return mInfoLoaded; }
 
-	virtual void setInfoLoaded(bool loaded) { mInfoLoaded = loaded; }
+	void setInfoLoaded(bool loaded) { mInfoLoaded = loaded; }
 
 	virtual void setExitCallback(const commit_callback_t& cb);
 
@@ -285,23 +286,23 @@ class LLPanelClassifiedEdit : public LLPanelClassifiedInfo
 
 	virtual ~LLPanelClassifiedEdit();
 
-	BOOL postBuild();
+	/*virtual*/ BOOL postBuild();
 
-	void onOpen(const LLSD& key);
+	/*virtual*/ void onOpen(const LLSD& key);
 
-	void processProperties(void* data, EAvatarProcessorType type);
+	/*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
 
-	BOOL isDirty() const;
+	/*virtual*/ BOOL isDirty() const;
 
-	void resetDirty();
+	/*virtual*/ void resetDirty();
 
 	void setSaveCallback(const commit_callback_t& cb);
 
 	void setCancelCallback(const commit_callback_t& cb);
 
-	void resetControls();
+	/*virtual*/ void resetControls();
 
-	virtual bool isNewClassified() { return mNewClassified; }
+	bool isNew() { return mIsNew; }
 
 protected:
 
@@ -311,20 +312,27 @@ class LLPanelClassifiedEdit : public LLPanelClassifiedInfo
 
 	U32 getCategory();
 
-	void enableSaveButton(bool enable);
+	void enableVerbs(bool enable);
+
+	void enableEditing(bool enable);
 
 	std::string makeClassifiedName();
 
 	S32 getPriceForListing();
 
-	U8 getClassifiedFlags();
+	U8 getFlags();
+
+	std::string getLocationNotice();
+
+	void onSetLocationClick();
+	void onChange();
+	void onSaveClick();
 
-	void onClickSetLocation();
-	void onClassifiedChanged();
-	void onClickSave();
+	void onTexturePickerMouseEnter(LLUICtrl* ctrl);
+	void onTexturePickerMouseLeave(LLUICtrl* ctrl);
 
 private:
-	bool mNewClassified;
+	bool mIsNew;
 };
 
 #endif // LL_LLPANELCLASSIFIED_H
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 2129fe473af..0fededcc460 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -686,7 +686,7 @@ void LLPanelPicks::onPanelPickSave(LLPanel* panel)
 
 void LLPanelPicks::onPanelClassifiedSave(LLPanelClassifiedEdit* panel)
 {
-	if(panel->isNewClassified())
+	if(panel->isNew())
 	{
 		LLClassifiedItem* c_item = new LLClassifiedItem(getAvatarId(), panel->getClassifiedId());
 		
@@ -716,7 +716,7 @@ void LLPanelPicks::onPanelClassifiedSave(LLPanelClassifiedEdit* panel)
 
 void LLPanelPicks::onPanelClassifiedClose(LLPanelClassifiedInfo* panel)
 {
-	if(panel->getInfoLoaded())
+	if(panel->getInfoLoaded() && !panel->isDirty())
 	{
 		std::vector<LLSD> values;
 		mClassifiedsList->getValues(values);
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index 68ad2436ee8..4b90ea5048b 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -57,6 +57,10 @@ class LLPanelClassifiedInfo;
 class LLPanelClassifiedEdit;
 class LLClassifiedClickThrough;
 
+// *TODO
+// Panel Picks has been consolidated with Classifieds (EXT-2095), give LLPanelPicks
+// and corresponding files (cpp, h, xml) a new name. (new name is TBD at the moment)
+
 class LLPanelPicks 
 	: public LLPanelProfileTab
 {
diff --git a/indra/newview/skins/default/xui/en/panel_edit_classified.xml b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
index 4741243addf..2f3277804f3 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_classified.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
@@ -11,6 +11,10 @@
  name="panel_edit_classified"
  top="0"
  width="333">
+ <panel.string
+  name="location_notice">
+    (will update after save)
+ </panel.string>
   <button
      follows="top|right"
      height="23"
@@ -65,9 +69,9 @@
      top="20"
      left="10"
      name="classified_snapshot" />
-          <button
+          <icon
            height="18"
-           image_overlay="AddItem_Off"
+           image_name="AddItem_Off"
            layout="topleft"
            right="-5"
            name="edit_icon"
-- 
GitLab


From 15372bbc342a7b4c7a8d9b2e1bedd52655232ba7 Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Tue, 10 Nov 2009 17:02:25 +0200
Subject: [PATCH 050/557] Update for major task EXT-2250 - Implement
 Classifieds list in Picks panel. Removed temporary workaround which was
 expanding only one accordion in Picks panel.

--HG--
branch : product-engine
---
 indra/newview/llpanelpicks.cpp | 16 ----------------
 1 file changed, 16 deletions(-)

diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 0fededcc460..c30658755ac 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -332,22 +332,6 @@ void LLPanelPicks::onPlusMenuItemClicked(const LLSD& param)
 
 void LLPanelPicks::onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab)
 {
-	if(acc_tab->getDisplayChildren())
-	{
-		if(acc_tab != mPicksAccTab && mPicksAccTab->getDisplayChildren())
-		{
-			mPicksAccTab->setDisplayChildren(false);
-		}
-
-		if(acc_tab != mClassifiedsAccTab && mClassifiedsAccTab->getDisplayChildren())
-		{
-			mClassifiedsAccTab->setDisplayChildren(false);
-		}
-
-		LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("accordion");
-		accordion->arrange();
-	}
-
 	if(!mPicksAccTab->getDisplayChildren())
 	{
 		mPicksList->resetSelection(true);
-- 
GitLab


From eb05116e2b3339648a1458fd3be5c502583053ea Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Tue, 10 Nov 2009 18:07:19 +0200
Subject: [PATCH 051/557] Work on major sub-task EXT-991 (Update bottom bar
 behavior on resize)   - update min width for chiclet panel   - move showing
 of hidden buttons to place where resize strategy is determined

--HG--
branch : product-engine
---
 indra/newview/llbottomtray.cpp                | 45 +++++++------------
 .../skins/default/xui/en/panel_bottomtray.xml |  6 ++-
 2 files changed, 20 insertions(+), 31 deletions(-)

diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index b74b1d900b8..c33d667e0bd 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -320,21 +320,26 @@ void LLBottomTray::log(LLView* panel, const std::string& descr)
 void LLBottomTray::verifyChildControlsSizes()
 {
 	LLRect rect = mChicletPanel->getRect();
+	/*
 	if (rect.getWidth() < mChicletPanel->getMinWidth())
 	{
 		llwarns << "QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ: chiclet panel less then min" << llendl;
 		mChicletPanel->reshape(mChicletPanel->getMinWidth(), rect.getHeight());
 	}
-
+*/
 	rect = mNearbyChatBar->getRect();
+/*
 	if (rect.getWidth() < mNearbyChatBar->getMinWidth())
 	{
 		llwarns << "WWWWWWWWWWWWWWWWWWWWWWWWWWWWW: near chat panel less then min" << llendl;
 		mNearbyChatBar->reshape(mNearbyChatBar->getMinWidth(), rect.getHeight());
 	}
 	else 
+*/
 		if (rect.getWidth() > mNearbyChatBar->getMaxWidth())
 	{
+		llerrs << "WWWWWWWWWWWWWWWWWWWWWWWWWWWWW: near chat panel more then max width" << llendl;
+
 		rect.setLeftTopAndSize(rect.mLeft, rect.mTop, mNearbyChatBar->getMaxWidth(), rect.getHeight());
 		mNearbyChatBar->reshape(mNearbyChatBar->getMaxWidth(), rect.getHeight());
 		mNearbyChatBar->setRect(rect);
@@ -346,11 +351,12 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
 	static S32 depth = 0;
 if (0 == depth) lldebugs << "****************************************" << llendl;
 
+	S32 prev_width = getRect().getWidth();
 	lldebugs << "Reshaping: depth: " << ++depth
 		<< ", width: " << width
 		<< ", height: " << height
 		<< ", called_from_parent: " << called_from_parent
-		<< ", cur width: " << getRect().getWidth()
+		<< ", cur width: " << prev_width
 		<< ", cur height: " << getRect().getHeight()
 		<< llendl;
 
@@ -359,19 +365,8 @@ if (0 == depth) lldebugs << "****************************************" << llendl
 
 	if (mChicletPanel && mToolbarStack && mNearbyChatBar)
 	{
-//		S32 delta_width = width - getRect().getWidth();
-		BOOL shrink = width < getRect().getWidth();
-
-
-
  		verifyChildControlsSizes();
- 		updateResizeState(width, height);
-		if (RS_NORESIZE == mResizeState && !called_from_parent)
-		{
-			// this can be in case nearby
-			lldebugs << "width was not changed & !called_from_parent" << llendl;
-
-		}
+ 		updateResizeState(width, prev_width);
 
 		if (RS_NORESIZE != mResizeState)
 		{
@@ -380,23 +375,11 @@ if (0 == depth) lldebugs << "****************************************" << llendl
 		mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE);
 
 //		mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, mResizeState & RS_CHATBAR_INPUT);
-
-
-		bool show_button = !shrink;
-		if (width != getRect().getWidth() && show_button)
-		{
-			if (mResizeState & RS_BUTTON_SNAPSHOT)	showSnapshotButton(show_button);
-			if (mResizeState & RS_BUTTON_CAMERA)	showCameraButton(show_button);
-			if (mResizeState & RS_BUTTON_MOVEMENT)	showMoveButton(show_button);
-			if (mResizeState & RS_BUTTON_GESTURES)	showGestureButton(show_button);
-		}
-
 		}
 	}
 
 	LLPanel::reshape(width, height, called_from_parent);
 
-	// *TODO: ïðîâåðèòü øèðèíó nearby ïîñëå ðåñàéçà íà ïðåäìåò âûõîäà çà ìàêñèìàëüíûé ïðåäåë
 
 	if (mNearbyChatBar)			log(mNearbyChatBar, "after");
 	if (mChicletPanel)			log(mChicletPanel, "after");
@@ -412,7 +395,7 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 	LLPanel* compansative_view = mNearbyChatBar;
 	S32 compensative_delta_width = 0;
 
-	S32 delta_width = width - getRect().getWidth();
+	S32 delta_width = width - height;
 //	if (delta_width == 0) return;
 
 	const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
@@ -431,7 +414,7 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 
 	bool still_should_be_processed = true;
 	// bottom tray is narrowed
-	if (width < getRect().getWidth())
+	if (width < height)
 	{
 		if (chiclet_panel_width > chiclet_panel_min_width)
 		{
@@ -579,6 +562,7 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 				<< ", compensative_delta_width: " << compensative_delta_width
 				<< ", delta_width: " << delta_width
 				<< llendl;
+			showGestureButton(true);
 		}
 
 		if (available_width > 0 && processShowButton(mMovementPanel, &available_width))
@@ -591,6 +575,7 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 				<< ", compensative_delta_width: " << compensative_delta_width
 				<< ", delta_width: " << delta_width
 				<< llendl;
+			showMoveButton(true);
 		}
 
 		if (available_width > 0 && processShowButton(mCamPanel, &available_width))
@@ -603,6 +588,7 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 				<< ", compensative_delta_width: " << compensative_delta_width
 				<< ", delta_width: " << delta_width
 				<< llendl;
+			showCameraButton(true);
 		}
 
 		if (available_width > 0 && processShowButton(mSnapshotPanel, &available_width))
@@ -615,12 +601,13 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 				<< ", compensative_delta_width: " << compensative_delta_width
 				<< ", delta_width: " << delta_width
 				<< llendl;
+			showSnapshotButton(true);
 		}
 
 		if (compensative_delta_width != 0)
 		{
 			S32 required_to_process_width = -compensative_delta_width;
-			S32 total_delta_width = width - getRect().getWidth();
+			S32 total_delta_width = width - height;
 
 			// 1. use delta width of resizing
 			required_to_process_width -= total_delta_width;
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 1c1065bc11a..a945010d3ef 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -224,16 +224,18 @@ bg_alpha_color="green"
          top="0"
          name="chiclet_list_panel"
          width="189"
-         min_width="189"
+         min_width="180"
          user_resize="false"
          auto_resize="true">
+<!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same 
+as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991-->
             <chiclet_panel
 	    mouse_opaque="false"
              follows="left|right"
              height="28"
              layout="topleft"
              left="0"
-             min_width="129"
+             min_width="180"
              name="chiclet_list"
              top="0"
              chiclet_padding="3"
-- 
GitLab


From 3a8c80a388df64dd58b4dc77e7219dfdd20f4aac Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Tue, 10 Nov 2009 18:45:51 +0200
Subject: [PATCH 052/557] fixed EXT-2275 "[BSI] New incoming IM or Group IM
 pushes all existing (and new) chiclets off the right end of the chiclet bar."

--HG--
branch : product-engine
---
 indra/newview/llchiclet.cpp | 25 +++++++++++++++++++++++--
 indra/newview/llchiclet.h   | 11 +++++++++++
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index fe4859ead00..e5c73dcbef5 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -59,6 +59,9 @@ static const LLRect CHICLET_RECT(0, 25, 25, 0);
 static const LLRect CHICLET_ICON_RECT(0, 24, 24, 0);
 static const LLRect VOICE_INDICATOR_RECT(25, 25, 45, 0);
 
+// static
+const S32 LLChicletPanel::s_scroll_ratio = 10;
+
 S32 LLNotificationChiclet::mUreadSystemNotifications = 0;
 
 boost::signals2::signal<LLChiclet* (const LLUUID&),
@@ -856,12 +859,14 @@ BOOL LLChicletPanel::postBuild()
 
 	mLeftScrollButton=getChild<LLButton>("chicklet_left_scroll_button");
 	LLTransientFloaterMgr::getInstance()->addControlView(mLeftScrollButton);
-	mLeftScrollButton->setClickedCallback(boost::bind(&LLChicletPanel::onLeftScrollClick,this));
+	mLeftScrollButton->setMouseDownCallback(boost::bind(&LLChicletPanel::onLeftScrollClick,this));
+	mLeftScrollButton->setHeldDownCallback(boost::bind(&LLChicletPanel::onLeftScrollHeldDown,this));
 	mLeftScrollButton->setEnabled(false);
 
 	mRightScrollButton=getChild<LLButton>("chicklet_right_scroll_button");
 	LLTransientFloaterMgr::getInstance()->addControlView(mRightScrollButton);
-	mRightScrollButton->setClickedCallback(boost::bind(&LLChicletPanel::onRightScrollClick,this));
+	mRightScrollButton->setMouseDownCallback(boost::bind(&LLChicletPanel::onRightScrollClick,this));
+	mRightScrollButton->setHeldDownCallback(boost::bind(&LLChicletPanel::onRightScrollHeldDown,this));
 	mRightScrollButton->setEnabled(false);	
 
 	return TRUE;
@@ -1220,6 +1225,22 @@ void LLChicletPanel::onRightScrollClick()
 	scrollRight();
 }
 
+void LLChicletPanel::onLeftScrollHeldDown()
+{
+	S32 offset = mScrollingOffset;
+	mScrollingOffset = mScrollingOffset / s_scroll_ratio;
+	scrollLeft();
+	mScrollingOffset = offset;
+}
+
+void LLChicletPanel::onRightScrollHeldDown()
+{
+	S32 offset = mScrollingOffset;
+	mScrollingOffset = mScrollingOffset / s_scroll_ratio;
+	scrollRight();
+	mScrollingOffset = offset;
+}
+
 boost::signals2::connection LLChicletPanel::setChicletClickedCallback(
 	const commit_callback_t& cb)
 {
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index 97af82fe2f9..e7afd7f08e3 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -830,6 +830,16 @@ class LLChicletPanel : public LLPanel
 	*/
 	void onRightScrollClick();
 
+	/*
+	* Callback for right scroll button held down event
+	*/
+	void onLeftScrollHeldDown();
+
+	/*
+	 * Callback for left scroll button held down event
+	 */
+	void onRightScrollHeldDown();
+
 	/*
 	 * Callback for mouse wheel scrolled, calls scrollRight() or scrollLeft()
 	*/
@@ -870,6 +880,7 @@ class LLChicletPanel : public LLPanel
 	S32 mScrollingOffset;
 	S32 mMinWidth;
 	bool mShowControls;
+	static const S32 s_scroll_ratio;
 };
 
 template<class T> 
-- 
GitLab


From 2fe083d36a1e5502ec8b99e367433fe5664eee09 Mon Sep 17 00:00:00 2001
From: brad kittenbrink <brad@lindenlab.com>
Date: Tue, 10 Nov 2009 12:58:22 -0500
Subject: [PATCH 053/557] Minor develop.py tweaks to make mac logs more
 readable in parabuild output. Supressing all the setenv spam.

---
 indra/develop.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/indra/develop.py b/indra/develop.py
index 7836c97473b..79baa613adb 100755
--- a/indra/develop.py
+++ b/indra/develop.py
@@ -239,6 +239,7 @@ def arch(self):
 
     def run(self, command, name=None):
         '''Run a program.  If the program fails, raise an exception.'''
+        sys.stdout.flush()
         ret = os.system(command)
         if ret:
             if name is None:
@@ -456,7 +457,7 @@ def run_build(self, opts, targets):
             targets = ' '.join(['-target ' + repr(t) for t in targets])
         else:
             targets = ''
-        cmd = ('xcodebuild -configuration %s %s %s' %
+        cmd = ('xcodebuild -configuration %s %s %s | grep -v "^[[:space:]]*setenv" ; exit ${PIPESTATUS[0]}' %
                (self.build_type, ' '.join(opts), targets))
         for d in self.build_dirs():
             try:
-- 
GitLab


From fc849873abb839b013efbae5e44b150d4be1f236 Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Tue, 10 Nov 2009 13:16:33 -0500
Subject: [PATCH 054/557] Remove dangling LLEVENTS_LISTENER_ARITY control

---
 indra/llcommon/llevents.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h
index 192d79b27dd..f52cf33fd8d 100644
--- a/indra/llcommon/llevents.h
+++ b/indra/llcommon/llevents.h
@@ -45,10 +45,12 @@
 #include "llsingleton.h"
 #include "lldependencies.h"
 
+/*==========================================================================*|
 // override this to allow binding free functions with more parameters
 #ifndef LLEVENTS_LISTENER_ARITY
 #define LLEVENTS_LISTENER_ARITY 10
 #endif
+|*==========================================================================*/
 
 // hack for testing
 #ifndef testable
-- 
GitLab


From 34bd95ff1fb1eb69a3bd2a95ac714477ce70bca8 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Tue, 10 Nov 2009 10:17:26 -0800
Subject: [PATCH 055/557] Don't allocate memory for debugging strings every
 mouse click.

---
 indra/newview/llviewerwindow.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index fc09c946af4..2c2670563e1 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -600,8 +600,8 @@ void LLViewerWindow::updateDebugText()
 
 BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window,  LLCoordGL pos, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down)
 {
-	std::string buttonname;
-	std::string buttonstatestr; 
+	const char* buttonname = "";
+	const char* buttonstatestr = "";
 	BOOL handled = FALSE;	
 	S32 x = pos.mX;
 	S32 y = pos.mY;
-- 
GitLab


From a97aebb84a8b5b43de01fd3823d1b38e711e6ab7 Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Tue, 10 Nov 2009 13:30:29 -0500
Subject: [PATCH 056/557] Enhance LLInstanceTracker variants to be more
 uniform. For both the (so far unused) generic KEY form and the KEY = T* form,
 provide key_iter, beginKeys(), endKeys(). Change instance_iter so that when
 dereferenced, it gives you a T& rather than a T*, to be more harmonious with
 a typical STL container. (You parameterize LLInstanceTracker with T, not with
 T*.) Fix existing usage in llfasttimer.cpp and lltimer.cpp to agree. For the
 KEY = T* specialization, add T* getInstance(T*) so client isn't forced to
 know which variant was used. Add unit tests for uniformity of public
 operations on both variants.

---
 indra/llcommon/CMakeLists.txt                 |   1 +
 indra/llcommon/llinstancetracker.h            |  90 +++++++---
 indra/llcommon/lltimer.cpp                    |  12 +-
 .../llcommon/tests/llinstancetracker_test.cpp | 160 ++++++++++++++++++
 4 files changed, 231 insertions(+), 32 deletions(-)
 create mode 100644 indra/llcommon/tests/llinstancetracker_test.cpp

diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index f7856986121..3a36b8430c0 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -305,6 +305,7 @@ LL_ADD_INTEGRATION_TEST(lldate "" "${test_libs}")
 LL_ADD_INTEGRATION_TEST(lldependencies "" "${test_libs}")
 LL_ADD_INTEGRATION_TEST(llerror "" "${test_libs}")
 LL_ADD_INTEGRATION_TEST(llframetimer "" "${test_libs}")
+LL_ADD_INTEGRATION_TEST(llinstancetracker "" "${test_libs}")
 LL_ADD_INTEGRATION_TEST(lllazy "" "${test_libs}")
 LL_ADD_INTEGRATION_TEST(llrand "" "${test_libs}")
 LL_ADD_INTEGRATION_TEST(llsdserialize "" "${test_libs}")
diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h
index ea50acbbc5e..039d68faef8 100644
--- a/indra/llcommon/llinstancetracker.h
+++ b/indra/llcommon/llinstancetracker.h
@@ -38,22 +38,53 @@
 
 #include "string_table.h"
 #include <boost/utility.hpp>
-
-// This mix-in class adds support for tracking all instances of the specified class parameter T
-// The (optional) key associates a value of type KEY with a given instance of T, for quick lookup
-// If KEY is not provided, then instances are stored in a simple set
-// *NOTE: see explicit specialization below for default KEY==T* case
+#include <boost/function.hpp>
+#include <boost/bind.hpp>
+#include <boost/iterator/transform_iterator.hpp>
+#include <boost/iterator/indirect_iterator.hpp>
+
+/// This mix-in class adds support for tracking all instances of the specified class parameter T
+/// The (optional) key associates a value of type KEY with a given instance of T, for quick lookup
+/// If KEY is not provided, then instances are stored in a simple set
+/// @NOTE: see explicit specialization below for default KEY==T* case
 template<typename T, typename KEY = T*>
 class LLInstanceTracker : boost::noncopyable
 {
+	typedef typename std::map<KEY, T*> InstanceMap;
+	typedef boost::function<const KEY&(typename InstanceMap::value_type&)> KeyGetter;
+	typedef boost::function<T*(typename InstanceMap::value_type&)> InstancePtrGetter;
 public:
-	typedef typename std::map<KEY, T*>::iterator instance_iter;
-	typedef typename std::map<KEY, T*>::const_iterator instance_const_iter;
-
-	static T* getInstance(const KEY& k) { instance_iter found = getMap().find(k); return (found == getMap().end()) ? NULL : found->second; }
+	/// Dereferencing key_iter gives you a const KEY&
+	typedef boost::transform_iterator<KeyGetter, typename InstanceMap::iterator> key_iter;
+	/// Dereferencing instance_iter gives you a T&
+	typedef boost::indirect_iterator< boost::transform_iterator<InstancePtrGetter, typename InstanceMap::iterator> > instance_iter;
+
+	static T* getInstance(const KEY& k)
+	{
+		typename InstanceMap::const_iterator found = getMap().find(k);
+		return (found == getMap().end()) ? NULL : found->second;
+	}
 
-	static instance_iter beginInstances() { return getMap().begin(); }
-	static instance_iter endInstances() { return getMap().end(); }
+	static key_iter beginKeys()
+	{
+		return boost::make_transform_iterator(getMap().begin(),
+											  boost::bind(&InstanceMap::value_type::first, _1));
+	}
+	static key_iter endKeys()
+	{
+		return boost::make_transform_iterator(getMap().end(),
+											  boost::bind(&InstanceMap::value_type::first, _1));
+	}
+	static instance_iter beginInstances()
+	{
+		return instance_iter(boost::make_transform_iterator(getMap().begin(),
+															boost::bind(&InstanceMap::value_type::second, _1)));
+	}
+	static instance_iter endInstances()
+	{
+		return instance_iter(boost::make_transform_iterator(getMap().end(),
+															boost::bind(&InstanceMap::value_type::second, _1)));
+	}
 	static S32 instanceCount() { return getMap().size(); }
 protected:
 	LLInstanceTracker(KEY key) { add(key); }
@@ -69,11 +100,11 @@ class LLInstanceTracker : boost::noncopyable
 	}
 	void remove() { getMap().erase(mKey); }
 
-    static std::map<KEY, T*>& getMap()
+    static InstanceMap& getMap()
     {
         if (! sInstances)
         {
-            sInstances = new std::map<KEY, T*>;
+            sInstances = new InstanceMap;
         }
         return *sInstances;
     }
@@ -81,20 +112,27 @@ class LLInstanceTracker : boost::noncopyable
 private:
 
 	KEY mKey;
-	static std::map<KEY, T*>* sInstances;
+	static InstanceMap* sInstances;
 };
 
-// explicit specialization for default case where KEY is T*
-// use a simple std::set<T*>
+/// explicit specialization for default case where KEY is T*
+/// use a simple std::set<T*>
 template<typename T>
 class LLInstanceTracker<T, T*>
 {
+	typedef typename std::set<T*> InstanceSet;
 public:
-	typedef typename std::set<T*>::iterator instance_iter;
-	typedef typename std::set<T*>::const_iterator instance_const_iter;
-
-	static instance_iter beginInstances() { return getSet().begin(); }
-	static instance_iter endInstances() { return getSet().end(); }
+	/// Dereferencing key_iter gives you a T* (since T* is the key)
+	typedef typename InstanceSet::iterator key_iter;
+	/// Dereferencing instance_iter gives you a T&
+	typedef boost::indirect_iterator<key_iter> instance_iter;
+
+	/// for completeness of analogy with the generic implementation
+	static T* getInstance(T* k) { return k; }
+	static key_iter beginKeys() { return getSet().begin(); }
+	static key_iter endKeys()   { return getSet().end(); }
+	static instance_iter beginInstances() { return instance_iter(getSet().begin()); }
+	static instance_iter endInstances()   { return instance_iter(getSet().end()); }
 	static S32 instanceCount() { return getSet().size(); }
 
 protected:
@@ -103,19 +141,19 @@ class LLInstanceTracker<T, T*>
 
 	LLInstanceTracker(const LLInstanceTracker& other) { getSet().insert(static_cast<T*>(this)); }
 
-    static std::set<T*>& getSet()   // called after getReady() but before go()
+    static InstanceSet& getSet()   // called after getReady() but before go()
     {
         if (! sInstances)
         {
-            sInstances = new std::set<T*>;
+            sInstances = new InstanceSet;
         }
         return *sInstances;
     }
 
-	static std::set<T*>* sInstances;
+	static InstanceSet* sInstances;
 };
 
-template <typename T, typename KEY> std::map<KEY, T*>* LLInstanceTracker<T, KEY>::sInstances = NULL;
-template <typename T> std::set<T*>* LLInstanceTracker<T, T*>::sInstances = NULL;
+template <typename T, typename KEY> typename LLInstanceTracker<T, KEY>::InstanceMap* LLInstanceTracker<T, KEY>::sInstances = NULL;
+template <typename T> typename LLInstanceTracker<T, T*>::InstanceSet* LLInstanceTracker<T, T*>::sInstances = NULL;
 
 #endif
diff --git a/indra/llcommon/lltimer.cpp b/indra/llcommon/lltimer.cpp
index ea5b0c03ef1..ef3e8dbc946 100644
--- a/indra/llcommon/lltimer.cpp
+++ b/indra/llcommon/lltimer.cpp
@@ -583,13 +583,13 @@ void LLEventTimer::updateClass()
 	std::list<LLEventTimer*> completed_timers;
 	for (instance_iter iter = beginInstances(); iter != endInstances(); ) 
 	{
-		LLEventTimer* timer = *iter++;
-		F32 et = timer->mEventTimer.getElapsedTimeF32();
-		if (timer->mEventTimer.getStarted() && et > timer->mPeriod) {
-			timer->mEventTimer.reset();
-			if ( timer->tick() )
+		LLEventTimer& timer = *iter++;
+		F32 et = timer.mEventTimer.getElapsedTimeF32();
+		if (timer.mEventTimer.getStarted() && et > timer.mPeriod) {
+			timer.mEventTimer.reset();
+			if ( timer.tick() )
 			{
-				completed_timers.push_back( timer );
+				completed_timers.push_back( &timer );
 			}
 		}
 	}
diff --git a/indra/llcommon/tests/llinstancetracker_test.cpp b/indra/llcommon/tests/llinstancetracker_test.cpp
new file mode 100644
index 00000000000..7415f2d33b1
--- /dev/null
+++ b/indra/llcommon/tests/llinstancetracker_test.cpp
@@ -0,0 +1,160 @@
+/**
+ * @file   llinstancetracker_test.cpp
+ * @author Nat Goodspeed
+ * @date   2009-11-10
+ * @brief  Test for llinstancetracker.
+ * 
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llinstancetracker.h"
+// STL headers
+#include <string>
+#include <vector>
+#include <set>
+#include <algorithm>                // std::sort()
+// std headers
+// external library headers
+#include <boost/scoped_ptr.hpp>
+// other Linden headers
+#include "../test/lltut.h"
+
+struct Keyed: public LLInstanceTracker<Keyed, std::string>
+{
+    Keyed(const std::string& name):
+        LLInstanceTracker<Keyed, std::string>(name),
+        mName(name)
+    {}
+    std::string mName;
+};
+
+struct Unkeyed: public LLInstanceTracker<Unkeyed>
+{
+};
+
+/*****************************************************************************
+*   TUT
+*****************************************************************************/
+namespace tut
+{
+    struct llinstancetracker_data
+    {
+    };
+    typedef test_group<llinstancetracker_data> llinstancetracker_group;
+    typedef llinstancetracker_group::object object;
+    llinstancetracker_group llinstancetrackergrp("llinstancetracker");
+
+    template<> template<>
+    void object::test<1>()
+    {
+        ensure_equals(Keyed::instanceCount(), 0);
+        {
+            Keyed one("one");
+            ensure_equals(Keyed::instanceCount(), 1);
+            Keyed* found = Keyed::getInstance("one");
+            ensure("couldn't find stack Keyed", found);
+            ensure_equals("found wrong Keyed instance", found, &one);
+            {
+                boost::scoped_ptr<Keyed> two(new Keyed("two"));
+                ensure_equals(Keyed::instanceCount(), 2);
+                Keyed* found = Keyed::getInstance("two");
+                ensure("couldn't find heap Keyed", found);
+                ensure_equals("found wrong Keyed instance", found, two.get());
+            }
+            ensure_equals(Keyed::instanceCount(), 1);
+        }
+        Keyed* found = Keyed::getInstance("one");
+        ensure("Keyed key lives too long", ! found);
+        ensure_equals(Keyed::instanceCount(), 0);
+    }
+
+    template<> template<>
+    void object::test<2>()
+    {
+        ensure_equals(Unkeyed::instanceCount(), 0);
+        {
+            Unkeyed one;
+            ensure_equals(Unkeyed::instanceCount(), 1);
+            Unkeyed* found = Unkeyed::getInstance(&one);
+            ensure_equals(found, &one);
+            {
+                boost::scoped_ptr<Unkeyed> two(new Unkeyed);
+                ensure_equals(Unkeyed::instanceCount(), 2);
+                Unkeyed* found = Unkeyed::getInstance(two.get());
+                ensure_equals(found, two.get());
+            }
+            ensure_equals(Unkeyed::instanceCount(), 1);
+        }
+        ensure_equals(Unkeyed::instanceCount(), 0);
+    }
+
+    template<> template<>
+    void object::test<3>()
+    {
+        Keyed one("one"), two("two"), three("three");
+        // We don't want to rely on the underlying container delivering keys
+        // in any particular order. That allows us the flexibility to
+        // reimplement LLInstanceTracker using, say, a hash map instead of a
+        // std::map. We DO insist that every key appear exactly once.
+        typedef std::vector<std::string> StringVector;
+        StringVector keys(Keyed::beginKeys(), Keyed::endKeys());
+        std::sort(keys.begin(), keys.end());
+        StringVector::const_iterator ki(keys.begin());
+        ensure_equals(*ki++, "one");
+        ensure_equals(*ki++, "three");
+        ensure_equals(*ki++, "two");
+        // Use ensure() here because ensure_equals would want to display
+        // mismatched values, and frankly that wouldn't help much.
+        ensure("didn't reach end", ki == keys.end());
+
+        // Use a somewhat different approach to order independence with
+        // beginInstances(): explicitly capture the instances we know in a
+        // set, and delete them as we iterate through.
+        typedef std::set<Keyed*> InstanceSet;
+        InstanceSet instances;
+        instances.insert(&one);
+        instances.insert(&two);
+        instances.insert(&three);
+        for (Keyed::instance_iter ii(Keyed::beginInstances()), iend(Keyed::endInstances());
+             ii != iend; ++ii)
+        {
+            Keyed& ref = *ii;
+            ensure_equals("spurious instance", instances.erase(&ref), 1);
+        }
+        ensure_equals("unreported instance", instances.size(), 0);
+    }
+
+    template<> template<>
+    void object::test<4>()
+    {
+        Unkeyed one, two, three;
+        typedef std::set<Unkeyed*> KeySet;
+        KeySet keys;
+        keys.insert(&one);
+        keys.insert(&two);
+        keys.insert(&three);
+        for (Unkeyed::key_iter ki(Unkeyed::beginKeys()), kend(Unkeyed::endKeys());
+             ki != kend; ++ki)
+        {
+            ensure_equals("spurious key", keys.erase(*ki), 1);
+        }
+        ensure_equals("unreported key", keys.size(), 0);
+
+        KeySet instances;
+        instances.insert(&one);
+        instances.insert(&two);
+        instances.insert(&three);
+        for (Unkeyed::instance_iter ii(Unkeyed::beginInstances()), iend(Unkeyed::endInstances());
+             ii != iend; ++ii)
+        {
+            Unkeyed& ref = *ii;
+            ensure_equals("spurious instance", instances.erase(&ref), 1);
+        }
+        ensure_equals("unreported instance", instances.size(), 0);
+    }
+} // namespace tut
-- 
GitLab


From 162924aadfb6a7312287d91a25a129885239c0a4 Mon Sep 17 00:00:00 2001
From: Lynx Linden <lynx@lindenlab.com>
Date: Tue, 10 Nov 2009 18:53:07 +0000
Subject: [PATCH 057/557] DEV-41317 DEV-42311: Added ad-hoc voice call support.

You can now multiple select users in the People panel, hit Call, and
start an ad-hoc voice conference call with those users.

The most difficult part here was automatically starting the call once
the conference chat panel popped up. We have to wait for the panel to
initialize before we can start a call, so I added another callback to
LLIMModel to enable us to get notified when the panel has initialized.
This is all wrapped up behind a new LLAvatarActions::startAdhocCall()
API.
---
 indra/newview/llavataractions.cpp             | 50 ++++++++++++++++++-
 indra/newview/llavataractions.h               | 13 +++++
 indra/newview/llimview.cpp                    | 12 ++++-
 indra/newview/llimview.h                      |  3 ++
 indra/newview/llpanelimcontrolpanel.cpp       |  8 +++
 indra/newview/llpanelimcontrolpanel.h         |  5 +-
 indra/newview/llpanelpeople.cpp               |  7 +--
 .../newview/skins/default/xui/en/strings.xml  |  3 ++
 8 files changed, 95 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index dae4296a82e..4456e0aa748 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -58,7 +58,10 @@
 #include "llviewermessage.h"	// for handle_lure
 #include "llviewerregion.h"
 #include "llimfloater.h"
+#include "lltrans.h"
 
+// callback connection to auto-call when the IM floater initializes
+boost::signals2::connection gAdhocAutoCall;
 
 // static
 void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::string& name)
@@ -205,6 +208,39 @@ void LLAvatarActions::startCall(const LLUUID& id)
 	make_ui_sound("UISndStartIM");
 }
 
+// static
+void LLAvatarActions::startAdhocCall(const std::vector<LLUUID>& ids)
+{
+	if (ids.size() == 0)
+	{
+		return;
+	}
+
+	// convert vector into LLDynamicArray for addSession
+	LLDynamicArray<LLUUID> id_array;
+	for (std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); ++it)
+	{
+		id_array.push_back(*it);
+	}
+
+	// create the new ad hoc voice session
+	const std::string title = LLTrans::getString("conference-title");
+	LLUUID session_id = gIMMgr->addSession(title, IM_SESSION_CONFERENCE_START,
+										   ids[0], id_array);
+	if (session_id == LLUUID::null)
+	{
+		return;
+	}
+
+	// always open IM window when connecting to voice
+	LLIMFloater::show(session_id);
+
+	// start the call once the floater has fully initialized
+	gAdhocAutoCall = LLIMModel::getInstance()->addSessionInitializedCallback(callbackAutoStartCall);
+
+	make_ui_sound("UISndStartIM");
+}
+
 // static
 bool LLAvatarActions::isCalling(const LLUUID &id)
 {
@@ -226,7 +262,8 @@ void LLAvatarActions::startConference(const std::vector<LLUUID>& ids)
 	{
 		id_array.push_back(*it);
 	}
-	LLUUID session_id = gIMMgr->addSession("Friends Conference", IM_SESSION_CONFERENCE_START, ids[0], id_array);
+	const std::string title = LLTrans::getString("conference-title");
+	LLUUID session_id = gIMMgr->addSession(title, IM_SESSION_CONFERENCE_START, ids[0], id_array);
 	if (session_id != LLUUID::null)
 	{
 		LLIMFloater::show(session_id);
@@ -393,6 +430,17 @@ bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& re
     return false;
 }
 
+// static
+void LLAvatarActions::callbackAutoStartCall(const LLSD& data)
+{
+	// start the adhoc voice call now the IM panel has initialized
+	LLUUID session_id = data["session_id"].asUUID();
+	gIMMgr->startCall(session_id);
+
+	// and deschedule this callback as its work is done now
+	gAdhocAutoCall.disconnect();
+}
+
 // static
 void LLAvatarActions::requestFriendship(const LLUUID& target_id, const std::string& target_name, const std::string& message)
 {
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index 0ec20ae3572..66ea6880dbf 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -33,6 +33,13 @@
 #ifndef LL_LLAVATARACTIONS_H
 #define LL_LLAVATARACTIONS_H
 
+#include "lldarray.h"
+#include "llsd.h"
+#include "lluuid.h"
+
+#include <string>
+#include <vector>
+
 /**
  * Friend-related actions (add, remove, offer teleport, etc)
  */
@@ -71,6 +78,11 @@ class LLAvatarActions
 	 */
 	static void startCall(const LLUUID& id);
 
+	/**
+	 * Start an ad-hoc conference voice call with multiple users
+	 */
+	static void startAdhocCall(const std::vector<LLUUID>& ids);
+
 	/**
 	 * Start conference chat with the given avatars.
 	 */
@@ -117,6 +129,7 @@ class LLAvatarActions
 	static bool handleRemove(const LLSD& notification, const LLSD& response);
 	static bool handlePay(const LLSD& notification, const LLSD& response, LLUUID avatar_id);
 	static void callback_invite_to_group(LLUUID group_id, LLUUID id);
+	static void callbackAutoStartCall(const LLSD& data);
 
 	// Just request friendship, no dialog.
 	static void requestFriendship(const LLUUID& target_id, const std::string& target_name, const std::string& message);
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 8fb7027e82c..d009d45db47 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -862,7 +862,17 @@ bool LLIMModel::sendStartSession(
 	return false;
 }
 
-
+// static
+void LLIMModel::sendSessionInitialized(const LLUUID &session_id)
+{
+	LLIMSession* session = getInstance()->findIMSession(session_id);
+	if (session)
+	{
+		LLSD arg;
+		arg["session_id"] = session_id;
+		getInstance()->mSessionInitializedSignal(arg);
+	}
+}
 
 //
 // Helper Functions
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index bd55bd2c306..c566b111ca9 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -102,6 +102,7 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 	typedef boost::function<void(const LLSD&)> session_callback_t;
 	session_signal_t mNewMsgSignal;
 	session_signal_t mNoUnreadMsgsSignal;
+	session_signal_t mSessionInitializedSignal;
 	
 	/** 
 	 * Find an IM Session corresponding to session_id
@@ -116,6 +117,7 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 
 	boost::signals2::connection addNewMsgCallback( session_callback_t cb ) { return mNewMsgSignal.connect(cb); }
 	boost::signals2::connection addNoUnreadMsgsCallback( session_callback_t cb ) { return mNoUnreadMsgsSignal.connect(cb); }
+	boost::signals2::connection addSessionInitializedCallback(session_callback_t cb ) {	return mSessionInitializedSignal.connect(cb); }
 
 	/**
 	 * Create new session object in a model
@@ -189,6 +191,7 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 	static bool sendStartSession(const LLUUID& temp_session_id, const LLUUID& other_participant_id,
 						  const std::vector<LLUUID>& ids, EInstantMessage dialog);
 	static void sendTypingState(LLUUID session_id, LLUUID other_participant_id, BOOL typing);
+	static void sendSessionInitialized(const LLUUID &session_id);
 	static void sendMessage(const std::string& utf8_text, const LLUUID& im_session_id,
 								const LLUUID& other_participant_id, EInstantMessage dialog);
 
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index c9168670d5c..53db225f126 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -94,6 +94,14 @@ void LLPanelChatControlPanel::draw()
 		&& callback_enabled;
 	childSetEnabled("call_btn", enable_connect);
 
+	// send a signal when the floater is fully initialized
+	// this lets LLAvatarActions::startAdhocCall() start the call
+	if (enable_connect && !mInitialized)
+	{
+		LLIMModel::sendSessionInitialized(mSessionId);
+		mInitialized = true;
+	}
+
 	LLPanel::draw();
 }
 
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index ac5d86345e8..adfb2fdd868 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -43,7 +43,9 @@ class LLParticipantList;
 class LLPanelChatControlPanel : public LLPanel
 {
 public:
-	LLPanelChatControlPanel() {};
+	LLPanelChatControlPanel() :
+		mSessionId(LLUUID()),
+		mInitialized(false) {};
 	~LLPanelChatControlPanel() {};
 
 	virtual BOOL postBuild();
@@ -59,6 +61,7 @@ class LLPanelChatControlPanel : public LLPanel
 
 private:
 	LLUUID mSessionId;
+	bool   mInitialized;
 };
 
 
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 0c66e7155c5..482f3d6c7e6 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -662,7 +662,7 @@ void LLPanelPeople::updateButtons()
 	buttonSetEnabled("teleport_btn",		friends_tab_active && item_selected);
 	buttonSetEnabled("view_profile_btn",	item_selected);
 	buttonSetEnabled("im_btn",				multiple_selected); // allow starting the friends conference for multiple selection
-	buttonSetEnabled("call_btn",			item_selected);
+	buttonSetEnabled("call_btn",			multiple_selected);
 	buttonSetEnabled("share_btn",			item_selected && false); // not implemented yet
 
 	bool none_group_selected = item_selected && selected_id.isNull();
@@ -1074,11 +1074,12 @@ void LLPanelPeople::onCallButtonClicked()
 	if (selected_uuids.size() == 1)
 	{
 		// initiate a P2P voice chat with the selected user
-		LLAvatarActions::startCall(getCurrentItemID());
+		LLAvatarActions::startCall(selected_uuids[0]);
 	}
 	else if (selected_uuids.size() > 1)
 	{
-		// *NOTE: ad-hoc voice chat not implemented yet
+		// initiate an ad-hoc voice chat with multiple users
+		LLAvatarActions::startAdhocCall(selected_uuids);
 	}
 }
 
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index c850dce1419..b0a406a277c 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2863,6 +2863,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
   <string name="answering-im">
     Connecting...
   </string>
+  <string name="conference-title">
+    Friends Conference
+  </string>
   <string name="inventory_item_offered-im">
     Inventory item offered
   </string>
-- 
GitLab


From d57c20787a84fcc04d94c004db924d8778d1e4ae Mon Sep 17 00:00:00 2001
From: brad kittenbrink <brad@lindenlab.com>
Date: Tue, 10 Nov 2009 14:04:05 -0500
Subject: [PATCH 058/557] Fix for mac failure in apr shared lib staging (Part
 of DEV-41724)

---
 indra/cmake/Copy3rdPartyLibs.cmake | 2 --
 1 file changed, 2 deletions(-)

diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index d6299bbb7d8..af407d52def 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -154,10 +154,8 @@ elseif(DARWIN)
     set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release")
     set(release_files
         libapr-1.0.3.7.dylib
-        libapr-1.0.3.8.dylib
         libapr-1.dylib
         libaprutil-1.0.3.8.dylib
-        libaprutil-1.0.3.9.dylib
         libaprutil-1.dylib
         libexpat.0.5.0.dylib
         libexpat.dylib
-- 
GitLab


From 37806fe4b2c0a83a5e8b1b2e9b7f260da494488e Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Tue, 10 Nov 2009 14:23:07 -0500
Subject: [PATCH 059/557] Reconcile LLNameListCtrl with new LLInstanceTracker
 interface

---
 indra/newview/llnamelistctrl.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 541db0ca6e1..9439717fb85 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -323,8 +323,8 @@ void LLNameListCtrl::refreshAll(const LLUUID& id, const std::string& first,
 	LLInstanceTracker<LLNameListCtrl>::instance_iter it;
 	for (it = beginInstances(); it != endInstances(); ++it)
 	{
-		LLNameListCtrl* ctrl = *it;
-		ctrl->refresh(id, first, last, is_group);
+		LLNameListCtrl& ctrl = *it;
+		ctrl.refresh(id, first, last, is_group);
 	}
 }
 
-- 
GitLab


From 2857dd026ce67f26f4da2f07ecffd8d6b754625c Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Tue, 10 Nov 2009 21:55:50 +0200
Subject: [PATCH 060/557] Implemented normal task EXT-1937 (Please update
 landmarks and locations to the latest decided format).

--HG--
branch : product-engine
---
 indra/newview/llagentui.cpp       | 6 +++---
 indra/newview/llnavigationbar.cpp | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp
index 2911a35581b..568ac4164ac 100644
--- a/indra/newview/llagentui.cpp
+++ b/indra/newview/llagentui.cpp
@@ -159,19 +159,19 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
 			buffer = llformat("%.100s", parcel_name.c_str());
 			break;
 		case LOCATION_FORMAT_NORMAL:
-			buffer = llformat("%s, %s", region_name.c_str(), parcel_name.c_str());
+			buffer = llformat("%s, %s", parcel_name.c_str(), region_name.c_str());
 			break;
 		case LOCATION_FORMAT_WITHOUT_SIM:
 			buffer = llformat("%s, %s (%d, %d, %d)",
-				region_name.c_str(),
 				parcel_name.c_str(),
+				region_name.c_str(),
 				pos_x, pos_y, pos_z);
 			break;
 		case LOCATION_FORMAT_FULL:
 			std::string sim_access_string = region->getSimAccessString();
 			buffer = llformat("%s, %s (%d, %d, %d)%s%s",
-				region_name.c_str(),
 				parcel_name.c_str(),
+				region_name.c_str(),
 				pos_x, pos_y, pos_z,
 				sim_access_string.empty() ? "" : " - ",
 				sim_access_string.c_str());
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 63794be085b..d38cd28ce26 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -480,7 +480,7 @@ void LLNavigationBar::rebuildTeleportHistoryMenu()
 			type = LLTeleportHistoryMenuItem::TYPE_CURRENT;
 
 		LLTeleportHistoryMenuItem::Params item_params;
-		item_params.label = item_params.name = hist_items[i].getTitle();
+		item_params.label = item_params.name = hist_items[i].mTitle;
 		item_params.item_type = type;
 		item_params.on_click.function(boost::bind(&LLNavigationBar::onTeleportHistoryMenuItemClicked, this, i));
 		LLTeleportHistoryMenuItem* new_itemp = LLUICtrlFactory::create<LLTeleportHistoryMenuItem>(item_params);
-- 
GitLab


From 06fd32edf63d38db6f3db4a57798570c69ca1a36 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Tue, 10 Nov 2009 12:04:35 -0800
Subject: [PATCH 061/557] EXT-677 Build tool arrows work again with UI size !=
 1.0 Must use scaled (virtual) pixels in some computations Will review with
 Richard

---
 indra/newview/llmanipscale.cpp     |  5 +++--
 indra/newview/llmaniptranslate.cpp | 10 ++++++----
 indra/newview/llviewerwindow.h     |  3 ++-
 3 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index 72596e850a7..aa385b43a1c 100644
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -493,8 +493,9 @@ void LLManipScale::highlightManipulators(S32 x, S32 y)
 			mProjectedManipulators.insert(projManipulator);
 		}
 
-		F32 half_width = (F32)gViewerWindow->getWorldViewWidth() / 2.f;
-		F32 half_height = (F32)gViewerWindow->getWorldViewHeight() / 2.f;
+		LLRect world_view_rect = gViewerWindow->getVirtualWorldViewRect();
+		F32 half_width = (F32)world_view_rect.getWidth() / 2.f;
+		F32 half_height = (F32)world_view_rect.getHeight() / 2.f;
 		LLVector2 manip2d;
 		LLVector2 mousePos((F32)x - half_width, (F32)y - half_height);
 		LLVector2 delta;
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index f1b3a37677a..002b8350f74 100644
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -413,8 +413,9 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)
 	}
 	
 	// Handle auto-rotation if necessary.
+	LLRect world_rect = gViewerWindow->getVirtualWorldViewRect();
 	const F32 ROTATE_ANGLE_PER_SECOND = 30.f * DEG_TO_RAD;
-	const S32 ROTATE_H_MARGIN = gViewerWindow->getWorldViewWidth() / 20;
+	const S32 ROTATE_H_MARGIN = world_rect.getWidth() / 20;
 	const F32 rotate_angle = ROTATE_ANGLE_PER_SECOND / gFPSClamped;
 	BOOL rotated = FALSE;
 
@@ -426,7 +427,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)
 			gAgent.cameraOrbitAround(rotate_angle);
 			rotated = TRUE;
 		}
-		else if (x > gViewerWindow->getWorldViewWidth() - ROTATE_H_MARGIN)
+		else if (x > world_rect.getWidth() - ROTATE_H_MARGIN)
 		{
 			gAgent.cameraOrbitAround(-rotate_angle);
 			rotated = TRUE;
@@ -960,8 +961,9 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
 	LLVector2 manip_start_2d;
 	LLVector2 manip_end_2d;
 	LLVector2 manip_dir;
-	F32 half_width = gViewerWindow->getWorldViewWidth() / 2.f;
-	F32 half_height = gViewerWindow->getWorldViewHeight() / 2.f;
+	LLRect world_view_rect = gViewerWindow->getVirtualWorldViewRect();
+	F32 half_width = (F32)world_view_rect.getWidth() / 2.f;
+	F32 half_height = (F32)world_view_rect.getHeight() / 2.f;
 	LLVector2 mousePos((F32)x - half_width, (F32)y - half_height);
 	LLVector2 mouse_delta;
 
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index c2906b1718d..b7f2b91c525 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -212,8 +212,9 @@ class LLViewerWindow : public LLWindowCallbacks
 
 	// Window in raw pixels as seen on screen.
 	const LLRect&	getWindowRect()		const	{ return mWindowRect; };
-	// portion of window that shows 3d world
+	// portion of window that shows 3d world, in raw unscaled pixels
 	const LLRect&	getWorldViewRect()		const	{ return mWorldViewRect; };
+	// Use this rect for most UI computations, it accounts for UI size scaling
 	LLRect			getVirtualWorldViewRect()	const;
 	S32 			getWorldViewHeight() const;
 	S32 			getWorldViewWidth() const;
-- 
GitLab


From 2420a4b90c964bcc2c928c4593652fdf81e0e20f Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Tue, 10 Nov 2009 12:29:20 -0800
Subject: [PATCH 062/557] FIX DEV-41949: LLMediaEntry::setWhitelist() and
 LLMediaEntry::asLLSD() have a contract conflict Review #32

This code will go into both server 1.32 branch and the viewer branch.

As proposed in DEV-41949, I've changed setWhitelist(const LLSD &whitelist) to clear the whitelist if the WHITELIST_KEY is not present in the passed-in 'whitelist'. I've also made sure that asLLSD() ensures that the WHITELIST_KEY is erased in the given LLSD.
---
 indra/llprimitive/llmediaentry.cpp            |   8 +-
 indra/llprimitive/tests/llmediaentry_test.cpp | 197 ++++++++----------
 2 files changed, 97 insertions(+), 108 deletions(-)

diff --git a/indra/llprimitive/llmediaentry.cpp b/indra/llprimitive/llmediaentry.cpp
index 701300163a3..2fc1e5e60ca 100644
--- a/indra/llprimitive/llmediaentry.cpp
+++ b/indra/llprimitive/llmediaentry.cpp
@@ -389,8 +389,12 @@ U32 LLMediaEntry::setWhiteList( const std::vector<std::string> &whitelist )
 
 U32 LLMediaEntry::setWhiteList( const LLSD &whitelist )
 {
-    // If whitelist is undef, this is a no-op.
-    if (whitelist.isUndefined()) return LSL_STATUS_OK;
+    // If whitelist is undef, the whitelist is cleared
+    if (whitelist.isUndefined()) 
+	{
+		mWhiteList.clear();
+		return LSL_STATUS_OK;
+	}
 
     // However, if the whitelist is an empty array, erase it.
     if (whitelist.isArray()) 
diff --git a/indra/llprimitive/tests/llmediaentry_test.cpp b/indra/llprimitive/tests/llmediaentry_test.cpp
index cd9608d56b7..dfac5f26c7d 100644
--- a/indra/llprimitive/tests/llmediaentry_test.cpp
+++ b/indra/llprimitive/tests/llmediaentry_test.cpp
@@ -190,9 +190,9 @@ namespace tut
         entry.setWhiteList(tokens);
     }
 
-    void whitelist_test(bool enable, const char *whitelist, const char *candidate_url, bool expected_pass)
+    void whitelist_test(int num, bool enable, const char *whitelist, const char *candidate_url, bool expected_pass)
     {
-        std::string message = "Whitelist test";
+        std::string message = "Whitelist test " + boost::lexical_cast<std::string>(num);
         LLMediaEntry entry;
         entry.setWhiteListEnable(enable);
         set_whitelist(entry, whitelist);
@@ -209,13 +209,13 @@ namespace tut
         ensure(message, expected_pass == passed_whitelist);
     }
 
-    void whitelist_test(const char *whitelist, const char *candidate_url, bool expected_pass)
+    void whitelist_test(int num, const char *whitelist, const char *candidate_url, bool expected_pass)
     {
-        whitelist_test(true, whitelist, candidate_url, expected_pass);
+        whitelist_test(num, true, whitelist, candidate_url, expected_pass);
     }
-    void whitelist_test(const char *whitelist, const char *candidate_url)
+    void whitelist_test(int num, const char *whitelist, const char *candidate_url)
     {
-        whitelist_test(true, whitelist, candidate_url, true);
+        whitelist_test(num, true, whitelist, candidate_url, true);
     }
 
 	template<> template<>
@@ -265,12 +265,30 @@ namespace tut
         ensure_llsd_equals(get_test_name() + " failed", defaultMediaEntryLLSD, sd);
     }
 
+	
+    template<> template<>
+    void object::test<5>()
+    {
+        set_test_name("Test LLMediaEntry::asLLSD() -> LLMediaEntry::fromLLSD()");
+        LLMediaEntry entry1, entry2;
+		// Add a whitelist to entry2
+		std::vector<std::string> whitelist;
+		whitelist.push_back("*.example.com");
+        entry2.setWhiteList(whitelist);
+		// Render entry1 (which has no whitelist) as an LLSD
+        LLSD sd;
+		entry1.asLLSD(sd);
+		// "read" that LLSD into entry 2
+		entry2.fromLLSD(sd);
+        ensure_llsd_equals(get_test_name() + " failed", defaultMediaEntryLLSD, entry2.asLLSD());
+    }
+	
     // limit tests
     const char *URL_OK = "http://www.example.com";
     const char *URL_TOO_BIG = "http://www.example.com.qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq";
 
     template<> template<>
-    void object::test<5>()
+    void object::test<6>()
     {
         set_test_name("Test Limits on setting current URL");
         LLMediaEntry entry;
@@ -281,7 +299,7 @@ namespace tut
     }    
 
     template<> template<>
-    void object::test<6>()
+    void object::test<7>()
     {
         set_test_name("Test Limits on setting home URL");
         LLMediaEntry entry;
@@ -292,7 +310,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<7>()
+    void object::test<8>()
     {
         set_test_name("Test Limits on setting whitelist");
         
@@ -306,7 +324,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<8>()
+    void object::test<9>()
     {
         set_test_name("Test Limits on setting whitelist too big");
         
@@ -321,7 +339,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<9>()
+    void object::test<10>()
     {
         set_test_name("Test Limits on setting whitelist too many");
         
@@ -337,7 +355,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<10>()
+    void object::test<11>()
     {
         set_test_name("Test to make sure both setWhiteList() functions behave the same");
         
@@ -355,7 +373,7 @@ namespace tut
     }
     
     template<> template<>
-    void object::test<11>()
+    void object::test<12>()
     {
         set_test_name("Test to make sure both setWhiteList() functions behave the same");
 
@@ -376,7 +394,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<12>()
+    void object::test<13>()
     {
         set_test_name("Test to make sure both setWhiteList() functions behave the same");
 
@@ -396,103 +414,70 @@ namespace tut
                empty == entry2.getWhiteList());
     }
     
-    // Whitelist check tests
-    
-    // Check the "empty whitelist" case
     template<> template<>
-    void object::test<13>() { whitelist_test("", "http://www.example.com", true); }
+    void object::test<14>() 
+	{
+		// Whitelist check tests
+		int n=0;
+		
+		// Check the "empty whitelist" case
+		whitelist_test(++n, "", "http://www.example.com", true); 
 
-    // Check the "missing scheme" case
-    template<> template<>
-    void object::test<14>() { whitelist_test("www.example.com", "http://www.example.com", true); }
+		// Check the "missing scheme" case
+		whitelist_test(++n, "www.example.com", "http://www.example.com", true);
 
-    // Check the "exactly the same" case
-    template<> template<>
-    void object::test<15>() { whitelist_test("http://example.com", "http://example.com", true); }
+		// Check the "exactly the same" case
+		whitelist_test(++n, "http://example.com", "http://example.com", true);
 
-    // Check the enable flag
-    template<> template<>
-    void object::test<16>() { whitelist_test(false, "www.example.com", "http://www.secondlife.com", true); }
-    template<> template<>
-    void object::test<17>() { whitelist_test(true, "www.example.com", "http://www.secondlife.com", false); }
+		// Check the enable flag
+		whitelist_test(++n, false, "www.example.com", "http://www.secondlife.com", true);
+		whitelist_test(++n, true, "www.example.com", "http://www.secondlife.com", false);
 
-    // Check permutations of trailing slash:
-    template<> template<>
-    void object::test<18>() { whitelist_test("http://www.example.com", "http://www.example.com/", true); }
-    template<> template<>
-    void object::test<19>() { whitelist_test("http://www.example.com/", "http://www.example.com/", true); }
-    template<> template<>
-    void object::test<20>() { whitelist_test("http://www.example.com/", "http://www.example.com", false); }
-    template<> template<>
-    void object::test<21>() { whitelist_test("http://www.example.com", "http://www.example.com/foobar", true); }
-    template<> template<>
-    void object::test<22>() { whitelist_test("http://www.example.com/", "http://www.example.com/foobar", false); }
+		// Check permutations of trailing slash:
+		whitelist_test(++n, "http://www.example.com", "http://www.example.com/", true);
+		whitelist_test(++n, "http://www.example.com/", "http://www.example.com/", true);
+		whitelist_test(++n, "http://www.example.com/", "http://www.example.com", false);
+		whitelist_test(++n, "http://www.example.com", "http://www.example.com/foobar", true);
+		whitelist_test(++n, "http://www.example.com/", "http://www.example.com/foobar", false);
 
     
-    // More cases...
-    template<> template<>
-    void object::test<23>() { whitelist_test("http://example.com", "http://example.com/wiki", true); }
-    template<> template<>
-    void object::test<24>() { whitelist_test("www.example.com", "http://www.example.com/help", true); }
-    template<> template<>
-    void object::test<25>() { whitelist_test("http://www.example.com", "http://wwwexample.com", false); }
-    template<> template<>
-    void object::test<26>() { whitelist_test("http://www.example.com", "http://www.example.com/wiki", true); }
-    template<> template<>
-    void object::test<27>() { whitelist_test("example.com", "http://wwwexample.com", false); }
-    template<> template<>
-    void object::test<28>() { whitelist_test("http://www.example.com/", "http://www.amazon.com/wiki", false); }
-    template<> template<>
-    void object::test<29>() { whitelist_test("www.example.com", "http://www.amazon.com", false); }
-
-    // regexp cases
-    template<> template<>
-    void object::test<30>() { whitelist_test("*.example.com", "http://www.example.com", true); }
-    template<> template<>
-    void object::test<31>() { whitelist_test("*.example.com", "http://www.amazon.com", false); }
-    template<> template<>
-    void object::test<32>() { whitelist_test("*.example.com", "http://www.example.com/foo/bar", true); }
-    template<> template<>
-    void object::test<33>() { whitelist_test("*.example.com", "http:/example.com/foo/bar", false); }
-    template<> template<>
-    void object::test<34>() { whitelist_test("*example.com", "http://example.com/foo/bar", true); }
-    template<> template<>
-    void object::test<35>() { whitelist_test("*example.com", "http://my.virus.com/foo/bar?example.com", false); }
-    template<> template<>
-    void object::test<36>() { whitelist_test("example.com", "http://my.virus.com/foo/bar?example.com", false); }
-    template<> template<>
-    void object::test<37>() { whitelist_test("*example.com", "http://my.virus.com/foo/bar?*example.com", false); }
-    template<> template<>
-    void object::test<38>() { whitelist_test("http://*example.com", "http://www.example.com", true); }
-    template<> template<>
-    void object::test<39>() { whitelist_test("http://*.example.com", "http://www.example.com", true); }
-    template<> template<>
-    void object::test<40>() { whitelist_test("http://*.e$?^.com", "http://www.e$?^.com", true); }
-    template<> template<>
-    void object::test<41>() { whitelist_test("*.example.com/foo/bar", "http://www.example.com/", false); }
-    template<> template<>
-    void object::test<42>() { whitelist_test("*.example.com/foo/bar", "http://example.com/foo/bar", false); }
-    template<> template<>
-    void object::test<43>() { whitelist_test("http://*.example.com/foo/bar", "http://www.example.com", false); }
-    template<> template<>
-    void object::test<44>() { whitelist_test("http://*.example.com", "https://www.example.com", false); }
-    template<> template<>
-    void object::test<45>() { whitelist_test("http*://*.example.com", "rtsp://www.example.com", false); }
-    template<> template<>
-    void object::test<46>() { whitelist_test("http*://*.example.com", "https://www.example.com", true); }
-    template<> template<>
-    void object::test<47>() { whitelist_test("example.com", "http://www.example.com", false); }
-    template<> template<>
-    void object::test<48>() { whitelist_test("www.example.com", "http://www.example.com:80", false); }
-    template<> template<>
-    void object::test<49>() { whitelist_test("www.example.com", "http://www.example.com", true); }
-    template<> template<>
-    void object::test<50>() { whitelist_test("www.example.com/", "http://www.example.com", false); }
-    template<> template<>
-    void object::test<51>() { whitelist_test("www.example.com/foo/bar/*", "http://www.example.com/foo/bar/baz", true); }
-    // Path only
-    template<> template<>
-    void object::test<52>() { whitelist_test("/foo/*/baz", "http://www.example.com/foo/bar/baz", true); }
-    template<> template<>
-    void object::test<53>() { whitelist_test("/foo/*/baz", "http://www.example.com/foo/bar/", false); }
+		// More cases...
+		whitelist_test(++n, "http://example.com", "http://example.com/wiki", true);
+		whitelist_test(++n, "www.example.com", "http://www.example.com/help", true);
+		whitelist_test(++n, "http://www.example.com", "http://wwwexample.com", false);
+		whitelist_test(++n, "http://www.example.com", "http://www.example.com/wiki", true);
+		whitelist_test(++n, "example.com", "http://wwwexample.com", false);
+		whitelist_test(++n, "http://www.example.com/", "http://www.amazon.com/wiki", false);
+		whitelist_test(++n, "www.example.com", "http://www.amazon.com", false);
+
+		// regexp cases
+		whitelist_test(++n, "*.example.com", "http://www.example.com", true);
+		whitelist_test(++n, "*.example.com", "http://www.amazon.com", false);
+		whitelist_test(++n, "*.example.com", "http://www.example.com/foo/bar", true);
+		whitelist_test(++n, "*.example.com", "http:/example.com/foo/bar", false);
+		whitelist_test(++n, "*example.com", "http://example.com/foo/bar", true);
+		whitelist_test(++n, "*example.com", "http://my.virus.com/foo/bar?example.com", false);
+		whitelist_test(++n, "example.com", "http://my.virus.com/foo/bar?example.com", false);
+		whitelist_test(++n, "*example.com", "http://my.virus.com/foo/bar?*example.com", false);
+		whitelist_test(++n, "http://*example.com", "http://www.example.com", true);
+		whitelist_test(++n, "http://*.example.com", "http://www.example.com", true);
+		whitelist_test(++n, "http://*.e$?^.com", "http://www.e$?^.com", true);
+		whitelist_test(++n, "*.example.com/foo/bar", "http://www.example.com/", false);
+		whitelist_test(++n, "*.example.com/foo/bar", "http://example.com/foo/bar", false);
+		whitelist_test(++n, "http://*.example.com/foo/bar", "http://www.example.com", false);
+		whitelist_test(++n, "http://*.example.com", "https://www.example.com", false);
+		whitelist_test(++n, "http*://*.example.com", "rtsp://www.example.com", false);
+		whitelist_test(++n, "http*://*.example.com", "https://www.example.com", true);
+		whitelist_test(++n, "example.com", "http://www.example.com", false);
+		whitelist_test(++n, "www.example.com", "http://www.example.com:80", false);
+		whitelist_test(++n, "www.example.com", "http://www.example.com", true);
+		whitelist_test(++n, "www.example.com/", "http://www.example.com", false);
+		whitelist_test(++n, "www.example.com/foo/bar/*", "http://www.example.com/foo/bar/baz", true);
+
+        // Path only
+		whitelist_test(++n, "/foo/*/baz", "http://www.example.com/foo/bar/baz", true);
+		whitelist_test(++n, "/foo/*/baz", "http://www.example.com/foo/bar/", false);
+	}
+	
 }
+
-- 
GitLab


From caa468a5f184a1c2dd2cd1f2c4a7aafc5acf05d0 Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Tue, 10 Nov 2009 12:58:10 -0800
Subject: [PATCH 063/557] fix for gcc

---
 indra/llui/lluictrlfactory.cpp | 6 ++++++
 indra/llui/lluictrlfactory.h   | 7 ++++++-
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp
index c3c0daed0f4..8ab015f2bb8 100644
--- a/indra/llui/lluictrlfactory.cpp
+++ b/indra/llui/lluictrlfactory.cpp
@@ -449,3 +449,9 @@ const std::string* LLUICtrlFactory::getWidgetTag(const std::type_info* widget_ty
 {
 	return LLWidgetNameRegistry::instance().getValue(widget_type);
 }
+
+// static
+void LLUICtrlFactory::connect(LLView* parent, LLView* child)
+{
+	parent->addChild(child);
+}
\ No newline at end of file
diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h
index 0ccd3047f6c..8a9c9e23c1d 100644
--- a/indra/llui/lluictrlfactory.h
+++ b/indra/llui/lluictrlfactory.h
@@ -188,10 +188,15 @@ class LLUICtrlFactory : public LLSingleton<LLUICtrlFactory>
 		T* widget = new T(params);
 		widget->initFromParams(params);
 		if (parent)
-			parent->addChild(widget);
+		{
+			connect(parent, widget);
+		}
 		return widget;
 	}
 
+	// fix for gcc template instantiation annoyance
+	static void connect(LLView* parent, LLView* child);
+	
 	LLView* createFromXML(LLXMLNodePtr node, LLView* parent, const std::string& filename, const widget_registry_t&, LLXMLNodePtr output_node );
 
 	template<typename T>
-- 
GitLab


From 25d8cf689aa04a1bd4ebb336714730d29040d05c Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Tue, 10 Nov 2009 13:03:16 -0800
Subject: [PATCH 064/557] further fixes in gcc land

---
 indra/llui/lllayoutstack.cpp | 2 +-
 indra/llui/lllayoutstack.h   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index 5999e1a29e0..9399ace1f79 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -792,7 +792,7 @@ void LLLayoutStack::calcMinExtents()
 //static 
 void LLLayoutStack::updateClass()
 {
-	for (LLInstanceTracker::instance_iter it = beginInstances(); it != endInstances(); ++it)
+	for (LLInstanceTracker<LLLayoutStack>::instance_iter it = beginInstances(); it != endInstances(); ++it)
 	{
 		(*it)->updateLayout();
 	}
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index 8475079f5eb..3a073fa1b28 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -38,7 +38,7 @@
 
 class LLPanel;
 
-class LLLayoutStack : public LLView, LLInstanceTracker<LLLayoutStack>
+class LLLayoutStack : public LLView, public LLInstanceTracker<LLLayoutStack>
 {
 public:
 	struct Params : public LLInitParam::Block<Params, LLView::Params>
-- 
GitLab


From 65d8b9cfe56bb1bd62ee4ceabffa617e751b02d0 Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Tue, 10 Nov 2009 16:20:07 -0500
Subject: [PATCH 065/557] Make LLInstanceTracker a public base of
 LLLayoutStack. Qualify instance_iter with LLLayoutStack:: rather than having
 to restate the template params to LLInstanceTracker.

---
 indra/llui/lllayoutstack.cpp | 4 ++--
 indra/llui/lllayoutstack.h   | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index 5999e1a29e0..14a6ddb7e0e 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -792,8 +792,8 @@ void LLLayoutStack::calcMinExtents()
 //static 
 void LLLayoutStack::updateClass()
 {
-	for (LLInstanceTracker::instance_iter it = beginInstances(); it != endInstances(); ++it)
+	for (LLLayoutStack::instance_iter it = beginInstances(); it != endInstances(); ++it)
 	{
-		(*it)->updateLayout();
+		it->updateLayout();
 	}
 }
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index 8475079f5eb..3a073fa1b28 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -38,7 +38,7 @@
 
 class LLPanel;
 
-class LLLayoutStack : public LLView, LLInstanceTracker<LLLayoutStack>
+class LLLayoutStack : public LLView, public LLInstanceTracker<LLLayoutStack>
 {
 public:
 	struct Params : public LLInitParam::Block<Params, LLView::Params>
-- 
GitLab


From 0e0fa7400450ec48ce6b59c8c8e0c4001e818fbd Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Tue, 10 Nov 2009 13:24:37 -0800
Subject: [PATCH 066/557] added newline at end of lluictrlfactory.cpp

---
 indra/llui/lluictrlfactory.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp
index 8ab015f2bb8..adfbb41feb5 100644
--- a/indra/llui/lluictrlfactory.cpp
+++ b/indra/llui/lluictrlfactory.cpp
@@ -454,4 +454,4 @@ const std::string* LLUICtrlFactory::getWidgetTag(const std::type_info* widget_ty
 void LLUICtrlFactory::connect(LLView* parent, LLView* child)
 {
 	parent->addChild(child);
-}
\ No newline at end of file
+}
-- 
GitLab


From 0f6242d9fd948cda1abf18885eef320b22d310c5 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Tue, 10 Nov 2009 14:00:38 -0800
Subject: [PATCH 067/557] Sanitize naming of getWindowRect (scaled vs. raw
 pixels) and getWorldViewRect (scaled vs. raw) Reduces chance of future UI
 bugs related to UI size. Discussed with Richard.

---
 indra/newview/llagent.cpp                     |   8 +-
 indra/newview/llappviewer.cpp                 |   2 +-
 indra/newview/llchannelmanager.cpp            |   2 +-
 indra/newview/lldebugview.cpp                 |   8 +-
 indra/newview/lldrawable.cpp                  |   2 +-
 indra/newview/lldynamictexture.cpp            |   2 +-
 indra/newview/llface.cpp                      |   2 +-
 indra/newview/llfasttimerview.cpp             |   4 +-
 indra/newview/llfloaterauction.cpp            |   4 +-
 indra/newview/llfloaterpreference.cpp         |   4 +-
 indra/newview/llfloaterproperties.cpp         |   2 +-
 indra/newview/llfloatersnapshot.cpp           |  36 +--
 indra/newview/llfolderview.cpp                |   2 +-
 indra/newview/llhudicon.cpp                   |   8 +-
 indra/newview/llhudrender.cpp                 |   6 +-
 indra/newview/llhudtext.cpp                   |  16 +-
 indra/newview/llimfloater.cpp                 |   2 +-
 indra/newview/llimhandler.cpp                 |   2 +-
 indra/newview/llmanip.cpp                     |  14 +-
 indra/newview/llmaniprotate.cpp               |  10 +-
 indra/newview/llmanipscale.cpp                |   6 +-
 indra/newview/llmaniptranslate.cpp            |   8 +-
 indra/newview/llmemoryview.cpp                |   4 +-
 indra/newview/llnearbychat.cpp                |   2 +-
 indra/newview/llnearbychathandler.cpp         |   4 +-
 indra/newview/llnotificationalerthandler.cpp  |   2 +-
 indra/newview/llnotificationgrouphandler.cpp  |   2 +-
 indra/newview/llnotificationofferhandler.cpp  |   2 +-
 indra/newview/llnotificationscripthandler.cpp |   2 +-
 indra/newview/llnotificationtiphandler.cpp    |   2 +-
 indra/newview/llpanellogin.cpp                |   2 +-
 indra/newview/llpanelprimmediacontrols.cpp    |   8 +-
 indra/newview/llpreview.cpp                   |   2 +-
 indra/newview/llpreviewtexture.cpp            |   4 +-
 indra/newview/llscreenchannel.cpp             |   6 +-
 indra/newview/llstartup.cpp                   |   4 +-
 indra/newview/llsyswellwindow.cpp             |   2 +-
 indra/newview/lltoolbar.cpp                   |   2 +-
 indra/newview/lltoolfocus.cpp                 |   6 +-
 indra/newview/lltoolgrab.cpp                  |  14 +-
 indra/newview/lltoolgun.cpp                   |   4 +-
 indra/newview/llviewercamera.cpp              |  16 +-
 indra/newview/llviewerdisplay.cpp             |  42 ++--
 indra/newview/llviewermenu.cpp                |   2 +-
 indra/newview/llviewermenufile.cpp            |   4 +-
 indra/newview/llviewermessage.cpp             |   2 +-
 indra/newview/llviewerstats.cpp               |   4 +-
 indra/newview/llviewerwindow.cpp              | 224 +++++++++---------
 indra/newview/llviewerwindow.h                |  40 ++--
 indra/newview/llviewerwindowlistener.cpp      |   4 +-
 indra/newview/pipeline.cpp                    |  28 +--
 51 files changed, 296 insertions(+), 294 deletions(-)

diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 24bdf66c2a1..d2c8558f0b2 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -2619,9 +2619,9 @@ void LLAgent::updateLookAt(const S32 mouse_x, const S32 mouse_y)
 		{
 			// range from -.5 to .5
 			F32 x_from_center = 
-				((F32) mouse_x / (F32) gViewerWindow->getWindowWidth() ) - 0.5f;
+				((F32) mouse_x / (F32) gViewerWindow->getWindowWidthScaled() ) - 0.5f;
 			F32 y_from_center = 
-				((F32) mouse_y / (F32) gViewerWindow->getWindowHeight() ) - 0.5f;
+				((F32) mouse_y / (F32) gViewerWindow->getWindowHeightScaled() ) - 0.5f;
 
 			frameCamera.yaw( - x_from_center * gSavedSettings.getF32("YawFromMousePosition") * DEG_TO_RAD);
 			frameCamera.pitch( - y_from_center * gSavedSettings.getF32("PitchFromMousePosition") * DEG_TO_RAD);
@@ -3436,11 +3436,11 @@ F32 LLAgent::calcCustomizeAvatarUIOffset( const LLVector3d& camera_pos_global )
 		const LLRect& rect = gFloaterCustomize->getRect();
 
 		// Move the camera so that the avatar isn't covered up by this floater.
-		F32 fraction_of_fov = 0.5f - (0.5f * (1.f - llmin(1.f, ((F32)rect.getWidth() / (F32)gViewerWindow->getWindowWidth()))));
+		F32 fraction_of_fov = 0.5f - (0.5f * (1.f - llmin(1.f, ((F32)rect.getWidth() / (F32)gViewerWindow->getWindowWidthScaled()))));
 		F32 apparent_angle = fraction_of_fov * LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect();  // radians
 		F32 offset = tan(apparent_angle);
 
-		if( rect.mLeft < (gViewerWindow->getWindowWidth() - rect.mRight) )
+		if( rect.mLeft < (gViewerWindow->getWindowWidthScaled() - rect.mRight) )
 		{
 			// Move the avatar to the right (camera to the left)
 			ui_offset = offset;
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 8e6d6b885d6..ddb6589b496 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -3282,7 +3282,7 @@ void LLAppViewer::saveFinalSnapshot()
 		snap_filename += gDirUtilp->getDirDelimiter();
 		snap_filename += SCREEN_LAST_FILENAME;
 		// use full pixel dimensions of viewer window (not post-scale dimensions)
-		gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight(), FALSE, TRUE);
+		gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw(), FALSE, TRUE);
 		mSavedFinalSnapshot = TRUE;
 	}
 }
diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp
index 64274225726..914435b6409 100644
--- a/indra/newview/llchannelmanager.cpp
+++ b/indra/newview/llchannelmanager.cpp
@@ -127,7 +127,7 @@ void LLChannelManager::onLoginCompleted()
 	gViewerWindow->getRootView()->addChild(mStartUpChannel);
 
 	// init channel's position and size
-	S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
+	S32 channel_right_bound = gViewerWindow->getWorldViewRectRaw().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
 	S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
 	mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound);
 	mStartUpChannel->setMouseDownCallback(boost::bind(&LLSysWellWindow::onStartUpToastClick, LLFloaterReg::getTypedInstance<LLSysWellWindow>("syswell_window"), _2, _3, _4));
diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp
index 9057d84f63c..04a66784c6c 100644
--- a/indra/newview/lldebugview.cpp
+++ b/indra/newview/lldebugview.cpp
@@ -75,16 +75,16 @@ LLDebugView::LLDebugView(const LLDebugView::Params& p)
 
 	r.set(150 - 25, rect.getHeight() - 50, rect.getWidth()/2 - 25, rect.getHeight() - 450);
 
-	r.set(25, rect.getHeight() - 50, (S32) (gViewerWindow->getVirtualWindowRect().getWidth() * 0.75f), 
-  									 (S32) (gViewerWindow->getVirtualWindowRect().getHeight() * 0.75f));
+	r.set(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f), 
+  									 (S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f));
 	mFastTimerView = new LLFastTimerView(r);
 	mFastTimerView->setFollowsTop();
 	mFastTimerView->setFollowsLeft();
 	mFastTimerView->setVisible(FALSE);			// start invisible
 	addChild(mFastTimerView);
 
-	r.set(25, rect.getHeight() - 50, (S32) (gViewerWindow->getVirtualWindowRect().getWidth() * 0.75f), 
-									 (S32) (gViewerWindow->getVirtualWindowRect().getHeight() * 0.75f));
+	r.set(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f), 
+									 (S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f));
 	LLMemoryView::Params mp;
 	mp.name("memory");
 	mp.rect(r);
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 03a3f2b43de..d60330024af 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -89,7 +89,7 @@ LLDynamicArrayPtr<LLPointer<LLDrawable> > LLDrawable::sDeadList;
 void LLDrawable::incrementVisible() 
 {
 	sCurVisible++;
-	sCurPixelAngle = (F32) gViewerWindow->getWindowDisplayHeight()/LLViewerCamera::getInstance()->getView();
+	sCurPixelAngle = (F32) gViewerWindow->getWindowHeightRaw()/LLViewerCamera::getInstance()->getView();
 }
 void LLDrawable::init()
 {
diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp
index e41c4104ebe..9bc7221dc87 100644
--- a/indra/newview/lldynamictexture.cpp
+++ b/indra/newview/lldynamictexture.cpp
@@ -126,7 +126,7 @@ void LLViewerDynamicTexture::preRender(BOOL clear_depth)
 		// force rendering to on-screen portion of frame buffer
 		LLCoordScreen window_pos;
 		gViewerWindow->getWindow()->getPosition( &window_pos );
-		mOrigin.set(0, gViewerWindow->getWindowDisplayHeight() - mFullHeight);  // top left corner
+		mOrigin.set(0, gViewerWindow->getWindowHeightRaw() - mFullHeight);  // top left corner
 
 		if (window_pos.mX < 0)
 		{
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index c54b83d8655..31f1462a12b 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -1403,7 +1403,7 @@ F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
 //the projection of the face partially overlaps with the screen
 F32 LLFace::adjustPartialOverlapPixelArea(F32 cos_angle_to_view_dir, F32 radius )
 {
-	F32 screen_radius = (F32)llmax(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight()) ;
+	F32 screen_radius = (F32)llmax(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw()) ;
 	F32 center_angle = acosf(cos_angle_to_view_dir) ;
 	F32 d = center_angle * LLDrawable::sCurPixelAngle ;
 
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index 2ab17d62200..fd1e9e2e354 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -302,8 +302,8 @@ void LLFastTimerView::draw()
 	F64 iclock_freq = 1000.0 / clock_freq;
 	
 	S32 margin = 10;
-	S32 height = (S32) (gViewerWindow->getVirtualWindowRect().getHeight()*0.75f);
-	S32 width = (S32) (gViewerWindow->getVirtualWindowRect().getWidth() * 0.75f);
+	S32 height = (S32) (gViewerWindow->getWindowRectScaled().getHeight()*0.75f);
+	S32 width = (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f);
 	
 	// HACK: casting away const. Should use setRect or some helper function instead.
 		const_cast<LLRect&>(getRect()).setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height);
diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp
index 262dc1804d3..9ba61ba92f7 100644
--- a/indra/newview/llfloaterauction.cpp
+++ b/indra/newview/llfloaterauction.cpp
@@ -188,8 +188,8 @@ void LLFloaterAuction::onClickSnapshot(void* data)
 
 	gForceRenderLandFence = self->childGetValue("fence_check").asBoolean();
 	BOOL success = gViewerWindow->rawSnapshot(raw,
-											  gViewerWindow->getWindowWidth(),
-											  gViewerWindow->getWindowHeight(),
+											  gViewerWindow->getWindowWidthScaled(),
+											  gViewerWindow->getWindowHeightScaled(),
 											  TRUE, FALSE,
 											  FALSE, FALSE);
 	gForceRenderLandFence = FALSE;
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 2af1313db45..f07f9412a2d 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -1332,8 +1332,8 @@ void LLFloaterPreference::initWindowSizeControls(LLPanel* panelp)
 	
 	// Look to see if current window size matches existing window sizes, if so then
 	// just set the selection value...
-	const U32 height = gViewerWindow->getWindowDisplayHeight();
-	const U32 width = gViewerWindow->getWindowDisplayWidth();
+	const U32 height = gViewerWindow->getWindowHeightRaw();
+	const U32 width = gViewerWindow->getWindowWidthRaw();
 	for (S32 i=0; i < ctrl_window_size->getItemCount(); i++)
 	{
 		U32 height_test = 0;
diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp
index 4375787ea2e..928126bff94 100644
--- a/indra/newview/llfloaterproperties.cpp
+++ b/indra/newview/llfloaterproperties.cpp
@@ -900,7 +900,7 @@ LLMultiProperties::LLMultiProperties()
 	{
 		// start with a small rect in the top-left corner ; will get resized
 		LLRect rect;
-		rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeight(), 20, 20);
+		rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 20, 20);
 		setRect(rect);
 	}
 	setTitle(LLTrans::getString("MultiPropertiesTitle"));
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index fd2e7b3487a..4ff2141886c 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -243,10 +243,10 @@ LLSnapshotLivePreview::LLSnapshotLivePreview (const LLSnapshotLivePreview::Param
 // 	gIdleCallbacks.addFunction( &LLSnapshotLivePreview::onIdle, (void*)this );
 	sList.insert(this);
 	setFollowsAll();
-	mWidth[0] = gViewerWindow->getWindowDisplayWidth();
-	mWidth[1] = gViewerWindow->getWindowDisplayWidth();
-	mHeight[0] = gViewerWindow->getWindowDisplayHeight();
-	mHeight[1] = gViewerWindow->getWindowDisplayHeight();
+	mWidth[0] = gViewerWindow->getWindowWidthRaw();
+	mWidth[1] = gViewerWindow->getWindowWidthRaw();
+	mHeight[0] = gViewerWindow->getWindowHeightRaw();
+	mHeight[1] = gViewerWindow->getWindowHeightRaw();
 	mImageScaled[0] = FALSE;
 	mImageScaled[1] = FALSE;
 
@@ -492,27 +492,27 @@ void LLSnapshotLivePreview::draw()
 			LLLocalClipRect clip(getLocalRect());
 			{
 				// draw diagonal stripe with gradient that passes over screen
-				S32 x1 = gViewerWindow->getWindowWidth() * llround((clamp_rescale(shine_interp, 0.f, 1.f, -1.f - SHINE_WIDTH, 1.f)));
-				S32 x2 = x1 + llround(gViewerWindow->getWindowWidth() * SHINE_WIDTH);
-				S32 x3 = x2 + llround(gViewerWindow->getWindowWidth() * SHINE_WIDTH);
+				S32 x1 = gViewerWindow->getWindowWidthScaled() * llround((clamp_rescale(shine_interp, 0.f, 1.f, -1.f - SHINE_WIDTH, 1.f)));
+				S32 x2 = x1 + llround(gViewerWindow->getWindowWidthScaled() * SHINE_WIDTH);
+				S32 x3 = x2 + llround(gViewerWindow->getWindowWidthScaled() * SHINE_WIDTH);
 				S32 y1 = 0;
-				S32 y2 = gViewerWindow->getWindowHeight();
+				S32 y2 = gViewerWindow->getWindowHeightScaled();
 
 				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 				gGL.begin(LLRender::QUADS);
 				{
 					gGL.color4f(1.f, 1.f, 1.f, 0.f);
 					gGL.vertex2i(x1, y1);
-					gGL.vertex2i(x1 + gViewerWindow->getWindowWidth(), y2);
+					gGL.vertex2i(x1 + gViewerWindow->getWindowWidthScaled(), y2);
 					gGL.color4f(1.f, 1.f, 1.f, SHINE_OPACITY);
-					gGL.vertex2i(x2 + gViewerWindow->getWindowWidth(), y2);
+					gGL.vertex2i(x2 + gViewerWindow->getWindowWidthScaled(), y2);
 					gGL.vertex2i(x2, y1);
 
 					gGL.color4f(1.f, 1.f, 1.f, SHINE_OPACITY);
 					gGL.vertex2i(x2, y1);
-					gGL.vertex2i(x2 + gViewerWindow->getWindowWidth(), y2);
+					gGL.vertex2i(x2 + gViewerWindow->getWindowWidthScaled(), y2);
 					gGL.color4f(1.f, 1.f, 1.f, 0.f);
-					gGL.vertex2i(x3 + gViewerWindow->getWindowWidth(), y2);
+					gGL.vertex2i(x3 + gViewerWindow->getWindowWidthScaled(), y2);
 					gGL.vertex2i(x3, y1);
 				}
 				gGL.end();
@@ -615,8 +615,8 @@ BOOL LLSnapshotLivePreview::setThumbnailImageSize()
 	{
 		return FALSE ;
 	}
-	S32 window_width = gViewerWindow->getWindowDisplayWidth() ;
-	S32 window_height = gViewerWindow->getWindowDisplayHeight() ;
+	S32 window_width = gViewerWindow->getWindowWidthRaw() ;
+	S32 window_height = gViewerWindow->getWindowHeightRaw() ;
 
 	F32 window_aspect_ratio = ((F32)window_width) / ((F32)window_height);
 
@@ -1166,7 +1166,7 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
 		gSavedSettings.setS32("SnapshotLocalLastResolution", 0);
 
 		LLSnapshotLivePreview* previewp = getPreviewView(floaterp);
-		previewp->setSize(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight());
+		previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
 	}
 
 	bool use_freeze_frame = floaterp->childGetValue("freeze_frame_check").asBoolean();
@@ -1691,7 +1691,7 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL
 		if (width == 0 || height == 0)
 		{
 			// take resolution from current window size
-			previewp->setSize(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight());
+			previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
 		}
 		else if (width == -1 || height == -1)
 		{
@@ -1844,13 +1844,13 @@ BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S3
 #endif
 	if(previewp && previewp->mKeepAspectRatio)
 	{
-		if(gViewerWindow->getWindowDisplayWidth() < 1 || gViewerWindow->getWindowDisplayHeight() < 1)
+		if(gViewerWindow->getWindowWidthRaw() < 1 || gViewerWindow->getWindowHeightRaw() < 1)
 		{
 			return FALSE ;
 		}
 
 		//aspect ratio of the current window
-		F32 aspect_ratio = (F32)gViewerWindow->getWindowDisplayWidth() / gViewerWindow->getWindowDisplayHeight() ;
+		F32 aspect_ratio = (F32)gViewerWindow->getWindowWidthRaw() / gViewerWindow->getWindowHeightRaw() ;
 
 		//change another value proportionally
 		if(isWidthChanged)
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 7863c373c62..21458f83cdb 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -2174,7 +2174,7 @@ void LLFolderView::updateRenamerPosition()
 		screenPointToLocal( x, y, &x, &y );
 		mRenamer->setOrigin( x, y );
 
-		LLRect scroller_rect(0, 0, gViewerWindow->getWindowWidth(), 0);
+		LLRect scroller_rect(0, 0, gViewerWindow->getWindowWidthScaled(), 0);
 		if (mScrollContainer)
 		{
 			scroller_rect = mScrollContainer->getContentWindowRect();
diff --git a/indra/newview/llhudicon.cpp b/indra/newview/llhudicon.cpp
index eda1d3fc55b..040027c70d6 100644
--- a/indra/newview/llhudicon.cpp
+++ b/indra/newview/llhudicon.cpp
@@ -145,8 +145,8 @@ void LLHUDIcon::renderIcon(BOOL for_select)
 	}
 
 	F32 image_aspect = (F32)mImagep->getFullWidth() / (F32)mImagep->getFullHeight() ;
-	LLVector3 x_scale = image_aspect * (F32)gViewerWindow->getWindowHeight() * mScale * scale_factor * x_pixel_vec;
-	LLVector3 y_scale = (F32)gViewerWindow->getWindowHeight() * mScale * scale_factor * y_pixel_vec;
+	LLVector3 x_scale = image_aspect * (F32)gViewerWindow->getWindowHeightScaled() * mScale * scale_factor * x_pixel_vec;
+	LLVector3 y_scale = (F32)gViewerWindow->getWindowHeightScaled() * mScale * scale_factor * y_pixel_vec;
 
 	LLVector3 lower_left = icon_position - (x_scale * 0.5f);
 	LLVector3 lower_right = icon_position + (x_scale * 0.5f);
@@ -261,8 +261,8 @@ BOOL LLHUDIcon::lineSegmentIntersect(const LLVector3& start, const LLVector3& en
 	}
 	
 	F32 image_aspect = (F32)mImagep->getFullWidth() / (F32)mImagep->getFullHeight() ;
-	LLVector3 x_scale = image_aspect * (F32)gViewerWindow->getWindowHeight() * mScale * scale_factor * x_pixel_vec;
-	LLVector3 y_scale = (F32)gViewerWindow->getWindowHeight() * mScale * scale_factor * y_pixel_vec;
+	LLVector3 x_scale = image_aspect * (F32)gViewerWindow->getWindowHeightScaled() * mScale * scale_factor * x_pixel_vec;
+	LLVector3 y_scale = (F32)gViewerWindow->getWindowHeightScaled() * mScale * scale_factor * y_pixel_vec;
 
 	LLVector3 lower_left = icon_position - (x_scale * 0.5f);
 	LLVector3 lower_right = icon_position + (x_scale * 0.5f);
diff --git a/indra/newview/llhudrender.cpp b/indra/newview/llhudrender.cpp
index 886fe3da075..ab0be90defa 100644
--- a/indra/newview/llhudrender.cpp
+++ b/indra/newview/llhudrender.cpp
@@ -77,8 +77,8 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,
 	LLVector3 up_axis;
 	if (orthographic)
 	{
-		right_axis.setVec(0.f, -1.f / gViewerWindow->getWorldViewWidth(), 0.f);
-		up_axis.setVec(0.f, 0.f, 1.f / gViewerWindow->getWorldViewHeight());
+		right_axis.setVec(0.f, -1.f / gViewerWindow->getWorldViewWidthRaw(), 0.f);
+		up_axis.setVec(0.f, 0.f, 1.f / gViewerWindow->getWorldViewHeightRaw());
 	}
 	else
 	{
@@ -106,7 +106,7 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,
 	//get the render_pos in screen space
 	
 	F64 winX, winY, winZ;
-	LLRect world_view_rect = gViewerWindow->getWorldViewRect();
+	LLRect world_view_rect = gViewerWindow->getWorldViewRectRaw();
 	S32	viewport[4];
 	viewport[0] = world_view_rect.mLeft;
 	viewport[1] = world_view_rect.mBottom;
diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp
index 55019f91f89..0b5da40be4d 100644
--- a/indra/newview/llhudtext.cpp
+++ b/indra/newview/llhudtext.cpp
@@ -156,8 +156,8 @@ BOOL LLHUDText::lineSegmentIntersect(const LLVector3& start, const LLVector3& en
 	
 	if (mOnHUDAttachment)
 	{
-		x_pixel_vec = LLVector3::y_axis / (F32)gViewerWindow->getWindowWidth();
-		y_pixel_vec = LLVector3::z_axis / (F32)gViewerWindow->getWindowHeight();
+		x_pixel_vec = LLVector3::y_axis / (F32)gViewerWindow->getWindowWidthScaled();
+		y_pixel_vec = LLVector3::z_axis / (F32)gViewerWindow->getWindowHeightScaled();
 	}
 	else
 	{
@@ -316,8 +316,8 @@ void LLHUDText::renderText(BOOL for_select)
 	
 	if (mOnHUDAttachment)
 	{
-		x_pixel_vec = LLVector3::y_axis / (F32)gViewerWindow->getWorldViewWidth();
-		y_pixel_vec = LLVector3::z_axis / (F32)gViewerWindow->getWorldViewHeight();
+		x_pixel_vec = LLVector3::y_axis / (F32)gViewerWindow->getWorldViewWidthRaw();
+		y_pixel_vec = LLVector3::z_axis / (F32)gViewerWindow->getWorldViewHeightRaw();
 	}
 	else
 	{
@@ -351,8 +351,8 @@ void LLHUDText::renderText(BOOL for_select)
 
 	//if (mOnHUD)
 	//{
-	//	render_position.mV[VY] -= fmodf(render_position.mV[VY], 1.f / (F32)gViewerWindow->getWindowWidth());
-	//	render_position.mV[VZ] -= fmodf(render_position.mV[VZ], 1.f / (F32)gViewerWindow->getWindowHeight());
+	//	render_position.mV[VY] -= fmodf(render_position.mV[VY], 1.f / (F32)gViewerWindow->getWindowWidthScaled());
+	//	render_position.mV[VZ] -= fmodf(render_position.mV[VZ], 1.f / (F32)gViewerWindow->getWindowHeightScaled());
 	//}
 	//else
 	//{
@@ -800,7 +800,7 @@ LLVector2 LLHUDText::updateScreenPos(LLVector2 &offset)
 
 	screen_pos_vec.setVec((F32)screen_pos.mX, (F32)screen_pos.mY);
 
-	LLRect world_rect = gViewerWindow->getVirtualWorldViewRect();
+	LLRect world_rect = gViewerWindow->getWorldViewRectScaled();
 	S32 bottom = world_rect.mBottom + STATUS_BAR_HEIGHT;
 
 	LLVector2 screen_center;
@@ -897,7 +897,7 @@ void LLHUDText::updateAll()
 	std::sort(sVisibleHUDTextObjects.begin(), sVisibleHUDTextObjects.end(), lltextobject_further_away());
 
 	// iterate from front to back, and set LOD based on current screen coverage
-	F32 screen_area = (F32)(gViewerWindow->getWindowWidth() * gViewerWindow->getWindowHeight());
+	F32 screen_area = (F32)(gViewerWindow->getWindowWidthScaled() * gViewerWindow->getWindowHeightScaled());
 	F32 current_screen_area = 0.f;
 	std::vector<LLPointer<LLHUDText> >::reverse_iterator r_it;
 	for (r_it = sVisibleTextObjects.rbegin(); r_it != sVisibleTextObjects.rend(); ++r_it)
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index a634a1b0fd0..5a2331aa06a 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -363,7 +363,7 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
 
 void LLIMFloater::getAllowedRect(LLRect& rect)
 {
-	rect = gViewerWindow->getWorldViewRect();
+	rect = gViewerWindow->getWorldViewRectRaw();
 }
 
 void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
diff --git a/indra/newview/llimhandler.cpp b/indra/newview/llimhandler.cpp
index 74971f3fd85..524a889f972 100644
--- a/indra/newview/llimhandler.cpp
+++ b/indra/newview/llimhandler.cpp
@@ -58,7 +58,7 @@ LLIMHandler::~LLIMHandler()
 //--------------------------------------------------------------------------
 void LLIMHandler::initChannel()
 {
-	S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
+	S32 channel_right_bound = gViewerWindow->getWorldViewRectRaw().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
 	S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
 	mChannel->init(channel_right_bound - channel_width, channel_right_bound);
 }
diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp
index f62d7229a31..fa1dbe06034 100644
--- a/indra/newview/llmanip.cpp
+++ b/indra/newview/llmanip.cpp
@@ -265,8 +265,8 @@ BOOL LLManip::getMousePointOnPlaneGlobal(LLVector3d& point, S32 x, S32 y, LLVect
 	if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
 	{
 		BOOL result = FALSE;
-		F32 mouse_x = ((F32)x / gViewerWindow->getWindowWidth() - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgent.mHUDCurZoom;
-		F32 mouse_y = ((F32)y / gViewerWindow->getWindowHeight() - 0.5f) / gAgent.mHUDCurZoom;
+		F32 mouse_x = ((F32)x / gViewerWindow->getWindowWidthScaled() - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgent.mHUDCurZoom;
+		F32 mouse_y = ((F32)y / gViewerWindow->getWindowHeightScaled() - 0.5f) / gAgent.mHUDCurZoom;
 
 		LLVector3 origin_agent = gAgent.getPosAgentFromGlobal(origin);
 		LLVector3 mouse_pos = LLVector3(0.f, -mouse_x, mouse_y);
@@ -304,8 +304,8 @@ BOOL LLManip::nearestPointOnLineFromMouse( S32 x, S32 y, const LLVector3& b1, co
 
 	if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
 	{
-		F32 mouse_x = (((F32)x / gViewerWindow->getWindowWidth()) - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgent.mHUDCurZoom;
-		F32 mouse_y = (((F32)y / gViewerWindow->getWindowHeight()) - 0.5f) / gAgent.mHUDCurZoom;
+		F32 mouse_x = (((F32)x / gViewerWindow->getWindowWidthScaled()) - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgent.mHUDCurZoom;
+		F32 mouse_y = (((F32)y / gViewerWindow->getWindowHeightScaled()) - 0.5f) / gAgent.mHUDCurZoom;
 		a1 = LLVector3(llmin(b1.mV[VX] - 0.1f, b2.mV[VX] - 0.1f, 0.f), -mouse_x, mouse_y);
 		a2 = a1 + LLVector3(1.f, 0.f, 0.f);
 	}
@@ -429,9 +429,9 @@ void LLManip::renderXYZ(const LLVector3 &vec)
 	const S32 PAD = 10;
 	std::string feedback_string;
 	LLVector3 camera_pos = LLViewerCamera::getInstance()->getOrigin() + LLViewerCamera::getInstance()->getAtAxis();
-	S32 vertical_offset = gViewerWindow->getWindowHeight() / 2 - VERTICAL_OFFSET;
-	S32 window_center_x = gViewerWindow->getWindowWidth() / 2;
-	S32 window_center_y = gViewerWindow->getWindowHeight() / 2;
+	S32 vertical_offset = gViewerWindow->getWindowHeightScaled() / 2 - VERTICAL_OFFSET;
+	S32 window_center_x = gViewerWindow->getWindowWidthScaled() / 2;
+	S32 window_center_y = gViewerWindow->getWindowHeightScaled() / 2;
 
 	glPushMatrix();
 	{
diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp
index c99e67be3f2..bcaebb6bbb9 100644
--- a/indra/newview/llmaniprotate.cpp
+++ b/indra/newview/llmaniprotate.cpp
@@ -1107,8 +1107,8 @@ BOOL LLManipRotate::updateVisiblity()
 		mCenterToProfilePlaneMag = mRadiusMeters * mRadiusMeters / mCenterToCamMag;
 		mCenterToProfilePlane = -mCenterToProfilePlaneMag * mCenterToCamNorm;
 
-		mCenterScreen.set((S32)((0.5f - mRotationCenter.mdV[VY]) / gAgent.mHUDCurZoom * gViewerWindow->getWorldViewWidth()),
-							(S32)((mRotationCenter.mdV[VZ] + 0.5f) / gAgent.mHUDCurZoom * gViewerWindow->getWorldViewHeight()));
+		mCenterScreen.set((S32)((0.5f - mRotationCenter.mdV[VY]) / gAgent.mHUDCurZoom * gViewerWindow->getWorldViewWidthRaw()),
+							(S32)((mRotationCenter.mdV[VZ] + 0.5f) / gAgent.mHUDCurZoom * gViewerWindow->getWorldViewHeightRaw()));
 		visible = TRUE;
 	}
 	else
@@ -1624,8 +1624,8 @@ void LLManipRotate::mouseToRay( S32 x, S32 y, LLVector3* ray_pt, LLVector3* ray_
 {
 	if (LLSelectMgr::getInstance()->getSelection()->getSelectType() == SELECT_TYPE_HUD)
 	{
-		F32 mouse_x = (((F32)x / gViewerWindow->getWorldViewWidth()) - 0.5f) / gAgent.mHUDCurZoom;
-		F32 mouse_y = ((((F32)y) / gViewerWindow->getWorldViewHeight()) - 0.5f) / gAgent.mHUDCurZoom;
+		F32 mouse_x = (((F32)x / gViewerWindow->getWorldViewWidthRaw()) - 0.5f) / gAgent.mHUDCurZoom;
+		F32 mouse_y = ((((F32)y) / gViewerWindow->getWorldViewHeightRaw()) - 0.5f) / gAgent.mHUDCurZoom;
 
 		*ray_pt = LLVector3(-1.f, -mouse_x, mouse_y);
 		*ray_dir = LLVector3(1.f, 0.f, 0.f);
@@ -1699,7 +1699,7 @@ void LLManipRotate::highlightManipulators( S32 x, S32 y )
 	F32 dist_y = mouse_dir_y.normVec();
 	F32 dist_z = mouse_dir_z.normVec();
 
-	F32 distance_threshold = (MAX_MANIP_SELECT_DISTANCE * mRadiusMeters) / gViewerWindow->getWorldViewHeight();
+	F32 distance_threshold = (MAX_MANIP_SELECT_DISTANCE * mRadiusMeters) / gViewerWindow->getWorldViewHeightRaw();
 
 	if (llabs(dist_x - mRadiusMeters) * llmax(0.05f, proj_rot_x_axis) < distance_threshold)
 	{
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index aa385b43a1c..84a5eb7352b 100644
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -493,7 +493,7 @@ void LLManipScale::highlightManipulators(S32 x, S32 y)
 			mProjectedManipulators.insert(projManipulator);
 		}
 
-		LLRect world_view_rect = gViewerWindow->getVirtualWorldViewRect();
+		LLRect world_view_rect = gViewerWindow->getWorldViewRectScaled();
 		F32 half_width = (F32)world_view_rect.getWidth() / 2.f;
 		F32 half_height = (F32)world_view_rect.getHeight() / 2.f;
 		LLVector2 manip2d;
@@ -1369,7 +1369,7 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)
 	else
 	{
 		F32 object_distance = dist_vec(mScaleCenter, LLViewerCamera::getInstance()->getOrigin());
-		mSnapRegimeOffset = (SNAP_GUIDE_SCREEN_OFFSET * gViewerWindow->getWorldViewWidth() * object_distance) / LLViewerCamera::getInstance()->getPixelMeterRatio();
+		mSnapRegimeOffset = (SNAP_GUIDE_SCREEN_OFFSET * gViewerWindow->getWorldViewWidthRaw() * object_distance) / LLViewerCamera::getInstance()->getPixelMeterRatio();
 	}
 	LLVector3 cam_at_axis;
 	F32 snap_guide_length;
@@ -1382,7 +1382,7 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)
 	{
 		cam_at_axis = LLViewerCamera::getInstance()->getAtAxis();
 		F32 manipulator_distance = dist_vec(box_corner_agent, LLViewerCamera::getInstance()->getOrigin());
-		snap_guide_length = (SNAP_GUIDE_SCREEN_LENGTH * gViewerWindow->getWorldViewWidth() * manipulator_distance) / LLViewerCamera::getInstance()->getPixelMeterRatio();
+		snap_guide_length = (SNAP_GUIDE_SCREEN_LENGTH * gViewerWindow->getWorldViewWidthRaw() * manipulator_distance) / LLViewerCamera::getInstance()->getPixelMeterRatio();
 	}
 	
 	mSnapGuideLength = snap_guide_length / llmax(0.1f, (llmin(mSnapGuideDir1 * cam_at_axis, mSnapGuideDir2 * cam_at_axis)));
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index 002b8350f74..932a3d8a83f 100644
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -413,7 +413,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)
 	}
 	
 	// Handle auto-rotation if necessary.
-	LLRect world_rect = gViewerWindow->getVirtualWorldViewRect();
+	LLRect world_rect = gViewerWindow->getWorldViewRectScaled();
 	const F32 ROTATE_ANGLE_PER_SECOND = 30.f * DEG_TO_RAD;
 	const S32 ROTATE_H_MARGIN = world_rect.getWidth() / 20;
 	const F32 rotate_angle = ROTATE_ANGLE_PER_SECOND / gFPSClamped;
@@ -961,7 +961,7 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
 	LLVector2 manip_start_2d;
 	LLVector2 manip_end_2d;
 	LLVector2 manip_dir;
-	LLRect world_view_rect = gViewerWindow->getVirtualWorldViewRect();
+	LLRect world_view_rect = gViewerWindow->getWorldViewRectScaled();
 	F32 half_width = (F32)world_view_rect.getWidth() / 2.f;
 	F32 half_height = (F32)world_view_rect.getHeight() / 2.f;
 	LLVector2 mousePos((F32)x - half_width, (F32)y - half_height);
@@ -1227,7 +1227,7 @@ void LLManipTranslate::renderSnapGuides()
 		{
 			LLVector3 cam_to_selection = getPivotPoint() - LLViewerCamera::getInstance()->getOrigin();
 			F32 current_range = cam_to_selection.normVec();
-			guide_size_meters = SNAP_GUIDE_SCREEN_SIZE * gViewerWindow->getWorldViewHeight() * current_range / LLViewerCamera::getInstance()->getPixelMeterRatio();
+			guide_size_meters = SNAP_GUIDE_SCREEN_SIZE * gViewerWindow->getWorldViewHeightRaw() * current_range / LLViewerCamera::getInstance()->getPixelMeterRatio();
 	
 			F32 fraction_of_fov = mAxisArrowLength / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels();
 			F32 apparent_angle = fraction_of_fov * LLViewerCamera::getInstance()->getView();  // radians
@@ -1802,7 +1802,7 @@ void LLManipTranslate::renderTranslationHandles()
 	// Drag handles 	
 	if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
 	{
-		mArrowLengthMeters = mAxisArrowLength / gViewerWindow->getWorldViewHeight();
+		mArrowLengthMeters = mAxisArrowLength / gViewerWindow->getWorldViewHeightRaw();
 		mArrowLengthMeters /= gAgent.mHUDCurZoom;
 	}
 	else
diff --git a/indra/newview/llmemoryview.cpp b/indra/newview/llmemoryview.cpp
index b3aa67733b0..cbe4cef12f8 100644
--- a/indra/newview/llmemoryview.cpp
+++ b/indra/newview/llmemoryview.cpp
@@ -130,8 +130,8 @@ void LLMemoryView::draw()
 	curUpdate++;
 
 	// setup window properly
-	S32 height = (S32) (gViewerWindow->getVirtualWindowRect().getHeight()*0.75f);
-	S32 width = (S32) (gViewerWindow->getVirtualWindowRect().getWidth() * 0.9f);
+	S32 height = (S32) (gViewerWindow->getWindowRectScaled().getHeight()*0.75f);
+	S32 width = (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.9f);
 	setRect(LLRect().setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height));
 	
 	// setup window color
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 974291a54e8..ac806d7106a 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -290,7 +290,7 @@ void LLNearbyChat::setRect	(const LLRect &rect)
 
 void LLNearbyChat::getAllowedRect(LLRect& rect)
 {
-	rect = gViewerWindow->getWorldViewRect();
+	rect = gViewerWindow->getWorldViewRectRaw();
 }
 
 
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index 8a8ad9d073f..e10c506f086 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -122,8 +122,8 @@ class LLNearbyChatScreenChannel: public LLScreenChannelBase
 
 void LLNearbyChatScreenChannel::init(S32 channel_left, S32 channel_right)
 {
-	S32 channel_top = gViewerWindow->getWorldViewRect().getHeight();
-	S32 channel_bottom = gViewerWindow->getWorldViewRect().mBottom;
+	S32 channel_top = gViewerWindow->getWorldViewRectRaw().getHeight();
+	S32 channel_bottom = gViewerWindow->getWorldViewRectRaw().mBottom;
 	setRect(LLRect(channel_left, channel_top, channel_right, channel_bottom));
 	setVisible(TRUE);
 }
diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp
index 1be03cef0b5..1f68c76bfc3 100644
--- a/indra/newview/llnotificationalerthandler.cpp
+++ b/indra/newview/llnotificationalerthandler.cpp
@@ -66,7 +66,7 @@ LLAlertHandler::~LLAlertHandler()
 //--------------------------------------------------------------------------
 void LLAlertHandler::initChannel()
 {
-	S32 channel_right_bound = gViewerWindow->getWorldViewRect().getWidth() / 2;
+	S32 channel_right_bound = gViewerWindow->getWorldViewRectRaw().getWidth() / 2;
 	mChannel->init(channel_right_bound, channel_right_bound);
 }
 
diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp
index ffa92b543cc..fc6fb25644a 100644
--- a/indra/newview/llnotificationgrouphandler.cpp
+++ b/indra/newview/llnotificationgrouphandler.cpp
@@ -57,7 +57,7 @@ LLGroupHandler::~LLGroupHandler()
 //--------------------------------------------------------------------------
 void LLGroupHandler::initChannel()
 {
-	S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
+	S32 channel_right_bound = gViewerWindow->getWorldViewRectRaw().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
 	S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
 	mChannel->init(channel_right_bound - channel_width, channel_right_bound);
 }
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index 75ef5208e76..1bf7be1c4e1 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -65,7 +65,7 @@ LLOfferHandler::~LLOfferHandler()
 //--------------------------------------------------------------------------
 void LLOfferHandler::initChannel()
 {
-	S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
+	S32 channel_right_bound = gViewerWindow->getWorldViewRectRaw().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
 	S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
 	mChannel->init(channel_right_bound - channel_width, channel_right_bound);
 }
diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp
index dac7a4ca3a4..70b86e8b976 100644
--- a/indra/newview/llnotificationscripthandler.cpp
+++ b/indra/newview/llnotificationscripthandler.cpp
@@ -64,7 +64,7 @@ LLScriptHandler::~LLScriptHandler()
 //--------------------------------------------------------------------------
 void LLScriptHandler::initChannel()
 {
-	S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
+	S32 channel_right_bound = gViewerWindow->getWorldViewRectRaw().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
 	S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
 	mChannel->init(channel_right_bound - channel_width, channel_right_bound);
 }
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index 543198c1d21..823c92a94e3 100644
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -60,7 +60,7 @@ LLTipHandler::~LLTipHandler()
 //--------------------------------------------------------------------------
 void LLTipHandler::initChannel()
 {
-	S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
+	S32 channel_right_bound = gViewerWindow->getWorldViewRectRaw().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
 	S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
 	mChannel->init(channel_right_bound - channel_width, channel_right_bound);
 }
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 5d826f0a561..b3e14eb2fb8 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -310,7 +310,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
 void LLPanelLogin::reshapeBrowser()
 {
 	LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
-	LLRect rect = gViewerWindow->getVirtualWindowRect();
+	LLRect rect = gViewerWindow->getWindowRectScaled();
 	LLRect html_rect;
 #if USE_VIEWER_AUTH
 	html_rect.setCenterAndSize( 
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 73e19b3b2a0..53493b71b29 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -561,12 +561,12 @@ void LLPanelPrimMediaControls::updateShape()
 		}
 
         LLCoordGL screen_min;
-		screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidth() * (min.mV[VX] + 1.f) * 0.5f);
-		screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeight() * (min.mV[VY] + 1.f) * 0.5f);
+		screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidthRaw() * (min.mV[VX] + 1.f) * 0.5f);
+		screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeightRaw() * (min.mV[VY] + 1.f) * 0.5f);
 
 		LLCoordGL screen_max;
-		screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidth() * (max.mV[VX] + 1.f) * 0.5f);
-		screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeight() * (max.mV[VY] + 1.f) * 0.5f);
+		screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidthRaw() * (max.mV[VX] + 1.f) * 0.5f);
+		screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeightRaw() * (max.mV[VY] + 1.f) * 0.5f);
 
 		// grow panel so that screenspace bounding box fits inside "media_region" element of HUD
 		LLRect media_controls_rect;
diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp
index 34e78b5c469..c95882931b6 100644
--- a/indra/newview/llpreview.cpp
+++ b/indra/newview/llpreview.cpp
@@ -454,7 +454,7 @@ LLMultiPreview::LLMultiPreview()
 	{
 		// start with a rect in the top-left corner ; will get resized
 		LLRect rect;
-		rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeight(), 200, 200);
+		rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 200, 200);
 		setRect(rect);
 	}
 	setTitle(LLTrans::getString("MultiPreviewTitle"));
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 3eab13fc4a2..13d02b7dec0 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -394,8 +394,8 @@ void LLPreviewTexture::updateDimensions()
 	S32 client_height = image_height;
 	S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE;
 	S32 vert_pad = PREVIEW_HEADER_SIZE + 2 * CLIENT_RECT_VPAD + LLPANEL_BORDER_WIDTH;	
-	S32 max_client_width = gViewerWindow->getWindowWidth() - horiz_pad;
-	S32 max_client_height = gViewerWindow->getWindowHeight() - vert_pad;
+	S32 max_client_width = gViewerWindow->getWindowWidthScaled() - horiz_pad;
+	S32 max_client_height = gViewerWindow->getWindowHeightScaled() - vert_pad;
 
 	if (mAspectRatio > 0.f)
 	{
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index e4dbcbd2192..b667fbf5fd2 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -103,8 +103,8 @@ void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect ne
 
 void LLScreenChannelBase::init(S32 channel_left, S32 channel_right)
 {
-	S32 channel_top = gViewerWindow->getWorldViewRect().getHeight();
-	S32 channel_bottom = gViewerWindow->getWorldViewRect().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");
+	S32 channel_top = gViewerWindow->getWorldViewRectRaw().getHeight();
+	S32 channel_bottom = gViewerWindow->getWorldViewRectRaw().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");
 	setRect(LLRect(channel_left, channel_top, channel_right, channel_bottom));
 	setVisible(TRUE);
 }
@@ -706,7 +706,7 @@ void LLScreenChannel::updateShowToastsState()
 	// for Message Well floater showed in a docked state - adjust channel's height
 	if(dynamic_cast<LLSysWellWindow*>(floater))
 	{
-		S32 channel_bottom = gViewerWindow->getWorldViewRect().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");;
+		S32 channel_bottom = gViewerWindow->getWorldViewRectRaw().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");;
 		LLRect this_rect = getRect();
 		if(floater->getVisible() && floater->isDocked())
 		{
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 2c1f468f77a..25729c91e66 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -1386,7 +1386,7 @@ bool idle_startup()
 
 		// Make sure agent knows correct aspect ratio
 		// FOV limits depend upon aspect ratio so this needs to happen before initializing the FOV below
-		LLViewerCamera::getInstance()->setViewHeightInPixels(gViewerWindow->getWorldViewHeight());
+		LLViewerCamera::getInstance()->setViewHeightInPixels(gViewerWindow->getWorldViewHeightRaw());
 		LLViewerCamera::getInstance()->setAspect(gViewerWindow->getWorldViewAspectRatio());
 		// Initialize FOV
 		LLViewerCamera::getInstance()->setDefaultFOV(gSavedSettings.getF32("CameraAngle")); 
@@ -2122,7 +2122,7 @@ void login_show()
 	BOOL bUseDebugLogin = TRUE;
 #endif
 
-	LLPanelLogin::show(	gViewerWindow->getVirtualWindowRect(),
+	LLPanelLogin::show(	gViewerWindow->getWindowRectScaled(),
 						bUseDebugLogin,
 						login_callback, NULL );
 
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index 723ac0fc33a..4422c4b6722 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -238,7 +238,7 @@ void LLSysWellWindow::initChannel()
 //---------------------------------------------------------------------------------
 void LLSysWellWindow::getAllowedRect(LLRect& rect)
 {
-	rect = gViewerWindow->getWorldViewRect();
+	rect = gViewerWindow->getWorldViewRectRaw();
 }
 
 //---------------------------------------------------------------------------------
diff --git a/indra/newview/lltoolbar.cpp b/indra/newview/lltoolbar.cpp
index 0572f9a6986..268a18d2a2c 100644
--- a/indra/newview/lltoolbar.cpp
+++ b/indra/newview/lltoolbar.cpp
@@ -206,7 +206,7 @@ void LLToolBar::layoutButtons()
 {
 #if LL_DARWIN
 	const S32 FUDGE_WIDTH_OF_SCREEN = 4;                                    
-	S32 width = gViewerWindow->getWindowWidth() + FUDGE_WIDTH_OF_SCREEN;   
+	S32 width = gViewerWindow->getWindowWidthScaled() + FUDGE_WIDTH_OF_SCREEN;   
 	S32 pad = 2;
 
 	// this function may be called before postBuild(), in which case mResizeHandle won't have been set up yet.
diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp
index 9400840bdfa..e2ccc05e30f 100644
--- a/indra/newview/lltoolfocus.cpp
+++ b/indra/newview/lltoolfocus.cpp
@@ -365,7 +365,7 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask)
 			// Orbit tool
 			if (hasMouseCapture())
 			{
-				const F32 RADIANS_PER_PIXEL = 360.f * DEG_TO_RAD / gViewerWindow->getWorldViewWidth();
+				const F32 RADIANS_PER_PIXEL = 360.f * DEG_TO_RAD / gViewerWindow->getWorldViewWidthRaw();
 
 				if (dx != 0)
 				{
@@ -393,7 +393,7 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask)
 				F32 dist = (F32) camera_to_focus.normVec();
 
 				// Fudge factor for pan
-				F32 meters_per_pixel = 3.f * dist / gViewerWindow->getWorldViewWidth();
+				F32 meters_per_pixel = 3.f * dist / gViewerWindow->getWorldViewWidthRaw();
 
 				if (dx != 0)
 				{
@@ -415,7 +415,7 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask)
 			if (hasMouseCapture())
 			{
 
-				const F32 RADIANS_PER_PIXEL = 360.f * DEG_TO_RAD / gViewerWindow->getWorldViewWidth();
+				const F32 RADIANS_PER_PIXEL = 360.f * DEG_TO_RAD / gViewerWindow->getWorldViewWidthRaw();
 
 				if (dx != 0)
 				{
diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp
index b7a97562bd1..44fb6e92715 100644
--- a/indra/newview/lltoolgrab.cpp
+++ b/indra/newview/lltoolgrab.cpp
@@ -510,8 +510,8 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
 	const F32 RADIANS_PER_PIXEL_X = 0.01f;
 	const F32 RADIANS_PER_PIXEL_Y = 0.01f;
 
-	S32 dx = x - (gViewerWindow->getWorldViewWidth() / 2);
-	S32 dy = y - (gViewerWindow->getWorldViewHeight() / 2);
+	S32 dx = x - (gViewerWindow->getWorldViewWidthRaw() / 2);
+	S32 dy = y - (gViewerWindow->getWorldViewHeightRaw() / 2);
 
 	if (dx != 0 || dy != 0)
 	{
@@ -631,10 +631,10 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
 			// Handle auto-rotation at screen edge.
 			LLVector3 grab_pos_agent = gAgent.getPosAgentFromGlobal( grab_point_global );
 
-			LLCoordGL grab_center_gl( gViewerWindow->getWorldViewWidth() / 2, gViewerWindow->getWorldViewHeight() / 2);
+			LLCoordGL grab_center_gl( gViewerWindow->getWorldViewWidthRaw() / 2, gViewerWindow->getWorldViewHeightRaw() / 2);
 			LLViewerCamera::getInstance()->projectPosAgentToScreen(grab_pos_agent, grab_center_gl);
 
-			const S32 ROTATE_H_MARGIN = gViewerWindow->getWorldViewWidth() / 20;
+			const S32 ROTATE_H_MARGIN = gViewerWindow->getWorldViewWidthRaw() / 20;
 			const F32 ROTATE_ANGLE_PER_SECOND = 30.f * DEG_TO_RAD;
 			const F32 rotate_angle = ROTATE_ANGLE_PER_SECOND / gFPSClamped;
 			// ...build mode moves camera about focus point
@@ -649,7 +649,7 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
 					gAgent.cameraOrbitAround(rotate_angle);
 				}
 			}
-			else if (grab_center_gl.mX > gViewerWindow->getWorldViewWidth() - ROTATE_H_MARGIN)
+			else if (grab_center_gl.mX > gViewerWindow->getWorldViewWidthRaw() - ROTATE_H_MARGIN)
 			{
 				if (gAgent.getFocusOnAvatar())
 				{
@@ -662,7 +662,7 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
 			}
 
 			// Don't move above top of screen or below bottom
-			if ((grab_center_gl.mY < gViewerWindow->getWorldViewHeight() - 6)
+			if ((grab_center_gl.mY < gViewerWindow->getWorldViewHeightRaw() - 6)
 				&& (grab_center_gl.mY > 24))
 			{
 				// Transmit update to simulator
@@ -893,7 +893,7 @@ void LLToolGrab::handleHoverInactive(S32 x, S32 y, MASK mask)
 				gAgent.yaw(rotate_angle);
 				//gAgent.setControlFlags(AGENT_CONTROL_YAW_POS);
 			}
-			else if (x == (gViewerWindow->getWorldViewWidth() - 1) )
+			else if (x == (gViewerWindow->getWorldViewWidthRaw() - 1) )
 			{
 				gAgent.yaw(-rotate_angle);
 				//gAgent.setControlFlags(AGENT_CONTROL_YAW_NEG);
diff --git a/indra/newview/lltoolgun.cpp b/indra/newview/lltoolgun.cpp
index 53d71a42cfa..a441d653c7c 100644
--- a/indra/newview/lltoolgun.cpp
+++ b/indra/newview/lltoolgun.cpp
@@ -140,7 +140,7 @@ void LLToolGun::draw()
 	{
 		LLUIImagePtr crosshair = LLUI::getUIImage("crosshairs.tga");
 		crosshair->draw(
-			( gViewerWindow->getVirtualWorldViewRect().getWidth() - crosshair->getWidth() ) / 2,
-			( gViewerWindow->getVirtualWorldViewRect().getHeight() - crosshair->getHeight() ) / 2);
+			( gViewerWindow->getWorldViewRectScaled().getWidth() - crosshair->getWidth() ) / 2,
+			( gViewerWindow->getWorldViewRectScaled().getHeight() - crosshair->getHeight() ) / 2);
 	}
 }
diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp
index b5709fa1021..5566fea89f2 100644
--- a/indra/newview/llviewercamera.cpp
+++ b/indra/newview/llviewercamera.cpp
@@ -401,10 +401,10 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
 	
 	if (for_selection && (width > 1 || height > 1))
 	{
-		calculateFrustumPlanesFromWindow((F32)(x - width / 2) / (F32)gViewerWindow->getWindowWidth() - 0.5f,
-								(F32)(y_from_bot - height / 2) / (F32)gViewerWindow->getWindowHeight() - 0.5f,
-								(F32)(x + width / 2) / (F32)gViewerWindow->getWindowWidth() - 0.5f,
-								(F32)(y_from_bot + height / 2) / (F32)gViewerWindow->getWindowHeight() - 0.5f);
+		calculateFrustumPlanesFromWindow((F32)(x - width / 2) / (F32)gViewerWindow->getWindowWidthScaled() - 0.5f,
+								(F32)(y_from_bot - height / 2) / (F32)gViewerWindow->getWindowHeightScaled() - 0.5f,
+								(F32)(x + width / 2) / (F32)gViewerWindow->getWindowWidthScaled() - 0.5f,
+								(F32)(y_from_bot + height / 2) / (F32)gViewerWindow->getWindowHeightScaled() - 0.5f);
 
 	}
 
@@ -469,7 +469,7 @@ BOOL LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord
 		}
 	}
 
-	LLRect world_view_rect = gViewerWindow->getWorldViewRect();
+	LLRect world_view_rect = gViewerWindow->getWorldViewRectRaw();
 	S32	viewport[4];
 	viewport[0] = world_view_rect.mLeft;
 	viewport[1] = world_view_rect.mBottom;
@@ -485,7 +485,7 @@ BOOL LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord
 		y /= gViewerWindow->getDisplayScale().mV[VY];
 
 		// should now have the x,y coords of grab_point in screen space
-		LLRect world_view_rect = gViewerWindow->getVirtualWorldViewRect();
+		LLRect world_view_rect = gViewerWindow->getWorldViewRectScaled();
 
 		// convert to pixel coordinates
 		S32 int_x = lltrunc(x);
@@ -572,7 +572,7 @@ BOOL LLViewerCamera::projectPosAgentToScreenEdge(const LLVector3 &pos_agent,
 		in_front = FALSE;
 	}
 
-	LLRect world_view_rect = gViewerWindow->getWorldViewRect();
+	LLRect world_view_rect = gViewerWindow->getWorldViewRectRaw();
 	S32	viewport[4];
 	viewport[0] = world_view_rect.mLeft;
 	viewport[1] = world_view_rect.mBottom;
@@ -587,7 +587,7 @@ BOOL LLViewerCamera::projectPosAgentToScreenEdge(const LLVector3 &pos_agent,
 		x /= gViewerWindow->getDisplayScale().mV[VX];
 		y /= gViewerWindow->getDisplayScale().mV[VY];
 		// should now have the x,y coords of grab_point in screen space
-		const LLRect& world_rect = gViewerWindow->getVirtualWorldViewRect();
+		const LLRect& world_rect = gViewerWindow->getWorldViewRectScaled();
 
 		// ...sanity check
 		S32 int_x = lltrunc(x);
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index e0bb8fedeb1..5b733ed817b 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -782,10 +782,10 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 		//		LLRect floater_rect = frontmost_floaterp->calcScreenRect();
 		//		// deflate by one pixel so rounding errors don't occlude outside of floater extents
 		//		floater_rect.stretch(-1);
-		//		LLRectf floater_3d_rect((F32)floater_rect.mLeft / (F32)gViewerWindow->getWindowWidth(), 
-		//								(F32)floater_rect.mTop / (F32)gViewerWindow->getWindowHeight(),
-		//								(F32)floater_rect.mRight / (F32)gViewerWindow->getWindowWidth(),
-		//								(F32)floater_rect.mBottom / (F32)gViewerWindow->getWindowHeight());
+		//		LLRectf floater_3d_rect((F32)floater_rect.mLeft / (F32)gViewerWindow->getWindowWidthScaled(), 
+		//								(F32)floater_rect.mTop / (F32)gViewerWindow->getWindowHeightScaled(),
+		//								(F32)floater_rect.mRight / (F32)gViewerWindow->getWindowWidthScaled(),
+		//								(F32)floater_rect.mBottom / (F32)gViewerWindow->getWindowHeightScaled());
 		//		floater_3d_rect.translate(-0.5f, -0.5f);
 		//		glTranslatef(0.f, 0.f, -LLViewerCamera::getInstance()->getNear());
 		//		glScalef(LLViewerCamera::getInstance()->getNear() * LLViewerCamera::getInstance()->getAspect() / sinf(LLViewerCamera::getInstance()->getView()), LLViewerCamera::getInstance()->getNear() / sinf(LLViewerCamera::getInstance()->getView()), 1.f);
@@ -874,7 +874,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 		/// and then display it again with compositor effects.
 		/// Using render to texture would be faster/better, but I don't have a 
 		/// grasp of their full display stack just yet.
-		// gPostProcess->apply(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight());
+		// gPostProcess->apply(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
 		
 		if (LLPipeline::sRenderDeferred && !LLPipeline::sUnderWaterRender)
 		{
@@ -1011,7 +1011,7 @@ void render_hud_attachments()
 
 BOOL setup_hud_matrices()
 {
-	LLRect whole_screen = gViewerWindow->getVirtualWindowRect();
+	LLRect whole_screen = gViewerWindow->getWindowRectScaled();
 
 	// apply camera zoom transform (for high res screenshots)
 	F32 zoom_factor = LLViewerCamera::getInstance()->getZoomFactor();
@@ -1019,13 +1019,13 @@ BOOL setup_hud_matrices()
 	if (zoom_factor > 1.f)
 	{
 		S32 num_horizontal_tiles = llceil(zoom_factor);
-		S32 tile_width = llround((F32)gViewerWindow->getWindowWidth() / zoom_factor);
-		S32 tile_height = llround((F32)gViewerWindow->getWindowHeight() / zoom_factor);
+		S32 tile_width = llround((F32)gViewerWindow->getWindowWidthScaled() / zoom_factor);
+		S32 tile_height = llround((F32)gViewerWindow->getWindowHeightScaled() / zoom_factor);
 		int tile_y = sub_region / num_horizontal_tiles;
 		int tile_x = sub_region - (tile_y * num_horizontal_tiles);
 		glh::matrix4f mat;
 
-		whole_screen.setLeftTopAndSize(tile_x * tile_width, gViewerWindow->getWindowHeight() - (tile_y * tile_height), tile_width, tile_height);
+		whole_screen.setLeftTopAndSize(tile_x * tile_width, gViewerWindow->getWindowHeightScaled() - (tile_y * tile_height), tile_width, tile_height);
 	}
 
 	return setup_hud_matrices(whole_screen);
@@ -1048,12 +1048,12 @@ BOOL setup_hud_matrices(const LLRect& screen_region)
 		F32 aspect_ratio = LLViewerCamera::getInstance()->getAspect();
 
 		glh::matrix4f mat;
-		F32 scale_x = (F32)gViewerWindow->getWindowWidth() / (F32)screen_region.getWidth();
-		F32 scale_y = (F32)gViewerWindow->getWindowHeight() / (F32)screen_region.getHeight();
+		F32 scale_x = (F32)gViewerWindow->getWindowWidthScaled() / (F32)screen_region.getWidth();
+		F32 scale_y = (F32)gViewerWindow->getWindowHeightScaled() / (F32)screen_region.getHeight();
 		mat.set_scale(glh::vec3f(scale_x, scale_y, 1.f));
 		mat.set_translate(
-			glh::vec3f(clamp_rescale((F32)screen_region.getCenterX(), 0.f, (F32)gViewerWindow->getWindowWidth(), 0.5f * scale_x * aspect_ratio, -0.5f * scale_x * aspect_ratio),
-						clamp_rescale((F32)screen_region.getCenterY(), 0.f, (F32)gViewerWindow->getWindowHeight(), 0.5f * scale_y, -0.5f * scale_y),
+			glh::vec3f(clamp_rescale((F32)screen_region.getCenterX(), 0.f, (F32)gViewerWindow->getWindowWidthScaled(), 0.5f * scale_x * aspect_ratio, -0.5f * scale_x * aspect_ratio),
+						clamp_rescale((F32)screen_region.getCenterY(), 0.f, (F32)gViewerWindow->getWindowHeightScaled(), 0.5f * scale_y, -0.5f * scale_y),
 						0.f));
 		proj *= mat;
 
@@ -1269,8 +1269,8 @@ void render_ui_2d()
 		int pos_y = sub_region / llceil(zoom_factor);
 		int pos_x = sub_region - (pos_y*llceil(zoom_factor));
 		// offset for this tile
-		LLFontGL::sCurOrigin.mX -= llround((F32)gViewerWindow->getWindowWidth() * (F32)pos_x / zoom_factor);
-		LLFontGL::sCurOrigin.mY -= llround((F32)gViewerWindow->getWindowHeight() * (F32)pos_y / zoom_factor);
+		LLFontGL::sCurOrigin.mX -= llround((F32)gViewerWindow->getWindowWidthScaled() * (F32)pos_x / zoom_factor);
+		LLFontGL::sCurOrigin.mY -= llround((F32)gViewerWindow->getWindowHeightScaled() * (F32)pos_y / zoom_factor);
 	}
 
 	stop_glerror();
@@ -1280,8 +1280,8 @@ void render_ui_2d()
 	if (gAgent.getAvatarObject() && gAgent.mHUDCurZoom < 0.98f)
 	{
 		glPushMatrix();
-		S32 half_width = (gViewerWindow->getWindowWidth() / 2);
-		S32 half_height = (gViewerWindow->getWindowHeight() / 2);
+		S32 half_width = (gViewerWindow->getWindowWidthScaled() / 2);
+		S32 half_height = (gViewerWindow->getWindowHeightScaled() / 2);
 		glScalef(LLUI::sGLScaleFactor.mV[0], LLUI::sGLScaleFactor.mV[1], 1.f);
 		glTranslatef((F32)half_width, (F32)half_height, 0.f);
 		F32 zoom = gAgent.mHUDCurZoom;
@@ -1341,8 +1341,8 @@ void render_ui_2d()
 
 		LLGLDisable cull(GL_CULL_FACE);
 		LLGLDisable blend(GL_BLEND);
-		S32 width = gViewerWindow->getWindowWidth();
-		S32 height = gViewerWindow->getWindowHeight();
+		S32 width = gViewerWindow->getWindowWidthScaled();
+		S32 height = gViewerWindow->getWindowHeightScaled();
 		gGL.getTexUnit(0)->bind(&gPipeline.mUIScreen);
 		gGL.begin(LLRender::TRIANGLE_STRIP);
 		gGL.color4f(1,1,1,1);
@@ -1411,8 +1411,8 @@ void render_disconnected_background()
 	}
 
 	// Make sure the progress view always fills the entire window.
-	S32 width = gViewerWindow->getWindowWidth();
-	S32 height = gViewerWindow->getWindowHeight();
+	S32 width = gViewerWindow->getWindowWidthScaled();
+	S32 height = gViewerWindow->getWindowHeightScaled();
 
 	if (gDisconnectedImagep)
 	{
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 4d4ad1c0221..14ccb837c16 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -3807,7 +3807,7 @@ class LLViewDefaultUISize : public view_listener_t
 	{
 		gSavedSettings.setF32("UIScaleFactor", 1.0f);
 		gSavedSettings.setBOOL("UIAutoScale", FALSE);	
-		gViewerWindow->reshape(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight());
+		gViewerWindow->reshape(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
 		return true;
 	}
 };
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index d17c7e486fe..753acab172b 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -404,8 +404,8 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
 	{
 		LLPointer<LLImageRaw> raw = new LLImageRaw;
 
-		S32 width = gViewerWindow->getWindowDisplayWidth();
-		S32 height = gViewerWindow->getWindowDisplayHeight();
+		S32 width = gViewerWindow->getWindowWidthRaw();
+		S32 height = gViewerWindow->getWindowHeightRaw();
 
 		if (gSavedSettings.getBOOL("HighResSnapshot"))
 		{
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index ea1097c4779..a90790c59a8 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -4338,7 +4338,7 @@ void process_alert_core(const std::string& message, BOOL modal)
 		std::string snap_filename = gDirUtilp->getLindenUserDir();
 		snap_filename += gDirUtilp->getDirDelimiter();
 		snap_filename += SCREEN_HOME_FILENAME;
-		gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight(), FALSE, FALSE);
+		gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw(), FALSE, FALSE);
 	}
 
 	const std::string ALERT_PREFIX("ALERT: ");
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index caa94dba381..939d5e3970d 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -822,8 +822,8 @@ void send_stats()
 	// Screen size so the UI team can figure out how big the widgets
 	// appear and use a "typical" size for end user tests.
 
-	S32 window_width = gViewerWindow->getWindowDisplayWidth();
-	S32 window_height = gViewerWindow->getWindowDisplayHeight();
+	S32 window_width = gViewerWindow->getWindowWidthRaw();
+	S32 window_height = gViewerWindow->getWindowHeightRaw();
 	S32 window_size = (window_width * window_height) / 1024;
 	misc["string_1"] = llformat("%d", window_size);
 	// misc["string_2"] = 
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 2c2670563e1..23dff5469a9 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -315,7 +315,7 @@ class LLDebugText
 		mTextColor = LLColor4( 0.86f, 0.86f, 0.86f, 1.f );
 
 		// Draw stuff growing up from right lower corner of screen
-		U32 xpos = mWindow->getWindowWidth() - 350;
+		U32 xpos = mWindow->getWindowWidthScaled() - 350;
 		U32 ypos = 64;
 		const U32 y_inc = 20;
 
@@ -1196,9 +1196,9 @@ LLViewerWindow::LLViewerWindow(
 	mActive(TRUE),
 	mWantFullscreen(fullscreen),
 	mShowFullscreenProgress(FALSE),
-	mWindowRect(0, height, width, 0),
-	mVirtualWindowRect(0, height, width, 0),
-	mWorldViewRect(0, height, width, 0),
+	mWindowRectRaw(0, height, width, 0),
+	mWindowRectScaled(0, height, width, 0),
+	mWorldViewRectRaw(0, height, width, 0),
 	mLeftMouseDown(FALSE),
 	mMiddleMouseDown(FALSE),
 	mRightMouseDown(FALSE),
@@ -1267,8 +1267,8 @@ LLViewerWindow::LLViewerWindow(
 	{
 		LLCoordWindow size;
 		mWindow->getSize(&size);
-		mWindowRect.set(0, size.mY, size.mX, 0);
-		mVirtualWindowRect.set(0, llround((F32)size.mY / mDisplayScale.mV[VY]), llround((F32)size.mX / mDisplayScale.mV[VX]), 0);
+		mWindowRectRaw.set(0, size.mY, size.mX, 0);
+		mWindowRectScaled.set(0, llround((F32)size.mY / mDisplayScale.mV[VY]), llround((F32)size.mX / mDisplayScale.mV[VX]), 0);
 	}
 	
 	LLFontManager::initClass();
@@ -1324,15 +1324,15 @@ LLViewerWindow::LLViewerWindow(
 	// Create container for all sub-views
 	LLView::Params rvp;
 	rvp.name("root");
-	rvp.rect(mVirtualWindowRect);
+	rvp.rect(mWindowRectScaled);
 	rvp.mouse_opaque(false);
 	rvp.follows.flags(FOLLOWS_NONE);
 	mRootView = LLUICtrlFactory::create<LLRootView>(rvp);
 	LLUI::setRootView(mRootView);
 
 	// Make avatar head look forward at start
-	mCurrentMousePoint.mX = getWindowWidth() / 2;
-	mCurrentMousePoint.mY = getWindowHeight() / 2;
+	mCurrentMousePoint.mX = getWindowWidthScaled() / 2;
+	mCurrentMousePoint.mY = getWindowHeightScaled() / 2;
 
 	gShowOverlayTitle = gSavedSettings.getBOOL("ShowOverlayTitle");
 	mOverlayTitle = gSavedSettings.getString("OverlayTitle");
@@ -1379,8 +1379,8 @@ void LLViewerWindow::initGLDefaults()
 
 void LLViewerWindow::initBase()
 {
-	S32 height = getWindowHeight();
-	S32 width = getWindowWidth();
+	S32 height = getWindowHeightScaled();
+	S32 width = getWindowWidthScaled();
 
 	LLRect full_window(0, height, width, 0);
 
@@ -1747,8 +1747,8 @@ void LLViewerWindow::sendShapeToSim()
 	msg->addU32Fast(_PREHASH_CircuitCode, gMessageSystem->mOurCircuitCode);
 	msg->nextBlockFast(_PREHASH_HeightWidthBlock);
 	msg->addU32Fast(_PREHASH_GenCounter, 0);
-	U16 height16 = (U16) mWorldViewRect.getHeight();
-	U16 width16 = (U16) mWorldViewRect.getWidth();
+	U16 height16 = (U16) mWorldViewRectRaw.getHeight();
+	U16 width16 = (U16) mWorldViewRectRaw.getWidth();
 	msg->addU16Fast(_PREHASH_Height, height16);
 	msg->addU16Fast(_PREHASH_Width, width16);
 	gAgent.sendReliableMessage();
@@ -1770,14 +1770,14 @@ void LLViewerWindow::reshape(S32 width, S32 height)
 		}
 
 		// update our window rectangle
-		mWindowRect.mRight = mWindowRect.mLeft + width;
-		mWindowRect.mTop = mWindowRect.mBottom + height;
+		mWindowRectRaw.mRight = mWindowRectRaw.mLeft + width;
+		mWindowRectRaw.mTop = mWindowRectRaw.mBottom + height;
 
 		//glViewport(0, 0, width, height );
 
 		if (height > 0)
 		{ 
-			LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRect.getHeight() );
+			LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRectRaw.getHeight() );
 			LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() );
 		}
 
@@ -1787,8 +1787,8 @@ void LLViewerWindow::reshape(S32 width, S32 height)
 		LLUI::setScaleFactor(mDisplayScale);
 
 		// update our window rectangle
-		mVirtualWindowRect.mRight = mVirtualWindowRect.mLeft + llround((F32)width / mDisplayScale.mV[VX]);
-		mVirtualWindowRect.mTop = mVirtualWindowRect.mBottom + llround((F32)height / mDisplayScale.mV[VY]);
+		mWindowRectScaled.mRight = mWindowRectScaled.mLeft + llround((F32)width / mDisplayScale.mV[VX]);
+		mWindowRectScaled.mTop = mWindowRectScaled.mBottom + llround((F32)height / mDisplayScale.mV[VY]);
 
 		setup2DViewport();
 
@@ -1930,7 +1930,7 @@ void LLViewerWindow::draw()
 
 	if (!gSavedSettings.getBOOL("RenderUIBuffer"))
 	{
-		LLUI::sDirtyRect = this->getWindowRect();
+		LLUI::sDirtyRect = this->getWindowRectRaw();
 	}
 
 	// HACK for timecode debugging
@@ -1944,8 +1944,8 @@ void LLViewerWindow::draw()
 		microsecondsToTimecodeString(gFrameTime,text);
 		const LLFontGL* font = LLFontGL::getFontSansSerif();
 		font->renderUTF8(text, 0,
-						llround((getWindowWidth()/2)-100.f),
-						llround((getWindowHeight()-60.f)),
+						llround((getWindowWidthScaled()/2)-100.f),
+						llround((getWindowHeightScaled()-60.f)),
 			LLColor4( 1.f, 1.f, 1.f, 1.f ),
 			LLFontGL::LEFT, LLFontGL::TOP);
 	}
@@ -1968,8 +1968,8 @@ void LLViewerWindow::draw()
 			int pos_y = sub_region / llceil(zoom_factor);
 			int pos_x = sub_region - (pos_y*llceil(zoom_factor));
 			// offset for this tile
-			glTranslatef((F32)getWindowWidth() * -(F32)pos_x, 
-						(F32)getWindowHeight() * -(F32)pos_y, 
+			glTranslatef((F32)getWindowWidthScaled() * -(F32)pos_x, 
+						(F32)getWindowHeightScaled() * -(F32)pos_y, 
 						0.f);
 			glScalef(zoom_factor, zoom_factor, 1.f);
 			LLUI::sGLScaleFactor *= zoom_factor;
@@ -2014,8 +2014,8 @@ void LLViewerWindow::draw()
 			const S32 DIST_FROM_TOP = 20;
 			LLFontGL::getFontSansSerifBig()->renderUTF8(
 				mOverlayTitle, 0,
-				llround( getWindowWidth() * 0.5f),
-				getWindowHeight() - DIST_FROM_TOP,
+				llround( getWindowWidthScaled() * 0.5f),
+				getWindowHeightScaled() - DIST_FROM_TOP,
 				LLColor4(1, 1, 1, 0.4f),
 				LLFontGL::HCENTER, LLFontGL::TOP);
 		}
@@ -2315,7 +2315,7 @@ void LLViewerWindow::handleScrollWheel(S32 clicks)
 
 	// Zoom the camera in and out behavior
 
-	if(top_ctrl == 0 && mWorldViewRect.pointInRect(mCurrentMousePoint.mX, mCurrentMousePoint.mY) )
+	if(top_ctrl == 0 && mWorldViewRectRaw.pointInRect(mCurrentMousePoint.mX, mCurrentMousePoint.mY) )
 		gAgent.handleScrollWheel(clicks);
 
 	return;
@@ -2323,8 +2323,8 @@ void LLViewerWindow::handleScrollWheel(S32 clicks)
 
 void LLViewerWindow::moveCursorToCenter()
 {
-	S32 x = mWorldViewRect.getWidth() / 2;
-	S32 y = mWorldViewRect.getHeight() / 2;
+	S32 x = mWorldViewRectRaw.getWidth() / 2;
+	S32 y = mWorldViewRectRaw.getHeight() / 2;
 	
 	//on a forced move, all deltas get zeroed out to prevent jumping
 	mCurrentMousePoint.set(x,y);
@@ -2345,7 +2345,7 @@ void LLViewerWindow::updateBottomTrayRect()
 		}
 
 		LLBottomTray* bottom_tray = LLBottomTray::getInstance();
-		S32 right = llround((F32)mWindowRect.mRight / mDisplayScale.mV[VX]) - side_tray_width;
+		S32 right = llround((F32)mWindowRectRaw.mRight / mDisplayScale.mV[VX]) - side_tray_width;
 
 		LLRect rc = bottom_tray->getRect();
 		if (right != rc.mRight)
@@ -2784,8 +2784,8 @@ void LLViewerWindow::updateMouseDelta()
 	mWindow->getCursorPosition(&mouse_pos);
 	if (mouse_pos.mX < 0 || 
 		mouse_pos.mY < 0 ||
-		mouse_pos.mX > mWindowRect.getWidth() ||
-		mouse_pos.mY > mWindowRect.getHeight())
+		mouse_pos.mX > mWindowRectRaw.getWidth() ||
+		mouse_pos.mY > mWindowRectRaw.getHeight())
 	{
 		mMouseInWindow = FALSE;
 	}
@@ -2905,7 +2905,7 @@ void LLViewerWindow::updateWorldViewRect(bool use_full_window)
 	if (!LLSideTray::instanceCreated()) return;
 
 	// start off using whole window to render world
-	LLRect new_world_rect = mWindowRect;
+	LLRect new_world_rect = mWindowRectRaw;
 
 	if (use_full_window == false)
 	{
@@ -2928,14 +2928,14 @@ void LLViewerWindow::updateWorldViewRect(bool use_full_window)
 		}
 	}
 
-	if (mWorldViewRect != new_world_rect)
+	if (mWorldViewRectRaw != new_world_rect)
 	{
 		// sending a signal with a new WorldView rect
-		mOnWorldViewRectUpdated(mWorldViewRect, new_world_rect);
+		mOnWorldViewRectUpdated(mWorldViewRectRaw, new_world_rect);
 
-		mWorldViewRect = new_world_rect;
+		mWorldViewRectRaw = new_world_rect;
 		gResizeScreenTexture = TRUE;
-		LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRect.getHeight() );
+		LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRectRaw.getHeight() );
 		LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() );
 	}
 }
@@ -2948,9 +2948,9 @@ void LLViewerWindow::saveLastMouse(const LLCoordGL &point)
 	{
 		mCurrentMousePoint.mX = 0;
 	}
-	else if (point.mX > getWindowWidth())
+	else if (point.mX > getWindowWidthScaled())
 	{
-		mCurrentMousePoint.mX = getWindowWidth();
+		mCurrentMousePoint.mX = getWindowWidthScaled();
 	}
 	else
 	{
@@ -2961,9 +2961,9 @@ void LLViewerWindow::saveLastMouse(const LLCoordGL &point)
 	{
 		mCurrentMousePoint.mY = 0;
 	}
-	else if (point.mY > getWindowHeight() )
+	else if (point.mY > getWindowHeightScaled() )
 	{
-		mCurrentMousePoint.mY = getWindowHeight();
+		mCurrentMousePoint.mY = getWindowHeightScaled();
 	}
 	else
 	{
@@ -3208,10 +3208,10 @@ void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback
 	{
 		mPickScreenRegion.setCenterAndSize(x, y_from_bot, PICK_DIAMETER, PICK_DIAMETER);
 
-		if (mPickScreenRegion.mLeft < mWorldViewRect.mLeft) mPickScreenRegion.translate(mWorldViewRect.mLeft - mPickScreenRegion.mLeft, 0);
-		if (mPickScreenRegion.mBottom < mWorldViewRect.mBottom) mPickScreenRegion.translate(0, mWorldViewRect.mBottom - mPickScreenRegion.mBottom);
-		if (mPickScreenRegion.mRight > mWorldViewRect.mRight ) mPickScreenRegion.translate(mWorldViewRect.mRight - mPickScreenRegion.mRight, 0);
-		if (mPickScreenRegion.mTop > mWorldViewRect.mTop ) mPickScreenRegion.translate(0, mWorldViewRect.mTop - mPickScreenRegion.mTop);
+		if (mPickScreenRegion.mLeft < mWorldViewRectRaw.mLeft) mPickScreenRegion.translate(mWorldViewRectRaw.mLeft - mPickScreenRegion.mLeft, 0);
+		if (mPickScreenRegion.mBottom < mWorldViewRectRaw.mBottom) mPickScreenRegion.translate(0, mWorldViewRectRaw.mBottom - mPickScreenRegion.mBottom);
+		if (mPickScreenRegion.mRight > mWorldViewRectRaw.mRight ) mPickScreenRegion.translate(mWorldViewRectRaw.mRight - mPickScreenRegion.mRight, 0);
+		if (mPickScreenRegion.mTop > mWorldViewRectRaw.mTop ) mPickScreenRegion.translate(0, mWorldViewRectRaw.mTop - mPickScreenRegion.mTop);
 	}
 
 	// set frame buffer region for picking results
@@ -3417,11 +3417,11 @@ LLVector3 LLViewerWindow::mouseDirectionGlobal(const S32 x, const S32 y) const
 	F32			fov = LLViewerCamera::getInstance()->getView();
 
 	// find world view center in scaled ui coordinates
-	F32			center_x = (F32)getWorldViewRect().getCenterX() / mDisplayScale.mV[VX];
-	F32			center_y = (F32)getWorldViewRect().getCenterY() / mDisplayScale.mV[VY];
+	F32			center_x = (F32)getWorldViewRectRaw().getCenterX() / mDisplayScale.mV[VX];
+	F32			center_y = (F32)getWorldViewRectRaw().getCenterY() / mDisplayScale.mV[VY];
 
 	// calculate pixel distance to screen
-	F32			distance = ((F32)getWorldViewHeight() / (mDisplayScale.mV[VY] * 2.f)) / (tan(fov / 2.f));
+	F32			distance = ((F32)getWorldViewHeightRaw() / (mDisplayScale.mV[VY] * 2.f)) / (tan(fov / 2.f));
 
 	// calculate click point relative to middle of screen
 	F32			click_x = x - center_x;
@@ -3440,11 +3440,11 @@ LLVector3 LLViewerWindow::mouseDirectionGlobal(const S32 x, const S32 y) const
 LLVector3 LLViewerWindow::mousePointHUD(const S32 x, const S32 y) const
 {
 	// find screen resolution
-	S32			height = llround((F32)getWorldViewHeight() / mDisplayScale.mV[VY]);
+	S32			height = llround((F32)getWorldViewHeightRaw() / mDisplayScale.mV[VY]);
 
 	// find world view center
-	F32			center_x = (F32)getWorldViewRect().getCenterX() / mDisplayScale.mV[VX];
-	F32			center_y = (F32)getWorldViewRect().getCenterY() / mDisplayScale.mV[VY];
+	F32			center_x = (F32)getWorldViewRectRaw().getCenterX() / mDisplayScale.mV[VX];
+	F32			center_y = (F32)getWorldViewRectRaw().getCenterY() / mDisplayScale.mV[VY];
 
 	// remap with uniform scale (1/height) so that top is -0.5, bottom is +0.5
 	F32 hud_x = -((F32)x - center_x)  / height;
@@ -3462,12 +3462,12 @@ LLVector3 LLViewerWindow::mouseDirectionCamera(const S32 x, const S32 y) const
 	F32			fov_width = fov_height * LLViewerCamera::getInstance()->getAspect();
 
 	// find screen resolution
-	S32			height = llround((F32)getWorldViewHeight() / mDisplayScale.mV[VY]);
-	S32			width = llround((F32)getWorldViewWidth() / mDisplayScale.mV[VX]);
+	S32			height = llround((F32)getWorldViewHeightRaw() / mDisplayScale.mV[VY]);
+	S32			width = llround((F32)getWorldViewWidthRaw() / mDisplayScale.mV[VX]);
 
 	// find world view center
-	F32			center_x = (F32)getWorldViewRect().getCenterX() / mDisplayScale.mV[VX];
-	F32			center_y = (F32)getWorldViewRect().getCenterY() / mDisplayScale.mV[VY];
+	F32			center_x = (F32)getWorldViewRectRaw().getCenterX() / mDisplayScale.mV[VX];
+	F32			center_y = (F32)getWorldViewRectRaw().getCenterY() / mDisplayScale.mV[VY];
 
 	// calculate click point relative to middle of screen
 	F32			click_x = (((F32)x - center_x) / (F32)width) * fov_width * -1.f;
@@ -3707,8 +3707,8 @@ void LLViewerWindow::movieSize(S32 new_width, S32 new_height)
 		||(size.mY != new_height + BORDERHEIGHT))
 	{
 		// use actual display dimensions, not virtual UI dimensions
-		S32 x = gViewerWindow->getWindowDisplayWidth();
-		S32 y = gViewerWindow->getWindowDisplayHeight();
+		S32 x = gViewerWindow->getWindowWidthRaw();
+		S32 y = gViewerWindow->getWindowHeightRaw();
 		BORDERWIDTH = size.mX - x;
 		BORDERHEIGHT = size.mY- y;
 		LLCoordScreen new_size(new_width + BORDERWIDTH, 
@@ -3806,9 +3806,9 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p
 	S32 w = preview_width ;
 	S32 h = preview_height ;
 	LLVector2 display_scale = mDisplayScale ;
-	mDisplayScale.setVec((F32)w / mWindowRect.getWidth(), (F32)h / mWindowRect.getHeight()) ;
-	LLRect window_rect = mWindowRect;
-	mWindowRect.set(0, h, w, 0);
+	mDisplayScale.setVec((F32)w / mWindowRectRaw.getWidth(), (F32)h / mWindowRectRaw.getHeight()) ;
+	LLRect window_rect = mWindowRectRaw;
+	mWindowRectRaw.set(0, h, w, 0);
 	
 	gDisplaySwapBuffers = FALSE;
 	gDepthDirty = TRUE;
@@ -3820,7 +3820,7 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p
 	LLHUDText::setDisplayText(FALSE) ;
 	if (type == SNAPSHOT_TYPE_OBJECT_ID)
 	{
-		gObjectList.renderPickList(gViewerWindow->getVirtualWindowRect(), FALSE, FALSE);
+		gObjectList.renderPickList(gViewerWindow->getWindowRectScaled(), FALSE, FALSE);
 	}
 	else
 	{
@@ -3873,7 +3873,7 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p
 	LLFontGL::setFontDisplay(TRUE) ;
 	LLHUDText::setDisplayText(TRUE) ;
 	mDisplayScale.setVec(display_scale) ;
-	mWindowRect = window_rect;	
+	mWindowRectRaw = window_rect;	
 	setup3DRender();
 	gDisplaySwapBuffers = FALSE;
 	gDepthDirty = TRUE;
@@ -3941,12 +3941,12 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
 	// Copy screen to a buffer
 	// crop sides or top and bottom, if taking a snapshot of different aspect ratio
 	// from window
-	S32 snapshot_width = mWindowRect.getWidth();
-	S32 snapshot_height =  mWindowRect.getHeight();
+	S32 snapshot_width = mWindowRectRaw.getWidth();
+	S32 snapshot_height =  mWindowRectRaw.getHeight();
 	// SNAPSHOT
-	S32 window_width = mWindowRect.getWidth();
-	S32 window_height = mWindowRect.getHeight();	
-	LLRect window_rect = mWindowRect;
+	S32 window_width = mWindowRectRaw.getWidth();
+	S32 window_height = mWindowRectRaw.getHeight();	
+	LLRect window_rect = mWindowRectRaw;
 	BOOL use_fbo = FALSE;
 
 	LLRenderTarget target;
@@ -3977,7 +3977,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
 					window_width = snapshot_width;
 					window_height = snapshot_height;
 					scale_factor = 1.f;
-					mWindowRect.set(0, snapshot_height, snapshot_width, 0);
+					mWindowRectRaw.set(0, snapshot_height, snapshot_width, 0);
 					target.bindTarget();			
 				}
 			}
@@ -4045,7 +4045,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
 
 				LLViewerCamera::getInstance()->setZoomParameters(scale_factor, subimage_x+(subimage_y*llceil(scale_factor)));
 				setup3DRender();
-				gObjectList.renderPickList(gViewerWindow->getVirtualWindowRect(), FALSE, FALSE);
+				gObjectList.renderPickList(gViewerWindow->getWindowRectScaled(), FALSE, FALSE);
 			}
 			else
 			{
@@ -4124,7 +4124,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
 
 	if (use_fbo)
 	{
-		mWindowRect = window_rect;
+		mWindowRectRaw = window_rect;
 		target.flush();
 		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
 	}
@@ -4205,23 +4205,13 @@ void LLViewerWindow::drawMouselookInstructions()
 
 	font->renderUTF8( 
 		instructions, 0,
-		getVirtualWorldViewRect().getCenterX(),
-		getVirtualWorldViewRect().mBottom + INSTRUCTIONS_PAD,
+		getWorldViewRectScaled().getCenterX(),
+		getWorldViewRectScaled().mBottom + INSTRUCTIONS_PAD,
 		LLColor4( 1.0f, 1.0f, 1.0f, 0.5f ),
 		LLFontGL::HCENTER, LLFontGL::TOP,
 		LLFontGL::NORMAL,LLFontGL::DROP_SHADOW);
 }
 
-S32	LLViewerWindow::getWindowHeight()	const 	
-{ 
-	return mVirtualWindowRect.getHeight(); 
-}
-
-S32	LLViewerWindow::getWindowWidth() const 	
-{ 
-	return mVirtualWindowRect.getWidth(); 
-}
-
 void* LLViewerWindow::getPlatformWindow() const
 {
 	return mWindow->getPlatformWindow();
@@ -4242,9 +4232,9 @@ LLRootView*	LLViewerWindow::getRootView() const
 	return mRootView;
 }
 
-LLRect LLViewerWindow::getVirtualWorldViewRect() const
+LLRect LLViewerWindow::getWorldViewRectScaled() const
 {
-	LLRect world_view_rect = mWorldViewRect;
+	LLRect world_view_rect = mWorldViewRectRaw;
 	world_view_rect.mLeft = llround((F32)world_view_rect.mLeft / mDisplayScale.mV[VX]);
 	world_view_rect.mRight = llround((F32)world_view_rect.mRight / mDisplayScale.mV[VX]);
 	world_view_rect.mBottom = llround((F32)world_view_rect.mBottom / mDisplayScale.mV[VY]);
@@ -4252,39 +4242,49 @@ LLRect LLViewerWindow::getVirtualWorldViewRect() const
 	return world_view_rect;
 }
 
-S32 LLViewerWindow::getWorldViewHeight() const
+S32 LLViewerWindow::getWorldViewHeightRaw() const
 {
-	return mWorldViewRect.getHeight(); 
+	return mWorldViewRectRaw.getHeight(); 
 }
 
-S32 LLViewerWindow::getWorldViewWidth() const
+S32 LLViewerWindow::getWorldViewWidthRaw() const
 {
-	return mWorldViewRect.getWidth(); 
+	return mWorldViewRectRaw.getWidth(); 
+}
+
+S32	LLViewerWindow::getWindowHeightScaled()	const 	
+{ 
+	return mWindowRectScaled.getHeight(); 
+}
+
+S32	LLViewerWindow::getWindowWidthScaled() const 	
+{ 
+	return mWindowRectScaled.getWidth(); 
 }
 
-S32	LLViewerWindow::getWindowDisplayHeight()	const 	
+S32	LLViewerWindow::getWindowHeightRaw()	const 	
 { 
-	return mWindowRect.getHeight(); 
+	return mWindowRectRaw.getHeight(); 
 }
 
-S32	LLViewerWindow::getWindowDisplayWidth() const 	
+S32	LLViewerWindow::getWindowWidthRaw() const 	
 { 
-	return mWindowRect.getWidth(); 
+	return mWindowRectRaw.getWidth(); 
 }
 
 void LLViewerWindow::setup2DRender()
 {
 	// setup ortho camera
-	gl_state_for_2d(mWindowRect.getWidth(), mWindowRect.getHeight());
+	gl_state_for_2d(mWindowRectRaw.getWidth(), mWindowRectRaw.getHeight());
 	setup2DViewport();
 }
 
 void LLViewerWindow::setup2DViewport(S32 x_offset, S32 y_offset)
 {
-	gGLViewport[0] = mWindowRect.mLeft + x_offset;
-	gGLViewport[1] = mWindowRect.mBottom + y_offset;
-	gGLViewport[2] = mWindowRect.getWidth();
-	gGLViewport[3] = mWindowRect.getHeight();
+	gGLViewport[0] = mWindowRectRaw.mLeft + x_offset;
+	gGLViewport[1] = mWindowRectRaw.mBottom + y_offset;
+	gGLViewport[2] = mWindowRectRaw.getWidth();
+	gGLViewport[3] = mWindowRectRaw.getHeight();
 	glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
 }
 
@@ -4292,7 +4292,7 @@ void LLViewerWindow::setup2DViewport(S32 x_offset, S32 y_offset)
 void LLViewerWindow::setup3DRender()
 {
 	// setup perspective camera
-	LLViewerCamera::getInstance()->setPerspective(NOT_FOR_SELECTION, mWorldViewRect.mLeft, mWorldViewRect.mBottom,  mWorldViewRect.getWidth(), mWorldViewRect.getHeight(), FALSE, LLViewerCamera::getInstance()->getNear(), MAX_FAR_CLIP*2.f);
+	LLViewerCamera::getInstance()->setPerspective(NOT_FOR_SELECTION, mWorldViewRectRaw.mLeft, mWorldViewRectRaw.mBottom,  mWorldViewRectRaw.getWidth(), mWorldViewRectRaw.getHeight(), FALSE, LLViewerCamera::getInstance()->getNear(), MAX_FAR_CLIP*2.f);
 	setup3DViewport();
 }
 
@@ -4300,17 +4300,17 @@ void LLViewerWindow::setup3DViewport(S32 x_offset, S32 y_offset)
 {
 	if (LLRenderTarget::getCurrentBoundTarget() != NULL)
 	{
-		// don't use translation component of mWorldViewRect, as we are already in a properly sized render target
+		// don't use translation component of mWorldViewRectRaw, as we are already in a properly sized render target
 		gGLViewport[0] = x_offset;
 		gGLViewport[1] = y_offset;
 	}
 	else
 	{
-		gGLViewport[0] = mWorldViewRect.mLeft + x_offset;
-		gGLViewport[1] = mWorldViewRect.mBottom + y_offset;
+		gGLViewport[0] = mWorldViewRectRaw.mLeft + x_offset;
+		gGLViewport[1] = mWorldViewRectRaw.mBottom + y_offset;
 	}
-	gGLViewport[2] = mWorldViewRect.getWidth();
-	gGLViewport[3] = mWorldViewRect.getHeight();
+	gGLViewport[2] = mWorldViewRectRaw.getWidth();
+	gGLViewport[3] = mWorldViewRectRaw.getHeight();
 	glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
 }
 
@@ -4521,8 +4521,8 @@ void LLViewerWindow::getTargetWindow(BOOL& fullscreen, S32& width, S32& height)
 	if (mWindow
 	&&  mWindow->getFullscreen() == mWantFullscreen)
 	{
-		width = getWindowDisplayWidth();
-		height = getWindowDisplayHeight();
+		width = getWindowWidthRaw();
+		height = getWindowHeightRaw();
 	}
 	else if (mWantFullscreen)
 	{
@@ -4569,7 +4569,7 @@ BOOL LLViewerWindow::checkSettings()
 			getWindow()->setNativeAspectRatio(gSavedSettings.getF32("FullScreenAspectRatio"));
 		}
 		
-		reshape(getWindowDisplayWidth(), getWindowDisplayHeight());
+		reshape(getWindowWidthRaw(), getWindowHeightRaw());
 
 		// force aspect ratio
 		if (mIsFullscreenChecked)
@@ -4795,8 +4795,8 @@ F32 LLViewerWindow::getDisplayAspectRatio() const
 
 F32	LLViewerWindow::getWorldViewAspectRatio() const
 {
-	F32 world_aspect = (F32)mWorldViewRect.getWidth() / (F32)mWorldViewRect.getHeight();
-	//F32 window_aspect = (F32)mWindowRect.getWidth() / (F32)mWindowRect.getHeight();
+	F32 world_aspect = (F32)mWorldViewRectRaw.getWidth() / (F32)mWorldViewRectRaw.getHeight();
+	//F32 window_aspect = (F32)mWindowRectRaw.getWidth() / (F32)mWindowRectRaw.getHeight();
 	if (mWindow->getFullscreen())
 	{
 		return world_aspect * mWindow->getPixelAspectRatio();
@@ -4813,7 +4813,7 @@ void LLViewerWindow::calcDisplayScale()
 	F32 ui_scale_factor = gSavedSettings.getF32("UIScaleFactor");
 	LLVector2 display_scale;
 	display_scale.setVec(llmax(1.f / mWindow->getPixelAspectRatio(), 1.f), llmax(mWindow->getPixelAspectRatio(), 1.f));
-	F32 height_normalization = gSavedSettings.getBOOL("UIAutoScale") ? ((F32)mWindowRect.getHeight() / display_scale.mV[VY]) / 768.f : 1.f;
+	F32 height_normalization = gSavedSettings.getBOOL("UIAutoScale") ? ((F32)mWindowRectRaw.getHeight() / display_scale.mV[VY]) / 768.f : 1.f;
 	if(mWindow->getFullscreen())
 	{
 		display_scale *= (ui_scale_factor * height_normalization);
@@ -4831,8 +4831,8 @@ void LLViewerWindow::calcDisplayScale()
 
 	if (mWindow->getFullscreen())
 	{
-		display_scale.mV[0] = llround(display_scale.mV[0], 2.0f/(F32) mWindowRect.getWidth());
-		display_scale.mV[1] = llround(display_scale.mV[1], 2.0f/(F32) mWindowRect.getHeight());
+		display_scale.mV[0] = llround(display_scale.mV[0], 2.0f/(F32) mWindowRectRaw.getWidth());
+		display_scale.mV[1] = llround(display_scale.mV[1], 2.0f/(F32) mWindowRectRaw.getHeight());
 	}
 	
 	if (display_scale != mDisplayScale)
@@ -4857,7 +4857,7 @@ S32 LLViewerWindow::getChatConsoleBottomPad()
 
 LLRect LLViewerWindow::getChatConsoleRect()
 {
-	LLRect full_window(0, getWindowHeight(), getWindowWidth(), 0);
+	LLRect full_window(0, getWindowHeightScaled(), getWindowWidthScaled(), 0);
 	LLRect console_rect = full_window;
 
 	const S32 CONSOLE_PADDING_TOP = 24;
@@ -4879,7 +4879,7 @@ LLRect LLViewerWindow::getChatConsoleRect()
 	{
 		// Make console rect somewhat narrow so having inventory open is
 		// less of a problem.
-		console_rect.mRight  = console_rect.mLeft + 2 * getWindowWidth() / 3;
+		console_rect.mRight  = console_rect.mLeft + 2 * getWindowWidthScaled() / 3;
 	}
 
 	return console_rect;
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index b7f2b91c525..58a4729a5ab 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -210,22 +210,23 @@ class LLViewerWindow : public LLWindowCallbacks
 	//
 	LLRootView*			getRootView()		const;
 
+	// 3D world area in scaled pixels (via UI scale), use for most UI computations
+	LLRect			getWorldViewRectScaled() const;
+
+	// 3D world area, in raw unscaled pixels
+	LLRect			getWorldViewRectRaw() const		{ return mWorldViewRectRaw; }
+	S32 			getWorldViewHeightRaw() const;
+	S32 			getWorldViewWidthRaw() const;
+
+	// Window in scaled pixels (via UI scale), use for most UI computations
+	LLRect			getWindowRectScaled() const		{ return mWindowRectScaled; }
+	S32				getWindowHeightScaled() const;
+	S32				getWindowWidthScaled() const;
+
 	// Window in raw pixels as seen on screen.
-	const LLRect&	getWindowRect()		const	{ return mWindowRect; };
-	// portion of window that shows 3d world, in raw unscaled pixels
-	const LLRect&	getWorldViewRect()		const	{ return mWorldViewRect; };
-	// Use this rect for most UI computations, it accounts for UI size scaling
-	LLRect			getVirtualWorldViewRect()	const;
-	S32 			getWorldViewHeight() const;
-	S32 			getWorldViewWidth() const;
-	S32				getWindowDisplayHeight()	const;
-	S32				getWindowDisplayWidth()	const;
-
-	// Window in scaled pixels (via UI scale), use this for
-	// UI elements checking size.
-	const LLRect&	getVirtualWindowRect()		const	{ return mVirtualWindowRect; };
-	S32				getWindowHeight()	const;
-	S32				getWindowWidth()	const;
+	LLRect			getWindowRectRaw() const		{ return mWindowRectRaw; }
+	S32				getWindowHeightRaw() const;
+	S32				getWindowWidthRaw() const;
 
 	LLWindow*		getWindow()			const	{ return mWindow; }
 	void*			getPlatformWindow() const;
@@ -411,10 +412,11 @@ class LLViewerWindow : public LLWindowCallbacks
 	BOOL			mActive;
 	BOOL			mWantFullscreen;
 	BOOL			mShowFullscreenProgress;
-	LLRect			mWindowRect;
-	LLRect			mVirtualWindowRect;
-	LLRect			mWorldViewRect;					// specifies area of screen where we render the 3D world
-	LLRootView*		mRootView;					// a view of size mWindowRect, containing all child views
+
+	LLRect			mWindowRectRaw;				// whole window, including UI
+	LLRect			mWindowRectScaled;			// whole window, scaled by UI size
+	LLRect			mWorldViewRectRaw;			// area of screen for 3D world
+	LLRootView*		mRootView;					// a view of size mWindowRectRaw, containing all child views
 	LLVector2		mDisplayScale;
 
 	LLCoordGL		mCurrentMousePoint;			// last mouse position in GL coords
diff --git a/indra/newview/llviewerwindowlistener.cpp b/indra/newview/llviewerwindowlistener.cpp
index 317e361c804..a890b042ae0 100644
--- a/indra/newview/llviewerwindowlistener.cpp
+++ b/indra/newview/llviewerwindowlistener.cpp
@@ -50,8 +50,8 @@ void LLViewerWindowListener::saveSnapshot(const LLSD& event) const
 #undef  tp
     // Our add() call should ensure that the incoming LLSD does in fact
     // contain our required arguments. Deal with the optional ones.
-    S32 width (mViewerWindow->getWindowDisplayWidth());
-    S32 height(mViewerWindow->getWindowDisplayHeight());
+    S32 width (mViewerWindow->getWindowWidthRaw());
+    S32 height(mViewerWindow->getWindowHeightRaw());
     if (event.has("width"))
         width = event["width"].asInteger();
     if (event.has("height"))
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 2daaf777728..3ec23f4cb2a 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -510,8 +510,8 @@ void LLPipeline::resizeScreenTexture()
 {
 	if (gPipeline.canUseVertexShaders() && assertInitialized())
 	{
-		GLuint resX = gViewerWindow->getWorldViewWidth();
-		GLuint resY = gViewerWindow->getWorldViewHeight();
+		GLuint resX = gViewerWindow->getWorldViewWidthRaw();
+		GLuint resY = gViewerWindow->getWorldViewHeightRaw();
 	
 		allocateScreenBuffer(resX,resY);
 
@@ -696,8 +696,8 @@ void LLPipeline::createGLBuffers()
 
 	stop_glerror();
 
-	GLuint resX = gViewerWindow->getWorldViewWidth();
-	GLuint resY = gViewerWindow->getWorldViewHeight();
+	GLuint resX = gViewerWindow->getWorldViewWidthRaw();
+	GLuint resY = gViewerWindow->getWorldViewHeightRaw();
 	
 	if (LLPipeline::sRenderGlow)
 	{ //screen space glow buffers
@@ -3049,7 +3049,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
 	if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PICKING))
 	{
 		LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderForSelect");
-		gObjectList.renderObjectsForSelect(camera, gViewerWindow->getVirtualWindowRect());
+		gObjectList.renderObjectsForSelect(camera, gViewerWindow->getWindowRectScaled());
 	}
 	else
 	{
@@ -5530,8 +5530,8 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
 	U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor");
 
 	LLVector2 tc1(0,0);
-	LLVector2 tc2((F32) gViewerWindow->getWorldViewWidth()*2,
-				  (F32) gViewerWindow->getWorldViewHeight()*2);
+	LLVector2 tc2((F32) gViewerWindow->getWorldViewWidthRaw()*2,
+				  (F32) gViewerWindow->getWorldViewHeightRaw()*2);
 
 	if (res_mod > 1)
 	{
@@ -5731,14 +5731,14 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
 		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
 	}
 
-	gGLViewport[0] = gViewerWindow->getWorldViewRect().mLeft;
-	gGLViewport[1] = gViewerWindow->getWorldViewRect().mBottom;
-	gGLViewport[2] = gViewerWindow->getWorldViewRect().getWidth();
-	gGLViewport[3] = gViewerWindow->getWorldViewRect().getHeight();
+	gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
+	gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
+	gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
+	gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
 	glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
 
-	tc2.setVec((F32) gViewerWindow->getWorldViewWidth(),
-			(F32) gViewerWindow->getWorldViewHeight());
+	tc2.setVec((F32) gViewerWindow->getWorldViewWidthRaw(),
+			(F32) gViewerWindow->getWorldViewHeightRaw());
 
 	gGL.flush();
 	
@@ -8742,7 +8742,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
 	glClearStencil(0);
 
 	// get the number of pixels per angle
-	F32 pa = gViewerWindow->getWindowDisplayHeight() / (RAD_TO_DEG * LLViewerCamera::getInstance()->getView());
+	F32 pa = gViewerWindow->getWindowHeightRaw() / (RAD_TO_DEG * LLViewerCamera::getInstance()->getView());
 
 	//get resolution based on angle width and height of impostor (double desired resolution to prevent aliasing)
 	U32 resY = llmin(nhpo2((U32) (fov*pa)), (U32) 512);
-- 
GitLab


From 6c997043924216405057c9ca6927ec5c026ad5ee Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Tue, 10 Nov 2009 14:40:22 -0800
Subject: [PATCH 068/557] Add newline at end of file

---
 indra/llui/lluictrlfactory.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp
index 8ab015f2bb8..adfbb41feb5 100644
--- a/indra/llui/lluictrlfactory.cpp
+++ b/indra/llui/lluictrlfactory.cpp
@@ -454,4 +454,4 @@ const std::string* LLUICtrlFactory::getWidgetTag(const std::type_info* widget_ty
 void LLUICtrlFactory::connect(LLView* parent, LLView* child)
 {
 	parent->addChild(child);
-}
\ No newline at end of file
+}
-- 
GitLab


From ae9c4e3ae9e76358e30c1b0c7a5d5f4fa35e66b8 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Tue, 10 Nov 2009 17:41:54 -0500
Subject: [PATCH 069/557] Minor comment cleanup for llagentwearables.cpp.

---
 indra/newview/llagentwearables.cpp | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 3fc1055acdf..41807ceca03 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -887,9 +887,8 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
 			lldebugs << "       " << LLWearableDictionary::getTypeLabel(type) << llendl;
 		}
 		
-		// What we do here is get the complete information on the items in
-		// the inventory, and set up an observer that will wait for that to
-		// happen.
+		// Get the complete information on the items in the inventory and set up an observer
+		// that will trigger when the complete information is fetched.
 		LLInventoryFetchDescendentsObserver::folder_ref_t folders;
 		folders.push_back(current_outfit_id);
 		outfit->fetchDescendents(folders);
-- 
GitLab


From 02943eca33a2cb5be39025557ca6e7aca30ea93a Mon Sep 17 00:00:00 2001
From: Lis Pardi <lis@lindenlab.com>
Date: Tue, 10 Nov 2009 17:55:24 -0500
Subject: [PATCH 070/557] EXT-2356 Replace Log button in bottom tray with up
 arrow

---
 .../skins/default/xui/en/panel_nearby_chat_bar.xml        | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
index 7128c200380..a12797d96b9 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
@@ -43,11 +43,13 @@
     <button
      follows="right"
      is_toggle="true"
-     width="45"
+     width="20"
      top="0"
      layout="topleft"
-     left_pad="8"
-     label="Log"
+     left_pad="4           "
+     image_disabled="ComboButton_UpOff"
+     image_unselected="ComboButton_UpOff"
+     image_selected="ComboButton_UpSelected"
      height="23"
      name="show_nearby_chat"
      tool_tip="Shows/hides nearby chat log">
-- 
GitLab


From 859c9f25655fc6ce79612d739a30e345a0521062 Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Tue, 10 Nov 2009 14:57:41 -0800
Subject: [PATCH 071/557] Restore "Show Advanced Permissions"

---
 .../skins/default/xui/en/menu_viewer.xml      | 22 +++++++++----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 1499095bcc7..e98a6d57bbb 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -843,18 +843,18 @@
                 <menu_item_call.on_click
                  function="Floater.Toggle"
                  parameter="perm_prefs" />
-         <menu_item_check
-         label="Show Advanced Permissions"
-         layout="topleft"
-         name="DebugPermissions">
-            <menu_item_check.on_check
-             function="CheckControl"
-             parameter="DebugPermissions" />
-            <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="DebugPermissions" />
-        </menu_item_check>
             </menu_item_call>
+			<menu_item_check
+			   label="Show Advanced Permissions"
+			   layout="topleft"
+			   name="DebugPermissions">
+			  <menu_item_check.on_check
+				 function="CheckControl"
+				 parameter="DebugPermissions" />
+			  <menu_item_check.on_click
+				 function="ToggleControl"
+				 parameter="DebugPermissions" />
+			</menu_item_check>
             <!--menu_item_call
              label="Show Script Warning/Error Window"
              layout="topleft"
-- 
GitLab


From 26d848e91ec566aad890c8d59afafd8a05567d85 Mon Sep 17 00:00:00 2001
From: Erica <erica@lindenlab.com>
Date: Tue, 10 Nov 2009 15:00:19 -0800
Subject: [PATCH 072/557] EXT-2336 add new media art to viewer

---
 .../default/textures/icons/AudioMute_Off.png      | Bin 0 -> 600 bytes
 .../default/textures/icons/AudioMute_Over.png     | Bin 0 -> 587 bytes
 .../skins/default/textures/icons/Audio_Off.png    | Bin 0 -> 467 bytes
 .../skins/default/textures/icons/Audio_Press.png  | Bin 0 -> 477 bytes
 .../textures/icons/ExternalBrowser_Off.png        | Bin 0 -> 279 bytes
 .../skins/default/textures/icons/Pause_Off.png    | Bin 0 -> 163 bytes
 .../skins/default/textures/icons/Pause_Over.png   | Bin 0 -> 160 bytes
 .../skins/default/textures/icons/Pause_Press.png  | Bin 0 -> 156 bytes
 .../skins/default/textures/icons/Play_Off.png     | Bin 0 -> 293 bytes
 .../skins/default/textures/icons/Play_Over.png    | Bin 0 -> 258 bytes
 .../skins/default/textures/icons/Play_Press.png   | Bin 0 -> 287 bytes
 .../default/textures/icons/SkipBackward_Off.png   | Bin 0 -> 293 bytes
 .../default/textures/icons/SkipForward_Off.png    | Bin 0 -> 304 bytes
 .../default/textures/icons/StopReload_Off.png     | Bin 0 -> 533 bytes
 .../default/textures/icons/StopReload_Over.png    | Bin 0 -> 529 bytes
 .../skins/default/textures/icons/Zoom_Off.png     | Bin 0 -> 435 bytes
 .../default/textures/icons/parcel_color_EVRY.png  | Bin 0 -> 393 bytes
 .../default/textures/icons/parcel_color_EXP.png   | Bin 0 -> 272 bytes
 .../default/textures/icons/parcel_color_M.png     | Bin 0 -> 306 bytes
 .../skins/default/textures/navbar/Flag.png        | Bin 0 -> 338 bytes
 .../skins/default/textures/navbar/Lock.png        | Bin 0 -> 302 bytes
 21 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 indra/newview/skins/default/textures/icons/AudioMute_Off.png
 create mode 100644 indra/newview/skins/default/textures/icons/AudioMute_Over.png
 create mode 100644 indra/newview/skins/default/textures/icons/Audio_Off.png
 create mode 100644 indra/newview/skins/default/textures/icons/Audio_Press.png
 create mode 100644 indra/newview/skins/default/textures/icons/ExternalBrowser_Off.png
 create mode 100644 indra/newview/skins/default/textures/icons/Pause_Off.png
 create mode 100644 indra/newview/skins/default/textures/icons/Pause_Over.png
 create mode 100644 indra/newview/skins/default/textures/icons/Pause_Press.png
 create mode 100644 indra/newview/skins/default/textures/icons/Play_Off.png
 create mode 100644 indra/newview/skins/default/textures/icons/Play_Over.png
 create mode 100644 indra/newview/skins/default/textures/icons/Play_Press.png
 create mode 100644 indra/newview/skins/default/textures/icons/SkipBackward_Off.png
 create mode 100644 indra/newview/skins/default/textures/icons/SkipForward_Off.png
 create mode 100644 indra/newview/skins/default/textures/icons/StopReload_Off.png
 create mode 100644 indra/newview/skins/default/textures/icons/StopReload_Over.png
 create mode 100644 indra/newview/skins/default/textures/icons/Zoom_Off.png
 create mode 100644 indra/newview/skins/default/textures/icons/parcel_color_EVRY.png
 create mode 100644 indra/newview/skins/default/textures/icons/parcel_color_EXP.png
 create mode 100644 indra/newview/skins/default/textures/icons/parcel_color_M.png
 create mode 100644 indra/newview/skins/default/textures/navbar/Flag.png
 create mode 100644 indra/newview/skins/default/textures/navbar/Lock.png

diff --git a/indra/newview/skins/default/textures/icons/AudioMute_Off.png b/indra/newview/skins/default/textures/icons/AudioMute_Off.png
new file mode 100644
index 0000000000000000000000000000000000000000..938aaef491303fe1a5e1a65585c4f971c84a1d21
GIT binary patch
literal 600
zcmV-e0;m0nP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz`bk7VRCwB?Q%z{oU>JVBCN|kmY`VA>
zwTu=S6y0Gk6uJ#@I|=GQ=w0#9!@POhcGzw7C_4_soqE{lHW3<8q@|~V$Zn(HL1lwF
zx|rG4#@5fouOS^l8XWY6hlKa%d7t-tzmHg!g?`M3KFuZ|g!Dr4Tnru~B$+?oiTw|}
zNAXifnZ!O*3{fZch2bMZz1zG?kaQ`si_7J*cq<Y~-<PC&W2QL@O52~>?ZZr^^7=ES
z8!Y9k-NYFo@0OtJI=8;KI1w)vgBK`;7>{?D(LOi;<@rA^YPFYd4C5KAt@qr*`|a)U
z^+F*iv|9K+GJ+5D^N`bNjBaj1h(@_5!^4lK{QkS1Yt*yZ2ydFWm`dSNwTjDITX?6c
zAdE~|T?KDh`~y*Z<Vi4ebmVV@LKs|FfV{MX(D5;@?CjueE(Zhx_!$nHV;mRn<nqpG
z&$$jUF9?G5quGRE7#NtDfxNs7tgV4C5|t^7wpvsm<X2AxrBZ3`>g;SasA<UW?V-_V
zK%Ab2ys~1C6U$~HpPq88bM8#RzxFMYx#<(d!)vNaUY(qfKrCka2PP+RV}BoPZ%vVq
z=k7JS6(EsFU{_IY!{^JvG>7VnVpx>^mTI*@Hlt41y?Ll<MX#G^TPJ~$jI-aAq-l2?
mcY$Gp#VXxA((iNrE5HCIoawWH1J%9&0000<MNUMnLSTaHJRCs)

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/AudioMute_Over.png b/indra/newview/skins/default/textures/icons/AudioMute_Over.png
new file mode 100644
index 0000000000000000000000000000000000000000..7bd1b12aae62337ff22651320aef61acb324f302
GIT binary patch
literal 587
zcmV-R0<`^!P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz?MXyIRCwB?Q$c7GK@@$H-8N(Fnzd_E
z)KC+O5b#nc6w-o74@FQ5Lhg!(oQt=%hhB5^B&8tsQV*5ZmX>U&2SpG9BE9wE!Gt2A
zw5uf>T{jtb{ku&hLY5Zt;4wQh|G)X4_m{b@i(U{ykMIQ;W8IiNmqI`bS@#q;i*i8n
z>sDn7En~!F>#j`vOf=h%w*|5t75T}PN(JMIME<^_+#7bB7=&niX*3RARjb=yg;@4N
z{6|_X{MUzRns`1ti)68gJ|V!<X-^rA{e1{o{_~<%ds(!sr<7}Ub>U;7fDvNYw()&%
z5TB-|pyu<4t*juNOiE7%1|E;~_umb)vAVhn$#HNgm&28#BV1iu!&_YkBQb4p5wh#b
z4>*4mD8S2Q)Z=kPW@ezy%^`kxh-(`g*rlovjpFCfkTWbv>CQR$2X7zd9L;7EmSurY
zPC}iZM~p-gB%<%^z_xAC$Jp<#6_iRPc4K-Pmkk5&HaAhP*TE+ype`)<?WES%p`M&b
zWM9FH?=}ZGSX#O+MIzrublu%LK4#HW%0Is_I*MC+d!A*#IAhN`ZS1T7nM?+6H0?G*
zp#mJ|qN!<?D@0SN)gol)59%}f&@es(O`;DkfJAQ6XHGGUJFVmQ#AUjxw&Pf@zw=)K
Z1^~mh<|`#?TK)h4002ovPDHLkV1o6329E#$

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/Audio_Off.png b/indra/newview/skins/default/textures/icons/Audio_Off.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef746aab924c7da8e61199ecc3518d8c15b1946a
GIT binary patch
literal 467
zcmV;^0WAKBP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzbxA})RCwBA{Qv(y14V#D1Ehi20*JX`
zdYSMj4nY^#xpSxG#fuk{V`5^g2)Q5xD83)c<^*D8Am;k>=Z`N){P^+XlLQ3?`9XSF
zaA?kkajL4Slz|{*&z?Q|nVFflfBEvo+0f8XtFp3E4=8<@1>L#Gnn3`lP>6?z#~x@1
zFC!!4k^A@WuUAk|(AU(|)Q1~@t_c|cHJ^U__U#P|3k#iwh6Zk+3-0~+@#CAiy1EKT
zo{3Pf18x2O<jIpe?Ck7pW@cvW4<0=D{_WehFC0KXlmS4%{O;X5aJ0$G%m01!=n>1`
zzkiv4;6G6Y0R5{A#A-lIKeV*8zJC7vS(F<HSXfv-zzqO8(-DTz4LEk}n4O}cqV&(7
zKQ{p7{{Umcf{Tlb6Bur1ai#-MT*J}<kTwD0d>|GE#)J+q43+{7+X&>#f%W1_%18+b
z4z69hmI)I7`t@rD+;UR#0#L075LW=PD9ivxN^>I<1BCz}zyNMA%0t@n9Ap3h002ov
JPDHLkV1ifb(M$jU

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/Audio_Press.png b/indra/newview/skins/default/textures/icons/Audio_Press.png
new file mode 100644
index 0000000000000000000000000000000000000000..25a669224a841e29359f502a8ce004097ebb1017
GIT binary patch
literal 477
zcmV<30V4j1P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUze@R3^RCwBA{Qv(y14V#D1Ehi20*JX`
zdYSMj4nY@Kym+zdfddCD-QC@d2)Q5xDBb{Na{{q45Oe+d^~(e#zIpTJ96>=revn=k
z9GZ1toP>k~8C6wP$Nl^FUt(otJ^k+8JAEf7C+Yb3c#xszSkRq|tQiD)dwbc0goLEj
z)YMoQ85vJsx^(H3uC8t{5G%qBK-Yu}fSPYVefspJmzS4FR#q10hYufKeEIU_x1OG!
z2uPlZP_P4S{dN2H?blpfT+F7XrYv{w-u?aQ)2CnD+}tcg82|*#uU@?ZM;kCK{yu#8
zkmb*xKTOQb%>RipKuk<bTSG%b45;b1wYBvRU?2(#2nYbfll2SS0H8A)U>MziqeqX*
z1O3bW_3PKuK>2?xEG&9_e0(hb{{6d)GaZ298kP=#v@#HT0Wq(HgoM`R%a=>PfB#+q
z<comy;!4U$2?-949XsX&694$|qdVMkQt|>&tpN}R05KoT07go4BNGFK03g5sI}F8<
T)-aOP00000NkvXXu0mjfA!X8J

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/ExternalBrowser_Off.png b/indra/newview/skins/default/textures/icons/ExternalBrowser_Off.png
new file mode 100644
index 0000000000000000000000000000000000000000..69646ce473709df726453b1f221b968f79c3cdb9
GIT binary patch
literal 279
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*D5Xc6z!vhE&{2`t$$4J+o><XQR^rjwAmZ&UCq-%~!bBak)X>
zzV1y*dV2cdr4OE;pTEE1)4Lr{A`dJxF!FPq&d}y-<{^{esMXcm)05_~Gq`}cVcCB+
z&0}d+A%C<t-MG0qeR5-)!2zB`#-cP~F6ICq#;dIkyrIr!EmI6`^y}2UyR$R;*s)`m
zPxQGdD=V8W;Lg$TWY2D>(9&eHa59WB-l-|LZe|Q~z$G4G4cQ05z8>=m6^fLVjo1|q
ZFy#IZ(l-ds-vsmogQu&X%Q~loCIGl<X&wLo

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/Pause_Off.png b/indra/newview/skins/default/textures/icons/Pause_Off.png
new file mode 100644
index 0000000000000000000000000000000000000000..77f6be569dbe2e9376208c6d1901bfd5e1eac80e
GIT binary patch
literal 163
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*D5XTs>VJLn>}1{rUgjo>{e_v(f25liq<7CnT6s*EtHYbu-59
zW^=X`(|^-0^@Ky1Vbx9kRI8x7+>6<Iq#Q(<CD?7unOGzknhyz!Puso60B9hCr>mdK
II;Vst0Hymd{r~^~

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/Pause_Over.png b/indra/newview/skins/default/textures/icons/Pause_Over.png
new file mode 100644
index 0000000000000000000000000000000000000000..580808bf7eb488469301f6ec6c0b2b3f1c032668
GIT binary patch
literal 160
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*D5XoIG6|Ln>}1{rUgjo>{e_v(f25liq<7CnT6s*EtHYbu-59
zW^=X`)Bn>hb%aCQK_h9&E^#+r3DX8GHUqwjJQfZEhW10k;<jxq7C_S&JYD@<);T3K
F0Ra2ZFJb@y

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/Pause_Press.png b/indra/newview/skins/default/textures/icons/Pause_Press.png
new file mode 100644
index 0000000000000000000000000000000000000000..859db34cae57d51f19993e847d3b3736855739f8
GIT binary patch
literal 156
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*D5X>^xl@Ln>}1{rUgjo>{e_v(f25liq<7CnT6s*EtHYbu-59
zZd<_J&{g6vV}iuhJqB3^RxpMbHWVHxR(5D$WRR;A-(MD9?*=r9!PC{xWt~$(69CR`
BGJya9

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/Play_Off.png b/indra/newview/skins/default/textures/icons/Play_Off.png
new file mode 100644
index 0000000000000000000000000000000000000000..e594c1a4cb77b34eb8fa84065b804506e5cb2442
GIT binary patch
literal 293
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*D5Xj(fT|hE&{2`t$$4J+o><XQNZYWd=7lw_1fXhvP2N8}je(
zQ&C9eI<lr>E&~^{OvV3~mzSrnSiRa>F}h_P-+D%cn!mrkRxVn!Xq&@cnHxL`5*<=f
zQeEtPG9D(z#-CY=ST8({?BICuKPoD!D|%Z_=S-8#OZf`*++GQfJ=uRd9=X52{=cEI
zadYgizrVkqoik@nt;$m78PDqf|C43TigW1`cSw*H7QXC~VD+Q*T~ZQH1p5_>nRk}-
pgc~nxnc~({b&T<RF9RbRgW1_RCnb*EF9Ldr!PC{xWt~$(699-TbCdu8

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/Play_Over.png b/indra/newview/skins/default/textures/icons/Play_Over.png
new file mode 100644
index 0000000000000000000000000000000000000000..70ab94e8c23599c46e851874feddd4375b529a8f
GIT binary patch
literal 258
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*D5XmUy~2hE&{2`t$$4J+o><XQNZYWd=7lw_1fXhvO0qPgrw)
ze0g~}y7AI7hcjLNwtmbFKmKpczRo8hExlWD_Y@UohX)6n*_WrLq`YaYvOHnL!1C_y
z?($PNZ(7Q%h;NW#{@2*?{r!FWSMT5VtK4kZU;qDK<Hq_wKMd#U=r_#$`2N0|f~xO2
z#^Qz<Zye@$lvyz}dA112*)dyfP%SJe?O~oL&B(;VaIxX>{pP<sd_eayc)I$ztaD0e
F0sy${XK4Tc

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/Play_Press.png b/indra/newview/skins/default/textures/icons/Play_Press.png
new file mode 100644
index 0000000000000000000000000000000000000000..b52742c6da3ef4dea9c22ad20d80bcd41c06938a
GIT binary patch
literal 287
zcmV+)0pR|LP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUy!AV3xRCwBA{Qv(y10{fofkJ@O07gbe
zeIRB)$3z>jV#NwOAY}@~tazOO3IiOtVaJXg1u`-+_Q)2YtHT=x?(Xgat5>f!78De;
z0&+RX3PcMF3%)H|wwP&XXt)5m0_4QPe=931zMVUF>ZGKk7+?f8o^;RvBL4jO^Ph!<
z1swdJKYu>Q%geioBp1Lm|NZ;-CQ$PM40$5c%Q<Fd=54@q@CV(+#29cAsBt^FNg1zZ
lLJ7%*81;+;o*MxI3;<BRbeIv>$({fJ002ovPDHLkV1hc!Zpi=u

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/SkipBackward_Off.png b/indra/newview/skins/default/textures/icons/SkipBackward_Off.png
new file mode 100644
index 0000000000000000000000000000000000000000..8fc10e6583e2928dd19f26678832d317e1668482
GIT binary patch
literal 293
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*D5Xj(fT|hE&{2`t$$4J+o><XJZgU5hKrIhF>0U1O(hJHXmmQ
zQ!u-`J^#Lo%IR;;hK|fLu3Wu3*KfX^E%Oq_`HVUdbIvGgX=Uw7JlrP1%ggH;#2k3w
z%$YNv4>U4&9?3XnuwdD;V`-<S=^92wMJb$hIjY|!zG~H~D;AcPtqyPY*Z=>Qo|cxT
za+1~IZ1=yvzsq@!uw|tw-Q@1+>B*llV}?}YncS4+E(;X*H|&r;5#t^h#3p4lQ^Gmo
pgJ%;DquR9j6<2vG@>n<w7^ZKn5HDRRo&@v~gQu&X%Q~loCIDM2aQ^@R

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/SkipForward_Off.png b/indra/newview/skins/default/textures/icons/SkipForward_Off.png
new file mode 100644
index 0000000000000000000000000000000000000000..2892e3cfa92e314e37f2b63193cb79acb9455fdd
GIT binary patch
literal 304
zcmV-00nh%4P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUy(n&-?RCwBA{Qv(y10{fofl>f+0Wt=H
z5GaNLeSG>b3;^Q&APiHuZ{NO&K*|(|S;;a0#6Erc^bB=%bthymlVku0U%!5Ro~Wp(
zEl`L9*#M#gQA0yR@xXxtiDqVIo<ObuOq_+3@Yd4OQrxm-OU$H6lYRsFTR?)0SkeL5
z`HYN=jxaBP=)Zse{$pll2D|wC_wSoIIXU}CN(V5_|Ni|u2GqQW94~;tHYO&fi9px=
zg1MX&1J(gGP9`@gW7SNo3zh>l&%!0iIN-SvAiw}*&ZFsFrlG3<0000<MNUMnLSTYK
C#C!?>

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/StopReload_Off.png b/indra/newview/skins/default/textures/icons/StopReload_Off.png
new file mode 100644
index 0000000000000000000000000000000000000000..698569a540337429cd3c7c570167ee47b379f4e8
GIT binary patch
literal 533
zcmV+w0_y#VP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzw@E}nRCwCNQ$I)oaTNCI#H68f4uWVa
zu7;+-BtmKll1!pGsF0Q*XlZB*0^!Uhp|F2ommr=&7%ol;f<s5pYT)D_IP^RfPp(h!
zj;qrahaP+=?|t9<eZTj9M<|M78YG5H0|u%7AqaxT&jj!ReD&dv1JghO&fkAH$Y!%{
zQ55$>p^&@V$RPIn{jNfxu*>uOhL-Kjpo3Pcbqc(cN~Nb@FnEa4lwQm*%mKu#EX#>z
zvw5QGv<3hLcpHsIv|KJnSe8A8aI)hj5D0jS#UhIuheM9Q8&h?Jx&_QYb+iNGiX=%&
zJRaw9E!pGo%uy6&LA-%-39h8+emCegap5YPR;!g7M%3%|ip^$=q4WrzqF%l48bSJm
zNFGIuAmBzqE~AS7dIzN0Y@X*hZW~%_yWJKsG=U^ZOE?_fLVd<?nl??7$wJfgLMD@8
zDwRsCR;yhh?*!Ih;7$;PXfl~R18=s&HEh9dw=bpB=?e&-VgDAnMcpCm$URi6RW6lE
z`5X?%vY|mPmpjLbUO~Lki*-$$aB`0gCGz>auh%>90@uC7x+beY1lTjYgMa%PzXcco
XZ9Pk(AjgB&00000NkvXXu0mjfNf_&(

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/StopReload_Over.png b/indra/newview/skins/default/textures/icons/StopReload_Over.png
new file mode 100644
index 0000000000000000000000000000000000000000..251b38630a418a057c650c51960c2a4532711f42
GIT binary patch
literal 529
zcmV+s0`C2ZP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzvq?ljRCwCNQ$0umVHo!ECk+jPXbFO7
zD{5(QX$|BChgO58mfC`Fte~NS8X6llA+q6!=n_I49V93{Gej|{tV8m&yHk(T>rp!S
z;EV=`UU<0g-g}<+=X>9yG)*)0V*{o>&7vPDikih^0!RVRzwpO_X@E!N_Z?5Wg*Gyo
zOhA_962mYDKY<M5U@*8{E|&}0Y&N9px&c&GJqN0SAmqd0@E!zHq&N@=>_D7rHk*>7
zD5r)1z!-4YXf)m`l}aHJi5x>X*{&uO3T+{94niJDPQV-0b(B5@+=1TGE{MzZdR>i1
zqb%A|JRT42bUIx&o9zmeO>n=u)9aQ(7~a>BF%9u2DyqWr@c99X;B?S)jL2{cq2h2j
zMv&EoY6SQ$0PU|muvo3u`B*IGx7+Q*tyZgyOXJOE^AO9j8~8qB$VRj<=ytmoIF7rP
zB<USl@8I_Vt2n1cQGAWZ<7eQ_wYi2V&@{c6OeSw?wOR?~bMP$@N!H+d!kv615(&oZ
z^?D2eipAn3MkIrnBE>`yA1ZmoghZa_*<O2a1U&Q-6G2vh7hvD82mkgrehV-Fx+-?i
T>?zU500000NkvXXu0mjfn(ya0

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/Zoom_Off.png b/indra/newview/skins/default/textures/icons/Zoom_Off.png
new file mode 100644
index 0000000000000000000000000000000000000000..d096720c9c26010f75347f14f12b27a32ffa63df
GIT binary patch
literal 435
zcmV;k0ZjghP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzRY^oaRCwBA`2YVu0~Wvt#DWY207x$r
znix9}o3XL6g~Y_fL;%@AKx_iUtawd<Y1Y@*4?BDI>@1+zeh~ii=g;1gCr?gSQBm;+
z%ClhA3p2ph*4FvUmoHmknvwClckec6Yipa~Gl1pt<;$~?H9-}?`G*c2>cbfZm6etJ
zKpT|t1(>O+sTPo8Mi&SBD?2-zlMx8O!OzGz6&@8(HqfSQ4h{}>Ak6|4`->7?P%p6m
z{rh(_Gcz+Ql4eJkS3uy`uV3HU+1b6YdI6~TC(wYSXs!!E=3Kpc^$w8YME3$b9RTBg
z^1pxoULcvCjjT{nQBfWkQ{L!?Fd;el9TO8%5|FtOh@V4+p91kZpuu+p1O)gtZrm7y
zVF-?-j2>OQKrhaMr3s)RAn$RaBqUM|v9q%aBFO-BLw^4JxsYT7V1@wk1R&N0>18C<
d0CWHlU;wR3@?4pF^-2H$002ovPDHLkV1mY>xLE)I

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png b/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png
new file mode 100644
index 0000000000000000000000000000000000000000..b5508423ebc0f6ae36b11d37fb0cf8697a727692
GIT binary patch
literal 393
zcmV;40e1e0P)<h;3K|Lk000e1NJLTq000sI000mO1^@s68wM|20000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzD@jB_RCwBA{Qv(y1LG_Qeg+1H4M6O`
zKpHpz!~y@)4t!*S3ZNKrK6nlTP?8~D&4Z9Z4p6-eOh^J?z|Y3bU?8jlW(O$P5aTMa
zUKVuGkH5Y$Ot`!TY*@qD`9%AX37NCsX9Czu1-c;&4pIgT7lP-4`Sr#LV0nFEWw081
zNqyV~ffRu>KluCtMFEK405xcWWiD7vgK;8mg9O-k!1RJ!J5UrL^FeHo!RTtRh7m5X
z-mL{}8OWdnU~Gag$iRhALy0yBTMQbAsK5<^d+p%!iwp(FreJvK!rR+mafi+MsBsSD
z!-4}N)+SzAgD~jkb};?n=NA-lqN1M|fE>^tetn_9AgD`0KyZN%`34d4+5xz8e||wx
n0CPS%jaC9MFjA`+0SGVvJjH$t(JurH00000NkvXXu0mjfdHI)@

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/parcel_color_EXP.png b/indra/newview/skins/default/textures/icons/parcel_color_EXP.png
new file mode 100644
index 0000000000000000000000000000000000000000..4813d37198356805ef1c67724adae778fec9a442
GIT binary patch
literal 272
zcmeAS@N?(olHy`uVBq!ia0vp^LO?9Q!3HFy+4N(8lw^r(L`iUdT1k0gQ7VIDN`6wR
zf@f}GdTLN=VoGJ<$y6JlqD`JIjv*DdlK%YvZ+}=bGPI73t&P{=%>f4~3x*?%Y5n>2
zDNS4xk~x?|_&xNQxhFBOG2Ci7#J)>rdLoYxPYBZ&!xzsdFE9AEef9N|<}W^foLunj
z_uSn;=3l;+XZ{{-lX3($Jv*=N_t3P1b^eq4=jR`6`}_AxXF|eefuIj*U#%7;@ve82
zT0PC+L*%UHn@S5EdCU(bv02DYWQv$jWaw6R__^p7A%=I07-le79_8p@6i8rLTW$7g
TXCwnB(De+Su6{1-oD!M<1-fWd

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/parcel_color_M.png b/indra/newview/skins/default/textures/icons/parcel_color_M.png
new file mode 100644
index 0000000000000000000000000000000000000000..41984c43e46f5f46913209821b219c9957c56121
GIT binary patch
literal 306
zcmV-20nPr2P)<h;3K|Lk000e1NJLTq000sI000mO1^@s68wM|20000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUy)Ja4^RCwBA{Qv(y!|!8U{0s~X8-Un>
zfi!Rchyz%yzI|kZ3Sc#4!a4~C%RDVGjRQD9^)fIa31EP&C;3rmJcco_;8Rf;{1R-4
zxA{kceq@A((SKyYx!Xk<<^VA|FjD=>Fg5ofhBz>c7@4q{4l+bi=r@WOh=1-jH^c3x
z99Uh%gv+Vk<{z-~zkFvR%^*?%Z4D|2dcmM7^8+5hDB{vTh&L$Q;T;1n=U<3HD&J7V
zc{u+K<uIbepabX<u&|I6{te~-#a9Brvk1k-2ta@V0KP^`74FSeZU6uP07*qoM6N<$
Ef-r}7HUIzs

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/navbar/Flag.png b/indra/newview/skins/default/textures/navbar/Flag.png
new file mode 100644
index 0000000000000000000000000000000000000000..df53c8922480451b49e14f87dfd7d42aa7d502b2
GIT binary patch
literal 338
zcmV-Y0j>UtP)<h;3K|Lk000e1NJLTq000sI000sQ1^@s6R?d!B0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUy^hrcPRCwBA{Qv(y12q5>1C;;^GN-7h
zsE(15F%pPR1G%q(_$E~94iJ9<Vgo4O28b1VdU|ZJ8ua(?-={!I8i+NBaKu5JE&>|#
z;@`i2%s`qL-+aVr(4Rklzy|&N`IE9R0(lK&(D(1(iP0;B%wa^2{)B{tzi;2ZB_=js
zY~H+C5@+=Pf&d1P_Xyy>Zf<TuSiJ@UK(Afm<>gHSx=I+xRe=htLz4n17A}C2!v6jH
zZ{iFiXn=!~fG|+uJ|Ml1tiXoF9FUTrDAp)3hzXn5fLNMhgFvYph$;6PFxIFOMnHou
k1F2k64PvBL!3Gdu08o&WCTrZK6#xJL07*qoM6N<$f@IT*PXGV_

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/navbar/Lock.png b/indra/newview/skins/default/textures/navbar/Lock.png
new file mode 100644
index 0000000000000000000000000000000000000000..cf569d6ad29c42622f8cd7f4ccbec90cc864b26f
GIT binary patch
literal 302
zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWw1G7d%}YLn>}1{rUgjp4pT^SdkS7UOD9Wc*rX2i8Gr1W?bo`
z@U4OCF3Y2r!fHM<JhnJGI6rB);;h2FkHPRv=tYOa(*$2{_0hP?du0jZ5jBO+7oT((
zoe=d}?;<ptX=!eQ-ZPbJ3T7IAxz!j-uEr~T74(&>mY6za$_M6^ybf<16ejgCZ1nf{
z=RcFcCYEy3zW!g0g3-+z42B-M%3;lQ|Nr@xHMtnRxV}FAis6gr=jR{3s*oTdtDy8M
w@d1NfGgF6;yMi-Q$Em*|`u!cO42*0HZ=C%92rs`L3iKO;r>mdKI;Vst0NkH$rvLx|

literal 0
HcmV?d00001

-- 
GitLab


From 415091d92929b86b6a2a82a7880c8508441bb371 Mon Sep 17 00:00:00 2001
From: Erica <erica@lindenlab.com>
Date: Tue, 10 Nov 2009 15:26:21 -0800
Subject: [PATCH 073/557] Added media textures to textures.xml

---
 .../skins/default/textures/textures.xml       | 56 +++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index fba8e0b06c5..48c7236796f 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -23,6 +23,14 @@
   <texture name="Arrow_Up" file_name="widgets/Arrow_Up.png" preload="true" />
   <texture name="Arrow_Down" file_name="widgets/Arrow_Down.png" preload="true" />
 
+  <texture name="AudioMute_Off.png" file_name="icons/AudioMute_Off.png" preload="false" />
+  <texture name="AudioMute_Over.png" file_name="icons/AudioMute_Over.png" preload="false" />
+  <texture name="AudioMute_Press.png" file_name="icons/AudioMute_Press.png" preload="false" />
+
+  <texture name="Audio_Off.png" file_name="icons/Audio_Off.png" preload="false" />
+  <texture name="Audio_Over.png" file_name="icons/Audio_Over.png" preload="false" />
+  <texture name="Audio_Press.png" file_name="icons/Audio_Press.png" preload="false" />
+
   <texture name="BackArrow_Disabled" file_name="icons/BackArrow_Disabled.png" preload="false" />
   <texture name="BackArrow_Off" file_name="icons/BackArrow_Off.png" preload="false" />
   <texture name="BackArrow_Press" file_name="icons/BackArrow_Press.png" preload="false" />
@@ -99,6 +107,10 @@
 
   <texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" />
 
+  <texture name="ExternalBrowser_Off.png" file_name="icons/ExternalBrowser_Off.png" preload="false" />
+  <texture name="ExternalBrowser_Over.png" file_name="icons/ExternalBrowser_Over.png" preload="false" />
+  <texture name="ExternalBrowser_Press.png" file_name="icons/ExternalBrowser_Press.png" preload="false" />
+
   <texture name="Favorite_Star_Active" file_name="navbar/Favorite_Star_Active.png" preload="false" />
   <texture name="Favorite_Star_Off" file_name="navbar/Favorite_Star_Off.png" preload="false" />
   <texture name="Favorite_Star_Press" file_name="navbar/Favorite_Star_Press.png" preload="false" />
@@ -108,6 +120,8 @@
   <texture name="FileMenu_BarSelect" file_name="navbar/FileMenu_BarSelect.png" preload="false" scale.left="2" scale.top="0" scale.right="2" scale.bottom="0" />
   <texture name="FileMenu_BG" file_name="navbar/FileMenu_BG.png" preload="false" />
 
+  <texture name="Flag" file_name="navbar/Flag.png" preload="false" />
+
   <texture name="ForSale_Badge" file_name="icons/ForSale_Badge.png" preload="false" />
   <texture name="ForwardArrow_Off" file_name="icons/ForwardArrow_Off.png" preload="false" />
   <texture name="ForwardArrow_Press" file_name="icons/ForwardArrow_Press.png" preload="false" />
@@ -207,6 +221,7 @@
   <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" />
 
   <texture name="Lock" file_name="icons/Lock.png" preload="false" />
+  <texture name="Lock2" file_name="navbar/Lock.png" preload="false" />
 
   <texture name="Login_Pod" file_name="windows/Login_Pod.png" preload="true" />
 
@@ -277,10 +292,16 @@
   <texture name="Overhead_M" file_name="world/Overhead_M.png" preload="false" />
   <texture name="Overhead_S" file_name="world/Overhead_S.png" preload="false" />
 
+  <texture name="parcel_color_EVRY" file_name="icons/parcel_color_EVRY.png" preload="false" />
+  <texture name="parcel_color_EXP" file_name="icons/parcel_color_EXP.png" preload="false" />
+  <texture name="parcel_color_M" file_name="icons/parcel_color_M.png" preload="false" />
+
   <texture name="parcel_drk_Build" file_name="icons/parcel_drk_Build.png" preload="false" />
  <texture name="parcel_drk_BuildNo" file_name="icons/parcel_drk_BuildNo.png" preload="false" />
  <texture name="parcel_drk_Damage" file_name="icons/parcel_drk_Damage.png" preload="false" />
  <texture name="parcel_drk_DamageNo" file_name="icons/parcel_drk_DamageNo.png" preload="false" />
+  <texture name="parcel_drk_EVRY" file_name="icons/parcel_drk_EVRY.png" preload="false" />
+  <texture name="parcel_drk_EXP" file_name="icons/parcel_drk_EXP.png" preload="false" />
  <texture name="parcel_drk_Fly" file_name="icons/parcel_drk_Fly.png" preload="false" />
  <texture name="parcel_drk_FlyNo" file_name="icons/parcel_drk_FlyNo.png" preload="false" />
  <texture name="parcel_drk_ForSale" file_name="icons/parcel_drk_ForSale.png" preload="false" />
@@ -299,6 +320,8 @@
  <texture name="parcel_lght_BuildNo" file_name="icons/parcel_lght_BuildNo.png" preload="false" />
  <texture name="parcel_lght_Damage" file_name="icons/parcel_lght_Damage.png" preload="false" />
  <texture name="parcel_lght_DamageNo" file_name="icons/parcel_lght_DamageNo.png" preload="false" />
+  <texture name="parcel_lght_EVRY" file_name="icons/parcel_lght_EVRY.png" preload="false" />
+  <texture name="parcel_lght_EXP" file_name="icons/parcel_lght_EXP.png" preload="false" />
  <texture name="parcel_lght_Fly" file_name="icons/parcel_lght_Fly.png" preload="false" />
  <texture name="parcel_lght_FlyNo" file_name="icons/parcel_lght_FlyNo.png" preload="false" />
  <texture name="parcel_lght_ForSale" file_name="icons/parcel_lght_ForSale.png" preload="false" />
@@ -313,6 +336,13 @@
  <texture name="parcel_lght_Voice" file_name="icons/parcel_lght_Voice.png" preload="false" />
  <texture name="parcel_lght_VoiceNo" file_name="icons/parcel_lght_VoiceNo.png" preload="false" />
 
+  <texture name="Pause_Off.png" file_name="icons/Pause_Off.png" preload="false" />
+  <texture name="Pause_Over.png" file_name="icons/Pause_Over.png" preload="false" />
+  <texture name="Pause_Press.png" file_name="icons/Pause_Press.png" preload="false" />
+  <texture name="Play_Off.png" file_name="icons/Play_Off.png" preload="false" />
+  <texture name="Play_Over.png" file_name="icons/Play_Over.png" preload="false" />
+  <texture name="Play_Press.png" file_name="icons/Play_Press.png" preload="false" />
+
   <texture name="Progress_1" file_name="icons/Progress_1.png" preload="false" />
   <texture name="Progress_2" file_name="icons/Progress_2.png" preload="false" />
   <texture name="Progress_3" file_name="icons/Progress_3.png" preload="false" />
@@ -364,6 +394,12 @@
   <texture name="ScrollTrack_Vert" file_name="widgets/ScrollTrack_Vert.png" preload="true" scale.left="2" scale.top="40" scale.bottom="13" scale.right="0" />
   <texture name="ScrollTrack_Horiz" file_name="widgets/ScrollTrack_Horiz.png" preload="true" scale.left="4" scale.top="0" scale.bottom="0" scale.right="2" />
 
+  <texture name="ScrubberThumb_Disabled" file_name="widgets/ScrubberThumb_Disabled.png" preload="false" />
+  <texture name="ScrubberThumb_Focus" file_name="widgets/ScrubberThumb_Focus.png" preload="false" />
+  <texture name="ScrubberThumb_Off" file_name="widgets/ScrubberThumb_Off.png" preload="false" />
+  <texture name="ScrubberThumb_Over" file_name="widgets/ScrubberThumb_Over.png" preload="false" />
+  <texture name="ScrubberThumb_Press" file_name="widgets/ScrubberThumb_Press.png" preload="false" />
+
   <texture name="Search" file_name="navbar/Search.png" preload="false" />
 
   <texture name="SegmentedBtn_Left_Off" file_name="widgets/SegmentedBtn_Left_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
@@ -387,6 +423,13 @@
   <texture name="SegmentedBtn_Right_Selected_Press" file_name="widgets/SegmentedBtn_Right_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
   <texture name="SegmentedBtn_Right_Selected_Disabled" file_name="widgets/SegmentedBtn_Right_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
 
+  <texture name="SkipBackward_Off.png" file_name="icons/SkipBackward_Off.png" preload="false" />
+  <texture name="SkipBackward_Over.png" file_name="icons/SkipBackward_Over.png" preload="false" />
+  <texture name="SkipBackward_Press.png" file_name="icons/SkipBackward_Press.png" preload="false" />
+  <texture name="SkipForward_Off.png" file_name="icons/SkipForward_Off.png" preload="false" />
+  <texture name="SkipForward_Over.png" file_name="icons/SkipForward_Over.png" preload="false" />
+  <texture name="SkipForward_Press.png" file_name="icons/SkipForward_Press.png" preload="false" />
+
   <texture name="SliderTrack_Horiz" file_name="widgets/SliderTrack_Horiz.png" scale.left="4" scale.top="4" scale.right="100" scale.bottom="2" />
   <texture name="SliderTrack_Vert" file_name="widgets/SliderTrack_Vert.png" scale.left="2" scale.top="100" scale.right="4" scale.bottom="4" />
   <texture name="SliderThumb_Off" file_name="widgets/SliderThumb_Off.png" />
@@ -404,6 +447,10 @@
   <texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="true" />
   <texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="true" />
 
+  <texture name="StopReload_Off.png" file_name="icons/StopReload_Off.png" preload="false" />
+  <texture name="StopReload_Over.png" file_name="icons/StopReload_Over.png" preload="false" />
+  <texture name="StopReload_Press.png" file_name="icons/StopReload_Press.png" preload="false" />
+
   <texture name="TabIcon_Appearance_Large" file_name="taskpanel/TabIcon_Appearance_Large.png" preload="false" />
   <texture name="TabIcon_Appearance_Off" file_name="taskpanel/TabIcon_Appearance_Off.png" preload="false" />
   <texture name="TabIcon_Appearance_Over" file_name="taskpanel/TabIcon_Appearance_Over.png" preload="false" />
@@ -459,6 +506,9 @@
   <texture name="TextField_Disabled" file_name="widgets/TextField_Disabled.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
   <texture name="TextField_Active" file_name="widgets/TextField_Active.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
 
+  <texture name="TimeBasedMediaBackground" file_name="windows/TimeBasedMediaBackground.png" preload="false" />
+
+
   <texture name="Toast_CloseBtn" file_name="windows/Toast_CloseBtn.png" preload="true" />
   <texture name="Toast_Background" file_name="windows/Toast_Background.png" preload="true"
            scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" />
@@ -493,6 +543,8 @@
   <texture name="VoicePTT_Off" file_name="bottomtray/VoicePTT_Off.png" preload="false" />
   <texture name="VoicePTT_On" file_name="bottomtray/VoicePTT_On.png" preload="false" />
 
+  <texture name="WebBasedMediaBackground" file_name="windows/WebBasedMediaBackground.png" preload="false" />
+
   <texture name="Widget_DownArrow" file_name="icons/Widget_DownArrow.png" preload="true" />
   <texture name="Widget_UpArrow" file_name="icons/Widget_UpArrow.png" preload="true" />
 
@@ -507,6 +559,10 @@
 
   <texture name="YouAreHere_Badge" file_name="icons/YouAreHere_Badge.png" preload="false" />
 
+  <texture name="Zoom_Off.png" file_name="icons/Zoom_Off.png" preload="false" />
+  <texture name="Zoom_Over.png" file_name="icons/Zoom_Over.png" preload="false" />
+  <texture name="Zoom_Press.png" file_name="icons/Zoom_Press.png" preload="false" />
+
   <!--WARNING OLD ART *do not use*-->
 
   <texture name="btn_chatbar.tga" scale.left="20" scale.top="24" scale.right="44" scale.bottom="0" />
-- 
GitLab


From 43f13cedf3608271d013ac14d722a41b3d0c69cb Mon Sep 17 00:00:00 2001
From: Lis Pardi <lis@lindenlab.com>
Date: Tue, 10 Nov 2009 18:30:17 -0500
Subject: [PATCH 074/557] EXT-2355 Preferences: Inconsistent use of capital
 letters for second word of labels

---
 .../newview/skins/default/xui/en/panel_preferences_advanced.xml | 2 +-
 .../newview/skins/default/xui/en/panel_preferences_general.xml  | 2 +-
 .../newview/skins/default/xui/en/panel_preferences_privacy.xml  | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 06f07104065..0ac0521b10c 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -284,7 +284,7 @@ Avatars:
      enabled_control="EnableVoiceChat"
      control_name="PushToTalkToggle"
      height="20"
-     label="Toggle mode for microphone when I press the Speak trigger key:"
+     label="Toggle mode for microphone when I press the speak trigger key:"
      layout="topleft"
      left="30"
      name="push_to_talk_toggle_check"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
index 975d21aaa6a..a6ca73d4b7f 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -305,7 +305,7 @@
      name="effects_color_textbox"
      top_pad="5"
      width="400">
-        My Effects:
+        My effects:
     </text>
     <color_swatch
      border_color="0.45098 0.517647 0.607843 1"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
index acf4601bfe5..8c22a5e4839 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -208,7 +208,7 @@
     <button
      follows="left|bottom"
      height="20"
-     label="Block List"
+     label="Block list"
      layout="topleft"
      left="30"
      name="block_list"
-- 
GitLab


From af9b99b457a6a6ab9f04a20bcde6a90091321375 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Tue, 10 Nov 2009 18:30:36 -0500
Subject: [PATCH 075/557] EXT-2349 : Diagnose warning spam: [X] is in model and
 in view, but STRUCTURE flag not set

No longer allowing recursive calls to gInventory.notifyObservers.  Added debugging tools to catch when this happens.
This fixes the symptom, but we'll also need to remove whatever code is causing the recursive calls.
---
 indra/newview/llinventorymodel.cpp | 42 +++++++++++++++++++++++++-----
 indra/newview/llinventorymodel.h   | 28 +++++++++++---------
 2 files changed, 52 insertions(+), 18 deletions(-)

diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index b41695fd341..51052a22b5a 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -172,6 +172,7 @@ LLInventoryModel::LLInventoryModel()
 	mRootFolderID(),
 	mLibraryRootFolderID(),
 	mLibraryOwnerID(),
+	mIsNotifyObservers(FALSE),
 	mIsAgentInvUsable(false)
 {
 }
@@ -533,7 +534,10 @@ void LLInventoryModel::updateLinkedItems(const LLUUID& object_id)
 						 item_array,
 						 LLInventoryModel::INCLUDE_TRASH,
 						 is_linked_item_match);
-
+	if (cat_array.empty() && item_array.empty())
+	{
+		return;
+	}
 	for (LLInventoryModel::cat_array_t::iterator cat_iter = cat_array.begin();
 		 cat_iter != cat_array.end();
 		 cat_iter++)
@@ -635,6 +639,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)
 		new_item = old_item;
 		LLUUID old_parent_id = old_item->getParentUUID();
 		LLUUID new_parent_id = item->getParentUUID();
+			
 		if(old_parent_id != new_parent_id)
 		{
 			// need to update the parent-child tree
@@ -1129,6 +1134,16 @@ BOOL LLInventoryModel::containsObserver(LLInventoryObserver* observer) const
 // The optional argument 'service_name' is used by Agent Inventory Service [DEV-20328]
 void LLInventoryModel::notifyObservers(const std::string service_name)
 {
+	if (mIsNotifyObservers)
+	{
+		// Within notifyObservers, something called notifyObservers
+		// again.  This type of recursion is unsafe because it causes items to be 
+		// processed twice, and this can easily lead to infinite loops.
+		llwarns << "Call was made to notifyObservers within notifyObservers!" << llendl;
+		return;
+	}
+	mIsNotifyObservers = TRUE;
+	llinfos << "Start process notifyObservers for " << this << llendl;
 	for (observer_list_t::iterator iter = mObservers.begin();
 		 iter != mObservers.end(); )
 	{
@@ -1150,12 +1165,21 @@ void LLInventoryModel::notifyObservers(const std::string service_name)
 
 	mModifyMask = LLInventoryObserver::NONE;
 	mChangedItemIDs.clear();
+	mIsNotifyObservers = FALSE;
 }
 
 // store flag for change
 // and id of object change applies to
 void LLInventoryModel::addChangedMask(U32 mask, const LLUUID& referent) 
 { 
+	if (mIsNotifyObservers)
+	{
+		// Something marked an item for change within a call to notifyObservers
+		// (which is in the process of processing the list of items marked for change).
+		// This means the change may fail to be processed.
+		llwarns << "Adding changed mask within notify observers!  Change will likely be lost." << llendl;
+	}
+	
 	mModifyMask |= mask; 
 	if (referent.notNull())
 	{
@@ -1824,13 +1848,13 @@ void LLInventoryModel::addItem(LLViewerInventoryItem* item)
 {
 	//llinfos << "LLInventoryModel::addItem()" << llendl;
 
-	
-	// This can happen if assettype enums change.  This can be a backwards compatibility issue 
-	// in some viewer prototypes prior to when the AT_LINK enum changed from 23 to 24.
+	// This can happen if assettype enums from llassettype.h ever change.
+	// For example, there is a known backwards compatibility issue in some viewer prototypes prior to when 
+	// the AT_LINK enum changed from 23 to 24.
 	if ((item->getType() == LLAssetType::AT_NONE)
 		|| LLAssetType::lookup(item->getType()) == LLAssetType::badLookup())
 	{
-		llwarns << "Got bad asset type for item ( name: " << item->getName() << " type: " << item->getType() << " inv-type: " << item->getInventoryType() << " ), ignoring." << llendl;
+		llwarns << "Got bad asset type for item [ name: " << item->getName() << " type: " << item->getType() << " inv-type: " << item->getInventoryType() << " ], ignoring." << llendl;
 		return;
 	}
 	if(item)
@@ -1839,7 +1863,7 @@ void LLInventoryModel::addItem(LLViewerInventoryItem* item)
 		// The item will show up as a broken link.
 		if (item->getIsBrokenLink())
 		{
-			llinfos << "Adding broken link ( name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " )  parent: " << item->getParentUUID() << llendl;
+			llinfos << "Adding broken link [ name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " )  parent: " << item->getParentUUID() << llendl;
 		}
 		mItemMap[item->getUUID()] = item;
 	}
@@ -3263,6 +3287,12 @@ void LLInventoryModel::processInventoryDescendents(LLMessageSystem* msg,void**)
 	for(i = 0; i < count; ++i)
 	{
 		titem->unpackMessage(msg, _PREHASH_ItemData, i);
+		// If the item has already been added (e.g. from link prefetch), then it doesn't need to be re-added.
+		if (gInventory.getItem(titem->getUUID()))
+		{
+			llinfos << "Skipping prefetched item [ Name: " << titem->getName() << " | Type: " << titem->getActualType() << " | ItemUUID: " << titem->getUUID() << " ] " << llendl;
+			continue;
+		}
 		gInventory.updateItem(titem);
 	}
 
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index aba0a619dba..5f51408bcfa 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -472,23 +472,12 @@ class LLInventoryModel
 	cat_array_t* getUnlockedCatArray(const LLUUID& id);
 	item_array_t* getUnlockedItemArray(const LLUUID& id);
 	
-protected:
+private:
 	// Variables used to track what has changed since the last notify.
 	U32 mModifyMask;
 	typedef std::set<LLUUID> changed_items_t;
 	changed_items_t mChangedItemIDs;
 
-	// Information for tracking the actual inventory. We index this
-	// information in a lot of different ways so we can access
-	// the inventory using several different identifiers.
-	// mInventory member data is the 'master' list of inventory, and
-	// mCategoryMap and mItemMap store uuid->object mappings. 
-	typedef std::map<LLUUID, LLPointer<LLViewerInventoryCategory> > cat_map_t;
-	typedef std::map<LLUUID, LLPointer<LLViewerInventoryItem> > item_map_t;
-	//inv_map_t mInventory;
-	cat_map_t mCategoryMap;
-	item_map_t mItemMap;
-
 	std::map<LLUUID, bool> mCategoryLock;
 	std::map<LLUUID, bool> mItemLock;
 	
@@ -521,6 +510,21 @@ class LLInventoryModel
 	// This flag is used to handle an invalid inventory state.
 	bool mIsAgentInvUsable;
 
+private:
+	// Information for tracking the actual inventory. We index this
+	// information in a lot of different ways so we can access
+	// the inventory using several different identifiers.
+	// mInventory member data is the 'master' list of inventory, and
+	// mCategoryMap and mItemMap store uuid->object mappings. 
+	typedef std::map<LLUUID, LLPointer<LLViewerInventoryCategory> > cat_map_t;
+	typedef std::map<LLUUID, LLPointer<LLViewerInventoryItem> > item_map_t;
+	//inv_map_t mInventory;
+	cat_map_t mCategoryMap;
+	item_map_t mItemMap;
+
+	// Flag set when notifyObservers is being called, to look for bugs
+	// where it's called recursively.
+	BOOL mIsNotifyObservers;
 public:
 	// *NOTE: DEBUG functionality
 	void dumpInventory() const;
-- 
GitLab


From 0eaf4b2bb27eec073d39bb6134193be905d8b6a9 Mon Sep 17 00:00:00 2001
From: callum <none@none>
Date: Tue, 10 Nov 2009 15:44:56 -0800
Subject: [PATCH 076/557] Fix for DEV-42546 (QuickTime plugin crashes a lot)

---
 install.xml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/install.xml b/install.xml
index 6d40d6fe4e3..ff9fa805003 100644
--- a/install.xml
+++ b/install.xml
@@ -1269,7 +1269,7 @@ anguage Infrstructure (CLI) international standard</string>
       <key>quicktime</key>
       <map>
         <key>copyright</key>
-        <string>Copyright (C) 1990-2006 by Apple Computer, Inc., all rights reserved.</string>
+        <string>Copyright (C) 1990-2007 by Apple Computer, Inc., all rights reserved.</string>
         <key>description</key>
         <string>Separate download. Used to play in-world video clips on a prim. </string>
         <key>license</key>
@@ -1279,9 +1279,9 @@ anguage Infrstructure (CLI) international standard</string>
           <key>windows</key>
           <map>
             <key>md5sum</key>
-            <string>7a2e6fc89b1ef027f3a36ebb46fb0c8a</string>
+            <string>be45825cc14ede53790ac93c58307dcb</string>
             <key>url</key>
-            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/quicktime-windows-20080611.tar.bz2</uri>
+            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/quicktime-sdk-windows-7.3-20091110.tar.bz2</uri>
           </map>
         </map>
       </map>
-- 
GitLab


From 434407efc4e4a862cf7b755cd06f2ef6e78d2b8e Mon Sep 17 00:00:00 2001
From: Lynx Linden <lynx@lindenlab.com>
Date: Tue, 10 Nov 2009 23:56:30 +0000
Subject: [PATCH 077/557] DEV-40001: Add support for a pre-login help topic.

Asking for help (e.g., pressing F1) before logging in will now display
a specific pre-login help topic, "pre_login_help". This behavior was
agreed upon with Rand to allow us to display a custom page to help the
user log on successfully.
---
 indra/llui/llhelp.h            |  2 ++
 indra/newview/llviewerhelp.cpp | 23 +++++++++++++++++++----
 indra/newview/llviewerhelp.h   |  3 +++
 3 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/indra/llui/llhelp.h b/indra/llui/llhelp.h
index c06d29a4bd4..82c3bc385f3 100644
--- a/indra/llui/llhelp.h
+++ b/indra/llui/llhelp.h
@@ -40,6 +40,8 @@ class LLHelp
 	virtual void showTopic(const std::string &topic) = 0;
 	// return default (fallback) topic name suitable for showTopic()
 	virtual std::string defaultTopic() = 0;
+	// return topic to use before the user logs in
+	virtual std::string preLoginTopic() = 0;
 };
 
 #endif // headerguard
diff --git a/indra/newview/llviewerhelp.cpp b/indra/newview/llviewerhelp.cpp
index 0e0727e3825..056260791c4 100644
--- a/indra/newview/llviewerhelp.cpp
+++ b/indra/newview/llviewerhelp.cpp
@@ -39,6 +39,7 @@
 #include "llviewercontrol.h"
 #include "llversionviewer.h"
 #include "llappviewer.h"
+#include "lllogininstance.h"
 
 #include "llviewerhelputil.h"
 #include "llviewerhelp.h"
@@ -51,17 +52,25 @@ void LLViewerHelp::showTopic(const std::string &topic)
 {
 	showHelp();
 	
+	// allow overriding the help server with a local help file
 	if( gSavedSettings.getBOOL("HelpUseLocal") )
 	{
 		LLFloaterHelpBrowser* helpbrowser = dynamic_cast<LLFloaterHelpBrowser*>(LLFloaterReg::getInstance("help_browser"));
 		helpbrowser->navigateToLocalPage( "help-offline" , "index.html" );
+		return;
 	}
-	else 
+
+	// use a special login topic before the user logs in
+	std::string help_topic = topic;
+	if (! LLLoginInstance::getInstance()->authSuccess())
 	{
-		const LLOSInfo& osinfo = LLAppViewer::instance()->getOSInfo();
-		std::string helpURL = LLViewerHelpUtil::buildHelpURL( topic, gSavedSettings, osinfo );
-		setRawURL( helpURL );
+		help_topic = preLoginTopic();
 	}
+
+	// work out the URL for this topic and display it 
+	const LLOSInfo& osinfo = LLAppViewer::instance()->getOSInfo();
+	std::string helpURL = LLViewerHelpUtil::buildHelpURL( help_topic, gSavedSettings, osinfo );
+	setRawURL( helpURL );
 }
 
 std::string LLViewerHelp::defaultTopic()
@@ -70,6 +79,12 @@ std::string LLViewerHelp::defaultTopic()
 	return "this_is_fallbacktopic";
 }
 
+std::string LLViewerHelp::preLoginTopic()
+{
+	// *hack: to be done properly
+	return "pre_login_help";
+}
+
 //////////////////////////////
 // our own interfaces
 
diff --git a/indra/newview/llviewerhelp.h b/indra/newview/llviewerhelp.h
index 17aab6f2397..dcb5ae32c98 100644
--- a/indra/newview/llviewerhelp.h
+++ b/indra/newview/llviewerhelp.h
@@ -57,6 +57,9 @@ class LLViewerHelp : public LLHelp, public LLSingleton<LLViewerHelp>
 	// return topic derived from viewer UI focus, else default topic
 	std::string getTopicFromFocus();
 
+	// return topic to use before the user logs in
+	std::string preLoginTopic();
+
  private:
 	static void showHelp(); // make sure help UI is visible & raised
 	static void setRawURL(std::string url); // send URL to help UI
-- 
GitLab


From 2fd31363f747aaf0ec3d3d6b5711e0ecc99b2cf3 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Tue, 10 Nov 2009 15:57:26 -0800
Subject: [PATCH 078/557] Added PluginAttachDebuggerToPlugins debug setting.

Added accessors to get platform-specific process ID from LLProcessLauncher.

Added an optional "debug" argument to LLPluginClassMedia::init() and LLPluginProcessParent::init() (defaults to false).

Mac only: made the state machine in LLPluginProcessParent::idle() open a new window in Terminal.app with a gdb session attached to the plugin process upon successful launch.
---
 indra/llcommon/llprocesslauncher.h       |  8 ++++++
 indra/llplugin/llpluginclassmedia.cpp    |  4 +--
 indra/llplugin/llpluginclassmedia.h      |  2 +-
 indra/llplugin/llpluginprocessparent.cpp | 31 ++++++++++++++++++++++--
 indra/llplugin/llpluginprocessparent.h   |  5 +++-
 indra/newview/app_settings/settings.xml  | 11 +++++++++
 indra/newview/llviewermedia.cpp          |  2 +-
 7 files changed, 56 insertions(+), 7 deletions(-)

diff --git a/indra/llcommon/llprocesslauncher.h b/indra/llcommon/llprocesslauncher.h
index 880562157fb..929d547f6ed 100644
--- a/indra/llcommon/llprocesslauncher.h
+++ b/indra/llcommon/llprocesslauncher.h
@@ -70,6 +70,14 @@ class LL_COMMON_API LLProcessLauncher
 	
 	// This needs to be called periodically on Mac/Linux to clean up zombie processes.
 	static void reap(void);
+	
+	// Accessors for platform-specific process ID
+#if LL_WINDOWS
+	HANDLE getProcessHandle() { return mProcessHandle; };
+#else
+	pid_t getProcessID() { return mProcessID; };
+#endif	
+	
 private:
 	std::string mExecutable;
 	std::string mWorkingDir;
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index 457c074ef1e..42d5ec49cd3 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -61,14 +61,14 @@ LLPluginClassMedia::~LLPluginClassMedia()
 	reset();
 }
 
-bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_filename)
+bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug)
 {	
 	LL_DEBUGS("Plugin") << "launcher: " << launcher_filename << LL_ENDL;
 	LL_DEBUGS("Plugin") << "plugin: " << plugin_filename << LL_ENDL;
 	
 	mPlugin = new LLPluginProcessParent(this);
 	mPlugin->setSleepTime(mSleepTime);
-	mPlugin->init(launcher_filename, plugin_filename);
+	mPlugin->init(launcher_filename, plugin_filename, debug);
 
 	return true;
 }
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index 90ecd1e0735..dcc4a3bd6a2 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -47,7 +47,7 @@ class LLPluginClassMedia : public LLPluginProcessParentOwner
 	virtual ~LLPluginClassMedia();
 
 	// local initialization, called by the media manager when creating a source
-	virtual bool init(const std::string &launcher_filename, const std::string &plugin_filename);
+	virtual bool init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug = false);
 
 	// undoes everything init() didm called by the media manager when destroying a source
 	virtual void reset();
diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp
index 39f9438fb3d..b7ce800c3ab 100644
--- a/indra/llplugin/llpluginprocessparent.cpp
+++ b/indra/llplugin/llpluginprocessparent.cpp
@@ -55,6 +55,7 @@ LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner)
 	mBoundPort = 0;
 	mState = STATE_UNINITIALIZED;
 	mDisableTimeout = false;
+	mDebug = false;
 
 	// initialize timer - heartbeat test (mHeartbeat.hasExpired()) 
 	// can sometimes return true immediately otherwise and plugins 
@@ -96,11 +97,12 @@ void LLPluginProcessParent::errorState(void)
 		setState(STATE_ERROR);
 }
 
-void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_filename)
+void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug)
 {	
 	mProcess.setExecutable(launcher_filename);
 	mPluginFile = plugin_filename;
 	mCPUUsage = 0.0f;
+	mDebug = debug;
 	
 	setState(STATE_INITIALIZED);
 }
@@ -291,6 +293,31 @@ void LLPluginProcessParent::idle(void)
 				}
 				else
 				{
+					if(mDebug)
+					{
+						#if LL_DARWIN
+						// If we're set to debug, start up a gdb instance in a new terminal window and have it attach to the plugin process and continue.
+						
+						// The command we're constructing would look like this on the command line:
+						// osascript -e 'tell application "Terminal"' -e 'set win to do script "gdb -pid 12345"' -e 'do script "continue" in win' -e 'end tell'
+
+						std::stringstream cmd;
+						
+						mDebugger.setExecutable("/usr/bin/osascript");
+						mDebugger.addArgument("-e");
+						mDebugger.addArgument("tell application \"Terminal\"");
+						mDebugger.addArgument("-e");
+						cmd << "set win to do script \"gdb -pid " << mProcess.getProcessID() << "\"";
+						mDebugger.addArgument(cmd.str());
+						mDebugger.addArgument("-e");
+						mDebugger.addArgument("do script \"continue\" in win");
+						mDebugger.addArgument("-e");
+						mDebugger.addArgument("end tell");
+						mDebugger.launch();
+
+						#endif
+					}
+					
 					// This will allow us to time out if the process never starts.
 					mHeartbeat.start();
 					mHeartbeat.setTimerExpirySec(PLUGIN_LAUNCH_SECONDS);
@@ -661,7 +688,7 @@ bool LLPluginProcessParent::pluginLockedUpOrQuit()
 {
 	bool result = false;
 	
-	if(!mDisableTimeout)
+	if(!mDisableTimeout && !mDebug)
 	{
 		if(!mProcess.isRunning())
 		{
diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h
index 754ebeb9468..1289e86c136 100644
--- a/indra/llplugin/llpluginprocessparent.h
+++ b/indra/llplugin/llpluginprocessparent.h
@@ -56,7 +56,7 @@ class LLPluginProcessParent : public LLPluginMessagePipeOwner
 	LLPluginProcessParent(LLPluginProcessParentOwner *owner);
 	~LLPluginProcessParent();
 		
-	void init(const std::string &launcher_filename, const std::string &plugin_filename);
+	void init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug = false);
 	void idle(void);
 	
 	// returns true if the plugin is on its way to steady state
@@ -150,6 +150,9 @@ class LLPluginProcessParent : public LLPluginMessagePipeOwner
 	F64		mCPUUsage;
 	
 	bool mDisableTimeout;
+	bool mDebug;
+
+	LLProcessLauncher mDebugger;
 };
 
 #endif // LL_LLPLUGINPROCESSPARENT_H
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 55ff255c38e..15c9499bbc8 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -5327,6 +5327,17 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
+    <key>PluginAttachDebuggerToPlugins</key>
+    <map>
+      <key>Comment</key>
+      <string>If true, attach a debugger session to each plugin process as it's launched.</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
     <key>PluginInstancesCPULimit</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 69650425cb4..66d48fadd18 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -847,7 +847,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
 		{
 			LLPluginClassMedia* media_source = new LLPluginClassMedia(owner);
 			media_source->setSize(default_width, default_height);
-			if (media_source->init(launcher_name, plugin_name))
+			if (media_source->init(launcher_name, plugin_name, gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins")))
 			{
 				return media_source;
 			}
-- 
GitLab


From a3017978d3b4134c2408eb4e3124d8725a9f4733 Mon Sep 17 00:00:00 2001
From: Lynx Linden <lynx@lindenlab.com>
Date: Wed, 11 Nov 2009 00:25:33 +0000
Subject: [PATCH 079/557] DEV-41358: Added user's preferred maturity level to
 search URL.

The Search URL now includes a "r=" query parameter to specify the
user's preferred maturity rating. This can be "pg" or "pg,mature"
or "pg,mature,adult".
---
 indra/newview/llfloatersearch.cpp                     | 7 +++++++
 indra/newview/skins/default/xui/en/floater_search.xml | 2 +-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index 97c573ddea5..ca2cdffcf8f 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -36,6 +36,7 @@
 #include "llmediactrl.h"
 #include "lllogininstance.h"
 #include "lluri.h"
+#include "llagent.h"
 
 LLFloaterSearch::LLFloaterSearch(const LLSD& key) :
 	LLFloater(key),
@@ -122,6 +123,12 @@ void LLFloaterSearch::search(const LLSD &key)
 	LLSD search_token = LLLoginInstance::getInstance()->getResponse("search_token");
 	url += "&p=" + search_token.asString();
 
+	// also append the user's preferred maturity (can be changed via prefs)
+	std::string maturity = "pg";
+	if (gAgent.prefersMature()) maturity += ",mature";
+	if (gAgent.prefersAdult()) maturity += ",adult";
+	url += "&r=" + maturity;
+
 	// and load the URL in the web view
 	mBrowser->navigateTo(url);
 }
diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml
index edc1fb88385..b9cf4568426 100644
--- a/indra/newview/skins/default/xui/en/floater_search.xml
+++ b/indra/newview/skins/default/xui/en/floater_search.xml
@@ -2,7 +2,7 @@
 <floater
  legacy_header_height="18"
  can_resize="true"
- height="400"
+ height="512"
  layout="topleft"
  min_height="140"
  min_width="467"
-- 
GitLab


From 9d2102519d88feec434b79e1d9bb7d86ac6e7794 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Tue, 10 Nov 2009 16:49:57 -0800
Subject: [PATCH 080/557] Fix for DEV-42400 (Mouse pointer location does not
 map correctly to non-square media faces).

---
 indra/newview/llviewermedia.cpp | 38 ++++++++++++++++++++++-----------
 1 file changed, 25 insertions(+), 13 deletions(-)

diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 66d48fadd18..605861f1cb4 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -1133,11 +1133,15 @@ void LLViewerMediaImpl::mouseMove(S32 x, S32 y, MASK mask)
 void LLViewerMediaImpl::mouseDown(const LLVector2& texture_coords, MASK mask, S32 button)
 {
 	if(mMediaSource)
-	{		
-		mouseDown(
-			llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()),
-			llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()),
-			mask, button);
+	{
+		// scale x and y to texel units.
+		S32 x = llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth());
+		S32 y = llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight());
+
+		// Adjust for the difference between the actual texture height and the amount of the texture in use.
+		y -= (mMediaSource->getTextureHeight() - mMediaSource->getHeight());
+
+		mouseDown(x, y, mask, button);
 	}
 }
 
@@ -1145,10 +1149,14 @@ void LLViewerMediaImpl::mouseUp(const LLVector2& texture_coords, MASK mask, S32
 {
 	if(mMediaSource)
 	{		
-		mouseUp(
-			llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()),
-			llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()),
-			mask, button);
+		// scale x and y to texel units.
+		S32 x = llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth());
+		S32 y = llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight());
+
+		// Adjust for the difference between the actual texture height and the amount of the texture in use.
+		y -= (mMediaSource->getTextureHeight() - mMediaSource->getHeight());
+
+		mouseUp(x, y, mask, button);
 	}
 }
 
@@ -1156,10 +1164,14 @@ void LLViewerMediaImpl::mouseMove(const LLVector2& texture_coords, MASK mask)
 {
 	if(mMediaSource)
 	{		
-		mouseMove(
-			llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()),
-			llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()),
-			mask);
+		// scale x and y to texel units.
+		S32 x = llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth());
+		S32 y = llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight());
+
+		// Adjust for the difference between the actual texture height and the amount of the texture in use.
+		y -= (mMediaSource->getTextureHeight() - mMediaSource->getHeight());
+
+		mouseMove(x, y, mask);
 	}
 }
 
-- 
GitLab


From d181b84dfdce83d1999d086c3eda2cdc51849a11 Mon Sep 17 00:00:00 2001
From: Leyla Farazha <leyla@lindenlab.com>
Date: Tue, 10 Nov 2009 17:10:47 -0800
Subject: [PATCH 081/557] EXT-1478   	 Tool-tip background and border colors
 are being ignored EXT-2082   	 Multifloater preview tab container extends
 outside window border EXT-773   	 odd notecard behaviour on closing an
 unsaved notcard reviewed by Richard

---
 indra/llui/llstyle.cpp                        |  1 +
 indra/llui/llstyle.h                          |  7 ++-
 indra/llui/lltabcontainer.cpp                 | 41 +++++++----------
 indra/llui/lltextbase.cpp                     |  5 +-
 indra/llui/lltexteditor.cpp                   |  3 +-
 indra/llui/lltooltip.cpp                      |  4 ++
 indra/llui/lltooltip.h                        |  6 +++
 indra/llui/lluiimage.cpp                      |  7 +++
 indra/newview/lltoolpie.cpp                   | 46 +++++++++++--------
 .../default/xui/en/widgets/inspector.xml      |  8 ++++
 10 files changed, 80 insertions(+), 48 deletions(-)
 create mode 100644 indra/newview/skins/default/xui/en/widgets/inspector.xml

diff --git a/indra/llui/llstyle.cpp b/indra/llui/llstyle.cpp
index fd3f88d1f61..71511f69a41 100644
--- a/indra/llui/llstyle.cpp
+++ b/indra/llui/llstyle.cpp
@@ -51,6 +51,7 @@ LLStyle::Params::Params()
 LLStyle::LLStyle(const LLStyle::Params& p)
 :	mVisible(p.visible),
 	mColor(p.color()),
+	mReadOnlyColor(p.readonly_color()),
 	mFont(p.font()),
 	mLink(p.link_href),
 	mDropShadow(p.drop_shadow),
diff --git a/indra/llui/llstyle.h b/indra/llui/llstyle.h
index c7699641366..ee9ca730e94 100644
--- a/indra/llui/llstyle.h
+++ b/indra/llui/llstyle.h
@@ -46,7 +46,8 @@ class LLStyle : public LLRefCount
 	{
 		Optional<bool>					visible;
 		Optional<LLFontGL::ShadowType>	drop_shadow;
-		Optional<LLUIColor>				color;
+		Optional<LLUIColor>				color,
+										readonly_color;
 		Optional<const LLFontGL*>		font;
 		Optional<LLUIImage*>			image;
 		Optional<std::string>			link_href;
@@ -57,6 +58,8 @@ class LLStyle : public LLRefCount
 	const LLColor4& getColor() const { return mColor; }
 	void setColor(const LLColor4 &color) { mColor = color; }
 
+	const LLColor4& getReadOnlyColor() const { return mReadOnlyColor; }
+
 	BOOL isVisible() const;
 	void setVisible(BOOL is_visible);
 
@@ -81,6 +84,7 @@ class LLStyle : public LLRefCount
 		return 
 			mVisible == rhs.mVisible
 			&& mColor == rhs.mColor
+			&& mReadOnlyColor == rhs.mReadOnlyColor
 			&& mFont == rhs.mFont
 			&& mLink == rhs.mLink
 			&& mImagep == rhs.mImagep
@@ -104,6 +108,7 @@ class LLStyle : public LLRefCount
 private:
 	BOOL		mVisible;
 	LLUIColor	mColor;
+	LLUIColor   mReadOnlyColor;
 	std::string	mFontName;
 	const LLFontGL*   mFont;		// cached for performance
 	std::string	mLink;
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index b67f753d394..44eff8d357c 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -346,7 +346,13 @@ void LLTabContainer::draw()
 		}
 	}
 
-	LLPanel::draw();
+	{
+		LLRect clip_rect = getLocalRect();
+		clip_rect.mLeft+=(LLPANEL_BORDER_WIDTH + 2);
+		clip_rect.mRight-=(LLPANEL_BORDER_WIDTH + 2);
+		LLLocalClipRect clip(clip_rect);
+		LLPanel::draw();
+	}
 
 	// if tabs are hidden, don't draw them and leave them in the invisible state
 	if (!getTabsHidden())
@@ -358,24 +364,6 @@ void LLTabContainer::draw()
 			tuple->mButton->setVisible( TRUE );
 		}
 
-		// Draw some of the buttons...
-		LLRect clip_rect = getLocalRect();
-		if (has_scroll_arrows)
-		{
-			// ...but clip them.
-			if (mIsVertical)
-			{
-				clip_rect.mBottom = mNextArrowBtn->getRect().mTop + 3*tabcntrv_pad;
-				clip_rect.mTop = mPrevArrowBtn->getRect().mBottom - 3*tabcntrv_pad;
-			}
-			else
-			{
-				clip_rect.mLeft = mPrevArrowBtn->getRect().mRight;
-				clip_rect.mRight = mNextArrowBtn->getRect().mLeft;
-			}
-		}
-		LLLocalClipRect clip(clip_rect);
-
 		S32 max_scroll_visible = getTabCount() - getMaxScrollPos() + getScrollPos();
 		S32 idx = 0;
 		for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)
@@ -403,7 +391,7 @@ void LLTabContainer::draw()
 						mNextArrowBtn->setFlashing( TRUE );
 					}
 				}
-			}
+			}
 
 			idx++;
 		}
@@ -1039,6 +1027,11 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
 	{
 		LLUICtrl::addChild(child, 1);
 	}
+
+	sendChildToFront(mPrevArrowBtn);
+	sendChildToFront(mNextArrowBtn);
+	sendChildToFront(mJumpPrevArrowBtn);
+	sendChildToFront(mJumpNextArrowBtn);
 	
 	if( select )
 	{
@@ -1672,23 +1665,23 @@ void LLTabContainer::initButtons()
 		S32 btn_top = (getTabPosition() == TOP ) ? getRect().getHeight() - getTopBorderHeight() : tabcntr_arrow_btn_size + 1;
 
 		LLRect left_arrow_btn_rect;
-		left_arrow_btn_rect.setLeftTopAndSize( LLPANEL_BORDER_WIDTH+1+tabcntr_arrow_btn_size, btn_top + arrow_fudge, tabcntr_arrow_btn_size, tabcntr_arrow_btn_size );
+		left_arrow_btn_rect.setLeftTopAndSize( LLPANEL_BORDER_WIDTH+1+tabcntr_arrow_btn_size, btn_top + arrow_fudge, tabcntr_arrow_btn_size, mTabHeight );
 
 		LLRect jump_left_arrow_btn_rect;
-		jump_left_arrow_btn_rect.setLeftTopAndSize( LLPANEL_BORDER_WIDTH+1, btn_top + arrow_fudge, tabcntr_arrow_btn_size, tabcntr_arrow_btn_size );
+		jump_left_arrow_btn_rect.setLeftTopAndSize( LLPANEL_BORDER_WIDTH+1, btn_top + arrow_fudge, tabcntr_arrow_btn_size, mTabHeight );
 
 		S32 right_pad = tabcntr_arrow_btn_size + LLPANEL_BORDER_WIDTH + 1;
 
 		LLRect right_arrow_btn_rect;
 		right_arrow_btn_rect.setLeftTopAndSize( getRect().getWidth() - mRightTabBtnOffset - right_pad - tabcntr_arrow_btn_size,
 												btn_top + arrow_fudge,
-												tabcntr_arrow_btn_size, tabcntr_arrow_btn_size );
+												tabcntr_arrow_btn_size, mTabHeight );
 
 
 		LLRect jump_right_arrow_btn_rect;
 		jump_right_arrow_btn_rect.setLeftTopAndSize( getRect().getWidth() - mRightTabBtnOffset - right_pad,
 													 btn_top + arrow_fudge,
-													 tabcntr_arrow_btn_size, tabcntr_arrow_btn_size );
+													 tabcntr_arrow_btn_size, mTabHeight );
 
 		LLButton::Params p;
 		p.name(std::string("Jump Left Arrow"));
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 97ba6913418..8d36c9c616e 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -286,8 +286,7 @@ bool LLTextBase::truncate()
 
 LLStyle::Params LLTextBase::getDefaultStyle()
 {
-	LLColor4 text_color = ( mReadOnly ? mReadOnlyFgColor.get() : mFgColor.get() );
-	return LLStyle::Params().color(text_color).font(mDefaultFont).drop_shadow(mFontShadow);
+	return LLStyle::Params().color(mFgColor.get()).readonly_color(mReadOnlyFgColor.get()).font(mDefaultFont).drop_shadow(mFontShadow);
 }
 
 void LLTextBase::onValueChange(S32 start, S32 end)
@@ -2232,7 +2231,7 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
 
 	const LLFontGL* font = mStyle->getFont();
 
-	LLColor4 color = mStyle->getColor() % alpha;
+	LLColor4 color = (mEditor.getReadOnly() ? mStyle->getReadOnlyColor() : mStyle->getColor())  % alpha;
 
 	font = mStyle->getFont();
 
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 3ce5a0320be..d136c6b49d6 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -2005,7 +2005,8 @@ void LLTextEditor::setEnabled(BOOL enabled)
 	bool read_only = !enabled;
 	if (read_only != mReadOnly)
 	{
-		mReadOnly = read_only;
+		//mReadOnly = read_only;
+		LLTextBase::setReadOnly(read_only);
 		updateSegments();
 		updateAllowingLanguageInput();
 	}
diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
index 4bc9a9c0426..4431b2da487 100644
--- a/indra/llui/lltooltip.cpp
+++ b/indra/llui/lltooltip.cpp
@@ -137,6 +137,10 @@ void LLToolTipView::drawStickyRect()
 {
 	gl_rect_2d(LLToolTipMgr::instance().getMouseNearRect(), LLColor4::white, false);
 }
+
+// defaults for floater param block pulled from widgets/floater.xml
+static LLWidgetNameRegistry::StaticRegistrar sRegisterInspectorParams(&typeid(LLInspector::Params), "inspector");
+
 //
 // LLToolTip
 //
diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h
index 30d251266c0..774ca507c15 100644
--- a/indra/llui/lltooltip.h
+++ b/indra/llui/lltooltip.h
@@ -116,6 +116,12 @@ class LLToolTip : public LLPanel
 	S32				mPadding;	// pixels
 };
 
+// used for the inspector tooltips which need different background images etc.
+class LLInspector : public LLToolTip
+{
+public:
+	struct Params : public LLInitParam::Block<Params, LLToolTip::Params> {};
+};
 
 class LLToolTipMgr : public LLSingleton<LLToolTipMgr>
 {
diff --git a/indra/llui/lluiimage.cpp b/indra/llui/lluiimage.cpp
index 6c1a32722f1..a8683e55c35 100644
--- a/indra/llui/lluiimage.cpp
+++ b/indra/llui/lluiimage.cpp
@@ -142,6 +142,13 @@ namespace LLInitParam
 {
 	LLUIImage* TypedParam<LLUIImage*>::getValueFromBlock() const
 	{
+		// The keyword "none" is specifically requesting a null image
+		// do not default to current value. Used to overwrite template images. 
+		if (name() == "none")
+		{
+			return NULL;
+		}
+
 		LLUIImage* imagep =  LLUI::getUIImage(name());
 		if (!imagep)
 		{
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 93da32b115f..d49ea5109dd 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -700,13 +700,17 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask)
 
 				// *HACK: We may select this object, so pretend it was clicked
 				mPick = mHoverPick;
-				LLToolTipMgr::instance().show(LLToolTip::Params()
-					.message(avatar_name)
-					.image(LLUI::getUIImage("Info"))
-					.click_callback(boost::bind(showAvatarInspector, hover_object->getID()))
-					.visible_time_near(6.f)
-					.visible_time_far(3.f)
-					.wrap(false));
+				LLInspector::Params p;
+				p.message(avatar_name);
+				p.image(LLUI::getUIImage("Info"));
+				p.click_callback(boost::bind(showAvatarInspector, hover_object->getID()));
+				p.visible_time_near(6.f);
+				p.visible_time_far(3.f);
+				p.wrap(false);
+
+				p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
+				
+				LLToolTipMgr::instance().show(p);
 			}
 		}
 		else
@@ -787,18 +791,22 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask)
 				{
 					// We may select this object, so pretend it was clicked
 					mPick = mHoverPick;
-					LLToolTipMgr::instance().show(LLToolTip::Params()
-						.message(tooltip_msg)
-						.image(LLUI::getUIImage("Info_Off"))
-						.click_callback(boost::bind(showObjectInspector, hover_object->getID(), mHoverPick.mObjectFace))
-						.time_based_media(is_time_based_media)
-						.web_based_media(is_web_based_media)						  
-						.media_playing(is_media_playing)						  
-						.click_playmedia_callback(boost::bind(playCurrentMedia, mHoverPick))
-						.click_homepage_callback(boost::bind(VisitHomePage, mHoverPick))						
-						.visible_time_near(6.f)
-						.visible_time_far(3.f)
-						.wrap(false));
+					LLInspector::Params p;
+					p.message(tooltip_msg);
+					p.image(LLUI::getUIImage("Info_Off"));
+					p.click_callback(boost::bind(showObjectInspector, hover_object->getID(), mHoverPick.mObjectFace));
+					p.time_based_media(is_time_based_media);
+					p.web_based_media(is_web_based_media);
+					p.media_playing(is_media_playing);
+					p.click_playmedia_callback(boost::bind(playCurrentMedia, mHoverPick));
+					p.click_homepage_callback(boost::bind(VisitHomePage, mHoverPick));
+					p.visible_time_near(6.f);
+					p.visible_time_far(3.f);
+					p.wrap(false);
+
+					p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
+					
+					LLToolTipMgr::instance().show(p);
 				}
 			}
 		}
diff --git a/indra/newview/skins/default/xui/en/widgets/inspector.xml b/indra/newview/skins/default/xui/en/widgets/inspector.xml
new file mode 100644
index 00000000000..61950d7554e
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/inspector.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- See also settings.xml UIFloater* settings for configuration -->
+<inspector name="inspector"
+          bg_opaque_color="ToolTipBgColor"
+          background_visible="true"
+          bg_opaque_image="none"
+          bg_alpha_image="none"
+ />
-- 
GitLab


From fb20a7281d8e5107f83e7439df054ccd3733d0c4 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Tue, 10 Nov 2009 17:12:07 -0800
Subject: [PATCH 082/557] EXT-2338 Move button tooltips to strings the viewer
 translation tool can parse. Also moved mSpeakBtn from llnearbychatbar to
 llbottomtray, because the bottom tray is its parent.

---
 indra/newview/llbottomtray.cpp                | 36 +++++++++++++++++++
 indra/newview/llbottomtray.h                  |  7 +++-
 indra/newview/llnearbychatbar.cpp             | 30 ----------------
 indra/newview/llnearbychatbar.h               | 10 ------
 indra/newview/llspeakbutton.cpp               | 10 ++++++
 indra/newview/llspeakbutton.h                 |  5 +++
 .../skins/default/xui/en/panel_bottomtray.xml |  6 ++--
 7 files changed, 60 insertions(+), 44 deletions(-)

diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 832694873f9..9ea8b53d3d4 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -40,6 +40,7 @@
 #include "llimfloater.h" // for LLIMFloater
 #include "lllayoutstack.h"
 #include "llnearbychatbar.h"
+#include "llspeakbutton.h"
 #include "llsplitbutton.h"
 #include "llsyswellwindow.h"
 #include "llfloatercamera.h"
@@ -181,6 +182,28 @@ void LLBottomTray::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID&
 	}
 }
 
+// virtual
+void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, bool proximal)
+{
+	// Time it takes to connect to voice channel might be pretty long,
+	// so don't expect user login or STATUS_VOICE_ENABLED to be followed by STATUS_JOINED.
+	BOOL enable = FALSE;
+
+	switch (status)
+	{
+	// Do not add STATUS_VOICE_ENABLED because voice chat is 
+	// inactive until STATUS_JOINED
+	case STATUS_JOINED:
+		enable = TRUE;
+		break;
+	default:
+		enable = FALSE;
+		break;
+	}
+
+	mSpeakBtn->setEnabled(enable);
+}
+
 //virtual
 void LLBottomTray::onFocusLost()
 {
@@ -275,6 +298,19 @@ BOOL LLBottomTray::postBuild()
 	mSnapshotPanel = getChild<LLPanel>("snapshot_panel");
 	setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4));
 
+	mSpeakBtn = getChild<LLSpeakButton>("talk");
+
+	// Speak button should be initially disabled because
+	// it takes some time between logging in to world and connecting to voice channel.
+	mSpeakBtn->setEnabled(FALSE);
+
+	// Localization tool doesn't understand custom buttons like <talk_button>
+	mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") );
+	mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") );
+
+	// Registering Chat Bar to receive Voice client status change notifications.
+	gVoiceClient->addObserver(this);
+
 	if (mChicletPanel && mToolbarStack && mNearbyChatBar)
 	{
 		verifyChildControlsSizes();
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 02588a1975f..3f6d0756dec 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -33,7 +33,7 @@
 #ifndef LL_LLBOTTOMPANEL_H
 #define LL_LLBOTTOMPANEL_H
 
-#include <llmenugl.h>
+#include "llmenugl.h"
 
 #include "llpanel.h"
 #include "llimview.h"
@@ -51,6 +51,7 @@ class LLBottomTray
 	: public LLSingleton<LLBottomTray>
 	, public LLPanel
 	, public LLIMSessionObserver
+	, public LLVoiceClientStatusObserver
 {
 	friend class LLSingleton<LLBottomTray>;
 public:
@@ -74,6 +75,10 @@ class LLBottomTray
 	virtual void onFocusLost();
 	virtual void setVisible(BOOL visible);
 
+	// Implements LLVoiceClientStatusObserver::onChange() to enable the speak
+	// button when voice is available
+	/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
+
 	void showBottomTrayContextMenu(S32 x, S32 y, MASK mask);
 
 	void showGestureButton(BOOL visible);
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index d54545971bb..dfeade2e4d5 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -36,7 +36,6 @@
 #include "lltrans.h"
 
 #include "llnearbychatbar.h"
-#include "llspeakbutton.h"
 #include "llbottomtray.h"
 #include "llagent.h"
 #include "llgesturemgr.h"
@@ -234,14 +233,6 @@ BOOL LLNearbyChatBar::postBuild()
 
 	mOutputMonitor = getChild<LLOutputMonitorCtrl>("chat_zone_indicator");
 	mOutputMonitor->setVisible(FALSE);
-	mSpeakBtn = getParent()->getChild<LLSpeakButton>("talk");
-
-	// Speak button should be initially disabled because
-	// it takes some time between logging in to world and connecting to voice channel.
-	mSpeakBtn->setEnabled(FALSE);
-
-	// Registering Chat Bar to receive Voice client status change notifications.
-	gVoiceClient->addObserver(this);
 
 	return TRUE;
 }
@@ -730,27 +721,6 @@ class LLChatHandler : public LLCommandHandler
 	}
 };
 
-void LLNearbyChatBar::onChange(EStatusType status, const std::string &channelURI, bool proximal)
-{
-	// Time it takes to connect to voice channel might be pretty long,
-	// so don't expect user login or STATUS_VOICE_ENABLED to be followed by STATUS_JOINED.
-	BOOL enable = FALSE;
-
-	switch (status)
-	{
-	// Do not add STATUS_VOICE_ENABLED because voice chat is 
-	// inactive until STATUS_JOINED
-	case STATUS_JOINED:
-		enable = TRUE;
-		break;
-	default:
-		enable = FALSE;
-		break;
-	}
-
-	mSpeakBtn->setEnabled(enable);
-}
-
 // Creating the object registers with the dispatcher.
 LLChatHandler gChatHandler;
 
diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h
index 56ee706a974..224118e088d 100644
--- a/indra/newview/llnearbychatbar.h
+++ b/indra/newview/llnearbychatbar.h
@@ -42,9 +42,6 @@
 #include "llspeakers.h"
 
 
-class LLSpeakButton;
-
-
 class LLGestureComboBox
 	: public LLComboBox
 	, public LLGestureManagerObserver
@@ -76,7 +73,6 @@ class LLGestureComboBox
 
 class LLNearbyChatBar
 :	public LLPanel
-,   public LLVoiceClientStatusObserver
 {
 public:
 	// constructor for inline chat-bars (e.g. hosted in chat history window)
@@ -105,11 +101,6 @@ class LLNearbyChatBar
 	S32 getMinWidth() const;
 	S32 getMaxWidth() const;
 
-	/**
-	 * Implements LLVoiceClientStatusObserver::onChange()
-	 */
-	/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
-
 protected:
 	static BOOL matchChatTypeTrigger(const std::string& in_str, std::string* out_str);
 	static void onChatBoxKeystroke(LLLineEditor* caller, void* userdata);
@@ -127,7 +118,6 @@ class LLNearbyChatBar
 	static S32 sLastSpecialChatChannel;
 
 	LLLineEditor*		mChatBox;
-	LLSpeakButton*		mSpeakBtn;
 	LLOutputMonitorCtrl* mOutputMonitor;
 	LLLocalSpeakerMgr*  mSpeakerMgr;
 };
diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp
index 57ea018f254..51d53b26740 100644
--- a/indra/newview/llspeakbutton.cpp
+++ b/indra/newview/llspeakbutton.cpp
@@ -133,6 +133,16 @@ LLSpeakButton::~LLSpeakButton()
 	LLTransientFloaterMgr::getInstance()->removeControlView(mShowBtn);
 }
 
+void LLSpeakButton::setSpeakToolTip(const std::string& msg)
+{
+	mSpeakBtn->setToolTip(msg);
+}
+
+void LLSpeakButton::setShowToolTip(const std::string& msg)
+{
+	mShowBtn->setToolTip(msg);
+}
+
 void LLSpeakButton::onMouseDown_SpeakBtn()
 {
 	bool down = true;
diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h
index e213c562dd8..02c8ab38909 100644
--- a/indra/newview/llspeakbutton.h
+++ b/indra/newview/llspeakbutton.h
@@ -62,6 +62,11 @@ class LLSpeakButton : public LLUICtrl
 	/*virtual*/ ~LLSpeakButton();
 	/*virtual*/ void draw();
 
+	// *HACK: Need to put tooltips in a translatable location,
+	// the panel that contains this button.
+	void setSpeakToolTip(const std::string& msg);
+	void setShowToolTip(const std::string& msg);
+
 protected:
 	friend class LLUICtrlFactory;
 	LLSpeakButton(const Params& p);
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 3fbc8e1afd8..e96d3a152fc 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -13,6 +13,8 @@
  chrome="true"
  border_visible="false"
  width="1000">
+  <string name="SpeakBtnToolTip">Turns microphone on/off</string>
+  <string name="VoiceControlBtnToolTip">Shows/hides voice control panel</string>
     <layout_stack
      mouse_opaque="false"
      border_size="0"
@@ -70,9 +72,7 @@
            left="0"
            name="talk"
            top="3"
-          width="100"
-          speak_button.tool_tip="Turns microphone on/off"
-          show_button.tool_tip="Shows/hides voice control panel" />
+          width="100" />
         </layout_panel>
         <icon
             auto_resize="false"
-- 
GitLab


From e2a0e9426f3ce81cf65e576a4e8bc787483bb26a Mon Sep 17 00:00:00 2001
From: Erica <erica@lindenlab.com>
Date: Tue, 10 Nov 2009 17:17:26 -0800
Subject: [PATCH 083/557] pushing changes to named font sizes prior to
 hardcoded font removal

---
 .../default/xui/en/floater_test_textbox.xml   | 92 +++++--------------
 indra/newview/skins/default/xui/en/fonts.xml  |  8 +-
 2 files changed, 28 insertions(+), 72 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_test_textbox.xml b/indra/newview/skins/default/xui/en/floater_test_textbox.xml
index 8dba05f1eeb..3aeb7c93e7f 100644
--- a/indra/newview/skins/default/xui/en/floater_test_textbox.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_textbox.xml
@@ -10,83 +10,64 @@
     <text
      type="string"
      length="1"
-     height="10"
-     layout="topleft"
-     left="10"
-     top="30"
-     width="300">
-        Bottom and left specified
-    </text>
-    <text
-     type="string"
-     length="1"
-     height="10"
-     layout="topleft"
-     left_delta="200"
-     top_delta="0"
-     width="300">
-        Bottom delta left delta
-    </text>
-    <text
-     type="string"
-     length="1"
-     height="10"
+     height="90"
      layout="topleft"
      left="10"
-     top="50"
-     width="300">
-        Bottom delta -20
-    </text>
-    <text
-     type="string"
-     length="1"
-     height="10"
-     layout="topleft"
-     left_delta="0"
      top_pad="30"
      width="300">
         First line of multiple lines
-    Second line of multiple lines
+Second line of multiple lines
+Third line of multiple lines
+Fourth line of multiple lines
+Fifth line of multiple lines
     </text>
       <text
        top_pad="10"
        left="10"
-       right="-10" 
+       right="-10"
+       height="20"
        follows="top|left"
        font.name="SansSerifSmall"
        name="test_text10"
        tool_tip="text">
-        SansSerifSmall. Русский 中文 (简体) The quick brown fox jumped over the lazy dog.
+        SansSerifSmall
+The 华文细黑 brown fox ヒラキjumped over the lazy dog.
       </text>
       <text
        top_pad="10"
        left="10"
-       right="-10" 
+       right="-10"
+       height="25"
        follows="top|left"
-       font.name="SansSerif"
+       font.name="SansSerifMedium"
        name="test_text11"
        tool_tip="text">
-        SansSerif.  Русский 中文 (简体) The quick brown fox jumped over the lazy dog.
+        SansSerif
+The 华文细黑 brown fox ヒラキjumped over the lazy dog.
       </text>
       <text
        top_pad="10"
        left="10"
-       right="-10" 
+       right="-10"
        follows="top|left"
+       height="26"
        font.name="SansSerifLarge"
        name="test_text12"
        tool_tip="text">
-        SansSerifLarge.  Русский 中文 (简体) The quick brown fox jumped over the lazy dog.
+        SansSerifLarge
+The 华文细黑 brown fox ヒラキjumped over the lazy dog.
       </text>
       <text
        top_pad="10"
        left="10"
-       right="-10" 
+       height="35"
+       right="-10"
        follows="top|left"
        font.name="SansSerifHuge"
        name="test_text13"
        tool_tip="text">
-        SansSerifHuge.  Русский 中文 (简体) The quick brown fox jumped over the lazy dog.
+        SansSerifHuge
+The 华文细黑 brown fox ヒラキjumped over the lazy dog.
       </text>
     <text
      type="string"
@@ -112,27 +93,6 @@
      width="300">
       SansSerif BOLD UNDERLINE
     </text>
-    <text
-     type="string"
-     length="1"
-     font="SansSerif"
-     height="10"
-     layout="topleft"
-     left_delta="0"
-     top_pad="10"
-     width="300">
-      SansSerif UNDERLINE
-    </text>
-    <text
-     type="string"
-     length="1"
-     height="10"
-     layout="topleft"
-     left_delta="0"
-     top_pad="10"
-     width="300">
-        Escaped greater than &gt;
-    </text>
     <text
    type="string"
    length="1"
@@ -142,8 +102,7 @@
    left="10"
    name="right_aligned_text"
    width="380"
-   halign="right" 
-   text_color="1 1 1 0.7"
+   halign="right"
    top_pad="10">
     Right aligned text
   </text>
@@ -157,21 +116,19 @@
  name="centered_text"
  width="380"
  halign="center"
- text_color="1 1 1 0.7"
  top_pad="10">
     Centered text
   </text>
   <text
  type="string"
  length="1"
- height="60" 
+ height="60"
  label="N"
  layout="topleft"
  left="10"
  name="left_aligned_text"
  width="380"
  halign="left"
- text_color="1 1 1 0.7"
  top_pad="10">
     Left aligned text
   </text>
@@ -184,7 +141,6 @@
    left="10"
    name="floater_map_north"
    right="30"
-   text_color="1 1 1 0.7"
    top="370">
     N
   </text>
diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml
index f3da62a8964..ebbb53729d2 100644
--- a/indra/newview/skins/default/xui/en/fonts.xml
+++ b/indra/newview/skins/default/xui/en/fonts.xml
@@ -144,18 +144,18 @@
 	     />
   <font_size name="Huge"
 	     comment="Size of huge font (points, or 1/72 of an inch)"
-	     size="15.0"
+	     size="16.0"
 	     />
   <font_size name="Large"
 	     comment="Size of large font (points, or 1/72 of an inch)"
-	     size="10.0"
+	     size="10.6"
 	     />
   <font_size name="Medium"
 	     comment="Size of medium font (points, or 1/72 of an inch)"
-	     size="9.0"
+	     size="8.6"
 	     />
   <font_size name="Small"
 	     comment="Size of small font (points, or 1/72 of an inch)"
-	     size="7.8"
+	     size="7.6"
 	     />
 </fonts>
-- 
GitLab


From 353ac3969efc5bda81b34f4edb3756dd6ced0412 Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Tue, 10 Nov 2009 17:24:02 -0800
Subject: [PATCH 084/557] FIX DEV-41991: do not allow media settings panel to
 come up if media data is in flight Review #33

This change marks the current selection "not editable" if
any objects in the selection are currently "in flight" (i.e.
their media data has not been fetched yet, or is in the
process of being fetched).  This involved adding API to
LLMediaDataClient to query whether an object is in the
process of being fetched (i.e. in the queue).  I've added
a unit test for this new API.
---
 indra/newview/llfloatertools.cpp              | 41 +++++++++++++++----
 indra/newview/llmediadataclient.cpp           | 21 ++++++++++
 indra/newview/llmediadataclient.h             |  8 +++-
 indra/newview/llvovolume.cpp                  |  8 ++++
 indra/newview/llvovolume.h                    |  5 ++-
 .../newview/tests/llmediadataclient_test.cpp  | 35 +++++++++++++++-
 6 files changed, 107 insertions(+), 11 deletions(-)

diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 3aef15a35c0..3c3dfb760ee 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -86,6 +86,7 @@
 #include "llviewermenu.h"
 #include "llviewerparcelmgr.h"
 #include "llviewerwindow.h"
+#include "llvovolume.h"
 #include "lluictrlfactory.h"
 
 // Globals
@@ -1079,21 +1080,45 @@ void LLFloaterTools::getMediaState()
 	}
 	
 	bool editable = (first_object->permModify() || selectedMediaEditable());
-	
+
+	// Check modify permissions and whether any selected objects are in
+	// the process of being fetched.  If they are, then we're not editable
+	if (editable)
+	{
+		LLObjectSelection::iterator iter = selected_objects->begin(); 
+		LLObjectSelection::iterator end = selected_objects->end();
+		for ( ; iter != end; ++iter)
+		{
+			LLSelectNode* node = *iter;
+			LLVOVolume* object = dynamic_cast<LLVOVolume*>(node->getObject());
+			if (NULL != object)
+			{
+				if (!object->permModify() || object->isMediaDataBeingFetched())
+				{
+					editable = false;
+					break;
+				}
+			}
+		}
+	}
+
 	// Media settings
-	U8 has_media = (U8)0;
-	struct media_functor : public LLSelectedTEGetFunctor<U8>
+	bool bool_has_media = false;
+	struct media_functor : public LLSelectedTEGetFunctor<bool>
 	{
-		U8 get(LLViewerObject* object, S32 face)
+		bool get(LLViewerObject* object, S32 face)
 		{
-			return (object->getTE(face)->getMediaTexGen());
+			LLTextureEntry *te = object->getTE(face);
+			if (te)
+			{
+				return te->hasMedia();
+			}
+			return false;
 		}
 	} func;
 	
 	// check if all faces have media(or, all dont have media)
-	LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo = selected_objects->getSelectedTEValue( &func, has_media );
-	bool bool_has_media = (has_media & LLTextureEntry::MF_HAS_MEDIA);
-
+	LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo = selected_objects->getSelectedTEValue( &func, bool_has_media );
 	
 	const LLMediaEntry default_media_data;
 	
diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp
index 512104a2f42..986c14acff7 100755
--- a/indra/newview/llmediadataclient.cpp
+++ b/indra/newview/llmediadataclient.cpp
@@ -324,6 +324,22 @@ std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::PriorityQueue
 	return s;
 }
 
+// find the given object in the queue.
+bool LLMediaDataClient::PriorityQueue::find(const LLMediaDataClientObject::ptr_t &obj) const
+{
+	std::vector<LLMediaDataClient::request_ptr_t>::const_iterator iter = c.begin();
+	std::vector<LLMediaDataClient::request_ptr_t>::const_iterator end = c.end();
+	while (iter < end)
+	{
+		if (obj->getID() == (*iter)->getObject()->getID())
+		{
+			return true;
+		}
+		iter++;
+	}
+	return false;
+}
+
 //////////////////////////////////////////////////////////////////////////////////////
 //
 // LLMediaDataClient::QueueTimer
@@ -491,6 +507,11 @@ bool LLMediaDataClient::isEmpty() const
 	return (NULL == pRequestQueue) ? true : pRequestQueue->empty();
 }
 
+bool LLMediaDataClient::isInQueue(const LLMediaDataClientObject::ptr_t &object) const
+{
+	return (NULL == pRequestQueue) ? false : pRequestQueue->find(object);
+}
+
 //////////////////////////////////////////////////////////////////////////////////////
 //
 // LLObjectMediaDataClient
diff --git a/indra/newview/llmediadataclient.h b/indra/newview/llmediadataclient.h
index 9d0aa0981e7..0d1450ffbe5 100755
--- a/indra/newview/llmediadataclient.h
+++ b/indra/newview/llmediadataclient.h
@@ -89,7 +89,10 @@ class LLMediaDataClient : public LLRefCount
 	F32 getRetryTimerDelay() const { return mRetryTimerDelay; }
 	
 	// Returns true iff the queue is empty
-	bool isEmpty() const; 
+	bool isEmpty() const;
+	
+	// Returns true iff the given object is in the queue
+	bool isInQueue(const LLMediaDataClientObject::ptr_t &object) const;
 	
 protected:
 	// Destructor
@@ -206,6 +209,9 @@ class LLMediaDataClient : public LLRefCount
 		Comparator >
 	{
 	public:
+		// Return whether the given object is in the queue
+		bool find(const LLMediaDataClientObject::ptr_t &obj) const;
+		
 		friend std::ostream& operator<<(std::ostream &s, const PriorityQueue &q);
 	};
     
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 5ac6dcce5a9..2def905bbba 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -109,6 +109,7 @@ class LLMediaDataClientObjectImpl : public LLMediaDataClientObject
 				{
 					result = te->getMediaData()->asLLSD();
 					// XXX HACK: workaround bug in asLLSD() where whitelist is not set properly
+					// See DEV-41949
 					if (!result.has(LLMediaEntry::WHITELIST_KEY))
 					{
 						result[LLMediaEntry::WHITELIST_KEY] = LLSD::emptyArray();
@@ -1668,6 +1669,13 @@ void LLVOVolume::requestMediaDataUpdate()
     sObjectMediaClient->fetchMedia(new LLMediaDataClientObjectImpl(this));
 }
 
+bool LLVOVolume::isMediaDataBeingFetched() const
+{
+	// I know what I'm doing by const_casting this away: this is just 
+	// a wrapper class that is only going to do a lookup.
+	return sObjectMediaClient->isInQueue(new LLMediaDataClientObjectImpl(const_cast<LLVOVolume*>(this)));
+}
+
 void LLVOVolume::cleanUpMediaImpls()
 {
 	// Iterate through our TEs and remove any Impls that are no longer used
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 784ef16ba36..10fc8865fc5 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -265,7 +265,10 @@ class LLVOVolume : public LLViewerObject
 	bool hasMedia() const;
 	
 	LLVector3 getApproximateFaceNormal(U8 face_id);
-
+	
+	// Returns 'true' iff the media data for this object is in flight
+	bool isMediaDataBeingFetched() const;
+	
 protected:
 	S32	computeLODDetail(F32	distance, F32 radius);
 	BOOL calcLOD();
diff --git a/indra/newview/tests/llmediadataclient_test.cpp b/indra/newview/tests/llmediadataclient_test.cpp
index 445ec7aa344..3ac631d96e3 100644
--- a/indra/newview/tests/llmediadataclient_test.cpp
+++ b/indra/newview/tests/llmediadataclient_test.cpp
@@ -497,5 +497,38 @@ namespace tut
 		ensure("REF COUNT", o->getNumRefs(), 1);
     }
 
-	
+	template<> template<>
+    void mediadataclient_object_t::test<7>()
+    {
+		// Test LLMediaDataClient::isInQueue()
+		LOG_TEST(7);
+		
+		LLMediaDataClientObject::ptr_t o1 = new LLMediaDataClientObjectTest(
+			_DATA(VALID_OBJECT_ID_1,"3.0","1.0"));
+		LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest(
+			_DATA(VALID_OBJECT_ID_2,"1.0","1.0"));
+		int num_refs_start = o1->getNumRefs();
+		{
+			LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD);
+			
+			ensure("not in queue yet 1", ! mdc->isInQueue(o1));
+			ensure("not in queue yet 2", ! mdc->isInQueue(o2));
+			
+			mdc->fetchMedia(o1);
+			
+			ensure("is in queue", mdc->isInQueue(o1));
+			ensure("is not in queue", ! mdc->isInQueue(o2));
+			
+			::pump_timers();
+			
+			ensure("not in queue anymore", ! mdc->isInQueue(o1));
+			ensure("still is not in queue", ! mdc->isInQueue(o2));
+			
+			ensure("queue empty", mdc->isEmpty());
+		}
+		
+		// Make sure everyone's destroyed properly
+		ensure("REF COUNT", o1->getNumRefs(), num_refs_start);
+		
+	}
 }
-- 
GitLab


From 8ec85a68acee6b600320b10eea2b9aa11e434e83 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Tue, 10 Nov 2009 18:47:03 -0800
Subject: [PATCH 085/557] Fix for DEV-42328 (Muting then Unmuting All Nearby
 Media resets nearby media to Home URL).

Fixed by having LLViewerMedia::updateMediaImpl() copy the media entry's current URL into the media impl's mMediaURL in the case where the impl has a non-empty media URL but the function doesn't do a navigate.
---
 indra/newview/llviewermedia.cpp | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 605861f1cb4..493457704bb 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -295,11 +295,21 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
 		}
 	}
 	
-	if(media_impl && needs_navigate)
+	if(media_impl)
 	{
 		std::string url = media_entry->getCurrentURL();
-			
-		media_impl->navigateTo(url, "", true, true);
+		if(needs_navigate)
+		{
+			media_impl->navigateTo(url, "", true, true);
+		}
+		else if(!media_impl->mMediaURL.empty() && (media_impl->mMediaURL != url))
+		{
+			// If we already have a non-empty media URL set and we aren't doing a navigate, update the media URL to match the media entry.
+			media_impl->mMediaURL = url;
+
+			// If this causes a navigate at some point (such as after a reload), it should be considered server-driven so it isn't broadcast.
+			media_impl->mNavigateServerRequest = true;
+		}
 	}
 	
 	return media_impl;
-- 
GitLab


From 37ac878ec06138e35507f0dd007556cc613ee08f Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Tue, 10 Nov 2009 19:52:58 -0800
Subject: [PATCH 086/557] Fix for Windows compile error.

---
 indra/llprimitive/tests/llmediaentry_test.cpp | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/indra/llprimitive/tests/llmediaentry_test.cpp b/indra/llprimitive/tests/llmediaentry_test.cpp
index dfac5f26c7d..277e370ca4b 100644
--- a/indra/llprimitive/tests/llmediaentry_test.cpp
+++ b/indra/llprimitive/tests/llmediaentry_test.cpp
@@ -9,7 +9,14 @@
 
 #include "linden_common.h"
 #include "lltut.h"
-#include "boost/lexical_cast.hpp"
+#if LL_WINDOWS
+#pragma warning (push)
+#pragma warning (disable : 4702) // boost::lexical_cast generates this warning
+#endif
+#include <boost/lexical_cast.hpp>
+#if LL_WINDOWS
+#pragma warning (pop)
+#endif
 #include "llstring.h"
 #include "llsdutil.h"
 #include "llsdserialize.h"
-- 
GitLab


From 3cfd8a7ae8fb760fccfc992d8185db7bb37ff4ec Mon Sep 17 00:00:00 2001
From: angela <angela@lindenlab.com>
Date: Wed, 11 Nov 2009 14:34:00 +0800
Subject: [PATCH 087/557] adding warning msg when fetching for folders with
 NULL uuid

---
 indra/newview/llinventorymodel.cpp | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 4b7e364cf93..e7d7eb19d0e 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -1271,8 +1271,11 @@ void LLInventoryModel::fetchInventoryResponder::error(U32 status, const std::str
 
 bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id)
 {
-	if(folder_id.isNull()) return false;
-	
+	if(folder_id.isNull()) 
+	{
+		llwarns << "Calling fetch descendents on NULL folder id!" << llendl;
+		return false;
+	}
 	LLViewerInventoryCategory* cat = getCategory(folder_id);
 	if(!cat)
 	{
-- 
GitLab


From d1f8328b1e3bc17b920dfc3f8bc1865dff19d039 Mon Sep 17 00:00:00 2001
From: angela <angela@lindenlab.com>
Date: Wed, 11 Nov 2009 16:16:14 +0800
Subject: [PATCH 088/557] EXT-2051 Add tooltip to inventory items showing their
 full names

---
 indra/newview/llinventorypanel.cpp       | 3 +++
 indra/newview/llpanelobjectinventory.cpp | 4 ++++
 2 files changed, 7 insertions(+)

diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 9a71e53441e..8a1d8ee2d44 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -139,6 +139,7 @@ BOOL LLInventoryPanel::postBuild()
 		p.name = getName();
 		p.rect = folder_rect;
 		p.parent_panel = this;
+		p.tool_tip = p.name;
 		mFolders = LLUICtrlFactory::create<LLFolderView>(p);
 		mFolders->setAllowMultiSelect(mAllowMultiSelect);
 	}
@@ -493,6 +494,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
 					p.icon = new_listener->getIcon();
 					p.root = mFolders;
 					p.listener = new_listener;
+					p.tool_tip = p.name;
 					LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(p);
 				
 					folderp->setItemSortOrder(mFolders->getSortOrder());
@@ -519,6 +521,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
 					params.root(mFolders);
 					params.listener(new_listener);
 					params.rect(LLRect (0, 0, 0, 0));
+					params.tool_tip = params.name;
 					itemp = LLUICtrlFactory::create<LLFolderViewItem> (params);
 				}
 			}
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index a5e9407a41f..b1fbf789c69 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -1570,6 +1570,7 @@ void LLPanelObjectInventory::reset()
 	p.name = "task inventory";
 	p.task_id = getTaskUUID();
 	p.parent_panel = this;
+	p.tool_tip= p.name;
 	mFolders = LLUICtrlFactory::create<LLFolderView>(p);
 	// this ensures that we never say "searching..." or "no items found"
 	mFolders->getFilter()->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS);
@@ -1711,6 +1712,7 @@ void LLPanelObjectInventory::createFolderViews(LLInventoryObject* inventory_root
 		p.icon_open = LLUI::getUIImage("Inv_FolderOpen");
 		p.root = mFolders;
 		p.listener = bridge;
+		p.tool_tip = p.name;
 		new_folder = LLUICtrlFactory::create<LLFolderViewFolder>(p);
 		new_folder->addToFolder(mFolders, mFolders);
 		new_folder->toggleOpen();
@@ -1751,6 +1753,7 @@ void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* invento
 				p.icon_open = LLUI::getUIImage("Inv_FolderOpen");
 				p.root = mFolders;
 				p.listener = bridge;
+				p.tool_tip = p.name;
 				view = LLUICtrlFactory::create<LLFolderViewFolder>(p);
 				child_categories.put(new obj_folder_pair(obj,
 														 (LLFolderViewFolder*)view));
@@ -1764,6 +1767,7 @@ void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* invento
 				params.root(mFolders);
 				params.listener(bridge);
 				params.rect(LLRect());
+				params.tool_tip = params.name;
 				view = LLUICtrlFactory::create<LLFolderViewItem> (params);
 			}
 			view->addToFolder(folder, mFolders);
-- 
GitLab


From 560ac281db6876a6173450a642cbe6b23d725d02 Mon Sep 17 00:00:00 2001
From: Andrew Polunin <apolunin@productengine.com>
Date: Wed, 11 Nov 2009 11:46:55 +0200
Subject: [PATCH 089/557] fixed minor bug EXT-2147 Group and Avatar Place
 Holder Icons defined in the specs should be used in place of currect
 placeholders

--HG--
branch : product-engine
---
 indra/newview/llavatariconctrl.cpp                     | 10 ++++++----
 indra/newview/llavatariconctrl.h                       |  3 ++-
 indra/newview/llchiclet.h                              |  3 ++-
 .../skins/default/xui/en/panel_avatar_list_item.xml    |  2 +-
 .../skins/default/xui/en/widgets/avatar_icon.xml       |  4 ++++
 5 files changed, 15 insertions(+), 7 deletions(-)
 create mode 100644 indra/newview/skins/default/xui/en/widgets/avatar_icon.xml

diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index 46902006a61..327d80ba34e 100644
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -143,7 +143,8 @@ void LLAvatarIconIDCache::remove	(const LLUUID& avatar_id)
 
 LLAvatarIconCtrl::Params::Params()
 :	avatar_id("avatar_id"),
-	draw_tooltip("draw_tooltip", true)
+	draw_tooltip("draw_tooltip", true),
+	default_icon_name("default_icon_name")
 {
 	name = "avatar_icon";
 }
@@ -151,7 +152,8 @@ LLAvatarIconCtrl::Params::Params()
 
 LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p)
 :	LLIconCtrl(p),
-	mDrawTooltip(p.draw_tooltip)
+	mDrawTooltip(p.draw_tooltip),
+	mDefaultIconName(p.default_icon_name)
 {
 	mPriority = LLViewerFetchedTexture::BOOST_ICON;
 	
@@ -193,7 +195,7 @@ LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p)
 	}
 	else
 	{
-		LLIconCtrl::setValue("default_profile_picture.j2c");
+		LLIconCtrl::setValue(mDefaultIconName);
 	}
 }
 
@@ -260,7 +262,7 @@ bool LLAvatarIconCtrl::updateFromCache()
 	}
 	else
 	{
-		LLIconCtrl::setValue("default_profile_picture.j2c");
+		LLIconCtrl::setValue(mDefaultIconName);
 	}
 
 	return true;
diff --git a/indra/newview/llavatariconctrl.h b/indra/newview/llavatariconctrl.h
index 5eb830df4bc..38616b7852e 100644
--- a/indra/newview/llavatariconctrl.h
+++ b/indra/newview/llavatariconctrl.h
@@ -74,6 +74,7 @@ class LLAvatarIconCtrl
 	{
 		Optional <LLUUID> avatar_id;
 		Optional <bool> draw_tooltip;
+		Optional <std::string> default_icon_name;
 		Params();
 	};
 	
@@ -106,7 +107,7 @@ class LLAvatarIconCtrl
 	std::string			mFirstName;
 	std::string			mLastName;
 	bool				mDrawTooltip;
-
+	std::string			mDefaultIconName;
 
 	bool updateFromCache();
 };
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index e7afd7f08e3..eab4a282f52 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -107,6 +107,7 @@ class LLChicletAvatarIconCtrl : public LLAvatarIconCtrl
 		{
 			draw_tooltip(FALSE);
 			mouse_opaque(FALSE);
+			default_icon_name("Generic_Person");
 		};
 	};
 
@@ -128,7 +129,7 @@ class LLChicletGroupIconCtrl : public LLIconCtrl
 		Optional<std::string> default_icon;
 
 		Params()
-		 : default_icon("default_icon", "default_land_picture.j2c")
+		 : default_icon("default_icon", "Generic_Group")
 		{
 		};
 	};
diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
index 0c426865310..2eaa3a94ee2 100644
--- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
@@ -30,7 +30,7 @@
     <avatar_icon
      follows="top|left"
      height="20"
-     image_name="smile.png"
+     default_icon_name="Generic_Person"
      layout="topleft"
      left="5"
      mouse_opaque="true"
diff --git a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml
new file mode 100644
index 00000000000..a35e2c3663c
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+
+<avatar_icon default_icon_name="Generic_Person_Large">
+</avatar_icon>
-- 
GitLab


From eed0b3460b8c417c152bbbf6b03b7f3d49255c53 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Wed, 11 Nov 2009 12:09:46 +0200
Subject: [PATCH 090/557] fixed EXT-2341 "Add Friend notification not shown",
 EXT-2351 "Friendship and Teleport offers no longer pop toast notifications";
 suppresed IM-floater on incoming offer and registerd offer handler in chiclet
 counter updater;

--HG--
branch : product-engine
---
 indra/newview/llchiclet.cpp                  | 1 +
 indra/newview/llnotificationofferhandler.cpp | 5 -----
 2 files changed, 1 insertion(+), 5 deletions(-)

diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 5402f88cd36..eda4bfaa786 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -103,6 +103,7 @@ LLNotificationChiclet::LLNotificationChiclet(const Params& p)
 	// connect counter handlers to the signals
 	connectCounterUpdatersToSignal("notify");
 	connectCounterUpdatersToSignal("groupnotify");
+	connectCounterUpdatersToSignal("offer");
 }
 
 LLNotificationChiclet::~LLNotificationChiclet()
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index 75ef5208e76..6305ca12aa4 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -95,14 +95,9 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
 		LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, notification->getPayload()["from_id"]);
 		if (!LLIMMgr::instance().hasSession(session_id))
 		{
-			// create session with faked type to avoid creating chicklets
 			session_id = LLIMMgr::instance().addSession(
 					notification->getSubstitutions()["NAME"], IM_NOTHING_SPECIAL,
 					notification->getPayload()["from_id"]);
-			if (session_id != LLUUID::null)
-			{
-				LLIMFloater::show(session_id);
-			}
 		}
 		LLIMMgr::instance().addMessage(session_id, LLUUID(),
 				notification->getSubstitutions()["NAME"],
-- 
GitLab


From 1e9cdef67cc98fb7b954aca87938cbcc34762035 Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Wed, 11 Nov 2009 13:03:06 +0200
Subject: [PATCH 091/557] Update for major task EXT-2251 - Implement panels for
 creating, editing and viewing Classifieds. Implemented "Map", "Teleport", and
 "Edit" buttons in Classified Info panel.

--HG--
branch : product-engine
---
 indra/newview/llpanelclassified.cpp | 25 ++++++++++++++++++++++++-
 indra/newview/llpanelclassified.h   |  9 +++++----
 indra/newview/llpanelpicks.cpp      |  1 +
 3 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index 5679233844c..67a27045013 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -1167,7 +1167,9 @@ LLPanelClassifiedInfo* LLPanelClassifiedInfo::create()
 
 BOOL LLPanelClassifiedInfo::postBuild()
 {
-	childSetAction("back_btn", boost::bind(&LLPanelClassifiedInfo::onExit, this), NULL);
+	childSetAction("back_btn", boost::bind(&LLPanelClassifiedInfo::onExit, this));
+	childSetAction("show_on_map_btn", boost::bind(&LLPanelClassifiedInfo::onMapClick, this));
+	childSetAction("teleport_btn", boost::bind(&LLPanelClassifiedInfo::onTeleportClick, this));
 
 	return TRUE;
 }
@@ -1177,6 +1179,11 @@ void LLPanelClassifiedInfo::setExitCallback(const commit_callback_t& cb)
 	getChild<LLButton>("back_btn")->setClickedCallback(cb);
 }
 
+void LLPanelClassifiedInfo::setEditClassifiedCallback(const commit_callback_t& cb)
+{
+	getChild<LLButton>("edit_btn")->setClickedCallback(cb);
+}
+
 void LLPanelClassifiedInfo::onOpen(const LLSD& key)
 {
 	LLUUID avatar_id = key["avatar_id"];
@@ -1216,6 +1223,7 @@ void LLPanelClassifiedInfo::processProperties(void* data, EAvatarProcessorType t
 			setDescription(c_info->description);
 			setSnapshotId(c_info->snapshot_id);
 			setParcelId(c_info->parcel_id);
+			setPosGlobal(c_info->pos_global);
 			setClassifiedLocation(createLocationText(c_info->parcel_name, c_info->sim_name, c_info->pos_global));
 			childSetValue("category", LLClassifiedInfo::sCategories[c_info->category]);
 
@@ -1325,6 +1333,21 @@ std::string LLPanelClassifiedInfo::createLocationText(
 	return location_text;
 }
 
+void LLPanelClassifiedInfo::onMapClick()
+{
+	LLFloaterWorldMap::getInstance()->trackLocation(getPosGlobal());
+	LLFloaterReg::showInstance("world_map", "center");
+}
+
+void LLPanelClassifiedInfo::onTeleportClick()
+{
+	if (!getPosGlobal().isExactlyZero())
+	{
+		gAgent.teleportViaLocation(getPosGlobal());
+		LLFloaterWorldMap::getInstance()->trackLocation(getPosGlobal());
+	}
+}
+
 void LLPanelClassifiedInfo::onExit()
 {
 	LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this);
diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h
index 187bdbb37e7..8b32495854b 100644
--- a/indra/newview/llpanelclassified.h
+++ b/indra/newview/llpanelclassified.h
@@ -249,7 +249,9 @@ class LLPanelClassifiedInfo : public LLPanel, public LLAvatarPropertiesObserver
 
 	void setInfoLoaded(bool loaded) { mInfoLoaded = loaded; }
 
-	virtual void setExitCallback(const commit_callback_t& cb);
+	void setExitCallback(const commit_callback_t& cb);
+
+	void setEditClassifiedCallback(const commit_callback_t& cb);
 
 protected:
 
@@ -264,9 +266,8 @@ class LLPanelClassifiedInfo : public LLPanel, public LLAvatarPropertiesObserver
 		const std::string& sim_name, 
 		const LLVector3d& pos_global);
 
-	void onClickMap();
-	void onClickTeleport();
-	void onClickBack();
+	void onMapClick();
+	void onTeleportClick();
 	void onExit();
 
 private:
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index c30658755ac..4be8f12e326 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -740,6 +740,7 @@ void LLPanelPicks::createClassifiedInfoPanel()
 	{
 		mPanelClassifiedInfo = LLPanelClassifiedInfo::create();
 		mPanelClassifiedInfo->setExitCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, mPanelClassifiedInfo));
+		mPanelClassifiedInfo->setEditClassifiedCallback(boost::bind(&LLPanelPicks::onPanelClassifiedEdit, this));
 		mPanelClassifiedInfo->setVisible(FALSE);
 	}
 }
-- 
GitLab


From e29fbb572f2e10db1f2f3c448bc59aafec4a62c8 Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Wed, 11 Nov 2009 13:05:15 +0200
Subject: [PATCH 092/557] Update for major task EXT-2250 Implement Classifieds
 list in Picks panel. Fixed accordion name and added code to show and expand
 classifieds accordion when first classified is created.

--HG--
branch : product-engine
---
 indra/newview/llpanelpicks.cpp                     | 4 ++++
 indra/newview/skins/default/xui/en/panel_picks.xml | 2 +-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 4be8f12e326..6905c7e546f 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -687,6 +687,10 @@ void LLPanelPicks::onPanelClassifiedSave(LLPanelClassifiedEdit* panel)
 		c_item->setRightMouseUpCallback(boost::bind(&LLPanelPicks::onRightMouseUpItem, this, _1, _2, _3, _4));
 		c_item->setMouseUpCallback(boost::bind(&LLPanelPicks::updateButtons, this));
 		c_item->childSetAction("info_chevron", boost::bind(&LLPanelPicks::onClickInfo, this));
+
+		// order does matter, showAccordion will invoke arrange for accordions.
+		mClassifiedsAccTab->changeOpenClose(false);
+		showAccordion("tab_classifieds", true);
 	}
 	else 
 	{
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index dbe76e553ba..65d5f51c58f 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -46,7 +46,7 @@
      layout="topleft"
      height="235"
      name="tab_classifieds"
-     title="Classified"
+     title="Classifieds"
      visible="false">
             <flat_list_view
              color="DkGray2"
-- 
GitLab


From 2afc64e6fa8aa0ee41290c8232733881026cab10 Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Wed, 11 Nov 2009 13:08:02 +0200
Subject: [PATCH 093/557] Fixed Normal bug EXT-1959 - [BSI] emotes difficult to
 see in IM/Group chat

--HG--
branch : product-engine
---
 indra/newview/llchathistory.cpp               |  3 +--
 indra/newview/llimfloater.cpp                 | 22 +++++++++++++--
 indra/newview/llimview.cpp                    | 27 +++----------------
 indra/newview/lltoastimpanel.cpp              | 14 +++++++++-
 indra/newview/llviewermessage.cpp             | 27 +++++++------------
 .../default/xui/en/panel_instant_message.xml  |  2 +-
 6 files changed, 47 insertions(+), 48 deletions(-)

diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 2ccd6b7d350..056f2ee333d 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -370,8 +370,7 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& sty
 	appendWidget(p, view_text, false);
 
 	//Append the text message
-	std::string message = chat.mText + '\n';
-	appendText(message, FALSE, style_params);
+	appendText(chat.mText, FALSE, style_params);
 
 	mLastFromName = chat.mFromName;
 	blockUndo();
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index a634a1b0fd0..8b44ccebdde 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -479,11 +479,29 @@ void LLIMFloater::updateMessages()
 			LLStyle::Params style_params;
 			style_params.color(chat_color);
 
-			LLChat chat(message);
+			LLChat chat;
 			chat.mFromID = from_id;
 			chat.mFromName = from;
 
-			mChatHistory->appendWidgetMessage(chat, style_params);
+			//Handle IRC styled /me messages.
+			std::string prefix = message.substr(0, 4);
+			if (prefix == "/me " || prefix == "/me'")
+			{
+				if (from.size() > 0)
+				{
+					style_params.font.style = "ITALIC";
+					chat.mText = from + " ";
+					mChatHistory->appendWidgetMessage(chat, style_params);
+				}
+				message = message.substr(3);
+				style_params.font.style = "UNDERLINE";
+				mChatHistory->appendText(message, FALSE, style_params);
+			}
+			else
+			{
+				chat.mText = message;
+				mChatHistory->appendWidgetMessage(chat, style_params);
+			}
 
 			mLastMessageIndex = msg["index"].asInteger();
 		}
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 476d312c69b..e894022e528 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -651,22 +651,10 @@ void LLIMModel::sendMessage(const std::string& utf8_text,
 
 		//local echo for the legacy communicate panel
 		std::string history_echo;
-		std::string utf8_copy = utf8_text;
 		LLAgentUI::buildFullname(history_echo);
 
-		// Look for IRC-style emotes here.
+		history_echo += ": " + utf8_text;
 
-		std::string prefix = utf8_copy.substr(0, 4);
-		if (prefix == "/me " || prefix == "/me'")
-		{
-			utf8_copy.replace(0,3,"");
-		}
-		else
-		{
-			history_echo += ": ";
-		}
-		history_echo += utf8_copy;
-		
 		LLFloaterIMPanel* floater = gIMMgr->findFloaterBySession(im_session_id);
 		if (floater) floater->addHistoryLine(history_echo, LLUIColorTable::instance().getColor("IMChatColor"), true, gAgent.getID());
 
@@ -2337,15 +2325,6 @@ class LLViewerChatterBoxInvitation : public LLHTTPNode
 
 			BOOL is_linden = LLMuteList::getInstance()->isLinden(name);
 			std::string separator_string(": ");
-			int message_offset=0;
-
-			//Handle IRC styled /me messages.
-			std::string prefix = message.substr(0, 4);
-			if (prefix == "/me " || prefix == "/me'")
-			{
-				separator_string = "";
-				message_offset = 3;
-			}
 			
 			chat.mMuted = is_muted && !is_linden;
 			chat.mFromID = from_id;
@@ -2362,7 +2341,7 @@ class LLViewerChatterBoxInvitation : public LLHTTPNode
 			{
 				saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());
 			}
-			std::string buffer = saved + message.substr(message_offset);
+			std::string buffer = saved + message;
 
 			BOOL is_this_agent = FALSE;
 			if(from_id == gAgentID)
@@ -2381,7 +2360,7 @@ class LLViewerChatterBoxInvitation : public LLHTTPNode
 				ll_vector3_from_sd(message_params["position"]),
 				true);
 
-			chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset);
+			chat.mText = std::string("IM: ") + name + separator_string + saved + message;
 			LLFloaterChat::addChat(chat, TRUE, is_this_agent);
 
 			//K now we want to accept the invitation
diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp
index c02fd7a5eff..9370e318cfb 100644
--- a/indra/newview/lltoastimpanel.cpp
+++ b/indra/newview/lltoastimpanel.cpp
@@ -50,7 +50,19 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) :	LLToastPanel(p.notif
 	mMessage = getChild<LLTextBox>("message");
 	mReplyBtn = getChild<LLButton>("reply");	
 
-	mMessage->setValue(p.message);
+	LLStyle::Params style_params;
+	//Handle IRC styled /me messages.
+	std::string prefix = p.message.substr(0, 4);
+	if (prefix == "/me " || prefix == "/me'")
+	{
+		mMessage->clear();
+		style_params.font.style= "ITALIC";
+		mMessage->appendText(p.from + " ", FALSE, style_params);
+		style_params.font.style= "UNDERLINE";
+		mMessage->appendText(p.message.substr(3), FALSE, style_params);
+	}
+	else
+		mMessage->setValue(p.message);
 	mUserName->setValue(p.from);
 	mTime->setValue(p.time);
 	mSessionID = p.session_id;
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index ea1097c4779..bb61b4e16fc 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1498,15 +1498,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 	}
 
 	std::string separator_string(": ");
-	int message_offset = 0;
-
-		//Handle IRC styled /me messages.
-	std::string prefix = message.substr(0, 4);
-	if (prefix == "/me " || prefix == "/me'")
-	{
-		separator_string = "";
-		message_offset = 3;
-	}
 
 	LLSD args;
 	switch(dialog)
@@ -1558,7 +1549,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 
 			// now store incoming IM in chat history
 
-			buffer = message.substr(message_offset);
+			buffer = message;
 	
 			LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
 
@@ -1576,7 +1567,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 				true);
 
 			// pretend this is chat generated by self, so it does not show up on screen
-			chat.mText = std::string("IM: ") + name + separator_string + message.substr(message_offset);
+			chat.mText = std::string("IM: ") + name + separator_string + message;
 			LLFloaterChat::addChat( chat, TRUE, TRUE );
 		}
 		else if (from_id.isNull())
@@ -1596,7 +1587,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			// Treat like a system message and put in chat history.
 			// Claim to be from a local agent so it doesn't go into
 			// console.
-			chat.mText = name + separator_string + message.substr(message_offset);
+			chat.mText = name + separator_string + message;
 
 			LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
 			if(nearby_chat)
@@ -1612,7 +1603,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			{
 				saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());
 			}
-			buffer = saved + message.substr(message_offset);
+			buffer = saved + message;
 
 			LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
 
@@ -1634,7 +1625,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 					region_id,
 					position,
 					true);
-				chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset);
+				chat.mText = std::string("IM: ") + name + separator_string + saved + message;
 
 				BOOL local_agent = FALSE;
 				LLFloaterChat::addChat( chat, TRUE, local_agent );
@@ -1922,7 +1913,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 		{
 			saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());
 		}
-		buffer = saved + message.substr(message_offset);
+		buffer = saved + message;
 		BOOL is_this_agent = FALSE;
 		if(from_id == gAgentID)
 		{
@@ -1940,7 +1931,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			position,
 			true);
 
-		chat.mText = std::string("IM: ") + name + separator_string +  saved + message.substr(message_offset);
+		chat.mText = std::string("IM: ") + name + separator_string +  saved + message;
 		LLFloaterChat::addChat(chat, TRUE, is_this_agent);
 	}
 	break;
@@ -1953,7 +1944,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			}
 
 			LLSD substitutions;
-			substitutions["MSG"] = message.substr(message_offset);
+			substitutions["MSG"] = message;
 			LLNotifications::instance().add("ServerObjectMessage", substitutions);
 		}
 		break;
@@ -1978,7 +1969,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 		else
 		{
 			// TODO: after LLTrans hits release, get "busy response" into translatable file
-			buffer = llformat("%s (%s): %s", name.c_str(), "busy response", message.substr(message_offset).c_str());
+			buffer = llformat("%s (%s): %s", name.c_str(), "busy response", message.c_str());
 			gIMMgr->addMessage(session_id, from_id, name, buffer);
 		}
 		break;
diff --git a/indra/newview/skins/default/xui/en/panel_instant_message.xml b/indra/newview/skins/default/xui/en/panel_instant_message.xml
index 26d8304551d..be568661193 100644
--- a/indra/newview/skins/default/xui/en/panel_instant_message.xml
+++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml
@@ -79,7 +79,7 @@
      text_color="white"
      top="33"
      use_ellipses="true"
-     value="MESSAGE"
+     value=""
      width="285"
      word_wrap="true"
      max_length="350" />
-- 
GitLab


From cff807dfaf2bfdbe58a007dd16b36ea29e57bd5b Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Wed, 11 Nov 2009 13:13:34 +0200
Subject: [PATCH 094/557] Work on major sub-task EXT-991 (Update bottom bar
 behavior on resize)  - refactored logic increasing of width  - fixed bug with
 incorrect work in some cases

--HG--
branch : product-engine
---
 indra/newview/llbottomtray.cpp | 71 ++++++++++++++++++----------------
 1 file changed, 38 insertions(+), 33 deletions(-)

diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index c33d667e0bd..908fe15be69 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -393,10 +393,10 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 	static MASK prev_resize_state = mResizeState;
 	MASK compensative_view_item_mask = RS_CHATBAR_INPUT;
 	LLPanel* compansative_view = mNearbyChatBar;
-	S32 compensative_delta_width = 0;
 
 	S32 delta_width = width - height;
 //	if (delta_width == 0) return;
+	bool shrink = width < height;
 
 	const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
 	const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
@@ -414,8 +414,9 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 
 	bool still_should_be_processed = true;
 	// bottom tray is narrowed
-	if (width < height)
+	if (shrink)
 	{
+		S32 compensative_delta_width = 0;
 		if (chiclet_panel_width > chiclet_panel_min_width)
 		{
 			// we have some space to decrease chiclet panel
@@ -549,17 +550,17 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 	// bottom tray is widen
 	else
 	{
-		S32 available_width_chat = chatbar_panel_width - chatbar_panel_min_width;
+		S32 chatbar_available_shrink_width = chatbar_panel_width - chatbar_panel_min_width;
 		S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width;
-		S32 available_width = delta_width + available_width_chat + available_width_chiclet;
-		
+		S32 available_width = delta_width + chatbar_available_shrink_width + available_width_chiclet;
+		S32 buttons_required_width = 0; //How many room will take shown buttons
 		if (available_width > 0 && processShowButton(mGesturePanel, &available_width))
 		{
 			mResizeState |= RS_BUTTON_GESTURES | compensative_view_item_mask;
 			delta_width -= mGesturePanel->getRect().getWidth();
-			compensative_delta_width -= mGesturePanel->getRect().getWidth();
+			buttons_required_width += mGesturePanel->getRect().getWidth();
 			lldebugs << "RS_BUTTON_GESTURES"
-				<< ", compensative_delta_width: " << compensative_delta_width
+				<< ", buttons_required_width: " << buttons_required_width
 				<< ", delta_width: " << delta_width
 				<< llendl;
 			showGestureButton(true);
@@ -569,10 +570,10 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 		{
 			mResizeState |= RS_BUTTON_MOVEMENT | compensative_view_item_mask;
 			delta_width -= mMovementPanel->getRect().getWidth();
-			compensative_delta_width -= mMovementPanel->getRect().getWidth();
+			buttons_required_width += mMovementPanel->getRect().getWidth();
 
 			lldebugs << "RS_BUTTON_MOVEMENT"
-				<< ", compensative_delta_width: " << compensative_delta_width
+				<< ", buttons_required_width: " << buttons_required_width
 				<< ", delta_width: " << delta_width
 				<< llendl;
 			showMoveButton(true);
@@ -582,10 +583,10 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 		{
 			mResizeState |= RS_BUTTON_CAMERA | compensative_view_item_mask;
 			delta_width -= mCamPanel->getRect().getWidth();
-			compensative_delta_width -= mCamPanel->getRect().getWidth();
+			buttons_required_width += mCamPanel->getRect().getWidth();
 
 			lldebugs << "RS_BUTTON_CAMERA "
-				<< ", compensative_delta_width: " << compensative_delta_width
+				<< ", buttons_required_width: " << buttons_required_width
 				<< ", delta_width: " << delta_width
 				<< llendl;
 			showCameraButton(true);
@@ -595,51 +596,55 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 		{
 			mResizeState |= RS_BUTTON_SNAPSHOT | compensative_view_item_mask;
 			delta_width -= mSnapshotPanel->getRect().getWidth();
-			compensative_delta_width -= mSnapshotPanel->getRect().getWidth();
+			buttons_required_width += mSnapshotPanel->getRect().getWidth();
 
 			lldebugs << "RS_BUTTON_SNAPSHOT"
-				<< ", compensative_delta_width: " << compensative_delta_width
+				<< ", buttons_required_width: " << buttons_required_width
 				<< ", delta_width: " << delta_width
 				<< llendl;
 			showSnapshotButton(true);
 		}
 
-		if (compensative_delta_width != 0)
+		S32 total_delta_width = width - height;
+
+		// if we have to show some buttons but whidth increasing is not enough...
+		if (buttons_required_width > 0 && total_delta_width < buttons_required_width)
 		{
-			S32 required_to_process_width = -compensative_delta_width;
-			S32 total_delta_width = width - height;
+			// ... let's shrink nearby chat & chiclet panels
+			S32 required_to_process_width = buttons_required_width;
 
 			// 1. use delta width of resizing
 			required_to_process_width -= total_delta_width;
 
-			// 2. use delta width of chatbar
-
-
-			S32 chatbar_compensative_delta_width = required_to_process_width;
-			if (available_width_chat < chatbar_compensative_delta_width)
+			// 2. use delta width available via decreasing of nearby chat panel
+			S32 chatbar_shrink_width = required_to_process_width;
+			if (chatbar_available_shrink_width < chatbar_shrink_width)
 			{
-				chatbar_compensative_delta_width = available_width_chat;
+				chatbar_shrink_width = chatbar_available_shrink_width;
 			}
 
 			log(compansative_view, "increase width: before applying compensative width: ");
-			compansative_view->reshape(compansative_view->getRect().getWidth() - chatbar_compensative_delta_width, compansative_view->getRect().getHeight() );
+			compansative_view->reshape(compansative_view->getRect().getWidth() - chatbar_shrink_width, compansative_view->getRect().getHeight() );
 			if (compansative_view)			log(compansative_view, "after applying compensative width: ");
-			lldebugs << chatbar_compensative_delta_width << llendl;
+			lldebugs << chatbar_shrink_width << llendl;
 
-			// 3. use delta width of chiclet panel
-			required_to_process_width -= chatbar_compensative_delta_width;
+			// 3. use delta width available via decreasing of chiclet panel
+			required_to_process_width -= chatbar_shrink_width;
 
-			mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - required_to_process_width, mChicletPanel->getParent()->getRect().getHeight());
-			log(mChicletPanel, "after applying compensative width for chiclets: ");
-			lldebugs << required_to_process_width << llendl;
+			if (required_to_process_width > 0)
+			{
+				mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - required_to_process_width, mChicletPanel->getParent()->getRect().getHeight());
+				log(mChicletPanel, "after applying compensative width for chiclets: ");
+				lldebugs << required_to_process_width << llendl;
+			}
 
 		}
-
-		if (delta_width > 0 && chatbar_panel_width < chatbar_panel_max_width)
+// TODO: mantipov: probably need delta_width -= buttons_required_width & remove calculating from the buttons processing
+		// how many space can nearby chat take?
+		S32 chatbar_panel_width_ = mNearbyChatBar->getRect().getWidth();
+		if (delta_width > 0 && chatbar_panel_width_ < chatbar_panel_max_width)
 		{
 			mResizeState |= RS_CHATBAR_INPUT;
-			// how many space can nearby chat take?
-			S32 chatbar_panel_width_ = mNearbyChatBar->getRect().getWidth();
 			S32 delta_panel_max = chatbar_panel_max_width - chatbar_panel_width_;
 			S32 delta_panel = llmin(delta_width, delta_panel_max);
 			delta_width -= delta_panel_max;
-- 
GitLab


From 532567c63eea56dea49fde8b182dc7a44f414b4f Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Wed, 11 Nov 2009 13:18:36 +0200
Subject: [PATCH 095/557] Update for major task EXT-2250 Implement Classifieds
 list in Picks panel. Added single expansion accordion.

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_picks.xml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index 65d5f51c58f..9cfbed432ae 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -22,6 +22,7 @@
   left="0"
   name="accordion"
   top="0"
+  single_expansion="true"
   width="313">
     <accordion_tab
      can_resize="false"
-- 
GitLab


From 9ab02a68bbb735f89d4c633697a7917ca2fa3839 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Wed, 11 Nov 2009 13:53:04 +0200
Subject: [PATCH 096/557] Work on major sub-task EXT-991 (Update bottom bar
 behavior on resize) Code refactored:   - move calculating of
 buttons_required_width inside processShowButton();   - remove changing of
 delta_width out of processing each button while increasing width

--HG--
branch : product-engine
---
 indra/newview/llbottomtray.cpp | 61 ++++++++++++----------------------
 indra/newview/llbottomtray.h   |  4 +--
 2 files changed, 23 insertions(+), 42 deletions(-)

diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 908fe15be69..0ebf9947e39 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -348,15 +348,14 @@ void LLBottomTray::verifyChildControlsSizes()
 #define __FEATURE_EXT_991
 void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
 {
-	static S32 depth = 0;
-if (0 == depth) lldebugs << "****************************************" << llendl;
+	lldebugs << "****************************************" << llendl;
 
-	S32 prev_width = getRect().getWidth();
-	lldebugs << "Reshaping: depth: " << ++depth
+	S32 current_width = getRect().getWidth();
+	lldebugs << "Reshaping: " 
 		<< ", width: " << width
 		<< ", height: " << height
 		<< ", called_from_parent: " << called_from_parent
-		<< ", cur width: " << prev_width
+		<< ", cur width: " << current_width
 		<< ", cur height: " << getRect().getHeight()
 		<< llendl;
 
@@ -365,17 +364,9 @@ if (0 == depth) lldebugs << "****************************************" << llendl
 
 	if (mChicletPanel && mToolbarStack && mNearbyChatBar)
 	{
- 		verifyChildControlsSizes();
- 		updateResizeState(width, prev_width);
-
-		if (RS_NORESIZE != mResizeState)
-		{
-
-//		mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, mResizeState & RS_CHICLET_PANEL);
 		mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE);
-
-//		mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, mResizeState & RS_CHATBAR_INPUT);
-		}
+ 		verifyChildControlsSizes();
+ 		updateResizeState(width, current_width);
 	}
 
 	LLPanel::reshape(width, height, called_from_parent);
@@ -383,20 +374,18 @@ if (0 == depth) lldebugs << "****************************************" << llendl
 
 	if (mNearbyChatBar)			log(mNearbyChatBar, "after");
 	if (mChicletPanel)			log(mChicletPanel, "after");
-
-	--depth;
 }
 
-void LLBottomTray::updateResizeState(S32 width, S32 height)
+void LLBottomTray::updateResizeState(S32 new_width, S32 cur_width)
 {
 	mResizeState = RS_NORESIZE;
 	static MASK prev_resize_state = mResizeState;
 	MASK compensative_view_item_mask = RS_CHATBAR_INPUT;
 	LLPanel* compansative_view = mNearbyChatBar;
 
-	S32 delta_width = width - height;
+	S32 delta_width = new_width - cur_width;
 //	if (delta_width == 0) return;
-	bool shrink = width < height;
+	bool shrink = new_width < cur_width;
 
 	const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
 	const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
@@ -554,58 +543,46 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 		S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width;
 		S32 available_width = delta_width + chatbar_available_shrink_width + available_width_chiclet;
 		S32 buttons_required_width = 0; //How many room will take shown buttons
-		if (available_width > 0 && processShowButton(mGesturePanel, &available_width))
+		if (available_width > 0 && processShowButton(mGesturePanel, &available_width, &buttons_required_width))
 		{
 			mResizeState |= RS_BUTTON_GESTURES | compensative_view_item_mask;
-			delta_width -= mGesturePanel->getRect().getWidth();
-			buttons_required_width += mGesturePanel->getRect().getWidth();
 			lldebugs << "RS_BUTTON_GESTURES"
 				<< ", buttons_required_width: " << buttons_required_width
-				<< ", delta_width: " << delta_width
 				<< llendl;
 			showGestureButton(true);
 		}
 
-		if (available_width > 0 && processShowButton(mMovementPanel, &available_width))
+		if (available_width > 0 && processShowButton(mMovementPanel, &available_width, &buttons_required_width))
 		{
 			mResizeState |= RS_BUTTON_MOVEMENT | compensative_view_item_mask;
-			delta_width -= mMovementPanel->getRect().getWidth();
-			buttons_required_width += mMovementPanel->getRect().getWidth();
 
 			lldebugs << "RS_BUTTON_MOVEMENT"
 				<< ", buttons_required_width: " << buttons_required_width
-				<< ", delta_width: " << delta_width
 				<< llendl;
 			showMoveButton(true);
 		}
 
-		if (available_width > 0 && processShowButton(mCamPanel, &available_width))
+		if (available_width > 0 && processShowButton(mCamPanel, &available_width, &buttons_required_width))
 		{
 			mResizeState |= RS_BUTTON_CAMERA | compensative_view_item_mask;
-			delta_width -= mCamPanel->getRect().getWidth();
-			buttons_required_width += mCamPanel->getRect().getWidth();
 
 			lldebugs << "RS_BUTTON_CAMERA "
 				<< ", buttons_required_width: " << buttons_required_width
-				<< ", delta_width: " << delta_width
 				<< llendl;
 			showCameraButton(true);
 		}
 
-		if (available_width > 0 && processShowButton(mSnapshotPanel, &available_width))
+		if (available_width > 0 && processShowButton(mSnapshotPanel, &available_width, &buttons_required_width))
 		{
 			mResizeState |= RS_BUTTON_SNAPSHOT | compensative_view_item_mask;
-			delta_width -= mSnapshotPanel->getRect().getWidth();
-			buttons_required_width += mSnapshotPanel->getRect().getWidth();
 
 			lldebugs << "RS_BUTTON_SNAPSHOT"
 				<< ", buttons_required_width: " << buttons_required_width
-				<< ", delta_width: " << delta_width
 				<< llendl;
 			showSnapshotButton(true);
 		}
 
-		S32 total_delta_width = width - height;
+		S32 total_delta_width = new_width - cur_width;
 
 		// if we have to show some buttons but whidth increasing is not enough...
 		if (buttons_required_width > 0 && total_delta_width < buttons_required_width)
@@ -639,8 +616,11 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 			}
 
 		}
-// TODO: mantipov: probably need delta_width -= buttons_required_width & remove calculating from the buttons processing
-		// how many space can nearby chat take?
+
+		// shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels
+		delta_width -= buttons_required_width;
+
+		// how many space can nearby chatbar take?
 		S32 chatbar_panel_width_ = mNearbyChatBar->getRect().getWidth();
 		if (delta_width > 0 && chatbar_panel_width_ < chatbar_panel_max_width)
 		{
@@ -661,7 +641,7 @@ void LLBottomTray::updateResizeState(S32 width, S32 height)
 	lldebugs << "New resize state: " << mResizeState << llendl;
 }
 
-bool LLBottomTray::processShowButton(LLPanel* panel, S32* available_width)
+bool LLBottomTray::processShowButton(LLPanel* panel, S32* available_width, S32* buttons_required_width)
 {
 	bool can_be_shown = canButtonBeShown(panel);
 	if (can_be_shown)
@@ -672,6 +652,7 @@ bool LLBottomTray::processShowButton(LLPanel* panel, S32* available_width)
 		if (can_be_shown)
 		{
 			*available_width -= required_width;
+			*buttons_required_width += required_width;
 		}
 
 	}
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 4a763e6c7cc..509f8b1e410 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -84,10 +84,10 @@ class LLBottomTray
 
 private:
 
-	void updateResizeState(S32 width, S32 height);
+	void updateResizeState(S32 new_width, S32 cur_width);
 	void verifyChildControlsSizes();
 	void log(LLView* panel, const std::string& descr);
-	bool processShowButton(LLPanel* panel, S32* available_width);
+	bool processShowButton(LLPanel* panel, S32* available_width, S32* buttons_required_width);
 	bool canButtonBeShown(LLPanel* panel) const;
 
 	MASK mResizeState;
-- 
GitLab


From cb96aa0913567be7c2b0974878c87fda5aa53c55 Mon Sep 17 00:00:00 2001
From: Andrew Polunin <apolunin@productengine.com>
Date: Wed, 11 Nov 2009 14:26:02 +0200
Subject: [PATCH 097/557] fixed (again) normal bug EXT-2025 Gesture btn couses
 nothing

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_bottomtray.xml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 34fa7dbef29..cea67592924 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -90,12 +90,12 @@
          height="28"
          layout="topleft"
          min_height="28"
-         width="80"
+         width="82"
          top_delta="0"
          min_width="76"
          name="gesture_panel"
          user_resize="false">
-         <button
+         <gesture_combo_box
            follows="right"
           height="23"
           label="Gesture"
@@ -104,7 +104,7 @@
           left="0"
           top="3"
          use_ellipses="true"
-          width="80"
+          width="82"
           tool_tip="Shows/hides gestures"/>
         </layout_panel>
 		 <icon
-- 
GitLab


From 43ae94ab0f35dafaa0e1787a155290e371e317a1 Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Wed, 11 Nov 2009 07:32:59 -0500
Subject: [PATCH 098/557] Rename private methods to avoid ambiguity with
 subclasses

---
 indra/llcommon/llinstancetracker.h | 46 +++++++++++++++---------------
 1 file changed, 23 insertions(+), 23 deletions(-)

diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h
index 039d68faef8..11fe5236519 100644
--- a/indra/llcommon/llinstancetracker.h
+++ b/indra/llcommon/llinstancetracker.h
@@ -61,46 +61,46 @@ class LLInstanceTracker : boost::noncopyable
 
 	static T* getInstance(const KEY& k)
 	{
-		typename InstanceMap::const_iterator found = getMap().find(k);
-		return (found == getMap().end()) ? NULL : found->second;
+		typename InstanceMap::const_iterator found = getMap_().find(k);
+		return (found == getMap_().end()) ? NULL : found->second;
 	}
 
 	static key_iter beginKeys()
 	{
-		return boost::make_transform_iterator(getMap().begin(),
+		return boost::make_transform_iterator(getMap_().begin(),
 											  boost::bind(&InstanceMap::value_type::first, _1));
 	}
 	static key_iter endKeys()
 	{
-		return boost::make_transform_iterator(getMap().end(),
+		return boost::make_transform_iterator(getMap_().end(),
 											  boost::bind(&InstanceMap::value_type::first, _1));
 	}
 	static instance_iter beginInstances()
 	{
-		return instance_iter(boost::make_transform_iterator(getMap().begin(),
+		return instance_iter(boost::make_transform_iterator(getMap_().begin(),
 															boost::bind(&InstanceMap::value_type::second, _1)));
 	}
 	static instance_iter endInstances()
 	{
-		return instance_iter(boost::make_transform_iterator(getMap().end(),
+		return instance_iter(boost::make_transform_iterator(getMap_().end(),
 															boost::bind(&InstanceMap::value_type::second, _1)));
 	}
-	static S32 instanceCount() { return getMap().size(); }
+	static S32 instanceCount() { return getMap_().size(); }
 protected:
-	LLInstanceTracker(KEY key) { add(key); }
-	virtual ~LLInstanceTracker() { remove(); }
-	virtual void setKey(KEY key) { remove(); add(key); }
+	LLInstanceTracker(KEY key) { add_(key); }
+	virtual ~LLInstanceTracker() { remove_(); }
+	virtual void setKey(KEY key) { remove_(); add_(key); }
 	virtual const KEY& getKey() const { return mKey; }
 
 private:
-	void add(KEY key) 
+	void add_(KEY key) 
 	{ 
 		mKey = key; 
-		getMap()[key] = static_cast<T*>(this); 
+		getMap_()[key] = static_cast<T*>(this); 
 	}
-	void remove() { getMap().erase(mKey); }
+	void remove_() { getMap_().erase(mKey); }
 
-    static InstanceMap& getMap()
+    static InstanceMap& getMap_()
     {
         if (! sInstances)
         {
@@ -129,19 +129,19 @@ class LLInstanceTracker<T, T*>
 
 	/// for completeness of analogy with the generic implementation
 	static T* getInstance(T* k) { return k; }
-	static key_iter beginKeys() { return getSet().begin(); }
-	static key_iter endKeys()   { return getSet().end(); }
-	static instance_iter beginInstances() { return instance_iter(getSet().begin()); }
-	static instance_iter endInstances()   { return instance_iter(getSet().end()); }
-	static S32 instanceCount() { return getSet().size(); }
+	static key_iter beginKeys() { return getSet_().begin(); }
+	static key_iter endKeys()   { return getSet_().end(); }
+	static instance_iter beginInstances() { return instance_iter(getSet_().begin()); }
+	static instance_iter endInstances()   { return instance_iter(getSet_().end()); }
+	static S32 instanceCount() { return getSet_().size(); }
 
 protected:
-	LLInstanceTracker() { getSet().insert(static_cast<T*>(this)); }
-	virtual ~LLInstanceTracker() { getSet().erase(static_cast<T*>(this)); }
+	LLInstanceTracker() { getSet_().insert(static_cast<T*>(this)); }
+	virtual ~LLInstanceTracker() { getSet_().erase(static_cast<T*>(this)); }
 
-	LLInstanceTracker(const LLInstanceTracker& other) { getSet().insert(static_cast<T*>(this)); }
+	LLInstanceTracker(const LLInstanceTracker& other) { getSet_().insert(static_cast<T*>(this)); }
 
-    static InstanceSet& getSet()   // called after getReady() but before go()
+    static InstanceSet& getSet_()   // called after getReady() but before go()
     {
         if (! sInstances)
         {
-- 
GitLab


From 062d0a13db505636b186084d42c527a49637f380 Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Wed, 11 Nov 2009 07:41:50 -0500
Subject: [PATCH 099/557] Add LLEventAPI class, formalizing the mechanism by
 which we wrap a C++ API with an event API. In addition to the LLEventPump
 name on which to listen, LLEventAPI accepts a documentation string for event
 API introspection. Give every LLEventDispatcher::add() overload a new
 documentation string parameter for event API introspection. Convert every
 existing event API to new conventions, introducing suitable documentation
 strings for the API and each of its operations.

---
 indra/llcommon/CMakeLists.txt             |  2 +
 indra/llcommon/lleventapi.cpp             | 30 +++++++++++++
 indra/llcommon/lleventapi.h               | 53 +++++++++++++++++++++++
 indra/llcommon/lleventdispatcher.cpp      | 12 ++---
 indra/llcommon/lleventdispatcher.h        | 35 +++++++++++----
 indra/llmessage/llares.cpp                |  2 +-
 indra/llmessage/llareslistener.cpp        | 13 ++++--
 indra/llmessage/llareslistener.h          |  9 ++--
 indra/llui/llfloaterreg.cpp               |  2 +-
 indra/llui/llfloaterreglistener.cpp       | 30 ++++++++++---
 indra/llui/llfloaterreglistener.h         |  6 +--
 indra/llui/llnotificationslistener.cpp    |  8 +++-
 indra/llui/llnotificationslistener.h      |  4 +-
 indra/newview/llagentlistener.cpp         | 16 +++++--
 indra/newview/llagentlistener.h           |  4 +-
 indra/newview/llappviewer.cpp             |  2 +-
 indra/newview/llappviewerlistener.cpp     | 14 +++---
 indra/newview/llappviewerlistener.h       |  9 ++--
 indra/newview/llfloaterabout.cpp          | 12 +++--
 indra/newview/lllogininstance.cpp         |  6 +--
 indra/newview/lluilistener.cpp            | 12 +++--
 indra/newview/lluilistener.h              |  6 +--
 indra/newview/llviewercontrollistener.cpp | 20 ++++++---
 indra/newview/llviewercontrollistener.h   |  4 +-
 indra/newview/llviewermenu.cpp            |  2 +-
 indra/newview/llviewerwindow.cpp          |  2 +-
 indra/newview/llviewerwindowlistener.cpp  | 16 +++++--
 indra/newview/llviewerwindowlistener.h    |  9 ++--
 28 files changed, 254 insertions(+), 86 deletions(-)
 create mode 100644 indra/llcommon/lleventapi.cpp
 create mode 100644 indra/llcommon/lleventapi.h

diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index 2d0363d188e..e41c75846b3 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -41,6 +41,7 @@ set(llcommon_SOURCE_FILES
     llerror.cpp
     llerrorthread.cpp
     llevent.cpp
+    lleventapi.cpp
     lleventcoro.cpp
     lleventdispatcher.cpp
     lleventfilter.cpp
@@ -140,6 +141,7 @@ set(llcommon_HEADER_FILES
     llerrorlegacy.h
     llerrorthread.h
     llevent.h
+    lleventapi.h
     lleventcoro.h
     lleventdispatcher.h
     lleventfilter.h
diff --git a/indra/llcommon/lleventapi.cpp b/indra/llcommon/lleventapi.cpp
new file mode 100644
index 00000000000..1dd104da8f6
--- /dev/null
+++ b/indra/llcommon/lleventapi.cpp
@@ -0,0 +1,30 @@
+/**
+ * @file   lleventapi.cpp
+ * @author Nat Goodspeed
+ * @date   2009-11-10
+ * @brief  Implementation for lleventapi.
+ * 
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "lleventapi.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+
+LLEventAPI::LLEventAPI(const std::string& name, const std::string& desc, const std::string& field):
+    lbase(name, field),
+    ibase(name),
+    mDesc(desc)
+{
+}
+
+LLEventAPI::~LLEventAPI()
+{
+}
diff --git a/indra/llcommon/lleventapi.h b/indra/llcommon/lleventapi.h
new file mode 100644
index 00000000000..fef12988cb4
--- /dev/null
+++ b/indra/llcommon/lleventapi.h
@@ -0,0 +1,53 @@
+/**
+ * @file   lleventapi.h
+ * @author Nat Goodspeed
+ * @date   2009-10-28
+ * @brief  LLEventAPI is the base class for every class that wraps a C++ API
+ *         in an event API
+ * (see https://wiki.lindenlab.com/wiki/Incremental_Viewer_Automation/Event_API).
+ * 
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLEVENTAPI_H)
+#define LL_LLEVENTAPI_H
+
+#include "lleventdispatcher.h"
+#include "llinstancetracker.h"
+#include <string>
+
+/**
+ * LLEventAPI not only provides operation dispatch functionality, inherited
+ * from LLDispatchListener -- it also gives us event API introspection.
+ * Deriving from LLInstanceTracker lets us enumerate instances.
+ */
+class LLEventAPI: public LLDispatchListener,
+                  public LLInstanceTracker<LLEventAPI, std::string>
+{
+    typedef LLDispatchListener lbase;
+    typedef LLInstanceTracker<LLEventAPI, std::string> ibase;
+
+public:
+    /**
+     * @param name LLEventPump name on which this LLEventAPI will listen. This
+     * also serves as the LLInstanceTracker instance key.
+     * @param desc Documentation string shown to a client trying to discover
+     * available event APIs.
+     * @param field LLSD::Map key used by LLDispatchListener to look up the
+     * subclass method to invoke [default "op"].
+     */
+    LLEventAPI(const std::string& name, const std::string& desc, const std::string& field="op");
+    virtual ~LLEventAPI();
+
+    /// Get the string name of this LLEventAPI
+    std::string getName() const { return ibase::getKey(); }
+    /// Get the documentation string
+    std::string getDesc() const { return mDesc; }
+
+private:
+    std::string mDesc;
+};
+
+#endif /* ! defined(LL_LLEVENTAPI_H) */
diff --git a/indra/llcommon/lleventdispatcher.cpp b/indra/llcommon/lleventdispatcher.cpp
index 6b1413d0549..017bf3a5219 100644
--- a/indra/llcommon/lleventdispatcher.cpp
+++ b/indra/llcommon/lleventdispatcher.cpp
@@ -36,9 +36,11 @@ LLEventDispatcher::~LLEventDispatcher()
 }
 
 /// Register a callable by name
-void LLEventDispatcher::add(const std::string& name, const Callable& callable, const LLSD& required)
+void LLEventDispatcher::add(const std::string& name, const std::string& desc,
+                            const Callable& callable, const LLSD& required)
 {
-    mDispatch[name] = DispatchMap::mapped_type(callable, required);
+    mDispatch.insert(DispatchMap::value_type(name,
+                                             DispatchMap::mapped_type(callable, desc, required)));
 }
 
 void LLEventDispatcher::addFail(const std::string& name, const std::string& classname) const
@@ -98,14 +100,14 @@ bool LLEventDispatcher::attemptCall(const std::string& name, const LLSD& event)
     }
     // Found the name, so it's plausible to even attempt the call. But first,
     // validate the syntax of the event itself.
-    std::string mismatch(llsd_matches(found->second.second, event));
+    std::string mismatch(llsd_matches(found->second.mRequired, event));
     if (! mismatch.empty())
     {
         LL_ERRS("LLEventDispatcher") << "LLEventDispatcher(" << mDesc << ") calling '" << name
                                      << "': bad request: " << mismatch << LL_ENDL;
     }
     // Event syntax looks good, go for it!
-    (found->second.first)(event);
+    (found->second.mFunc)(event);
     return true;                    // tell caller we were able to call
 }
 
@@ -116,7 +118,7 @@ LLEventDispatcher::Callable LLEventDispatcher::get(const std::string& name) cons
     {
         return Callable();
     }
-    return found->second.first;
+    return found->second.mFunc;
 }
 
 LLDispatchListener::LLDispatchListener(const std::string& pumpname, const std::string& key):
diff --git a/indra/llcommon/lleventdispatcher.h b/indra/llcommon/lleventdispatcher.h
index 5a86b90bff1..eba7b607f18 100644
--- a/indra/llcommon/lleventdispatcher.h
+++ b/indra/llcommon/lleventdispatcher.h
@@ -44,7 +44,10 @@ class LL_COMMON_API LLEventDispatcher
      * is used to validate the structure of each incoming event (see
      * llsd_matches()).
      */
-    void add(const std::string& name, const Callable& callable, const LLSD& required=LLSD());
+    void add(const std::string& name,
+             const std::string& desc,
+             const Callable& callable,
+             const LLSD& required=LLSD());
 
     /**
      * Special case: a subclass of this class can pass an unbound member
@@ -52,18 +55,22 @@ class LL_COMMON_API LLEventDispatcher
      * <tt>boost::bind()</tt> expression.
      */
     template <class CLASS>
-    void add(const std::string& name, void (CLASS::*method)(const LLSD&),
+    void add(const std::string& name,
+             const std::string& desc,
+             void (CLASS::*method)(const LLSD&),
              const LLSD& required=LLSD())
     {
-        addMethod<CLASS>(name, method, required);
+        addMethod<CLASS>(name, desc, method, required);
     }
 
     /// Overload for both const and non-const methods
     template <class CLASS>
-    void add(const std::string& name, void (CLASS::*method)(const LLSD&) const,
+    void add(const std::string& name,
+             const std::string& desc,
+             void (CLASS::*method)(const LLSD&) const,
              const LLSD& required=LLSD())
     {
-        addMethod<CLASS>(name, method, required);
+        addMethod<CLASS>(name, desc, method, required);
     }
 
     /// Unregister a callable
@@ -86,7 +93,8 @@ class LL_COMMON_API LLEventDispatcher
 
 private:
     template <class CLASS, typename METHOD>
-    void addMethod(const std::string& name, const METHOD& method, const LLSD& required)
+    void addMethod(const std::string& name, const std::string& desc,
+                   const METHOD& method, const LLSD& required)
     {
         CLASS* downcast = dynamic_cast<CLASS*>(this);
         if (! downcast)
@@ -95,7 +103,7 @@ class LL_COMMON_API LLEventDispatcher
         }
         else
         {
-            add(name, boost::bind(method, downcast, _1), required);
+            add(name, desc, boost::bind(method, downcast, _1), required);
         }
     }
     void addFail(const std::string& name, const std::string& classname) const;
@@ -103,7 +111,18 @@ class LL_COMMON_API LLEventDispatcher
     bool attemptCall(const std::string& name, const LLSD& event) const;
 
     std::string mDesc, mKey;
-    typedef std::map<std::string, std::pair<Callable, LLSD> > DispatchMap;
+    struct DispatchEntry
+    {
+        DispatchEntry(const Callable& func, const std::string& desc, const LLSD& required):
+            mFunc(func),
+            mDesc(desc),
+            mRequired(required)
+        {}
+        Callable mFunc;
+        std::string mDesc;
+        LLSD mRequired;
+    };
+    typedef std::map<std::string, DispatchEntry> DispatchMap;
     DispatchMap mDispatch;
 };
 
diff --git a/indra/llmessage/llares.cpp b/indra/llmessage/llares.cpp
index acbf51d75ca..104629c157d 100644
--- a/indra/llmessage/llares.cpp
+++ b/indra/llmessage/llares.cpp
@@ -106,7 +106,7 @@ void LLAres::QueryResponder::queryError(int code)
 LLAres::LLAres() :
     chan_(NULL),
     mInitSuccess(false),
-    mListener(new LLAresListener("LLAres", this))
+    mListener(new LLAresListener(this))
 {
 	if (ares_init(&chan_) != ARES_SUCCESS)
 	{
diff --git a/indra/llmessage/llareslistener.cpp b/indra/llmessage/llareslistener.cpp
index a8beb8cbde3..7db3675b774 100644
--- a/indra/llmessage/llareslistener.cpp
+++ b/indra/llmessage/llareslistener.cpp
@@ -22,13 +22,18 @@
 #include "llevents.h"
 #include "llsdutil.h"
 
-LLAresListener::LLAresListener(const std::string& pumpname, LLAres* llares):
-    LLDispatchListener(pumpname, "op"),
+LLAresListener::LLAresListener(LLAres* llares):
+    LLEventAPI("LLAres",
+               "LLAres listener to request DNS operations"),
     mAres(llares)
 {
     // add() every method we want to be able to invoke via this event API.
-    // Optional third parameter validates expected LLSD request structure.
-    add("rewriteURI", &LLAresListener::rewriteURI,
+    // Optional last parameter validates expected LLSD request structure.
+    add("rewriteURI",
+        "Given [\"uri\"], return on [\"reply\"] an array of alternative URIs.\n"
+        "On failure, returns an array containing only the original URI, so\n"
+        "failure case can be processed like success case.",
+        &LLAresListener::rewriteURI,
         LLSD().insert("uri", LLSD()).insert("reply", LLSD()));
 }
 
diff --git a/indra/llmessage/llareslistener.h b/indra/llmessage/llareslistener.h
index bf093b3d3d7..33cef79c093 100644
--- a/indra/llmessage/llareslistener.h
+++ b/indra/llmessage/llareslistener.h
@@ -14,18 +14,17 @@
 #if ! defined(LL_LLARESLISTENER_H)
 #define LL_LLARESLISTENER_H
 
-#include "lleventdispatcher.h"
+#include "lleventapi.h"
 
 class LLAres;
 class LLSD;
 
 /// Listen on an LLEventPump with specified name for LLAres request events.
-class LLAresListener: public LLDispatchListener
+class LLAresListener: public LLEventAPI
 {
 public:
-    /// Specify the pump name on which to listen, and bind the LLAres instance
-    /// to use (e.g. gAres)
-    LLAresListener(const std::string& pumpname, LLAres* llares);
+    /// Bind the LLAres instance to use (e.g. gAres)
+    LLAresListener(LLAres* llares);
 
 private:
     /// command["op"] == "rewriteURI" 
diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp
index 03925f922c1..eb67e3a5614 100644
--- a/indra/llui/llfloaterreg.cpp
+++ b/indra/llui/llfloaterreg.cpp
@@ -46,7 +46,7 @@ LLFloaterReg::instance_map_t LLFloaterReg::sInstanceMap;
 LLFloaterReg::build_map_t LLFloaterReg::sBuildMap;
 std::map<std::string,std::string> LLFloaterReg::sGroupMap;
 
-static LLFloaterRegListener sFloaterRegListener("LLFloaterReg");
+static LLFloaterRegListener sFloaterRegListener;
 
 //*******************************************************
 
diff --git a/indra/llui/llfloaterreglistener.cpp b/indra/llui/llfloaterreglistener.cpp
index 57d148b5af4..029d3b68103 100644
--- a/indra/llui/llfloaterreglistener.cpp
+++ b/indra/llui/llfloaterreglistener.cpp
@@ -21,19 +21,35 @@
 #include "llfloater.h"
 #include "llbutton.h"
 
-LLFloaterRegListener::LLFloaterRegListener(const std::string& pumpName):
-    LLDispatchListener(pumpName, "op")
+LLFloaterRegListener::LLFloaterRegListener():
+    LLEventAPI("LLFloaterReg",
+               "LLFloaterReg listener to (e.g.) show/hide LLFloater instances")
 {
-    add("getBuildMap",  &LLFloaterRegListener::getBuildMap,  LLSD().insert("reply", LLSD()));
+    add("getBuildMap",
+        "Return on [\"reply\"] data about all registered LLFloaterReg floater names",
+        &LLFloaterRegListener::getBuildMap,
+        LLSD().insert("reply", LLSD()));
     LLSD requiredName;
     requiredName["name"] = LLSD();
-    add("showInstance", &LLFloaterRegListener::showInstance, requiredName);
-    add("hideInstance", &LLFloaterRegListener::hideInstance, requiredName);
-    add("toggleInstance", &LLFloaterRegListener::toggleInstance, requiredName);
+    add("showInstance",
+        "Ask to display the floater specified in [\"name\"]",
+        &LLFloaterRegListener::showInstance,
+        requiredName);
+    add("hideInstance",
+        "Ask to hide the floater specified in [\"name\"]",
+        &LLFloaterRegListener::hideInstance,
+        requiredName);
+    add("toggleInstance",
+        "Ask to toggle the state of the floater specified in [\"name\"]",
+        &LLFloaterRegListener::toggleInstance,
+        requiredName);
     LLSD requiredNameButton;
     requiredNameButton["name"] = LLSD();
     requiredNameButton["button"] = LLSD();
-    add("clickButton", &LLFloaterRegListener::clickButton, requiredNameButton);
+    add("clickButton",
+        "Simulate clicking the named [\"button\"] in the visible floater named in [\"name\"]",
+        &LLFloaterRegListener::clickButton,
+        requiredNameButton);
 }
 
 void LLFloaterRegListener::getBuildMap(const LLSD& event) const
diff --git a/indra/llui/llfloaterreglistener.h b/indra/llui/llfloaterreglistener.h
index 304ecd10904..a38117f6b07 100644
--- a/indra/llui/llfloaterreglistener.h
+++ b/indra/llui/llfloaterreglistener.h
@@ -12,18 +12,18 @@
 #if ! defined(LL_LLFLOATERREGLISTENER_H)
 #define LL_LLFLOATERREGLISTENER_H
 
-#include "lleventdispatcher.h"
+#include "lleventapi.h"
 #include <string>
 
 class LLSD;
 
 /// Event API wrapper for LLFloaterReg
-class LLFloaterRegListener: public LLDispatchListener
+class LLFloaterRegListener: public LLEventAPI
 {
 public:
     /// As all public LLFloaterReg methods are static, there's no point in
     /// binding an LLFloaterReg instance.
-    LLFloaterRegListener(const std::string& pumpName);
+    LLFloaterRegListener();
 
 private:
     void getBuildMap(const LLSD& event) const;
diff --git a/indra/llui/llnotificationslistener.cpp b/indra/llui/llnotificationslistener.cpp
index 75f4d6177dc..fe4fbe75105 100644
--- a/indra/llui/llnotificationslistener.cpp
+++ b/indra/llui/llnotificationslistener.cpp
@@ -16,10 +16,14 @@
 #include "llnotifications.h"
 
 LLNotificationsListener::LLNotificationsListener(LLNotifications & notifications) :
-    LLDispatchListener("LLNotifications", "op"),
+    LLEventAPI("LLNotifications",
+               "LLNotifications listener to (e.g.) pop up a notification"),
     mNotifications(notifications)
 {
-    add("requestAdd", &LLNotificationsListener::requestAdd);
+    add("requestAdd",
+        "Add a notification with specified [\"name\"], [\"substitutions\"] and [\"payload\"].\n"
+        "If optional [\"reply\"] specified, arrange to send user response on that LLEventPump.",
+        &LLNotificationsListener::requestAdd);
 }
 
 void LLNotificationsListener::requestAdd(const LLSD& event_data) const
diff --git a/indra/llui/llnotificationslistener.h b/indra/llui/llnotificationslistener.h
index 6f71a7c7817..9b405d7b4b0 100644
--- a/indra/llui/llnotificationslistener.h
+++ b/indra/llui/llnotificationslistener.h
@@ -12,12 +12,12 @@
 #ifndef LL_LLNOTIFICATIONSLISTENER_H
 #define LL_LLNOTIFICATIONSLISTENER_H
 
-#include "lleventdispatcher.h"
+#include "lleventapi.h"
 
 class LLNotifications;
 class LLSD;
 
-class LLNotificationsListener : public LLDispatchListener
+class LLNotificationsListener : public LLEventAPI
 {
 public:
     LLNotificationsListener(LLNotifications & notifications);
diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp
index 0f00078b33c..3da6a4e3f4e 100644
--- a/indra/newview/llagentlistener.cpp
+++ b/indra/newview/llagentlistener.cpp
@@ -22,12 +22,20 @@
 #include "llviewerregion.h"
 
 LLAgentListener::LLAgentListener(LLAgent &agent)
-  : LLDispatchListener("LLAgent", "op"),
+  : LLEventAPI("LLAgent",
+               "LLAgent listener to (e.g.) teleport, sit, stand, etc."),
     mAgent(agent)
 {
-	add("requestTeleport", &LLAgentListener::requestTeleport);
-	add("requestSit", &LLAgentListener::requestSit);
-	add("requestStand", &LLAgentListener::requestStand);
+	add("requestTeleport",
+        "Teleport: [\"regionname\"], [\"x\"], [\"y\"], [\"z\"]\n"
+        "If [\"skip_confirmation\"] is true, use LLURLDispatcher rather than LLCommandDispatcher.",
+        &LLAgentListener::requestTeleport);
+	add("requestSit",
+        "Ask to sit on the object specified in [\"obj_uuid\"]",
+        &LLAgentListener::requestSit);
+	add("requestStand",
+        "Ask to stand up",
+        &LLAgentListener::requestStand);
 }
 
 void LLAgentListener::requestTeleport(LLSD const & event_data) const
diff --git a/indra/newview/llagentlistener.h b/indra/newview/llagentlistener.h
index 6f0b5a54c5f..eed6922b3e2 100644
--- a/indra/newview/llagentlistener.h
+++ b/indra/newview/llagentlistener.h
@@ -13,12 +13,12 @@
 #ifndef LL_LLAGENTLISTENER_H
 #define LL_LLAGENTLISTENER_H
 
-#include "lleventdispatcher.h"
+#include "lleventapi.h"
 
 class LLAgent;
 class LLSD;
 
-class LLAgentListener : public LLDispatchListener
+class LLAgentListener : public LLEventAPI
 {
 public:
 	LLAgentListener(LLAgent &agent);
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index ddb6589b496..845a264327d 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -207,7 +207,7 @@
 #pragma warning (disable:4702)
 #endif
 
-static LLAppViewerListener sAppViewerListener("LLAppViewer", LLAppViewer::instance);
+static LLAppViewerListener sAppViewerListener(LLAppViewer::instance);
 
 ////// Windows-specific includes to the bottom - nasty defines in these pollute the preprocessor
 //
diff --git a/indra/newview/llappviewerlistener.cpp b/indra/newview/llappviewerlistener.cpp
index 3259309eee7..adb5f43c1a8 100644
--- a/indra/newview/llappviewerlistener.cpp
+++ b/indra/newview/llappviewerlistener.cpp
@@ -19,14 +19,18 @@
 // other Linden headers
 #include "llappviewer.h"
 
-LLAppViewerListener::LLAppViewerListener(const std::string& pumpname,
-                                         const LLAppViewerGetter& getter):
-    LLDispatchListener(pumpname, "op"),
+LLAppViewerListener::LLAppViewerListener(const LLAppViewerGetter& getter):
+    LLEventAPI("LLAppViewer",
+               "LLAppViewer listener to (e.g.) request shutdown"),
     mAppViewerGetter(getter)
 {
     // add() every method we want to be able to invoke via this event API.
-    add("requestQuit", &LLAppViewerListener::requestQuit);
-    add("forceQuit", &LLAppViewerListener::forceQuit);
+    add("requestQuit",
+        "Ask to quit nicely",
+        &LLAppViewerListener::requestQuit);
+    add("forceQuit",
+        "Quit abruptly",
+        &LLAppViewerListener::forceQuit);
 }
 
 void LLAppViewerListener::requestQuit(const LLSD& event)
diff --git a/indra/newview/llappviewerlistener.h b/indra/newview/llappviewerlistener.h
index 73227cb95a7..deedcbc1797 100644
--- a/indra/newview/llappviewerlistener.h
+++ b/indra/newview/llappviewerlistener.h
@@ -12,20 +12,19 @@
 #if ! defined(LL_LLAPPVIEWERLISTENER_H)
 #define LL_LLAPPVIEWERLISTENER_H
 
-#include "lleventdispatcher.h"
+#include "lleventapi.h"
 #include <boost/function.hpp>
 
 class LLAppViewer;
 class LLSD;
 
 /// Listen on an LLEventPump with specified name for LLAppViewer request events.
-class LLAppViewerListener: public LLDispatchListener
+class LLAppViewerListener: public LLEventAPI
 {
 public:
     typedef boost::function<LLAppViewer*(void)> LLAppViewerGetter;
-    /// Specify the pump name on which to listen, and bind the LLAppViewer
-    /// instance to use (e.g. LLAppViewer::instance()).
-    LLAppViewerListener(const std::string& pumpname, const LLAppViewerGetter& getter);
+    /// Bind the LLAppViewer instance to use (e.g. LLAppViewer::instance()).
+    LLAppViewerListener(const LLAppViewerGetter& getter);
 
 private:
     void requestQuit(const LLSD& event);
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index b01293d17c7..80b0a430e02 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -64,7 +64,7 @@
 #include "llwindow.h"
 #include "stringize.h"
 #include "llsdutil_math.h"
-#include "lleventdispatcher.h"
+#include "lleventapi.h"
 
 #if LL_WINDOWS
 #include "lldxhardware.h"
@@ -302,13 +302,17 @@ static std::string get_viewer_release_notes_url()
 	return LLWeb::escapeURL(url.str());
 }
 
-class LLFloaterAboutListener: public LLDispatchListener
+class LLFloaterAboutListener: public LLEventAPI
 {
 public:
 	LLFloaterAboutListener():
-		LLDispatchListener("LLFloaterAbout", "op")
+		LLEventAPI("LLFloaterAbout",
+                   "LLFloaterAbout listener to retrieve About box info")
 	{
-		add("getInfo", &LLFloaterAboutListener::getInfo, LLSD().insert("reply", LLSD()));
+		add("getInfo",
+            "Request an LLSD::Map containing information used to populate About box",
+            &LLFloaterAboutListener::getInfo,
+            LLSD().insert("reply", LLSD()));
 	}
 
 private:
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index e5f347ddc40..945294f3f27 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -73,9 +73,9 @@ LLLoginInstance::LLLoginInstance() :
 {
 	mLoginModule->getEventPump().listen("lllogininstance", 
 		boost::bind(&LLLoginInstance::handleLoginEvent, this, _1));
-	mDispatcher.add("fail.login", boost::bind(&LLLoginInstance::handleLoginFailure, this, _1));
-	mDispatcher.add("connect",    boost::bind(&LLLoginInstance::handleLoginSuccess, this, _1));
-	mDispatcher.add("disconnect", boost::bind(&LLLoginInstance::handleDisconnect, this, _1));
+	mDispatcher.add("fail.login", "", boost::bind(&LLLoginInstance::handleLoginFailure, this, _1));
+	mDispatcher.add("connect",    "", boost::bind(&LLLoginInstance::handleLoginSuccess, this, _1));
+	mDispatcher.add("disconnect", "", boost::bind(&LLLoginInstance::handleDisconnect, this, _1));
 }
 
 LLLoginInstance::~LLLoginInstance()
diff --git a/indra/newview/lluilistener.cpp b/indra/newview/lluilistener.cpp
index 9c643e78dec..8b4cfa72481 100644
--- a/indra/newview/lluilistener.cpp
+++ b/indra/newview/lluilistener.cpp
@@ -20,10 +20,16 @@
 #include "lluictrl.h"
 #include "llerror.h"
 
-LLUIListener::LLUIListener(const std::string& name):
-    LLDispatchListener(name, "op")
+LLUIListener::LLUIListener():
+    LLEventAPI("UI",
+               "LLUICtrl::CommitCallbackRegistry listener.\n"
+               "Capable of invoking any function (with parameter) you can specify in XUI.")
 {
-    add("call", &LLUIListener::call, LLSD().insert("function", LLSD()));
+    add("call",
+        "Invoke the operation named by [\"function\"], passing [\"parameter\"],\n"
+        "as if from a user gesture on a menu -- or a button click.",
+        &LLUIListener::call,
+        LLSD().insert("function", LLSD()));
 }
 
 void LLUIListener::call(const LLSD& event) const
diff --git a/indra/newview/lluilistener.h b/indra/newview/lluilistener.h
index ea904a99ff8..8605d60bd33 100644
--- a/indra/newview/lluilistener.h
+++ b/indra/newview/lluilistener.h
@@ -12,15 +12,15 @@
 #if ! defined(LL_LLUILISTENER_H)
 #define LL_LLUILISTENER_H
 
-#include "lleventdispatcher.h"
+#include "lleventapi.h"
 #include <string>
 
 class LLSD;
 
-class LLUIListener: public LLDispatchListener
+class LLUIListener: public LLEventAPI
 {
 public:
-    LLUIListener(const std::string& name);
+    LLUIListener();
 
 private:
     void call(const LLSD& event) const;
diff --git a/indra/newview/llviewercontrollistener.cpp b/indra/newview/llviewercontrollistener.cpp
index ecba1b8eb0a..0b9db1b906d 100644
--- a/indra/newview/llviewercontrollistener.cpp
+++ b/indra/newview/llviewercontrollistener.cpp
@@ -18,12 +18,22 @@
 LLViewerControlListener gSavedSettingsListener;
 
 LLViewerControlListener::LLViewerControlListener()
-	: LLDispatchListener("LLViewerControl",  "group")
+	: LLEventAPI("LLViewerControl",
+                 "LLViewerControl listener: set, toggle or set default for various controls",
+                 "group")
 {
-	add("Global", boost::bind(&LLViewerControlListener::set, &gSavedSettings, _1));
-	add("PerAccount", boost::bind(&LLViewerControlListener::set, &gSavedPerAccountSettings, _1));
-	add("Warning", boost::bind(&LLViewerControlListener::set, &gWarningSettings, _1));
-	add("Crash", boost::bind(&LLViewerControlListener::set, &gCrashSettings, _1));
+	add("Global",
+        "Set gSavedSettings control [\"key\"] to value [\"value\"]",
+        boost::bind(&LLViewerControlListener::set, &gSavedSettings, _1));
+	add("PerAccount",
+        "Set gSavedPerAccountSettings control [\"key\"] to value [\"value\"]",
+        boost::bind(&LLViewerControlListener::set, &gSavedPerAccountSettings, _1));
+	add("Warning",
+        "Set gWarningSettings control [\"key\"] to value [\"value\"]",
+        boost::bind(&LLViewerControlListener::set, &gWarningSettings, _1));
+	add("Crash",
+        "Set gCrashSettings control [\"key\"] to value [\"value\"]",
+        boost::bind(&LLViewerControlListener::set, &gCrashSettings, _1));
 
 #if 0
 	add(/*"toggleControl",*/ "Global", boost::bind(&LLViewerControlListener::toggleControl, &gSavedSettings, _1));
diff --git a/indra/newview/llviewercontrollistener.h b/indra/newview/llviewercontrollistener.h
index cacf97e908e..88afbb871dc 100644
--- a/indra/newview/llviewercontrollistener.h
+++ b/indra/newview/llviewercontrollistener.h
@@ -12,12 +12,12 @@
 #ifndef LL_LLVIEWERCONTROLLISTENER_H
 #define LL_LLVIEWERCONTROLLISTENER_H
 
-#include "lleventdispatcher.h"
+#include "lleventapi.h"
 
 class LLControlGroup;
 class LLSD;
 
-class  LLViewerControlListener : public LLDispatchListener
+class  LLViewerControlListener : public LLEventAPI
 {
 public:
 	LLViewerControlListener();
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 820f709ba5f..976d89a5b7f 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -415,7 +415,7 @@ class LLMenuParcelObserver : public LLParcelObserver
 
 static LLMenuParcelObserver* gMenuParcelObserver = NULL;
 
-static LLUIListener sUIListener("UI");
+static LLUIListener sUIListener;
 
 LLMenuParcelObserver::LLMenuParcelObserver()
 {
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 6b0f8814b9a..d69cc5999cb 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1212,7 +1212,7 @@ LLViewerWindow::LLViewerWindow(
 	mStatesDirty(false),
 	mIsFullscreenChecked(false),
 	mCurrResolutionIndex(0),
-    mViewerWindowListener(new LLViewerWindowListener("LLViewerWindow", this))
+    mViewerWindowListener(new LLViewerWindowListener(this))
 {
 	LLNotificationChannel::buildChannel("VW_alerts", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alert"));
 	LLNotificationChannel::buildChannel("VW_alertmodal", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alertmodal"));
diff --git a/indra/newview/llviewerwindowlistener.cpp b/indra/newview/llviewerwindowlistener.cpp
index a890b042ae0..de577882711 100644
--- a/indra/newview/llviewerwindowlistener.cpp
+++ b/indra/newview/llviewerwindowlistener.cpp
@@ -20,8 +20,9 @@
 // other Linden headers
 #include "llviewerwindow.h"
 
-LLViewerWindowListener::LLViewerWindowListener(const std::string& pumpname, LLViewerWindow* llviewerwindow):
-    LLDispatchListener(pumpname, "op"),
+LLViewerWindowListener::LLViewerWindowListener(LLViewerWindow* llviewerwindow):
+    LLEventAPI("LLViewerWindow",
+               "LLViewerWindow listener to (e.g.) save a screenshot"),
     mViewerWindow(llviewerwindow)
 {
     // add() every method we want to be able to invoke via this event API.
@@ -34,8 +35,15 @@ LLViewerWindowListener::LLViewerWindowListener(const std::string& pumpname, LLVi
 //  saveSnapshotArgs["showui"] = LLSD::Boolean();
 //  saveSnapshotArgs["rebuild"] = LLSD::Boolean();
 //  saveSnapshotArgs["type"] = LLSD::String();
-    add("saveSnapshot", &LLViewerWindowListener::saveSnapshot, saveSnapshotArgs);
-    add("requestReshape", &LLViewerWindowListener::requestReshape);
+    add("saveSnapshot",
+        "Save screenshot: [\"filename\"], [\"width\"], [\"height\"], [\"showui\"], [\"rebuild\"], [\"type\"]\n"
+        "type: \"COLOR\", \"DEPTH\", \"OBJECT_ID\"\n"
+        "Post on [\"reply\"] an event containing [\"ok\"]",
+        &LLViewerWindowListener::saveSnapshot,
+        saveSnapshotArgs);
+    add("requestReshape",
+        "Resize the window: [\"w\"], [\"h\"]",
+        &LLViewerWindowListener::requestReshape);
 }
 
 void LLViewerWindowListener::saveSnapshot(const LLSD& event) const
diff --git a/indra/newview/llviewerwindowlistener.h b/indra/newview/llviewerwindowlistener.h
index 59c636ecec8..699f7907af2 100644
--- a/indra/newview/llviewerwindowlistener.h
+++ b/indra/newview/llviewerwindowlistener.h
@@ -12,18 +12,17 @@
 #if ! defined(LL_LLVIEWERWINDOWLISTENER_H)
 #define LL_LLVIEWERWINDOWLISTENER_H
 
-#include "lleventdispatcher.h"
+#include "lleventapi.h"
 
 class LLViewerWindow;
 class LLSD;
 
 /// Listen on an LLEventPump with specified name for LLViewerWindow request events.
-class LLViewerWindowListener: public LLDispatchListener
+class LLViewerWindowListener: public LLEventAPI
 {
 public:
-    /// Specify the pump name on which to listen, and bind the LLViewerWindow
-    /// instance to use (e.g. gViewerWindow).
-    LLViewerWindowListener(const std::string& pumpname, LLViewerWindow* llviewerwindow);
+    /// Bind the LLViewerWindow instance to use (e.g. gViewerWindow).
+    LLViewerWindowListener(LLViewerWindow* llviewerwindow);
 
 private:
     void saveSnapshot(const LLSD& event) const;
-- 
GitLab


From 249af0bf9d24da0f6dc3fb1348c12fcbe543ca87 Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Wed, 11 Nov 2009 15:08:49 +0200
Subject: [PATCH 100/557] Fixed normal bug EXT-2131-[BSI] Copy/pasted text chat
 logs are now much harder to read or post-process

--HG--
branch : product-engine
---
 indra/newview/llchathistory.cpp | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 056f2ee333d..289c8cca5a4 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -47,7 +47,6 @@
 #include "llmutelist.h"
 
 static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history");
-static const std::string MESSAGE_USERNAME_DATE_SEPARATOR(" ----- ");
 
 std::string formatCurrentTime()
 {
@@ -333,7 +332,7 @@ LLView* LLChatHistory::getHeader(const LLChat& chat)
 void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& style_params)
 {
 	LLView* view = NULL;
-	std::string view_text;
+	std::string view_text = '[' + formatCurrentTime() + "]:[" + chat.mFromName + "] ";;
 
 	LLInlineViewSegment::Params p;
 	p.force_newline = true;
@@ -343,14 +342,12 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& sty
 	if (mLastFromName == chat.mFromName)
 	{
 		view = getSeparator();
-		view_text = "\n";
 		p.top_pad = mTopSeparatorPad;
 		p.bottom_pad = mBottomSeparatorPad;
 	}
 	else
 	{
 		view = getHeader(chat);
-		view_text = chat.mFromName + MESSAGE_USERNAME_DATE_SEPARATOR + formatCurrentTime() + '\n';
 		if (getText().size() == 0)
 			p.top_pad = 0;
 		else
-- 
GitLab


From 7123f0d447c39c0f81936eef8867b8ff3cc9cda8 Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Wed, 11 Nov 2009 15:27:42 +0200
Subject: [PATCH 101/557] Additional fix for normal bug EXT-2131-[BSI]
 Copy/pasted text chat logs are now much harder to read or post-process

--HG--
branch : product-engine
---
 indra/newview/llchathistory.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 289c8cca5a4..3b893aa5293 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -332,7 +332,7 @@ LLView* LLChatHistory::getHeader(const LLChat& chat)
 void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& style_params)
 {
 	LLView* view = NULL;
-	std::string view_text = '[' + formatCurrentTime() + "]:[" + chat.mFromName + "] ";;
+	std::string view_text = "\n[" + formatCurrentTime() + "]:[" + chat.mFromName + "] ";;
 
 	LLInlineViewSegment::Params p;
 	p.force_newline = true;
-- 
GitLab


From ef721de720690ad4ec89114c56197098c100136c Mon Sep 17 00:00:00 2001
From: Yuri Chebotarev <ychebotarev@productengine.com>
Date: Wed, 11 Nov 2009 15:27:50 +0200
Subject: [PATCH 102/557] fix for major bug EXT-2219 New Group profile layout
 breaks...everything lots of small problems...

--HG--
branch : product-engine
---
 indra/newview/llpanelgrouproles.cpp           |  6 +-
 .../default/xui/en/panel_group_general.xml    | 20 ++---
 .../xui/en/panel_group_info_sidetray.xml      | 60 ++-----------
 .../default/xui/en/panel_group_land_money.xml | 40 ++++-----
 .../default/xui/en/panel_group_notices.xml    | 16 ++--
 .../default/xui/en/panel_group_roles.xml      | 85 ++++++-------------
 6 files changed, 74 insertions(+), 153 deletions(-)

diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index 88aad4923d6..7b5b232ad23 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -2383,12 +2383,8 @@ BOOL LLPanelGroupActionsSubTab::postBuildSubTab(LLView* root)
 void LLPanelGroupActionsSubTab::activate()
 {
 	LLPanelGroupSubTab::activate();
-	lldebugs << "LLPanelGroupActionsSubTab::activate()" << llendl;
 
-	mActionList->deselectAllItems();
-	mActionMembers->deleteAllItems();
-	mActionRoles->deleteAllItems();
-	mActionDescription->clear();
+	update(GC_ALL);
 }
 
 void LLPanelGroupActionsSubTab::deactivate()
diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml
index 4f24c7a745b..58a78a0ab85 100644
--- a/indra/newview/skins/default/xui/en/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_general.xml
@@ -8,7 +8,7 @@
  left="0"
  top="0"
  name="general_tab"
- width="303">
+ width="310">
     <panel.string
      name="help_text">
         The General tab contains general information about this group, a list of members, general Group Preferences and member options.
@@ -32,7 +32,7 @@ Hover your mouse over the options for more help.
      max_length="511"
      name="charter"
      top="5"
-     width="303"
+     width="305"
      word_wrap="true">
      Group Charter
     </text_editor>
@@ -43,10 +43,10 @@ Hover your mouse over the options for more help.
      heading_height="16"
      height="130"
      layout="topleft"
-     left_delta="0"
+     left="5"
      name="visible_members"
-     top_pad="0"
-     width="303">
+     top_pad="2"
+     width="305">
         <name_list.columns
          label="Member"
          name="name"
@@ -64,7 +64,7 @@ Hover your mouse over the options for more help.
          left_delta="0"
          name="active_title_label"
          top_pad="5"
-         width="303">
+         width="300">
             My Title
         </text>
         <combo_box
@@ -75,7 +75,7 @@ Hover your mouse over the options for more help.
          name="active_title"
          tool_tip="Sets the title that appears in your avatar&apos;s name tag when this group is active."
          top_pad="2"
-         width="303" />
+         width="305" />
         <check_box
          height="16"
          font="SansSerifSmall"
@@ -85,7 +85,7 @@ Hover your mouse over the options for more help.
          name="receive_notices"
          tool_tip="Sets whether you want to receive Notices from this group.  Uncheck this box if this group is spamming you."
          top_pad="5"
-         width="303" />
+         width="300" />
         <check_box
          height="16"
          label="Show in my profile"
@@ -94,7 +94,7 @@ Hover your mouse over the options for more help.
          name="list_groups_in_profile"
          tool_tip="Sets whether you want to show this group in your profile"
          top_pad="5"
-         width="303" />
+         width="295" />
         <panel
          background_visible="true"
          bevel_style="in"
@@ -106,7 +106,7 @@ Hover your mouse over the options for more help.
          left="5"
          name="preferences_container"
          top_pad="5"
-         width="303">
+         width="305">
         <check_box
          follows="right|top"
          height="16"
diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
index de1323d9cb5..0082128ca42 100644
--- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
@@ -9,7 +9,7 @@ background_visible="true"
  left="0"
  top="20"
  name="GroupInfo"
- width="333">
+ width="323">
     <panel.string
      name="default_needs_apply_text">
         There are unsaved changes to the current tab
@@ -117,28 +117,17 @@ background_visible="true"
      width="120" />
    <accordion
              follows="all"
-             height="425"
+             height="405"
              layout="topleft"
              left="0"
              name="groups_accordion"
              top_pad="15"
-             width="336">
+             width="323">
              <accordion_tab
                  expanded="true"
                  layout="topleft"
                  name="group_general_tab"
                  title="General">
-         <scroll_container
-         color="DkGray2"
-         opaque="true"
-         height="323"
-         follows="all"
-         layout="topleft"
-         left="0"
-         top="0"
-         name="general_scroll"
-         reserve_scroll_corner="false"
-         width="333">
             <panel
             border="false"
          class="panel_group_general" 
@@ -146,27 +135,15 @@ background_visible="true"
              layout="topleft"
              left="0"
              help_topic="group_general_tab"
-         name="group_general_tab_panel"
+             name="group_general_tab_panel"
              top="0"
-             width="303" />
-         </scroll_container>
+             width="300" />
          </accordion_tab>
          <accordion_tab
                  expanded="false"
                  layout="topleft"
                  name="group_roles_tab"
                  title="Roles">
-               <scroll_container
-                  color="DkGray2"
-                  opaque="true"
-                  height="323"
-                  follows="all"
-                  layout="topleft"
-                  left="0"
-                  top="0"
-                  name="roles_scroll"
-                  reserve_scroll_corner="false"
-                  width="333">
                  <panel
                  border="false"
          class="panel_group_roles"
@@ -177,24 +154,12 @@ background_visible="true"
          name="group_roles_tab_panel"
                   top="0"
              width="303" />
-         </scroll_container>
          </accordion_tab>
          <accordion_tab
                  expanded="false"
                  layout="topleft"
                  name="group_notices_tab"
                  title="Notices">
-            <scroll_container
-                  color="DkGray2"
-                  opaque="true"
-                  height="323"
-                  follows="all"
-                  layout="topleft"
-                  left="0"
-                  top="0"
-                  name="notices_scroll"
-                  reserve_scroll_corner="false"
-                  width="333">
         <panel
         border="false"
          class="panel_group_notices"
@@ -205,24 +170,12 @@ background_visible="true"
          name="group_notices_tab_panel"
          top="0"
          width="303" />
-         </scroll_container>
          </accordion_tab>
         <accordion_tab
                  expanded="false"
                  layout="topleft"
                  name="group_land_tab"
                  title="Land/Assets">
-           <scroll_container
-                  color="DkGray2"
-                  opaque="true"
-                  height="323"
-                  follows="all"
-                  layout="topleft"
-                  left="0"
-                  top="0"
-                  name="land_scroll"
-                  reserve_scroll_corner="false"
-                  width="333">
         <panel
         border="false"
          class="panel_group_land_money"
@@ -232,8 +185,7 @@ background_visible="true"
          help_topic="group_land_money_tab"
          name="group_land_tab_panel"
          top="0"
-         width="313" />
-         </scroll_container>
+         width="300" />
          </accordion_tab>
          </accordion>
    <button
diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
index 0c6f81f8fd8..2c649642c33 100644
--- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
@@ -5,10 +5,10 @@
  height="510"
  label="Land &amp; L$"
  layout="topleft"
- left="1"
+ left="0"
  name="land_money_tab"
  top="0"
- width="313">
+ width="310">
     <panel.string
      name="help_text">
         Parcels owned by a group are listed along with contribution details. A warning appears until the Total Land in Use is less than or = to the Total Contribution.
@@ -47,10 +47,10 @@
      heading_height="20"
      height="150"
      layout="topleft"
-     left="0"
+     left="2"
      name="group_parcel_list"
      top_pad="0"
-     width="313">
+     width="305">
         <scroll_list.columns
          label="Parcel"
          name="name"
@@ -79,7 +79,7 @@
      label_selected="Map"
      layout="topleft"
      name="map_button"
-     right="-10"
+     right="-5"
      top_pad="5"
      width="95"
      enabled="false" />
@@ -185,7 +185,9 @@
      layout="topleft"
      left_pad="3"
      name="your_contribution_units"
-     top_delta="2">
+     top_delta="2"
+     width="40"
+      >
         m²
     </text>
      <text
@@ -210,17 +212,17 @@
      visible="false"
      width="16" />
     <text
-      follows="left|top"
+     follows="left|top"
      type="string"
      word_wrap="true"
      font="SansSerifSmall"
      height="35"
      layout="topleft"
-     left_pad="0"
+     left_pad="5"
      name="group_over_limit_text"
      text_color="EmphasisColor"
      top_delta="0"
-     width="290">
+     width="260">
         Group members must contribute more land credits to support land in use
     </text>
     <text
@@ -241,7 +243,7 @@
      height="200"
      halign="center"
      layout="topleft"
-     left="10"
+     left="5"
      name="group_money_tab_container"
      tab_position="top"
      tab_height="20"
@@ -268,7 +270,7 @@
              left="0"
              max_length="4096"
              name="group_money_planning_text"
-             top="0"
+             top="2"
              width="300"
              word_wrap="true">
                 Loading...
@@ -293,7 +295,7 @@
              left="0"
              max_length="4096"
              name="group_money_details_text"
-             top="0"
+             top="2"
              width="300"
              word_wrap="true">
                 Loading...
@@ -305,8 +307,8 @@
 	     layout="topleft"
 	     name="earlier_details_button"
 	     tool_tip="Back"
-	     top_pad="3"
-             right="-35"
+	     top_pad="5"
+             right="-45"
 	     width="31" />
              <button
 	     follows="left|top"
@@ -327,7 +329,7 @@
          left_delta="0"
          help_topic="group_money_sales_tab"
          name="group_money_sales_tab"
-         top_delta="-1"
+         top="5"
          width="300">
             <text_editor
              type="string"
@@ -337,7 +339,7 @@
              left="0"
              max_length="4096"
              name="group_money_sales_text"
-             top="0"
+             top="2"
              width="300"
              word_wrap="true">
                 Loading...
@@ -349,8 +351,8 @@
 	     layout="topleft"
 	     name="earlier_sales_button"
 	     tool_tip="Back"
-	     top_pad="3"
-             right="-35"
+	     top_pad="5"
+         right="-45"
 	     width="31" />
              <button
 	     follows="left|top"
@@ -358,7 +360,7 @@
 	     image_overlay="Arrow_Right_Off"
 	     layout="topleft"
 	     left_pad="10"
-             name="later_sales_button"
+         name="later_sales_button"
 	     tool_tip="Next"
 	     width="31" />
         </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml
index 24a4005a459..e56db6414f9 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -7,7 +7,7 @@
  left="0"
  name="notices_tab"
  top="0"
- width="313">
+ width="310">
     <panel.string
      name="help_text">
         Notices are a quick way to communicate across a 
@@ -27,7 +27,7 @@ the General tab.
      word_wrap="true"
      height="30"
      layout="topleft"
-     left="10"
+     left="5"
      name="lbl2"
      top="5"
      width="300">
@@ -41,10 +41,10 @@ Groups are limited to 200 notices/group daily
      heading_height="16"
      height="125"
      layout="topleft"
-     left="0"
+     left="2"
      name="notice_list"
      top_pad="0"
-     width="303">
+     width="305">
         <scroll_list.columns
          label=""
          name="icon"
@@ -81,10 +81,10 @@ Groups are limited to 200 notices/group daily
        image_disabled="AddItem_Disabled"
        layout="topleft"
        label="Create a new notice"
-       left="15"
+       left="5"
        name="create_new_notice"
        tool_tip="Create a new notice"
-     top_delta="-5"
+     top_delta="0"
        width="18" />
      <button
      follows="top|left"
@@ -93,7 +93,7 @@ Groups are limited to 200 notices/group daily
      layout="topleft"
      name="refresh_notices"
      right="-5"
-     top_delta="5"
+     top_delta="0"
      width="23" />
     <panel
      follows="left|top"
@@ -219,7 +219,7 @@ Groups are limited to 200 notices/group daily
          label_selected="Send Notice"
          layout="topleft"
          right="-10"
-         top_pad="20"
+         top_pad="10"
          name="send_notice"
          width="100" />
       <group_drop_target
diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml
index 4129d7b4488..604fb81c8e7 100644
--- a/indra/newview/skins/default/xui/en/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml
@@ -7,7 +7,7 @@
  left="0"
  top="0"
  name="roles_tab"
- width="313">
+ width="310">
     <panel.string
      name="default_needs_apply_text">
         There are unsaved changes to the current tab
@@ -28,9 +28,9 @@
      name="roles_tab_container"
      tab_position="top"
      tab_height="20"
-     tab_min_width="96"
+     tab_min_width="75"
      top="3"
-     width="303">
+     width="300">
         <panel
          border="false"
          height="220"
@@ -51,23 +51,13 @@ clicking on their names.
          <filter_editor
          layout="topleft"
          top="10"
-         left="4"
+         left="5"
          width="280"
          height="20"
          follows="left|top|right"
          max_length="250"
          label="Filter Members"
          name="filter_input" />
-          <!--  <button
-             enabled="false"
-             font="SansSerifSmall"
-             height="20"
-             label="Show All"
-             layout="topleft"
-             left_pad="-90"
-             name="show_all_button"
-             top_delta="-6"
-             width="80" />-->
             <name_list
              column_padding="0"
              draw_heading="true"
@@ -111,14 +101,6 @@ clicking on their names.
              right="-5"
              name="member_eject"
              width="100" />
-             <!--What is this?-->
-            <icon
-             height="16"
-             image_name="Inv_FolderClosed"
-             layout="topleft"
-             name="power_folder_icon"
-             visible="false"
-             width="16" />
         </panel>
         <panel
          border="false"
@@ -156,7 +138,7 @@ including the Everyone and Owner Roles.
          <filter_editor
          layout="topleft"
          top="10"
-         left="4"
+         left="5"
          width="280"
          height="20"
          follows="left|top|right"
@@ -179,12 +161,12 @@ including the Everyone and Owner Roles.
              draw_stripes="false"
              follows="left|top"
              heading_height="20"
-             height="150"
+             height="160"
              layout="topleft"
              search_column="1"
              left="0"
              name="role_list"
-             top_pad="4"
+             top_pad="2"
              width="300">
                 <scroll_list.columns
                  label="Role"
@@ -238,24 +220,13 @@ things in this group. There&apos;s a broad variety of Abilities.
          <filter_editor
          layout="topleft"
          top="10"
-         left="4"
+         left="5"
          width="280"
          height="20"
          follows="left|top|right"
          max_length="250"
          label="Filter Abilities"
          name="filter_input" />
-            <!--
-            <button
-             enabled="false"
-             font="SansSerifSmall"
-             height="20"
-             label="Show All"
-             layout="topleft"
-             left_pad="0"
-             name="show_all_button"
-             top_delta="0"
-             width="80" /> -->
             <scroll_list
              column_padding="0"
              draw_stripes="false"
@@ -267,14 +238,14 @@ things in this group. There&apos;s a broad variety of Abilities.
              name="action_list"
              search_column="1"
              tool_tip="Select an Ability to view more details"
-             top_pad="6"
+             top_pad="2"
              width="300">
                 <scroll_list.columns
                  label=""
                  name="icon"
                  width="16" />
                 <scroll_list.columns
-                 label=""
+                 label="Action"
                  name="action"
                  width="247" />
             </scroll_list>
@@ -293,9 +264,9 @@ things in this group. There&apos;s a broad variety of Abilities.
      follows="left|top"
      left="10"
      name="members_footer"
-     top_pad="10"
+     top="245"
      top_delta="0"
-     width="300">
+     width="290">
         <text
          type="string"
          height="16"
@@ -304,7 +275,7 @@ things in this group. There&apos;s a broad variety of Abilities.
          left="0"
          name="static"
          top_pad="5"
-         width="295">
+         width="285">
             Assigned Roles
         </text>
         <scroll_list
@@ -315,7 +286,7 @@ things in this group. There&apos;s a broad variety of Abilities.
          left="0"
          name="member_assigned_roles"
          top_pad="0"
-         width="295">
+         width="285">
             <scroll_list.columns
              label=""
              name="checkbox"
@@ -323,7 +294,7 @@ things in this group. There&apos;s a broad variety of Abilities.
             <scroll_list.columns
              label=""
              name="role"
-             width="265" />
+             width="255" />
         </scroll_list>
                  <text
          type="string"
@@ -333,7 +304,7 @@ things in this group. There&apos;s a broad variety of Abilities.
          left="0"
          name="static2"
          top_pad="5"
-         width="295">
+         width="285">
             Allowed Abilities
         </text>
          <scroll_list
@@ -345,7 +316,7 @@ things in this group. There&apos;s a broad variety of Abilities.
          search_column="2"
          tool_tip="For details of each allowed ability see the abilities tab"
          top_pad="0"
-         width="295">
+         width="285">
             <scroll_list.columns
              label=""
              name="icon"
@@ -353,7 +324,7 @@ things in this group. There&apos;s a broad variety of Abilities.
             <scroll_list.columns
              label=""
              name="action"
-             width="275" />
+             width="265" />
         </scroll_list>
     </panel>
     <panel
@@ -364,7 +335,7 @@ things in this group. There&apos;s a broad variety of Abilities.
      top_delta="0"
      top="245"
      visible="false"
-     width="300">
+     width="290">
         <text
          type="string"
          height="16"
@@ -386,7 +357,7 @@ things in this group. There&apos;s a broad variety of Abilities.
          max_length="295"
          name="role_name"
          top_pad="0"
-         width="295">
+         width="290">
             Employees
         </line_editor>
         <text
@@ -395,7 +366,7 @@ things in this group. There&apos;s a broad variety of Abilities.
          layout="topleft"
          name="static3"
          top_pad="5"
-         width="295">
+         width="290">
             Title
         </text>
         <line_editor
@@ -408,7 +379,7 @@ things in this group. There&apos;s a broad variety of Abilities.
          max_length="295"
          name="role_title"
          top_pad="0"
-         width="295">
+         width="290">
           (waiting)
         </line_editor>
                 <text
@@ -442,7 +413,7 @@ things in this group. There&apos;s a broad variety of Abilities.
          left="0"
          name="static4"
          top_pad="5"
-         width="295">
+         width="290">
             Assigned Roles
         </text>
         <name_list
@@ -452,7 +423,7 @@ things in this group. There&apos;s a broad variety of Abilities.
          left="0"
          name="role_assigned_members"
          top_pad="0"
-         width="295" />
+         width="290" />
         <check_box
          height="15"
          label="Reveal members"
@@ -469,7 +440,7 @@ things in this group. There&apos;s a broad variety of Abilities.
          left="0"
          name="static5"
          top_pad="5"
-         width="295">
+         width="290">
             Allowed Abilities
         </text>
         <scroll_list
@@ -504,7 +475,7 @@ things in this group. There&apos;s a broad variety of Abilities.
      top_delta="0"
      top="245"
      visible="false"
-     width="300">
+     width="290">
         <text
          type="string"
          height="16"
@@ -550,7 +521,7 @@ things in this group. There&apos;s a broad variety of Abilities.
          layout="topleft"
          name="static3"
          top_pad="5"
-         width="295">
+         width="290">
             Members with this ability
         </text>
         <name_list
@@ -558,6 +529,6 @@ things in this group. There&apos;s a broad variety of Abilities.
          layout="topleft"
          name="action_members"
          top_pad="0"
-         width="295" />
+         width="290" />
     </panel>
 </panel>
-- 
GitLab


From 5ca8c5f61d3ee507955924e45a0201c70d9ab58b Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Wed, 11 Nov 2009 15:48:55 +0200
Subject: [PATCH 103/557] Fixed normal bug EXT-2166-[BSI] Nearby Chat floater
 always jumps to most recent chat

--HG--
branch : product-engine
---
 indra/newview/llchathistory.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 3b893aa5293..6cdec469dc8 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -371,5 +371,4 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& sty
 
 	mLastFromName = chat.mFromName;
 	blockUndo();
-	setCursorAndScrollToEnd();
 }
-- 
GitLab


From 61fdd33f7916dbf13c5c56e2d4c0ccb14fdae150 Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Wed, 11 Nov 2009 16:11:57 +0200
Subject: [PATCH 104/557] Fixed Low bug EXT-1052-IM message window show
 messages, that were sent in offline mode

--HG--
branch : product-engine
---
 indra/newview/llimfloater.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 8b44ccebdde..fd297986fc7 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -517,7 +517,7 @@ void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void*
 	LLIMModel::LLIMSession* im_session =
 		LLIMModel::instance().findIMSession(self->mSessionID);
 	//TODO: While disabled lllineeditor can receive focus we need to check if it is enabled (EK)
-	if( im_session && im_session->mTextIMPossible && !self->mInputEditor->getEnabled())
+	if( im_session && im_session->mTextIMPossible && self->mInputEditor->getEnabled())
 	{
 		//in disconnected state IM input editor should be disabled
 		self->mInputEditor->setEnabled(!gDisconnected);
-- 
GitLab


From 3862e9721906d2bbdf61cfcc4d6970a24ce7e6e0 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Wed, 11 Nov 2009 16:17:29 +0200
Subject: [PATCH 105/557] Work on major sub-task EXT-991 (Update bottom bar
 behavior on resize) Code refactored:   - processShowButton() now gets type of
 buttons should be shown instead of object   - removed unnecessary code

--HG--
branch : product-engine
---
 indra/newview/llbottomtray.cpp | 98 ++++++++++++++++------------------
 indra/newview/llbottomtray.h   | 18 ++++++-
 2 files changed, 63 insertions(+), 53 deletions(-)

diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 0ebf9947e39..08b1847887c 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -75,6 +75,8 @@ LLBottomTray::LLBottomTray(const LLSD&)
 	//destroyed LLBottomTray requires some subsystems that are long gone
 	LLUI::getRootView()->addChild(this);
 
+	initStateProcessedObjectMap();
+
 	// Necessary for focus movement among child controls
 	setFocusRoot(TRUE);
 }
@@ -255,21 +257,6 @@ void LLBottomTray::showSnapshotButton(BOOL visible)
 	mSnapshotPanel->setVisible(visible);
 }
 
-typedef enum e_resize_status_type
-{
-	RS_NORESIZE			= 0x0000
-	, RS_CHICLET_PANEL		= 0x0001
-	, RS_CHATBAR_INPUT		= 0x0002
-	, RS_BUTTON_SNAPSHOT	= 0x0004
-	, RS_BUTTON_CAMERA		= 0x0008
-	, RS_BUTTON_MOVEMENT	= 0x0010
-	, RS_BUTTON_GESTURES	= 0x0020
-	, RS_BUTTON_SPEAK		= 0x0040
-	, RS_RESIZABLE_BUTTONS			= /*RS_BUTTON_SNAPSHOT | */RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES
-}EResizeState;
-
-
-
 namespace
 {
 	const std::string& PANEL_CHICLET_NAME	= "chiclet_list_panel";
@@ -306,7 +293,7 @@ void LLBottomTray::log(LLView* panel, const std::string& descr)
 {
 	if (NULL == panel) return;
 	LLView* layout = panel->getParent();
-	llwarns << descr << ": "
+	lldebugs << descr << ": "
 		<< "panel: " << panel->getName()
 		<< ", rect: " << panel->getRect()
  
@@ -379,7 +366,6 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
 void LLBottomTray::updateResizeState(S32 new_width, S32 cur_width)
 {
 	mResizeState = RS_NORESIZE;
-	static MASK prev_resize_state = mResizeState;
 	MASK compensative_view_item_mask = RS_CHATBAR_INPUT;
 	LLPanel* compansative_view = mNearbyChatBar;
 
@@ -543,43 +529,28 @@ void LLBottomTray::updateResizeState(S32 new_width, S32 cur_width)
 		S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width;
 		S32 available_width = delta_width + chatbar_available_shrink_width + available_width_chiclet;
 		S32 buttons_required_width = 0; //How many room will take shown buttons
-		if (available_width > 0 && processShowButton(mGesturePanel, &available_width, &buttons_required_width))
+		if (available_width > 0)
 		{
-			mResizeState |= RS_BUTTON_GESTURES | compensative_view_item_mask;
-			lldebugs << "RS_BUTTON_GESTURES"
-				<< ", buttons_required_width: " << buttons_required_width
-				<< llendl;
-			showGestureButton(true);
+			lldebugs << "Trying to process: RS_BUTTON_GESTURES" << llendl;
+			processShowButton(RS_BUTTON_GESTURES, &available_width, &buttons_required_width);
 		}
 
-		if (available_width > 0 && processShowButton(mMovementPanel, &available_width, &buttons_required_width))
+		if (available_width > 0)
 		{
-			mResizeState |= RS_BUTTON_MOVEMENT | compensative_view_item_mask;
-
-			lldebugs << "RS_BUTTON_MOVEMENT"
-				<< ", buttons_required_width: " << buttons_required_width
-				<< llendl;
-			showMoveButton(true);
+			lldebugs << "Trying to process: RS_BUTTON_MOVEMENT" << llendl;
+			processShowButton(RS_BUTTON_MOVEMENT, &available_width, &buttons_required_width);
 		}
 
-		if (available_width > 0 && processShowButton(mCamPanel, &available_width, &buttons_required_width))
+		if (available_width > 0)
 		{
-			mResizeState |= RS_BUTTON_CAMERA | compensative_view_item_mask;
-
-			lldebugs << "RS_BUTTON_CAMERA "
-				<< ", buttons_required_width: " << buttons_required_width
-				<< llendl;
-			showCameraButton(true);
+			lldebugs << "Trying to process: RS_BUTTON_CAMERA" << llendl;
+			processShowButton(RS_BUTTON_CAMERA, &available_width, &buttons_required_width);
 		}
 
-		if (available_width > 0 && processShowButton(mSnapshotPanel, &available_width, &buttons_required_width))
+		if (available_width > 0)
 		{
-			mResizeState |= RS_BUTTON_SNAPSHOT | compensative_view_item_mask;
-
-			lldebugs << "RS_BUTTON_SNAPSHOT"
-				<< ", buttons_required_width: " << buttons_required_width
-				<< llendl;
-			showSnapshotButton(true);
+			lldebugs << "Trying to process: RS_BUTTON_SNAPSHOT" << llendl;
+			processShowButton(RS_BUTTON_SNAPSHOT, &available_width, &buttons_required_width);
 		}
 
 		S32 total_delta_width = new_width - cur_width;
@@ -587,6 +558,8 @@ void LLBottomTray::updateResizeState(S32 new_width, S32 cur_width)
 		// if we have to show some buttons but whidth increasing is not enough...
 		if (buttons_required_width > 0 && total_delta_width < buttons_required_width)
 		{
+			mResizeState |= compensative_view_item_mask;
+
 			// ... let's shrink nearby chat & chiclet panels
 			S32 required_to_process_width = buttons_required_width;
 
@@ -630,19 +603,19 @@ void LLBottomTray::updateResizeState(S32 new_width, S32 cur_width)
 			delta_width -= delta_panel_max;
 			mNearbyChatBar->reshape(chatbar_panel_width_ + delta_panel, mNearbyChatBar->getRect().getHeight());
 		}
-
-		if (delta_width > 0)
-		{
-			mResizeState |= RS_CHICLET_PANEL;
-		}
 	}
 
-	prev_resize_state = mResizeState;
 	lldebugs << "New resize state: " << mResizeState << llendl;
 }
 
-bool LLBottomTray::processShowButton(LLPanel* panel, S32* available_width, S32* buttons_required_width)
+bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* available_width, S32* buttons_required_width)
 {
+	LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
+	if (NULL == panel)
+	{
+		lldebugs << "There is no object to process for state: " << shown_object_type << llendl;
+		return false;
+	}
 	bool can_be_shown = canButtonBeShown(panel);
 	if (can_be_shown)
 	{
@@ -653,8 +626,21 @@ bool LLBottomTray::processShowButton(LLPanel* panel, S32* available_width, S32*
 		{
 			*available_width -= required_width;
 			*buttons_required_width += required_width;
-		}
 
+			switch (shown_object_type)
+			{
+			case RS_BUTTON_GESTURES:	showGestureButton(true);				break;
+			case RS_BUTTON_MOVEMENT:	showMoveButton(true);					break;
+			case RS_BUTTON_CAMERA:		showCameraButton(true);					break;
+			case RS_BUTTON_SNAPSHOT:	showSnapshotButton(true);				break;
+			default:
+				llwarns << "Unexpected type of button to be shown: " << shown_object_type << llendl;
+			}
+
+			lldebugs << "processing object type: " << shown_object_type
+				<< ", buttons_required_width: " << buttons_required_width
+				<< llendl;
+		}
 	}
 	return can_be_shown;
 }
@@ -668,4 +654,12 @@ bool LLBottomTray::canButtonBeShown(LLPanel* panel) const
 	}
 	return can_be_shown;
 }
+
+void LLBottomTray::initStateProcessedObjectMap()
+{
+	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, mGesturePanel));
+	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, mMovementPanel));
+	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, mCamPanel));
+	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, mSnapshotPanel));
+}
 //EOF
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 509f8b1e410..c2eeef239c3 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -83,15 +83,31 @@ class LLBottomTray
 	void showSnapshotButton(BOOL visible);
 
 private:
+	typedef enum e_resize_status_type
+	{
+		  RS_NORESIZE			= 0x0000
+		, RS_CHICLET_PANEL		= 0x0001
+		, RS_CHATBAR_INPUT		= 0x0002
+		, RS_BUTTON_SNAPSHOT	= 0x0004
+		, RS_BUTTON_CAMERA		= 0x0008
+		, RS_BUTTON_MOVEMENT	= 0x0010
+		, RS_BUTTON_GESTURES	= 0x0020
+		, RS_BUTTON_SPEAK		= 0x0040
+		, RS_RESIZABLE_BUTTONS			= /*RS_BUTTON_SNAPSHOT | */RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES
+	}EResizeState;
 
 	void updateResizeState(S32 new_width, S32 cur_width);
 	void verifyChildControlsSizes();
 	void log(LLView* panel, const std::string& descr);
-	bool processShowButton(LLPanel* panel, S32* available_width, S32* buttons_required_width);
+	bool processShowButton(EResizeState shown_object_type, S32* available_width, S32* buttons_required_width);
 	bool canButtonBeShown(LLPanel* panel) const;
+	void initStateProcessedObjectMap();
 
 	MASK mResizeState;
 
+	typedef std::map<EResizeState, LLPanel*> state_object_map_t;
+	state_object_map_t mStateProcessedObjectMap;
+
 protected:
 
 	LLBottomTray(const LLSD& key = LLSD());
-- 
GitLab


From 454c02102c71e39fc0d844a1ae8bd70873de01a1 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Wed, 11 Nov 2009 16:42:18 +0200
Subject: [PATCH 106/557] Work on major sub-task EXT-991 (Update bottom bar
 behavior on resize) Code refactored:   - moved code to process width
 increasing into separate method

--HG--
branch : product-engine
---
 indra/newview/llbottomtray.cpp | 140 ++++++++++++++++++---------------
 indra/newview/llbottomtray.h   |   2 +
 2 files changed, 80 insertions(+), 62 deletions(-)

diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 08b1847887c..9ff6c05acce 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -525,87 +525,103 @@ void LLBottomTray::updateResizeState(S32 new_width, S32 cur_width)
 	// bottom tray is widen
 	else
 	{
-		S32 chatbar_available_shrink_width = chatbar_panel_width - chatbar_panel_min_width;
-		S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width;
-		S32 available_width = delta_width + chatbar_available_shrink_width + available_width_chiclet;
-		S32 buttons_required_width = 0; //How many room will take shown buttons
-		if (available_width > 0)
-		{
-			lldebugs << "Trying to process: RS_BUTTON_GESTURES" << llendl;
-			processShowButton(RS_BUTTON_GESTURES, &available_width, &buttons_required_width);
-		}
+		processWidthIncreased(delta_width);
+	}
 
-		if (available_width > 0)
-		{
-			lldebugs << "Trying to process: RS_BUTTON_MOVEMENT" << llendl;
-			processShowButton(RS_BUTTON_MOVEMENT, &available_width, &buttons_required_width);
-		}
+	lldebugs << "New resize state: " << mResizeState << llendl;
+}
 
-		if (available_width > 0)
-		{
-			lldebugs << "Trying to process: RS_BUTTON_CAMERA" << llendl;
-			processShowButton(RS_BUTTON_CAMERA, &available_width, &buttons_required_width);
-		}
+void LLBottomTray::processWidthDecreased(S32 delta_width)
+{
 
-		if (available_width > 0)
-		{
-			lldebugs << "Trying to process: RS_BUTTON_SNAPSHOT" << llendl;
-			processShowButton(RS_BUTTON_SNAPSHOT, &available_width, &buttons_required_width);
-		}
+}
 
-		S32 total_delta_width = new_width - cur_width;
+void LLBottomTray::processWidthIncreased(S32 delta_width)
+{
+	const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
+	const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
 
-		// if we have to show some buttons but whidth increasing is not enough...
-		if (buttons_required_width > 0 && total_delta_width < buttons_required_width)
-		{
-			mResizeState |= compensative_view_item_mask;
+	const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
+	const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
+	const S32 chatbar_panel_max_width = mNearbyChatBar->getMaxWidth();
 
-			// ... let's shrink nearby chat & chiclet panels
-			S32 required_to_process_width = buttons_required_width;
+	const S32 chatbar_available_shrink_width = chatbar_panel_width - chatbar_panel_min_width;
+	const S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width;
 
-			// 1. use delta width of resizing
-			required_to_process_width -= total_delta_width;
+	// how many room we have to show hidden buttons
+	S32 available_width = delta_width + chatbar_available_shrink_width + available_width_chiclet;
+	S32 buttons_required_width = 0; //How many room will take shown buttons
 
-			// 2. use delta width available via decreasing of nearby chat panel
-			S32 chatbar_shrink_width = required_to_process_width;
-			if (chatbar_available_shrink_width < chatbar_shrink_width)
-			{
-				chatbar_shrink_width = chatbar_available_shrink_width;
-			}
+	if (available_width > 0)
+	{
+		lldebugs << "Trying to process: RS_BUTTON_GESTURES" << llendl;
+		processShowButton(RS_BUTTON_GESTURES, &available_width, &buttons_required_width);
+	}
 
-			log(compansative_view, "increase width: before applying compensative width: ");
-			compansative_view->reshape(compansative_view->getRect().getWidth() - chatbar_shrink_width, compansative_view->getRect().getHeight() );
-			if (compansative_view)			log(compansative_view, "after applying compensative width: ");
-			lldebugs << chatbar_shrink_width << llendl;
+	if (available_width > 0)
+	{
+		lldebugs << "Trying to process: RS_BUTTON_MOVEMENT" << llendl;
+		processShowButton(RS_BUTTON_MOVEMENT, &available_width, &buttons_required_width);
+	}
 
-			// 3. use delta width available via decreasing of chiclet panel
-			required_to_process_width -= chatbar_shrink_width;
+	if (available_width > 0)
+	{
+		lldebugs << "Trying to process: RS_BUTTON_CAMERA" << llendl;
+		processShowButton(RS_BUTTON_CAMERA, &available_width, &buttons_required_width);
+	}
 
-			if (required_to_process_width > 0)
-			{
-				mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - required_to_process_width, mChicletPanel->getParent()->getRect().getHeight());
-				log(mChicletPanel, "after applying compensative width for chiclets: ");
-				lldebugs << required_to_process_width << llendl;
-			}
+	if (available_width > 0)
+	{
+		lldebugs << "Trying to process: RS_BUTTON_SNAPSHOT" << llendl;
+		processShowButton(RS_BUTTON_SNAPSHOT, &available_width, &buttons_required_width);
+	}
 
+	// if we have to show some buttons but whidth increasing is not enough...
+	if (buttons_required_width > 0 && delta_width < buttons_required_width)
+	{
+		// ... let's shrink nearby chat & chiclet panels
+		S32 required_to_process_width = buttons_required_width;
+
+		// 1. use delta width of resizing
+		required_to_process_width -= delta_width;
+
+		// 2. use width available via decreasing of nearby chat panel
+		S32 chatbar_shrink_width = required_to_process_width;
+		if (chatbar_available_shrink_width < chatbar_shrink_width)
+		{
+			chatbar_shrink_width = chatbar_available_shrink_width;
 		}
 
-		// shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels
-		delta_width -= buttons_required_width;
+		log(mNearbyChatBar, "increase width: before applying compensative width: ");
+		mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - chatbar_shrink_width, mNearbyChatBar->getRect().getHeight() );
+		if (mNearbyChatBar)			log(mNearbyChatBar, "after applying compensative width: ");
+		lldebugs << chatbar_shrink_width << llendl;
+
+		// 3. use width available via decreasing of chiclet panel
+		required_to_process_width -= chatbar_shrink_width;
 
-		// how many space can nearby chatbar take?
-		S32 chatbar_panel_width_ = mNearbyChatBar->getRect().getWidth();
-		if (delta_width > 0 && chatbar_panel_width_ < chatbar_panel_max_width)
+		if (required_to_process_width > 0)
 		{
-			mResizeState |= RS_CHATBAR_INPUT;
-			S32 delta_panel_max = chatbar_panel_max_width - chatbar_panel_width_;
-			S32 delta_panel = llmin(delta_width, delta_panel_max);
-			delta_width -= delta_panel_max;
-			mNearbyChatBar->reshape(chatbar_panel_width_ + delta_panel, mNearbyChatBar->getRect().getHeight());
+			mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - required_to_process_width, mChicletPanel->getParent()->getRect().getHeight());
+			log(mChicletPanel, "after applying compensative width for chiclets: ");
+			lldebugs << required_to_process_width << llendl;
 		}
+
 	}
 
-	lldebugs << "New resize state: " << mResizeState << llendl;
+	// shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels
+	delta_width -= buttons_required_width;
+
+	// how many space can nearby chatbar take?
+	S32 chatbar_panel_width_ = mNearbyChatBar->getRect().getWidth();
+	if (delta_width > 0 && chatbar_panel_width_ < chatbar_panel_max_width)
+	{
+		mResizeState |= RS_CHATBAR_INPUT;
+		S32 delta_panel_max = chatbar_panel_max_width - chatbar_panel_width_;
+		S32 delta_panel = llmin(delta_width, delta_panel_max);
+		delta_width -= delta_panel_max;
+		mNearbyChatBar->reshape(chatbar_panel_width_ + delta_panel, mNearbyChatBar->getRect().getHeight());
+	}
 }
 
 bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* available_width, S32* buttons_required_width)
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index c2eeef239c3..6509fea63d4 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -98,6 +98,8 @@ class LLBottomTray
 
 	void updateResizeState(S32 new_width, S32 cur_width);
 	void verifyChildControlsSizes();
+	void processWidthDecreased(S32 delta_width);
+	void processWidthIncreased(S32 delta_width);
 	void log(LLView* panel, const std::string& descr);
 	bool processShowButton(EResizeState shown_object_type, S32* available_width, S32* buttons_required_width);
 	bool canButtonBeShown(LLPanel* panel) const;
-- 
GitLab


From 73bba2bab49cb255d320e0209e54377dcc010fc3 Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Wed, 11 Nov 2009 16:56:13 +0200
Subject: [PATCH 107/557] implemented EXT-2363 Get rid of 'Friends Conference'
 hardcode and rename it to 'Ad-hoc Conference'

--HG--
branch : product-engine
---
 indra/newview/llavataractions.cpp              | 3 ++-
 indra/newview/skins/default/xui/en/strings.xml | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index dae4296a82e..1087e1e6d30 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -54,6 +54,7 @@
 #include "llmutelist.h"
 #include "llrecentpeople.h"
 #include "llsidetray.h"
+#include "lltrans.h"
 #include "llviewerobjectlist.h"
 #include "llviewermessage.h"	// for handle_lure
 #include "llviewerregion.h"
@@ -226,7 +227,7 @@ void LLAvatarActions::startConference(const std::vector<LLUUID>& ids)
 	{
 		id_array.push_back(*it);
 	}
-	LLUUID session_id = gIMMgr->addSession("Friends Conference", IM_SESSION_CONFERENCE_START, ids[0], id_array);
+	LLUUID session_id = gIMMgr->addSession(LLTrans::getString("IM_adhoc_title"), IM_SESSION_CONFERENCE_START, ids[0], id_array);
 	if (session_id != LLUUID::null)
 	{
 		LLIMFloater::show(session_id);
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index c850dce1419..fd8316d79cf 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2849,7 +2849,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 	<string name="IM_default_text_label">Click here to instant message.</string>
 	<string name="IM_to_label">To</string>
 	<string name="IM_moderator_label">(Moderator)</string>
-
+	<string name="IM_adhoc_title">Ad-Hoc Conference</string>
 
   <string name="ringing-im">
     Joining Voice Chat...
-- 
GitLab


From 51d35efa23b7683e078ad95778a365aa383f0bd1 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Wed, 11 Nov 2009 17:05:31 +0200
Subject: [PATCH 108/557] Work on major sub-task EXT-991 (Update bottom bar
 behavior on resize) Code cleaned up:   - removed test code to show background
 in chiclet panel

--HG--
branch : product-engine
---
 indra/newview/llchiclet.cpp                             | 3 ---
 indra/newview/skins/default/xui/en/panel_bottomtray.xml | 2 --
 2 files changed, 5 deletions(-)

diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 16ee9a00072..2f43c321878 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -807,9 +807,6 @@ LLChicletPanel::LLChicletPanel(const Params&p)
 , mShowControls(true)
 {
 	LLPanel::Params panel_params;
-// *TODO: remove color settings 
-panel_params.background_visible(true);
-panel_params.bg_alpha_color(LLColor4::red);
 	panel_params.follows.flags(FOLLOWS_LEFT | FOLLOWS_RIGHT);
 	mScrollArea = LLUICtrlFactory::create<LLPanel>(panel_params,this);
 
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index a945010d3ef..6a78834a4cd 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -215,8 +215,6 @@
                  />
         </layout_panel>
         <layout_panel
-background_visible="true"
-bg_alpha_color="green"  
          mouse_opaque="false"
          follows="left|right"
          height="28"
-- 
GitLab


From 8523d2d5b641cb5b0e4557237700065bd24daf83 Mon Sep 17 00:00:00 2001
From: Yuri Chebotarev <ychebotarev@productengine.com>
Date: Wed, 11 Nov 2009 17:05:36 +0200
Subject: [PATCH 109/557] fix for normal bug EXT-2303 Distinguish
 Object-generated Nearby Chat from other Nearby Chat

--HG--
branch : product-engine
---
 indra/llui/lltextbase.cpp              |  6 ++++++
 indra/llui/lltextbase.h                |  2 ++
 indra/newview/llchathistory.cpp        | 14 +++++++++-----
 indra/newview/llchathistory.h          |  4 +---
 indra/newview/skins/default/colors.xml |  2 +-
 5 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 97ba6913418..69b45af3e73 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -995,6 +995,12 @@ void LLTextBase::setColor( const LLColor4& c )
 	mFgColor = c;
 }
 
+//virtual 
+void LLTextBase::setReadOnlyColor(const LLColor4 &c)
+{
+	mReadOnlyFgColor = c;
+}
+
 //virtual
 void LLTextBase::setValue(const LLSD& value )
 {
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 8cae8fde220..fb01cd1e7cc 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -118,6 +118,8 @@ class LLTextBase
 	// LLUICtrl interface
 	/*virtual*/ BOOL		acceptsTextInput() const { return !mReadOnly; }
 	/*virtual*/ void		setColor( const LLColor4& c );
+	virtual     void 		setReadOnlyColor(const LLColor4 &c);
+
 	/*virtual*/ void		setValue(const LLSD& value );
 	/*virtual*/ LLTextViewModel* getViewModel() const;
 
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 3b893aa5293..b452f5bc1af 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -174,7 +174,7 @@ class LLChatHistoryHeader: public LLPanel
 	const std::string&	getFirstName() const { return mFirstName; }
 	const std::string&	getLastName	() const { return mLastName; }
 
-	void setup(const LLChat& chat) 
+	void setup(const LLChat& chat,const LLStyle::Params& style_params) 
 	{
 		mAvatarID = chat.mFromID;
 		mSourceType = chat.mSourceType;
@@ -184,8 +184,11 @@ class LLChatHistoryHeader: public LLPanel
 			mSourceType = CHAT_SOURCE_SYSTEM;
 		}
 
-
 		LLTextBox* userName = getChild<LLTextBox>("user_name");
+
+		LLUIColor color = style_params.color;
+		userName->setReadOnlyColor(color);
+		userName->setColor(color);
 		
 		if(!chat.mFromName.empty())
 		{
@@ -197,6 +200,7 @@ class LLChatHistoryHeader: public LLPanel
 			std::string SL = LLTrans::getString("SECOND_LIFE");
 			userName->setValue(SL);
 		}
+
 		
 		LLTextBox* timeBox = getChild<LLTextBox>("time_box");
 		timeBox->setValue(formatCurrentTime());
@@ -322,10 +326,10 @@ LLView* LLChatHistory::getSeparator()
 	return separator;
 }
 
-LLView* LLChatHistory::getHeader(const LLChat& chat)
+LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style_params)
 {
 	LLChatHistoryHeader* header = LLChatHistoryHeader::createInstance(mMessageHeaderFilename);
-	header->setup(chat);
+	header->setup(chat,style_params);
 	return header;
 }
 
@@ -347,7 +351,7 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& sty
 	}
 	else
 	{
-		view = getHeader(chat);
+		view = getHeader(chat,style_params);
 		if (getText().size() == 0)
 			p.top_pad = 0;
 		else
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index 3789ebff4e9..f0944042afb 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -94,11 +94,9 @@ class LLChatHistory : public LLTextEditor
 		LLView* getSeparator();
 		/**
 		 * Builds a message header.
-		 * @param from owner of a message.
-		 * @param time time of a message.
 		 * @return pointer to LLView header object.
 		 */
-		LLView* getHeader(const LLChat& chat);
+		LLView* getHeader(const LLChat& chat,const LLStyle::Params& style_params);
 
 	public:
 		~LLChatHistory();
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index 572a4cf9e95..cbd57c4a412 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -513,7 +513,7 @@
      reference="White" />
     <color
      name="ObjectChatColor"
-     reference="LtGray" />
+     reference="0.7 0.8 0.9 1" />
     <color
      name="OverdrivenColor"
      value="1 0 0 1" />
-- 
GitLab


From 463571f1aa298b2259b97db56080eedca96b0465 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Wed, 11 Nov 2009 15:18:36 +0000
Subject: [PATCH 110/557] Default to voice control being a 'toggle', per spec.

---
 indra/newview/app_settings/settings.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 15c9499bbc8..15fa057230e 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -5501,7 +5501,7 @@
       <key>Type</key>
       <string>Boolean</string>
       <key>Value</key>
-      <integer>0</integer>
+      <integer>1</integer>
     </map>
     <key>QAMode</key>
     <map>
-- 
GitLab


From 88f71ead300a1c842caa1563b2956d2a8dee006d Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Wed, 11 Nov 2009 17:34:08 +0200
Subject: [PATCH 111/557] Implemented Low sub-task EXT-2366-ALL Avatar specific
 buttons on IM P2P control panel should be disabled when interacting with
 AVALINE caller

--HG--
branch : product-engine
---
 indra/newview/llpanelimcontrolpanel.cpp | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index 350b78ee3da..32fc3b6519a 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -173,7 +173,14 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
 	LLIMModel::LLIMSession* im_session =
 		im_model.findIMSession(session_id);
 	if( im_session && !im_session->mOtherParticipantIsAvatar )
+	{
 		childSetEnabled("view_profile_btn", FALSE);
+		childSetEnabled("add_friend_btn", FALSE);
+
+		childSetEnabled("share_btn", FALSE);
+		childSetEnabled("teleport_btn", FALSE);
+		childSetEnabled("pay_btn", FALSE);
+	}
 }
 
 void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group)
-- 
GitLab


From 3176622afead3a962f1a81a12e747fec0686a210 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Wed, 11 Nov 2009 17:45:14 +0200
Subject: [PATCH 112/557] fixed EXT-2353 "IM window should auto-undock when
 dragged" made all dockable floaters undock on dragging;

--HG--
branch : product-engine
---
 indra/llui/lldockcontrol.cpp | 2 --
 1 file changed, 2 deletions(-)

diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp
index 35a854267a4..045505af5b6 100644
--- a/indra/llui/lldockcontrol.cpp
+++ b/indra/llui/lldockcontrol.cpp
@@ -256,7 +256,6 @@ void LLDockControl::on()
 {
 	 if (isDockVisible())
 	{
-		mDockableFloater->setCanDrag(false);
 		mEnabled = true;
 		mRecalculateDocablePosition = true;
 	}
@@ -264,7 +263,6 @@ void LLDockControl::on()
 
 void LLDockControl::off()
 {
-	mDockableFloater->setCanDrag(true);
 	mEnabled = false;
 }
 
-- 
GitLab


From 23a4637216403d04822efd9125875e5b06b4ccca Mon Sep 17 00:00:00 2001
From: Lynx Linden <lynx@lindenlab.com>
Date: Wed, 11 Nov 2009 15:45:24 +0000
Subject: [PATCH 113/557] DEV-41324 DEV-41317: Fixes for P2P chat when already
 chatting.

---
 indra/newview/llavataractions.cpp | 2 +-
 indra/newview/llpanelpeople.cpp   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 4456e0aa748..47237e53ccd 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -191,7 +191,7 @@ void LLAvatarActions::startIM(const LLUUID& id)
 // static
 void LLAvatarActions::startCall(const LLUUID& id)
 {
-	if (id.isNull() || isCalling(id))
+	if (id.isNull())
 	{
 		return;
 	}
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 9ba94c8ca98..2bbb2b71536 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -1193,7 +1193,7 @@ void LLPanelPeople::onCallButtonClicked()
 	if (selected_uuids.size() == 1)
 	{
 		// initiate a P2P voice chat with the selected user
-		LLAvatarActions::startCall(selected_uuids[0]);
+		LLAvatarActions::startCall(getCurrentItemID());
 	}
 	else if (selected_uuids.size() > 1)
 	{
-- 
GitLab


From b360b994a8f588aa28ab5c5498d5cd79a907fb97 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Wed, 11 Nov 2009 17:57:17 +0200
Subject: [PATCH 114/557] Fixed major bug EXT-2205 (Message well counter is
 truncated) - place counter exactly over the message well icon.

Fixed in theis way becouse style guide does not have correct UI.
Probably color sheme should be changes to have counter more visible

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_bottomtray.xml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 6a78834a4cd..6bc8063486c 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -306,9 +306,9 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
                />
                <unread_notifications
                width="34"
-               height="23"
-               left="22"
-               top="23" />
+               height="20"
+               left="0"
+               top="19" />
 	    </chiclet_notification>
         </layout_panel>
        <icon
-- 
GitLab


From 8a2da9a6b5b4ccfbcc3bd5409e583bdf10c1bfd0 Mon Sep 17 00:00:00 2001
From: Dmitry Oleshko <doleshko@productengine.com>
Date: Wed, 11 Nov 2009 18:19:52 +0200
Subject: [PATCH 115/557] fixed low bug (EXT-573) There is paragraph indent in
 the toasts text

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/notifications.xml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index ccd8bc569e7..96c6d970c2a 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -5013,6 +5013,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a
    name="GodMessage"
    type="notify">
 [NAME]
+
 [MESSAGE]
   </notification>
 
-- 
GitLab


From 71fd3852b026ab98438ce87be89c98944a76b8a5 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Wed, 11 Nov 2009 16:38:47 +0000
Subject: [PATCH 116/557] create an outgoing call floater, WIP.

---
 .../default/xui/en/floater_outgoing_call.xml  | 72 +++++++++++++++++++
 1 file changed, 72 insertions(+)
 create mode 100644 indra/newview/skins/default/xui/en/floater_outgoing_call.xml

diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
new file mode 100644
index 00000000000..3838fe4bc74
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_close="false"
+ can_minimize="false"
+ can_tear_off="false"
+ height="200"
+ layout="topleft"
+ name="outgoing call"
+ help_topic="outgoing_call"
+ title="CALLING"
+ width="240">
+     <floater.string
+     name="anonymous">
+        anonymous
+    </floater.string>
+    <floater.string
+     name="VoiceInviteP2P">
+        is calling.
+    </floater.string>
+    <floater.string
+     name="VoiceInviteAdHoc">
+        has joined a Voice Chat call with a conference chat.
+    </floater.string>
+    <avatar_icon
+     enabled="false"
+     follows="left|top"
+     height="36"
+     image_name="icon_avatar_online.tga"
+     layout="topleft"
+     left_delta="19"
+     top="35"
+     width="36" />
+    <text_editor
+     font="SansSerif"
+     height="64"
+     border_visible="false"
+     layout="topleft"
+     left="77"
+     max_length="2147483647"
+     name="caller name"
+     read_only="true"
+     top="21"
+     width="163"
+     word_wrap="true" />
+    <button
+     height="24"
+     label="Accept"
+     label_selected="Accept"
+     layout="topleft"
+     left="70"
+     name="Accept"
+     top="92"
+     width="100" />
+    <button
+     height="24"
+     label="Reject"
+     label_selected="Reject"
+     layout="topleft"
+     left_delta="0"
+     name="Reject"
+     top_pad="12"
+     width="100" />
+    <button
+     height="24"
+     label="Start IM"
+     layout="topleft"
+     left_delta="0"
+     name="Start IM"
+     top_pad="12"
+     width="100" />
+</floater>
-- 
GitLab


From ec81a548c5ad24f1de93e42b7924acaf29c78fef Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Wed, 11 Nov 2009 11:45:20 -0500
Subject: [PATCH 117/557] Link spam reduction - consolidating inventory cache
 loading messages.

---
 indra/newview/llinventorymodel.cpp | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index e7d7eb19d0e..a25c3d0c10e 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -2176,7 +2176,7 @@ bool LLInventoryModel::loadSkeleton(
 
 			// Add all the items loaded which are parented to a
 			// category with a correctly cached parent
-			count = items.count();
+			S32 bad_link_count = 0;
 			cat_map_t::iterator unparented = mCategoryMap.end();
 			for(item_array_t::const_iterator item_iter = items.begin();
 				item_iter != items.end();
@@ -2193,7 +2193,11 @@ bool LLInventoryModel::loadSkeleton(
 						// This can happen if the linked object's baseobj is removed from the cache but the linked object is still in the cache.
 						if (item->getIsBrokenLink())
 						{
-							llinfos << "Attempted to add cached link item without baseobj present ( name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " ).  Ignoring and invalidating " << cat->getName() << " . " << llendl;
+							bad_link_count++;
+							lldebugs << "Attempted to add cached link item without baseobj present ( name: "
+									 << item->getName() << " itemID: " << item->getUUID()
+									 << " assetID: " << item->getAssetUUID()
+									 << " ).  Ignoring and invalidating " << cat->getName() << " . " << llendl;
 							invalid_categories.insert(cit->second);
 							continue;
 						}
@@ -2203,6 +2207,12 @@ bool LLInventoryModel::loadSkeleton(
 					}
 				}
 			}
+			if (bad_link_count > 0)
+			{
+				llinfos << "Attempted to add " << bad_link_count
+						<< " cached link items without baseobj present. "
+						<< "The corresponding categories were invalidated." << llendl;
+			}
 		}
 		else
 		{
-- 
GitLab


From b8a672adaf547649d555909f1baa2234d4b46699 Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Wed, 11 Nov 2009 18:49:23 +0200
Subject: [PATCH 118/557] Fixed low bug EXT-1499 (Finalize the Home panel and
 add tooltips to the tab grabs).

--HG--
branch : product-engine
---
 indra/newview/llsidetray.cpp                           | 10 +++++++---
 indra/newview/llsidetray.h                             |  3 ++-
 indra/newview/skins/default/xui/en/panel_side_tray.xml |  6 +++---
 3 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index b25dea92cce..1d9b1261d67 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -389,7 +389,8 @@ bool LLSideTray::selectTabByName	(const std::string& name)
 	return true;
 }
 
-LLButton* LLSideTray::createButton	(const std::string& name,const std::string& image,LLUICtrl::commit_callback_t callback)
+LLButton* LLSideTray::createButton	(const std::string& name,const std::string& image,const std::string& tooltip,
+									 LLUICtrl::commit_callback_t callback)
 {
 	static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>());	
 	
@@ -410,6 +411,9 @@ LLButton* LLSideTray::createButton	(const std::string& name,const std::string& i
 	LLButton* button = LLUICtrlFactory::create<LLButton> (bparams);
 	button->setLabel(name);
 	button->setClickedCallback(callback);
+
+	if(tooltip!="Home")
+		button->setToolTip(tooltip);
 	
 	if(image.length())
 	{
@@ -448,12 +452,12 @@ void	LLSideTray::createButtons	()
 		// change if the home screen becomes its own tab.
 		if (name == "sidebar_home")
 		{
-			mCollapseButton = createButton("",sidebar_tab->mImage,
+			mCollapseButton = createButton("",sidebar_tab->mImage,sidebar_tab->getTabTitle(),
 				boost::bind(&LLSideTray::onToggleCollapse, this));
 		}
 		else
 		{
-			LLButton* button = createButton("",sidebar_tab->mImage,
+			LLButton* button = createButton("",sidebar_tab->mImage,sidebar_tab->getTabTitle(),
 				boost::bind(&LLSideTray::onTabButtonClick, this, name));
 			mTabButtons[name] = button;
 		}
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index 246979ac54b..19d9ca8f7e3 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -143,7 +143,8 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>
 	LLSideTrayTab* getTab		(const std::string& name);
 
 	void		createButtons	();
-	LLButton*	createButton	(const std::string& name,const std::string& image,LLUICtrl::commit_callback_t callback);
+	LLButton*	createButton	(const std::string& name,const std::string& image,const std::string& tooltip,
+									LLUICtrl::commit_callback_t callback);
 	void		arrange			();
 	void		reflectCollapseChange();
 
diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml
index a9874f45530..a419a02d756 100644
--- a/indra/newview/skins/default/xui/en/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml
@@ -94,7 +94,7 @@
   <sidetray_tab
     name="sidebar_me"
     help_topic="sidebar_me"
-    tab_title="Me"
+    tab_title="My Profile"
     description="Edit your public profile and Picks."
     image="TabIcon_Me_Off"
     image_selected="TabIcon_Me_Selected"
@@ -112,7 +112,7 @@
   <sidetray_tab
     name="sidebar_appearance"
     help_topic="sidebar_appearance"
-    tab_title="Appearance"
+    tab_title="My Appearance"
     description="Change your appearance and current look."
     image="TabIcon_Appearance_Off"
     image_selected="TabIcon_Appearance_Selected"
@@ -131,7 +131,7 @@
   <sidetray_tab
     name="sidebar_inventory"
     help_topic="sidebar_inventory"
-    tab_title="Inventory"
+    tab_title="My Inventory"
     description="Browse your inventory."
     image="TabIcon_Things_Off"
     image_selected="TabIcon_Things_Selected"
-- 
GitLab


From 0d01300762a8413c3b137e433ee4c02070798792 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Wed, 11 Nov 2009 16:59:49 +0000
Subject: [PATCH 119/557] sketch-out the outgoing call dialog code.  WIP.

---
 indra/newview/llimview.cpp           | 141 +++++++++++++++++++++++++++
 indra/newview/llimview.h             |  13 +++
 indra/newview/llviewerfloaterreg.cpp |   2 +-
 indra/newview/llvoicechannel.cpp     |   6 ++
 4 files changed, 161 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 14f94d5a888..33bd4833671 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1099,6 +1099,147 @@ LLIMMgr::onConfirmForceCloseError(
 }
 
 
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLOutgoingCallDialog
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LLOutgoingCallDialog::LLOutgoingCallDialog(const LLSD& payload) :
+	LLModalDialog(payload),
+	mPayload(payload)
+{
+}
+
+BOOL LLOutgoingCallDialog::postBuild()
+{
+	LLSD caller_id = mPayload["caller_id"];
+	EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
+
+	std::string call_type = getString("VoiceInviteP2P");
+	std::string caller_name = mPayload["caller_name"].asString();
+	if (caller_name == "anonymous")
+	{
+		caller_name = getString("anonymous");
+	}
+	
+	setTitle(caller_name + " " + call_type);
+	
+	// If it is not a P2P invite, then it's an AdHoc invite
+	if ( type != IM_SESSION_P2P_INVITE )
+	{
+		call_type = getString("VoiceInviteAdHoc");
+	}
+
+	LLUICtrl* caller_name_widget = getChild<LLUICtrl>("caller name");
+	caller_name_widget->setValue(caller_name + " " + call_type);
+	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
+	icon->setValue(caller_id);
+
+	//childSetAction("Reject", onReject, this);
+
+	return TRUE;
+}
+
+void LLOutgoingCallDialog::processCallResponse(S32 response)
+{
+	if (!gIMMgr)
+		return;
+
+	LLUUID session_id = mPayload["session_id"].asUUID();
+	EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
+	LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)mPayload["inv_type"].asInteger();
+	bool voice = true;
+	switch(response)
+	{
+	case 2: // start IM: just don't start the voice chat
+	{
+		voice = false;
+		/* FALLTHROUGH */
+	}
+	case 0: // accept
+	{
+		if (type == IM_SESSION_P2P_INVITE)
+		{
+			// create a normal IM session
+			session_id = gIMMgr->addP2PSession(
+				mPayload["session_name"].asString(),
+				mPayload["caller_id"].asUUID(),
+				mPayload["session_handle"].asString());
+
+			if (voice)
+			{
+				if (gIMMgr->startCall(session_id))
+				{
+					// always open IM window when connecting to voice
+					LLIMFloater::show(session_id);
+				}
+			}
+
+			gIMMgr->clearPendingAgentListUpdates(session_id);
+			gIMMgr->clearPendingInvitation(session_id);
+		}
+		else
+		{
+			LLUUID session_id = gIMMgr->addSession(
+				mPayload["session_name"].asString(),
+				type,
+				session_id);
+			if (session_id != LLUUID::null)
+			{
+				LLIMFloater::show(session_id);
+			}
+
+			std::string url = gAgent.getRegion()->getCapability(
+				"ChatSessionRequest");
+
+			if (voice)
+			{
+				LLSD data;
+				data["method"] = "accept invitation";
+				data["session-id"] = session_id;
+				LLHTTPClient::post(
+					url,
+					data,
+					new LLViewerChatterBoxInvitationAcceptResponder(
+						session_id,
+						inv_type));
+			}
+		}
+		if (voice)
+		{
+			break;
+		}
+	}
+	case 1: // decline
+	{
+		if (type == IM_SESSION_P2P_INVITE)
+		{
+			if(gVoiceClient)
+			{
+				std::string s = mPayload["session_handle"].asString();
+				gVoiceClient->declineInvite(s);
+			}
+		}
+		else
+		{
+			std::string url = gAgent.getRegion()->getCapability(
+				"ChatSessionRequest");
+
+			LLSD data;
+			data["method"] = "decline invitation";
+			data["session-id"] = session_id;
+			LLHTTPClient::post(
+				url,
+				data,
+				NULL);
+		}
+	}
+
+	gIMMgr->clearPendingAgentListUpdates(session_id);
+	gIMMgr->clearPendingInvitation(session_id);
+	}
+}
+
+
+
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // Class LLIncomingCallDialog
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index c566b111ca9..942a8f96d02 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -418,6 +418,19 @@ class LLIncomingCallDialog : public LLModalDialog
 	LLSD mPayload;
 };
 
+class LLOutgoingCallDialog : public LLModalDialog
+{
+public:
+	LLOutgoingCallDialog(const LLSD& payload);
+
+	/*virtual*/ BOOL postBuild();
+
+private:
+	void processCallResponse(S32 response);
+
+	LLSD mPayload;
+};
+
 // Globals
 extern LLIMMgr *gIMMgr;
 
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index edbac69e1b8..7cd660110f3 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -195,7 +195,7 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("notifications_console", "floater_notifications_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationConsole>);
 
 	LLFloaterReg::add("openobject", "floater_openobject.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOpenObject>);
-	
+	LLFloaterReg::add("outgoing_call", "floater_outgoing_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLOutgoingCallDialog>);
 	LLFloaterReg::add("parcel_info", "floater_preview_url.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterParcelInfo>);
 	LLFloaterPayUtil::registerFloater();
 
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index 89649407ff0..04ae44e08d9 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -378,9 +378,15 @@ void LLVoiceChannel::setURI(std::string uri)
 
 void LLVoiceChannel::setState(EState state)
 {
+	LLSD payload;
+	payload["session_id"] = mSessionID;
+	payload["session_name"] = mSessionName;
+
 	switch(state)
 	{
 	case STATE_RINGING:
+		LLFloaterReg::showInstance("outgoing_call", payload, TRUE);
+		llinfos << "RINGINGGGGGGGG " << mSessionName << llendl;
 		gIMMgr->addSystemMessage(mSessionID, "ringing", mNotifyArgs);
 		break;
 	case STATE_CONNECTED:
-- 
GitLab


From 14c668bb976a651deef5d275c4e5f15f7d4bfea2 Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Wed, 11 Nov 2009 19:19:07 +0200
Subject: [PATCH 120/557] fixed reopened subtask EXT-2265  IM unread messages
 counter should not be increased for system messages (comming from "Second
 Life", zero uuid)

now not counting messages with from = "Second Life" and from_id = receiver's uuid

--HG--
branch : product-engine
---
 indra/newview/llimview.cpp | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index e894022e528..60faaea2c50 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -439,8 +439,11 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co
 	addToHistory(session_id, from, from_id, utf8_text);
 	if (log2file) logToFile(session_id, from, from_id, utf8_text);
 
-	//we do not count system messages
-	if (from_id.notNull()) session->mNumUnread++;
+	//we do not count system messages and our messages
+	if (from_id.notNull() && from_id != gAgentID && SYSTEM_FROM != from)
+	{
+		session->mNumUnread++;
+	}
 
 	// notify listeners
 	LLSD arg;
-- 
GitLab


From 196e350629fb258acb8c0d784fdcfd50866b92ef Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Wed, 11 Nov 2009 19:26:19 +0200
Subject: [PATCH 121/557] Additional fix for EXT-2137-[BSI] Copy/pasted text
 chat logs are now much harder to read or post-process.

--HG--
branch : product-engine
---
 indra/newview/llchathistory.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index b7cd41cf6c7..d1922cfd6ec 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -336,7 +336,7 @@ LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style
 void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& style_params)
 {
 	LLView* view = NULL;
-	std::string view_text = "\n[" + formatCurrentTime() + "]:[" + chat.mFromName + "] ";;
+	std::string view_text = "\n[" + formatCurrentTime() + "] " + chat.mFromName + ": ";
 
 	LLInlineViewSegment::Params p;
 	p.force_newline = true;
-- 
GitLab


From d4846af9fbd4a8b78071724d6e04cef70a982a81 Mon Sep 17 00:00:00 2001
From: brad kittenbrink <brad@lindenlab.com>
Date: Wed, 11 Nov 2009 12:30:23 -0500
Subject: [PATCH 122/557] Fix for DLL linkage error in new LLEventAPI class.

---
 indra/llcommon/lleventapi.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/llcommon/lleventapi.h b/indra/llcommon/lleventapi.h
index fef12988cb4..2cd3b5bf897 100644
--- a/indra/llcommon/lleventapi.h
+++ b/indra/llcommon/lleventapi.h
@@ -23,7 +23,7 @@
  * from LLDispatchListener -- it also gives us event API introspection.
  * Deriving from LLInstanceTracker lets us enumerate instances.
  */
-class LLEventAPI: public LLDispatchListener,
+class LL_COMMON_API LLEventAPI: public LLDispatchListener,
                   public LLInstanceTracker<LLEventAPI, std::string>
 {
     typedef LLDispatchListener lbase;
-- 
GitLab


From 5bb5333964e99448d1e23403fdf31cc202e2fe95 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 11 Nov 2009 12:42:39 -0500
Subject: [PATCH 123/557] EXT-2377 : Add XML switch to showing either menubar
 or gear menu

First pass attempt at this.  This is not debugged, but hg won't let me merge until I commit this change...
---
 indra/newview/llpanelmaininventory.cpp        | 24 ++++++++++++++++---
 indra/newview/llpanelmaininventory.h          | 14 ++++++++++-
 .../default/xui/en/floater_inventory.xml      |  4 ++--
 .../default/xui/en/panel_main_inventory.xml   | 12 ++++++++++
 .../default/xui/en/sidepanel_inventory.xml    |  1 +
 5 files changed, 49 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 15a75cb9306..9b33fc18396 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -49,7 +49,7 @@
 #include "llviewermenu.h"
 #include "llviewertexturelist.h"
 
-static LLRegisterPanelClassWrapper<LLPanelMainInventory> t_inventory("panel_main_inventory"); // Seraph is this redundant with constructor?
+static LLDefaultChildRegistry::Register<LLPanelMainInventory> r("panel_main_inventory");
 
 void on_file_loaded_for_save(BOOL success, 
 							 LLViewerFetchedTexture *src_vi,
@@ -90,8 +90,8 @@ class LLFloaterInventoryFinder : public LLFloater
 /// LLPanelMainInventory
 ///----------------------------------------------------------------------------
 
-LLPanelMainInventory::LLPanelMainInventory()
-	: LLPanel(),
+LLPanelMainInventory::LLPanelMainInventory(const LLPanelMainInventory::Params& p)
+	: LLPanel(p),
 	  mActivePanel(NULL),
 	  mSavedFolderState(NULL),
 	  mFilterText(""),
@@ -124,6 +124,24 @@ LLPanelMainInventory::LLPanelMainInventory()
 	
 	mSavedFolderState = new LLSaveFolderState();
 	mSavedFolderState->setApply(FALSE);
+
+	if (p.hide_top_menu)
+	{
+		LLInventoryPanel *top_panel = getChild<LLInventoryPanel>("top_panel");
+		if (top_panel)
+		{
+			top_panel->setVisible(FALSE);
+		}
+	}
+
+	if (p.hide_bottom_menu)
+	{
+		LLInventoryPanel *bottom_panel = getChild<LLInventoryPanel>("bottom_panel");
+		if (bottom_panel)
+		{
+			bottom_panel->setVisible(FALSE);
+		}
+	}
 }
 
 BOOL LLPanelMainInventory::postBuild()
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index 29e9baa6cf2..e447d8ce068 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -58,7 +58,19 @@ class LLPanelMainInventory : public LLPanel, LLInventoryObserver
 public:
 	friend class LLFloaterInventoryFinder;
 
-	LLPanelMainInventory();
+	struct Params 
+	:	public LLInitParam::Block<Params, LLPanel::Params>
+	{
+		Optional<bool>						hide_top_menu;
+		Optional<bool>						hide_bottom_menu;
+
+		Params() :
+			hide_top_menu("hide_top_menu", false),
+			hide_bottom_menu("hide_bottom_menu", false)
+		{}
+	};
+
+	LLPanelMainInventory(const Params&);
 	~LLPanelMainInventory();
 
 	BOOL postBuild();
diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml
index 30639f955f4..b48c962413f 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory.xml
@@ -36,10 +36,10 @@
 	 filename="panel_main_inventory.xml"
 	 follows="all"
 	 layout="topleft"
+	 hide_top_panel="true"
 	 left="0"
 	 label="Inventory Panel"
 	 name="Inventory Panel"
 	 top="15"
-	 width="467">
-</panel>
+	 width="467" />
 </floater>
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index fcee0ef9538..6f57d1ca802 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -103,6 +103,17 @@
          width="18" />
     </panel>
 
+    <panel
+     background_visible="true"
+     bevel_style="none"
+     bottom="0"
+     follows="left|right|bottom"
+     height="30"
+     layout="bottomleft"
+     left="0"
+	 visible="true"
+     name="top_panel"
+     width="330">
     <menu_bar
      bg_visible="false"
      follows="left|top|right"
@@ -464,4 +475,5 @@
             </menu_item_check>
         </menu>
     </menu_bar>
+	</panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
index cbcc3f10ad2..5975bb41fd5 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -24,6 +24,7 @@
 			 filename="panel_main_inventory.xml"
 			 follows="all"
 			 layout="topleft"
+			 hide_top_panel="true"
 			 left="0"
 			 name="panel_main_inventory"
 			 top="0"
-- 
GitLab


From cc864d86ce91cd26edc3796acbd9580de4fafbc8 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Wed, 11 Nov 2009 18:06:44 +0000
Subject: [PATCH 124/557] outgoing call dialog.  doesn't do anything and is
 ugly/wrong, but it exists.  WIP.

---
 indra/newview/llimview.cpp                    | 32 ++++++++-----------
 indra/newview/llimview.h                      |  3 +-
 indra/newview/llvoicechannel.cpp              |  5 ++-
 .../default/xui/en/floater_outgoing_call.xml  | 22 ++++++-------
 4 files changed, 31 insertions(+), 31 deletions(-)

diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 33bd4833671..bd3ee51c15a 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1103,39 +1103,35 @@ LLIMMgr::onConfirmForceCloseError(
 // Class LLOutgoingCallDialog
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 LLOutgoingCallDialog::LLOutgoingCallDialog(const LLSD& payload) :
-	LLModalDialog(payload),
+	LLDockableFloater(NULL, payload),
 	mPayload(payload)
 {
 }
 
 BOOL LLOutgoingCallDialog::postBuild()
 {
-	LLSD caller_id = mPayload["caller_id"];
-	EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
+	BOOL success = LLFloater::postBuild();
 
-	std::string call_type = getString("VoiceInviteP2P");
-	std::string caller_name = mPayload["caller_name"].asString();
-	if (caller_name == "anonymous")
+	LLSD callee_id = mPayload["session_id"];//mPayload["caller_id"];
+
+	std::string calling_str = getString("calling");
+	std::string callee_name = mPayload["session_name"].asString();//mPayload["caller_name"].asString();
+	if (callee_name == "anonymous")
 	{
-		caller_name = getString("anonymous");
+		callee_name = getString("anonymous");
 	}
 	
-	setTitle(caller_name + " " + call_type);
-	
-	// If it is not a P2P invite, then it's an AdHoc invite
-	if ( type != IM_SESSION_P2P_INVITE )
-	{
-		call_type = getString("VoiceInviteAdHoc");
-	}
+	setTitle(callee_name);
 
-	LLUICtrl* caller_name_widget = getChild<LLUICtrl>("caller name");
-	caller_name_widget->setValue(caller_name + " " + call_type);
+	LLUICtrl* callee_name_widget = getChild<LLUICtrl>("callee name");
+	// *TODO: substitute callee name properly
+	callee_name_widget->setValue(calling_str + " " + callee_name);
 	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
-	icon->setValue(caller_id);
+	icon->setValue(callee_id);
 
 	//childSetAction("Reject", onReject, this);
 
-	return TRUE;
+	return success;
 }
 
 void LLOutgoingCallDialog::processCallResponse(S32 response)
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 942a8f96d02..105ff8dcbbd 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -37,6 +37,7 @@
 #include "llspeakers.h" //for LLIMSpeakerMgr
 #include "llimpanel.h" //for voice channels
 #include "llmodaldialog.h"
+#include "lldockablefloater.h"
 #include "llinstantmessage.h"
 #include "lluuid.h"
 #include "llmultifloater.h"
@@ -418,7 +419,7 @@ class LLIncomingCallDialog : public LLModalDialog
 	LLSD mPayload;
 };
 
-class LLOutgoingCallDialog : public LLModalDialog
+class LLOutgoingCallDialog : public LLDockableFloater
 {
 public:
 	LLOutgoingCallDialog(const LLSD& payload);
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index 04ae44e08d9..b0ea07946c2 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -385,8 +385,11 @@ void LLVoiceChannel::setState(EState state)
 	switch(state)
 	{
 	case STATE_RINGING:
-		LLFloaterReg::showInstance("outgoing_call", payload, TRUE);
 		llinfos << "RINGINGGGGGGGG " << mSessionName << llendl;
+		if (!mSessionName.empty())
+		{
+			LLFloaterReg::showInstance("outgoing_call", payload, TRUE);
+		}		
 		gIMMgr->addSystemMessage(mSessionID, "ringing", mNotifyArgs);
 		break;
 	case STATE_CONNECTED:
diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
index 3838fe4bc74..fd936232c9d 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -15,8 +15,8 @@
         anonymous
     </floater.string>
     <floater.string
-     name="VoiceInviteP2P">
-        is calling.
+     name="calling">
+        Calling [CALLEE]
     </floater.string>
     <floater.string
      name="VoiceInviteAdHoc">
@@ -38,35 +38,35 @@
      layout="topleft"
      left="77"
      max_length="2147483647"
-     name="caller name"
+     name="callee name"
      read_only="true"
      top="21"
      width="163"
      word_wrap="true" />
     <button
      height="24"
-     label="Accept"
-     label_selected="Accept"
+     label="Bar"
+     label_selected="Bar"
      layout="topleft"
      left="70"
-     name="Accept"
+     name="Bar"
      top="92"
      width="100" />
     <button
      height="24"
-     label="Reject"
-     label_selected="Reject"
+     label="Foo"
+     label_selected="Foo"
      layout="topleft"
      left_delta="0"
-     name="Reject"
+     name="Foo"
      top_pad="12"
      width="100" />
     <button
      height="24"
-     label="Start IM"
+     label="Baz"
      layout="topleft"
      left_delta="0"
-     name="Start IM"
+     name="Baz"
      top_pad="12"
      width="100" />
 </floater>
-- 
GitLab


From a758a799cf79056470dde92c32ea88f2807dfac2 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Wed, 11 Nov 2009 10:56:31 -0800
Subject: [PATCH 125/557] Add widgets/ui_ctrl.xml that can set default font
 size across all widgets. Individual widgets/*.xml files will need to have
 explicit font="foo" params removed to start using the defaults. Discussed
 with Richard.

---
 indra/llui/lluictrl.cpp                                |  2 +-
 .../skins/default/xui/en/floater_test_widgets.xml      | 10 ++++++++++
 indra/newview/skins/default/xui/en/menu_login.xml      |  8 ++++++++
 indra/newview/skins/default/xui/en/widgets/ui_ctrl.xml |  5 +++++
 4 files changed, 24 insertions(+), 1 deletion(-)
 create mode 100644 indra/newview/skins/default/xui/en/widgets/ui_ctrl.xml

diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index 08fc8fb7849..dd807a3f7e3 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -38,7 +38,7 @@
 #include "llpanel.h"
 #include "lluictrlfactory.h"
 
-static LLDefaultChildRegistry::Register<LLUICtrl> r("ui_ctrl");
+static LLWidgetNameRegistry::StaticRegistrar r(&typeid(LLUICtrl::Params), "ui_ctrl");
 
 LLUICtrl::Params::Params()
 :	tab_stop("tab_stop", true),
diff --git a/indra/newview/skins/default/xui/en/floater_test_widgets.xml b/indra/newview/skins/default/xui/en/floater_test_widgets.xml
index 44dcb075264..a2055d8c52f 100644
--- a/indra/newview/skins/default/xui/en/floater_test_widgets.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_widgets.xml
@@ -380,6 +380,16 @@ line to actually fit
        tool_tip="Color Swatch: Click to open Color Picker"
        top_delta="0"
        width="80" />
+      <text
+       top_pad="10"
+       left="10"
+       width="250" 
+       follows="top|left"
+       font.name="Monospace"
+       name="test_text10"
+       tool_tip="text">
+        Monospace Button Flyout Checkbox
+      </text>
       <text
        top_pad="10"
        left="10"
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index 5eb0560962d..bd60574a955 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -185,6 +185,14 @@
         <menu_item_call.on_click
          function="Advanced.ShowSideTray" />
       </menu_item_call>
+        <menu_item_call
+         label="Widget Test"
+         name="Widget Test"
+         shortcut="control|shift|T">
+            <menu_item_call.on_click
+             function="ShowFloater"
+             parameter="test_widgets" />
+        </menu_item_call>
       <menu_item_check
          label="Reg In Client Test (restart)"
          name="Reg In Client Test (restart)">
diff --git a/indra/newview/skins/default/xui/en/widgets/ui_ctrl.xml b/indra/newview/skins/default/xui/en/widgets/ui_ctrl.xml
new file mode 100644
index 00000000000..2f72ad65a15
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/ui_ctrl.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Global settings for all widgets ("UI Controls") -->
+<ui_ctrl
+  font="SansSerif"
+  /> 
-- 
GitLab


From f8ba8b09a65357e037f64b97919c0f4f9a9b90b0 Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Wed, 11 Nov 2009 11:26:19 -0800
Subject: [PATCH 126/557] merge

---
 indra/llui/llpanel.cpp       | 2 ++
 indra/newview/llnetmap.cpp   | 4 +---
 indra/newview/llsidetray.cpp | 1 +
 3 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 07c0f3ce847..89c46562973 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -512,6 +512,8 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu
 			// add children using dimensions from referenced xml for consistent layout
 			setShape(params.rect);
 			LLUICtrlFactory::createChildren(this, referenced_xml, child_registry_t::instance());
+
+			setXMLFilename(xml_filename);
 		}
 
 		// ask LLUICtrlFactory for filename, since xml_filename might be empty
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index 4286582cdc5..6145588df28 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -155,11 +155,9 @@ void LLNetMap::draw()
 	F32 rotation = 0;
 
 	{
-		LLGLEnable scissor(GL_SCISSOR_TEST);
-		
+		LLLocalClipRect clip(getLocalRect());
 		{
 			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-			LLLocalClipRect clip(getLocalRect());
 
 			glMatrixMode(GL_MODELVIEW);
 
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 061587f11b7..c3da246039a 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -101,6 +101,7 @@ LLSideTray* LLSideTray::getInstance()
 	if (!sInstance)
 	{
 		sInstance = LLUICtrlFactory::createFromFile<LLSideTray>("panel_side_tray.xml",NULL, LLRootView::child_registry_t::instance());
+		sInstance->setXMLFilename("panel_side_tray.xml");
 	}
 
 	return sInstance;
-- 
GitLab


From fedf86c216a36e46fcdec571399d44e6f5cbc836 Mon Sep 17 00:00:00 2001
From: richard <none@none>
Date: Wed, 11 Nov 2009 12:01:57 -0800
Subject: [PATCH 127/557] fix wrapping of text segment containing multiple
 newlines and ending on a newline

reviewed by leyla
---
 indra/cmake/00-Common.cmake | 6 +++---
 indra/llui/lltextbase.cpp   | 4 +++-
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index db5495091e5..b159092592b 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -35,13 +35,13 @@ if (WINDOWS)
   # Don't build DLLs.
   set(BUILD_SHARED_LIBS OFF)
 
-  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd"
+  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd /MP"
       CACHE STRING "C++ compiler debug options" FORCE)
   set(CMAKE_CXX_FLAGS_RELWITHDEBINFO 
-      "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD"
+      "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD /MP"
       CACHE STRING "C++ compiler release-with-debug options" FORCE)
   set(CMAKE_CXX_FLAGS_RELEASE
-      "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Zi /MD"
+      "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Zi /MD /MP"
       CACHE STRING "C++ compiler release options" FORCE)
 
   set(CMAKE_CXX_STANDARD_LIBRARIES "")
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 97ba6913418..1a903d31f1b 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -2370,7 +2370,9 @@ bool LLNormalTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& widt
 
 	height = mFontHeight;
 	width = mStyle->getFont()->getWidth(text.c_str(), mStart + first_char, num_chars);
-	return num_chars >= 1 && text[mStart + num_chars - 1] == '\n';
+	// if last character is a newline, then return true, forcing line break
+	llwchar last_char = text[mStart + first_char + num_chars - 1];
+	return num_chars >= 1 && last_char == '\n';
 }
 
 S32	LLNormalTextSegment::getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const
-- 
GitLab


From 0a095bdaed81f4df90bceac3373fa3481787e7fb Mon Sep 17 00:00:00 2001
From: richard <none@none>
Date: Wed, 11 Nov 2009 12:19:54 -0800
Subject: [PATCH 128/557] added stylized text to tooltips for showxuinames

---
 indra/llui/lltooltip.cpp         | 32 +++++++++++++++++++++-----------
 indra/llui/lltooltip.h           | 18 +++++++++++++-----
 indra/newview/llviewerwindow.cpp | 31 +++++++++++++++++--------------
 3 files changed, 51 insertions(+), 30 deletions(-)

diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
index fe1c2ba67c0..376bef14348 100644
--- a/indra/llui/lltooltip.cpp
+++ b/indra/llui/lltooltip.cpp
@@ -168,7 +168,6 @@ LLToolTip::Params::Params()
 
 LLToolTip::LLToolTip(const LLToolTip::Params& p)
 :	LLPanel(p),
-	mMaxWidth(p.max_width),
 	mHasClickCallback(p.click_callback.isProvided()),
 	mPadding(p.padding),
 	mTextBox(NULL),
@@ -177,11 +176,9 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
 	mHomePageButton(NULL)
 {
 	LLTextBox::Params params;
-	params.initial_value = "tip_text";
 	params.name = params.initial_value().asString();
 	// bake textbox padding into initial rect
 	params.rect = LLRect (mPadding, mPadding + 1, mPadding + 1, mPadding);
-	params.follows.flags = FOLLOWS_ALL;
 	params.h_pad = 0;
 	params.v_pad = 0;
 	params.mouse_opaque = false;
@@ -206,7 +203,6 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
 		TOOLTIP_ICON_SIZE = (imagep ? imagep->getWidth() : 16);
 		icon_rect.setOriginAndSize(mPadding, mPadding, TOOLTIP_ICON_SIZE, TOOLTIP_ICON_SIZE);
 		icon_params.rect = icon_rect;
-		//icon_params.follows.flags = FOLLOWS_LEFT | FOLLOWS_BOTTOM;
 		icon_params.image_unselected(imagep);
 		icon_params.image_selected(imagep);
 
@@ -277,15 +273,30 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
 	}
 }
 
-void LLToolTip::setValue(const LLSD& value)
+void LLToolTip::initFromParams(const LLToolTip::Params& p)
 {
+	LLPanel::initFromParams(p);
+
+	// do this *after* we've had our size set in LLPanel::initFromParams();
 	const S32 REALLY_LARGE_HEIGHT = 10000;
-	reshape(mMaxWidth, REALLY_LARGE_HEIGHT);
+	mTextBox->reshape(p.max_width, REALLY_LARGE_HEIGHT);
 
-	mTextBox->setValue(value);
+	if (p.styled_message.isProvided())
+	{
+		for (LLInitParam::ParamIterator<LLToolTip::StyledText>::const_iterator text_it = p.styled_message().begin();
+			text_it != p.styled_message().end();
+			++text_it)
+		{
+			mTextBox->appendText(text_it->text(), false, text_it->style);
+		}
+	}
+	else
+	{
+		mTextBox->setText(p.message());
+	}
 
 	LLRect text_contents_rect = mTextBox->getContentsRect();
-	S32 text_width = llmin(mMaxWidth, text_contents_rect.getWidth());
+	S32 text_width = llmin(p.max_width(), text_contents_rect.getWidth());
 	S32 text_height = text_contents_rect.getHeight();
 	mTextBox->reshape(text_width, text_height);
 
@@ -296,7 +307,7 @@ void LLToolTip::setValue(const LLSD& value)
 	tooltip_rect.mBottom = 0;
 	tooltip_rect.mLeft = 0;
 
-	setRect(tooltip_rect);
+	setShape(tooltip_rect);
 }
 
 void LLToolTip::setVisible(BOOL visible)
@@ -407,9 +418,8 @@ void LLToolTipMgr::createToolTip(const LLToolTip::Params& params)
 	}
 	tooltip_params.rect = LLRect (0, 1, 1, 0);
 
-
 	mToolTip = LLUICtrlFactory::create<LLToolTip> (tooltip_params);
-	mToolTip->setValue(params.message());
+
 	gToolTipView->addChild(mToolTip);
 
 	if (params.pos.isProvided())
diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h
index 30d251266c0..6e9cb8b4343 100644
--- a/indra/llui/lltooltip.h
+++ b/indra/llui/lltooltip.h
@@ -37,6 +37,7 @@
 #include "llsingleton.h"
 #include "llinitparam.h"
 #include "llpanel.h"
+#include "llstyle.h"
 
 //
 // Classes
@@ -65,11 +66,19 @@ class LLToolTipView : public LLView
 class LLToolTip : public LLPanel
 {
 public:
+
+	struct StyledText : public LLInitParam::Block<StyledText>
+	{
+		Mandatory<std::string>		text;
+		Optional<LLStyle::Params>	style;
+	};
+
 	struct Params : public LLInitParam::Block<Params, LLPanel::Params> 
 	{
 		typedef boost::function<void(void)> click_callback_t;
 
-		Mandatory<std::string>		message;
+		Optional<std::string>		message;
+		Multiple<StyledText>		styled_message;
 
 		Optional<LLCoordGL>			pos;
 		Optional<F32>				delay_time,
@@ -85,8 +94,8 @@ class LLToolTip : public LLPanel
 		Optional<click_callback_t>	click_callback,
 									click_playmedia_callback,
 									click_homepage_callback;
-		Optional<S32>				max_width;
-		Optional<S32>				padding;
+		Optional<S32>				max_width,
+									padding;
 		Optional<bool>				wrap;
 
 		Params();
@@ -94,7 +103,6 @@ class LLToolTip : public LLPanel
 	/*virtual*/ void draw();
 	/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
 	/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
-	/*virtual*/ void setValue(const LLSD& value);
 	/*virtual*/ void setVisible(BOOL visible);
 
 	bool isFading();
@@ -102,6 +110,7 @@ class LLToolTip : public LLPanel
 	bool hasClickCallback();
 
 	LLToolTip(const Params& p);
+	void initFromParams(const LLToolTip::Params& params);
 
 private:
 	class LLTextBox*	mTextBox;
@@ -111,7 +120,6 @@ class LLToolTip : public LLPanel
 
 	LLFrameTimer	mFadeTimer;
 	LLFrameTimer	mVisibleTimer;
-	S32				mMaxWidth;
 	bool			mHasClickCallback;
 	S32				mPadding;	// pixels
 };
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 29ce2510f20..ce13c51df32 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -2302,13 +2302,13 @@ void LLViewerWindow::moveCursorToCenter()
 // Hover handlers
 //
 
-void append_xui_tooltip(LLView* viewp, std::string& tool_tip_msg)
+void append_xui_tooltip(LLView* viewp, LLToolTip::Params& params)
 {
 	if (viewp) 
 	{
-		if (!tool_tip_msg.empty())
+		if (!params.styled_message().empty())
 		{
-			tool_tip_msg.append("\n---------\n");
+			params.styled_message.add().text("\n---------\n"); 
 		}
 		LLView::root_to_view_iterator_t end_tooltip_it = viewp->endRootToView();
 		// NOTE: we skip "root" since it is assumed
@@ -2318,15 +2318,16 @@ void append_xui_tooltip(LLView* viewp, std::string& tool_tip_msg)
 		{
 			LLView* viewp = *tooltip_it;
 		
-			tool_tip_msg.append(viewp->getName());
+			params.styled_message.add().text(viewp->getName());
+
 			LLPanel* panelp = dynamic_cast<LLPanel*>(viewp);
 			if (panelp && !panelp->getXMLFilename().empty())
 			{
-				tool_tip_msg.append("(");
-				tool_tip_msg.append(panelp->getXMLFilename());
-				tool_tip_msg.append(")");
+				params.styled_message.add()
+					.text("(" + panelp->getXMLFilename() + ")")
+					.style.color(LLColor4(0.7f, 0.7f, 1.f, 1.f));
 			}
-			tool_tip_msg.append("/");
+			params.styled_message.add().text("/");
 		}
 	}
 }
@@ -2567,6 +2568,8 @@ void LLViewerWindow::updateUI()
 
 		if (gSavedSettings.getBOOL("DebugShowXUINames"))
 		{
+			LLToolTip::Params params;
+
 			LLView* tooltip_view = mRootView;
 			LLView::tree_iterator_t end_it = mRootView->endTreeDFS();
 			for (LLView::tree_iterator_t it = mRootView->beginTreeDFS(); it != end_it; ++it)
@@ -2599,20 +2602,20 @@ void LLViewerWindow::updateUI()
 					// NOTE: this emulates visiting only the leaf nodes that meet our criteria
 					if (!viewp->hasAncestor(tooltip_view))
 					{
-						append_xui_tooltip(tooltip_view, tool_tip_msg);
+						append_xui_tooltip(tooltip_view, params);
 						screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect());
 					}
 					tooltip_view = viewp;
 				}
 			}
 
-			append_xui_tooltip(tooltip_view, tool_tip_msg);
+			append_xui_tooltip(tooltip_view, params);
 			screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect());
 			
-			LLToolTipMgr::instance().show(LLToolTip::Params()
-				.message(tool_tip_msg)
-				.sticky_rect(screen_sticky_rect)
-				.max_width(400));
+			params.sticky_rect = screen_sticky_rect;
+			params.max_width = 400;
+
+			LLToolTipMgr::instance().show(params);
 		}
 		// if there is a mouse captor, nothing else gets a tooltip
 		else if (mouse_captor)
-- 
GitLab


From b7740ee0c540c884170ffacf88132af3f93a3f96 Mon Sep 17 00:00:00 2001
From: richard <none@none>
Date: Wed, 11 Nov 2009 13:06:14 -0800
Subject: [PATCH 129/557] unbreak build

---
 indra/newview/pipeline.cpp | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 73a91bbbc09..507c726e02d 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -512,10 +512,10 @@ void LLPipeline::resizeScreenTexture()
 	LLFastTimer ft(FTM_RESIZE_SCREEN_TEXTURE);
 	if (gPipeline.canUseVertexShaders() && assertInitialized())
 	{
-		GLuint resX = gViewerWindow->getWorldViewWidthRaw();
-		GLuint resY = gViewerWindow->getWorldViewHeightRaw();
-		GLuint view_width = gViewerWindow->getWorldViewWidth();
-		GLuint view_height = gViewerWindow->getWorldViewHeight();
+		GLuint resX = gViewerWindow->getWindowWidthRaw();
+		GLuint resY = gViewerWindow->getWindowHeightRaw();
+		GLuint view_width = gViewerWindow->getWorldViewWidthRaw();
+		GLuint view_height = gViewerWindow->getWorldViewHeightRaw();
 	
 		allocateScreenBuffer(resX, resY, view_width, view_height);
 
@@ -711,10 +711,10 @@ void LLPipeline::createGLBuffers()
 
 	stop_glerror();
 
-	GLuint resX = gViewerWindow->getWorldViewWidthRaw();
-	GLuint resY = gViewerWindow->getWorldViewHeightRaw();
-	GLuint viewport_width = gViewerWindow->getWorldViewWidth();
-	GLuint viewport_height = gViewerWindow->getWorldViewHeight();
+	GLuint resX = gViewerWindow->getWindowWidthRaw();
+	GLuint resY = gViewerWindow->getWindowHeightRaw();
+	GLuint viewport_width = gViewerWindow->getWorldViewWidthRaw();
+	GLuint viewport_height = gViewerWindow->getWorldViewHeightRaw();
 	
 	if (LLPipeline::sRenderGlow)
 	{ //screen space glow buffers
-- 
GitLab


From f6406b7174fc6751ee60a6263360d82f382c6175 Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Wed, 11 Nov 2009 16:37:59 -0500
Subject: [PATCH 130/557] EXT-2173 use of visual param animation inconsistent
 at best

removed ambiguous parameter "set_by_user" from many places in codebase,
renaming it to be upload_bake, which is a more accurate descriptor.
This allowed me to see several inconsistencies in how this variable was
being set - these errors were also fixed. User-visible result should be
that baked textures are not reuploaded on changing avatar sex until the
save button is pressed. primary win here is code clarity.

Code reviewed by Bigpapi.
---
 indra/llcharacter/llcharacter.cpp   | 12 +++----
 indra/llcharacter/llcharacter.h     |  6 ++--
 indra/llcharacter/llvisualparam.cpp | 18 +++++------
 indra/llcharacter/llvisualparam.h   |  8 ++---
 indra/newview/llagentwearables.cpp  |  4 +--
 indra/newview/llagentwearables.h    |  2 +-
 indra/newview/lldriverparam.cpp     | 24 +++++++-------
 indra/newview/lldriverparam.h       |  8 ++---
 indra/newview/lltexglobalcolor.cpp  |  4 +--
 indra/newview/lltexglobalcolor.h    |  2 +-
 indra/newview/lltexlayer.cpp        |  2 +-
 indra/newview/lltexlayerparams.cpp  | 34 ++++++++++----------
 indra/newview/lltexlayerparams.h    | 14 ++++-----
 indra/newview/llvoavatar.cpp        | 40 +++++++++++------------
 indra/newview/llvoavatar.h          | 11 +++----
 indra/newview/llvoavatarself.cpp    | 36 ++++++++++-----------
 indra/newview/llvoavatarself.h      | 12 +++----
 indra/newview/llwearable.cpp        | 49 +++++++++--------------------
 indra/newview/llwearable.h          | 12 +++----
 19 files changed, 135 insertions(+), 163 deletions(-)

diff --git a/indra/llcharacter/llcharacter.cpp b/indra/llcharacter/llcharacter.cpp
index e68672d46f9..528a7bb4a5f 100644
--- a/indra/llcharacter/llcharacter.cpp
+++ b/indra/llcharacter/llcharacter.cpp
@@ -273,13 +273,13 @@ void LLCharacter::removeAnimationData(std::string name)
 //-----------------------------------------------------------------------------
 // setVisualParamWeight()
 //-----------------------------------------------------------------------------
-BOOL LLCharacter::setVisualParamWeight(LLVisualParam* which_param, F32 weight, BOOL set_by_user)
+BOOL LLCharacter::setVisualParamWeight(LLVisualParam* which_param, F32 weight, BOOL upload_bake)
 {
 	S32 index = which_param->getID();
 	visual_param_index_map_t::iterator index_iter = mVisualParamIndexMap.find(index);
 	if (index_iter != mVisualParamIndexMap.end())
 	{
-		index_iter->second->setWeight(weight, set_by_user);
+		index_iter->second->setWeight(weight, upload_bake);
 		return TRUE;
 	}
 	return FALSE;
@@ -288,7 +288,7 @@ BOOL LLCharacter::setVisualParamWeight(LLVisualParam* which_param, F32 weight, B
 //-----------------------------------------------------------------------------
 // setVisualParamWeight()
 //-----------------------------------------------------------------------------
-BOOL LLCharacter::setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user)
+BOOL LLCharacter::setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake)
 {
 	std::string tname(param_name);
 	LLStringUtil::toLower(tname);
@@ -296,7 +296,7 @@ BOOL LLCharacter::setVisualParamWeight(const char* param_name, F32 weight, BOOL
 	visual_param_name_map_t::iterator name_iter = mVisualParamNameMap.find(tableptr);
 	if (name_iter != mVisualParamNameMap.end())
 	{
-		name_iter->second->setWeight(weight, set_by_user);
+		name_iter->second->setWeight(weight, upload_bake);
 		return TRUE;
 	}
 	llwarns << "LLCharacter::setVisualParamWeight() Invalid visual parameter: " << param_name << llendl;
@@ -306,12 +306,12 @@ BOOL LLCharacter::setVisualParamWeight(const char* param_name, F32 weight, BOOL
 //-----------------------------------------------------------------------------
 // setVisualParamWeight()
 //-----------------------------------------------------------------------------
-BOOL LLCharacter::setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user)
+BOOL LLCharacter::setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake)
 {
 	visual_param_index_map_t::iterator index_iter = mVisualParamIndexMap.find(index);
 	if (index_iter != mVisualParamIndexMap.end())
 	{
-		index_iter->second->setWeight(weight, set_by_user);
+		index_iter->second->setWeight(weight, upload_bake);
 		return TRUE;
 	}
 	llwarns << "LLCharacter::setVisualParamWeight() Invalid visual parameter index: " << index << llendl;
diff --git a/indra/llcharacter/llcharacter.h b/indra/llcharacter/llcharacter.h
index cb44a32e8af..27e2a51c626 100644
--- a/indra/llcharacter/llcharacter.h
+++ b/indra/llcharacter/llcharacter.h
@@ -203,9 +203,9 @@ class LLCharacter
 	void addVisualParam(LLVisualParam *param);
 	void addSharedVisualParam(LLVisualParam *param);
 
-	virtual BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL set_by_user = FALSE );
-	virtual BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user = FALSE );
-	virtual BOOL setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user = FALSE );
+	virtual BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake = FALSE );
+	virtual BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake = FALSE );
+	virtual BOOL setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake = FALSE );
 
 	// get visual param weight by param or name
 	F32 getVisualParamWeight(LLVisualParam *distortion);
diff --git a/indra/llcharacter/llvisualparam.cpp b/indra/llcharacter/llvisualparam.cpp
index 6232c7588bb..297322fe58e 100644
--- a/indra/llcharacter/llvisualparam.cpp
+++ b/indra/llcharacter/llvisualparam.cpp
@@ -225,7 +225,7 @@ BOOL LLVisualParam::parseData(LLXmlTreeNode *node)
 //-----------------------------------------------------------------------------
 // setWeight()
 //-----------------------------------------------------------------------------
-void LLVisualParam::setWeight(F32 weight, BOOL set_by_user)
+void LLVisualParam::setWeight(F32 weight, BOOL upload_bake)
 {
 	if (mIsAnimating)
 	{
@@ -243,19 +243,19 @@ void LLVisualParam::setWeight(F32 weight, BOOL set_by_user)
 	
 	if (mNext)
 	{
-		mNext->setWeight(weight, set_by_user);
+		mNext->setWeight(weight, upload_bake);
 	}
 }
 
 //-----------------------------------------------------------------------------
 // setAnimationTarget()
 //-----------------------------------------------------------------------------
-void LLVisualParam::setAnimationTarget(F32 target_value, BOOL set_by_user)
+void LLVisualParam::setAnimationTarget(F32 target_value, BOOL upload_bake)
 {
 	// don't animate dummy parameters
 	if (mIsDummy)
 	{
-		setWeight(target_value, set_by_user);
+		setWeight(target_value, upload_bake);
 		return;
 	}
 
@@ -274,7 +274,7 @@ void LLVisualParam::setAnimationTarget(F32 target_value, BOOL set_by_user)
 
 	if (mNext)
 	{
-		mNext->setAnimationTarget(target_value, set_by_user);
+		mNext->setAnimationTarget(target_value, upload_bake);
 	}
 }
 
@@ -291,24 +291,24 @@ void LLVisualParam::setNextParam( LLVisualParam *next )
 //-----------------------------------------------------------------------------
 // animate()
 //-----------------------------------------------------------------------------
-void LLVisualParam::animate( F32 delta, BOOL set_by_user )
+void LLVisualParam::animate( F32 delta, BOOL upload_bake )
 {
 	if (mIsAnimating)
 	{
 		F32 new_weight = ((mTargetWeight - mCurWeight) * delta) + mCurWeight;
-		setWeight(new_weight, set_by_user);
+		setWeight(new_weight, upload_bake);
 	}
 }
 
 //-----------------------------------------------------------------------------
 // stopAnimating()
 //-----------------------------------------------------------------------------
-void LLVisualParam::stopAnimating(BOOL set_by_user)
+void LLVisualParam::stopAnimating(BOOL upload_bake)
 { 
 	if (mIsAnimating && getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE)
 	{
 		mIsAnimating = FALSE; 
-		setWeight(mTargetWeight, set_by_user);
+		setWeight(mTargetWeight, upload_bake);
 	}
 }
 
diff --git a/indra/llcharacter/llvisualparam.h b/indra/llcharacter/llvisualparam.h
index eec56d78443..12b45e6ebe6 100644
--- a/indra/llcharacter/llvisualparam.h
+++ b/indra/llcharacter/llvisualparam.h
@@ -113,10 +113,10 @@ class LLVisualParam
 	//virtual BOOL			parseData( LLXmlTreeNode *node ) = 0;
 	virtual void			apply( ESex avatar_sex ) = 0;
 	//  Default functions
-	virtual void			setWeight(F32 weight, BOOL set_by_user);
-	virtual void			setAnimationTarget( F32 target_value, BOOL set_by_user );
-	virtual void			animate(F32 delta, BOOL set_by_user);
-	virtual void			stopAnimating(BOOL set_by_user);
+	virtual void			setWeight(F32 weight, BOOL upload_bake);
+	virtual void			setAnimationTarget( F32 target_value, BOOL upload_bake );
+	virtual void			animate(F32 delta, BOOL upload_bake);
+	virtual void			stopAnimating(BOOL upload_bake);
 
 	virtual BOOL			linkDrivenParams(visual_param_mapper mapper, BOOL only_cross_params);
 	virtual void			resetDrivenParams();
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 3fc1055acdf..9938c3db2bf 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -1985,14 +1985,14 @@ bool LLAgentWearables::canWearableBeRemoved(const LLWearable* wearable) const
 	return !(((type == WT_SHAPE) || (type == WT_SKIN) || (type == WT_HAIR) || (type == WT_EYES))
 			 && (getWearableCount(type) <= 1) );		  
 }
-void LLAgentWearables::animateAllWearableParams(F32 delta, BOOL set_by_user)
+void LLAgentWearables::animateAllWearableParams(F32 delta, BOOL upload_bake)
 {
 	for( S32 type = 0; type < WT_COUNT; ++type )
 	{
 		for (S32 count = 0; count < (S32)getWearableCount((EWearableType)type); ++count)
 		{
 			LLWearable *wearable = getWearable((EWearableType)type,count);
-			wearable->animateParams(delta, set_by_user);
+			wearable->animateParams(delta, upload_bake);
 		}
 	}
 }
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index 317f4a7e4fb..9017c25fc64 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -80,7 +80,7 @@ class LLAgentWearables
 	// Note: False for shape, skin, eyes, and hair, unless you have MORE than 1.
 	bool			canWearableBeRemoved(const LLWearable* wearable) const;
 
-	void			animateAllWearableParams(F32 delta, BOOL set_by_user);
+	void			animateAllWearableParams(F32 delta, BOOL upload_bake);
 	
 	//--------------------------------------------------------------------
 	// Accessors
diff --git a/indra/newview/lldriverparam.cpp b/indra/newview/lldriverparam.cpp
index 45f4b4fbd04..3961afe9af2 100644
--- a/indra/newview/lldriverparam.cpp
+++ b/indra/newview/lldriverparam.cpp
@@ -242,7 +242,7 @@ BOOL LLDriverParam::parseData(LLXmlTreeNode* node)
 }
 #endif
 
-void LLDriverParam::setWeight(F32 weight, BOOL set_by_user)
+void LLDriverParam::setWeight(F32 weight, BOOL upload_bake)
 {
 	F32 min_weight = getMinWeight();
 	F32 max_weight = getMaxWeight();
@@ -301,7 +301,7 @@ void LLDriverParam::setWeight(F32 weight, BOOL set_by_user)
 					driven_weight = driven_min;
 				}
 				
-				setDrivenWeight(driven,driven_weight,set_by_user);
+				setDrivenWeight(driven,driven_weight,upload_bake);
 				continue;
 			}
 			else 
@@ -325,13 +325,13 @@ void LLDriverParam::setWeight(F32 weight, BOOL set_by_user)
 					driven_weight = driven_min;
 				}
 
-				setDrivenWeight(driven,driven_weight,set_by_user);
+				setDrivenWeight(driven,driven_weight,upload_bake);
 				continue;
 			}
 		}
 
 		driven_weight = getDrivenWeight(driven, mCurWeight);
-		setDrivenWeight(driven,driven_weight,set_by_user);
+		setDrivenWeight(driven,driven_weight,upload_bake);
 	}
 }
 
@@ -455,9 +455,9 @@ const LLVector3*	LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly_
 //-----------------------------------------------------------------------------
 // setAnimationTarget()
 //-----------------------------------------------------------------------------
-void LLDriverParam::setAnimationTarget( F32 target_value, BOOL set_by_user )
+void LLDriverParam::setAnimationTarget( F32 target_value, BOOL upload_bake )
 {
-	LLVisualParam::setAnimationTarget(target_value, set_by_user);
+	LLVisualParam::setAnimationTarget(target_value, upload_bake);
 
 	for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
 	{
@@ -466,16 +466,16 @@ void LLDriverParam::setAnimationTarget( F32 target_value, BOOL set_by_user )
 
 		// this isn't normally necessary, as driver params handle interpolation of their driven params
 		// but texture params need to know to assume their final value at beginning of interpolation
-		driven->mParam->setAnimationTarget(driven_weight, set_by_user);
+		driven->mParam->setAnimationTarget(driven_weight, upload_bake);
 	}
 }
 
 //-----------------------------------------------------------------------------
 // stopAnimating()
 //-----------------------------------------------------------------------------
-void LLDriverParam::stopAnimating(BOOL set_by_user)
+void LLDriverParam::stopAnimating(BOOL upload_bake)
 {
-	LLVisualParam::stopAnimating(set_by_user);
+	LLVisualParam::stopAnimating(upload_bake);
 
 	for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ )
 	{
@@ -585,7 +585,7 @@ F32 LLDriverParam::getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight
 	return driven_weight;
 }
 
-void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool set_by_user)
+void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake)
 {
 	LLVOAvatarSelf *avatar_self = gAgent.getAvatarObject();
 	if(mWearablep && 
@@ -593,10 +593,10 @@ void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bo
 	   mWearablep->isOnTop())
 	{
 		// call setWeight through LLVOAvatarSelf so other wearables can be updated with the correct values
-		avatar_self->setVisualParamWeight( (LLVisualParam*)driven->mParam, driven_weight, set_by_user );
+		avatar_self->setVisualParamWeight( (LLVisualParam*)driven->mParam, driven_weight, upload_bake );
 	}
 	else
 	{
-		driven->mParam->setWeight( driven_weight, set_by_user );
+		driven->mParam->setWeight( driven_weight, upload_bake );
 	}
 }
diff --git a/indra/newview/lldriverparam.h b/indra/newview/lldriverparam.h
index 069e71a2cb3..4e2daf5ba79 100644
--- a/indra/newview/lldriverparam.h
+++ b/indra/newview/lldriverparam.h
@@ -99,9 +99,9 @@ class LLDriverParam : public LLViewerVisualParam
 	// LLVisualParam Virtual functions
 	///*virtual*/ BOOL				parseData(LLXmlTreeNode* node);
 	/*virtual*/ void				apply( ESex sex ) {} // apply is called separately for each driven param.
-	/*virtual*/ void				setWeight(F32 weight, BOOL set_by_user);
-	/*virtual*/ void				setAnimationTarget( F32 target_value, BOOL set_by_user );
-	/*virtual*/ void				stopAnimating(BOOL set_by_user);
+	/*virtual*/ void				setWeight(F32 weight, BOOL upload_bake);
+	/*virtual*/ void				setAnimationTarget( F32 target_value, BOOL upload_bake );
+	/*virtual*/ void				stopAnimating(BOOL upload_bake);
 	/*virtual*/ BOOL				linkDrivenParams(visual_param_mapper mapper, BOOL only_cross_params);
 	/*virtual*/ void				resetDrivenParams();
 	
@@ -114,7 +114,7 @@ class LLDriverParam : public LLViewerVisualParam
 	/*virtual*/ const LLVector3*	getNextDistortion(U32 *index, LLPolyMesh **poly_mesh);
 protected:
 	F32 getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight);
-	void setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool set_by_user);
+	void setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake);
 
 
 	LLVector3	mDefaultVec; // temp holder
diff --git a/indra/newview/lltexglobalcolor.cpp b/indra/newview/lltexglobalcolor.cpp
index 595b24ad471..d7840fb4355 100644
--- a/indra/newview/lltexglobalcolor.cpp
+++ b/indra/newview/lltexglobalcolor.cpp
@@ -108,9 +108,9 @@ LLTexParamGlobalColor::LLTexParamGlobalColor(LLTexGlobalColor* tex_global_color)
 	return new_param;
 }
 
-void LLTexParamGlobalColor::onGlobalColorChanged(bool set_by_user)
+void LLTexParamGlobalColor::onGlobalColorChanged(bool upload_bake)
 {
-	mAvatar->onGlobalColorChanged(mTexGlobalColor, set_by_user);
+	mAvatar->onGlobalColorChanged(mTexGlobalColor, upload_bake);
 }
 
 //-----------------------------------------------------------------------------
diff --git a/indra/newview/lltexglobalcolor.h b/indra/newview/lltexglobalcolor.h
index 1e6754133fb..829a7d645be 100644
--- a/indra/newview/lltexglobalcolor.h
+++ b/indra/newview/lltexglobalcolor.h
@@ -80,7 +80,7 @@ class LLTexParamGlobalColor : public LLTexLayerParamColor
 	LLTexParamGlobalColor(LLTexGlobalColor *tex_color);
 	/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const;
 protected:
-	/*virtual*/ void onGlobalColorChanged(bool set_by_user);
+	/*virtual*/ void onGlobalColorChanged(bool upload_bake);
 private:
 	LLTexGlobalColor*		mTexGlobalColor;
 };
diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp
index 5d682cad3c0..25e0ca46e4d 100644
--- a/indra/newview/lltexlayer.cpp
+++ b/indra/newview/lltexlayer.cpp
@@ -1834,7 +1834,7 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i)
 		}
 		if (layer)
 		{
-			wearable->writeToAvatar(FALSE, FALSE);
+			wearable->writeToAvatar();
 			layer->setLTO(lto);
 			success &= layer->render(x,y,width,height);
 		}
diff --git a/indra/newview/lltexlayerparams.cpp b/indra/newview/lltexlayerparams.cpp
index b744722f4cd..0c7e61d00e2 100644
--- a/indra/newview/lltexlayerparams.cpp
+++ b/indra/newview/lltexlayerparams.cpp
@@ -160,7 +160,7 @@ BOOL LLTexLayerParamAlpha::getMultiplyBlend() const
 	return ((LLTexLayerParamAlphaInfo *)getInfo())->mMultiplyBlend; 	
 }
 
-void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL set_by_user)
+void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL upload_bake)
 {
 	if (mIsAnimating || mTexLayer == NULL)
 	{
@@ -179,37 +179,37 @@ void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL set_by_user)
 		{
 			if (gAgent.cameraCustomizeAvatar())
 			{
-				set_by_user = FALSE;
+				upload_bake = FALSE;
 			}
-			mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), set_by_user);
+			mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake);
 			mTexLayer->invalidateMorphMasks();
 		}
 	}
 }
 
-void LLTexLayerParamAlpha::setAnimationTarget(F32 target_value, BOOL set_by_user)
+void LLTexLayerParamAlpha::setAnimationTarget(F32 target_value, BOOL upload_bake)
 { 
 	// do not animate dummy parameters
 	if (mIsDummy)
 	{
-		setWeight(target_value, set_by_user);
+		setWeight(target_value, upload_bake);
 		return;
 	}
 
 	mTargetWeight = target_value; 
-	setWeight(target_value, set_by_user); 
+	setWeight(target_value, upload_bake); 
 	mIsAnimating = TRUE;
 	if (mNext)
 	{
-		mNext->setAnimationTarget(target_value, set_by_user);
+		mNext->setAnimationTarget(target_value, upload_bake);
 	}
 }
 
-void LLTexLayerParamAlpha::animate(F32 delta, BOOL set_by_user)
+void LLTexLayerParamAlpha::animate(F32 delta, BOOL upload_bake)
 {
 	if (mNext)
 	{
-		mNext->animate(delta, set_by_user);
+		mNext->animate(delta, upload_bake);
 	}
 }
 
@@ -449,7 +449,7 @@ LLColor4 LLTexLayerParamColor::getNetColor() const
 	}
 }
 
-void LLTexLayerParamColor::setWeight(F32 weight, BOOL set_by_user)
+void LLTexLayerParamColor::setWeight(F32 weight, BOOL upload_bake)
 {
 	if (mIsAnimating)
 	{
@@ -474,10 +474,10 @@ void LLTexLayerParamColor::setWeight(F32 weight, BOOL set_by_user)
 
 		if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param.
 		{
-			onGlobalColorChanged(set_by_user);
+			onGlobalColorChanged(upload_bake);
 			if (mTexLayer)
 			{
-				mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), set_by_user);
+				mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake);
 			}
 		}
 
@@ -485,23 +485,23 @@ void LLTexLayerParamColor::setWeight(F32 weight, BOOL set_by_user)
 	}
 }
 
-void LLTexLayerParamColor::setAnimationTarget(F32 target_value, BOOL set_by_user)
+void LLTexLayerParamColor::setAnimationTarget(F32 target_value, BOOL upload_bake)
 { 
 	// set value first then set interpolating flag to ignore further updates
 	mTargetWeight = target_value; 
-	setWeight(target_value, set_by_user);
+	setWeight(target_value, upload_bake);
 	mIsAnimating = TRUE;
 	if (mNext)
 	{
-		mNext->setAnimationTarget(target_value, set_by_user);
+		mNext->setAnimationTarget(target_value, upload_bake);
 	}
 }
 
-void LLTexLayerParamColor::animate(F32 delta, BOOL set_by_user)
+void LLTexLayerParamColor::animate(F32 delta, BOOL upload_bake)
 {
 	if (mNext)
 	{
-		mNext->animate(delta, set_by_user);
+		mNext->animate(delta, upload_bake);
 	}
 }
 
diff --git a/indra/newview/lltexlayerparams.h b/indra/newview/lltexlayerparams.h
index 98365864f99..2b80dbdba4c 100644
--- a/indra/newview/lltexlayerparams.h
+++ b/indra/newview/lltexlayerparams.h
@@ -66,9 +66,9 @@ class LLTexLayerParamAlpha : public LLTexLayerParam
 	// LLVisualParam Virtual functions
 	///*virtual*/ BOOL		parseData(LLXmlTreeNode* node);
 	/*virtual*/ void		apply( ESex avatar_sex ) {}
-	/*virtual*/ void		setWeight(F32 weight, BOOL set_by_user);
-	/*virtual*/ void		setAnimationTarget(F32 target_value, BOOL set_by_user); 
-	/*virtual*/ void		animate(F32 delta, BOOL set_by_user);
+	/*virtual*/ void		setWeight(F32 weight, BOOL upload_bake);
+	/*virtual*/ void		setAnimationTarget(F32 target_value, BOOL upload_bake); 
+	/*virtual*/ void		animate(F32 delta, BOOL upload_bake);
 
 	// LLViewerVisualParam Virtual functions
 	/*virtual*/ F32					getTotalDistortion()									{ return 1.f; }
@@ -143,9 +143,9 @@ class LLTexLayerParamColor : public LLTexLayerParam
 	// LLVisualParam Virtual functions
 	///*virtual*/ BOOL			parseData(LLXmlTreeNode* node);
 	/*virtual*/ void			apply( ESex avatar_sex ) {}
-	/*virtual*/ void			setWeight(F32 weight, BOOL set_by_user);
-	/*virtual*/ void			setAnimationTarget(F32 target_value, BOOL set_by_user);
-	/*virtual*/ void			animate(F32 delta, BOOL set_by_user);
+	/*virtual*/ void			setWeight(F32 weight, BOOL upload_bake);
+	/*virtual*/ void			setAnimationTarget(F32 target_value, BOOL upload_bake);
+	/*virtual*/ void			animate(F32 delta, BOOL upload_bake);
 
 
 	// LLViewerVisualParam Virtual functions
@@ -159,7 +159,7 @@ class LLTexLayerParamColor : public LLTexLayerParam
 	// New functions
 	LLColor4				getNetColor() const;
 protected:
-	virtual void onGlobalColorChanged(bool set_by_user) {}
+	virtual void onGlobalColorChanged(bool upload_bake) {}
 private:
 	LLVector3				mAvgDistortionVec;
 };
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 16bd74f7989..52023b2139b 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -647,7 +647,6 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
 	mWindFreq(0.f),
 	mRipplePhase( 0.f ),
 	mBelowWater(FALSE),
-	mAppearanceAnimSetByUser(FALSE),
 	mLastAppearanceBlendTime(0.f),
 	mAppearanceAnimating(FALSE),
 	mNameString(),
@@ -2436,7 +2435,7 @@ void LLVOAvatar::idleUpdateAppearanceAnimation()
 			{
 				if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE)
 				{
-					param->stopAnimating(mAppearanceAnimSetByUser);
+					param->stopAnimating(FALSE);
 				}
 			}
 			updateVisualParams();
@@ -2459,7 +2458,7 @@ void LLVOAvatar::idleUpdateAppearanceAnimation()
 				{
 					if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE)
 					{
-						param->animate(morph_amt, mAppearanceAnimSetByUser);
+						param->animate(morph_amt, FALSE);
 					}
 				}
 			}
@@ -5372,11 +5371,11 @@ void LLVOAvatar::updateShadowFaces()
 //-----------------------------------------------------------------------------
 // updateSexDependentLayerSets()
 //-----------------------------------------------------------------------------
-void LLVOAvatar::updateSexDependentLayerSets( BOOL set_by_user )
+void LLVOAvatar::updateSexDependentLayerSets( BOOL upload_bake )
 {
-	invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, set_by_user );
-	invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, set_by_user );
-	invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, set_by_user );
+	invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, upload_bake );
+	invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, upload_bake );
+	invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, upload_bake );
 }
 
 //-----------------------------------------------------------------------------
@@ -5741,7 +5740,7 @@ LLColor4 LLVOAvatar::getGlobalColor( const std::string& color_name ) const
 }
 
 // virtual
-void LLVOAvatar::invalidateComposite( LLTexLayerSet* layerset, BOOL set_by_user )
+void LLVOAvatar::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_result )
 {
 }
 
@@ -5754,18 +5753,18 @@ void LLVOAvatar::setCompositeUpdatesEnabled( BOOL b )
 {
 }
 
-void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL set_by_user )
+void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake )
 {
 	if (global_color == mTexSkinColor)
 	{
-		invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, set_by_user );
-		invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, set_by_user );
-		invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, set_by_user );
+		invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, upload_bake );
+		invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, upload_bake );
+		invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, upload_bake );
 	}
 	else if (global_color == mTexHairColor)
 	{
-		invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, set_by_user );
-		invalidateComposite( mBakedTextureDatas[BAKED_HAIR].mTexLayerSet, set_by_user );
+		invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, upload_bake );
+		invalidateComposite( mBakedTextureDatas[BAKED_HAIR].mTexLayerSet, upload_bake );
 		
 		// ! BACKWARDS COMPATIBILITY !
 		// Fix for dealing with avatars from viewers that don't bake hair.
@@ -5781,7 +5780,7 @@ void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL
 	else if (global_color == mTexEyeColor)
 	{
 //		llinfos << "invalidateComposite cause: onGlobalColorChanged( eyecolor )" << llendl; 
-		invalidateComposite( mBakedTextureDatas[BAKED_EYES].mTexLayerSet,  set_by_user );
+		invalidateComposite( mBakedTextureDatas[BAKED_EYES].mTexLayerSet,  upload_bake );
 	}
 	updateMeshTextures();
 }
@@ -6239,14 +6238,14 @@ BOOL LLVOAvatar::teToColorParams( ETextureIndex te, U32 *param_name )
 	return TRUE;
 }
 
-void LLVOAvatar::setClothesColor( ETextureIndex te, const LLColor4& new_color, BOOL set_by_user )
+void LLVOAvatar::setClothesColor( ETextureIndex te, const LLColor4& new_color, BOOL upload_bake )
 {
 	U32 param_name[3];
 	if( teToColorParams( te, param_name ) )
 	{
-		setVisualParamWeight( param_name[0], new_color.mV[VX], set_by_user );
-		setVisualParamWeight( param_name[1], new_color.mV[VY], set_by_user );
-		setVisualParamWeight( param_name[2], new_color.mV[VZ], set_by_user );
+		setVisualParamWeight( param_name[0], new_color.mV[VX], upload_bake );
+		setVisualParamWeight( param_name[1], new_color.mV[VY], upload_bake );
+		setVisualParamWeight( param_name[2], new_color.mV[VZ], upload_bake );
 	}
 }
 
@@ -6977,11 +6976,10 @@ void LLVOAvatar::cullAvatarsByPixelArea()
 	}
 }
 
-void LLVOAvatar::startAppearanceAnimation(BOOL set_by_user, BOOL play_sound)
+void LLVOAvatar::startAppearanceAnimation()
 {
 	if(!mAppearanceAnimating)
 	{
-		mAppearanceAnimSetByUser = set_by_user;
 		mAppearanceAnimating = TRUE;
 		mAppearanceMorphTimer.reset();
 		mLastAppearanceBlendTime = 0.f;
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 173ad02808a..2fd1a506a90 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -522,7 +522,7 @@ class LLVOAvatar :
 	// Composites
 	//--------------------------------------------------------------------
 public:
-	virtual void	invalidateComposite(LLTexLayerSet* layerset, BOOL set_by_user);
+	virtual void	invalidateComposite(LLTexLayerSet* layerset, BOOL upload_result);
 	virtual void	invalidateAll();
 	virtual void	setCompositeUpdatesEnabled(BOOL b);
 
@@ -558,7 +558,7 @@ class LLVOAvatar :
 
 public:
 	void 			updateMeshTextures();
-	void 			updateSexDependentLayerSets(BOOL set_by_user);
+	void 			updateSexDependentLayerSets(BOOL upload_bake);
 	void 			dirtyMesh(); // Dirty the avatar mesh
 	void 			updateMeshData();
 protected:
@@ -591,7 +591,7 @@ class LLVOAvatar :
 public:
 	void 			processAvatarAppearance(LLMessageSystem* mesgsys);
 	void 			hideSkirt();
-	void			startAppearanceAnimation(BOOL set_by_user, BOOL play_sound);
+	void			startAppearanceAnimation();
 	
 	//--------------------------------------------------------------------
 	// Appearance morphing
@@ -600,14 +600,13 @@ class LLVOAvatar :
 	BOOL			mAppearanceAnimating;
 private:
 	LLFrameTimer	mAppearanceMorphTimer;
-	BOOL			mAppearanceAnimSetByUser;
 	F32				mLastAppearanceBlendTime;
 
 	//--------------------------------------------------------------------
 	// Clothing colors (convenience functions to access visual parameters)
 	//--------------------------------------------------------------------
 public:
-	void			setClothesColor(LLVOAvatarDefines::ETextureIndex te, const LLColor4& new_color, BOOL set_by_user);
+	void			setClothesColor(LLVOAvatarDefines::ETextureIndex te, const LLColor4& new_color, BOOL upload_bake);
 	LLColor4		getClothesColor(LLVOAvatarDefines::ETextureIndex te);
 	static BOOL			teToColorParams(LLVOAvatarDefines::ETextureIndex te, U32 *param_name);
 
@@ -616,7 +615,7 @@ class LLVOAvatar :
 	//--------------------------------------------------------------------
 public:
 	LLColor4		getGlobalColor(const std::string& color_name ) const;
-	void			onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL set_by_user);
+	void			onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake);
 private:
 	LLTexGlobalColor* mTexSkinColor;
 	LLTexGlobalColor* mTexHairColor;
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index a2203ba2ea8..65f1477a4f5 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -633,33 +633,33 @@ LLJoint *LLVOAvatarSelf::getJoint(const std::string &name)
 	return LLVOAvatar::getJoint(name);
 }
 
-/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL set_by_user )
+/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake )
 {
 	if (!which_param)
 	{
 		return FALSE;
 	}
 	LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(which_param->getID());
-	return setParamWeight(param,weight,set_by_user);
+	return setParamWeight(param,weight,upload_bake);
 }
 
-/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user )
+/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake )
 {
 	if (!param_name)
 	{
 		return FALSE;
 	}
 	LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(param_name);
-	return setParamWeight(param,weight,set_by_user);
+	return setParamWeight(param,weight,upload_bake);
 }
 
-/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user )
+/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake )
 {
 	LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(index);
-	return setParamWeight(param,weight,set_by_user);
+	return setParamWeight(param,weight,upload_bake);
 }
 
-BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL set_by_user )
+BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL upload_bake )
 {
 	if (!param)
 	{
@@ -675,12 +675,12 @@ BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL
 			LLWearable *wearable = gAgentWearables.getWearable(type,count);
 			if (wearable)
 			{
-				wearable->setVisualParamWeight(param->getID(), weight, set_by_user);
+				wearable->setVisualParamWeight(param->getID(), weight, upload_bake);
 			}
 		}
 	}
 
-	return LLCharacter::setVisualParamWeight(param,weight,set_by_user);
+	return LLCharacter::setVisualParamWeight(param,weight,upload_bake);
 }
 
 /*virtual*/ 
@@ -691,7 +691,7 @@ void LLVOAvatarSelf::updateVisualParams()
 		LLWearable *wearable = gAgentWearables.getTopWearable((EWearableType)type);
 		if (wearable)
 		{
-			wearable->writeToAvatar(FALSE, FALSE);
+			wearable->writeToAvatar();
 		}
 	}
 
@@ -702,7 +702,7 @@ void LLVOAvatarSelf::updateVisualParams()
 void LLVOAvatarSelf::idleUpdateAppearanceAnimation()
 {
 	// Animate all top-level wearable visual parameters
-	gAgentWearables.animateAllWearableParams(calcMorphAmount(), mAppearanceAnimSetByUser);
+	gAgentWearables.animateAllWearableParams(calcMorphAmount(), FALSE);
 
 	// apply wearable visual params to avatar
 	updateVisualParams();
@@ -737,8 +737,7 @@ void LLVOAvatarSelf::stopMotionFromSource(const LLUUID& source_id)
 	}
 }
 
-// virtual
-void LLVOAvatarSelf::setLocalTextureTE(U8 te, LLViewerTexture* image, BOOL set_by_user, U32 index)
+void LLVOAvatarSelf::setLocalTextureTE(U8 te, LLViewerTexture* image, U32 index)
 {
 	if (te >= TEX_NUM_INDICES)
 	{
@@ -1347,7 +1346,7 @@ bool LLVOAvatarSelf::hasPendingBakedUploads() const
 	return false;
 }
 
-void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL set_by_user )
+void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_result )
 {
 	if( !layerset || !layerset->getUpdatesEnabled() )
 	{
@@ -1358,7 +1357,7 @@ void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL set_by_u
 	layerset->requestUpdate();
 	layerset->invalidateMorphMasks();
 
-	if( set_by_user )
+	if( upload_result )
 	{
 		llassert(isSelf());
 
@@ -1945,9 +1944,7 @@ void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**)
 				if (layer_set)
 				{
 					llinfos << "TAT: rebake - matched entry " << (S32)index << llendl;
-					// Apparently set_by_user == force upload
-					BOOL set_by_user = TRUE;
-					self->invalidateComposite(layer_set, set_by_user);
+					self->invalidateComposite(layer_set, TRUE);
 					found = TRUE;
 					LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_REBAKES);
 				}
@@ -1983,8 +1980,7 @@ void LLVOAvatarSelf::forceBakeAllTextures(bool slam_for_debug)
 				layer_set->cancelUpload();
 			}
 
-			BOOL set_by_user = TRUE;
-			invalidateComposite(layer_set, set_by_user);
+			invalidateComposite(layer_set, TRUE);
 			LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_REBAKES);
 		}
 		else
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index 8a66422c445..6702f030feb 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -86,15 +86,15 @@ class LLVOAvatarSelf :
 	/*virtual*/ void 		requestStopMotion(LLMotion* motion);
 	/*virtual*/ LLJoint*	getJoint(const std::string &name);
 
-	/*virtual*/ BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL set_by_user = FALSE );
-	/*virtual*/ BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL set_by_user = FALSE );
-	/*virtual*/ BOOL setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user = FALSE );
+	/*virtual*/ BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake = FALSE );
+	/*virtual*/ BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake = FALSE );
+	/*virtual*/ BOOL setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake = FALSE );
 	/*virtual*/ void updateVisualParams();
 	/*virtual*/ void idleUpdateAppearanceAnimation();
 
 private:
 	// helper function. Passed in param is assumed to be in avatar's parameter list.
-	BOOL setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL set_by_user = FALSE );
+	BOOL setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL upload_bake = FALSE );
 
 
 /**                    Initialization
@@ -186,7 +186,7 @@ class LLVOAvatarSelf :
 	BOOL				getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture** image_gl_pp, U32 index) const;
 	LLViewerFetchedTexture*	getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
 	const LLUUID&		getLocalTextureID(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
-	void				setLocalTextureTE(U8 te, LLViewerTexture* image, BOOL set_by_user, U32 index);
+	void				setLocalTextureTE(U8 te, LLViewerTexture* image, U32 index);
 	const LLUUID&		grabLocalTexture(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
 	BOOL				canGrabLocalTexture(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
 	/*virtual*/ void	setLocalTexture(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture* tex, BOOL baked_version_exits, U32 index);
@@ -228,7 +228,7 @@ class LLVOAvatarSelf :
 	// Composites
 	//--------------------------------------------------------------------
 public:
-	/* virtual */ void	invalidateComposite(LLTexLayerSet* layerset, BOOL set_by_user);
+	/* virtual */ void	invalidateComposite(LLTexLayerSet* layerset, BOOL upload_result);
 	/* virtual */ void	invalidateAll();
 	/* virtual */ void	setCompositeUpdatesEnabled(BOOL b); // only works for self
 	void				setupComposites();
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index 3185ee45bfe..c5c97e7649c 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -602,7 +602,7 @@ void LLWearable::setTexturesToDefaults()
 }
 
 // Updates the user's avatar's appearance
-void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater )
+void LLWearable::writeToAvatar()
 {
 	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
 	llassert( avatar );
@@ -622,24 +622,10 @@ void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater
 			S32 param_id = param->getID();
 			F32 weight = getVisualParamWeight(param_id);
 
-			// only animate with user-originated changes
-			if (set_by_user)
-			{
-				param->setAnimationTarget(weight, set_by_user);
-			}
-			else
-			{
-				avatar->setVisualParamWeight( param_id, weight, set_by_user );
-			}
+			avatar->setVisualParamWeight( param_id, weight, FALSE );
 		}
 	}
 
-	// only interpolate with user-originated changes
-	if (set_by_user)
-	{
-		avatar->startAppearanceAnimation(TRUE, TRUE);
-	}
-
 	// Pull texture entries
 	for( S32 te = 0; te < TEX_NUM_INDICES; te++ )
 	{
@@ -657,24 +643,17 @@ void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater
 			}
 			LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE );
 			// MULTI-WEARABLE: replace hard-coded 0
-			avatar->setLocalTextureTE(te, image, set_by_user, 0);
+			avatar->setLocalTextureTE(te, image, 0);
 		}
 	}
 
-
-	if( gFloaterCustomize && update_customize_floater )
-	{
-		gFloaterCustomize->setWearable(mType, 0);
-		gFloaterCustomize->setCurrentWearableType( mType );
-	}
-
 	ESex new_sex = avatar->getSex();
 	if( old_sex != new_sex )
 	{
-		avatar->updateSexDependentLayerSets( set_by_user );
+		avatar->updateSexDependentLayerSets( FALSE );
 	}	
 	
-//	if( set_by_user )
+//	if( upload_bake )
 //	{
 //		gAgent.sendAgentSetAppearance();
 //	}
@@ -683,7 +662,7 @@ void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater
 
 // Updates the user's avatar's appearance, replacing this wearables' parameters and textures with default values.
 // static 
-void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user )
+void LLWearable::removeFromAvatar( EWearableType type, BOOL upload_bake )
 {
 	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
 	llassert( avatar );
@@ -707,7 +686,7 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user )
 		if( (((LLViewerVisualParam*)param)->getWearableType() == type) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) )
 		{
 			S32 param_id = param->getID();
-			avatar->setVisualParamWeight( param_id, param->getDefaultWeight(), set_by_user );
+			avatar->setVisualParamWeight( param_id, param->getDefaultWeight(), upload_bake );
 		}
 	}
 
@@ -719,7 +698,7 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user )
 	avatar->updateVisualParams();
 	avatar->wearableUpdated(type);
 
-//	if( set_by_user )
+//	if( upload_bake )
 //	{
 //		gAgent.sendAgentSetAppearance();
 //	}
@@ -868,12 +847,12 @@ void LLWearable::setVisualParams()
 }
 
 
-void LLWearable::setVisualParamWeight(S32 param_index, F32 value, BOOL set_by_user)
+void LLWearable::setVisualParamWeight(S32 param_index, F32 value, BOOL upload_bake)
 {
 	if( is_in_map(mVisualParamIndexMap, param_index ) )
 	{
 		LLVisualParam *wearable_param = mVisualParamIndexMap[param_index];
-		wearable_param->setWeight(value, set_by_user);
+		wearable_param->setWeight(value, upload_bake);
 	}
 	else
 	{
@@ -914,14 +893,14 @@ void LLWearable::getVisualParams(visual_param_vec_t &list)
 	}
 }
 
-void LLWearable::animateParams(F32 delta, BOOL set_by_user)
+void LLWearable::animateParams(F32 delta, BOOL upload_bake)
 {
 	for(visual_param_index_map_t::iterator iter = mVisualParamIndexMap.begin();
 		 iter != mVisualParamIndexMap.end();
 		 ++iter)
 	{
 		LLVisualParam *param = (LLVisualParam*) iter->second;
-		param->animate(delta, set_by_user);
+		param->animate(delta, upload_bake);
 	}
 }
 
@@ -939,14 +918,14 @@ LLColor4 LLWearable::getClothesColor(S32 te) const
 	return color;
 }
 
-void LLWearable::setClothesColor( S32 te, const LLColor4& new_color, BOOL set_by_user )
+void LLWearable::setClothesColor( S32 te, const LLColor4& new_color, BOOL upload_bake )
 {
 	U32 param_name[3];
 	if( LLVOAvatar::teToColorParams( (LLVOAvatarDefines::ETextureIndex)te, param_name ) )
 	{
 		for( U8 index = 0; index < 3; index++ )
 		{
-			setVisualParamWeight(param_name[index], new_color.mV[index], set_by_user);
+			setVisualParamWeight(param_name[index], new_color.mV[index], upload_bake);
 		}
 	}
 }
diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h
index 96631811c58..fd19a864062 100644
--- a/indra/newview/llwearable.h
+++ b/indra/newview/llwearable.h
@@ -89,9 +89,9 @@ class LLWearable
 	BOOL				isDirty() const;
 	BOOL				isOldVersion() const;
 
-	void				writeToAvatar( BOOL set_by_user, BOOL update_customize_floater = TRUE );
-	void				removeFromAvatar( BOOL set_by_user )	{ LLWearable::removeFromAvatar( mType, set_by_user ); }
-	static void			removeFromAvatar( EWearableType type, BOOL set_by_user ); 
+	void				writeToAvatar();
+	void				removeFromAvatar( BOOL upload_bake )	{ LLWearable::removeFromAvatar( mType, upload_bake ); }
+	static void			removeFromAvatar( EWearableType type, BOOL upload_bake ); 
 
 	BOOL				exportFile(LLFILE* file) const;
 	BOOL				importFile(LLFILE* file);
@@ -115,14 +115,14 @@ class LLWearable
 	void				setLocalTextureObject(S32 index, LLLocalTextureObject *lto);
 	void				addVisualParam(LLVisualParam *param);
 	void				setVisualParams();
-	void 				setVisualParamWeight(S32 index, F32 value, BOOL set_by_user);
+	void 				setVisualParamWeight(S32 index, F32 value, BOOL upload_bake);
 	F32					getVisualParamWeight(S32 index) const;
 	LLVisualParam*		getVisualParam(S32 index) const;
 	void				getVisualParams(visual_param_vec_t &list);
-	void				animateParams(F32 delta, BOOL set_by_user);
+	void				animateParams(F32 delta, BOOL upload_bake);
 
 	LLColor4			getClothesColor(S32 te) const;
-	void 				setClothesColor( S32 te, const LLColor4& new_color, BOOL set_by_user );
+	void 				setClothesColor( S32 te, const LLColor4& new_color, BOOL upload_bake );
 
 	void				revertValues();
 
-- 
GitLab


From bc5096ff3d01f25cd47c9a5803f3255e11cd8cfa Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Wed, 11 Nov 2009 16:40:15 -0500
Subject: [PATCH 131/557] DEV-34507 too many baked texture uploads

Fixed a double-bake bug on hitting the "OK" button of the appearance editor
Also cleaned up extraneous calls to requestLayersetUpload.
Behavior should now be consistent with resident expectations.

Code reviewed by Bigpapi
---
 indra/newview/llvoavatarself.cpp | 2 --
 1 file changed, 2 deletions(-)

diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 65f1477a4f5..185274d40d2 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -2043,7 +2043,6 @@ void LLVOAvatarSelf::onCustomizeEnd()
 	if (avatarp)
 	{
 		avatarp->invalidateAll();
-		avatarp->requestLayerSetUploads();
 	}
 }
 
@@ -2080,7 +2079,6 @@ void LLVOAvatarSelf::setInvisible(BOOL newvalue)
 	{
 		setCompositeUpdatesEnabled(TRUE);
 		invalidateAll();
-		requestLayerSetUploads();
 		gAgent.sendAgentSetAppearance();
 	}
 }
-- 
GitLab


From 20c9b13df6d069814217525ec1cea0782a391c7f Mon Sep 17 00:00:00 2001
From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com>
Date: Wed, 11 Nov 2009 17:17:41 -0500
Subject: [PATCH 132/557] Added tool-tip graphic.

---
 .../newview/skins/default/textures/textures.xml  |   2 ++
 .../skins/default/textures/widgets/Tooltip.png   | Bin 0 -> 2910 bytes
 2 files changed, 2 insertions(+)
 create mode 100644 indra/newview/skins/default/textures/widgets/Tooltip.png

diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index e8816655783..57239f9e7f0 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -531,6 +531,8 @@
   <texture name="Toolbar_Right_Off" file_name="containers/Toolbar_Right_Off.png" preload="false" />
   <texture name="Toolbar_Right_Press" file_name="containers/Toolbar_Right_Press.png" preload="false" />
   <texture name="Toolbar_Right_Selected" file_name="containers/Toolbar_Right_Selected.png" preload="false" />
+  
+  <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="1" scale.right="99" scale.bottom="14"
 
   <texture name="TrashItem_Disabled" file_name="icons/TrashItem_Disabled.png" preload="false" />
   <texture name="TrashItem_Off" file_name="icons/TrashItem_Off.png" preload="false" />
diff --git a/indra/newview/skins/default/textures/widgets/Tooltip.png b/indra/newview/skins/default/textures/widgets/Tooltip.png
new file mode 100644
index 0000000000000000000000000000000000000000..f989ac9083283cfeab4fdcfc93ebf9175152cf7b
GIT binary patch
literal 2910
zcmV-k3!(IhP)<h;3K|Lk000e1NJLTq003qH000pP1^@s6FZkIT00009a7bBm000XU
z000XU0RWnu7ytkYPiaF#P*7-ZbZ>KLZ*U+<Lqi~Na&Km7Y-Iodc-oy)XH-+^7Crag
z^g>IBfRsybQWXdwQbLP>6p<z>Aqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uh<iVD~V
z<RPMtgQJLw%KPDaqifc@_vX$1wbwr9tn;0-&j-K=43<bUQ8j=JsX`tR;Dg7+#^K~H
zK!FM*Z~zbpvt%K2{UZSY_<lS*D<Z%Lz5oGu(+dayz)hRLFdT>f59&ghTmgWD0l;*T
zI7<kC6aYYajzXpYKt=(8otP$50H6c_V9R4-;{Z@C0AMG7=F<Rxo%or10RUT+Ar%3j
zkpLhQWr#!oXgdI`&sK^>09Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p
z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-<?i
z0%4j!F2Z@488U%158(66005wo6%pWr^Zj_v4zAA5HjcIqUoGmt2LB>rV&neh&#Q1i
z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_<lS*MWK+n+1cgf
z<k(8YLR(?VSAG6x!e78w{cQPuJpA|d;J)G{fihizM+Erb!p!tcr5w+a34~(Y=8s4G
zw+sLL9n&JjNn*KJDiq^U5^;`1nvC-@r6P$!k}1U{(*I=Q-z@tBKHoI}uxdU5dyy@u
zU1J0GOD7Ombim^G008p4Z^6_k2m^p<gW=D2|L;HjN1!DDfM!XOaR2~bL?kX$%CkSm
z2mk;?pn)o|K^yeJ7%adB9Ki+L!3+FgHiSYX#KJ-lLJDMn9CBbOtb#%)hRv`YDqt_v
zKpix|QD}yfa1JiQRk#j4a1Z)n2%f<xynzV>LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW
zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_Ifq<Ex{*7`05XF7hP+2Hl!3BQJ=6@fL%FCo
z8iYoo3(#bAF`ADSpqtQgv>H8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X
zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ<AYmRsNLWl*PS{AOARHt#5!wki2?K;t
z!Y3k=s7tgax)J%r7-BLphge7~Bi0g+6E6^Zh(p9TBoc{3GAFr^0!gu?RMHaCM$&Fl
zBk3%un>0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4
z<uv66WtcKSRim0x-Ke2d5jBrmLam{;Qm;{ms1r1GnmNsb7D-E`t)i9F8fX`2_i3-_
zbh;7Ul^#x)&{xvS=|||7=mYe33=M`AgU5(xC>fg=2N-7=cNnjjOr{yriy6mMFgG#l
znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U
zt5vF<Q0r40Q)j6=sE4X&sBct1q<&fbi3VB2Ov6t@q*0);U*o*SAPZv|vv@2aYYnT0
zb%8a+Cb7-ge0D0knEf5Qi#@8Tp*ce{N;6lpQuCB%KL_KOarm5cP6_8Ir<e17iry6O
zDdH&`rZh~sF=bq9s+O0QSgS~@QL9Jmy*94xr=6y~MY~!1fet~(N+(<=M`w@D1)b+p
z*;C!83a1uLJv#NSE~;y#8=<>IcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya?
z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y
zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB
zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt
z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a<fJbF^|4I#xQ~n$Dc=
zKYhjYmgz5NSkDm8*fZm{6U!;YX`NG>(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C
z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB
zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe
zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0
z?2xS?_ve_-k<Mujg;0Lz*3buG=3$G&ehepthlN*$KaOySSQ^nWmo<0M+(UEUMEXRQ
zMBbZcF;6+KElM>iKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$
z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4
z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu
zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu
z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E
ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw
zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX
z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i&
z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01
z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R
z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw
zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD
zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3|
zawq-H%e&ckC+@AhPrP6BK<z=<L*0kfKU@CX*zeqbYQT4(^U>T#_XdT7&;F71j}Joy
zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z
zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot<a{81DF0~rvGr5Xr~8u`lav1h
z1DNytV>2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F}
z0001qNkl<Zc-rjPu?d4v6h`6m#20u?oInU<0>J^?DRX3}3?O8JfRG8SgxI7|ceu#;
zs$2i3y9vne*W-u6=!WN|1`5FK-n&Qu(`N)I6_A}HoLsp<OolOx3}YA>#xOFB3}YA>
z=FIBj*q>(#A^}&R1sdlFVFtd5?Yms?%N)fDEPnt10RR630M|YZ;hBxp;s5{u07*qo
IM6N<$f)zVv;s5{u

literal 0
HcmV?d00001

-- 
GitLab


From 2392cb2a6a7237a332819da436e9f36f654b05fb Mon Sep 17 00:00:00 2001
From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com>
Date: Wed, 11 Nov 2009 17:21:47 -0500
Subject: [PATCH 133/557] Fixed typo.
 http://jira.secondlife.com/browse/EXT-2359

---
 indra/newview/skins/default/xui/en/floater_avatar_picker.xml | 2 +-
 indra/newview/skins/default/xui/en/panel_people.xml          | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
index a0f9bb59fd2..3a1499eaaaf 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
@@ -16,7 +16,7 @@
     </floater.string>
     <floater.string
      name="no_one_near">
-        No-one near
+        No one near
     </floater.string>
     <floater.string
      name="no_results">
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 15fdd73bdc1..9fac7d34f75 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -16,7 +16,7 @@ background_visible="true"
      value="No people" />
     <string
      name="no_one_near"
-     value="No-one near" />
+     value="No one near" />
     <string
      name="no_friends_online"
      value="No friends online" />
-- 
GitLab


From a24c4af67d4a21a3372fea75c00e91e5d182d0a7 Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Wed, 11 Nov 2009 17:25:03 -0500
Subject: [PATCH 134/557] fixing build - last commit had bad call to
 startAppearanceAnimation

function definition of startAppearanceAnimation chagned - last patch
missed eliminating the parameters at line 6594 in llvoavatar.cpp.
This patch fixes the issue, confirmed builds and runs locally.
---
 indra/newview/llvoavatar.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 52023b2139b..62ac8adad0b 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -6591,7 +6591,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
 		{
 			if (interp_params)
 			{
-				startAppearanceAnimation(FALSE, FALSE);
+				startAppearanceAnimation();
 			}
 			updateVisualParams();
 
-- 
GitLab


From 51e3a486c6de28eb0a722edeee685192e9bde1b2 Mon Sep 17 00:00:00 2001
From: "Mark Palange (Mani)" <palange@lindenlab.com>
Date: Wed, 11 Nov 2009 14:28:40 -0800
Subject: [PATCH 135/557] Changes to fix an LLERRS caused by SRV request
 timeout. Added settings to config SRV request params Increased timeout to 10
 seconds Changed timeout to generate login failure event instead of an error.
 Added unit test to cover SRV failure event.

---
 indra/newview/app_settings/settings.xml       | 24 ++++++++++++++-
 indra/newview/lllogininstance.cpp             |  3 ++
 indra/newview/tests/lllogininstance_test.cpp  |  1 +
 indra/viewer_components/login/lllogin.cpp     | 30 ++++++++++++++-----
 .../login/tests/lllogin_test.cpp              | 29 ++++++++++++++++++
 5 files changed, 78 insertions(+), 9 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 6f6d5fb9796..dccf4de6511 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -4248,7 +4248,29 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
-    <key>LogMessages</key>
+  <key>LoginSRVTimeout</key>
+  <map>
+    <key>Comment</key>
+    <string>Duration in seconds of the login SRV request timeout</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>F32</string>
+    <key>Value</key>
+    <real>10.0</real>
+  </map>
+  <key>LoginSRVPump</key>
+  <map>
+    <key>Comment</key>
+    <string>Name of the message pump that handles SRV request</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>String</string>
+    <key>Value</key>
+    <string>LLAres</string>
+  </map>
+  <key>LogMessages</key>
     <map>
       <key>Comment</key>
       <string>Log network traffic</string>
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index e5f347ddc40..955347bce2d 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -182,6 +182,9 @@ void LLLoginInstance::constructAuthParams(const LLSD& credentials)
 	mRequestData["method"] = "login_to_simulator";
 	mRequestData["params"] = request_params;
 	mRequestData["options"] = requested_options;
+
+	mRequestData["cfg_srv_timeout"] = gSavedSettings.getF32("LoginSRVTimeout");
+	mRequestData["cfg_srv_pump"] = gSavedSettings.getString("LoginSRVPump");
 }
 
 bool LLLoginInstance::handleLoginEvent(const LLSD& event)
diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp
index d31a81e1280..7b28a3b72c3 100644
--- a/indra/newview/tests/lllogininstance_test.cpp
+++ b/indra/newview/tests/lllogininstance_test.cpp
@@ -76,6 +76,7 @@ LLControlGroup::LLControlGroup(const std::string& name) :
 LLControlGroup::~LLControlGroup() {}
 void LLControlGroup::setBOOL(const std::string& name, BOOL val) {}
 BOOL LLControlGroup::getBOOL(const std::string& name) { return FALSE; }
+F32 LLControlGroup::getF32(const std::string& name) { return 0.0f; }
 U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only) { return 1; }
 void LLControlGroup::setString(const std::string& name, const std::string& val) {}
 std::string LLControlGroup::getString(const std::string& name) { return "test_string"; }
diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp
index ea1e3ff3f99..b14c59ab9ac 100644
--- a/indra/viewer_components/login/lllogin.cpp
+++ b/indra/viewer_components/login/lllogin.cpp
@@ -70,7 +70,7 @@ class LLLogin::Impl
 	LLEventPump& getEventPump() { return mPump; }
 
 private:
-	void sendProgressEvent(const std::string& state, const std::string& change,
+	LLSD getProgressEventLLSD(const std::string& state, const std::string& change,
 						   const LLSD& data = LLSD())
 	{
 		LLSD status_data;
@@ -87,7 +87,13 @@ class LLLogin::Impl
 		{
 			status_data["data"] = data;
 		}
+		return status_data;
+	}
 
+	void sendProgressEvent(const std::string& state, const std::string& change,
+						   const LLSD& data = LLSD())
+	{
+		LLSD status_data = getProgressEventLLSD(state, change, data);
 		mPump.post(status_data);
 	}
 
@@ -140,20 +146,28 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
         // Request SRV record.
         LL_INFOS("LLLogin") << "Requesting SRV record from " << uri << LL_ENDL;
 
-        // *NOTE:Mani - Completely arbitrary timeout value for SRV request.
-        // filter.errorAfter(5, "SRV Request timed out!");
-	
-		// 
+        // *NOTE:Mani - Completely arbitrary default timeout value for SRV request.
 		F32 seconds_to_timeout = 5.0f;
-		filter.actionAfter(seconds_to_timeout, 
-			sendProgressEvent("offline", "fail.login", LLSD()));
+		if(credentials.has("cfg_srv_timeout"))
+		{
+			seconds_to_timeout = credentials["cfg_srv_timeout"].asReal();
+		}
+
+		filter.eventAfter(seconds_to_timeout, 
+			getProgressEventLLSD("offline", "fail.login"));
+
+		std::string srv_pump_name = "LLAres";
+		if(credentials.has("cfg_srv_pump"))
+		{
+			srv_pump_name = credentials["cfg_srv_pump"].asString();
+		}
 
 		// Make request
         LLSD request;
         request["op"] = "rewriteURI";
         request["uri"] = uri;
         request["reply"] = replyPump.getName();
-        rewrittenURIs = postAndWait(self, request, "LLAres", filter);
+        rewrittenURIs = postAndWait(self, request, srv_pump_name, filter);
     } // we no longer need the filter
 
     LLEventPump& xmlrpcPump(LLEventPumps::instance().obtain("LLXMLRPCTransaction"));
diff --git a/indra/viewer_components/login/tests/lllogin_test.cpp b/indra/viewer_components/login/tests/lllogin_test.cpp
index a8ae2883d54..c3b18384222 100644
--- a/indra/viewer_components/login/tests/lllogin_test.cpp
+++ b/indra/viewer_components/login/tests/lllogin_test.cpp
@@ -47,6 +47,7 @@ class LoginListener: public LLEventTrackable
 	bool call(const LLSD& event)
 	{
 		mDebug(STRINGIZE("LoginListener called!: " << event));
+		
 		mLastEvent = event;
 		return false;
 	}
@@ -414,4 +415,32 @@ namespace tut
 
 		ensure_equals("Failed to offline", listener.lastEvent()["state"].asString(), "offline");
 	}
+
+    template<> template<>
+    void llviewerlogin_object::test<5>()
+    {
+        DEBUG;
+		// Test SRV request timeout.
+		set_test_name("LLLogin SRV timeout testing");
+
+		// Testing normal login procedure.
+		LLEventStream llaresPump("LLAres"); // Dummy LLAres pump.
+
+		// LLAresListener dummyLLAres("dummy_llares");
+		// dummyLLAres.listenTo(llaresPump);
+
+		LLLogin login;
+		LoginListener listener("test_ear");
+		listener.listenTo(login.getEventPump());
+
+		LLSD credentials;
+		credentials["first"] = "these";
+		credentials["last"] = "don't";
+		credentials["passwd"] = "matter";
+		credentials["cfg_srv_timeout"] = 0.0f;
+
+		login.connect("login.bar.com", credentials);
+
+		ensure_equals("Failed to offline", listener.lastEvent()["change"].asString(), "srvrequest"); 
+	}
 }
-- 
GitLab


From 6b14f9a48f18842e207013d89e4578a73ee5e7bf Mon Sep 17 00:00:00 2001
From: Lynx Linden <lynx@lindenlab.com>
Date: Wed, 11 Nov 2009 22:42:25 +0000
Subject: [PATCH 136/557] DEV-41358: Changed format of preferred maturity for
 search.

Now preferred maturity is passed to the search web pages as an
r={13|21|42} query param.
---
 indra/newview/llfloatersearch.cpp                | 16 +++++++++++++---
 .../skins/default/xui/en/floater_search.xml      |  4 ++--
 2 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index ca2cdffcf8f..e2df2ffdf70 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -124,9 +124,19 @@ void LLFloaterSearch::search(const LLSD &key)
 	url += "&p=" + search_token.asString();
 
 	// also append the user's preferred maturity (can be changed via prefs)
-	std::string maturity = "pg";
-	if (gAgent.prefersMature()) maturity += ",mature";
-	if (gAgent.prefersAdult()) maturity += ",adult";
+	std::string maturity;
+	if (gAgent.prefersAdult())
+	{
+		maturity = "42";  // PG,Mature,Adult
+	}
+	else if (gAgent.prefersMature())
+	{
+		maturity = "21";  // PG,Mature
+	}
+	else
+	{
+		maturity = "13";  // PG
+	}
 	url += "&r=" + maturity;
 
 	// and load the URL in the web view
diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml
index b9cf4568426..d9498586af9 100644
--- a/indra/newview/skins/default/xui/en/floater_search.xml
+++ b/indra/newview/skins/default/xui/en/floater_search.xml
@@ -25,7 +25,7 @@
         Done
     </floater.string>
     <layout_stack
-     bottom="400"
+     bottom="512"
      follows="left|right|top|bottom"
      layout="topleft"
      left="10"
@@ -54,7 +54,7 @@
              layout="topleft"
              left_delta="0"
              name="status_text"
-             top_pad="4"
+             top_pad="5"
              width="150" />
         </layout_panel>
     </layout_stack>
-- 
GitLab


From f884941a8f182b43d8bb0030b17b686fa311eaee Mon Sep 17 00:00:00 2001
From: Xiaohong Bao <none@none>
Date: Wed, 11 Nov 2009 14:53:13 -0800
Subject: [PATCH 137/557] use "LLViewerTexture::EBoostLevel" to replace "S32"
 for texture boost level.

---
 indra/newview/llviewertexture.cpp     |  8 +++-----
 indra/newview/llviewertexture.h       | 17 ++++++++---------
 indra/newview/llviewertexturelist.cpp | 26 ++++++++++++++++----------
 indra/newview/llviewertexturelist.h   | 14 ++++++++------
 indra/newview/llworldmipmap.cpp       |  2 +-
 5 files changed, 36 insertions(+), 31 deletions(-)

diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 9923c9ac74f..fc4a2b0c0c9 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -206,33 +206,31 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const U32 wid
 LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture(
 	                                               const LLUUID &image_id,											       
 												   BOOL usemipmaps,
-												   S32 boost_priority,
+												   LLViewerTexture::EBoostLevel boost_priority,
 												   S8 texture_type,
 												   LLGLint internal_format,
 												   LLGLenum primary_format,
 												   LLHost request_from_host)
 {
-	llassert_always(boost_priority >= LLViewerTexture::BOOST_NONE) ;
 	return gTextureList.getImage(image_id, usemipmaps, boost_priority, texture_type, internal_format, primary_format, request_from_host) ;
 }
 	
 LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromFile(
 	                                               const std::string& filename,												   
 												   BOOL usemipmaps,
-												   S32 boost_priority,
+												   LLViewerTexture::EBoostLevel boost_priority,
 												   S8 texture_type,
 												   LLGLint internal_format,
 												   LLGLenum primary_format, 
 												   const LLUUID& force_id)
 {
-	llassert_always(boost_priority >= LLViewerTexture::BOOST_NONE) ;
 	return gTextureList.getImageFromFile(filename, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id) ;
 }
 
 //static 
 LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromUrl(const std::string& url,									 
 									 BOOL usemipmaps,
-									 S32 boost_priority,
+									 LLViewerTexture::EBoostLevel boost_priority,
 									 S8 texture_type,
 									 LLGLint internal_format,
 									 LLGLenum primary_format,
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index bde87d1dd57..141979052d7 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -107,12 +107,11 @@ class LLViewerTexture : public LLTexture
 
 	enum EBoostLevel
 	{
-		//skip 0 and 1 to avoid mistakenly mixing boost level with boolean numbers.
-		BOOST_NONE 			= 2,
-		BOOST_AVATAR_BAKED	= 3,
-		BOOST_AVATAR		= 4,
-		BOOST_CLOUDS		= 5,
-		BOOST_SCULPTED      = 6,
+		BOOST_NONE 			= 0,
+		BOOST_AVATAR_BAKED	= 1,
+		BOOST_AVATAR		= 2,
+		BOOST_CLOUDS		= 3,
+		BOOST_SCULPTED      = 4,
 		
 		BOOST_HIGH 			= 10,
 		BOOST_TERRAIN		= 11, // has to be high priority for minimap / low detail
@@ -668,7 +667,7 @@ class LLViewerTextureManager
 
 	static LLViewerFetchedTexture* getFetchedTexture(const LLUUID &image_id,									 
 									 BOOL usemipmap = TRUE,
-									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
+									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
 									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
 									 LLGLint internal_format = 0,
 									 LLGLenum primary_format = 0,
@@ -677,7 +676,7 @@ class LLViewerTextureManager
 	
 	static LLViewerFetchedTexture* getFetchedTextureFromFile(const std::string& filename,									 
 									 BOOL usemipmap = TRUE,
-									 S32 boost_priority = LLViewerTexture::BOOST_NONE,
+									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,
 									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
 									 LLGLint internal_format = 0,
 									 LLGLenum primary_format = 0,
@@ -686,7 +685,7 @@ class LLViewerTextureManager
 
 	static LLViewerFetchedTexture* getFetchedTextureFromUrl(const std::string& url,									 
 									 BOOL usemipmap = TRUE,
-									 S32 boost_priority = LLViewerTexture::BOOST_NONE,
+									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,
 									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
 									 LLGLint internal_format = 0,
 									 LLGLenum primary_format = 0,
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 081b7cc4831..703a13976cf 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -325,7 +325,7 @@ void LLViewerTextureList::restoreGL()
 
 LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string& filename,												   
 												   BOOL usemipmaps,
-												   S32 boost_priority,
+												   LLViewerTexture::EBoostLevel boost_priority,
 												   S8 texture_type,
 												   LLGLint internal_format,
 												   LLGLenum primary_format, 
@@ -345,7 +345,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string&
 
 LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string& url,
 												   BOOL usemipmaps,
-												   S32 boost_priority,
+												   LLViewerTexture::EBoostLevel boost_priority,
 												   S8 texture_type,
 												   LLGLint internal_format,
 												   LLGLenum primary_format, 
@@ -411,7 +411,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string&
 
 LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,											       
 												   BOOL usemipmaps,
-												   S32 boost_priority,
+												   LLViewerTexture::EBoostLevel boost_priority,
 												   S8 texture_type,
 												   LLGLint internal_format,
 												   LLGLenum primary_format,
@@ -441,7 +441,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,
 //when this function is called, there is no such texture in the gTextureList with image_id.
 LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id,											       
 												   BOOL usemipmaps,
-												   S32 boost_priority,
+												   LLViewerTexture::EBoostLevel boost_priority,
 												   S8 texture_type,
 												   LLGLint internal_format,
 												   LLGLenum primary_format,
@@ -1346,7 +1346,7 @@ LLUIImagePtr LLUIImageList::getUIImageByID(const LLUUID& image_id, S32 priority)
 
 	const BOOL use_mips = FALSE;
 	const LLRect scale_rect = LLRect::null;
-	return loadUIImageByID(image_id, use_mips, scale_rect, priority);
+	return loadUIImageByID(image_id, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority);
 }
 
 LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priority)
@@ -1360,21 +1360,27 @@ LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priori
 
 	const BOOL use_mips = FALSE;
 	const LLRect scale_rect = LLRect::null;
-	return loadUIImageByName(image_name, image_name, use_mips, scale_rect, priority);
+	return loadUIImageByName(image_name, image_name, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority);
 }
 
 LLUIImagePtr LLUIImageList::loadUIImageByName(const std::string& name, const std::string& filename,
-											  BOOL use_mips, const LLRect& scale_rect, S32 boost_priority )
+											  BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority )
 {
-	if (boost_priority == 0) boost_priority = LLViewerFetchedTexture::BOOST_UI;
+	if (boost_priority == LLViewerTexture::BOOST_NONE)
+	{
+		boost_priority = LLViewerTexture::BOOST_UI;
+	}
 	LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTextureFromFile(filename, MIPMAP_NO, boost_priority);
 	return loadUIImage(imagep, name, use_mips, scale_rect);
 }
 
 LLUIImagePtr LLUIImageList::loadUIImageByID(const LLUUID& id,
-											BOOL use_mips, const LLRect& scale_rect, S32 boost_priority)
+											BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority)
 {
-	if (boost_priority == 0) boost_priority = LLViewerFetchedTexture::BOOST_UI;
+	if (boost_priority == LLViewerTexture::BOOST_NONE)
+	{
+		boost_priority = LLViewerTexture::BOOST_UI;
+	}
 	LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(id, MIPMAP_NO, boost_priority);
 	return loadUIImage(imagep, id.asString(), use_mips, scale_rect);
 }
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index 3c9c81a689a..028f8441ab0 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -130,7 +130,7 @@ class LLViewerTextureList
 
 	LLViewerFetchedTexture * getImage(const LLUUID &image_id,									 
 									 BOOL usemipmap = TRUE,
-									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
+									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
 									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
 									 LLGLint internal_format = 0,
 									 LLGLenum primary_format = 0,
@@ -139,7 +139,7 @@ class LLViewerTextureList
 	
 	LLViewerFetchedTexture * getImageFromFile(const std::string& filename,									 
 									 BOOL usemipmap = TRUE,
-									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
+									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
 									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
 									 LLGLint internal_format = 0,
 									 LLGLenum primary_format = 0,
@@ -148,7 +148,7 @@ class LLViewerTextureList
 	
 	LLViewerFetchedTexture* getImageFromUrl(const std::string& url,
 									 BOOL usemipmap = TRUE,
-									 BOOL level_immediate = FALSE,		// Get the requested level immediately upon creation.
+									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
 									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
 									 LLGLint internal_format = 0,
 									 LLGLenum primary_format = 0,
@@ -157,7 +157,7 @@ class LLViewerTextureList
 
 	LLViewerFetchedTexture* createImage(const LLUUID &image_id,
 									 BOOL usemipmap = TRUE,
-									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
+									 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
 									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
 									 LLGLint internal_format = 0,
 									 LLGLenum primary_format = 0,
@@ -228,9 +228,11 @@ class LLUIImageList : public LLImageProviderInterface, public LLSingleton<LLUIIm
 	static void onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
 private:
 	LLUIImagePtr loadUIImageByName(const std::string& name, const std::string& filename,
-								   BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, S32 boost_priority = 0);
+		                           BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, 
+		                           LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);
 	LLUIImagePtr loadUIImageByID(const LLUUID& id,
-								 BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, S32 boost_priority = 0);
+								 BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, 
+								 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);
 
 	LLUIImagePtr loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null);
 
diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp
index 8d3165b98c6..9897f40c4e9 100644
--- a/indra/newview/llworldmipmap.cpp
+++ b/indra/newview/llworldmipmap.cpp
@@ -196,7 +196,7 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32
 	// END DEBUG
 	//LL_INFOS("World Map") << "LLWorldMipmap::loadObjectsTile(), URL = " << imageurl << LL_ENDL;
 
-	LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+	LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
 	img->setBoostLevel(LLViewerTexture::BOOST_MAP);
 
 	// Return the smart pointer
-- 
GitLab


From d023672e597770671720f8b68f7799b662f82175 Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Wed, 11 Nov 2009 15:08:00 -0800
Subject: [PATCH 138/557] Add ToolTip functionality to LLScrollListCell

This change enables a user to set a custom tool tip on a particular
scroll list cell by calling setToolTip().  Then, this tool tip is
used.  If this is not done, the existing tooltip functionality is left
alone.

Reviewed by Richard
---
 indra/llui/llscrolllistcell.cpp | 21 ++++++++++++++++++---
 indra/llui/llscrolllistcell.h   |  9 ++++++++-
 indra/llui/llscrolllistctrl.cpp |  2 +-
 3 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/indra/llui/llscrolllistcell.cpp b/indra/llui/llscrolllistcell.cpp
index a7c268758ad..9f169ac777f 100644
--- a/indra/llui/llscrolllistcell.cpp
+++ b/indra/llui/llscrolllistcell.cpp
@@ -71,7 +71,7 @@ LLScrollListCell* LLScrollListCell::create(const LLScrollListCell::Params& cell_
 
 
 LLScrollListCell::LLScrollListCell(const LLScrollListCell::Params& p)
-:	mWidth(p.width)
+:	mWidth(p.width), mToolTip(p.tool_tip)
 {}
 
 // virtual
@@ -204,13 +204,28 @@ BOOL LLScrollListText::isText() const
 	return TRUE;
 }
 
+// virtual
+const std::string &LLScrollListText::getToolTip() const
+{
+	// If base class has a tooltip, return that
+	if (! LLScrollListCell::getToolTip().empty())
+		return LLScrollListCell::getToolTip();
+	
+	// ...otherwise, return the value itself as the tooltip
+	return mText.getString();
+}
+
+// virtual
 BOOL LLScrollListText::needsToolTip() const
 {
-	// show tooltips for truncated text
+	// If base class has a tooltip, return that
+	if (LLScrollListCell::needsToolTip())
+		return LLScrollListCell::needsToolTip();
+	
+	// ...otherwise, show tooltips for truncated text
 	return mFont->getWidth(mText.getString()) > getWidth();
 }
 
-
 //virtual 
 BOOL LLScrollListText::getVisible() const
 {
diff --git a/indra/llui/llscrolllistcell.h b/indra/llui/llscrolllistcell.h
index 758623f1212..cff8434b32c 100644
--- a/indra/llui/llscrolllistcell.h
+++ b/indra/llui/llscrolllistcell.h
@@ -66,6 +66,7 @@ class LLScrollListCell
 
 		Optional<void*>				userdata;
 		Optional<LLSD>				value;
+		Optional<std::string>		tool_tip;
 
 		Optional<const LLFontGL*>	font;
 		Optional<LLColor4>			font_color;
@@ -80,6 +81,7 @@ class LLScrollListCell
 			enabled("enabled", true),
 			visible("visible", true),
 			value("value"),
+			tool_tip("tool_tip", ""),
 			font("font", LLFontGL::getFontSansSerifSmall()),
 			font_color("font_color", LLColor4::black),
 			color("color", LLColor4::white),
@@ -87,6 +89,7 @@ class LLScrollListCell
 		{
 			addSynonym(column, "name");
 			addSynonym(font_color, "font-color");
+			addSynonym(tool_tip, "tooltip");
 		}
 	};
 
@@ -101,11 +104,13 @@ class LLScrollListCell
 	virtual S32				getHeight() const { return 0; }
 	virtual const LLSD		getValue() const;
 	virtual void			setValue(const LLSD& value) { }
+	virtual const std::string &getToolTip() const { return mToolTip; }
+	virtual void			setToolTip(const std::string &str) { mToolTip = str; }
 	virtual BOOL			getVisible() const { return TRUE; }
 	virtual void			setWidth(S32 width) { mWidth = width; }
 	virtual void			highlightText(S32 offset, S32 num_chars) {}
 	virtual BOOL			isText() const { return FALSE; }
-	virtual BOOL			needsToolTip() const { return FALSE; }
+	virtual BOOL			needsToolTip() const { return ! mToolTip.empty(); }
 	virtual void			setColor(const LLColor4&) {}
 	virtual void			onCommit() {};
 
@@ -114,6 +119,7 @@ class LLScrollListCell
 
 private:
 	S32 mWidth;
+	std::string mToolTip;
 };
 
 class LLScrollListSpacer : public LLScrollListCell
@@ -143,6 +149,7 @@ class LLScrollListText : public LLScrollListCell
 
 	/*virtual*/ void	setColor(const LLColor4&);
 	/*virtual*/ BOOL	isText() const;
+	/*virtual*/ const std::string &	getToolTip() const;
 	/*virtual*/ BOOL	needsToolTip() const;
 
 	void			setText(const LLStringExplicit& text);
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index 1c2c02e1cc1..a53a30b5012 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -1565,7 +1565,7 @@ BOOL LLScrollListCtrl::handleToolTip(S32 x, S32 y, MASK mask)
 
 			// display tooltip exactly over original cell, in same font
 			LLToolTipMgr::instance().show(LLToolTip::Params()
-										.message(hit_cell->getValue().asString())
+										.message(hit_cell->getToolTip())
 										.font(LLFontGL::getFontSansSerifSmall())
 										.pos(LLCoordGL(sticky_rect.mLeft - 5, sticky_rect.mTop + 6))
 										.delay_time(0.2f)
-- 
GitLab


From afb49ed36ece451b93f25e25bcbe8e3b9ee7db65 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Wed, 11 Nov 2009 15:09:28 -0800
Subject: [PATCH 139/557] Fix bad XML causing UI images not to load.

---
 indra/newview/skins/default/textures/textures.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 57239f9e7f0..4c4b6a3899a 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -532,7 +532,7 @@
   <texture name="Toolbar_Right_Press" file_name="containers/Toolbar_Right_Press.png" preload="false" />
   <texture name="Toolbar_Right_Selected" file_name="containers/Toolbar_Right_Selected.png" preload="false" />
   
-  <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="1" scale.right="99" scale.bottom="14"
+  <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="1" scale.right="99" scale.bottom="14" />
 
   <texture name="TrashItem_Disabled" file_name="icons/TrashItem_Disabled.png" preload="false" />
   <texture name="TrashItem_Off" file_name="icons/TrashItem_Off.png" preload="false" />
-- 
GitLab


From 816133718eb4e274bfa20ac86dba34faf59155b1 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Wed, 11 Nov 2009 15:09:28 -0800
Subject: [PATCH 140/557] Fix bad XML causing UI images not to load.

---
 indra/newview/skins/default/textures/textures.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 57239f9e7f0..4c4b6a3899a 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -532,7 +532,7 @@
   <texture name="Toolbar_Right_Press" file_name="containers/Toolbar_Right_Press.png" preload="false" />
   <texture name="Toolbar_Right_Selected" file_name="containers/Toolbar_Right_Selected.png" preload="false" />
   
-  <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="1" scale.right="99" scale.bottom="14"
+  <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="1" scale.right="99" scale.bottom="14" />
 
   <texture name="TrashItem_Disabled" file_name="icons/TrashItem_Disabled.png" preload="false" />
   <texture name="TrashItem_Off" file_name="icons/TrashItem_Off.png" preload="false" />
-- 
GitLab


From 2117b096d7733d3d6a41923e227e3bf3c3ec0d28 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 11 Nov 2009 18:13:43 -0500
Subject: [PATCH 141/557] EXT-2377 : Add XML switch to showing either menubar
 or gear menu

Reverting previous checkin for enabling this.  This is more complicated than worth spending time on, at the moment.
---
 indra/newview/llpanelmaininventory.cpp        | 29 ++-----------------
 indra/newview/llpanelmaininventory.h          | 14 +--------
 .../default/xui/en/panel_main_inventory.xml   | 12 --------
 .../default/xui/en/sidepanel_inventory.xml    |  1 -
 4 files changed, 4 insertions(+), 52 deletions(-)

diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 9b33fc18396..e3b2ab77aaa 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -49,7 +49,7 @@
 #include "llviewermenu.h"
 #include "llviewertexturelist.h"
 
-static LLDefaultChildRegistry::Register<LLPanelMainInventory> r("panel_main_inventory");
+static LLRegisterPanelClassWrapper<LLPanelMainInventory> t_inventory("panel_main_inventory"); // Seraph is this redundant with constructor?
 
 void on_file_loaded_for_save(BOOL success, 
 							 LLViewerFetchedTexture *src_vi,
@@ -90,8 +90,8 @@ class LLFloaterInventoryFinder : public LLFloater
 /// LLPanelMainInventory
 ///----------------------------------------------------------------------------
 
-LLPanelMainInventory::LLPanelMainInventory(const LLPanelMainInventory::Params& p)
-	: LLPanel(p),
+LLPanelMainInventory::LLPanelMainInventory()
+	: LLPanel(),
 	  mActivePanel(NULL),
 	  mSavedFolderState(NULL),
 	  mFilterText(""),
@@ -124,24 +124,6 @@ LLPanelMainInventory::LLPanelMainInventory(const LLPanelMainInventory::Params& p
 	
 	mSavedFolderState = new LLSaveFolderState();
 	mSavedFolderState->setApply(FALSE);
-
-	if (p.hide_top_menu)
-	{
-		LLInventoryPanel *top_panel = getChild<LLInventoryPanel>("top_panel");
-		if (top_panel)
-		{
-			top_panel->setVisible(FALSE);
-		}
-	}
-
-	if (p.hide_bottom_menu)
-	{
-		LLInventoryPanel *bottom_panel = getChild<LLInventoryPanel>("bottom_panel");
-		if (bottom_panel)
-		{
-			bottom_panel->setVisible(FALSE);
-		}
-	}
 }
 
 BOOL LLPanelMainInventory::postBuild()
@@ -222,11 +204,6 @@ void LLPanelMainInventory::initListCommandsHandlers()
 	mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this));
 	mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this));
 	mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
-	/*
-	mListCommands->getChild<LLButton>("add_btn")->setHeldDownCallback(boost::bind(&LLPanelMainInventory::onAddButtonHeldDown, this));
-	static const LLSD add_landmark_command("add_landmark");
-	mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddAction, this, add_landmark_command));
-	*/
 
 	LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");
 	trash_btn->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index e447d8ce068..29e9baa6cf2 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -58,19 +58,7 @@ class LLPanelMainInventory : public LLPanel, LLInventoryObserver
 public:
 	friend class LLFloaterInventoryFinder;
 
-	struct Params 
-	:	public LLInitParam::Block<Params, LLPanel::Params>
-	{
-		Optional<bool>						hide_top_menu;
-		Optional<bool>						hide_bottom_menu;
-
-		Params() :
-			hide_top_menu("hide_top_menu", false),
-			hide_bottom_menu("hide_bottom_menu", false)
-		{}
-	};
-
-	LLPanelMainInventory(const Params&);
+	LLPanelMainInventory();
 	~LLPanelMainInventory();
 
 	BOOL postBuild();
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index 6f57d1ca802..fcee0ef9538 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -103,17 +103,6 @@
          width="18" />
     </panel>
 
-    <panel
-     background_visible="true"
-     bevel_style="none"
-     bottom="0"
-     follows="left|right|bottom"
-     height="30"
-     layout="bottomleft"
-     left="0"
-	 visible="true"
-     name="top_panel"
-     width="330">
     <menu_bar
      bg_visible="false"
      follows="left|top|right"
@@ -475,5 +464,4 @@
             </menu_item_check>
         </menu>
     </menu_bar>
-	</panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
index 5975bb41fd5..cbcc3f10ad2 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -24,7 +24,6 @@
 			 filename="panel_main_inventory.xml"
 			 follows="all"
 			 layout="topleft"
-			 hide_top_panel="true"
 			 left="0"
 			 name="panel_main_inventory"
 			 top="0"
-- 
GitLab


From 3732d41a108b21de537c8179d06e6e2d7ebda995 Mon Sep 17 00:00:00 2001
From: Leyla Farazha <leyla@lindenlab.com>
Date: Wed, 11 Nov 2009 15:23:08 -0800
Subject: [PATCH 142/557] EXT-950   	 Minimized floaters default to a bad
 location onscreen EXT-2298   	 [BSI] Busy mode response shows as "|TOKEN
 COPY BusyModeResponse|" in General prefs while offline

---
 indra/llui/llfloater.cpp    | 16 ++++++++--------
 indra/newview/llstartup.cpp |  6 +++---
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index f2cdad8854a..470ae45414b 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -2172,16 +2172,16 @@ void LLFloaterView::getMinimizePosition(S32 *left, S32 *bottom)
 	const LLFloater::Params& default_params = LLFloater::getDefaultParams();
 	S32 floater_header_size = default_params.header_height;
 	static LLUICachedControl<S32> minimized_width ("UIMinimizedWidth", 0);
-	S32 col = 0;
 	LLRect snap_rect_local = getLocalSnapRect();
-	for(S32 row = snap_rect_local.mBottom;
-		row < snap_rect_local.getHeight() - floater_header_size;
-		row += floater_header_size ) //loop rows
-	{
-		for(col = snap_rect_local.mLeft;
-			col < snap_rect_local.getWidth() - minimized_width;
-			col += minimized_width)
+	for(S32 col = snap_rect_local.mLeft;
+		col < snap_rect_local.getWidth() - minimized_width;
+		col += minimized_width)
+	{	
+		for(S32 row = snap_rect_local.mTop - floater_header_size;
+		row > floater_header_size;
+		row -= floater_header_size ) //loop rows
 		{
+
 			bool foundGap = TRUE;
 			for(child_list_const_iter_t child_it = getChildList()->begin();
 				child_it != getChildList()->end();
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 64dcd7b97fb..2c59d62b4b4 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -873,6 +873,9 @@ bool idle_startup()
 		gViewerWindow->getWindow()->show();
 		display_startup();
 
+		//DEV-10530.  do cleanup.  remove at some later date.  jan-2009
+		LLFloaterPreference::cleanupBadSetting();
+
 		// DEV-16927.  The following code removes errant keystrokes that happen while the window is being 
 		// first made visible.
 #ifdef _WIN32
@@ -1900,9 +1903,6 @@ bool idle_startup()
         //DEV-17797.  get null folder.  Any items found here moved to Lost and Found
         LLInventoryModel::findLostItems();
 
-		//DEV-10530.  do cleanup.  remove at some later date.  jan-2009
-		LLFloaterPreference::cleanupBadSetting();
-
 		LLStartUp::setStartupState( STATE_PRECACHE );
 		timeout.reset();
 		return FALSE;
-- 
GitLab


From 4f3d32f5c726f0ec301e1efefa32ef948faea03e Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Wed, 11 Nov 2009 18:23:54 -0500
Subject: [PATCH 143/557] Believe this fixes the remaining issues with missing
 attachment links on first use of 2.0 - EXT-1593 and EXT-1591.

---
 indra/newview/llagentwearables.cpp |  2 ++
 indra/newview/llappearancemgr.cpp  | 21 +++++++++++++++++++++
 indra/newview/llappearancemgr.h    |  1 +
 3 files changed, 24 insertions(+)

diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 3fc1055acdf..7129c0cfcf6 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -2023,6 +2023,8 @@ void LLInitialWearablesFetch::done()
 	else
 	{
 		processWearablesMessage();
+		// Create links for attachments that may have arrived before the COF existed.
+		LLAppearanceManager::linkRegisteredAttachments();
 	}
 	delete this;
 }
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index d14de1c3012..0901289dace 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -1123,6 +1123,7 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update )
 	{
 		if (do_update)
 			LLAppearanceManager::updateAppearanceFromCOF();
+		return;
 	}
 	else
 	{
@@ -1134,6 +1135,7 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update )
 							 LLAssetType::AT_LINK,
 							 cb);
 	}
+	return;
 }
 
 /* static */
@@ -1281,3 +1283,22 @@ void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id)
 		   //llinfos << "no link changes, inv link not enabled" << llendl;
 	   }
 }
+
+/* static */
+void LLAppearanceManager::linkRegisteredAttachments()
+{
+	for (std::set<LLUUID>::iterator it = sRegisteredAttachments.begin();
+		 it != sRegisteredAttachments.end();
+		 ++it)
+	{
+		LLUUID item_id = *it;
+		LLViewerInventoryItem *item = gInventory.getItem(item_id);
+		if (item)
+		{
+			wearItem(item, false);
+			gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
+			gInventory.notifyObservers();
+		}
+	}
+	sRegisteredAttachments.clear();
+}
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 56f54dfc23d..7dea16b6cf0 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -71,6 +71,7 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 	static void unregisterAttachment(const LLUUID& item_id);
 	static void registerAttachment(const LLUUID& item_id);
 	static void setAttachmentInvLinkEnable(bool val);
+	static void linkRegisteredAttachments();
 
 private:
 	static void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type);
-- 
GitLab


From 8519205533a45603e7ac7ecf397d23d041addf9a Mon Sep 17 00:00:00 2001
From: brad kittenbrink <brad@lindenlab.com>
Date: Wed, 11 Nov 2009 18:49:32 -0500
Subject: [PATCH 144/557] Changing VC Debugger working directory to be
 ${CMAKE_CURRENT_SOURCE_DIR} to restore ability to edit in place xui files,
 shaders, etc.

---
 indra/newview/CMakeLists.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 13c381edaec..e69d3f417ff 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1379,7 +1379,7 @@ if (WINDOWS)
               ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln
               --workingdir
               ${VIEWER_BINARY_NAME}
-              "./${CMAKE_CFG_INTDIR}"
+              "${CMAKE_CURRENT_SOURCE_DIR}"
             COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging."
             )
     endif (NOT UNATTENDED)
-- 
GitLab


From eda34b82ee20ce43362b3fb20e809f97cc8c0081 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Wed, 11 Nov 2009 15:50:43 -0800
Subject: [PATCH 145/557] Remove references to media_panel_scroll in
 LLPanelPrimMediaControls::updateShape(), as it was removed from the XUI file.

---
 indra/newview/llpanelprimmediacontrols.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 5c3c2605491..bb2ded7ca51 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -271,7 +271,7 @@ void LLPanelPrimMediaControls::updateShape()
 		LLIconCtrl* whitelist_icon			= getChild<LLIconCtrl>("media_whitelist_flag");
 		LLIconCtrl* secure_lock_icon		= getChild<LLIconCtrl>("media_secure_lock_flag");
 		
-		LLUICtrl* media_panel_scroll		= getChild<LLUICtrl>("media_panel_scroll");
+//		LLUICtrl* media_panel_scroll		= getChild<LLUICtrl>("media_panel_scroll");
 		LLUICtrl* scroll_up_ctrl			= getChild<LLUICtrl>("scrollup");
 		LLUICtrl* scroll_left_ctrl			= getChild<LLUICtrl>("scrollleft");
 		LLUICtrl* scroll_right_ctrl			= getChild<LLUICtrl>("scrollright");
@@ -330,7 +330,7 @@ void LLPanelPrimMediaControls::updateShape()
 			scroll_left_ctrl->setVisible(false);
 			scroll_right_ctrl->setVisible(false);
 			scroll_down_ctrl->setVisible(false);
-			media_panel_scroll->setVisible(false);
+//			media_panel_scroll->setVisible(false);
 				
 			F32 volume = media_impl->getVolume();
 			// movie's url changed
@@ -427,7 +427,7 @@ void LLPanelPrimMediaControls::updateShape()
 			scroll_left_ctrl->setVisible(has_focus);
 			scroll_right_ctrl->setVisible(has_focus);
 			scroll_down_ctrl->setVisible(has_focus);
-			media_panel_scroll->setVisible(has_focus);
+//			media_panel_scroll->setVisible(has_focus);
 			// TODO: get the secure lock bool from media plug in
 			std::string prefix =  std::string("https://");
 			std::string test_prefix = mCurrentURL.substr(0, prefix.length());
-- 
GitLab


From e3356c069557a91fc0a2c24875db23eaf64358da Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Wed, 11 Nov 2009 16:07:02 -0800
Subject: [PATCH 146/557] some minor changes based on Richard's code review
 Code Collab #34

---
 indra/llui/llscrolllistcell.cpp | 3 ++-
 indra/llui/llscrolllistcell.h   | 1 -
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/llui/llscrolllistcell.cpp b/indra/llui/llscrolllistcell.cpp
index 9f169ac777f..544352176ab 100644
--- a/indra/llui/llscrolllistcell.cpp
+++ b/indra/llui/llscrolllistcell.cpp
@@ -71,7 +71,8 @@ LLScrollListCell* LLScrollListCell::create(const LLScrollListCell::Params& cell_
 
 
 LLScrollListCell::LLScrollListCell(const LLScrollListCell::Params& p)
-:	mWidth(p.width), mToolTip(p.tool_tip)
+:	mWidth(p.width), 
+	mToolTip(p.tool_tip)
 {}
 
 // virtual
diff --git a/indra/llui/llscrolllistcell.h b/indra/llui/llscrolllistcell.h
index cff8434b32c..5fecf5aade9 100644
--- a/indra/llui/llscrolllistcell.h
+++ b/indra/llui/llscrolllistcell.h
@@ -89,7 +89,6 @@ class LLScrollListCell
 		{
 			addSynonym(column, "name");
 			addSynonym(font_color, "font-color");
-			addSynonym(tool_tip, "tooltip");
 		}
 	};
 
-- 
GitLab


From bea3b937d9907e4491caaec909cd404d401694ac Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Wed, 11 Nov 2009 16:12:25 -0800
Subject: [PATCH 147/557] Fix a potential crash if scroll button is not there

---
 indra/newview/llpanelprimmediacontrols.cpp | 64 ++++++++++++++--------
 1 file changed, 41 insertions(+), 23 deletions(-)

diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 5c3c2605491..24de2dcdfc5 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -118,21 +118,33 @@ LLPanelPrimMediaControls::~LLPanelPrimMediaControls()
 BOOL LLPanelPrimMediaControls::postBuild()
 {
 	LLButton* scroll_up_ctrl = getChild<LLButton>("scrollup");
-	scroll_up_ctrl->setClickedCallback(onScrollUp, this);
-	scroll_up_ctrl->setHeldDownCallback(onScrollUpHeld, this);
-	scroll_up_ctrl->setMouseUpCallback(onScrollStop, this);
+	if (scroll_up_ctrl)
+	{
+		scroll_up_ctrl->setClickedCallback(onScrollUp, this);
+		scroll_up_ctrl->setHeldDownCallback(onScrollUpHeld, this);
+		scroll_up_ctrl->setMouseUpCallback(onScrollStop, this);
+	}
 	LLButton* scroll_left_ctrl = getChild<LLButton>("scrollleft");
-	scroll_left_ctrl->setClickedCallback(onScrollLeft, this);
-	scroll_left_ctrl->setHeldDownCallback(onScrollLeftHeld, this);
-	scroll_left_ctrl->setMouseUpCallback(onScrollStop, this);
+	if (scroll_left_ctrl)
+	{
+		scroll_left_ctrl->setClickedCallback(onScrollLeft, this);
+		scroll_left_ctrl->setHeldDownCallback(onScrollLeftHeld, this);
+		scroll_left_ctrl->setMouseUpCallback(onScrollStop, this);
+	}
 	LLButton* scroll_right_ctrl = getChild<LLButton>("scrollright");
-	scroll_right_ctrl->setClickedCallback(onScrollRight, this);
-	scroll_right_ctrl->setHeldDownCallback(onScrollRightHeld, this);
-	scroll_right_ctrl->setMouseUpCallback(onScrollStop, this);
+	if (scroll_right_ctrl)
+	{
+		scroll_right_ctrl->setClickedCallback(onScrollRight, this);
+		scroll_right_ctrl->setHeldDownCallback(onScrollRightHeld, this);
+		scroll_right_ctrl->setMouseUpCallback(onScrollStop, this);
+	}
 	LLButton* scroll_down_ctrl = getChild<LLButton>("scrolldown");
-	scroll_down_ctrl->setClickedCallback(onScrollDown, this);
-	scroll_down_ctrl->setHeldDownCallback(onScrollDownHeld, this);
-	scroll_down_ctrl->setMouseUpCallback(onScrollStop, this);
+	if (scroll_down_ctrl)
+	{
+		scroll_down_ctrl->setClickedCallback(onScrollDown, this);
+		scroll_down_ctrl->setHeldDownCallback(onScrollDownHeld, this);
+		scroll_down_ctrl->setMouseUpCallback(onScrollStop, this);
+	}
 	
 	LLUICtrl* media_address	= getChild<LLUICtrl>("media_address");
 	media_address->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this ));
@@ -326,11 +338,14 @@ void LLPanelPrimMediaControls::updateShape()
 
 			whitelist_icon->setVisible(false);
 			secure_lock_icon->setVisible(false);
-			scroll_up_ctrl->setVisible(false);
-			scroll_left_ctrl->setVisible(false);
-			scroll_right_ctrl->setVisible(false);
-			scroll_down_ctrl->setVisible(false);
-			media_panel_scroll->setVisible(false);
+			if (media_panel_scroll)
+			{
+				media_panel_scroll->setVisible(false);
+				scroll_up_ctrl->setVisible(false);
+				scroll_left_ctrl->setVisible(false);
+				scroll_right_ctrl->setVisible(false);
+				scroll_down_ctrl->setVisible(false);
+			}
 				
 			F32 volume = media_impl->getVolume();
 			// movie's url changed
@@ -422,12 +437,15 @@ void LLPanelPrimMediaControls::updateShape()
 			volume_ctrl->setEnabled(FALSE);
 			volume_up_ctrl->setEnabled(FALSE);
 			volume_down_ctrl->setEnabled(FALSE);
-				
-			scroll_up_ctrl->setVisible(has_focus);
-			scroll_left_ctrl->setVisible(has_focus);
-			scroll_right_ctrl->setVisible(has_focus);
-			scroll_down_ctrl->setVisible(has_focus);
-			media_panel_scroll->setVisible(has_focus);
+			
+			if (media_panel_scroll)
+			{
+				media_panel_scroll->setVisible(has_focus);
+				scroll_up_ctrl->setVisible(has_focus);
+				scroll_left_ctrl->setVisible(has_focus);
+				scroll_right_ctrl->setVisible(has_focus);
+				scroll_down_ctrl->setVisible(has_focus);
+			}
 			// TODO: get the secure lock bool from media plug in
 			std::string prefix =  std::string("https://");
 			std::string test_prefix = mCurrentURL.substr(0, prefix.length());
-- 
GitLab


From 6bdd6eeb98bf44e8b16f7e63f378813f92652444 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 11 Nov 2009 19:13:33 -0500
Subject: [PATCH 148/557] EXT-2261 : Inventory view should show default foldres
 (i.e. expand My Inventory)

---
 indra/newview/llinventorypanel.cpp | 24 +++++++++++++++++++++---
 indra/newview/llinventorypanel.h   |  2 +-
 2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 9a71e53441e..dfd4af5c287 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -191,11 +191,9 @@ BOOL LLInventoryPanel::postBuild()
 	{
 		rebuildViewsFor(mStartFolderID);
 		mHasInventoryConnection = true;
+		defaultOpenInventory();
 	}
 
-	// bit of a hack to make sure the inventory is open.
-	mFolders->openFolder(preferred_type != LLFolderType::FT_NONE ? LLViewerFolderType::lookupNewCategoryName(preferred_type) : "My Inventory");
-
 	if (mSortOrderSetting != INHERIT_SORT_ORDER)
 	{
 		setSortOrder(gSavedSettings.getU32(mSortOrderSetting));
@@ -300,6 +298,7 @@ void LLInventoryPanel::modelChanged(U32 mask)
 	{
 		rebuildViewsFor(mStartFolderID);
 		mHasInventoryConnection = true;
+		defaultOpenInventory();
 		return;
 	}
 
@@ -561,6 +560,25 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
 	}
 }
 
+// bit of a hack to make sure the inventory is open.
+void LLInventoryPanel::defaultOpenInventory()
+{
+	const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString);
+	if (preferred_type != LLFolderType::FT_NONE)
+	{
+		const std::string& top_level_folder_name = LLViewerFolderType::lookupNewCategoryName(preferred_type);
+		mFolders->openFolder(top_level_folder_name);
+	}
+	else
+	{
+		// Get the first child (it should be "My Inventory") and
+		// open it up by name (just to make sure the first child is actually a folder).
+		LLView* first_child = mFolders->getFirstChild();
+		const std::string& first_child_name = first_child->getName();
+		mFolders->openFolder(first_child_name);
+	}
+}
+
 struct LLConfirmPurgeData
 {
 	LLUUID mID;
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 9f74fad5c1c..e398c441059 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -165,7 +165,7 @@ class LLInventoryPanel : public LLPanel
 	// Given the id and the parent, build all of the folder views.
 	void rebuildViewsFor(const LLUUID& id);
 	virtual void buildNewViews(const LLUUID& id); // made virtual to support derived classes. EXT-719
-
+	void defaultOpenInventory(); // open the first level of inventory
 protected:
 	LLInventoryModel*			mInventory;
 	LLInventoryObserver*		mInventoryObserver;
-- 
GitLab


From 6a3e8353a7c0e80e2a4558e3a3a345646788981e Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Wed, 11 Nov 2009 16:32:54 -0800
Subject: [PATCH 149/557] Fix merge error (and hence build breakage :( )

---
 indra/newview/llpanelprimmediacontrols.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index c2c8c6c48e9..24de2dcdfc5 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -283,7 +283,7 @@ void LLPanelPrimMediaControls::updateShape()
 		LLIconCtrl* whitelist_icon			= getChild<LLIconCtrl>("media_whitelist_flag");
 		LLIconCtrl* secure_lock_icon		= getChild<LLIconCtrl>("media_secure_lock_flag");
 		
-//		LLUICtrl* media_panel_scroll		= getChild<LLUICtrl>("media_panel_scroll");
+		LLUICtrl* media_panel_scroll		= getChild<LLUICtrl>("media_panel_scroll");
 		LLUICtrl* scroll_up_ctrl			= getChild<LLUICtrl>("scrollup");
 		LLUICtrl* scroll_left_ctrl			= getChild<LLUICtrl>("scrollleft");
 		LLUICtrl* scroll_right_ctrl			= getChild<LLUICtrl>("scrollright");
-- 
GitLab


From 391f423cd0633262233d474622b56dd3b151ab32 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Wed, 11 Nov 2009 16:34:23 -0800
Subject: [PATCH 150/557] Revert global font setting for UI controls because it
 makes About Land crash Apparently moving ui_ctrl to a different registry
 breaks our ability to create dummy ones in code.  Reverting until I have time
 to investigate. Discussed with Richard

---
 indra/llui/lluictrl.cpp | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index dd807a3f7e3..aaadc1b58da 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -38,7 +38,11 @@
 #include "llpanel.h"
 #include "lluictrlfactory.h"
 
-static LLWidgetNameRegistry::StaticRegistrar r(&typeid(LLUICtrl::Params), "ui_ctrl");
+// This breaks the ability to construct dummy LLUICtrls for calls like
+// getChild<LLUICtrl>("not-there")
+//static LLWidgetNameRegistry::StaticRegistrar r(&typeid(LLUICtrl::Params), "ui_ctrl");
+// This doesn't appear to read/apply ui_ctrl.xml
+static LLDefaultChildRegistry::Register<LLUICtrl> r("ui_ctrl");
 
 LLUICtrl::Params::Params()
 :	tab_stop("tab_stop", true),
-- 
GitLab


From e3690313a2868d5e7164226e867a4e2ee7a8677e Mon Sep 17 00:00:00 2001
From: richard <none@none>
Date: Wed, 11 Nov 2009 16:47:23 -0800
Subject: [PATCH 151/557] EXT-2049 - tighten up indentations on inventory

---
 indra/newview/llfolderviewitem.cpp | 4 +++-
 indra/newview/llfolderviewitem.h   | 2 +-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 6fdaefd21ab..5db35d5f70d 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -388,7 +388,9 @@ BOOL LLFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* roo
 // makes sure that this view and it's children are the right size.
 S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)
 {
-	mIndentation = mParentFolder ? mParentFolder->getIndentation() + LEFT_INDENTATION : 0;
+	mIndentation = getParentFolder() && getParentFolder()->getParentFolder() 
+		? mParentFolder->getIndentation() + LEFT_INDENTATION 
+		: 0;
 	if (mLabelWidthDirty)
 	{
 		mLabelWidth = ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + getLabelFontForStyle(mLabelStyle)->getWidth(mSearchableLabel); 
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index 62a4b9a1875..7c429fc76ef 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -110,7 +110,7 @@ class LLFolderViewItem : public LLView
 
 	// layout constants
 	static const S32 LEFT_PAD = 5;
-	static const S32 LEFT_INDENTATION = 13;
+	static const S32 LEFT_INDENTATION = 8;
 	static const S32 ICON_PAD = 2;
 	static const S32 ICON_WIDTH = 16;
 	static const S32 TEXT_PAD = 1;
-- 
GitLab


From 067f91f8ad57fc1eed10e1811b2c7f588d84052a Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 11 Nov 2009 19:55:37 -0500
Subject: [PATCH 152/557] EXT-387 : Clean up WARNINGS -
 Advanced.DumpAvatarLocalTextures

Added menu callbacks in for avatar texture debug, but disabled functionality for release version.
---
 indra/newview/llviewermenu.cpp | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 976d89a5b7f..728fb7c6164 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -1879,7 +1879,9 @@ class LLAdvancedDebugAvatarTextures : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
 	{
+#ifndef LL_RELEASE_FOR_DOWNLOAD
 		handle_debug_avatar_textures(NULL);
+#endif
 		return true;
 	}
 };
@@ -1893,7 +1895,9 @@ class LLAdvancedDumpAvatarLocalTextures : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
 	{
+#ifndef LL_RELEASE_FOR_DOWNLOAD
 		handle_dump_avatar_local_textures(NULL);
+#endif
 		return true;
 	}
 };
@@ -7860,10 +7864,8 @@ void initialize_menus()
 	view_listener_t::addMenu(new LLAdvancedCheckDebugCharacterVis(), "Advanced.CheckDebugCharacterVis");
 	view_listener_t::addMenu(new LLAdvancedDumpAttachments(), "Advanced.DumpAttachments");
 	view_listener_t::addMenu(new LLAdvancedRebakeTextures(), "Advanced.RebakeTextures");
-	#ifndef LL_RELEASE_FOR_DOWNLOAD
 	view_listener_t::addMenu(new LLAdvancedDebugAvatarTextures(), "Advanced.DebugAvatarTextures");
 	view_listener_t::addMenu(new LLAdvancedDumpAvatarLocalTextures(), "Advanced.DumpAvatarLocalTextures");
-	#endif
 	// Advanced > Network
 	view_listener_t::addMenu(new LLAdvancedEnableMessageLog(), "Advanced.EnableMessageLog");
 	view_listener_t::addMenu(new LLAdvancedDisableMessageLog(), "Advanced.DisableMessageLog");
-- 
GitLab


From bcdd3c25b6bcfaac7849e9aad6fd6c9bb2da1e82 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 11 Nov 2009 20:21:45 -0500
Subject: [PATCH 153/557] Took out unnecessary llinfos msg from
 LLInventoryModel.

---
 indra/newview/llinventorymodel.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index c56feab5884..d455c7bdbfd 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -1147,7 +1147,6 @@ void LLInventoryModel::notifyObservers(const std::string service_name)
 		return;
 	}
 	mIsNotifyObservers = TRUE;
-	llinfos << "Start process notifyObservers for " << this << llendl;
 	for (observer_list_t::iterator iter = mObservers.begin();
 		 iter != mObservers.end(); )
 	{
-- 
GitLab


From 7e74e18548d9b508e3d4c3233044302742942eba Mon Sep 17 00:00:00 2001
From: "Eric M. Tulla (BigPapi)" <tulla@lindenlab.com>
Date: Wed, 11 Nov 2009 20:27:29 -0500
Subject: [PATCH 154/557] Fix for EXT-2244 - Auto fill the My Outfits folder
 from library/clothing if empty -Reviewed by Seraph

---
 indra/newview/llagentwearables.cpp | 150 ++++++++++++++++++++++++++++-
 indra/newview/llagentwearables.h   |   6 +-
 indra/newview/llinventorymodel.cpp |  10 +-
 indra/newview/llinventorymodel.h   |  11 +--
 4 files changed, 162 insertions(+), 15 deletions(-)

diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 3fc1055acdf..1b1c65640f3 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -84,6 +84,26 @@ class LLInitialWearablesFetch : public LLInventoryFetchDescendentsObserver
 	void processWearablesMessage();
 };
 
+class LLLibraryOutfitsFetch : public LLInventoryFetchDescendentsObserver
+{
+public:
+	enum ELibraryOutfitFetchStep {
+		LOFS_FOLDER = 0,
+		LOFS_OUTFITS,
+		LOFS_CONTENTS
+	};
+	LLLibraryOutfitsFetch() : mCurrFetchStep(LOFS_FOLDER), mOutfitsPopulated(false) {}
+	~LLLibraryOutfitsFetch() {}
+	virtual void done();	
+protected:
+	void folderDone(void);
+	void outfitsDone(void);
+	void contentsDone(void);
+	enum ELibraryOutfitFetchStep mCurrFetchStep;
+	std::vector< std::pair< LLUUID, std::string > > mOutfits;
+	bool mOutfitsPopulated;
+};
+
 LLAgentWearables gAgentWearables;
 
 BOOL LLAgentWearables::mInitialWearablesUpdateReceived = FALSE;
@@ -904,6 +924,8 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
 			// will call done for us when everything is here.
 			gInventory.addObserver(outfit);
 		}
+		
+		gAgentWearables.populateMyOutfitsFolder();
 	}
 }
 
@@ -2003,18 +2025,142 @@ void LLAgentWearables::updateServer()
 	gAgent.sendAgentSetAppearance();
 }
 
+void LLAgentWearables::populateMyOutfitsFolder(void)
+{	
+	LLLibraryOutfitsFetch* outfits = new LLLibraryOutfitsFetch();
+	
+	// What we do here is get the complete information on the items in
+	// the inventory, and set up an observer that will wait for that to
+	// happen.
+	LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+	const LLUUID my_outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+
+	folders.push_back(my_outfits_id);
+	outfits->fetchDescendents(folders);
+	if(outfits->isEverythingComplete())
+	{
+		// everything is already here - call done.
+		outfits->done();
+	}
+	else
+	{
+		// it's all on it's way - add an observer, and the inventory
+		// will call done for us when everything is here.
+		gInventory.addObserver(outfits);
+	}
+}
+
+void LLLibraryOutfitsFetch::done()
+{
+	switch (mCurrFetchStep){
+		case LOFS_FOLDER:
+			mCurrFetchStep = LOFS_OUTFITS;
+			folderDone();
+			break;
+		case LOFS_OUTFITS:
+			mCurrFetchStep = LOFS_CONTENTS;
+			outfitsDone();
+			break;
+		case LOFS_CONTENTS:
+			// No longer need this observer hanging around.
+			gInventory.removeObserver(this);
+			contentsDone();
+			break;
+		default:
+			gInventory.removeObserver(this);
+			delete this;
+			return;
+	}
+	if (mOutfitsPopulated)
+	{
+		delete this;
+	}
+}
+
+void LLLibraryOutfitsFetch::folderDone(void)
+{
+	// Early out if we already have items in My Outfits.
+	LLInventoryModel::cat_array_t cat_array;
+	LLInventoryModel::item_array_t wearable_array;
+	gInventory.collectDescendents(mCompleteFolders.front(), cat_array, wearable_array, 
+								  LLInventoryModel::EXCLUDE_TRASH);
+	if (cat_array.count() > 0 || wearable_array.count() > 0)
+	{
+		mOutfitsPopulated = true;
+		gInventory.removeObserver(this);
+		return;
+	}
+	
+	// Get the UUID of the library's clothing folder
+	const LLUUID library_clothing_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING, false, true);
+	
+	mCompleteFolders.clear();
+	
+	// What we do here is get the complete information on the items in
+	// the inventory, and set up an observer that will wait for that to
+	// happen.
+	LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+	folders.push_back(library_clothing_id);
+	fetchDescendents(folders);
+	if(isEverythingComplete())
+	{
+		// everything is already here - call done.
+		outfitsDone();
+	}
+}
+
+void LLLibraryOutfitsFetch::outfitsDone(void)
+{
+	LLInventoryModel::cat_array_t cat_array;
+	LLInventoryModel::item_array_t wearable_array;
+	gInventory.collectDescendents(mCompleteFolders.front(), cat_array, wearable_array, 
+								  LLInventoryModel::EXCLUDE_TRASH);
+	
+	LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+	for(S32 i = 0; i < cat_array.count(); ++i)
+	{
+		if (cat_array.get(i)->getName() != "More Outfits" && cat_array.get(i)->getName() != "Ruth"){
+			folders.push_back(cat_array.get(i)->getUUID());
+			mOutfits.push_back( std::make_pair(cat_array.get(i)->getUUID(), cat_array.get(i)->getName() ));
+		}
+	}
+	mCompleteFolders.clear();
+	fetchDescendents(folders);
+	if(isEverythingComplete())
+	{
+		// everything is already here - call done.
+		contentsDone();
+	}
+}
+
+void LLLibraryOutfitsFetch::contentsDone(void)
+{
+	for(S32 i = 0; i < mOutfits.size(); ++i)
+	{
+		// First, make a folder in the My Outfits directory.
+		const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+		LLUUID folder_id = gInventory.createNewCategory(parent_id,
+														LLFolderType::FT_OUTFIT,
+														mOutfits[i].second);
+		
+		LLAppearanceManager::shallowCopyCategory(mOutfits[i].first, folder_id, NULL);
+		gInventory.notifyObservers();
+	}
+	mOutfitsPopulated = true;
+}
+
 void LLInitialWearablesFetch::done()
 {
 	// No longer need this observer hanging around.
 	gInventory.removeObserver(this);
-
+	
 	// Fetch the wearable items from the Current Outfit Folder
 	LLInventoryModel::cat_array_t cat_array;
 	LLInventoryModel::item_array_t wearable_array;
 	LLFindWearables is_wearable;
 	gInventory.collectDescendentsIf(mCompleteFolders.front(), cat_array, wearable_array, 
 									LLInventoryModel::EXCLUDE_TRASH, is_wearable);
-
+	
 	LLAppearanceManager::setAttachmentInvLinkEnable(true);
 	if (wearable_array.count() > 0)
 	{
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index 317f4a7e4fb..9b13cb842c5 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -169,9 +169,11 @@ class LLAgentWearables
 								  const LLDynamicArray<S32>& attachments_to_include,
 								  BOOL rename_clothing);
 	
-	// Note:	wearables_to_include should be a list of EWearableType types
-	//			attachments_to_include should be a list of attachment points
 	LLUUID			makeNewOutfitLinks(const std::string& new_folder_name);
+	
+	// Should only be called if we *know* we've never done so before, since users may
+	// not want the Library outfits to stay in their quick outfit selector and can delete them.
+	void			populateMyOutfitsFolder(void);
 
 private:
 	void			makeNewOutfitDone(S32 type, U32 index); 
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 4b7e364cf93..cc7a1ae14e7 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -321,10 +321,10 @@ void LLInventoryModel::unlockDirectDescendentArrays(const LLUUID& cat_id)
 // specifies 'type' as what it defaults to containing. The category is
 // not necessarily only for that type. *NOTE: This will create a new
 // inventory category on the fly if one does not exist.
-const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bool create_folder)
+const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bool create_folder, bool find_in_library)
 {
-	const LLUUID &rv = findCatUUID(t);
-	if(rv.isNull() && isInventoryUsable() && create_folder)
+	const LLUUID &rv = findCatUUID(t, find_in_library);
+	if(rv.isNull() && isInventoryUsable() && (create_folder && !find_in_library))
 	{
 		const LLUUID &root_id = gInventory.getRootFolderID();
 		if(root_id.notNull())
@@ -337,9 +337,9 @@ const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bo
 
 // Internal method which looks for a category with the specified
 // preferred type. Returns LLUUID::null if not found.
-const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type) const
+const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type, bool find_in_library) const
 {
-	const LLUUID &root_id = gInventory.getRootFolderID();
+	const LLUUID &root_id = (find_in_library) ? gInventory.getLibraryRootFolderID() : gInventory.getRootFolderID();
 	if(LLFolderType::FT_CATEGORY == preferred_type)
 	{
 		return root_id;
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index faf026887a9..b33237f4669 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -275,13 +275,12 @@ class LLInventoryModel
 
 	// findCategoryUUIDForType() returns the uuid of the category that
 	// specifies 'type' as what it defaults to containing. The
-	// category is not necessarily only for that type. *NOTE: This
-	// will create a new inventory category on the fly if one does not
-	// exist.
-
+	// category is not necessarily only for that type. *NOTE: If create_folder is true, this
+	// will create a new inventory category on the fly if one does not exist. *NOTE: if find_in_library is
+	// true it will search in the user's library folder instead of "My Inventory"
 	// SDK: Added flag to specify whether the folder should be created if not found.  This fixes the horrible
 	// multiple trash can bug.
-	const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder = true);
+	const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder = true, bool find_in_library = false);
 
 	// Call this method when it's time to update everyone on a new
 	// state, by default, the inventory model will not update
@@ -432,7 +431,7 @@ class LLInventoryModel
 	// 
 	// Internal method which looks for a category with the specified
 	// preferred type. Returns LLUUID::null if not found
- 	const LLUUID &findCatUUID(LLFolderType::EType preferred_type) const;
+ 	const LLUUID &findCatUUID(LLFolderType::EType preferred_type, bool find_in_library = false) const;
 
 	// Empty the entire contents
 	void empty();
-- 
GitLab


From 14fb8d400edf0ea71290195b6bf41b7d580157af Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Wed, 11 Nov 2009 17:44:15 -0800
Subject: [PATCH 155/557] EXT-2368 Group inspector now shows no Join/Leave
 buttons until data is fetched

---
 indra/newview/llinspectgroup.cpp                     | 3 ++-
 indra/newview/skins/default/xui/en/inspect_group.xml | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llinspectgroup.cpp b/indra/newview/llinspectgroup.cpp
index c78bcd6afe0..7fd7b69021c 100644
--- a/indra/newview/llinspectgroup.cpp
+++ b/indra/newview/llinspectgroup.cpp
@@ -216,7 +216,8 @@ void LLInspectGroup::requestUpdate()
 	getChild<LLUICtrl>("group_details")->setValue("");
 	getChild<LLUICtrl>("group_cost")->setValue("");
 	// Must have a visible button so the inspector can take focus
-	getChild<LLUICtrl>("leave_btn")->setVisible(true);
+	getChild<LLUICtrl>("view_profile_btn")->setVisible(true);
+	getChild<LLUICtrl>("leave_btn")->setVisible(false);
 	getChild<LLUICtrl>("join_btn")->setVisible(false);
 	
 	// Make a new request for properties
diff --git a/indra/newview/skins/default/xui/en/inspect_group.xml b/indra/newview/skins/default/xui/en/inspect_group.xml
index e5e5007c565..f48af2f97eb 100644
--- a/indra/newview/skins/default/xui/en/inspect_group.xml
+++ b/indra/newview/skins/default/xui/en/inspect_group.xml
@@ -31,7 +31,7 @@
      use_ellipses="true"
      width="240"
      word_wrap="false">
-    Grumpity's Grumpy Group of Moose
+    Grumpity&apos;s Grumpy Group of Moose
   </text>
   <text
    follows="all"
-- 
GitLab


From f936f661bc5d8c3d254389cc7b775bf5d6a0ff2e Mon Sep 17 00:00:00 2001
From: callum <none@none>
Date: Wed, 11 Nov 2009 17:54:41 -0800
Subject: [PATCH 156/557] Fix for DEV-42720 - media settings floater is Empty

---
 .../skins/default/xui/en/floater_media_settings.xml  | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_media_settings.xml b/indra/newview/skins/default/xui/en/floater_media_settings.xml
index 68dd2001afb..8122386fae3 100644
--- a/indra/newview/skins/default/xui/en/floater_media_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_media_settings.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <floater
  legacy_header_height="18"
- bottom="-666" 
+ bottom="666" 
  can_close="true" 
  can_drag_on_left="false" 
  can_minimize="true"
@@ -12,14 +12,14 @@
  width="365" 
  height="535" 
  left="330" 
- min_height="430" 
- min_width="620"
+ min_height="535" 
+ min_width="365"
  mouse_opaque="true" 
- name="Media Settings" 
+ name="media_settings" 
  help_topic = "media_settings"
  title="MEDIA SETTINGS">
 	<button 
-	 bottom="-525" 
+	 bottom="525" 
 	 enabled="true" 
 	 follows="right|bottom" 
 	 font="SansSerif"
@@ -61,7 +61,7 @@
 	 scale_image="true"
 	 width="90" />
 	<tab_container 
-	 bottom="-500" 
+	 bottom="500" 
 	 enabled="true" 
 	 follows="left|top|right|bottom" 
 	 height="485"
-- 
GitLab


From a7fa9c49366dc1d22ee7aeea21c26cd40f2bc7f0 Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Thu, 12 Nov 2009 00:07:07 -0800
Subject: [PATCH 157/557] Better fix for edge case where abort call to
 readComplete() can cause a crash.

---
 indra/newview/lltexturecache.cpp | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 6a4b967487c..9be342c424c 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -1541,23 +1541,24 @@ bool LLTextureCache::readComplete(handle_t handle, bool abort)
 {
 	lockWorkers();
 	handle_map_t::iterator iter = mReaders.find(handle);
-	llassert_always(iter != mReaders.end() || abort);
-	LLTextureCacheWorker* worker = iter->second;
-	if (!worker)
-		return false;
-	bool res = worker->complete();
-	if (res || abort)
+	LLTextureCacheWorker* worker = NULL;
+	bool complete = false;
+	if (iter != mReaders.end())
 	{
-		mReaders.erase(handle);
+		worker = iter->second;
+		complete = worker->complete();
+	}
+	if (worker && (complete || abort))
+	{
+		mReaders.erase(iter);
 		unlockWorkers();
 		worker->scheduleDelete();
-		return true;
 	}
 	else
 	{
 		unlockWorkers();
-		return false;
 	}
+	return (complete || abort);
 }
 
 LLTextureCache::handle_t LLTextureCache::writeToCache(const LLUUID& id, U32 priority,
-- 
GitLab


From 96286cde379057a0b3c29a23c08490fe86fd0128 Mon Sep 17 00:00:00 2001
From: Lynx Linden <lynx@lindenlab.com>
Date: Thu, 12 Nov 2009 09:53:34 +0000
Subject: [PATCH 158/557] DEV-41324: Updated the Incoming Call floater.

This is now a dockable floater with a dock tongue. It currently floats
over the sys well, where other system messages appear. The appearance
now matches the voice spec more closely. It also tells you which voice
channel you would be leaving if you accept the call.
---
 indra/newview/llimview.cpp                    | 30 +++++++++++++-
 indra/newview/llimview.h                      |  5 ++-
 .../default/xui/en/floater_incoming_call.xml  | 40 ++++++++++++-------
 3 files changed, 58 insertions(+), 17 deletions(-)

diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 14f94d5a888..3214d7c8fad 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -46,6 +46,7 @@
 
 #include "llagent.h"
 #include "llavatariconctrl.h"
+#include "llbottomtray.h"
 #include "llcallingcard.h"
 #include "llchat.h"
 #include "llresmgr.h"
@@ -73,6 +74,7 @@
 #include "llvoicechannel.h"
 #include "lltrans.h"
 #include "llrecentpeople.h"
+#include "llsyswellwindow.h"
 
 #include "llfirstuse.h"
 #include "llagentui.h"
@@ -1103,13 +1105,15 @@ LLIMMgr::onConfirmForceCloseError(
 // Class LLIncomingCallDialog
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 LLIncomingCallDialog::LLIncomingCallDialog(const LLSD& payload) :
-	LLModalDialog(payload),
+	LLDockableFloater(NULL, false, payload),
 	mPayload(payload)
 {
 }
 
 BOOL LLIncomingCallDialog::postBuild()
 {
+	LLDockableFloater::postBuild();
+
 	LLSD caller_id = mPayload["caller_id"];
 	EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
 
@@ -1141,6 +1145,30 @@ BOOL LLIncomingCallDialog::postBuild()
 	return TRUE;
 }
 
+void LLIncomingCallDialog::getAllowedRect(LLRect& rect)
+{
+	rect = gViewerWindow->getWorldViewRectRaw();
+}
+
+void LLIncomingCallDialog::onOpen(const LLSD& key)
+{
+	// tell the user which voice channel they would be leaving
+	LLVoiceChannel *voice = LLVoiceChannel::getCurrentVoiceChannel();
+	if (voice && !voice->getSessionName().empty())
+	{
+		childSetTextArg("question", "[CURRENT_CHAT]", voice->getSessionName());
+	}
+	else
+	{
+		childSetTextArg("question", "[CURRENT_CHAT]", getString("localchat"));
+	}
+
+	// dock the dialog to the sys well, where other sys messages appear
+	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
+									 this, getDockTongue(), LLDockControl::TOP,
+									 boost::bind(&LLIncomingCallDialog::getAllowedRect, this, _1)));
+}
+
 //static
 void LLIncomingCallDialog::onAccept(void* user_data)
 {
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index c566b111ca9..6269386b442 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -34,6 +34,7 @@
 #define LL_LLIMVIEW_H
 
 #include "lldarray.h"
+#include "lldockablefloater.h"
 #include "llspeakers.h" //for LLIMSpeakerMgr
 #include "llimpanel.h" //for voice channels
 #include "llmodaldialog.h"
@@ -401,12 +402,13 @@ class LLIMMgr : public LLSingleton<LLIMMgr>
 	LLSD mPendingAgentListUpdates;
 };
 
-class LLIncomingCallDialog : public LLModalDialog
+class LLIncomingCallDialog : public LLDockableFloater
 {
 public:
 	LLIncomingCallDialog(const LLSD& payload);
 
 	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void onOpen(const LLSD& key);
 
 	static void onAccept(void* user_data);
 	static void onReject(void* user_data);
@@ -414,6 +416,7 @@ class LLIncomingCallDialog : public LLModalDialog
 
 private:
 	void processCallResponse(S32 response);
+	void getAllowedRect(LLRect& rect);
 
 	LLSD mPayload;
 };
diff --git a/indra/newview/skins/default/xui/en/floater_incoming_call.xml b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
index 16873df3101..9c2898945ba 100644
--- a/indra/newview/skins/default/xui/en/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
@@ -4,13 +4,17 @@
  can_close="false"
  can_minimize="false"
  can_tear_off="false"
- height="200"
+ height="125"
  layout="topleft"
  name="incoming call"
  help_topic="incoming_call"
  title="UNKNOWN PERSON IS CALLING"
- width="240">
-     <floater.string
+ width="410">
+    <floater.string
+     name="localchat">
+        Local Voice Chat
+    </floater.string>
+    <floater.string
      name="anonymous">
         anonymous
     </floater.string>
@@ -31,18 +35,26 @@
      left_delta="19"
      top="35"
      width="36" />
-    <text_editor
-     font="SansSerif"
-     height="64"
-     border_visible="false"
+    <text
+     font="SansSerifLarge"
+     height="20"
      layout="topleft"
      left="77"
-     max_length="2147483647"
      name="caller name"
-     read_only="true"
-     top="21"
-     width="163"
+     top="27"
+     width="315"
      word_wrap="true" />
+    <text
+     font="SansSerif"
+     height="50"
+     layout="topleft"
+     left="77"
+     name="question"
+     top="52"
+     width="315"
+     word_wrap="true">
+     Do you want to leave [CURRENT_CHAT] and join this voice chat?
+    </text>
     <button
      height="24"
      label="Accept"
@@ -57,16 +69,14 @@
      label="Reject"
      label_selected="Reject"
      layout="topleft"
-     left_delta="0"
      name="Reject"
-     top_pad="12"
+     left_pad="10"
      width="100" />
     <button
      height="24"
      label="Start IM"
      layout="topleft"
-     left_delta="0"
      name="Start IM"
-     top_pad="12"
+     left_pad="10"
      width="100" />
 </floater>
-- 
GitLab


From 38115eb90b1760025ee299a167f6a9a2311f59ab Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Thu, 12 Nov 2009 12:15:32 +0200
Subject: [PATCH 159/557] Fixed path to image Generic_Object_Small

--HG--
branch : product-engine
---
 indra/newview/skins/default/textures/textures.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 0e533b1c0e0..508ae689753 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -117,7 +117,7 @@
   <texture name="Generic_Group" file_name="icons/Generic_Group.png" preload="false" />
   <texture name="Generic_Group_Large" file_name="icons/Generic_Group_Large.png" preload="false" />
   <texture name="Generic_Object_Medium" file_name="icons/Generic_Object_Medium.png" preload="false" />
-  <texture name="Generic_Object_Small" file_name="icons/ Generic_Object_Small.png" preload="false" />
+  <texture name="Generic_Object_Small" file_name="icons/Generic_Object_Small.png" preload="false" />
   <texture name="Generic_Object_Large" file_name="icons/Generic_Object_Large.png" preload="false" />
   <texture name="Generic_Person" file_name="icons/Generic_Person.png" preload="false" />
   <texture name="Generic_Person_Large" file_name="icons/Generic_Person_Large.png" preload="false" />
-- 
GitLab


From 36e0f729d33a2e87809f8185cb73016e54ba76a5 Mon Sep 17 00:00:00 2001
From: Dmitry Oleshko <doleshko@productengine.com>
Date: Thu, 12 Nov 2009 12:59:04 +0200
Subject: [PATCH 160/557] final fix for (EXT-989) IM chiclets should expand to
 show active voice indicator (EXT-988) Change indication of unread messges in
 chiclets

fixed chiclets' behavior in the Message Well Window

--HG--
branch : product-engine
---
 indra/newview/llchiclet.cpp                   | 44 ++++++++++++++-----
 indra/newview/llsyswellwindow.cpp             |  9 ++--
 .../default/xui/en/panel_activeim_row.xml     | 42 ++++++++++++++++--
 3 files changed, 77 insertions(+), 18 deletions(-)

diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index b919195fb21..e4161517482 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -54,10 +54,12 @@ static LLDefaultChildRegistry::Register<LLChicletPanel> t1("chiclet_panel");
 static LLDefaultChildRegistry::Register<LLNotificationChiclet> t2("chiclet_notification");
 static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t3("chiclet_im_p2p");
 static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t4("chiclet_im_group");
+static LLDefaultChildRegistry::Register<LLAdHocChiclet> t5("chiclet_im_adhoc");
 
 static const LLRect CHICLET_RECT(0, 25, 25, 0);
-static const LLRect CHICLET_ICON_RECT(0, 24, 24, 0);
+static const LLRect CHICLET_ICON_RECT(0, 22, 22, 0);
 static const LLRect VOICE_INDICATOR_RECT(25, 25, 45, 0);
+static const S32	OVERLAY_ICON_SHIFT = 2;	// used for shifting of an overlay icon for new massages in a chiclet
 
 // static
 const S32 LLChicletPanel::s_scroll_ratio = 10;
@@ -217,13 +219,15 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p)
 	icon_params.visible = false;
 	icon_params.image = LLUI::getUIImage(p.new_messages_icon_name);
 	mNewMessagesIcon = LLUICtrlFactory::create<LLIconCtrl>(icon_params);
+	addChild(mNewMessagesIcon);
+
 	// adjust size and position of an icon
 	LLRect chiclet_rect = p.rect;
-	LLRect overlay_icon_rect = LLRect(chiclet_rect.getWidth()/2, chiclet_rect.mTop, chiclet_rect.mRight, chiclet_rect.getHeight()/2); 
-	// shift an icon a little bit to the right and up corner of a chiclet
-	overlay_icon_rect.translate(overlay_icon_rect.getWidth()/5, overlay_icon_rect.getHeight()/5);
+	LLRect overlay_icon_rect = LLRect(chiclet_rect.getWidth()/2, chiclet_rect.getHeight(), chiclet_rect.getWidth(), chiclet_rect.getHeight()/2); 
 	mNewMessagesIcon->setRect(overlay_icon_rect);
-	addChild(mNewMessagesIcon);
+	
+	// shift an icon a little bit to the right and up corner of a chiclet
+	overlay_icon_rect.translate(OVERLAY_ICON_SHIFT, OVERLAY_ICON_SHIFT);
 
 	setShowCounter(false);
 }
@@ -602,6 +606,9 @@ BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
 
 LLIMGroupChiclet::Params::Params()
 : group_icon("group_icon")
+, unread_notifications("unread_notifications")
+, speaker("speaker")
+, show_speaker("show_speaker")
 {
 	rect(CHICLET_RECT);
 
@@ -880,19 +887,34 @@ BOOL LLChicletPanel::postBuild()
 
 void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id)
 {
-	for(chiclet_list_t::iterator it = mChicletList.begin(); it != mChicletList.end(); ++it)
+	static LLUUID s_previous_active_voice_session_id;
+
+	std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(session_id);
+
+	for(std::list<LLChiclet *>::iterator it = chiclets.begin(); it != chiclets.end(); ++it)
 	{
 		LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it);
 		if(chiclet)
 		{
-			if(chiclet->getSessionId() == session_id)
+			chiclet->setShowSpeaker(true);
+		}
+	}
+
+	if(!s_previous_active_voice_session_id.isNull() && s_previous_active_voice_session_id != session_id)
+	{
+		chiclets = LLIMChiclet::sFindChicletsSignal(s_previous_active_voice_session_id);
+
+		for(std::list<LLChiclet *>::iterator it = chiclets.begin(); it != chiclets.end(); ++it)
+		{
+			LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it);
+			if(chiclet)
 			{
-				chiclet->setShowSpeaker(true);
-				continue;
+				chiclet->setShowSpeaker(false);
 			}
-			chiclet->setShowSpeaker(false);
-		}
+		}		
 	}
+
+	s_previous_active_voice_session_id = session_id;
 }
 
 S32 LLChicletPanel::calcChickletPanleWidth()
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index 4422c4b6722..2fb6550107a 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -501,14 +501,14 @@ LLSysWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID&
 	switch (im_chiclet_type)
 	{
 	case LLIMChiclet::TYPE_GROUP:
+		mChiclet = getChild<LLIMGroupChiclet>("group_chiclet");
+		break;
 	case LLIMChiclet::TYPE_AD_HOC:
-		mChiclet = getChild<LLIMChiclet>("group_chiclet");
-		childSetVisible("p2p_chiclet", false);
+		mChiclet = getChild<LLAdHocChiclet>("adhoc_chiclet");		
 		break;
 	case LLIMChiclet::TYPE_UNKNOWN: // assign mChiclet a non-null value anyway
 	case LLIMChiclet::TYPE_IM:
-		mChiclet = getChild<LLIMChiclet>("p2p_chiclet");
-		childSetVisible("group_chiclet", false);
+		mChiclet = getChild<LLIMP2PChiclet>("p2p_chiclet");
 		break;
 	}
 
@@ -517,6 +517,7 @@ LLSysWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID&
 	mChiclet->setSessionId(sessionId);
 	mChiclet->setIMSessionName(name);
 	mChiclet->setOtherParticipantId(otherParticipantId);
+	mChiclet->setVisible(true);
 
 	LLTextBox* contactName = getChild<LLTextBox>("contact_name");
 	contactName->setValue(name);
diff --git a/indra/newview/skins/default/xui/en/panel_activeim_row.xml b/indra/newview/skins/default/xui/en/panel_activeim_row.xml
index 8b815b0f711..5562ec84066 100644
--- a/indra/newview/skins/default/xui/en/panel_activeim_row.xml
+++ b/indra/newview/skins/default/xui/en/panel_activeim_row.xml
@@ -15,7 +15,16 @@
 		top="3"
 		left="5"
 		height="25"
-		width="25">
+		width="25"
+    visible="false"
+    speaker.name="speaker_p2p"
+    speaker.width="20"
+    speaker.height="25"
+    speaker.left="25"
+    speaker.top="25"
+    speaker.auto_update="true"
+    speaker.draw_border="false"
+    speaker.visible="false">
   </chiclet_im_p2p>
   <chiclet_im_group
 		name="group_chiclet"
@@ -24,14 +33,41 @@
 		top="3"
 		left="5"
 		height="25"
-		width="25">
+		width="25"
+    visible="false"
+    speaker.name="speaker_grp"
+    speaker.width="20"
+    speaker.height="25"
+    speaker.left="25"
+    speaker.top="25"
+    speaker.auto_update="true"
+    speaker.draw_border="false"
+    speaker.visible="false">
   </chiclet_im_group>
+  <chiclet_im_adhoc
+		name="adhoc_chiclet"
+		layout="topleft"
+		follows="left"
+		top="3"
+		left="5"
+		height="25"
+		width="25"
+    visible="false"
+    speaker.name="speaker_hoc"
+    speaker.width="20"
+    speaker.height="25"
+    speaker.left="25"
+    speaker.top="25"
+    speaker.auto_update="true"
+    speaker.draw_border="false"
+    speaker.visible="false">
+  </chiclet_im_adhoc>
 	<text
 		type="string"
 		name="contact_name"
 		layout="topleft"
 		top="10"
-		left_pad="0"
+		left_pad="20"
 		height="14"
 		width="245"
 		length="1"
-- 
GitLab


From a69ab24094d11df4b995cd8038b12b8eda96da15 Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Thu, 12 Nov 2009 13:29:27 +0200
Subject: [PATCH 161/557] Fixed Low bug EXT-2345-There is wrong direction arrow
 in IM window, after this window has been closed and restored (refer to
 screenshot)

--HG--
branch : product-engine
---
 indra/newview/llimfloater.cpp | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 54fc6f02fb0..5ea900e46d9 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -211,6 +211,7 @@ BOOL LLIMFloater::postBuild()
 	}
 
 	mControlPanel->setSessionId(mSessionID);
+	mControlPanel->setVisible(gSavedSettings.getBOOL("IMShowControlPanel"));
 
 	LLButton* slide_left = getChild<LLButton>("slide_left_btn");
 	slide_left->setVisible(mControlPanel->getVisible());
@@ -356,8 +357,6 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
 				LLDockControl::TOP,  boost::bind(&LLIMFloater::getAllowedRect, floater, _1)));
 	}
 
-	floater->childSetVisible("panel_im_control_panel", gSavedSettings.getBOOL("IMShowControlPanel"));
-
 	return floater;
 }
 
-- 
GitLab


From 438db7bbacb10687389401e839adbc390927cdc3 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Thu, 12 Nov 2009 12:04:02 +0000
Subject: [PATCH 162/557] reacreate floater_outgoing_call in the new style of
 floater_incoming_call.

---
 .../default/xui/en/floater_outgoing_call.xml  | 62 ++++++++++++-------
 1 file changed, 38 insertions(+), 24 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
index fd936232c9d..c30814c881b 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -4,20 +4,28 @@
  can_close="false"
  can_minimize="false"
  can_tear_off="false"
- height="200"
+ height="125"
  layout="topleft"
  name="outgoing call"
  help_topic="outgoing_call"
  title="CALLING"
- width="240">
-     <floater.string
-     name="anonymous">
-        anonymous
+ width="410">
+    <floater.string
+     name="localchat">
+        Local Voice Chat
     </floater.string>
     <floater.string
      name="calling">
         Calling [CALLEE]
     </floater.string>
+    <floater.string
+     name="anonymous">
+        anonymous
+    </floater.string>
+    <floater.string
+     name="VoiceInviteP2P">
+        is calling.
+    </floater.string>
     <floater.string
      name="VoiceInviteAdHoc">
         has joined a Voice Chat call with a conference chat.
@@ -31,42 +39,48 @@
      left_delta="19"
      top="35"
      width="36" />
-    <text_editor
-     font="SansSerif"
-     height="64"
-     border_visible="false"
+    <text
+     font="SansSerifLarge"
+     height="20"
      layout="topleft"
      left="77"
-     max_length="2147483647"
-     name="callee name"
-     read_only="true"
-     top="21"
-     width="163"
+     name="caller name"
+     top="27"
+     width="315"
      word_wrap="true" />
+    <text
+     font="SansSerif"
+     height="50"
+     layout="topleft"
+     left="77"
+     name="question"
+     top="52"
+     width="315"
+     word_wrap="true">
+     Do you want to leave [CURRENT_CHAT] and join this voice chat?
+    </text>
     <button
      height="24"
-     label="Bar"
-     label_selected="Bar"
+     label="Foo"
+     label_selected="Foo"
      layout="topleft"
      left="70"
-     name="Bar"
+     name="Foo"
      top="92"
      width="100" />
     <button
      height="24"
-     label="Foo"
-     label_selected="Foo"
+     label="Bar"
+     label_selected="Bar"
      layout="topleft"
-     left_delta="0"
-     name="Foo"
-     top_pad="12"
+     name="Bar"
+     left_pad="10"
      width="100" />
     <button
      height="24"
      label="Baz"
      layout="topleft"
-     left_delta="0"
      name="Baz"
-     top_pad="12"
+     left_pad="10"
      width="100" />
 </floater>
-- 
GitLab


From 01d90c3d3e90321be326db04ecd2e09328cb189e Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Thu, 12 Nov 2009 14:25:34 +0200
Subject: [PATCH 163/557] Work on major sub-task EXT-991 (Update bottom bar
 behavior on resize)  increased chat bar text field to compensate changes in
 changeset:  4652 : d0832cfa71c6 (for EXT-2356 Replace Log button in bottom
 tray with up arrow)

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
index 1ef845b769f..a77094e9420 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
@@ -27,7 +27,7 @@
      name="chat_box"
      tool_tip="Press Enter to say, Ctrl+Enter to shout"
      top="0"
-     width="250" />
+     width="279" />
     <output_monitor
      auto_update="true"
      follows="right"
-- 
GitLab


From 393f68c1a9785b29adc210124e342af24937d5f5 Mon Sep 17 00:00:00 2001
From: Lynx Linden <lynx@lindenlab.com>
Date: Thu, 12 Nov 2009 12:36:30 +0000
Subject: [PATCH 164/557] DEV-2925: Added a new remote object inspector.

This is used to display details about objects that may not be in the
current scene (the existing object inspector is tied to selection and
only works for objects in the scene). The remote inspector lets you see
the name and owner of the object. You can also teleport to the object's
location, view the location on the map, or mute the object.

I've also added more information to the notification you receive when
an object sends you an IM via llInstantMessage(). This notification now
has an "Inspect" button that brings up the remote object inspector.
---
 indra/newview/CMakeLists.txt                  |   2 +
 indra/newview/llinspectremoteobject.cpp       | 200 ++++++++++++++++++
 indra/newview/llinspectremoteobject.h         |  40 ++++
 indra/newview/llviewerfloaterreg.cpp          |   2 +
 indra/newview/llviewermessage.cpp             |  28 ++-
 .../default/xui/en/inspect_remote_object.xml  |  99 +++++++++
 .../skins/default/xui/en/notifications.xml    |   5 +
 7 files changed, 375 insertions(+), 1 deletion(-)
 create mode 100644 indra/newview/llinspectremoteobject.cpp
 create mode 100644 indra/newview/llinspectremoteobject.h
 create mode 100644 indra/newview/skins/default/xui/en/inspect_remote_object.xml

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 13c381edaec..3b18b7d7007 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -246,6 +246,7 @@ set(viewer_SOURCE_FILES
     llinspectavatar.cpp
     llinspectgroup.cpp
     llinspectobject.cpp
+    llinspectremoteobject.cpp
     llinventorybridge.cpp
     llinventoryclipboard.cpp
     llinventoryfilter.cpp
@@ -741,6 +742,7 @@ set(viewer_HEADER_FILES
     llinspectavatar.h
     llinspectgroup.h
     llinspectobject.h
+    llinspectremoteobject.h
     llinventorybridge.h
     llinventoryclipboard.h
     llinventoryfilter.h
diff --git a/indra/newview/llinspectremoteobject.cpp b/indra/newview/llinspectremoteobject.cpp
new file mode 100644
index 00000000000..e4d2eec242b
--- /dev/null
+++ b/indra/newview/llinspectremoteobject.cpp
@@ -0,0 +1,200 @@
+/** 
+ * @file llinspectremoteobject.cpp
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llinspectremoteobject.h"
+#include "llinspect.h"
+#include "llslurl.h"
+#include "llmutelist.h"
+#include "llurlaction.h"
+#include "llpanelblockedlist.h"
+#include "llfloaterreg.h"
+#include "llui.h"
+#include "lluictrl.h"
+
+class LLViewerObject;
+
+//////////////////////////////////////////////////////////////////////////////
+// LLInspectRemoteObject
+//////////////////////////////////////////////////////////////////////////////
+
+// Remote Object Inspector, a small information window used to
+// display information about potentially-remote objects. Used
+// to display details about objects sending messages to the user.
+class LLInspectRemoteObject : public LLInspect
+{
+	friend class LLFloaterReg;
+	
+public:
+	LLInspectRemoteObject(const LLSD& object_id);
+	virtual ~LLInspectRemoteObject() {};
+
+	/*virtual*/ BOOL postBuild(void);
+	/*virtual*/ void onOpen(const LLSD& avatar_id);
+
+	void onClickMap();
+	void onClickBlock();
+	void onClickClose();
+	
+private:
+	void update();
+	static void nameCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data);
+	
+private:
+	LLUUID		 mObjectID;
+	LLUUID		 mOwnerID;
+	std::string  mOwner;
+	std::string  mSLurl;
+	std::string  mName;
+	bool         mGroupOwned;
+};
+
+LLInspectRemoteObject::LLInspectRemoteObject(const LLSD& sd) :
+	LLInspect(LLSD()),
+	mObjectID(NULL),
+	mOwnerID(NULL),
+	mOwner(""),
+	mSLurl(""),
+	mName(""),
+	mGroupOwned(false)
+{
+}
+
+/*virtual*/
+BOOL LLInspectRemoteObject::postBuild(void)
+{
+	// hook up the inspector's buttons
+	getChild<LLUICtrl>("map_btn")->setCommitCallback(
+		boost::bind(&LLInspectRemoteObject::onClickMap, this));
+	getChild<LLUICtrl>("block_btn")->setCommitCallback(
+		boost::bind(&LLInspectRemoteObject::onClickBlock, this));
+	getChild<LLUICtrl>("close_btn")->setCommitCallback(
+		boost::bind(&LLInspectRemoteObject::onClickClose, this));
+
+	return TRUE;
+}
+
+/*virtual*/
+void LLInspectRemoteObject::onOpen(const LLSD& data)
+{
+	// Start animation
+	LLInspect::onOpen(data);
+
+	// Extract appropriate object information from input LLSD
+	// (Eventually, it might be nice to query server for details
+	// rather than require caller to pass in the information.)
+	mObjectID   = data["object_id"].asUUID();
+	mName       = data["name"].asString();
+	mOwnerID    = data["owner_id"].asUUID();
+	mGroupOwned = data["group_owned"].asBoolean();
+	mSLurl      = data["slurl"].asString();
+
+	// work out the owner's name
+	mOwner = "";
+	if (gCacheName)
+	{
+		gCacheName->get(mOwnerID, mGroupOwned, nameCallback, this);
+	}
+
+	// update the inspector with the current object state
+	update();
+
+	// Position the inspector relative to the mouse cursor
+	LLUI::positionViewNearMouse(this);
+}
+
+void LLInspectRemoteObject::onClickMap()
+{
+	std::string url = "secondlife://" + mSLurl;
+	LLUrlAction::showLocationOnMap(url);
+	closeFloater();
+}
+
+void LLInspectRemoteObject::onClickBlock()
+{
+	LLMute::EType mute_type = mGroupOwned ? LLMute::GROUP : LLMute::AGENT;
+	LLMute mute(mOwnerID, mOwner, mute_type);
+	LLMuteList::getInstance()->add(mute);
+	LLPanelBlockedList::showPanelAndSelect(mute.mID);
+	closeFloater();
+}
+
+void LLInspectRemoteObject::onClickClose()
+{
+	closeFloater();
+}
+
+//static 
+void LLInspectRemoteObject::nameCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data)
+{
+	LLInspectRemoteObject *self = (LLInspectRemoteObject*)data;
+	self->mOwner = first;
+	if (!last.empty())
+	{
+		self->mOwner += " " + last;
+	}
+	self->update();
+}
+
+void LLInspectRemoteObject::update()
+{
+	// show the object name as the inspector's title
+	getChild<LLUICtrl>("object_name")->setValue(mName);
+
+	// show the object's owner - click it to show profile
+	std::string owner = mOwner;
+	if (! mOwnerID.isNull())
+	{
+		if (mGroupOwned)
+		{
+			owner = LLSLURL::buildCommand("group", mOwnerID, "about");
+		}
+		else
+		{
+			owner = LLSLURL::buildCommand("agent", mOwnerID, "about");
+		}
+	}
+	getChild<LLUICtrl>("object_owner")->setValue(owner);
+
+	// display the object's SLurl - click it to teleport
+	std::string url = "secondlife:///app/teleport/" + mSLurl;
+	getChild<LLUICtrl>("object_slurl")->setValue(url);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// LLInspectRemoteObjectUtil
+//////////////////////////////////////////////////////////////////////////////
+void LLInspectRemoteObjectUtil::registerFloater()
+{
+	LLFloaterReg::add("inspect_remote_object", "inspect_remote_object.xml",
+					  &LLFloaterReg::build<LLInspectRemoteObject>);
+}
diff --git a/indra/newview/llinspectremoteobject.h b/indra/newview/llinspectremoteobject.h
new file mode 100644
index 00000000000..e756f1caf4e
--- /dev/null
+++ b/indra/newview/llinspectremoteobject.h
@@ -0,0 +1,40 @@
+/** 
+ * @file llinspectremoteobject.h
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LLINSPECTREMOTEOBJECT_H
+#define LLINSPECTREMOTEOBJECT_H
+
+namespace LLInspectRemoteObjectUtil
+{
+	void registerFloater();
+}
+
+#endif
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index edbac69e1b8..964d3bc2fa5 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -112,6 +112,7 @@
 #include "llinspectavatar.h"
 #include "llinspectgroup.h"
 #include "llinspectobject.h"
+#include "llinspectremoteobject.h"
 #include "llmediaremotectrl.h"
 #include "llmoveview.h"
 #include "llnearbychat.h"
@@ -176,6 +177,7 @@ void LLViewerFloaterReg::registerFloaters()
 	LLInspectAvatarUtil::registerFloater();
 	LLInspectGroupUtil::registerFloater();
 	LLInspectObjectUtil::registerFloater();
+	LLInspectRemoteObjectUtil::registerFloater();
 	
 	LLFloaterReg::add("lagmeter", "floater_lagmeter.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLagMeter>);
 	LLFloaterReg::add("land_holdings", "floater_land_holdings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLandHoldings>);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index a90790c59a8..6d6fc5f49f2 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1431,6 +1431,17 @@ bool goto_url_callback(const LLSD& notification, const LLSD& response)
 }
 static LLNotificationFunctorRegistration goto_url_callback_reg("GotoURL", goto_url_callback);
 
+bool inspect_remote_object_callback(const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotification::getSelectedOption(notification, response);
+	if (0 == option)
+	{
+		LLFloaterReg::showInstance("inspect_remote_object", notification["payload"]);
+	}
+	return false;
+}
+static LLNotificationFunctorRegistration inspect_remote_object_callback_reg("ServerObjectMessage", inspect_remote_object_callback);
+
 void process_improved_im(LLMessageSystem *msg, void **user_data)
 {
 	if (gNoRender)
@@ -1952,9 +1963,24 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 				return;
 			}
 
+			// Build a link to open the object IM info window.
+			std::string location = ll_safe_string((char*)binary_bucket,binary_bucket_size);
+			LLStringUtil::trim(location);
+
 			LLSD substitutions;
+			substitutions["NAME"] = name;
 			substitutions["MSG"] = message.substr(message_offset);
-			LLNotifications::instance().add("ServerObjectMessage", substitutions);
+
+			LLSD payload;
+			payload["object_id"] = session_id;
+			payload["owner_id"] = from_id;
+			payload["slurl"] = location;
+			payload["name"] = name;
+			if (from_group)
+			{
+				payload["groupowned"] = "true";
+			}
+			LLNotifications::instance().add("ServerObjectMessage", substitutions, payload);
 		}
 		break;
 	case IM_FROM_TASK_AS_ALERT:
diff --git a/indra/newview/skins/default/xui/en/inspect_remote_object.xml b/indra/newview/skins/default/xui/en/inspect_remote_object.xml
new file mode 100644
index 00000000000..07c684d9047
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/inspect_remote_object.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!--
+  Not can_close / no title to avoid window chrome
+  Single instance - only have one at a time, recycle it each spawn
+-->
+<floater
+ legacy_header_height="18"
+ bevel_style="in"
+ bg_opaque_image="Inspector_Background" 
+ can_close="false"
+ can_minimize="false"
+ height="145"
+ layout="topleft"
+ name="inspect_remote_object"
+ single_instance="true"
+ sound_flags="0"
+ visible="true"
+ width="300">
+  <text
+   follows="all"
+   font="SansSerifLargeBold"
+   height="16"
+   left="8"
+   name="object_name"
+   text_color="White"
+   top="5"
+   use_ellipses="true"
+   width="290">
+     Test Object Name That Is Really Long
+  </text>
+  <text
+   follows="all"
+   font="SansSerif"
+   height="20"
+   left="8"
+   name="object_owner_label"
+   width="55"
+   top_pad="20">
+     Owner:
+  </text>
+  <text
+   follows="top|left"
+   font="SansSerif"
+   height="20"
+   left_pad="10"
+   name="object_owner"
+   use_ellipses="true"
+   width="200"
+   word_wrap="false">
+     Longavatarname Johnsonlongstonnammer
+  </text>
+  <text
+   follows="top|left"
+   font="SansSerif"
+   height="20"
+   left="8"
+   name="object_slurl_label"
+   top_pad="10"
+   width="55">
+     Location:
+  </text>
+  <text
+   follows="top|left"
+   height="20"
+   left_pad="10"
+   name="object_slurl"
+   width="240"
+   use_ellipses="true"
+   word_wrap="false">
+     http://slurl.com/Ahern/50/50/50
+  </text>
+  <button
+   follows="top|left"
+   font="SansSerif"
+   height="20"
+   label="Map"
+   left="10"
+   name="map_btn"
+   top="114"
+   width="75" />
+  <button
+   follows="top|left"
+   font="SansSerif"
+   height="20"
+   label="Block"
+   left_pad="5"
+   name="block_btn"
+   top_delta="0"
+   width="75" />
+  <button
+   follows="top|left"
+   font="SansSerif"
+   height="20"
+   label="Close"
+   right="-10"
+   name="close_btn"
+   top_delta="0"
+   width="75" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index ccd8bc569e7..a44de51cb05 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -4696,7 +4696,12 @@ The objects on the selected parcel that are NOT owned by you have been returned
    icon="notify.tga"
    name="ServerObjectMessage"
    type="notify">
+Message from [NAME]:
 [MSG]
+    <usetemplate
+     name="okcancelbuttons"
+     notext="OK"
+     yestext="Inspect"/>
   </notification>
 
   <notification
-- 
GitLab


From daefef6e66ef312e4e036fe05584ed2cafe1c56c Mon Sep 17 00:00:00 2001
From: Lynx Linden <lynx@lindenlab.com>
Date: Thu, 12 Nov 2009 12:43:18 +0000
Subject: [PATCH 165/557] DEV-2925: Remove support for
 secondlife:///app/objectim URLs.

These are no longer generated in Viewer 2.0 (instead we use
notifications to send object IMs to the user), so there's no
need to look for them in every textbox. Users can get details
on any objects spamming them via the new remote object inspector.
---
 indra/llui/llurlentry.cpp         | 44 -------------------------------
 indra/llui/llurlentry.h           | 12 ---------
 indra/llui/llurlregistry.cpp      |  1 -
 indra/newview/llagentlistener.cpp |  2 +-
 indra/newview/llurldispatcher.cpp |  6 ++---
 5 files changed, 4 insertions(+), 61 deletions(-)

diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index dae4b512d15..219fae84be8 100644
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -512,50 +512,6 @@ std::string LLUrlEntryTeleport::getLocation(const std::string &url) const
 	return ::getStringAfterToken(url, "app/teleport/");
 }
 
-///
-/// LLUrlEntryObjectIM Describes a Second Life object instant msg Url, e.g.,
-/// secondlife:///app/objectim/<sessionid>
-///
-LLUrlEntryObjectIM::LLUrlEntryObjectIM()
-{
-	mPattern = boost::regex("secondlife:///app/objectim/[\\da-f-]+\\??\\S*",
-							boost::regex::perl|boost::regex::icase);
-	mMenuName = "menu_url_objectim.xml";
-	mTooltip = LLTrans::getString("TooltipObjectIMUrl");
-}
-
-std::string LLUrlEntryObjectIM::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
-{
-	LLURI uri(url);
-	LLSD params = uri.queryMap();
-	if (params.has("name"))
-	{
-		// look for a ?name=<obj-name> param in the url
-		// and use that as the label if present.
-		std::string name = params.get("name");
-		LLStringUtil::trim(name);
-		if (name.empty())
-		{
-			name = LLTrans::getString("Unnamed");
-		}
-		return name;
-	}
-
-	return unescapeUrl(url);
-}
-
-std::string LLUrlEntryObjectIM::getLocation(const std::string &url) const
-{
-	LLURI uri(url);
-	LLSD params = uri.queryMap();
-	if (params.has("slurl"))
-	{
-		return params.get("slurl");
-	}
-
-	return "";
-}
-
 //
 // LLUrlEntrySL Describes a generic SLURL, e.g., a Url that starts
 // with secondlife:// (used as a catch-all for cases not matched above)
diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h
index 4507572b1e1..7970b48eb5a 100644
--- a/indra/llui/llurlentry.h
+++ b/indra/llui/llurlentry.h
@@ -208,18 +208,6 @@ class LLUrlEntryTeleport : public LLUrlEntryBase
 	/*virtual*/ std::string getLocation(const std::string &url) const;
 };
 
-///
-/// LLUrlEntryObjectIM Describes a Second Life object instant msg Url, e.g.,
-/// secondlife:///app/objectim/<sessionid>?name=Foo
-///
-class LLUrlEntryObjectIM : public LLUrlEntryBase
-{
-public:
-	LLUrlEntryObjectIM();
-	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
-	/*virtual*/ std::string getLocation(const std::string &url) const;
-};
-
 ///
 /// LLUrlEntrySL Describes a generic SLURL, e.g., a Url that starts
 /// with secondlife:// (used as a catch-all for cases not matched above)
diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp
index 60275b60bc2..a6922b019b5 100644
--- a/indra/llui/llurlregistry.cpp
+++ b/indra/llui/llurlregistry.cpp
@@ -52,7 +52,6 @@ LLUrlRegistry::LLUrlRegistry()
 	registerUrl(new LLUrlEntryParcel());
 	registerUrl(new LLUrlEntryTeleport());
 	registerUrl(new LLUrlEntryWorldMap());
-	registerUrl(new LLUrlEntryObjectIM());
 	registerUrl(new LLUrlEntryPlace());
 	registerUrl(new LLUrlEntrySL());
 	registerUrl(new LLUrlEntrySLLabel());
diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp
index 0f00078b33c..b227799a223 100644
--- a/indra/newview/llagentlistener.cpp
+++ b/indra/newview/llagentlistener.cpp
@@ -40,7 +40,7 @@ void LLAgentListener::requestTeleport(LLSD const & event_data) const
 		params.append(event_data["y"]);
 		params.append(event_data["z"]);
 		LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, true);
-		// *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "objectim", "parcel", "login", login_refresh", "balance", "chat"
+		// *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "parcel", "login", login_refresh", "balance", "chat"
 		// should we just compose LLCommandHandler and LLDispatchListener?
 	}
 	else
diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp
index a3daca6fa42..9e064d81356 100644
--- a/indra/newview/llurldispatcher.cpp
+++ b/indra/newview/llurldispatcher.cpp
@@ -364,9 +364,9 @@ bool LLURLDispatcher::dispatchRightClick(const std::string& url)
 bool LLURLDispatcher::dispatchFromTextEditor(const std::string& url)
 {
 	// *NOTE: Text editors are considered sources of trusted URLs
-	// in order to make objectim and avatar profile links in chat
-	// history work.  While a malicious resident could chat an app
-	// SLURL, the receiving resident will see it and must affirmatively
+	// in order to make avatar profile links in chat history work.
+	// While a malicious resident could chat an app SLURL, the
+	// receiving resident will see it and must affirmatively
 	// click on it.
 	// *TODO: Make this trust model more refined.  JC
 	const bool trusted_browser = true;
-- 
GitLab


From 40731c7eb89fc6e59b0b872b3c21ffe84913db1d Mon Sep 17 00:00:00 2001
From: Lynx Linden <lynx@lindenlab.com>
Date: Thu, 12 Nov 2009 12:57:34 +0000
Subject: [PATCH 166/557] DEV-2925: Remove a null char at the end of the
 location string.

---
 indra/newview/llviewermessage.cpp | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 6d6fc5f49f2..be3c45059f3 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1964,8 +1964,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			}
 
 			// Build a link to open the object IM info window.
-			std::string location = ll_safe_string((char*)binary_bucket,binary_bucket_size);
-			LLStringUtil::trim(location);
+			std::string location = ll_safe_string((char*)binary_bucket, binary_bucket_size-1);
 
 			LLSD substitutions;
 			substitutions["NAME"] = name;
-- 
GitLab


From b1a81afef6395e136f26e296311ec9b57eef260e Mon Sep 17 00:00:00 2001
From: angela <angela@lindenlab.com>
Date: Thu, 12 Nov 2009 21:17:31 +0800
Subject: [PATCH 167/557] add optional style params in setText function

---
 indra/llui/lltextbase.cpp             | 4 ++--
 indra/llui/lltextbase.h               | 2 +-
 indra/llui/lltextbox.cpp              | 4 ++--
 indra/llui/lltextbox.h                | 2 +-
 indra/llui/lltexteditor.cpp           | 4 ++--
 indra/llui/lltexteditor.h             | 2 +-
 indra/newview/llchatmsgbox.cpp        | 4 ++--
 indra/newview/llchatmsgbox.h          | 2 +-
 indra/newview/llexpandabletextbox.cpp | 4 ++--
 indra/newview/llexpandabletextbox.h   | 2 +-
 10 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 8d36c9c616e..49bd3a2a199 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1445,7 +1445,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
 	}
 }
 
-void LLTextBase::setText(const LLStringExplicit &utf8str)
+void LLTextBase::setText(const LLStringExplicit &utf8str ,const LLStyle::Params& input_params)
 {
 	// clear out the existing text and segments
 	getViewModel()->setDisplay(LLWStringUtil::null);
@@ -1460,7 +1460,7 @@ void LLTextBase::setText(const LLStringExplicit &utf8str)
 	std::string text(utf8str);
 	LLStringUtil::removeCRLF(text);
 
-	appendText(text, false);
+	appendText(text, false, input_params);
 
 	onValueChange(0, getLength());
 }
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 8cae8fde220..d422f1cc8bd 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -135,7 +135,7 @@ class LLTextBase
 
 	// Text accessors
 	// TODO: add optional style parameter
-	virtual void			setText(const LLStringExplicit &utf8str); // uses default style
+	virtual void			setText(const LLStringExplicit &utf8str , const LLStyle::Params& input_params = LLStyle::Params()); // uses default style
 	virtual std::string		getText() const;
 
 	// wide-char versions
diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp
index 00f1d833a30..4c4123cf452 100644
--- a/indra/llui/lltextbox.cpp
+++ b/indra/llui/lltextbox.cpp
@@ -112,12 +112,12 @@ BOOL LLTextBox::handleHover(S32 x, S32 y, MASK mask)
 	return handled;
 }
 
-void LLTextBox::setText(const LLStringExplicit& text)
+void LLTextBox::setText(const LLStringExplicit& text , const LLStyle::Params& input_params )
 {
 	// does string argument insertion
 	mText.assign(text);
 	
-	LLTextBase::setText(mText.getString());
+	LLTextBase::setText(mText.getString(), input_params );
 }
 
 void LLTextBox::setClickedCallback( boost::function<void (void*)> cb, void* userdata /*= NULL */ )
diff --git a/indra/llui/lltextbox.h b/indra/llui/lltextbox.h
index 73f8a7c299e..01b4bfa5ed6 100644
--- a/indra/llui/lltextbox.h
+++ b/indra/llui/lltextbox.h
@@ -58,7 +58,7 @@ class LLTextBox :
 	/*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
 	/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
 
-	/*virtual*/ void setText( const LLStringExplicit& text );
+	/*virtual*/ void setText( const LLStringExplicit& text, const LLStyle::Params& input_params = LLStyle::Params() );
 	
 	void			setRightAlign()							{ mHAlign = LLFontGL::RIGHT; }
 	void			setHAlign( LLFontGL::HAlign align )		{ mHAlign = align; }
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index d136c6b49d6..224f066968e 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -311,12 +311,12 @@ LLTextEditor::~LLTextEditor()
 // LLTextEditor
 // Public methods
 
-void LLTextEditor::setText(const LLStringExplicit &utf8str)
+void LLTextEditor::setText(const LLStringExplicit &utf8str, const LLStyle::Params& input_params)
 {
 	blockUndo();
 	deselect();
 
-	LLTextBase::setText(utf8str);
+	LLTextBase::setText(utf8str, input_params);
 
 	resetDirty();
 }
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index 10fc94dedc1..fb014b86bf8 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -168,7 +168,7 @@ class LLTextEditor :
 
 	void			appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo);
 	// Non-undoable
-	void			setText(const LLStringExplicit &utf8str);
+	void			setText(const LLStringExplicit &utf8str, const LLStyle::Params& input_params = LLStyle::Params());
 
 
 	// Removes text from the end of document
diff --git a/indra/newview/llchatmsgbox.cpp b/indra/newview/llchatmsgbox.cpp
index 12626e3b43b..bb0ec2db27e 100644
--- a/indra/newview/llchatmsgbox.cpp
+++ b/indra/newview/llchatmsgbox.cpp
@@ -84,7 +84,7 @@ LLChatMsgBox::LLChatMsgBox(const Params& p) :
 	mBlockSpacing(p.block_spacing)
 {}
 
-void LLChatMsgBox::addText( const LLStringExplicit& text )
+void LLChatMsgBox::addText( const LLStringExplicit& text , const LLStyle::Params& input_params )
 {
 	S32 length = getLength();
 	// if there is existing text, add a separator
@@ -94,5 +94,5 @@ void LLChatMsgBox::addText( const LLStringExplicit& text )
 		insertSegment(new ChatSeparator(length - 1, length - 1));
 	}
 	// prepend newline only if there is some existing text
-	appendText(text, length > 0);
+	appendText(text, length > 0, input_params);
 }
diff --git a/indra/newview/llchatmsgbox.h b/indra/newview/llchatmsgbox.h
index df29db58c32..9e166167292 100644
--- a/indra/newview/llchatmsgbox.h
+++ b/indra/newview/llchatmsgbox.h
@@ -61,7 +61,7 @@ class LLChatMsgBox :
 	friend class LLUICtrlFactory;
 
 public:
-	void				addText(const LLStringExplicit &text);
+	void				addText(const LLStringExplicit &text, const LLStyle::Params& input_params = LLStyle::Params());
 	
 private:
 	S32					mBlockSpacing;
diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index 424d6353211..6d7da107ac1 100644
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -129,12 +129,12 @@ void LLExpandableTextBox::LLTextBoxEx::reshape(S32 width, S32 height, BOOL calle
 	}
 }
 
-void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text)
+void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,const LLStyle::Params& input_params)
 {
 	// LLTextBox::setText will obliterate the expander segment, so make sure
 	// we generate it again by clearing mExpanderVisible
 	mExpanderVisible = false;
-	LLTextBox::setText(text);
+	LLTextBox::setText(text, input_params);
 
 	// text contents have changed, segments are cleared out
 	// so hide the expander and determine if we need it
diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h
index 3fe646c29c6..7c989cfa50e 100644
--- a/indra/newview/llexpandabletextbox.h
+++ b/indra/newview/llexpandabletextbox.h
@@ -60,7 +60,7 @@ class LLExpandableTextBox : public LLUICtrl
 
 		// adds or removes "More" link as needed
 		/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
-		/*virtual*/ void setText(const LLStringExplicit& text);
+		/*virtual*/ void setText(const LLStringExplicit& text, const LLStyle::Params& input_params = LLStyle::Params());
 
 		/**
 		 * Returns difference between text box height and text height.
-- 
GitLab


From 11fc2da6fa5fba0bb659dd97f8533e4529aece06 Mon Sep 17 00:00:00 2001
From: angela <angela@lindenlab.com>
Date: Thu, 12 Nov 2009 21:20:18 +0800
Subject: [PATCH 168/557] make color and font affecting both nearby chat and
 toasts

---
 indra/llui/lluicolortable.cpp              |  10 +-
 indra/newview/CMakeLists.txt               |   2 +
 indra/newview/llchathistory.cpp            |  12 +-
 indra/newview/llchathistory.h              |   4 +-
 indra/newview/llchatitemscontainerctrl.cpp |  57 +++++-
 indra/newview/llchatitemscontainerctrl.h   |   6 +-
 indra/newview/llimfloater.cpp              |   7 +-
 indra/newview/llnearbychat.cpp             | 107 +----------
 indra/newview/llnearbychat.h               |   6 +-
 indra/newview/llnearbychathandler.cpp      |   9 +-
 indra/newview/llnotificationtiphandler.cpp |   1 +
 indra/newview/llviewerchat.cpp             | 203 +++++++++++++++++++++
 indra/newview/llviewerchat.h               |  53 ++++++
 indra/newview/llviewermessage.cpp          |   9 +-
 14 files changed, 359 insertions(+), 127 deletions(-)
 create mode 100644 indra/newview/llviewerchat.cpp
 create mode 100644 indra/newview/llviewerchat.h

diff --git a/indra/llui/lluicolortable.cpp b/indra/llui/lluicolortable.cpp
index f1e3000547d..9be33483d0b 100644
--- a/indra/llui/lluicolortable.cpp
+++ b/indra/llui/lluicolortable.cpp
@@ -192,19 +192,27 @@ void LLUIColorTable::clear()
 LLUIColor LLUIColorTable::getColor(const std::string& name, const LLColor4& default_color) const
 {
 	string_color_map_t::const_iterator iter = mUserSetColors.find(name);
+	
 	if(iter != mUserSetColors.end())
 	{
 		return LLUIColor(&iter->second);
 	}
 
 	iter = mLoadedColors.find(name);
-	return (iter != mLoadedColors.end() ? LLUIColor(&iter->second) : LLUIColor(default_color));
+	
+	if(iter != mLoadedColors.end())
+	{
+		return LLUIColor(&iter->second);
+	}
+	
+	return  LLUIColor(default_color);
 }
 
 // update user color, loaded colors are parsed on initialization
 void LLUIColorTable::setColor(const std::string& name, const LLColor4& color)
 {
 	setColor(name, color, mUserSetColors);
+	setColor(name, color, mLoadedColors);
 }
 
 bool LLUIColorTable::loadFromSettings()
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 13c381edaec..eb4e914e701 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -445,6 +445,7 @@ set(viewer_SOURCE_FILES
     llviewerassettype.cpp
     llvieweraudio.cpp
     llviewercamera.cpp
+	llviewerchat.cpp
     llviewercontrol.cpp
     llviewercontrollistener.cpp
     llviewerdisplay.cpp
@@ -942,6 +943,7 @@ set(viewer_HEADER_FILES
     llvieweraudio.h
     llviewerbuild.h
     llviewercamera.h
+	llviewerchat.h
     llviewercontrol.h
     llviewercontrollistener.h
     llviewerdisplay.h
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 2ccd6b7d350..cc014e3c288 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -330,7 +330,7 @@ LLView* LLChatHistory::getHeader(const LLChat& chat)
 	return header;
 }
 
-void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& style_params)
+void LLChatHistory::appendWidgetMessage(const LLChat& chat)
 {
 	LLView* view = NULL;
 	std::string view_text;
@@ -370,7 +370,17 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& sty
 	appendWidget(p, view_text, false);
 
 	//Append the text message
+	
+	LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
+	LLViewerChat::getChatColor(chat,txt_color);
+	LLFontGL* fontp = LLViewerChat::getChatFont();
+	
 	std::string message = chat.mText + '\n';
+	
+	LLStyle::Params style_params;
+	style_params.color(txt_color);
+	style_params.font(fontp);
+	
 	appendText(message, FALSE, style_params);
 
 	mLastFromName = chat.mFromName;
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index 3789ebff4e9..891d9c6c77a 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -34,7 +34,7 @@
 #define LLCHATHISTORY_H_
 
 #include "lltexteditor.h"
-#include "llchat.h"
+#include "llviewerchat.h"
 
 //Chat log widget allowing addition of a message as a widget 
 class LLChatHistory : public LLTextEditor
@@ -111,7 +111,7 @@ class LLChatHistory : public LLTextEditor
 		 * @param time time of a message.
 		 * @param message message itself.
 		 */
-		void appendWidgetMessage(const LLChat& chat, LLStyle::Params& style_params);
+		void appendWidgetMessage(const LLChat& chat);
 
 	private:
 		std::string mLastFromName;
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 63b9fd8e66c..d2e3247250b 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -120,10 +120,10 @@ std::string LLNearbyChatToastPanel::appendTime()
 
 
 
-void	LLNearbyChatToastPanel::addText		(const std::string& message)
+void	LLNearbyChatToastPanel::addText	(const std::string& message , const LLStyle::Params& input_params)
 {
 	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
-	msg_text->addText(message);
+	msg_text->addText(message , input_params);
 	mMessages.push_back(message);
 }
 
@@ -134,9 +134,34 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
 	mText = notification["message"].asString();		// UTF-8 line of text
 	mFromName = notification["from"].asString();	// agent or object name
 	mFromID = notification["from_id"].asUUID();		// agent id or object id
+	
 	int sType = notification["source"].asInteger();
     mSourceType = (EChatSourceType)sType;
-
+	
+	std::string color_name = notification["text_color"].asString();
+	
+	mTextColor = LLUIColorTable::instance().getColor(color_name);
+	mTextColor.mV[VALPHA] =notification["color_alpha"].asReal();
+	
+	S32 font_size = notification["font_size"].asInteger();
+	switch(font_size)
+	{
+		case 0:
+			mFont = LLFontGL::getFontSansSerifSmall();
+			break;
+		default:
+		case 1:
+			mFont = LLFontGL::getFontSansSerif();
+			break;
+		case 2:
+			mFont = LLFontGL::getFontSansSerifBig();
+			break;
+	}
+	
+	LLStyle::Params style_params;
+	style_params.color(mTextColor);
+	style_params.font(mFont);
+	
 	std::string str_sender;
 
 	if(gAgentID != mFromID)
@@ -144,13 +169,13 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
 	else
 		str_sender = LLTrans::getString("You");;
 
-	caption->getChild<LLTextBox>("sender_name", false)->setText(str_sender);
+	caption->getChild<LLTextBox>("sender_name", false)->setText(str_sender , style_params);
 	
-	caption->getChild<LLTextBox>("msg_time", false)->setText(appendTime());
+	caption->getChild<LLTextBox>("msg_time", false)->setText(appendTime() , style_params );
 
 
 	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
-	msg_text->setText(mText);
+	msg_text->setText(mText, style_params);
 
 	LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector");
 	if(mSourceType != CHAT_SOURCE_AGENT)
@@ -171,7 +196,15 @@ void	LLNearbyChatToastPanel::setMessage	(const LLChat& chat_msg)
 	notification["from_id"] = chat_msg.mFromID;
 	notification["time"] = chat_msg.mTime;
 	notification["source"] = (S32)chat_msg.mSourceType;
-
+	
+	std::string r_color_name="White";
+	F32 r_color_alpha = 1.0f; 
+	LLViewerChat::getChatColor( chat_msg, r_color_name, r_color_alpha);
+	
+	notification["text_color"] = r_color_name;
+	notification["color_alpha"] = r_color_alpha;
+	
+	notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ;
 	init(notification);
 
 }
@@ -201,11 +234,17 @@ void	LLNearbyChatToastPanel::setWidth(S32 width)
 	text_box->reshape(width - msg_left_offset - msg_right_offset,100/*its not magic number, we just need any number*/);
 
 	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
+	
+	LLStyle::Params style_params;
+	style_params.color(mTextColor);
+	style_params.font(mFont);
+	
+	
 	if(mText.length())
-		msg_text->setText(mText);
+		msg_text->setText(mText, style_params);
 	
 	for(size_t i=0;i<mMessages.size();++i)
-		msg_text->addText(mMessages[i]);
+		msg_text->addText(mMessages[i] , style_params);
 
 	setRect(LLRect(getRect().mLeft, getRect().mTop, getRect().mLeft + width	, getRect().mBottom));
 	snapToMessageHeight	();
diff --git a/indra/newview/llchatitemscontainerctrl.h b/indra/newview/llchatitemscontainerctrl.h
index 8fb045b6d91..a65bfedd096 100644
--- a/indra/newview/llchatitemscontainerctrl.h
+++ b/indra/newview/llchatitemscontainerctrl.h
@@ -36,7 +36,7 @@
 #include "llpanel.h"
 #include "llscrollbar.h"
 #include "string"
-#include "llchat.h"
+#include "llviewerchat.h"
 #include "lltoastpanel.h"
 
 typedef enum e_show_item_header
@@ -59,7 +59,7 @@ class LLNearbyChatToastPanel: public LLToastPanelBase
 
 	const LLUUID& getFromID() const { return mFromID;}
 	
-	void	addText		(const std::string& message);
+	void	addText		(const std::string& message ,  const LLStyle::Params& input_params = LLStyle::Params());
 	void	setMessage	(const LLChat& msg);
 	void	setWidth		(S32 width);
 	void	snapToMessageHeight	();
@@ -89,6 +89,8 @@ class LLNearbyChatToastPanel: public LLToastPanelBase
 	std::string		mFromName;	// agent or object name
 	LLUUID			mFromID;	// agent id or object id
 	EChatSourceType	mSourceType;
+	LLColor4        mTextColor;
+	LLFontGL*       mFont;
 
 
 	std::vector<std::string> mMessages;
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 5a2331aa06a..2504e1e9168 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -463,7 +463,7 @@ void LLIMFloater::updateMessages()
 
 	if (messages.size())
 	{
-		LLUIColor chat_color = LLUIColorTable::instance().getColor("IMChatColor");
+//		LLUIColor chat_color = LLUIColorTable::instance().getColor("IMChatColor");
 
 		std::ostringstream message;
 		std::list<LLSD>::const_reverse_iterator iter = messages.rbegin();
@@ -476,14 +476,11 @@ void LLIMFloater::updateMessages()
 			LLUUID from_id = msg["from_id"].asUUID();
 			std::string from = from_id != gAgentID ? msg["from"].asString() : LLTrans::getString("You");
 			std::string message = msg["message"].asString();
-			LLStyle::Params style_params;
-			style_params.color(chat_color);
 
 			LLChat chat(message);
 			chat.mFromID = from_id;
 			chat.mFromName = from;
-
-			mChatHistory->appendWidgetMessage(chat, style_params);
+			mChatHistory->appendWidgetMessage(chat);
 
 			mLastMessageIndex = msg["index"].asInteger();
 		}
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index ac806d7106a..85db69174d9 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -132,120 +132,31 @@ void    LLNearbyChat::applySavedVariables()
 	}
 }
 
-LLColor4 nearbychat_get_text_color(const LLChat& chat)
-{
-	LLColor4 text_color;
-
-	if(chat.mMuted)
-	{
-		text_color.setVec(0.8f, 0.8f, 0.8f, 1.f);
-	}
-	else
-	{
-		switch(chat.mSourceType)
-		{
-		case CHAT_SOURCE_SYSTEM:
-			text_color = LLUIColorTable::instance().getColor("SystemChatColor"); 
-			break;
-		case CHAT_SOURCE_AGENT:
-		    if (chat.mFromID.isNull())
-			{
-				text_color = LLUIColorTable::instance().getColor("SystemChatColor");
-			}
-			else
-			{
-				if(gAgentID == chat.mFromID)
-				{
-					text_color = LLUIColorTable::instance().getColor("UserChatColor");
-				}
-				else
-				{
-					text_color = LLUIColorTable::instance().getColor("AgentChatColor");
-				}
-			}
-			break;
-		case CHAT_SOURCE_OBJECT:
-			if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
-			{
-				text_color = LLUIColorTable::instance().getColor("ScriptErrorColor");
-			}
-			else if ( chat.mChatType == CHAT_TYPE_OWNER )
-			{
-				text_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor");
-			}
-			else
-			{
-				text_color = LLUIColorTable::instance().getColor("ObjectChatColor");
-			}
-			break;
-		default:
-			text_color.setToWhite();
-		}
-
-		if (!chat.mPosAgent.isExactlyZero())
-		{
-			LLVector3 pos_agent = gAgent.getPositionAgent();
-			F32 distance = dist_vec(pos_agent, chat.mPosAgent);
-			if (distance > gAgent.getNearChatRadius())
-			{
-				// diminish far-off chat
-				text_color.mV[VALPHA] = 0.8f;
-			}
-		}
-	}
-
-	return text_color;
-}
-
-void LLNearbyChat::add_timestamped_line(const LLChat& chat, const LLColor4& color)
-{
-	S32 font_size = gSavedSettings.getS32("ChatFontSize");
-
-	const LLFontGL* fontp = NULL;
-	switch(font_size)
-	{
-	case 0:
-		fontp = LLFontGL::getFontSansSerifSmall();
-		break;
-	default:
-	case 1:
-		fontp = LLFontGL::getFontSansSerif();
-		break;
-	case 2:
-		fontp = LLFontGL::getFontSansSerifBig();
-		break;
-	}
-
-	LLStyle::Params style_params;
-	style_params.color(color);
-	style_params.font(fontp);
-	LLUUID uuid = chat.mFromID;
-	std::string from = chat.mFromName;
-	std::string message = chat.mText;
-	mChatHistory->appendWidgetMessage(chat, style_params);
-}
-
 void	LLNearbyChat::addMessage(const LLChat& chat)
 {
-	LLColor4 color = nearbychat_get_text_color(chat);
-	
 	if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
 	{
 		if(gSavedSettings.getBOOL("ShowScriptErrors") == FALSE)
 			return;
 		if (gSavedSettings.getS32("ShowScriptErrorsLocation")== 1)// show error in window //("ScriptErrorsAsChat"))
 		{
+
+			LLColor4 txt_color;
+
+			LLViewerChat::getChatColor(chat,txt_color);
+			
 			LLFloaterScriptDebug::addScriptLine(chat.mText,
 												chat.mFromName, 
-												color, 
+												txt_color, 
 												chat.mFromID);
 			return;
 		}
 	}
 	
-	// could flash the chat button in the status bar here. JC
 	if (!chat.mMuted)
-		add_timestamped_line(chat, color);
+	{
+		mChatHistory->appendWidgetMessage(chat);
+	}
 }
 
 void LLNearbyChat::onNearbySpeakers()
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
index cb4654654a9..3303c388afe 100644
--- a/indra/newview/llnearbychat.h
+++ b/indra/newview/llnearbychat.h
@@ -35,7 +35,7 @@
 
 #include "lldockablefloater.h"
 #include "llscrollbar.h"
-#include "llchat.h"
+#include "llviewerchat.h"
 
 class LLResizeBar;
 class LLChatHistory;
@@ -47,8 +47,7 @@ class LLNearbyChat: public LLDockableFloater
 	~LLNearbyChat();
 
 	BOOL	postBuild			();
-	void	addMessage			(const LLChat& message);
-	
+	void	addMessage			(const LLChat& message);	
 	void	onNearbyChatContextMenuItemClicked(const LLSD& userdata);
 	bool	onNearbyChatCheckContextMenuItem(const LLSD& userdata);
 
@@ -64,7 +63,6 @@ class LLNearbyChat: public LLDockableFloater
 	void	getAllowedRect		(LLRect& rect);
 
 	void	onNearbySpeakers	();
-	void	add_timestamped_line(const LLChat& chat, const LLColor4& color);
 	
 
 private:
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index e10c506f086..d1cd92ad68b 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -351,7 +351,14 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg)
 		notification["time"] = chat_msg.mTime;
 		notification["source"] = (S32)chat_msg.mSourceType;
 		notification["chat_type"] = (S32)chat_msg.mChatType;
-
+		
+		std::string r_color_name = "White";
+		F32 r_color_alpha = 1.0f; 
+		LLViewerChat::getChatColor( chat_msg, r_color_name, r_color_alpha);
+		
+		notification["text_color"] = r_color_name;
+		notification["color_alpha"] = r_color_alpha;
+		notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ;
 		channel->addNotification(notification);	
 	}
 	
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index 823c92a94e3..60a27d51544 100644
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -91,6 +91,7 @@ bool LLTipHandler::processNotification(const LLSD& notify)
 		if(nearby_chat)
 		{
 			LLChat chat_msg(notification->getMessage());
+			chat_msg.mSourceType = CHAT_SOURCE_SYSTEM;
 			nearby_chat->addMessage(chat_msg);
 
 			// don't show toast if Nearby Chat is opened
diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp
new file mode 100644
index 00000000000..d65a060bbc1
--- /dev/null
+++ b/indra/newview/llviewerchat.cpp
@@ -0,0 +1,203 @@
+/** 
+ * @file llviewerchat.cpp
+ * @brief Builds menus out of items.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llviewerchat.h" 
+
+// newview includes
+#include "llagent.h" 	// gAgent		
+#include "lluicolortable.h"
+#include "llviewercontrol.h" // gSavedSettings
+
+// LLViewerChat
+
+//static 
+void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color)
+{
+	if(chat.mMuted)
+	{
+		r_color= LLUIColorTable::instance().getColor("LtGray");
+	}
+	else
+	{
+		switch(chat.mSourceType)
+		{
+			case CHAT_SOURCE_SYSTEM:
+				r_color = LLUIColorTable::instance().getColor("SystemChatColor"); 
+				break;
+			case CHAT_SOURCE_AGENT:
+				if (chat.mFromID.isNull())
+				{
+					r_color = LLUIColorTable::instance().getColor("SystemChatColor");
+				}
+				else
+				{
+					if(gAgentID == chat.mFromID)
+					{
+						r_color = LLUIColorTable::instance().getColor("UserChatColor");
+					}
+					else
+					{
+						r_color = LLUIColorTable::instance().getColor("AgentChatColor");
+					}
+				}
+				break;
+			case CHAT_SOURCE_OBJECT:
+				if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
+				{
+					r_color = LLUIColorTable::instance().getColor("ScriptErrorColor");
+				}
+				else if ( chat.mChatType == CHAT_TYPE_OWNER )
+				{
+					r_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor");
+				}
+				else
+				{
+					r_color = LLUIColorTable::instance().getColor("ObjectChatColor");
+				}
+				break;
+			default:
+				r_color.setToWhite();
+		}
+		
+		if (!chat.mPosAgent.isExactlyZero())
+		{
+			LLVector3 pos_agent = gAgent.getPositionAgent();
+			F32 distance = dist_vec(pos_agent, chat.mPosAgent);
+			if (distance > gAgent.getNearChatRadius())
+			{
+				// diminish far-off chat
+				r_color.mV[VALPHA] = 0.8f;
+			}
+		}
+	}
+}
+
+
+//static 
+void LLViewerChat::getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha)
+{
+	if(chat.mMuted)
+	{
+		r_color_name = "LtGray";
+	}
+	else
+	{
+		switch(chat.mSourceType)
+		{
+			case CHAT_SOURCE_SYSTEM:
+				r_color_name = "SystemChatColor";
+				break;
+				
+			case CHAT_SOURCE_AGENT:
+				if (chat.mFromID.isNull())
+				{
+					r_color_name = "SystemChatColor";
+				}
+				else
+				{
+					if(gAgentID == chat.mFromID)
+					{
+						r_color_name = "UserChatColor";
+					}
+					else
+					{
+						r_color_name = "AgentChatColor";
+					}
+				}
+				break;
+				
+			case CHAT_SOURCE_OBJECT:
+				if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
+				{
+					r_color_name = "ScriptErrorColor";
+				}
+				else if ( chat.mChatType == CHAT_TYPE_OWNER )
+				{
+					r_color_name = "llOwnerSayChatColor";
+				}
+				else
+				{
+					r_color_name = "ObjectChatColor";
+				}
+				break;
+			default:
+				r_color_name = "White";
+		}
+		
+		if (!chat.mPosAgent.isExactlyZero())
+		{
+			LLVector3 pos_agent = gAgent.getPositionAgent();
+			F32 distance = dist_vec(pos_agent, chat.mPosAgent);
+			if (distance > gAgent.getNearChatRadius())
+			{
+				// diminish far-off chat
+				r_color_alpha = 0.8f; 
+			}
+			else
+			{
+				r_color_alpha = 1.0f;
+			}
+		}
+	}
+	
+}
+
+
+//static 
+LLFontGL* LLViewerChat::getChatFont()
+{
+	S32 font_size = gSavedSettings.getS32("ChatFontSize");
+	LLFontGL* fontp = NULL;
+	switch(font_size)
+	{
+		case 0:
+			fontp = LLFontGL::getFontSansSerifSmall();
+			break;
+		default:
+		case 1:
+			fontp = LLFontGL::getFontSansSerif();
+			break;
+		case 2:
+			fontp = LLFontGL::getFontSansSerifBig();
+			break;
+	}
+	
+	return fontp;
+	
+}
+
+//static
+S32 LLViewerChat::getChatFontSize()
+{
+	return gSavedSettings.getS32("ChatFontSize");
+}
diff --git a/indra/newview/llviewerchat.h b/indra/newview/llviewerchat.h
new file mode 100644
index 00000000000..d8840d5dd24
--- /dev/null
+++ b/indra/newview/llviewerchat.h
@@ -0,0 +1,53 @@
+/** 
+ * @file llviewerchat.h
+ * @brief wrapper of LLChat in viewer
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLVIEWERCHAT_H
+#define LL_LLVIEWERCHAT_H
+
+#include "llchat.h"
+#include "llfontgl.h"
+#include "v4color.h"
+
+
+class LLViewerChat 
+{
+public:
+	static void getChatColor(const LLChat& chat, LLColor4& r_color);
+	static void getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha);
+	static LLFontGL* getChatFont();
+	static S32 getChatFontSize();
+	
+
+
+};
+
+#endif
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index a90790c59a8..921868d4489 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -43,7 +43,7 @@
 #include "llfloaterbump.h"
 #include "llassetstorage.h"
 #include "llcachename.h"
-#include "llchat.h"
+
 #include "lldbstrings.h"
 #include "lleconomy.h"
 #include "llfilepicker.h"
@@ -115,6 +115,7 @@
 #include "llui.h"			// for make_ui_sound
 #include "lluploaddialog.h"
 #include "llviewercamera.h"
+#include "llviewerchat.h"
 #include "llviewergenericmessage.h"
 #include "llviewerinventory.h"
 #include "llviewermenu.h"
@@ -2232,7 +2233,7 @@ void process_decline_callingcard(LLMessageSystem* msg, void**)
 
 void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
 {
-	LLChat		chat;
+	LLChat	chat;
 	std::string		mesg;
 	std::string		from_name;
 	U8			source_temp;
@@ -2832,7 +2833,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
 			// Chat the "back" SLURL. (DEV-4907)
 			LLChat chat("Teleport completed from " + gAgent.getTeleportSourceSLURL());
 			chat.mSourceType = CHAT_SOURCE_SYSTEM;
- 			LLFloaterChat::addChatHistory(chat);
+ 		    LLFloaterChat::addChatHistory(chat);
 
 			// Set the new position
 			avatarp->setPositionAgent(agent_pos);
@@ -4604,7 +4605,7 @@ void notify_cautioned_script_question(const LLSD& notification, const LLSD& resp
 		if (caution)
 		{
 			LLChat chat(notice.getString());
-			LLFloaterChat::addChat(chat, FALSE, FALSE);
+	//		LLFloaterChat::addChat(chat, FALSE, FALSE);
 		}
 	}
 }
-- 
GitLab


From 2e01e2bfbd52aa599e8faa5f65b8861f989bee85 Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Thu, 12 Nov 2009 15:24:58 +0200
Subject: [PATCH 169/557] no ticket, fixed IM message counting and firing new
 message balloon

--HG--
branch : product-engine
---
 indra/newview/llchiclet.cpp | 7 ++++++-
 indra/newview/llimview.cpp  | 6 +-----
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index b919195fb21..b5119790c04 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -830,8 +830,13 @@ LLChicletPanel::~LLChicletPanel()
 void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){
 	
 	LLUUID session_id = data["session_id"].asUUID();
-	S32 unread = data["num_unread"].asInteger();
+	LLUUID from_id = data["from_id"].asUUID();
+	const std::string from = data["from"].asString();
+
+	//we do not show balloon (indicator of new messages) for system messages and our own messages
+	if (from_id.isNull() || from_id == gAgentID || SYSTEM_FROM == from) return;
 
+	S32 unread = data["num_unread"].asInteger();
 	LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
 	if (im_floater && im_floater->getVisible())
 	{
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index be5fbdbbf8f..9c38d9c5fc3 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -439,11 +439,7 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co
 	addToHistory(session_id, from, from_id, utf8_text);
 	if (log2file) logToFile(session_id, from, from_id, utf8_text);
 
-	//we do not count system messages and our messages
-	if (from_id.notNull() && from_id != gAgentID && SYSTEM_FROM != from)
-	{
-		session->mNumUnread++;
-	}
+	session->mNumUnread++;
 
 	// notify listeners
 	LLSD arg;
-- 
GitLab


From 095a3d4372bd755c2fbe6bccf1bc25255d59b5ca Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Thu, 12 Nov 2009 13:33:54 +0000
Subject: [PATCH 170/557] more mimicking of the good parts of the
 incoming_floater!

---
 indra/newview/llimview.cpp                    | 117 +++---------------
 indra/newview/llimview.h                      |   3 +-
 .../default/xui/en/floater_outgoing_call.xml  |   2 +-
 3 files changed, 18 insertions(+), 104 deletions(-)

diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 23767d119d3..969e887a897 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1096,14 +1096,27 @@ LLIMMgr::onConfirmForceCloseError(
 // Class LLOutgoingCallDialog
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 LLOutgoingCallDialog::LLOutgoingCallDialog(const LLSD& payload) :
-	LLDockableFloater(NULL, payload),
+	LLDockableFloater(NULL, false, payload),
 	mPayload(payload)
 {
 }
 
+void LLOutgoingCallDialog::getAllowedRect(LLRect& rect)
+{
+	rect = gViewerWindow->getWorldViewRectRaw();
+}
+
+void LLOutgoingCallDialog::onOpen(const LLSD& key)
+{
+	// dock the dialog to the sys well, where other sys messages appear
+	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
+					 this, getDockTongue(), LLDockControl::TOP,
+					 boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1)));
+}
+
 BOOL LLOutgoingCallDialog::postBuild()
 {
-	BOOL success = LLFloater::postBuild();
+	BOOL success = LLDockableFloater::postBuild();
 
 	LLSD callee_id = mPayload["session_id"];//mPayload["caller_id"];
 
@@ -1127,106 +1140,6 @@ BOOL LLOutgoingCallDialog::postBuild()
 	return success;
 }
 
-void LLOutgoingCallDialog::processCallResponse(S32 response)
-{
-	if (!gIMMgr)
-		return;
-
-	LLUUID session_id = mPayload["session_id"].asUUID();
-	EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
-	LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)mPayload["inv_type"].asInteger();
-	bool voice = true;
-	switch(response)
-	{
-	case 2: // start IM: just don't start the voice chat
-	{
-		voice = false;
-		/* FALLTHROUGH */
-	}
-	case 0: // accept
-	{
-		if (type == IM_SESSION_P2P_INVITE)
-		{
-			// create a normal IM session
-			session_id = gIMMgr->addP2PSession(
-				mPayload["session_name"].asString(),
-				mPayload["caller_id"].asUUID(),
-				mPayload["session_handle"].asString());
-
-			if (voice)
-			{
-				if (gIMMgr->startCall(session_id))
-				{
-					// always open IM window when connecting to voice
-					LLIMFloater::show(session_id);
-				}
-			}
-
-			gIMMgr->clearPendingAgentListUpdates(session_id);
-			gIMMgr->clearPendingInvitation(session_id);
-		}
-		else
-		{
-			LLUUID session_id = gIMMgr->addSession(
-				mPayload["session_name"].asString(),
-				type,
-				session_id);
-			if (session_id != LLUUID::null)
-			{
-				LLIMFloater::show(session_id);
-			}
-
-			std::string url = gAgent.getRegion()->getCapability(
-				"ChatSessionRequest");
-
-			if (voice)
-			{
-				LLSD data;
-				data["method"] = "accept invitation";
-				data["session-id"] = session_id;
-				LLHTTPClient::post(
-					url,
-					data,
-					new LLViewerChatterBoxInvitationAcceptResponder(
-						session_id,
-						inv_type));
-			}
-		}
-		if (voice)
-		{
-			break;
-		}
-	}
-	case 1: // decline
-	{
-		if (type == IM_SESSION_P2P_INVITE)
-		{
-			if(gVoiceClient)
-			{
-				std::string s = mPayload["session_handle"].asString();
-				gVoiceClient->declineInvite(s);
-			}
-		}
-		else
-		{
-			std::string url = gAgent.getRegion()->getCapability(
-				"ChatSessionRequest");
-
-			LLSD data;
-			data["method"] = "decline invitation";
-			data["session-id"] = session_id;
-			LLHTTPClient::post(
-				url,
-				data,
-				NULL);
-		}
-	}
-
-	gIMMgr->clearPendingAgentListUpdates(session_id);
-	gIMMgr->clearPendingInvitation(session_id);
-	}
-}
-
 
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index b6e0c87dcf6..510b5b8b694 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -428,9 +428,10 @@ class LLOutgoingCallDialog : public LLDockableFloater
 	LLOutgoingCallDialog(const LLSD& payload);
 
 	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void onOpen(const LLSD& key);
 
 private:
-	void processCallResponse(S32 response);
+	void getAllowedRect(LLRect& rect);
 
 	LLSD mPayload;
 };
diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
index c30814c881b..3433d959142 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -44,7 +44,7 @@
      height="20"
      layout="topleft"
      left="77"
-     name="caller name"
+     name="callee name"
      top="27"
      width="315"
      word_wrap="true" />
-- 
GitLab


From 79e6171b266f15e5d332e7eacdc9807add48f0da Mon Sep 17 00:00:00 2001
From: Lynx Linden <lynx@lindenlab.com>
Date: Thu, 12 Nov 2009 13:50:03 +0000
Subject: [PATCH 171/557] EXT-2363: Rename 'Friends Conference' to 'Ad-hoc
 Conference'

---
 indra/newview/skins/default/xui/en/strings.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index ea66bfa197f..761c17cfd28 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2863,7 +2863,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
     Connecting...
   </string>
   <string name="conference-title">
-    Friends Conference
+    Ad-hoc Conference
   </string>
   <string name="inventory_item_offered-im">
     Inventory item offered
-- 
GitLab


From 7cf3008da7c44c592af14de7498cf4270afcec31 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Thu, 12 Nov 2009 14:15:19 +0000
Subject: [PATCH 172/557] more work on the outgoing call popup...

---
 indra/newview/llimview.cpp                    | 20 +++++++++++-----
 indra/newview/llvoicechannel.cpp              | 23 +++++++++++--------
 indra/newview/llvoiceclient.cpp               |  2 +-
 .../default/xui/en/floater_outgoing_call.xml  | 14 +++++------
 4 files changed, 35 insertions(+), 24 deletions(-)

diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 969e887a897..9c8365930c2 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1108,6 +1108,17 @@ void LLOutgoingCallDialog::getAllowedRect(LLRect& rect)
 
 void LLOutgoingCallDialog::onOpen(const LLSD& key)
 {
+	// prepare to tell the user which voice channel they would be leaving
+	LLVoiceChannel *voice = LLVoiceChannel::getCurrentVoiceChannel();
+	if (voice && !voice->getSessionName().empty())
+	{
+		childSetTextArg("leaving", "[CURRENT_CHAT]", voice->getSessionName());
+	}
+	else
+	{
+		childSetTextArg("leaving", "[CURRENT_CHAT]", getString("localchat"));
+	}
+
 	// dock the dialog to the sys well, where other sys messages appear
 	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
 					 this, getDockTongue(), LLDockControl::TOP,
@@ -1118,10 +1129,9 @@ BOOL LLOutgoingCallDialog::postBuild()
 {
 	BOOL success = LLDockableFloater::postBuild();
 
-	LLSD callee_id = mPayload["session_id"];//mPayload["caller_id"];
+	LLSD callee_id = mPayload["other_user_id"];
 
-	std::string calling_str = getString("calling");
-	std::string callee_name = mPayload["session_name"].asString();//mPayload["caller_name"].asString();
+	std::string callee_name = mPayload["session_name"].asString();
 	if (callee_name == "anonymous")
 	{
 		callee_name = getString("anonymous");
@@ -1129,9 +1139,7 @@ BOOL LLOutgoingCallDialog::postBuild()
 	
 	setTitle(callee_name);
 
-	LLUICtrl* callee_name_widget = getChild<LLUICtrl>("callee name");
-	// *TODO: substitute callee name properly
-	callee_name_widget->setValue(calling_str + " " + callee_name);
+	childSetTextArg("calling", "[CALLEE_NAME]", callee_name);
 	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
 	icon->setValue(callee_id);
 
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index b0ea07946c2..164cb1a51ab 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -378,18 +378,9 @@ void LLVoiceChannel::setURI(std::string uri)
 
 void LLVoiceChannel::setState(EState state)
 {
-	LLSD payload;
-	payload["session_id"] = mSessionID;
-	payload["session_name"] = mSessionName;
-
 	switch(state)
 	{
 	case STATE_RINGING:
-		llinfos << "RINGINGGGGGGGG " << mSessionName << llendl;
-		if (!mSessionName.empty())
-		{
-			LLFloaterReg::showInstance("outgoing_call", payload, TRUE);
-		}		
 		gIMMgr->addSystemMessage(mSessionID, "ringing", mNotifyArgs);
 		break;
 	case STATE_CONNECTED:
@@ -879,6 +870,20 @@ void LLVoiceChannelP2P::setState(EState state)
 {
 	// HACK: Open/close the call window if needed.
 	toggleCallWindowIfNeeded(state);
+	
+	// *HACK: open outgoing call floater if needed, might be better done elsewhere.
+	LLSD payload;
+	payload["session_id"] = mSessionID;
+	payload["session_name"] = mSessionName;
+	payload["other_user_id"] = mOtherUserID;
+	if (!mReceivedCall && state == STATE_RINGING)
+	{
+		llinfos << "RINGINGGGGGGGG " << mSessionName << llendl;
+		if (!mSessionName.empty())
+		{
+			LLFloaterReg::showInstance("outgoing_call", payload, TRUE);
+		}
+	}
 
 	// you only "answer" voice invites in p2p mode
 	// so provide a special purpose message here
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 39d4bb0c029..fe24c300228 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -4273,7 +4273,7 @@ void LLVoiceClient::mediaStreamUpdatedEvent(
 				if(incoming)
 				{
 					// Send the voice chat invite to the GUI layer
-					// TODO: Question: Should we correlate with the mute list here?
+					// *TODO: Question: Should we correlate with the mute list here?
 					session->mIMSessionID = LLIMMgr::computeSessionID(IM_SESSION_P2P_INVITE, session->mCallerID);
 					session->mVoiceInvitePending = true;
 					if(session->mName.empty())
diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
index 3433d959142..3d0a86de344 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -14,10 +14,6 @@
      name="localchat">
         Local Voice Chat
     </floater.string>
-    <floater.string
-     name="calling">
-        Calling [CALLEE]
-    </floater.string>
     <floater.string
      name="anonymous">
         anonymous
@@ -44,20 +40,22 @@
      height="20"
      layout="topleft"
      left="77"
-     name="callee name"
+     name="calling"
      top="27"
      width="315"
-     word_wrap="true" />
+     word_wrap="true">
+Calling [CALLEE_NAME]
+    </text>
     <text
      font="SansSerif"
      height="50"
      layout="topleft"
      left="77"
-     name="question"
+     name="leaving"
      top="52"
      width="315"
      word_wrap="true">
-     Do you want to leave [CURRENT_CHAT] and join this voice chat?
+Leaving [CURRENT_CHAT].
     </text>
     <button
      height="24"
-- 
GitLab


From c2b227c93973edc786c3f42772e06cd1760b610e Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Thu, 12 Nov 2009 14:28:57 +0000
Subject: [PATCH 173/557] more inching towards outgoing call popup goodness...

---
 indra/newview/llimview.cpp | 23 +++++++++++------------
 1 file changed, 11 insertions(+), 12 deletions(-)

diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 9c8365930c2..9175d0c91c1 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1119,18 +1119,6 @@ void LLOutgoingCallDialog::onOpen(const LLSD& key)
 		childSetTextArg("leaving", "[CURRENT_CHAT]", getString("localchat"));
 	}
 
-	// dock the dialog to the sys well, where other sys messages appear
-	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
-					 this, getDockTongue(), LLDockControl::TOP,
-					 boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1)));
-}
-
-BOOL LLOutgoingCallDialog::postBuild()
-{
-	BOOL success = LLDockableFloater::postBuild();
-
-	LLSD callee_id = mPayload["other_user_id"];
-
 	std::string callee_name = mPayload["session_name"].asString();
 	if (callee_name == "anonymous")
 	{
@@ -1139,10 +1127,21 @@ BOOL LLOutgoingCallDialog::postBuild()
 	
 	setTitle(callee_name);
 
+	LLSD callee_id = mPayload["other_user_id"];
 	childSetTextArg("calling", "[CALLEE_NAME]", callee_name);
 	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
 	icon->setValue(callee_id);
 
+	// dock the dialog to the sys well, where other sys messages appear
+	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
+					 this, getDockTongue(), LLDockControl::TOP,
+					 boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1)));
+}
+
+BOOL LLOutgoingCallDialog::postBuild()
+{
+	BOOL success = LLDockableFloater::postBuild();
+
 	//childSetAction("Reject", onReject, this);
 
 	return success;
-- 
GitLab


From 4d616fdfaebca4aedce84f5d694dcd495ac4222c Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Thu, 12 Nov 2009 16:46:44 +0200
Subject: [PATCH 174/557] no ticket, removed misleading warning message about
 supposedly non-existent session

--HG--
branch : product-engine
---
 indra/newview/llimfloater.cpp | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 5ea900e46d9..059912d5d4f 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -120,11 +120,7 @@ void LLIMFloater::newIMCallback(const LLSD& data){
 		LLUUID session_id = data["session_id"].asUUID();
 
 		LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
-		if (floater == NULL)
-		{
-			llwarns << "new_im_callback for non-existent session_id " << session_id << llendl;
-			return;
-		}
+		if (floater == NULL) return;
 
         // update if visible, otherwise will be updated when opened
 		if (floater->getVisible())
-- 
GitLab


From b4a3b65a602ad56baf761a8426093eda585bc572 Mon Sep 17 00:00:00 2001
From: angela <angela@lindenlab.com>
Date: Thu, 12 Nov 2009 23:02:41 +0800
Subject: [PATCH 175/557] fix merge error

---
 indra/newview/llchathistory.cpp | 24 +++++++++++++-----------
 1 file changed, 13 insertions(+), 11 deletions(-)

diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 6d8d11ad2b4..2b050f3eb5c 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -338,11 +338,22 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat)
 	LLView* view = NULL;
 	std::string view_text = "\n[" + formatCurrentTime() + "] " + chat.mFromName + ": ";
 
+
 	LLInlineViewSegment::Params p;
 	p.force_newline = true;
 	p.left_pad = mLeftWidgetPad;
 	p.right_pad = mRightWidgetPad;
 
+	
+	LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
+	LLViewerChat::getChatColor(chat,txt_color);
+	LLFontGL* fontp = LLViewerChat::getChatFont();
+	
+	LLStyle::Params style_params;
+	style_params.color(txt_color);
+	style_params.font(fontp);
+
+	
 	if (mLastFromName == chat.mFromName)
 	{
 		view = getSeparator();
@@ -357,6 +368,7 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat)
 		else
 			p.top_pad = mTopHeaderPad;
 		p.bottom_pad = mBottomHeaderPad;
+		
 	}
 	p.view = view;
 
@@ -371,18 +383,8 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat)
 	appendWidget(p, view_text, false);
 
 	//Append the text message
-
-	LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
-	LLViewerChat::getChatColor(chat,txt_color);
-	LLFontGL* fontp = LLViewerChat::getChatFont();
-	
-	std::string message = chat.mText + '\n';
-	
-	LLStyle::Params style_params;
-	style_params.color(txt_color);
-	style_params.font(fontp);
 	
-	appendText(message, FALSE, style_params);
+	appendText(chat.mText, FALSE, style_params);
 
 	mLastFromName = chat.mFromName;
 	blockUndo();
-- 
GitLab


From 64c1146213a1f1313bd061229a962e4d827cb16d Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Thu, 12 Nov 2009 15:35:08 +0000
Subject: [PATCH 176/557] add Cancel button to outgoing call dialog, make it
 work (perhaps), make the name of the departing voice session more accurate
 (perhaps).  WIP.

---
 indra/newview/llimview.cpp                    | 25 +++++++++++++++----
 indra/newview/llimview.h                      |  2 ++
 indra/newview/llvoicechannel.cpp              | 14 +++++++----
 indra/newview/llvoicechannel.h                |  1 +
 .../default/xui/en/floater_outgoing_call.xml  | 21 ++--------------
 5 files changed, 34 insertions(+), 29 deletions(-)

diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 9175d0c91c1..a94254e17ee 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1108,11 +1108,10 @@ void LLOutgoingCallDialog::getAllowedRect(LLRect& rect)
 
 void LLOutgoingCallDialog::onOpen(const LLSD& key)
 {
-	// prepare to tell the user which voice channel they would be leaving
-	LLVoiceChannel *voice = LLVoiceChannel::getCurrentVoiceChannel();
-	if (voice && !voice->getSessionName().empty())
+	// tell the user which voice channel they are leaving
+	if (!mPayload["old_channel_name"].asString().empty())
 	{
-		childSetTextArg("leaving", "[CURRENT_CHAT]", voice->getSessionName());
+		childSetTextArg("leaving", "[CURRENT_CHAT]", mPayload["old_channel_name"].asString());
 	}
 	else
 	{
@@ -1138,11 +1137,27 @@ void LLOutgoingCallDialog::onOpen(const LLSD& key)
 					 boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1)));
 }
 
+
+//static
+void LLOutgoingCallDialog::onCancel(void* user_data)
+{
+	LLOutgoingCallDialog* self = (LLOutgoingCallDialog*)user_data;
+
+	if (!gIMMgr)
+		return;
+
+	LLUUID session_id = self->mPayload["session_id"].asUUID();
+	gIMMgr->endCall(session_id);
+	
+	self->closeFloater();
+}
+
+
 BOOL LLOutgoingCallDialog::postBuild()
 {
 	BOOL success = LLDockableFloater::postBuild();
 
-	//childSetAction("Reject", onReject, this);
+	childSetAction("Cancel", onCancel, this);
 
 	return success;
 }
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 510b5b8b694..62a54bc0815 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -430,6 +430,8 @@ class LLOutgoingCallDialog : public LLDockableFloater
 	/*virtual*/ BOOL postBuild();
 	/*virtual*/ void onOpen(const LLSD& key);
 
+	static void onCancel(void* user_data);
+
 private:
 	void getAllowedRect(LLRect& rect);
 
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index 164cb1a51ab..b03e6c2426f 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -306,8 +306,10 @@ void LLVoiceChannel::activate()
 		// activating the proximal channel between IM calls
 		LLVoiceChannel* old_channel = sCurrentVoiceChannel;
 		sCurrentVoiceChannel = this;
+		mCallDialogPayload["old_channel_name"] = "";
 		if (old_channel)
 		{
+			mCallDialogPayload["old_channel_name"] = old_channel->getSessionName();
 			old_channel->deactivate();
 		}
 	}
@@ -790,6 +792,9 @@ void LLVoiceChannelP2P::activate()
 {
 	if (callStarted()) return;
 
+	LLVoiceChannel *voice = LLVoiceChannel::getCurrentVoiceChannel();
+	if (voice && !voice->getSessionName().empty())
+
 	LLVoiceChannel::activate();
 
 	if (callStarted())
@@ -872,16 +877,15 @@ void LLVoiceChannelP2P::setState(EState state)
 	toggleCallWindowIfNeeded(state);
 	
 	// *HACK: open outgoing call floater if needed, might be better done elsewhere.
-	LLSD payload;
-	payload["session_id"] = mSessionID;
-	payload["session_name"] = mSessionName;
-	payload["other_user_id"] = mOtherUserID;
+	mCallDialogPayload["session_id"] = mSessionID;
+	mCallDialogPayload["session_name"] = mSessionName;
+	mCallDialogPayload["other_user_id"] = mOtherUserID;
 	if (!mReceivedCall && state == STATE_RINGING)
 	{
 		llinfos << "RINGINGGGGGGGG " << mSessionName << llendl;
 		if (!mSessionName.empty())
 		{
-			LLFloaterReg::showInstance("outgoing_call", payload, TRUE);
+			LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE);
 		}
 	}
 
diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h
index 20b6157b48b..639585de559 100644
--- a/indra/newview/llvoicechannel.h
+++ b/indra/newview/llvoicechannel.h
@@ -109,6 +109,7 @@ class LLVoiceChannel : public LLVoiceClientStatusObserver
 	EState		mState;
 	std::string	mSessionName;
 	LLSD mNotifyArgs;
+	LLSD mCallDialogPayload;
 	BOOL		mIgnoreNextSessionLeave;
 	LLHandle<LLPanel> mLoginNotificationHandle;
 
diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
index 3d0a86de344..67137003720 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -59,26 +59,9 @@ Leaving [CURRENT_CHAT].
     </text>
     <button
      height="24"
-     label="Foo"
-     label_selected="Foo"
+     label="Cancel"
      layout="topleft"
-     left="70"
-     name="Foo"
-     top="92"
-     width="100" />
-    <button
-     height="24"
-     label="Bar"
-     label_selected="Bar"
-     layout="topleft"
-     name="Bar"
-     left_pad="10"
-     width="100" />
-    <button
-     height="24"
-     label="Baz"
-     layout="topleft"
-     name="Baz"
+     name="Cancel"
      left_pad="10"
      width="100" />
 </floater>
-- 
GitLab


From 86c63e36b59d502f48acc935874050bbe361caf0 Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Thu, 12 Nov 2009 17:36:17 +0200
Subject: [PATCH 177/557] Fixed major bug EXT-2400-Viewer crashes on right
 button click upon IM P2P chiclet. Removed call to non-existing child

--HG--
branch : product-engine
---
 indra/newview/llchiclet.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 12bbc29858a..fd861926509 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -427,7 +427,6 @@ void LLIMP2PChiclet::updateMenuItems()
 	bool is_friend = LLAvatarActions::isFriend(getOtherParticipantId());
 
 	mPopupMenu->getChild<LLUICtrl>("Add Friend")->setEnabled(!is_friend);
-	mPopupMenu->getChild<LLUICtrl>("Remove Friend")->setEnabled(is_friend);
 }
 
 BOOL LLIMP2PChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
-- 
GitLab


From fcb99c30407d6ccbae17ea4c3d17a65037ca6a5c Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Thu, 12 Nov 2009 17:43:23 +0200
Subject: [PATCH 178/557] Work on major sub-task EXT-991 (Update bottom bar
 behavior on resize) Code refuctored:  - moved code to process Borrom Bar
 shrinking into separate method  - unified code to process a hiding of the
 Bottom Tray's buttons

Code is ready to process shrink after min width is reached & be synchronized with user hidden buttons

--HG--
branch : product-engine
---
 indra/newview/llbottomtray.cpp | 264 ++++++++++++++++-----------------
 indra/newview/llbottomtray.h   |   2 +
 2 files changed, 128 insertions(+), 138 deletions(-)

diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 204d7d23fa9..291f645ea23 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -238,22 +238,22 @@ void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask)
 
 void LLBottomTray::showGestureButton(BOOL visible)
 {
-	mGesturePanel->setVisible(visible);
+	showTrayButton(RS_BUTTON_GESTURES, visible);
 }
 
 void LLBottomTray::showMoveButton(BOOL visible)
 {
-	mMovementPanel->setVisible(visible);
+	showTrayButton(RS_BUTTON_MOVEMENT, visible);
 }
 
 void LLBottomTray::showCameraButton(BOOL visible)
 {
-	mCamPanel->setVisible(visible);
+	showTrayButton(RS_BUTTON_CAMERA, visible);
 }
 
 void LLBottomTray::showSnapshotButton(BOOL visible)
 {
-	mSnapshotPanel->setVisible(visible);
+	showTrayButton(RS_BUTTON_SNAPSHOT, visible);
 }
 
 namespace
@@ -365,8 +365,6 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
 void LLBottomTray::updateResizeState(S32 new_width, S32 cur_width)
 {
 	mResizeState = RS_NORESIZE;
-	MASK compensative_view_item_mask = RS_CHATBAR_INPUT;
-	LLPanel* compansative_view = mNearbyChatBar;
 
 	S32 delta_width = new_width - cur_width;
 //	if (delta_width == 0) return;
@@ -386,153 +384,113 @@ void LLBottomTray::updateResizeState(S32 new_width, S32 cur_width)
 		<< ", chiclet_panel_min_width: " << chiclet_panel_min_width
 		<< llendl;
 
-	bool still_should_be_processed = true;
 	// bottom tray is narrowed
 	if (shrink)
 	{
-		S32 compensative_delta_width = 0;
-		if (chiclet_panel_width > chiclet_panel_min_width)
-		{
-			// we have some space to decrease chiclet panel
-			S32 panel_delta_min = chiclet_panel_width - chiclet_panel_min_width;
-			mResizeState |= RS_CHICLET_PANEL;
-
-			S32 delta_panel = llmin(-delta_width, panel_delta_min);
+		processWidthDecreased(delta_width);
+	}
+	// bottom tray is widen
+	else
+	{
+		processWidthIncreased(delta_width);
+	}
 
-			lldebugs << "delta_width: " << delta_width
-				<< ", panel_delta_min: " << panel_delta_min
-				<< ", delta_panel: " << delta_panel
-				<< llendl;
+	lldebugs << "New resize state: " << mResizeState << llendl;
+}
 
-			// is chiclet panel width enough to process resizing?
-			delta_width += panel_delta_min;
+void LLBottomTray::processWidthDecreased(S32 delta_width)
+{
+	bool still_should_be_processed = true;
 
-			still_should_be_processed = delta_width < 0;
+	const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
+	const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
 
-			mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - delta_panel, mChicletPanel->getParent()->getRect().getHeight());
-			log(mChicletPanel, "after processing panel decreasing via chiclet panel");
+	if (chiclet_panel_width > chiclet_panel_min_width)
+	{
+		// we have some space to decrease chiclet panel
+		S32 panel_delta_min = chiclet_panel_width - chiclet_panel_min_width;
+		mResizeState |= RS_CHICLET_PANEL;
 
-			lldebugs << "RS_CHICLET_PANEL" 
-				<< ", delta_width: " << delta_width
-				<< llendl;
-		}
-		
-		if (still_should_be_processed && chatbar_panel_width > chatbar_panel_min_width)
-		{
-			// we have some space to decrease chatbar panel
-			S32 panel_delta_min = chatbar_panel_width - chatbar_panel_min_width;
-			mResizeState |= RS_CHATBAR_INPUT;
+		S32 delta_panel = llmin(-delta_width, panel_delta_min);
 
-			S32 delta_panel = llmin(-delta_width, panel_delta_min);
+		lldebugs << "delta_width: " << delta_width
+			<< ", panel_delta_min: " << panel_delta_min
+			<< ", delta_panel: " << delta_panel
+			<< llendl;
 
-			// is chatbar panel width enough to process resizing?
-			delta_width += panel_delta_min;
-			
+		// is chiclet panel width enough to process resizing?
+		delta_width += panel_delta_min;
 
-			still_should_be_processed = delta_width < 0;
+		still_should_be_processed = delta_width < 0;
 
-			mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mNearbyChatBar->getRect().getHeight());
+		mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - delta_panel, mChicletPanel->getParent()->getRect().getHeight());
+		log(mChicletPanel, "after processing panel decreasing via chiclet panel");
 
-			lldebugs << "RS_CHATBAR_INPUT"
-				<< ", delta_panel: " << delta_panel
-				<< ", delta_width: " << delta_width
-				<< llendl;
+		lldebugs << "RS_CHICLET_PANEL" 
+			<< ", delta_width: " << delta_width
+			<< llendl;
+	}
 
-			log(mChicletPanel, "after nearby was processed");
+	const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
+	const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
+	if (still_should_be_processed && chatbar_panel_width > chatbar_panel_min_width)
+	{
+		// we have some space to decrease chatbar panel
+		S32 panel_delta_min = chatbar_panel_width - chatbar_panel_min_width;
+		mResizeState |= RS_CHATBAR_INPUT;
 
-		}
-		if (still_should_be_processed)
-		{
-			mResizeState |= compensative_view_item_mask;
+		S32 delta_panel = llmin(-delta_width, panel_delta_min);
 
-			if (mSnapshotPanel->getVisible())
-			{
-				mResizeState |= RS_BUTTON_SNAPSHOT;
-				delta_width += mSnapshotPanel->getRect().getWidth();
-
-				if (delta_width > 0)
-				{
-					compensative_delta_width += delta_width;
-				}
-				lldebugs << "RS_BUTTON_SNAPSHOT" 
-					<< ", compensative_delta_width: " << compensative_delta_width
-					<< ", delta_width: " << delta_width
-					<< llendl;
-				showSnapshotButton(false);
-			}
+		// is chatbar panel width enough to process resizing?
+		delta_width += panel_delta_min;
 
-			if (delta_width < 0 && mCamPanel->getVisible())
-			{
-				mResizeState |= RS_BUTTON_CAMERA;
-				delta_width += mCamPanel->getRect().getWidth();
-				if (delta_width > 0)
-				{
-					compensative_delta_width += delta_width;
-				}
-				lldebugs << "RS_BUTTON_CAMERA"
-					<< ", compensative_delta_width: " << compensative_delta_width
-					<< ", delta_width: " << delta_width
-					<< llendl;
-				showCameraButton(false);
-			}
 
-			if (delta_width < 0 && mMovementPanel->getVisible())
-			{
-				mResizeState |= RS_BUTTON_MOVEMENT;
-				delta_width += mMovementPanel->getRect().getWidth();
-				if (delta_width > 0)
-				{
-					compensative_delta_width += delta_width;
-				}
-				lldebugs << "RS_BUTTON_MOVEMENT"
-					<< ", compensative_delta_width: " << compensative_delta_width
-					<< ", delta_width: " << delta_width
-					<< llendl;
-				showMoveButton(false);
-			}
+		still_should_be_processed = delta_width < 0;
 
-			if (delta_width < 0 && mGesturePanel->getVisible())
-			{
-				mResizeState |= RS_BUTTON_GESTURES;
-				delta_width += mGesturePanel->getRect().getWidth();
-				if (delta_width > 0)
-				{
-					compensative_delta_width += delta_width;
-				}
-				lldebugs << "RS_BUTTON_GESTURES"
-					<< ", compensative_delta_width: " << compensative_delta_width
-					<< ", delta_width: " << delta_width
-					<< llendl;
-				showGestureButton(false);
-			}
+		mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mNearbyChatBar->getRect().getHeight());
 
-			if (delta_width < 0)
-			{
-				llwarns << "WARNING: there is no enough room for bottom tray, resizing still should be processed" << llendl;
-			}
+		lldebugs << "RS_CHATBAR_INPUT"
+			<< ", delta_panel: " << delta_panel
+			<< ", delta_width: " << delta_width
+			<< llendl;
 
-			if (compensative_delta_width != 0)
-			{
-				if (compansative_view)			log(compansative_view, "before applying compensative width: ");
-				compansative_view->reshape(compansative_view->getRect().getWidth() + compensative_delta_width, compansative_view->getRect().getHeight() );
-				if (compansative_view)			log(compansative_view, "after applying compensative width: ");
-				lldebugs << compensative_delta_width << llendl;
+		log(mChicletPanel, "after nearby was processed");
 
-			}
-		}
 	}
-	// bottom tray is widen
-	else
+
+	S32 buttons_freed_width = 0;
+	if (still_should_be_processed)
 	{
-		processWidthIncreased(delta_width);
-	}
+		processHideButton(RS_BUTTON_SNAPSHOT, &delta_width, &buttons_freed_width);
 
-	lldebugs << "New resize state: " << mResizeState << llendl;
-}
+		if (delta_width < 0)
+		{
+			processHideButton(RS_BUTTON_CAMERA, &delta_width, &buttons_freed_width);
+		}
 
-void LLBottomTray::processWidthDecreased(S32 delta_width)
-{
+		if (delta_width < 0)
+		{
+			processHideButton(RS_BUTTON_MOVEMENT, &delta_width, &buttons_freed_width);
+		}
 
+		if (delta_width < 0)
+		{
+			processHideButton(RS_BUTTON_GESTURES, &delta_width, &buttons_freed_width);
+		}
+
+		if (delta_width < 0)
+		{
+			llwarns << "WARNING: there is no enough room for bottom tray, resizing still should be processed" << llendl;
+		}
+
+		if (buttons_freed_width > 0)
+		{
+			log(mNearbyChatBar, "before applying compensative width");
+			mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() + buttons_freed_width, mNearbyChatBar->getRect().getHeight() );
+			log(mNearbyChatBar, "after applying compensative width");
+			lldebugs << buttons_freed_width << llendl;
+		}
+	}
 }
 
 void LLBottomTray::processWidthIncreased(S32 delta_width)
@@ -591,9 +549,9 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
 			chatbar_shrink_width = chatbar_available_shrink_width;
 		}
 
-		log(mNearbyChatBar, "increase width: before applying compensative width: ");
+		log(mNearbyChatBar, "increase width: before applying compensative width");
 		mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - chatbar_shrink_width, mNearbyChatBar->getRect().getHeight() );
-		if (mNearbyChatBar)			log(mNearbyChatBar, "after applying compensative width: ");
+		if (mNearbyChatBar)			log(mNearbyChatBar, "after applying compensative width");
 		lldebugs << chatbar_shrink_width << llendl;
 
 		// 3. use width available via decreasing of chiclet panel
@@ -642,24 +600,42 @@ bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* availa
 			*available_width -= required_width;
 			*buttons_required_width += required_width;
 
-			switch (shown_object_type)
-			{
-			case RS_BUTTON_GESTURES:	showGestureButton(true);				break;
-			case RS_BUTTON_MOVEMENT:	showMoveButton(true);					break;
-			case RS_BUTTON_CAMERA:		showCameraButton(true);					break;
-			case RS_BUTTON_SNAPSHOT:	showSnapshotButton(true);				break;
-			default:
-				llwarns << "Unexpected type of button to be shown: " << shown_object_type << llendl;
-			}
+			showTrayButton(shown_object_type, true);
 
 			lldebugs << "processing object type: " << shown_object_type
-				<< ", buttons_required_width: " << buttons_required_width
+				<< ", buttons_required_width: " << *buttons_required_width
 				<< llendl;
 		}
 	}
 	return can_be_shown;
 }
 
+void LLBottomTray::processHideButton(EResizeState shown_object_type, S32* required_width, S32* buttons_freed_width)
+{
+	LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
+	if (NULL == panel)
+	{
+		lldebugs << "There is no object to process for state: " << shown_object_type << llendl;
+		return;
+	}
+
+	if (panel->getVisible())
+	{
+		*required_width += panel->getRect().getWidth();
+
+		if (*required_width > 0)
+		{
+			*buttons_freed_width += *required_width;
+		}
+
+		showTrayButton(shown_object_type, false);
+
+		lldebugs << "processing object type: " << shown_object_type
+			<< ", buttons_freed_width: " << *buttons_freed_width
+			<< llendl;
+	}
+}
+
 bool LLBottomTray::canButtonBeShown(LLPanel* panel) const
 {
 	bool can_be_shown = !panel->getVisible();
@@ -677,4 +653,16 @@ void LLBottomTray::initStateProcessedObjectMap()
 	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, mCamPanel));
 	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, mSnapshotPanel));
 }
+
+void LLBottomTray::showTrayButton(EResizeState shown_object_type, bool visible)
+{
+	LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
+	if (NULL == panel)
+	{
+		lldebugs << "There is no object to show for state: " << shown_object_type << llendl;
+		return;
+	}
+
+	panel->setVisible(visible);
+}
 //EOF
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 6509fea63d4..2972a2b1ac7 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -102,8 +102,10 @@ class LLBottomTray
 	void processWidthIncreased(S32 delta_width);
 	void log(LLView* panel, const std::string& descr);
 	bool processShowButton(EResizeState shown_object_type, S32* available_width, S32* buttons_required_width);
+	void processHideButton(EResizeState shown_object_type, S32* required_width, S32* buttons_freed_width);
 	bool canButtonBeShown(LLPanel* panel) const;
 	void initStateProcessedObjectMap();
+	void showTrayButton(EResizeState shown_object_type, bool visible);
 
 	MASK mResizeState;
 
-- 
GitLab


From a4375f8a3023912bbb11e8c76ef574807dc1afde Mon Sep 17 00:00:00 2001
From: Lynx Linden <lynx@lindenlab.com>
Date: Thu, 12 Nov 2009 15:46:51 +0000
Subject: [PATCH 179/557] DEV-41324 DEV-41331: Improvements to the Avaline
 voice workflow.

Don't show the "Start IM" button in the incoming call request for an
Avaline call. And display the phone number of the incoming call as the
avatar name, instead of "(???) (???)".
---
 indra/newview/llimview.cpp              |  5 +++++
 indra/newview/llpanelimcontrolpanel.cpp | 13 +++++++++----
 indra/newview/llvoiceclient.cpp         |  2 +-
 3 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 23767d119d3..ac21c5f4b0f 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1260,6 +1260,11 @@ BOOL LLIncomingCallDialog::postBuild()
 		call_type = getString("VoiceInviteAdHoc");
 	}
 
+	// check to see if this is an Avaline call
+	LLUUID session_id = mPayload["session_id"].asUUID();
+	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
+	childSetVisible("Start IM", is_avatar); // no IM for avaline
+
 	LLUICtrl* caller_name_widget = getChild<LLUICtrl>("caller name");
 	caller_name_widget->setValue(caller_name + " " + call_type);
 	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index 1770138b3ec..9cd949c9cc5 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -174,10 +174,8 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
 
 	getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(mAvatarID);
 
-	// Fetch the currect name
-	gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4));
-
-	// Disable profile button if participant is not realy SL avatar
+	// Disable most profile buttons if the participant is
+	// not really an SL avatar (e.g., an Avaline caller).
 	LLIMModel::LLIMSession* im_session =
 		im_model.findIMSession(session_id);
 	if( im_session && !im_session->mOtherParticipantIsAvatar )
@@ -188,6 +186,13 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
 		childSetEnabled("share_btn", FALSE);
 		childSetEnabled("teleport_btn", FALSE);
 		childSetEnabled("pay_btn", FALSE);
+
+        getChild<LLTextBox>("avatar_name")->setValue(im_session->mName);
+	}
+	else
+	{
+		// If the participant is an avatar, fetch the currect name
+		gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4));
 	}
 }
 
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 39d4bb0c029..e50ff99205b 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -1598,7 +1598,7 @@ void LLVoiceClient::stateMachine()
 				}
 				else
 				{
-					LL_WARNS("Voice") << "region doesn't have ParcelVoiceInfoRequest capability.  This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL;
+					LL_WARNS_ONCE("Voice") << "region doesn't have ParcelVoiceInfoRequest capability.  This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL;
 				}
 			}
 		}
-- 
GitLab


From eddda09e1da61a5958edd7af42a931f7ffb26e4b Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Thu, 12 Nov 2009 17:54:22 +0200
Subject: [PATCH 180/557] Fixed Major sub-task EXT-2398-Mini inspector should
 be opened by DOUBLE-click on the IM message header not by single-click

--HG--
branch : product-engine
---
 indra/newview/llchathistory.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index d1922cfd6ec..43a1aeaefbb 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -131,7 +131,7 @@ class LLChatHistoryHeader: public LLPanel
 		menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_object_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 		mPopupMenuHandleObject = menu->getHandle();
 
-		setMouseDownCallback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, _2, _3, _4));
+		setDoubleClickCallback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, _2, _3, _4));
 
 		return LLPanel::postBuild();
 	}
-- 
GitLab


From 74cb5c82a4e5eeb1ef722f73c96f64c4750db2be Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Thu, 12 Nov 2009 16:01:29 +0000
Subject: [PATCH 181/557] fix silly error that was nerfing the outgoing call
 dialog. more work towards a decent DEV-42312 and DEV-42313

---
 indra/newview/llvoicechannel.cpp | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index b03e6c2426f..d93913b9443 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -792,9 +792,6 @@ void LLVoiceChannelP2P::activate()
 {
 	if (callStarted()) return;
 
-	LLVoiceChannel *voice = LLVoiceChannel::getCurrentVoiceChannel();
-	if (voice && !voice->getSessionName().empty())
-
 	LLVoiceChannel::activate();
 
 	if (callStarted())
-- 
GitLab


From e8c3eb438ca113b123d640755588fb0705c2bdb0 Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Thu, 12 Nov 2009 18:15:17 +0200
Subject: [PATCH 182/557] Fixed minor bug EXT-1499 (Finalize the Home panel and
 add tooltips to the tab grabs)- changed one icon I forgot about in
 yesterday's fix.

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
index 9636e321870..566fc95230b 100644
--- a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
+++ b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
@@ -227,7 +227,7 @@
          right="-10"
          top="10"
          width="20"
-         image_name="TabIcon_Inventory_Selected"/>
+         image_name="TabIcon_Things_Selected"/>
         <text
          follows="all"
          height="90"
-- 
GitLab


From 381c9f468d9ff0d48b0e80430856251acfe17066 Mon Sep 17 00:00:00 2001
From: Dmitry Oleshko <doleshko@productengine.com>
Date: Thu, 12 Nov 2009 18:48:02 +0200
Subject: [PATCH 183/557] fixed major bugs (EXT-2392) No "login" toast appears
 with overall number of unresolved interactive notifications (EXT-2391)
 Notifications overflow toast is broken

--HG--
branch : product-engine
---
 indra/newview/app_settings/settings.xml       |  4 +--
 indra/newview/llscreenchannel.cpp             |  5 ----
 .../skins/default/xui/en/panel_toast.xml      | 28 +++++--------------
 3 files changed, 9 insertions(+), 28 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 15c9499bbc8..38f14793d9b 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -3563,7 +3563,7 @@
       <key>Type</key>
       <string>S32</string>
       <key>Value</key>
-      <integer>400</integer>
+      <integer>305</integer>
     </map>
     <key>HelpUseLocal</key>
     <map>
@@ -4895,7 +4895,7 @@
       <key>Type</key>
       <string>S32</string>
       <key>Value</key>
-      <integer>350</integer>
+      <integer>305</integer>
     </map>
     <key>NotificationToastLifeTime</key>
     <map>
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index b667fbf5fd2..8825a64853a 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -456,7 +456,6 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)
 	mOverflowToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::closeOverflowToastPanel, this));
 
 	LLTextBox* text_box = mOverflowToastPanel->getChild<LLTextBox>("toast_text");
-	LLIconCtrl* icon = mOverflowToastPanel->getChild<LLIconCtrl>("icon");
 	std::string	text = llformat(mOverflowFormatString.c_str(),mHiddenToastsNum);
 	if(mHiddenToastsNum == 1)
 	{
@@ -474,7 +473,6 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)
 
 	text_box->setValue(text);
 	text_box->setVisible(TRUE);
-	icon->setVisible(TRUE);
 
 	mOverflowToastPanel->setVisible(TRUE);
 }
@@ -532,7 +530,6 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
 	mStartUpToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onStartUpToastHide, this));
 
 	LLTextBox* text_box = mStartUpToastPanel->getChild<LLTextBox>("toast_text");
-	LLIconCtrl* icon = mStartUpToastPanel->getChild<LLIconCtrl>("icon");
 
 	std::string mStartUpFormatString;
 
@@ -555,8 +552,6 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
 
 	text_box->setValue(text);
 	text_box->setVisible(TRUE);
-	icon->setVisible(TRUE);
-
 	addChild(mStartUpToastPanel);
 	
 	mStartUpToastPanel->setVisible(TRUE);
diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml
index 7f7777586c2..f16329f8d78 100644
--- a/indra/newview/skins/default/xui/en/panel_toast.xml
+++ b/indra/newview/skins/default/xui/en/panel_toast.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <!-- All our XML is utf-8 encoded. -->
 
-<!-- All this does is establish the position of the "close" button on the toast. -->
+<!-- Don't remove floater's height! It is needed for Overflow and Start-Up toasts!-->
 
 <floater
  legacy_header_height="18"
@@ -9,6 +9,7 @@
 	title=""
   visible="false"
   layout="topleft"
+  height="40" 
 	width="305"
   left="0"
   top="0"
@@ -26,36 +27,21 @@
   drop_shadow_visible = "false"
   border = "false"
   >
-
-  <!--
+  <!-- Don't remove this wiget! It is needed for Overflow and Start-Up toasts!-->
   <text
    visible="false"
    follows="left|top|right|bottom"
    font="SansSerifBold"
-   height="40"
+   height="20"
    layout="topleft"
-   left="60"
+   left="20"
    name="toast_text"
    word_wrap="true"
    text_color="white"
-   top="20"
-   width="290">
+   top="5" 
+   width="260">
     Toast text;
   </text>
-  <icon
-    top="20"
-    left="10"
-    width="32"
-    height="32"
-    follows="top|left"
-    layout="topleft"
-    visible="false"
-    color="1 1 1 1"
-    enabled="true"
-    image_name="notify_tip_icon.tga"
-    mouse_opaque="true"
-    name="icon"
-  />-->
   <button
     layout="topleft"
     top="-6"
-- 
GitLab


From 4c637196e4c511c7d199a66759671e16e9a7566b Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Thu, 12 Nov 2009 18:57:27 +0200
Subject: [PATCH 184/557] fixed EXT-2397 "Notification and IM toasts stop to
 appear after pressing Reply in any IM toast"

--HG--
branch : product-engine
---
 indra/newview/llnearbychathandler.cpp |  2 +-
 indra/newview/llscreenchannel.cpp     | 19 ++++++++++++-------
 indra/newview/llscreenchannel.h       |  7 ++++---
 3 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index e10c506f086..b4e0ab198af 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -223,7 +223,7 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)
 
 void LLNearbyChatScreenChannel::arrangeToasts()
 {
-	if(m_active_toasts.size() == 0 || mIsHovering)
+	if(m_active_toasts.size() == 0 || isHovering())
 		return;
 
 	hideToastsFromScreen();
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index b667fbf5fd2..1f36c3d26e6 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -63,7 +63,7 @@ LLScreenChannelBase::LLScreenChannelBase(const LLUUID& id) :
 												,mCanStoreToasts(true)
 												,mHiddenToastsNum(0)
 												,mOverflowToastHidden(false)
-												,mIsHovering(false)
+												,mHoveredToast(NULL)
 												,mControlHovering(false)
 												,mShowToasts(true)
 {	
@@ -216,8 +216,10 @@ void LLScreenChannel::deleteToast(LLToast* toast)
 	
 	// update channel's Hovering state
 	// turning hovering off manually because onMouseLeave won't happen if a toast was closed using a keyboard
-	if(toast->hasFocus())
-		setHovering(false);
+	if(mHoveredToast == toast)
+	{
+		mHoveredToast  = NULL;
+	}
 
 	// close the toast
 	toast->closeFloater();
@@ -352,7 +354,7 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel)
 //--------------------------------------------------------------------------
 void LLScreenChannel::redrawToasts()
 {
-	if(mToastList.size() == 0 || mIsHovering)
+	if(mToastList.size() == 0 || isHovering())
 		return;
 
 	hideToastsFromScreen();
@@ -654,7 +656,10 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
 	// we must check this to prevent incorrect setting for hovering in a channel
 	std::map<LLToast*, bool>::iterator it_first, it_second;
 	S32 stack_size = mToastEventStack.size();
-	mIsHovering = mouse_enter;
+	if(mouse_enter)
+	{
+		mHoveredToast = toast;
+	}
 
 	switch(stack_size)
 	{
@@ -666,7 +671,7 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
 		if((*it_first).second && !mouse_enter && ((*it_first).first != toast) )
 		{
 			mToastEventStack.clear();
-			mIsHovering = true;
+			mHoveredToast = toast;
 		}
 		else
 		{
@@ -678,7 +683,7 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
 		LL_ERRS ("LLScreenChannel::onToastHover: stack size error " ) << stack_size << llendl;
 	}
 
-	if(!mIsHovering)
+	if(!isHovering())
 		redrawToasts();
 }
 
diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h
index fd31690622f..f39b94b89df 100644
--- a/indra/newview/llscreenchannel.h
+++ b/indra/newview/llscreenchannel.h
@@ -93,9 +93,10 @@ class LLScreenChannelBase : public LLUICtrl
 	// Channel's behavior-functions
 	// set whether a channel will control hovering inside itself or not
 	virtual void setControlHovering(bool control) { mControlHovering = control; }
-	// set Hovering flag for a channel
-	virtual void setHovering(bool hovering) { mIsHovering = hovering; }
 	
+
+	bool isHovering() { return mHoveredToast != NULL; }
+
 	void setCanStoreToasts(bool store) { mCanStoreToasts = store; }
 
 	void setDisplayToastsAlways(bool display_toasts) { mDisplayToastsAlways = display_toasts; }
@@ -117,7 +118,7 @@ class LLScreenChannelBase : public LLUICtrl
 protected:
 	// Channel's flags
 	bool		mControlHovering;
-	bool		mIsHovering;
+	LLToast*		mHoveredToast;
 	bool		mCanStoreToasts;
 	bool		mDisplayToastsAlways;
 	bool		mOverflowToastHidden;
-- 
GitLab


From 3b7ed8a4e9fdff83f89b49760d281ee5c13c8155 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Thu, 12 Nov 2009 19:08:31 +0200
Subject: [PATCH 185/557] related to EXT-2397 "Notification and IM toasts stop
 to appear after pressing Reply in any IM toast" corrected on hover lost event
 handling

--HG--
branch : product-engine
---
 indra/newview/llscreenchannel.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index 49fdd4f365a..ed606d54570 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -655,6 +655,10 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
 	{
 		mHoveredToast = toast;
 	}
+	else
+	{
+		mHoveredToast = NULL;
+	}
 
 	switch(stack_size)
 	{
-- 
GitLab


From f9f2852ff2d1b11b3bba5811192ccb89c9354877 Mon Sep 17 00:00:00 2001
From: "Mark Palange (Mani)" <palange@lindenlab.com>
Date: Thu, 12 Nov 2009 09:19:32 -0800
Subject: [PATCH 186/557] DEV-42715 Fixed lllogin SRV request timeout unit
 test. Also made SRV config options not persistent. reviewed by brad

---
 indra/newview/app_settings/settings.xml              |  4 ++--
 indra/viewer_components/login/tests/lllogin_test.cpp | 10 +++++++++-
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index dccf4de6511..a530b800a3b 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -4253,7 +4253,7 @@
     <key>Comment</key>
     <string>Duration in seconds of the login SRV request timeout</string>
     <key>Persist</key>
-    <integer>1</integer>
+    <integer>0</integer>
     <key>Type</key>
     <string>F32</string>
     <key>Value</key>
@@ -4264,7 +4264,7 @@
     <key>Comment</key>
     <string>Name of the message pump that handles SRV request</string>
     <key>Persist</key>
-    <integer>1</integer>
+    <integer>0</integer>
     <key>Type</key>
     <string>String</string>
     <key>Value</key>
diff --git a/indra/viewer_components/login/tests/lllogin_test.cpp b/indra/viewer_components/login/tests/lllogin_test.cpp
index c3b18384222..56c21016bd5 100644
--- a/indra/viewer_components/login/tests/lllogin_test.cpp
+++ b/indra/viewer_components/login/tests/lllogin_test.cpp
@@ -441,6 +441,14 @@ namespace tut
 
 		login.connect("login.bar.com", credentials);
 
-		ensure_equals("Failed to offline", listener.lastEvent()["change"].asString(), "srvrequest"); 
+		ensure_equals("SRV State", listener.lastEvent()["change"].asString(), "srvrequest"); 
+
+		// Get the mainloop eventpump, which needs a pinging in order to drive the 
+		// SRV timeout.
+		LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop"));
+		LLSD frame_event;
+		mainloop.post(frame_event);
+
+		ensure_equals("SRV Failure", listener.lastEvent()["change"].asString(), "fail.login"); 
 	}
 }
-- 
GitLab


From 181ac27742ff8c7b7aaff10cc1f382fd41994ccd Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Thu, 12 Nov 2009 19:46:27 +0200
Subject: [PATCH 187/557] Initial implementation of normal task EXT-2159
 (Create Vertical Slider to use for zoom in / out controls in view)

--HG--
branch : product-engine
---
 indra/llui/llslider.cpp                       | 134 +++++++++++++-----
 indra/llui/llslider.h                         |  21 ++-
 indra/newview/llagent.cpp                     |   4 -
 indra/newview/llfloatercamera.cpp             |  92 +++++++++++-
 indra/newview/llfloatercamera.h               |   3 +-
 .../skins/default/xui/en/floater_camera.xml   |  69 ++++++---
 .../default/xui/en/floater_test_slider.xml    |   8 ++
 .../default/xui/en/widgets/slider_bar.xml     |   8 +-
 8 files changed, 275 insertions(+), 64 deletions(-)

diff --git a/indra/llui/llslider.cpp b/indra/llui/llslider.cpp
index f86776384ad..da2fc7c68b2 100644
--- a/indra/llui/llslider.cpp
+++ b/indra/llui/llslider.cpp
@@ -47,14 +47,17 @@ static LLDefaultChildRegistry::Register<LLSlider> r1("slider_bar");
 // have ambigious template lookup problem
 
 LLSlider::Params::Params()
-:	track_color("track_color"),
+:	orientation ("orientation", std::string ("horizontal")),
+	track_color("track_color"),
 	thumb_outline_color("thumb_outline_color"),
 	thumb_center_color("thumb_center_color"),
 	thumb_image("thumb_image"),
 	thumb_image_pressed("thumb_image_pressed"),
 	thumb_image_disabled("thumb_image_disabled"),
-	track_image("track_image"),
-	track_highlight_image("track_highlight_image"),
+	track_image_horizontal("track_image_horizontal"),
+	track_image_vertical("track_image_vertical"),
+	track_highlight_horizontal_image("track_highlight_horizontal_image"),
+	track_highlight_vertical_image("track_highlight_vertical_image"),
 	mouse_down_callback("mouse_down_callback"),
 	mouse_up_callback("mouse_up_callback")
 {
@@ -64,14 +67,17 @@ LLSlider::Params::Params()
 LLSlider::LLSlider(const LLSlider::Params& p)
 :	LLF32UICtrl(p),
 	mMouseOffset( 0 ),
+	mOrientation ((p.orientation() == "horizontal") ? HORIZONTAL : VERTICAL),
 	mTrackColor(p.track_color()),
 	mThumbOutlineColor(p.thumb_outline_color()),
 	mThumbCenterColor(p.thumb_center_color()),
 	mThumbImage(p.thumb_image),
 	mThumbImagePressed(p.thumb_image_pressed),
 	mThumbImageDisabled(p.thumb_image_disabled),
-	mTrackImage(p.track_image),
-	mTrackHighlightImage(p.track_highlight_image)
+	mTrackImageHorizontal(p.track_image_horizontal),
+	mTrackImageVertical(p.track_image_vertical),
+	mTrackHighlightHorizontalImage(p.track_highlight_horizontal_image),
+	mTrackHighlightVerticalImage(p.track_highlight_vertical_image)
 {
     mViewModel->setValue(p.initial_value);
 	updateThumbRect();
@@ -111,14 +117,29 @@ void LLSlider::updateThumbRect()
 
 	S32 thumb_width = mThumbImage ? mThumbImage->getWidth() : DEFAULT_THUMB_SIZE;
 	S32 thumb_height = mThumbImage ? mThumbImage->getHeight() : DEFAULT_THUMB_SIZE;
-	S32 left_edge = (thumb_width / 2);
-	S32 right_edge = getRect().getWidth() - (thumb_width / 2);
-
-	S32 x = left_edge + S32( t * (right_edge - left_edge) );
-	mThumbRect.mLeft = x - (thumb_width / 2);
-	mThumbRect.mRight = mThumbRect.mLeft + thumb_width;
-	mThumbRect.mBottom = getLocalRect().getCenterY() - (thumb_height / 2);
-	mThumbRect.mTop = mThumbRect.mBottom + thumb_height;
+
+	if ( mOrientation == HORIZONTAL )
+	{
+		S32 left_edge = (thumb_width / 2);
+		S32 right_edge = getRect().getWidth() - (thumb_width / 2);
+
+		S32 x = left_edge + S32( t * (right_edge - left_edge) );
+		mThumbRect.mLeft = x - (thumb_width / 2);
+		mThumbRect.mRight = mThumbRect.mLeft + thumb_width;
+		mThumbRect.mBottom = getLocalRect().getCenterY() - (thumb_height / 2);
+		mThumbRect.mTop = mThumbRect.mBottom + thumb_height;
+	}
+	else
+	{
+		S32 top_edge = (thumb_height / 2);
+		S32 bottom_edge = getRect().getHeight() - (thumb_height / 2);
+
+		S32 y = top_edge + S32( t * (bottom_edge - top_edge) );
+		mThumbRect.mLeft = getLocalRect().getCenterX() - (thumb_width / 2);
+		mThumbRect.mRight = mThumbRect.mLeft + thumb_width;
+		mThumbRect.mBottom = y  - (thumb_height / 2);
+		mThumbRect.mTop = mThumbRect.mBottom + thumb_height;
+	}
 }
 
 
@@ -138,18 +159,32 @@ BOOL LLSlider::handleHover(S32 x, S32 y, MASK mask)
 {
 	if( hasMouseCapture() )
 	{
-		S32 thumb_half_width = mThumbImage->getWidth()/2;
-		S32 left_edge = thumb_half_width;
-		S32 right_edge = getRect().getWidth() - (thumb_half_width);
+		if ( mOrientation == HORIZONTAL )
+		{
+			S32 thumb_half_width = mThumbImage->getWidth()/2;
+			S32 left_edge = thumb_half_width;
+			S32 right_edge = getRect().getWidth() - (thumb_half_width);
 
-		x += mMouseOffset;
-		x = llclamp( x, left_edge, right_edge );
+			x += mMouseOffset;
+			x = llclamp( x, left_edge, right_edge );
 
-		F32 t = F32(x - left_edge) / (right_edge - left_edge);
-		setValueAndCommit(t * (mMaxValue - mMinValue) + mMinValue );
+			F32 t = F32(x - left_edge) / (right_edge - left_edge);
+			setValueAndCommit(t * (mMaxValue - mMinValue) + mMinValue );
+		}
+		else // mOrientation == VERTICAL
+		{
+			S32 thumb_half_height = mThumbImage->getHeight()/2;
+			S32 top_edge = thumb_half_height;
+			S32 bottom_edge = getRect().getHeight() - (thumb_half_height);
+
+			y += mMouseOffset;
+			y = llclamp(y, top_edge, bottom_edge);
 
+			F32 t = F32(y - top_edge) / (bottom_edge - top_edge);
+			setValueAndCommit(t * (mMaxValue - mMinValue) + mMinValue );
+		}
 		getWindow()->setCursor(UI_CURSOR_ARROW);
-		lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (active)" << llendl;		
+		lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (active)" << llendl;
 	}
 	else
 	{
@@ -198,7 +233,9 @@ BOOL LLSlider::handleMouseDown(S32 x, S32 y, MASK mask)
 		// Find the offset of the actual mouse location from the center of the thumb.
 		if (mThumbRect.pointInRect(x,y))
 		{
-			mMouseOffset = (mThumbRect.mLeft + mThumbImage->getWidth()/2) - x;
+			mMouseOffset = (mOrientation == HORIZONTAL)
+				? (mThumbRect.mLeft + mThumbImage->getWidth()/2) - x
+				: (mThumbRect.mBottom + mThumbImage->getHeight()/2) - y;
 		}
 		else
 		{
@@ -220,15 +257,12 @@ BOOL LLSlider::handleKeyHere(KEY key, MASK mask)
 	BOOL handled = FALSE;
 	switch(key)
 	{
-	case KEY_UP:
 	case KEY_DOWN:
-		// eat up and down keys to be consistent
-		handled = TRUE;
-		break;
 	case KEY_LEFT:
 		setValueAndCommit(getValueF32() - getIncrement());
 		handled = TRUE;
 		break;
+	case KEY_UP:
 	case KEY_RIGHT:
 		setValueAndCommit(getValueF32() + getIncrement());
 		handled = TRUE;
@@ -239,6 +273,17 @@ BOOL LLSlider::handleKeyHere(KEY key, MASK mask)
 	return handled;
 }
 
+BOOL LLSlider::handleScrollWheel(S32 x, S32 y, S32 clicks)
+{
+	if ( mOrientation == VERTICAL )
+	{
+		F32 new_val = getValueF32() - clicks * getIncrement();
+		setValueAndCommit(new_val);
+		return TRUE;
+	}
+	return LLF32UICtrl::handleScrollWheel(x,y,clicks);
+}
+
 void LLSlider::draw()
 {
 	F32 alpha = getDrawContext().mAlpha;
@@ -252,13 +297,36 @@ void LLSlider::draw()
 	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
 	// Track
-	LLRect track_rect(mThumbImage->getWidth() / 2, 
-						getLocalRect().getCenterY() + (mTrackImage->getHeight() / 2), 
-						getRect().getWidth() - mThumbImage->getWidth() / 2, 
-						getLocalRect().getCenterY() - (mTrackImage->getHeight() / 2) );
-	LLRect highlight_rect(track_rect.mLeft, track_rect.mTop, mThumbRect.getCenterX(), track_rect.mBottom);
-	mTrackImage->draw(track_rect, LLColor4::white % alpha);
-	mTrackHighlightImage->draw(highlight_rect, LLColor4::white % alpha);
+	LLPointer<LLUIImage>& trackImage = ( mOrientation == HORIZONTAL )
+		? mTrackImageHorizontal
+		: mTrackImageVertical;
+
+	LLPointer<LLUIImage>& trackHighlightImage = ( mOrientation == HORIZONTAL )
+		? mTrackHighlightHorizontalImage
+		: mTrackHighlightVerticalImage;
+
+	LLRect track_rect;
+	LLRect highlight_rect;
+
+	if ( mOrientation == HORIZONTAL )
+	{
+		track_rect.set(mThumbImage->getWidth() / 2,
+					   getLocalRect().getCenterY() + (trackImage->getHeight() / 2), 
+					   getRect().getWidth() - mThumbImage->getWidth() / 2,
+					   getLocalRect().getCenterY() - (trackImage->getHeight() / 2) );
+		highlight_rect.set(track_rect.mLeft, track_rect.mTop, mThumbRect.getCenterX(), track_rect.mBottom);
+	}
+	else
+	{
+		track_rect.set(getLocalRect().getCenterX() - (trackImage->getWidth() / 2),
+					   getRect().getHeight(),
+					   getLocalRect().getCenterX() + (trackImage->getWidth() / 2),
+					   0);
+		highlight_rect.set(track_rect.mLeft, track_rect.mTop, track_rect.mRight, track_rect.mBottom);
+	}
+
+	trackImage->draw(track_rect, LLColor4::white % alpha);
+	trackHighlightImage->draw(highlight_rect, LLColor4::white % alpha);
 
 	// Thumb
 	if (hasFocus())
diff --git a/indra/llui/llslider.h b/indra/llui/llslider.h
index e2a94e4d8cf..6ab0ed79220 100644
--- a/indra/llui/llslider.h
+++ b/indra/llui/llslider.h
@@ -39,8 +39,12 @@
 class LLSlider : public LLF32UICtrl
 {
 public:
+	enum ORIENTATION { HORIZONTAL, VERTICAL };
+
 	struct Params : public LLInitParam::Block<Params, LLF32UICtrl::Params>
 	{
+		Optional<std::string> orientation;
+
 		Optional<LLUIColor>	track_color,
 							thumb_outline_color,
 							thumb_center_color;
@@ -48,8 +52,10 @@ class LLSlider : public LLF32UICtrl
 		Optional<LLUIImage*>	thumb_image,
 								thumb_image_pressed,
 								thumb_image_disabled,
-								track_image,
-								track_highlight_image;
+								track_image_horizontal,
+								track_image_vertical,
+								track_highlight_horizontal_image,
+								track_highlight_vertical_image;
 
 		Optional<CommitCallbackParam>	mouse_down_callback,
 										mouse_up_callback;
@@ -77,6 +83,7 @@ class LLSlider : public LLF32UICtrl
 	virtual BOOL	handleMouseUp(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleMouseDown(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleKeyHere(KEY key, MASK mask);
+	virtual BOOL	handleScrollWheel(S32 x, S32 y, S32 clicks);
 	virtual void	draw();
 
 private:
@@ -90,10 +97,14 @@ class LLSlider : public LLF32UICtrl
 	LLPointer<LLUIImage>	mThumbImage;
 	LLPointer<LLUIImage>	mThumbImagePressed;
 	LLPointer<LLUIImage>	mThumbImageDisabled;
-	LLPointer<LLUIImage>	mTrackImage;
-	LLPointer<LLUIImage>	mTrackHighlightImage;
+	LLPointer<LLUIImage>	mTrackImageHorizontal;
+	LLPointer<LLUIImage>	mTrackImageVertical;
+	LLPointer<LLUIImage>	mTrackHighlightHorizontalImage;
+	LLPointer<LLUIImage>	mTrackHighlightVerticalImage;
+
+	const ORIENTATION	mOrientation;
 
-	LLRect			mThumbRect;
+	LLRect		mThumbRect;
 	LLUIColor	mTrackColor;
 	LLUIColor	mThumbOutlineColor;
 	LLUIColor	mThumbCenterColor;
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index d2c8558f0b2..ca1688ad1f7 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -3080,10 +3080,6 @@ void LLAgent::updateCamera()
 		mOrbitLeftKey > 0.f,	// right
 		mOrbitDownKey > 0.f);	// bottom
 
-		camera_floater->mZoom->setToggleState( 
-		mOrbitInKey > 0.f,		// top
-		mOrbitOutKey > 0.f);	// bottom
-
 		camera_floater->mTrack->setToggleState(
 		mPanLeftKey > 0.f,		// left
 		mPanUpKey > 0.f,		// top
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index d1317f7c368..92e958b32de 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -40,10 +40,12 @@
 // Viewer includes
 #include "lljoystickbutton.h"
 #include "llviewercontrol.h"
+#include "llviewercamera.h"
 #include "llbottomtray.h"
 #include "llagent.h"
 #include "lltoolmgr.h"
 #include "lltoolfocus.h"
+#include "llslider.h"
 
 // Constants
 const F32 CAMERA_BUTTON_DELAY = 0.0f;
@@ -54,6 +56,93 @@ const F32 CAMERA_BUTTON_DELAY = 0.0f;
 #define PRESETS "camera_presets"
 #define CONTROLS "controls"
 
+// Zoom the camera in and out
+class LLPanelCameraZoom
+:	public LLPanel
+{
+	LOG_CLASS(LLPanelCameraZoom);
+public:
+	LLPanelCameraZoom();
+
+	/* virtual */ BOOL	postBuild();
+	/* virtual */ void	onOpen(const LLSD& key);
+
+protected:
+	void	onZoomPlusHeldDown();
+	void	onZoomMinusHeldDown();
+	void	onSliderValueChanged();
+
+private:
+	F32			mSavedSliderVal;
+	LLButton*	mPlusBtn;
+	LLButton*	mMinusBtn;
+	LLSlider*	mSlider;
+};
+
+static LLRegisterPanelClassWrapper<LLPanelCameraZoom> t_camera_zoom_panel("camera_zoom_panel");
+
+//-------------------------------------------------------------------------------
+// LLPanelCameraZoom
+//-------------------------------------------------------------------------------
+
+LLPanelCameraZoom::LLPanelCameraZoom()
+:	mPlusBtn( NULL ),
+	mMinusBtn( NULL ),
+	mSlider( NULL ),
+	mSavedSliderVal(0.f)
+{
+	mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this));
+	mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this));
+	mCommitCallbackRegistrar.add("Slider.value_changed", boost::bind(&LLPanelCameraZoom::onSliderValueChanged, this));
+}
+
+BOOL LLPanelCameraZoom::postBuild()
+{
+	mPlusBtn  = getChild <LLButton> ("zoom_plus_btn");
+	mMinusBtn = getChild <LLButton> ("zoom_minus_btn");
+	mSlider   = getChild <LLSlider> ("zoom_slider");
+	mSlider->setMinValue(.0f);
+	mSlider->setMaxValue(8.f);
+	return LLPanel::postBuild();
+}
+
+void LLPanelCameraZoom::onOpen(const LLSD& key)
+{
+	LLVector3d to_focus = gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin()) - gAgent.calcFocusPositionTargetGlobal();
+	mSavedSliderVal = 8.f - (F32)to_focus.magVec(); // maximum minus current
+	mSlider->setValue( mSavedSliderVal );
+}
+
+void LLPanelCameraZoom::onZoomPlusHeldDown()
+{
+	F32 val = mSlider->getValueF32();
+	F32 inc = mSlider->getIncrement();
+	mSlider->setValue(val - inc);
+	// commit only if value changed
+	if (val != mSlider->getValueF32())
+		mSlider->onCommit();
+}
+
+void LLPanelCameraZoom::onZoomMinusHeldDown()
+{
+	F32 val = mSlider->getValueF32();
+	F32 inc = mSlider->getIncrement();
+	mSlider->setValue(val + inc);
+	// commit only if value changed
+	if (val != mSlider->getValueF32())
+		mSlider->onCommit();
+}
+
+void  LLPanelCameraZoom::onSliderValueChanged()
+{
+	F32 val	 = mSlider->getValueF32();
+	F32 rate = val - mSavedSliderVal;
+
+	gAgent.unlockView();
+	gAgent.cameraOrbitIn(rate);
+
+	mSavedSliderVal = val;
+}
 
 //
 // Member functions
@@ -125,6 +214,7 @@ void LLFloaterCamera::onOpen(const LLSD& key)
 		anchor_panel, this,
 		getDockTongue(), LLDockControl::TOP));
 
+	mZoom->onOpen(key);
 }
 
 void LLFloaterCamera::onClose(bool app_quitting)
@@ -147,7 +237,7 @@ BOOL LLFloaterCamera::postBuild()
 	setIsChrome(TRUE);
 
 	mRotate = getChild<LLJoystickCameraRotate>(ORBIT);
-	mZoom = getChild<LLJoystickCameraZoom>(ZOOM);
+	mZoom = getChild<LLPanelCameraZoom>(ZOOM);
 	mTrack = getChild<LLJoystickCameraTrack>(PAN);
 
 	assignButton2Mode(CAMERA_CTRL_MODE_ORBIT,			"orbit_btn");
diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h
index 583f279e627..4873a34e00b 100644
--- a/indra/newview/llfloatercamera.h
+++ b/indra/newview/llfloatercamera.h
@@ -39,6 +39,7 @@ class LLJoystickCameraRotate;
 class LLJoystickCameraZoom;
 class LLJoystickCameraTrack;
 class LLFloaterReg;
+class LLPanelCameraZoom;
 
 enum ECameraControlMode
 {
@@ -74,7 +75,7 @@ class LLFloaterCamera
 	virtual void onClose(bool app_quitting);
 
 	LLJoystickCameraRotate* mRotate;
-	LLJoystickCameraZoom*	mZoom;
+	LLPanelCameraZoom*	mZoom;
 	LLJoystickCameraTrack*	mTrack;
 
 private:
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index 5c09bc3a02b..2af451400ec 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -49,22 +49,57 @@
          top="22"
          visible="false"
          width="78" />
-         <!--TODO: replace with slider, + - images -->
- <joystick_zoom
-         follows="top|left"
-         height="78"
-         image_unselected="ScrollThumb_Vert"
-         layout="topleft"
-         left="7"
-         minus_image="ScrollThumb_Vert"
-         name="zoom"
-         plus_image="ScrollThumb_Vert"
-         quadrant="left"
-         scale_image="false"
-         sound_flags="3"
-         tool_tip="Zoom camera toward focus"
-         top="22"
-         width="20" />
+         <!--TODO: replace + - images -->
+         <panel
+            border="false"
+            class="camera_zoom_panel"
+            height="94"
+            layout="topleft"
+            left="7"
+            mouse_opaque="false"
+            name="zoom"
+            top="22"
+            width="18">
+           <button
+              follows="top|left"
+              height="18"
+              image_disabled="AddItem_Disabled"
+              image_selected="AddItem_Press"
+              image_unselected="AddItem_Off"
+              layout="topleft"
+              name="zoom_plus_btn"
+              width="18">
+             <commit_callback
+                function="Zoom.plus" />
+             <mouse_held_callback
+                function="Zoom.plus" />
+           </button>
+           <slider_bar
+              height="48"
+              layout="topleft"
+              name="zoom_slider"
+              orientation="vertical"
+              tool_tip="Zoom camera toward focus"
+              top_pad="0"
+              width="18">
+             <commit_callback function="Slider.value_changed"/>
+           </slider_bar>
+           <button
+              follows="top|left"
+              height="18"
+              image_disabled="AddItem_Disabled"
+              image_selected="AddItem_Press"
+              image_unselected="AddItem_Off"
+              layout="topleft"
+              name="zoom_minus_btn"
+              top_pad="0"
+              width="18">
+             <commit_callback
+                function="Zoom.minus" />
+             <mouse_held_callback
+                function="Zoom.minus" />
+           </button>
+         </panel>
          <joystick_rotate
          follows="top|left"
          height="78"
@@ -80,7 +115,7 @@
          tool_tip="Orbit camera around focus"
          top="22"
          width="78" />
-            <panel
+         <panel
          height="78"
          layout="topleft"
          left="36"
diff --git a/indra/newview/skins/default/xui/en/floater_test_slider.xml b/indra/newview/skins/default/xui/en/floater_test_slider.xml
index 57d8e686ce3..86ff82e01f2 100644
--- a/indra/newview/skins/default/xui/en/floater_test_slider.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_slider.xml
@@ -57,6 +57,13 @@
      width="200" />
     <slider_bar
      bottom="320"
+     height="100"
+     left="20"
+     name="slider_bar_vertical"
+     orientation="vertical"
+     width="20" />
+    <slider_bar
+     bottom="300"
      height="20"
      increment="1"
      initial_value="2.0"
@@ -64,6 +71,7 @@
      layout="topleft"
      max_val="5"
      min_val="1"
+     left_pad="20"
      name="slider_bar"
      width="300" />
     <slider
diff --git a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
index bc1ca339a20..706c89f5ed1 100644
--- a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
+++ b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
@@ -4,6 +4,8 @@
             thumb_center_color="SliderThumbCenterColor"
             thumb_image="SliderThumb_Off"
             thumb_image_pressed="SliderThumb_Press"
-            thumb_image_disabled="SliderThumb_Disabled" 
-            track_image="SliderTrack_Horiz"
-            track_highlight_image="SliderTrack_Horiz" />
+            thumb_image_disabled="SliderThumb_Disabled"
+            track_image_horizontal="SliderTrack_Horiz"
+            track_image_vertical="SliderTrack_Vert"
+            track_highlight_horizontal_image="SliderTrack_Horiz"
+            track_highlight_vertical_image="SliderTrack_Vert" />
-- 
GitLab


From 978dd80c963911372b0d311fec01b9d4de279c11 Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Thu, 12 Nov 2009 19:54:45 +0200
Subject: [PATCH 188/557] Implemented major sub-task EXT-2364 (Items in
 group/ad-hoc IM participant list (avatar names) should be reshaped when
 adding/removing the "(Moderator)" label)

--HG--
branch : product-engine
---
 indra/newview/llavatarlistitem.cpp  | 15 +++++++++++++++
 indra/newview/llavatarlistitem.h    |  2 ++
 indra/newview/llparticipantlist.cpp |  2 ++
 3 files changed, 19 insertions(+)

diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 7df278d887b..c670a65bcc0 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -311,3 +311,18 @@ void LLAvatarListItem::onNameCache(const std::string& first_name, const std::str
 	mAvatarName->setValue(name);
 	mAvatarName->setToolTip(name);
 }
+
+void LLAvatarListItem::reshapeAvatarName()
+{
+	S32 width_delta = 0;
+	width_delta += mShowProfileBtn ? mProfileBtnWidth : 0;
+	width_delta += mSpeakingIndicator->getVisible() ? mSpeakingIndicatorWidth : 0;
+	width_delta += mAvatarIcon->getVisible() ? mIconWidth : 0;
+	width_delta += mShowInfoBtn ? mInfoBtnWidth : 0;
+	width_delta += mLastInteractionTime->getVisible() ? mLastInteractionTime->getRect().getWidth() : 0;
+
+	S32 height = mAvatarName->getRect().getHeight();
+	S32 width  = getRect().getWidth() - width_delta;
+
+	mAvatarName->reshape(width, height);
+}
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index d379797a464..9d48101a44c 100644
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -82,6 +82,8 @@ class LLAvatarListItem : public LLPanel, public LLFriendObserver
 
 	void setContextMenu(ContextMenu* menu) { mContextMenu = menu; }
 
+	void reshapeAvatarName();
+
 private:
 
 	typedef enum e_online_status {
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index f5367c04772..13bd059d45e 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -130,6 +130,7 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)
 				{
 					name.erase(found, moderator_indicator_len);
 					item->setName(name);
+					item->reshapeAvatarName();
 				}
 			}
 		}
@@ -151,6 +152,7 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)
 					name += " ";
 					name += moderator_indicator;
 					item->setName(name);
+					item->reshapeAvatarName();
 				}
 			}
 		}
-- 
GitLab


From 700085a093c71023703b43ca19e7ba114f2183ff Mon Sep 17 00:00:00 2001
From: Lynx Linden <lynx@lindenlab.com>
Date: Thu, 12 Nov 2009 18:03:01 +0000
Subject: [PATCH 189/557] EXT-2367: Fixed potential NULL dereference crash in
 voice chat.

---
 indra/newview/llimpanel.cpp | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index 0b8b5935f87..87b801d73b6 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -848,8 +848,11 @@ void LLFloaterIMPanel::processSessionUpdate(const LLSD& session_update)
 		}
 
 
-		//update the speakers dropdown too
-		mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated);
+		//update the speakers dropdown too, if it's available
+		if (mSpeakerPanel)
+		{
+			mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated);
+		}
 	}
 }
 
-- 
GitLab


From 1d78ebedbd5da89c2a3180fdb1e6aae81510a86c Mon Sep 17 00:00:00 2001
From: richard <none@none>
Date: Thu, 12 Nov 2009 10:19:23 -0800
Subject: [PATCH 190/557] don't use LLWidgetTypeRegistry for now (useful only
 for schema generation) reverted ui_ctrl registration for creation of dummy
 LLUICtrls

---
 indra/llui/lluictrl.cpp        | 2 +-
 indra/llui/lluictrlfactory.cpp | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index dd807a3f7e3..08fc8fb7849 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -38,7 +38,7 @@
 #include "llpanel.h"
 #include "lluictrlfactory.h"
 
-static LLWidgetNameRegistry::StaticRegistrar r(&typeid(LLUICtrl::Params), "ui_ctrl");
+static LLDefaultChildRegistry::Register<LLUICtrl> r("ui_ctrl");
 
 LLUICtrl::Params::Params()
 :	tab_stop("tab_stop", true),
diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp
index adfbb41feb5..1c1450d7e9f 100644
--- a/indra/llui/lluictrlfactory.cpp
+++ b/indra/llui/lluictrlfactory.cpp
@@ -433,8 +433,8 @@ void LLUICtrlFactory::registerWidget(const std::type_info* widget_type, const st
 	LLWidgetNameRegistry ::instance().defaultRegistrar().add(param_block_type, tag);
 	// associate widget type with factory function
 	LLDefaultWidgetRegistry::instance().defaultRegistrar().add(widget_type, creator_func);
-	LLWidgetTypeRegistry::instance().defaultRegistrar().add(tag, widget_type);
 	//FIXME: comment this in when working on schema generation
+	//LLWidgetTypeRegistry::instance().defaultRegistrar().add(tag, widget_type);
 	//LLDefaultParamBlockRegistry::instance().defaultRegistrar().add(widget_type, &getEmptyParamBlock<T>);
 }
 
-- 
GitLab


From a4467f7245dd39b771f8bb210e6ea08ca0408d66 Mon Sep 17 00:00:00 2001
From: Leyla Farazha <leyla@lindenlab.com>
Date: Thu, 12 Nov 2009 10:19:30 -0800
Subject: [PATCH 191/557] Minimized floaters will now follow top left when main
 view is resized

---
 indra/llui/llfloater.cpp | 61 +++++++++++++++++++++++-----------------
 1 file changed, 35 insertions(+), 26 deletions(-)

diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 470ae45414b..2a0dcaf3336 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -1888,41 +1888,50 @@ void LLFloaterView::reshapeFloater(S32 width, S32 height, BOOL called_from_paren
 			// dependents use same follow flags as their "dependee"
 			continue;
 		}
-		LLRect r = floaterp->getRect();
-
-		// Compute absolute distance from each edge of screen
-		S32 left_offset = llabs(r.mLeft - 0);
-		S32 right_offset = llabs(old_width - r.mRight);
-
-		S32 top_offset = llabs(old_height - r.mTop);
-		S32 bottom_offset = llabs(r.mBottom - 0);
 
 		// Make if follow the edge it is closest to
 		U32 follow_flags = 0x0;
 
-		if (left_offset < right_offset)
+		if (floaterp->isMinimized())
 		{
-			follow_flags |= FOLLOWS_LEFT;
+			follow_flags |= (FOLLOWS_LEFT | FOLLOWS_TOP);
 		}
 		else
 		{
-			follow_flags |= FOLLOWS_RIGHT;
-		}
+			LLRect r = floaterp->getRect();
 
-		// "No vertical adjustment" usually means that the bottom of the view
-		// has been pushed up or down.  Hence we want the floaters to follow
-		// the top.
-		if (!adjust_vertical)
-		{
-			follow_flags |= FOLLOWS_TOP;
-		}
-		else if (top_offset < bottom_offset)
-		{
-			follow_flags |= FOLLOWS_TOP;
-		}
-		else
-		{
-			follow_flags |= FOLLOWS_BOTTOM;
+			// Compute absolute distance from each edge of screen
+			S32 left_offset = llabs(r.mLeft - 0);
+			S32 right_offset = llabs(old_width - r.mRight);
+
+			S32 top_offset = llabs(old_height - r.mTop);
+			S32 bottom_offset = llabs(r.mBottom - 0);
+
+
+			if (left_offset < right_offset)
+			{
+				follow_flags |= FOLLOWS_LEFT;
+			}
+			else
+			{
+				follow_flags |= FOLLOWS_RIGHT;
+			}
+
+			// "No vertical adjustment" usually means that the bottom of the view
+			// has been pushed up or down.  Hence we want the floaters to follow
+			// the top.
+			if (!adjust_vertical)
+			{
+				follow_flags |= FOLLOWS_TOP;
+			}
+			else if (top_offset < bottom_offset)
+			{
+				follow_flags |= FOLLOWS_TOP;
+			}
+			else
+			{
+				follow_flags |= FOLLOWS_BOTTOM;
+			}
 		}
 
 		floaterp->setFollows(follow_flags);
-- 
GitLab


From 74d5a6605bac7ae76889ce3697fc8f59d982d675 Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Thu, 12 Nov 2009 20:23:43 +0200
Subject: [PATCH 192/557] Fixed normal bug EXT-2375 (Nearby Chat: Click on
 object name spawns Person Inspector instead of Object Inspector)

--HG--
branch : product-engine
---
 indra/newview/llchathistory.cpp | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 43a1aeaefbb..046e1d92dcb 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -167,7 +167,15 @@ class LLChatHistoryHeader: public LLPanel
 
 	void onHeaderPanelClick(S32 x, S32 y, MASK mask)
 	{
-		LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mAvatarID));
+		if (mSourceType == CHAT_SOURCE_OBJECT)
+		{
+			LLFloaterReg::showInstance("inspect_object", LLSD().insert("object_id", mAvatarID));
+		}
+		else if (mSourceType == CHAT_SOURCE_AGENT)
+		{
+			LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mAvatarID));
+		}
+		//if chat source is system, you may add "else" here to define behaviour.
 	}
 
 	const LLUUID&		getAvatarId () const { return mAvatarID;}
-- 
GitLab


From 6eb5f380e3320fb181ad5720f82b6b2fd2d7baf5 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Thu, 12 Nov 2009 13:40:01 -0500
Subject: [PATCH 193/557] Extracted LLInventoryObserver classes from
 LLInventoryModel.h into their own subclass, LLInventoryObservers.h.  This
 reduces dependencies and compile times, and makes these classes easier to
 locate.

I have not yet refactored classes to remove #include "llinventorymodel.h" and replace with #include "llinventoryobservers.h".  This will happen later.
---
 indra/newview/CMakeLists.txt       |   2 +
 indra/newview/llinventorymodel.cpp | 507 -----------------------------
 indra/newview/llinventorymodel.h   | 231 +------------
 3 files changed, 17 insertions(+), 723 deletions(-)

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index b129bca1f39..3b7f902032d 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -252,6 +252,7 @@ set(viewer_SOURCE_FILES
     llinventoryfilter.cpp
     llinventoryfunctions.cpp
     llinventorymodel.cpp
+    llinventoryobservers.cpp
     llinventorypanel.cpp
     llinventorysubtreepanel.cpp
     lljoystickbutton.cpp
@@ -748,6 +749,7 @@ set(viewer_HEADER_FILES
     llinventoryfilter.h
     llinventoryfunctions.h
     llinventorymodel.h
+    llinventoryobservers.h
     llinventorypanel.h
     llinventorysubtreepanel.h
     lljoystickbutton.h
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index c57e41e9b3a..4b0d524906c 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -3721,513 +3721,6 @@ bool LLNameCategoryCollector::operator()(
 	return false;
 }
 
-
-
-///----------------------------------------------------------------------------
-/// Observers
-///----------------------------------------------------------------------------
-
-void LLInventoryCompletionObserver::changed(U32 mask)
-{
-	// scan through the incomplete items and move or erase them as
-	// appropriate.
-	if(!mIncomplete.empty())
-	{
-		for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); )
-		{
-			LLViewerInventoryItem* item = gInventory.getItem(*it);
-			if(!item)
-			{
-				it = mIncomplete.erase(it);
-				continue;
-			}
-			if(item->isComplete())
-			{
-				mComplete.push_back(*it);
-				it = mIncomplete.erase(it);
-				continue;
-			}
-			++it;
-		}
-		if(mIncomplete.empty())
-		{
-			done();
-		}
-	}
-}
-
-void LLInventoryCompletionObserver::watchItem(const LLUUID& id)
-{
-	if(id.notNull())
-	{
-		mIncomplete.push_back(id);
-	}
-}
-
-
-void LLInventoryFetchObserver::changed(U32 mask)
-{
-	// scan through the incomplete items and move or erase them as
-	// appropriate.
-	if(!mIncomplete.empty())
-	{
-		for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); )
-		{
-			LLViewerInventoryItem* item = gInventory.getItem(*it);
-			if(!item)
-			{
-				// BUG: This can cause done() to get called prematurely below.
-				// This happens with the LLGestureInventoryFetchObserver that
-				// loads gestures at startup. JC
-				it = mIncomplete.erase(it);
-				continue;
-			}
-			if(item->isComplete())
-			{
-				mComplete.push_back(*it);
-				it = mIncomplete.erase(it);
-				continue;
-			}
-			++it;
-		}
-		if(mIncomplete.empty())
-		{
-			done();
-		}
-	}
-	//llinfos << "LLInventoryFetchObserver::changed() mComplete size " << mComplete.size() << llendl;
-	//llinfos << "LLInventoryFetchObserver::changed() mIncomplete size " << mIncomplete.size() << llendl;
-}
-
-bool LLInventoryFetchObserver::isEverythingComplete() const
-{
-	return mIncomplete.empty();
-}
-
-void fetch_items_from_llsd(const LLSD& items_llsd)
-{
-	if (!items_llsd.size()) return;
-	LLSD body;
-	body[0]["cap_name"] = "FetchInventory";
-	body[1]["cap_name"] = "FetchLib";
-	for (S32 i=0; i<items_llsd.size();i++)
-	{
-		if (items_llsd[i]["owner_id"].asString() == gAgent.getID().asString())
-		{
-			body[0]["items"].append(items_llsd[i]);
-			continue;
-		}
-		if (items_llsd[i]["owner_id"].asString() == ALEXANDRIA_LINDEN_ID.asString())
-		{
-			body[1]["items"].append(items_llsd[i]);
-			continue;
-		}
-	}
-		
-	for (S32 i=0; i<body.size(); i++)
-	{
-		if (0 >= body[i].size()) continue;
-		std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString());
-
-		if (!url.empty())
-		{
-			body[i]["agent_id"]	= gAgent.getID();
-			LLHTTPClient::post(url, body[i], new LLInventoryModel::fetchInventoryResponder(body[i]));
-			break;
-		}
-
-		LLMessageSystem* msg = gMessageSystem;
-		BOOL start_new_message = TRUE;
-		for (S32 j=0; j<body[i]["items"].size(); j++)
-		{
-			LLSD item_entry = body[i]["items"][j];
-			if(start_new_message)
-			{
-				start_new_message = FALSE;
-				msg->newMessageFast(_PREHASH_FetchInventory);
-				msg->nextBlockFast(_PREHASH_AgentData);
-				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-			}
-			msg->nextBlockFast(_PREHASH_InventoryData);
-			msg->addUUIDFast(_PREHASH_OwnerID, item_entry["owner_id"].asUUID());
-			msg->addUUIDFast(_PREHASH_ItemID, item_entry["item_id"].asUUID());
-			if(msg->isSendFull(NULL))
-			{
-				start_new_message = TRUE;
-				gAgent.sendReliableMessage();
-			}
-		}
-		if(!start_new_message)
-		{
-			gAgent.sendReliableMessage();
-		}
-	}
-}
-
-void LLInventoryFetchObserver::fetchItems(
-	const LLInventoryFetchObserver::item_ref_t& ids)
-{
-	LLUUID owner_id;
-	LLSD items_llsd;
-	for(item_ref_t::const_iterator it = ids.begin(); it < ids.end(); ++it)
-	{
-		LLViewerInventoryItem* item = gInventory.getItem(*it);
-		if(item)
-		{
-			if(item->isComplete())
-			{
-				// It's complete, so put it on the complete container.
-				mComplete.push_back(*it);
-				continue;
-			}
-			else
-			{
-				owner_id = item->getPermissions().getOwner();
-			}
-		}
-		else
-		{
-			// assume it's agent inventory.
-			owner_id = gAgent.getID();
-		}
-		
-		// It's incomplete, so put it on the incomplete container, and
-		// pack this on the message.
-		mIncomplete.push_back(*it);
-		
-		// Prepare the data to fetch
-		LLSD item_entry;
-		item_entry["owner_id"] = owner_id;
-		item_entry["item_id"] = (*it);
-		items_llsd.append(item_entry);
-	}
-	fetch_items_from_llsd(items_llsd);
-}
-
-// virtual
-void LLInventoryFetchDescendentsObserver::changed(U32 mask)
-{
-	for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();)
-	{
-		LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
-		if(!cat)
-		{
-			it = mIncompleteFolders.erase(it);
-			continue;
-		}
-		if(isComplete(cat))
-		{
-			mCompleteFolders.push_back(*it);
-			it = mIncompleteFolders.erase(it);
-			continue;
-		}
-		++it;
-	}
-	if(mIncompleteFolders.empty())
-	{
-		done();
-	}
-}
-
-void LLInventoryFetchDescendentsObserver::fetchDescendents(
-	const folder_ref_t& ids)
-{
-	for(folder_ref_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
-	{
-		LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
-		if(!cat) continue;
-		if(!isComplete(cat))
-		{
-			cat->fetchDescendents();		//blindly fetch it without seeing if anything else is fetching it.
-			mIncompleteFolders.push_back(*it);	//Add to list of things being downloaded for this observer.
-		}
-		else
-		{
-			mCompleteFolders.push_back(*it);
-		}
-	}
-}
-
-bool LLInventoryFetchDescendentsObserver::isEverythingComplete() const
-{
-	return mIncompleteFolders.empty();
-}
-
-bool LLInventoryFetchDescendentsObserver::isComplete(LLViewerInventoryCategory* cat)
-{
-	S32 version = cat->getVersion();
-	S32 descendents = cat->getDescendentCount();
-	if((LLViewerInventoryCategory::VERSION_UNKNOWN == version)
-	   || (LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN == descendents))
-	{
-		return false;
-	}
-	// it might be complete - check known descendents against
-	// currently available.
-	LLInventoryModel::cat_array_t* cats;
-	LLInventoryModel::item_array_t* items;
-	gInventory.getDirectDescendentsOf(cat->getUUID(), cats, items);
-	if(!cats || !items)
-	{
-		// bit of a hack - pretend we're done if they are gone or
-		// incomplete. should never know, but it would suck if this
-		// kept tight looping because of a corrupt memory state.
-		return true;
-	}
-	S32 known = cats->count() + items->count();
-	if(descendents == known)
-	{
-		// hey - we're done.
-		return true;
-	}
-	return false;
-}
-
-void LLInventoryFetchComboObserver::changed(U32 mask)
-{
-	if(!mIncompleteItems.empty())
-	{
-		for(item_ref_t::iterator it = mIncompleteItems.begin(); it < mIncompleteItems.end(); )
-		{
-			LLViewerInventoryItem* item = gInventory.getItem(*it);
-			if(!item)
-			{
-				it = mIncompleteItems.erase(it);
-				continue;
-			}
-			if(item->isComplete())
-			{
-				mCompleteItems.push_back(*it);
-				it = mIncompleteItems.erase(it);
-				continue;
-			}
-			++it;
-		}
-	}
-	if(!mIncompleteFolders.empty())
-	{
-		for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();)
-		{
-			LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
-			if(!cat)
-			{
-				it = mIncompleteFolders.erase(it);
-				continue;
-			}
-			if(gInventory.isCategoryComplete(*it))
-			{
-				mCompleteFolders.push_back(*it);
-				it = mIncompleteFolders.erase(it);
-				continue;
-			}
-			++it;
-		}
-	}
-	if(!mDone && mIncompleteItems.empty() && mIncompleteFolders.empty())
-	{
-		mDone = true;
-		done();
-	}
-}
-
-void LLInventoryFetchComboObserver::fetch(
-	const folder_ref_t& folder_ids,
-	const item_ref_t& item_ids)
-{
-	lldebugs << "LLInventoryFetchComboObserver::fetch()" << llendl;
-	for(folder_ref_t::const_iterator fit = folder_ids.begin(); fit != folder_ids.end(); ++fit)
-	{
-		LLViewerInventoryCategory* cat = gInventory.getCategory(*fit);
-		if(!cat) continue;
-		if(!gInventory.isCategoryComplete(*fit))
-		{
-			cat->fetchDescendents();
-			lldebugs << "fetching folder " << *fit <<llendl;
-			mIncompleteFolders.push_back(*fit);
-		}
-		else
-		{
-			mCompleteFolders.push_back(*fit);
-			lldebugs << "completing folder " << *fit <<llendl;
-		}
-	}
-
-	// Now for the items - we fetch everything which is not a direct
-	// descendent of an incomplete folder because the item will show
-	// up in an inventory descendents message soon enough so we do not
-	// have to fetch it individually.
-	LLSD items_llsd;
-	LLUUID owner_id;
-	for(item_ref_t::const_iterator iit = item_ids.begin(); iit != item_ids.end(); ++iit)
-	{
-		LLViewerInventoryItem* item = gInventory.getItem(*iit);
-		if(!item)
-		{
-			lldebugs << "uanble to find item " << *iit << llendl;
-			continue;
-		}
-		if(item->isComplete())
-		{
-			// It's complete, so put it on the complete container.
-			mCompleteItems.push_back(*iit);
-			lldebugs << "completing item " << *iit << llendl;
-			continue;
-		}
-		else
-		{
-			mIncompleteItems.push_back(*iit);
-			owner_id = item->getPermissions().getOwner();
-		}
-		if(std::find(mIncompleteFolders.begin(), mIncompleteFolders.end(), item->getParentUUID()) == mIncompleteFolders.end())
-		{
-			LLSD item_entry;
-			item_entry["owner_id"] = owner_id;
-			item_entry["item_id"] = (*iit);
-			items_llsd.append(item_entry);
-		}
-		else
-		{
-			lldebugs << "not worrying about " << *iit << llendl;
-		}
-	}
-	fetch_items_from_llsd(items_llsd);
-}
-
-void LLInventoryExistenceObserver::watchItem(const LLUUID& id)
-{
-	if(id.notNull())
-	{
-		mMIA.push_back(id);
-	}
-}
-
-void LLInventoryExistenceObserver::changed(U32 mask)
-{
-	// scan through the incomplete items and move or erase them as
-	// appropriate.
-	if(!mMIA.empty())
-	{
-		for(item_ref_t::iterator it = mMIA.begin(); it < mMIA.end(); )
-		{
-			LLViewerInventoryItem* item = gInventory.getItem(*it);
-			if(!item)
-			{
-				++it;
-				continue;
-			}
-			mExist.push_back(*it);
-			it = mMIA.erase(it);
-		}
-		if(mMIA.empty())
-		{
-			done();
-		}
-	}
-}
-
-void LLInventoryAddedObserver::changed(U32 mask)
-{
-	if(!(mask & LLInventoryObserver::ADD))
-	{
-		return;
-	}
-
-	// *HACK: If this was in response to a packet off
-	// the network, figure out which item was updated.
-	LLMessageSystem* msg = gMessageSystem;
-
-	std::string msg_name;
-	if (mMessageName.empty())
-	{
-		msg_name = msg->getMessageName();
-	}
-	else
-	{
-		msg_name = mMessageName;
-	}
-
-	if (msg_name.empty())
-	{
-		return;
-	}
-	
-	// We only want newly created inventory items. JC
-	if ( msg_name != "UpdateCreateInventoryItem")
-	{
-		return;
-	}
-
-	LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
-	S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_InventoryData);
-	for(S32 i = 0; i < num_blocks; ++i)
-	{
-		titem->unpackMessage(msg, _PREHASH_InventoryData, i);
-		if (!(titem->getUUID().isNull()))
-		{
-			//we don't do anything with null keys
-			mAdded.push_back(titem->getUUID());
-		}
-	}
-	if (!mAdded.empty())
-	{
-		done();
-	}
-}
-
-LLInventoryTransactionObserver::LLInventoryTransactionObserver(
-	const LLTransactionID& transaction_id) :
-	mTransactionID(transaction_id)
-{
-}
-
-void LLInventoryTransactionObserver::changed(U32 mask)
-{
-	if(mask & LLInventoryObserver::ADD)
-	{
-		// This could be it - see if we are processing a bulk update
-		LLMessageSystem* msg = gMessageSystem;
-		if(msg->getMessageName()
-		   && (0 == strcmp(msg->getMessageName(), "BulkUpdateInventory")))
-		{
-			// we have a match for the message - now check the
-			// transaction id.
-			LLUUID id;
-			msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_TransactionID, id);
-			if(id == mTransactionID)
-			{
-				// woo hoo, we found it
-				folder_ref_t folders;
-				item_ref_t items;
-				S32 count;
-				count = msg->getNumberOfBlocksFast(_PREHASH_FolderData);
-				S32 i;
-				for(i = 0; i < count; ++i)
-				{
-					msg->getUUIDFast(_PREHASH_FolderData, _PREHASH_FolderID, id, i);
-					if(id.notNull())
-					{
-						folders.push_back(id);
-					}
-				}
-				count = msg->getNumberOfBlocksFast(_PREHASH_ItemData);
-				for(i = 0; i < count; ++i)
-				{
-					msg->getUUIDFast(_PREHASH_ItemData, _PREHASH_ItemID, id, i);
-					if(id.notNull())
-					{
-						items.push_back(id);
-					}
-				}
-
-				// call the derived class the implements this method.
-				done(folders, items);
-			}
-		}
-	}
-}
-
-
 ///----------------------------------------------------------------------------
 /// LLAssetIDMatches 
 ///----------------------------------------------------------------------------
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index ebfb0a7000e..c09d3eba8c6 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -41,40 +41,27 @@
 #include "lluuid.h"
 #include "llpermissionsflags.h"
 #include "llstring.h"
-
 #include <map>
 #include <set>
 #include <string>
 #include <vector>
 
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryObserver
-//
-// This class is designed to be a simple abstract base class which can
-// relay messages when the inventory changes.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// ! REFACTOR ! Remove llinventoryobservers.h and have other files that need it explicitly 
+// include llinventoryobservers.h instead of llinventorymodel.h .  This will reduce dependency on
+// llinventorymodel.h.
+#include "llinventoryobservers.h" 
+
+class LLInventoryObserver;
+class LLInventoryObject;
+class LLInventoryItem;
+class LLInventoryCategory;
+class LLViewerInventoryItem;
+class LLViewerInventoryCategory;
+class LLViewerInventoryItem;
+class LLViewerInventoryCategory;
+class LLMessageSystem;
+class LLInventoryCollectFunctor;
 
-class LLInventoryObserver
-{
-public:
-	// This enumeration is a way to refer to what changed in a more
-	// human readable format. You can mask the value provided by
-	// chaged() to see if the observer is interested in the change.
-	enum 
-	{
-		NONE = 0,
-		LABEL = 1,			// name changed
-		INTERNAL = 2,		// internal change, eg, asset uuid different
-		ADD = 4,			// something added
-		REMOVE = 8,			// something deleted
-		STRUCTURE = 16,		// structural change, eg, item or folder moved
-		CALLING_CARD = 32,	// online, grant status, cancel, etc change
-		ALL = 0xffffffff
-	};
-	virtual ~LLInventoryObserver() {};
-	virtual void changed(U32 mask) = 0;
-	std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328]
-};
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // Class LLInventoryModel
@@ -87,16 +74,6 @@ class LLInventoryObserver
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-class LLInventoryObject;
-class LLInventoryItem;
-class LLInventoryCategory;
-class LLViewerInventoryItem;
-class LLViewerInventoryCategory;
-class LLViewerInventoryItem;
-class LLViewerInventoryCategory;
-class LLMessageSystem;
-class LLInventoryCollectFunctor;
-
 class LLInventoryModel
 {
 public:
@@ -771,183 +748,5 @@ class LLFindWearables : public LLInventoryCollectFunctor
 							LLInventoryItem* item);
 };
 
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryCompletionObserver
-//
-// Class which can be used as a base class for doing something when
-// when all observed items are locally complete. This class implements
-// the changed() method of LLInventoryObserver and declares a new
-// method named done() which is called when all watched items have
-// complete information in the inventory model.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryCompletionObserver : public LLInventoryObserver
-{
-public:
-	LLInventoryCompletionObserver() {}
-	virtual void changed(U32 mask);
-
-	void watchItem(const LLUUID& id);
-
-protected:
-	virtual void done() = 0;
-
-	typedef std::vector<LLUUID> item_ref_t;
-	item_ref_t mComplete;
-	item_ref_t mIncomplete;
-};
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryFetchObserver
-//
-// This class is much like the LLInventoryCompletionObserver, except
-// that it handles all the the fetching necessary. Override the done()
-// method to do the thing you want.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryFetchObserver : public LLInventoryObserver
-{
-public:
-	LLInventoryFetchObserver() {}
-	virtual void changed(U32 mask);
-
-	typedef std::vector<LLUUID> item_ref_t;
-
-	bool isEverythingComplete() const;
-	void fetchItems(const item_ref_t& ids);
-	virtual void done() = 0;
-
-protected:
-	item_ref_t mComplete;
-	item_ref_t mIncomplete;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryFetchDescendentsObserver
-//
-// This class is much like the LLInventoryCompletionObserver, except
-// that it handles fetching based on category. Override the done()
-// method to do the thing you want.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLInventoryFetchDescendentsObserver : public LLInventoryObserver
-{
-public:
-	LLInventoryFetchDescendentsObserver() {}
-	virtual void changed(U32 mask);
-
-	typedef std::vector<LLUUID> folder_ref_t;
-	void fetchDescendents(const folder_ref_t& ids);
-	bool isEverythingComplete() const;
-	virtual void done() = 0;
-
-protected:
-	bool isComplete(LLViewerInventoryCategory* cat);
-	folder_ref_t mIncompleteFolders;
-	folder_ref_t mCompleteFolders;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryFetchComboObserver
-//
-// This class does an appropriate combination of fetch descendents and
-// item fetches based on completion of categories and items. Much like
-// the fetch and fetch descendents, this will call done() when everything
-// has arrived.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLInventoryFetchComboObserver : public LLInventoryObserver
-{
-public:
-	LLInventoryFetchComboObserver() : mDone(false) {}
-	virtual void changed(U32 mask);
-
-	typedef std::vector<LLUUID> folder_ref_t;
-	typedef std::vector<LLUUID> item_ref_t;
-	void fetch(const folder_ref_t& folder_ids, const item_ref_t& item_ids);
-
-	virtual void done() = 0;
-
-protected:
-	bool mDone;
-	folder_ref_t mCompleteFolders;
-	folder_ref_t mIncompleteFolders;
-	item_ref_t mCompleteItems;
-	item_ref_t mIncompleteItems;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryExistenceObserver
-//
-// This class is used as a base class for doing somethign when all the
-// observed item ids exist in the inventory somewhere. You can derive
-// a class from this class and implement the done() method to do
-// something useful.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryExistenceObserver : public LLInventoryObserver
-{
-public:
-	LLInventoryExistenceObserver() {}
-	virtual void changed(U32 mask);
-
-	void watchItem(const LLUUID& id);
-
-protected:
-	virtual void done() = 0;
-
-	typedef std::vector<LLUUID> item_ref_t;
-	item_ref_t mExist;
-	item_ref_t mMIA;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryAddedObserver
-//
-// This class is used as a base class for doing something when 
-// a new item arrives in inventory.
-// It does not watch for a certain UUID, rather it acts when anything is added
-// Derive a class from this class and implement the done() method to do
-// something useful.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryAddedObserver : public LLInventoryObserver
-{
-public:
-	LLInventoryAddedObserver() : mAdded() {}
-	virtual void changed(U32 mask);
-
-protected:
-	virtual void done() = 0;
-
-	typedef std::vector<LLUUID> item_ref_t;
-	item_ref_t mAdded;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryTransactionObserver
-//
-// Class which can be used as a base class for doing something when an
-// inventory transaction completes.
-//
-// *NOTE: This class is not quite complete. Avoid using unless you fix up it's
-// functionality gaps.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryTransactionObserver : public LLInventoryObserver
-{
-public:
-	LLInventoryTransactionObserver(const LLTransactionID& transaction_id);
-	virtual void changed(U32 mask);
-
-protected:
-	typedef std::vector<LLUUID> folder_ref_t;
-	typedef std::vector<LLUUID> item_ref_t;
-	virtual void done(const folder_ref_t& folders, const item_ref_t& items) = 0;
-
-	LLTransactionID mTransactionID;
-};
-
-
 #endif // LL_LLINVENTORYMODEL_H
 
-- 
GitLab


From d53a354a9cc2589a7aa5d2d0cfc83ed0322c5e54 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Thu, 12 Nov 2009 13:56:36 -0500
Subject: [PATCH 194/557] Rename LLInventoryObservers to LLInventoryObserver

---
 indra/newview/CMakeLists.txt          |   4 +-
 indra/newview/llinventorymodel.h      |   2 +-
 indra/newview/llinventoryobserver.cpp | 564 ++++++++++++++++++++++++++
 indra/newview/llinventoryobserver.h   | 249 ++++++++++++
 4 files changed, 816 insertions(+), 3 deletions(-)
 create mode 100644 indra/newview/llinventoryobserver.cpp
 create mode 100644 indra/newview/llinventoryobserver.h

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 3b7f902032d..9d44f34ea8b 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -252,7 +252,7 @@ set(viewer_SOURCE_FILES
     llinventoryfilter.cpp
     llinventoryfunctions.cpp
     llinventorymodel.cpp
-    llinventoryobservers.cpp
+    llinventoryobserver.cpp
     llinventorypanel.cpp
     llinventorysubtreepanel.cpp
     lljoystickbutton.cpp
@@ -749,7 +749,7 @@ set(viewer_HEADER_FILES
     llinventoryfilter.h
     llinventoryfunctions.h
     llinventorymodel.h
-    llinventoryobservers.h
+    llinventoryobserver.h
     llinventorypanel.h
     llinventorysubtreepanel.h
     lljoystickbutton.h
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index c09d3eba8c6..bd64591194c 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -49,7 +49,7 @@
 // ! REFACTOR ! Remove llinventoryobservers.h and have other files that need it explicitly 
 // include llinventoryobservers.h instead of llinventorymodel.h .  This will reduce dependency on
 // llinventorymodel.h.
-#include "llinventoryobservers.h" 
+#include "llinventoryobserver.h" 
 
 class LLInventoryObserver;
 class LLInventoryObject;
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
new file mode 100644
index 00000000000..3ccf593d278
--- /dev/null
+++ b/indra/newview/llinventoryobserver.cpp
@@ -0,0 +1,564 @@
+/** 
+ * @file llinventoryobserver.cpp
+ * @brief Implementation of the inventory observers used to track agent inventory.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llinventoryobserver.h"
+
+#include "llassetstorage.h"
+#include "llcrc.h"
+#include "lldir.h"
+#include "llsys.h"
+#include "llxfermanager.h"
+#include "message.h"
+
+#include "llagent.h"
+#include "llagentwearables.h"
+#include "llfloater.h"
+#include "llfocusmgr.h"
+#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
+#include "llinventorymodel.h"
+#include "llviewermessage.h"
+#include "llviewerwindow.h"
+#include "llviewerregion.h"
+#include "llappviewer.h"
+#include "lldbstrings.h"
+#include "llviewerstats.h"
+#include "llmutelist.h"
+#include "llnotifications.h"
+#include "llcallbacklist.h"
+#include "llpreview.h"
+#include "llviewercontrol.h"
+#include "llvoavatarself.h"
+#include "llsdutil.h"
+#include <deque>
+
+void LLInventoryCompletionObserver::changed(U32 mask)
+{
+	// scan through the incomplete items and move or erase them as
+	// appropriate.
+	if(!mIncomplete.empty())
+	{
+		for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); )
+		{
+			LLViewerInventoryItem* item = gInventory.getItem(*it);
+			if(!item)
+			{
+				it = mIncomplete.erase(it);
+				continue;
+			}
+			if(item->isComplete())
+			{
+				mComplete.push_back(*it);
+				it = mIncomplete.erase(it);
+				continue;
+			}
+			++it;
+		}
+		if(mIncomplete.empty())
+		{
+			done();
+		}
+	}
+}
+
+void LLInventoryCompletionObserver::watchItem(const LLUUID& id)
+{
+	if(id.notNull())
+	{
+		mIncomplete.push_back(id);
+	}
+}
+
+
+void LLInventoryFetchObserver::changed(U32 mask)
+{
+	// scan through the incomplete items and move or erase them as
+	// appropriate.
+	if(!mIncomplete.empty())
+	{
+		for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); )
+		{
+			LLViewerInventoryItem* item = gInventory.getItem(*it);
+			if(!item)
+			{
+				// BUG: This can cause done() to get called prematurely below.
+				// This happens with the LLGestureInventoryFetchObserver that
+				// loads gestures at startup. JC
+				it = mIncomplete.erase(it);
+				continue;
+			}
+			if(item->isComplete())
+			{
+				mComplete.push_back(*it);
+				it = mIncomplete.erase(it);
+				continue;
+			}
+			++it;
+		}
+		if(mIncomplete.empty())
+		{
+			done();
+		}
+	}
+	//llinfos << "LLInventoryFetchObserver::changed() mComplete size " << mComplete.size() << llendl;
+	//llinfos << "LLInventoryFetchObserver::changed() mIncomplete size " << mIncomplete.size() << llendl;
+}
+
+bool LLInventoryFetchObserver::isEverythingComplete() const
+{
+	return mIncomplete.empty();
+}
+
+void fetch_items_from_llsd(const LLSD& items_llsd)
+{
+	if (!items_llsd.size()) return;
+	LLSD body;
+	body[0]["cap_name"] = "FetchInventory";
+	body[1]["cap_name"] = "FetchLib";
+	for (S32 i=0; i<items_llsd.size();i++)
+	{
+		if (items_llsd[i]["owner_id"].asString() == gAgent.getID().asString())
+		{
+			body[0]["items"].append(items_llsd[i]);
+			continue;
+		}
+		if (items_llsd[i]["owner_id"].asString() == ALEXANDRIA_LINDEN_ID.asString())
+		{
+			body[1]["items"].append(items_llsd[i]);
+			continue;
+		}
+	}
+		
+	for (S32 i=0; i<body.size(); i++)
+	{
+		if (0 >= body[i].size()) continue;
+		std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString());
+
+		if (!url.empty())
+		{
+			body[i]["agent_id"]	= gAgent.getID();
+			LLHTTPClient::post(url, body[i], new LLInventoryModel::fetchInventoryResponder(body[i]));
+			break;
+		}
+
+		LLMessageSystem* msg = gMessageSystem;
+		BOOL start_new_message = TRUE;
+		for (S32 j=0; j<body[i]["items"].size(); j++)
+		{
+			LLSD item_entry = body[i]["items"][j];
+			if(start_new_message)
+			{
+				start_new_message = FALSE;
+				msg->newMessageFast(_PREHASH_FetchInventory);
+				msg->nextBlockFast(_PREHASH_AgentData);
+				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+			}
+			msg->nextBlockFast(_PREHASH_InventoryData);
+			msg->addUUIDFast(_PREHASH_OwnerID, item_entry["owner_id"].asUUID());
+			msg->addUUIDFast(_PREHASH_ItemID, item_entry["item_id"].asUUID());
+			if(msg->isSendFull(NULL))
+			{
+				start_new_message = TRUE;
+				gAgent.sendReliableMessage();
+			}
+		}
+		if(!start_new_message)
+		{
+			gAgent.sendReliableMessage();
+		}
+	}
+}
+
+void LLInventoryFetchObserver::fetchItems(
+	const LLInventoryFetchObserver::item_ref_t& ids)
+{
+	LLUUID owner_id;
+	LLSD items_llsd;
+	for(item_ref_t::const_iterator it = ids.begin(); it < ids.end(); ++it)
+	{
+		LLViewerInventoryItem* item = gInventory.getItem(*it);
+		if(item)
+		{
+			if(item->isComplete())
+			{
+				// It's complete, so put it on the complete container.
+				mComplete.push_back(*it);
+				continue;
+			}
+			else
+			{
+				owner_id = item->getPermissions().getOwner();
+			}
+		}
+		else
+		{
+			// assume it's agent inventory.
+			owner_id = gAgent.getID();
+		}
+		
+		// It's incomplete, so put it on the incomplete container, and
+		// pack this on the message.
+		mIncomplete.push_back(*it);
+		
+		// Prepare the data to fetch
+		LLSD item_entry;
+		item_entry["owner_id"] = owner_id;
+		item_entry["item_id"] = (*it);
+		items_llsd.append(item_entry);
+	}
+	fetch_items_from_llsd(items_llsd);
+}
+
+// virtual
+void LLInventoryFetchDescendentsObserver::changed(U32 mask)
+{
+	for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();)
+	{
+		LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
+		if(!cat)
+		{
+			it = mIncompleteFolders.erase(it);
+			continue;
+		}
+		if(isComplete(cat))
+		{
+			mCompleteFolders.push_back(*it);
+			it = mIncompleteFolders.erase(it);
+			continue;
+		}
+		++it;
+	}
+	if(mIncompleteFolders.empty())
+	{
+		done();
+	}
+}
+
+void LLInventoryFetchDescendentsObserver::fetchDescendents(
+	const folder_ref_t& ids)
+{
+	for(folder_ref_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
+	{
+		LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
+		if(!cat) continue;
+		if(!isComplete(cat))
+		{
+			cat->fetchDescendents();		//blindly fetch it without seeing if anything else is fetching it.
+			mIncompleteFolders.push_back(*it);	//Add to list of things being downloaded for this observer.
+		}
+		else
+		{
+			mCompleteFolders.push_back(*it);
+		}
+	}
+}
+
+bool LLInventoryFetchDescendentsObserver::isEverythingComplete() const
+{
+	return mIncompleteFolders.empty();
+}
+
+bool LLInventoryFetchDescendentsObserver::isComplete(LLViewerInventoryCategory* cat)
+{
+	S32 version = cat->getVersion();
+	S32 descendents = cat->getDescendentCount();
+	if((LLViewerInventoryCategory::VERSION_UNKNOWN == version)
+	   || (LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN == descendents))
+	{
+		return false;
+	}
+	// it might be complete - check known descendents against
+	// currently available.
+	LLInventoryModel::cat_array_t* cats;
+	LLInventoryModel::item_array_t* items;
+	gInventory.getDirectDescendentsOf(cat->getUUID(), cats, items);
+	if(!cats || !items)
+	{
+		// bit of a hack - pretend we're done if they are gone or
+		// incomplete. should never know, but it would suck if this
+		// kept tight looping because of a corrupt memory state.
+		return true;
+	}
+	S32 known = cats->count() + items->count();
+	if(descendents == known)
+	{
+		// hey - we're done.
+		return true;
+	}
+	return false;
+}
+
+void LLInventoryFetchComboObserver::changed(U32 mask)
+{
+	if(!mIncompleteItems.empty())
+	{
+		for(item_ref_t::iterator it = mIncompleteItems.begin(); it < mIncompleteItems.end(); )
+		{
+			LLViewerInventoryItem* item = gInventory.getItem(*it);
+			if(!item)
+			{
+				it = mIncompleteItems.erase(it);
+				continue;
+			}
+			if(item->isComplete())
+			{
+				mCompleteItems.push_back(*it);
+				it = mIncompleteItems.erase(it);
+				continue;
+			}
+			++it;
+		}
+	}
+	if(!mIncompleteFolders.empty())
+	{
+		for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();)
+		{
+			LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
+			if(!cat)
+			{
+				it = mIncompleteFolders.erase(it);
+				continue;
+			}
+			if(gInventory.isCategoryComplete(*it))
+			{
+				mCompleteFolders.push_back(*it);
+				it = mIncompleteFolders.erase(it);
+				continue;
+			}
+			++it;
+		}
+	}
+	if(!mDone && mIncompleteItems.empty() && mIncompleteFolders.empty())
+	{
+		mDone = true;
+		done();
+	}
+}
+
+void LLInventoryFetchComboObserver::fetch(
+	const folder_ref_t& folder_ids,
+	const item_ref_t& item_ids)
+{
+	lldebugs << "LLInventoryFetchComboObserver::fetch()" << llendl;
+	for(folder_ref_t::const_iterator fit = folder_ids.begin(); fit != folder_ids.end(); ++fit)
+	{
+		LLViewerInventoryCategory* cat = gInventory.getCategory(*fit);
+		if(!cat) continue;
+		if(!gInventory.isCategoryComplete(*fit))
+		{
+			cat->fetchDescendents();
+			lldebugs << "fetching folder " << *fit <<llendl;
+			mIncompleteFolders.push_back(*fit);
+		}
+		else
+		{
+			mCompleteFolders.push_back(*fit);
+			lldebugs << "completing folder " << *fit <<llendl;
+		}
+	}
+
+	// Now for the items - we fetch everything which is not a direct
+	// descendent of an incomplete folder because the item will show
+	// up in an inventory descendents message soon enough so we do not
+	// have to fetch it individually.
+	LLSD items_llsd;
+	LLUUID owner_id;
+	for(item_ref_t::const_iterator iit = item_ids.begin(); iit != item_ids.end(); ++iit)
+	{
+		LLViewerInventoryItem* item = gInventory.getItem(*iit);
+		if(!item)
+		{
+			lldebugs << "uanble to find item " << *iit << llendl;
+			continue;
+		}
+		if(item->isComplete())
+		{
+			// It's complete, so put it on the complete container.
+			mCompleteItems.push_back(*iit);
+			lldebugs << "completing item " << *iit << llendl;
+			continue;
+		}
+		else
+		{
+			mIncompleteItems.push_back(*iit);
+			owner_id = item->getPermissions().getOwner();
+		}
+		if(std::find(mIncompleteFolders.begin(), mIncompleteFolders.end(), item->getParentUUID()) == mIncompleteFolders.end())
+		{
+			LLSD item_entry;
+			item_entry["owner_id"] = owner_id;
+			item_entry["item_id"] = (*iit);
+			items_llsd.append(item_entry);
+		}
+		else
+		{
+			lldebugs << "not worrying about " << *iit << llendl;
+		}
+	}
+	fetch_items_from_llsd(items_llsd);
+}
+
+void LLInventoryExistenceObserver::watchItem(const LLUUID& id)
+{
+	if(id.notNull())
+	{
+		mMIA.push_back(id);
+	}
+}
+
+void LLInventoryExistenceObserver::changed(U32 mask)
+{
+	// scan through the incomplete items and move or erase them as
+	// appropriate.
+	if(!mMIA.empty())
+	{
+		for(item_ref_t::iterator it = mMIA.begin(); it < mMIA.end(); )
+		{
+			LLViewerInventoryItem* item = gInventory.getItem(*it);
+			if(!item)
+			{
+				++it;
+				continue;
+			}
+			mExist.push_back(*it);
+			it = mMIA.erase(it);
+		}
+		if(mMIA.empty())
+		{
+			done();
+		}
+	}
+}
+
+void LLInventoryAddedObserver::changed(U32 mask)
+{
+	if(!(mask & LLInventoryObserver::ADD))
+	{
+		return;
+	}
+
+	// *HACK: If this was in response to a packet off
+	// the network, figure out which item was updated.
+	LLMessageSystem* msg = gMessageSystem;
+
+	std::string msg_name;
+	if (mMessageName.empty())
+	{
+		msg_name = msg->getMessageName();
+	}
+	else
+	{
+		msg_name = mMessageName;
+	}
+
+	if (msg_name.empty())
+	{
+		return;
+	}
+	
+	// We only want newly created inventory items. JC
+	if ( msg_name != "UpdateCreateInventoryItem")
+	{
+		return;
+	}
+
+	LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
+	S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_InventoryData);
+	for(S32 i = 0; i < num_blocks; ++i)
+	{
+		titem->unpackMessage(msg, _PREHASH_InventoryData, i);
+		if (!(titem->getUUID().isNull()))
+		{
+			//we don't do anything with null keys
+			mAdded.push_back(titem->getUUID());
+		}
+	}
+	if (!mAdded.empty())
+	{
+		done();
+	}
+}
+
+LLInventoryTransactionObserver::LLInventoryTransactionObserver(
+	const LLTransactionID& transaction_id) :
+	mTransactionID(transaction_id)
+{
+}
+
+void LLInventoryTransactionObserver::changed(U32 mask)
+{
+	if(mask & LLInventoryObserver::ADD)
+	{
+		// This could be it - see if we are processing a bulk update
+		LLMessageSystem* msg = gMessageSystem;
+		if(msg->getMessageName()
+		   && (0 == strcmp(msg->getMessageName(), "BulkUpdateInventory")))
+		{
+			// we have a match for the message - now check the
+			// transaction id.
+			LLUUID id;
+			msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_TransactionID, id);
+			if(id == mTransactionID)
+			{
+				// woo hoo, we found it
+				folder_ref_t folders;
+				item_ref_t items;
+				S32 count;
+				count = msg->getNumberOfBlocksFast(_PREHASH_FolderData);
+				S32 i;
+				for(i = 0; i < count; ++i)
+				{
+					msg->getUUIDFast(_PREHASH_FolderData, _PREHASH_FolderID, id, i);
+					if(id.notNull())
+					{
+						folders.push_back(id);
+					}
+				}
+				count = msg->getNumberOfBlocksFast(_PREHASH_ItemData);
+				for(i = 0; i < count; ++i)
+				{
+					msg->getUUIDFast(_PREHASH_ItemData, _PREHASH_ItemID, id, i);
+					if(id.notNull())
+					{
+						items.push_back(id);
+					}
+				}
+
+				// call the derived class the implements this method.
+				done(folders, items);
+			}
+		}
+	}
+}
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
new file mode 100644
index 00000000000..384e6292e8a
--- /dev/null
+++ b/indra/newview/llinventoryobserver.h
@@ -0,0 +1,249 @@
+/** 
+ * @file llinventoryobserver.h
+ * @brief LLInventoryObserver class header file
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLINVENTORYOBSERVERS_H
+#define LL_LLINVENTORYOBSERVERS_H
+
+#include "lluuid.h"
+#include <string>
+#include <vector>
+
+class LLViewerInventoryCategory;
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryObserver
+//
+// This class is designed to be a simple abstract base class which can
+// relay messages when the inventory changes.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryObserver
+{
+public:
+	// This enumeration is a way to refer to what changed in a more
+	// human readable format. You can mask the value provided by
+	// chaged() to see if the observer is interested in the change.
+	enum 
+	{
+		NONE = 0,
+		LABEL = 1,			// name changed
+		INTERNAL = 2,		// internal change, eg, asset uuid different
+		ADD = 4,			// something added
+		REMOVE = 8,			// something deleted
+		STRUCTURE = 16,		// structural change, eg, item or folder moved
+		CALLING_CARD = 32,	// online, grant status, cancel, etc change
+		ALL = 0xffffffff
+	};
+	virtual ~LLInventoryObserver() {};
+	virtual void changed(U32 mask) = 0;
+	std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328]
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryCompletionObserver
+//
+// Class which can be used as a base class for doing something when
+// when all observed items are locally complete. This class implements
+// the changed() method of LLInventoryObserver and declares a new
+// method named done() which is called when all watched items have
+// complete information in the inventory model.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryCompletionObserver : public LLInventoryObserver
+{
+public:
+	LLInventoryCompletionObserver() {}
+	virtual void changed(U32 mask);
+
+	void watchItem(const LLUUID& id);
+
+protected:
+	virtual void done() = 0;
+
+	typedef std::vector<LLUUID> item_ref_t;
+	item_ref_t mComplete;
+	item_ref_t mIncomplete;
+};
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryFetchObserver
+//
+// This class is much like the LLInventoryCompletionObserver, except
+// that it handles all the the fetching necessary. Override the done()
+// method to do the thing you want.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryFetchObserver : public LLInventoryObserver
+{
+public:
+	LLInventoryFetchObserver() {}
+	virtual void changed(U32 mask);
+
+	typedef std::vector<LLUUID> item_ref_t;
+
+	bool isEverythingComplete() const;
+	void fetchItems(const item_ref_t& ids);
+	virtual void done() = 0;
+
+protected:
+	item_ref_t mComplete;
+	item_ref_t mIncomplete;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryFetchDescendentsObserver
+//
+// This class is much like the LLInventoryCompletionObserver, except
+// that it handles fetching based on category. Override the done()
+// method to do the thing you want.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryFetchDescendentsObserver : public LLInventoryObserver
+{
+public:
+	LLInventoryFetchDescendentsObserver() {}
+	virtual void changed(U32 mask);
+
+	typedef std::vector<LLUUID> folder_ref_t;
+	void fetchDescendents(const folder_ref_t& ids);
+	bool isEverythingComplete() const;
+	virtual void done() = 0;
+
+protected:
+	bool isComplete(LLViewerInventoryCategory* cat);
+	folder_ref_t mIncompleteFolders;
+	folder_ref_t mCompleteFolders;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryFetchComboObserver
+//
+// This class does an appropriate combination of fetch descendents and
+// item fetches based on completion of categories and items. Much like
+// the fetch and fetch descendents, this will call done() when everything
+// has arrived.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryFetchComboObserver : public LLInventoryObserver
+{
+public:
+	LLInventoryFetchComboObserver() : mDone(false) {}
+	virtual void changed(U32 mask);
+
+	typedef std::vector<LLUUID> folder_ref_t;
+	typedef std::vector<LLUUID> item_ref_t;
+	void fetch(const folder_ref_t& folder_ids, const item_ref_t& item_ids);
+
+	virtual void done() = 0;
+
+protected:
+	bool mDone;
+	folder_ref_t mCompleteFolders;
+	folder_ref_t mIncompleteFolders;
+	item_ref_t mCompleteItems;
+	item_ref_t mIncompleteItems;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryExistenceObserver
+//
+// This class is used as a base class for doing somethign when all the
+// observed item ids exist in the inventory somewhere. You can derive
+// a class from this class and implement the done() method to do
+// something useful.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryExistenceObserver : public LLInventoryObserver
+{
+public:
+	LLInventoryExistenceObserver() {}
+	virtual void changed(U32 mask);
+
+	void watchItem(const LLUUID& id);
+
+protected:
+	virtual void done() = 0;
+
+	typedef std::vector<LLUUID> item_ref_t;
+	item_ref_t mExist;
+	item_ref_t mMIA;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryAddedObserver
+//
+// This class is used as a base class for doing something when 
+// a new item arrives in inventory.
+// It does not watch for a certain UUID, rather it acts when anything is added
+// Derive a class from this class and implement the done() method to do
+// something useful.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryAddedObserver : public LLInventoryObserver
+{
+public:
+	LLInventoryAddedObserver() : mAdded() {}
+	virtual void changed(U32 mask);
+
+protected:
+	virtual void done() = 0;
+
+	typedef std::vector<LLUUID> item_ref_t;
+	item_ref_t mAdded;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryTransactionObserver
+//
+// Class which can be used as a base class for doing something when an
+// inventory transaction completes.
+//
+// *NOTE: This class is not quite complete. Avoid using unless you fix up it's
+// functionality gaps.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryTransactionObserver : public LLInventoryObserver
+{
+public:
+	LLInventoryTransactionObserver(const LLTransactionID& transaction_id);
+	virtual void changed(U32 mask);
+
+protected:
+	typedef std::vector<LLUUID> folder_ref_t;
+	typedef std::vector<LLUUID> item_ref_t;
+	virtual void done(const folder_ref_t& folders, const item_ref_t& items) = 0;
+
+	LLTransactionID mTransactionID;
+};
+
+
+#endif // LL_LLINVENTORYOBSERVERS_H
+
-- 
GitLab


From 02d1776bbc1bbfd7e555bd018dee6b5a31ec0ffa Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Thu, 12 Nov 2009 19:43:23 +0000
Subject: [PATCH 195/557] try fixing mysterious layout issue.

---
 indra/newview/skins/default/xui/en/floater_outgoing_call.xml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
index 67137003720..f1fa1a8dbae 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -60,6 +60,7 @@ Leaving [CURRENT_CHAT].
     <button
      height="24"
      label="Cancel"
+     label_selected="Cancel"
      layout="topleft"
      name="Cancel"
      left_pad="10"
-- 
GitLab


From 93d0e15703ff91a856d362d9a5489c98b599d829 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Thu, 12 Nov 2009 19:50:30 +0000
Subject: [PATCH 196/557] more fixing for hokey layout.

---
 indra/newview/skins/default/xui/en/floater_outgoing_call.xml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
index f1fa1a8dbae..44956f7e52f 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -61,6 +61,7 @@ Leaving [CURRENT_CHAT].
      height="24"
      label="Cancel"
      label_selected="Cancel"
+     left="70"
      layout="topleft"
      name="Cancel"
      left_pad="10"
-- 
GitLab


From c15a3a18d44fd5b5e72117200938c1eb33fb3c99 Mon Sep 17 00:00:00 2001
From: richard <none@none>
Date: Thu, 12 Nov 2009 11:56:25 -0800
Subject: [PATCH 197/557] EXT-677 build l arrows don't work EXT-2388 - top of
 world does not update

reviewed by james
---
 indra/newview/skins/default/xui/en/main_view.xml | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
index 08f7ee456e4..9e35c95d45a 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -51,6 +51,13 @@
                name="main_view"
                user_resize="true"
                width="500">
+          <view bottom="500"
+                follows="all"
+                height="500"
+                left="0"
+                mouse_opaque="false"
+                name="world_view_rect"
+                width="500"/>
           <layout_stack border_size="0"
                         bottom="500"
                         follows="all"
@@ -66,13 +73,6 @@
                    mouse_opaque="false"
                    name="hud container"
                    width="500">
-              <view bottom="500"
-                    follows="all"
-                    height="500"
-                    left="0"
-                    mouse_opaque="false"
-                    name="world_view_rect"
-                    width="500"/>
               <panel follows="right|top|bottom"
                      height="500"
                      mouse_opaque="false"
-- 
GitLab


From a112200b2fca3bcbfb88379813c8a7a797974c8b Mon Sep 17 00:00:00 2001
From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com>
Date: Thu, 12 Nov 2009 15:08:30 -0500
Subject: [PATCH 198/557] Fixed 9-slice scaling coords for Tooltip.

---
 indra/newview/skins/default/textures/textures.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 4c4b6a3899a..260112d2cb3 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -532,7 +532,7 @@
   <texture name="Toolbar_Right_Press" file_name="containers/Toolbar_Right_Press.png" preload="false" />
   <texture name="Toolbar_Right_Selected" file_name="containers/Toolbar_Right_Selected.png" preload="false" />
   
-  <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="1" scale.right="99" scale.bottom="14" />
+  <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="14" scale.right="99" scale.bottom="1" />
 
   <texture name="TrashItem_Disabled" file_name="icons/TrashItem_Disabled.png" preload="false" />
   <texture name="TrashItem_Off" file_name="icons/TrashItem_Off.png" preload="false" />
-- 
GitLab


From 0b104e2a418dc794ce7230ab30f472d1787cd9c4 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Thu, 12 Nov 2009 15:10:06 -0500
Subject: [PATCH 199/557] LLAppearanceManager cleanup - turning into proper
 singleton

--HG--
branch : avatar-pipeline
---
 indra/newview/llagentwearables.cpp  | 10 ++--
 indra/newview/llappearancemgr.cpp   | 84 ++++++++++++-----------------
 indra/newview/llappearancemgr.h     | 74 +++++++++++++------------
 indra/newview/llinventorybridge.cpp | 14 ++---
 indra/newview/llinventorypanel.cpp  |  2 +-
 indra/newview/llstartup.cpp         |  6 +--
 indra/newview/lltooldraganddrop.cpp |  4 +-
 indra/newview/llviewermenu.cpp      |  4 +-
 indra/newview/llvoavatarself.cpp    |  4 +-
 9 files changed, 96 insertions(+), 106 deletions(-)

diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 9b4986247fd..94bf54de7ec 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -1261,7 +1261,7 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)
 		LLFolderType::FT_OUTFIT,
 		new_folder_name);
 
-	LLAppearanceManager::shallowCopyCategory(LLAppearanceManager::getCOF(),folder_id, NULL);
+	LLAppearanceManager::instance().shallowCopyCategory(LLAppearanceManager::instance().getCOF(),folder_id, NULL);
 	
 #if 0  // BAP - fix to go into rename state automatically after outfit is created.
 	LLViewerInventoryCategory *parent_category = gInventory.getCategory(parent_id);
@@ -1391,7 +1391,7 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem
 			const LLUUID &item_id = getWearableItemID(type,i);
 			popWearable(type,i);
 			gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
-			LLAppearanceManager::removeItemLinks(item_id,false);
+			LLAppearanceManager::instance().removeItemLinks(item_id,false);
 
 			//queryWearableCache(); // moved below
 			if (old_wearable)
@@ -1408,7 +1408,7 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem
 		const LLUUID &item_id = getWearableItemID(type,index);
 		popWearable(type, index);
 		gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
-		LLAppearanceManager::removeItemLinks(item_id,false);
+		LLAppearanceManager::instance().removeItemLinks(item_id,false);
 
 		//queryWearableCache(); // moved below
 
@@ -2014,7 +2014,7 @@ void LLInitialWearablesFetch::done()
 	gInventory.collectDescendentsIf(mCompleteFolders.front(), cat_array, wearable_array, 
 									LLInventoryModel::EXCLUDE_TRASH, is_wearable);
 
-	LLAppearanceManager::setAttachmentInvLinkEnable(true);
+	LLAppearanceManager::instance().setAttachmentInvLinkEnable(true);
 	if (wearable_array.count() > 0)
 	{
 		LLAppearanceManager::instance().updateAppearanceFromCOF();
@@ -2023,7 +2023,7 @@ void LLInitialWearablesFetch::done()
 	{
 		processWearablesMessage();
 		// Create links for attachments that may have arrived before the COF existed.
-		LLAppearanceManager::linkRegisteredAttachments();
+		LLAppearanceManager::instance().linkRegisteredAttachments();
 	}
 	delete this;
 }
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 0901289dace..5f2d22d78c9 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -72,7 +72,7 @@ class LLWearInventoryCategoryCallback : public LLInventoryCallback
 		// If the inventory callback manager goes away, we're shutting down, no longer want the callback.
 		if( LLInventoryCallbackManager::is_instantiated() )
 		{
-			LLAppearanceManager::wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);
+			LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);
 		}
 		else
 		{
@@ -171,7 +171,7 @@ void LLOutfitObserver::done()
 	else
 	{
 		// Wear the inventory category.
-		LLAppearanceManager::wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);
+		LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);
 	}
 }
 
@@ -251,7 +251,7 @@ class LLUpdateAppearanceOnDestroy: public LLInventoryCallback
 
 	virtual ~LLUpdateAppearanceOnDestroy()
 	{
-		LLAppearanceManager::updateAppearanceFromCOF();
+		LLAppearanceManager::instance().updateAppearanceFromCOF();
 	}
 
 	/* virtual */ void fire(const LLUUID& inv_item)
@@ -296,7 +296,7 @@ struct LLWearableHoldingPattern
 	bool append;
 };
 
-/* static */ void removeDuplicateItems(LLInventoryModel::item_array_t& items)
+static void removeDuplicateItems(LLInventoryModel::item_array_t& items)
 {
 	LLInventoryModel::item_array_t new_items;
 	std::set<LLUUID> items_seen;
@@ -323,7 +323,7 @@ struct LLWearableHoldingPattern
 	items = new_items;
 }
 
-void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventoryModel::item_array_t& src)
+static void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventoryModel::item_array_t& src)
 {
 	LLInventoryModel::item_array_t new_dst;
 	std::set<LLUUID> mark_inventory;
@@ -361,25 +361,23 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory
 	dst = new_dst;
 }
 
-/* static */ 
 LLUUID LLAppearanceManager::getCOF()
 {
 	return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
 }
 
 // Update appearance from outfit folder.
-/* static */ 
 void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, bool append)
 {
 	if (!proceed)
 		return;
 
 #if 1 
-	updateCOF(category,append);
+	LLAppearanceManager::instance().updateCOF(category,append);
 #else
 	if (append)
 	{
-		updateCOFFromCategory(category, append); // append is true - add non-duplicates to COF.
+		LLAppearanceManager::instance().updateCOFFromCategory(category, append); // append is true - add non-duplicates to COF.
 	}
 	else
 	{
@@ -387,18 +385,17 @@ void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, boo
 		if (catp->getPreferredType() == LLFolderType::FT_NONE ||
 			LLFolderType::lookupIsEnsembleType(catp->getPreferredType()))
 		{
-			updateCOFFromCategory(category, append);  // append is false - rebuild COF.
+			LLAppearanceManager::instance().updateCOFFromCategory(category, append);  // append is false - rebuild COF.
 		}
 		else if (catp->getPreferredType() == LLFolderType::FT_OUTFIT)
 		{
-			rebuildCOFFromOutfit(category);
+			LLAppearanceManager::instance().rebuildCOFFromOutfit(category);
 		}
 	}
 #endif
 }
 
 // Append to current COF contents by recursively traversing a folder.
-/* static */ 
 void LLAppearanceManager::updateCOFFromCategory(const LLUUID& category, bool append)
 {
 		// BAP consolidate into one "get all 3 types of descendents" function, use both places.
@@ -491,7 +488,6 @@ void LLAppearanceManager::updateCOFFromCategory(const LLUUID& category, bool app
 	}
 }
 
-/* static */ 
 void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
 											  LLPointer<LLInventoryCallback> cb)
 {
@@ -535,7 +531,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID
 		}
 	}
 }
-/* static */ void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links)
+void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links)
 {
 	LLInventoryModel::cat_array_t cats;
 	LLInventoryModel::item_array_t items;
@@ -552,7 +548,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID
 
 // Keep the last N wearables of each type.  For viewer 2.0, N is 1 for
 // both body parts and clothing items.
-/* static */ void LLAppearanceManager::filterWearableItems(
+void LLAppearanceManager::filterWearableItems(
 	LLInventoryModel::item_array_t& items, S32 max_per_type)
 {
 	// Divvy items into arrays by wearable type.
@@ -583,8 +579,8 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID
 }
 
 // Create links to all listed items.
-/* static */ void LLAppearanceManager::linkAll(const LLUUID& category,
-											   LLInventoryModel::item_array_t& items,
+void LLAppearanceManager::linkAll(const LLUUID& category,
+								  LLInventoryModel::item_array_t& items,
 											   LLPointer<LLInventoryCallback> cb)
 {
 	for (S32 i=0; i<items.count(); i++)
@@ -599,7 +595,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID
 	}
 }
 
-/* static */ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
+void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
 {
 	const LLUUID cof = getCOF();
 
@@ -660,14 +656,12 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID
 							  
 }
 
-/* static */ 
 bool LLAppearanceManager::isMandatoryWearableType(EWearableType type)
 {
 	return (type==WT_SHAPE) || (type==WT_SKIN) || (type== WT_HAIR) || (type==WT_EYES);
 }
 
 // For mandatory body parts.
-/* static */ 
 void LLAppearanceManager::checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found)
 {
 	LLInventoryModel::cat_array_t new_cats;
@@ -693,7 +687,6 @@ void LLAppearanceManager::checkMandatoryWearableTypes(const LLUUID& category, st
 // with contents of new category.  This means preserving any mandatory
 // body parts that aren't present in the new category, and getting rid
 // of everything else.
-/* static */ 
 void LLAppearanceManager::purgeCOFBeforeRebuild(const LLUUID& category)
 {
 	// See which mandatory body types are present in the new category.
@@ -726,7 +719,6 @@ void LLAppearanceManager::purgeCOFBeforeRebuild(const LLUUID& category)
 }
 
 // Replace COF contents from a given outfit folder.
-/* static */ 
 void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category)
 {
 	lldebugs << "rebuildCOFFromOutfit()" << llendl;
@@ -790,11 +782,10 @@ void LLAppearanceManager::onWearableAssetFetch(LLWearable* wearable, void* data)
 	holder->mResolved += 1;
 	if(holder->mResolved >= (S32)holder->mFoundList.size())
 	{
-		LLAppearanceManager::updateAgentWearables(holder, append);
+		LLAppearanceManager::instance().updateAgentWearables(holder, append);
 	}
 }
 
-/* static */
 void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, bool append)
 {
 	lldebugs << "updateAgentWearables()" << llendl;
@@ -835,7 +826,6 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder,
 //	dec_busy_count();
 }
 
-/* static */ 
 void LLAppearanceManager::updateAppearanceFromCOF()
 {
 	dumpCat(getCOF(),"COF, start");
@@ -916,7 +906,6 @@ void LLAppearanceManager::updateAppearanceFromCOF()
 	}
 }
 
-/* static */ 
 void LLAppearanceManager::getCOFValidDescendents(const LLUUID& category,
 												 LLInventoryModel::item_array_t& items)
 {
@@ -931,7 +920,6 @@ void LLAppearanceManager::getCOFValidDescendents(const LLUUID& category,
 									follow_folder_links);
 }
 
-/* static */
 void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category,
 													LLInventoryModel::item_array_t& items,
 													LLAssetType::EType type,
@@ -947,7 +935,6 @@ void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category,
 									follow_folder_links);
 }
 
-/* static */ 
 void LLAppearanceManager::getUserDescendents(const LLUUID& category, 
 											 LLInventoryModel::item_array_t& wear_items,
 											 LLInventoryModel::item_array_t& obj_items,
@@ -1011,7 +998,6 @@ void LLAppearanceManager::wearInventoryCategory(LLInventoryCategory* category, b
 }
 
 // *NOTE: hack to get from avatar inventory to avatar
-/* static */
 void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* category, bool append )
 {
 	// Avoid unintentionally overwriting old wearables.  We have to do
@@ -1031,7 +1017,6 @@ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* ca
 	}
 }
 
-/* static */
 void LLAppearanceManager::wearOutfitByName(const std::string& name)
 {
 	llinfos << "Wearing category " << name << llendl;
@@ -1084,7 +1069,7 @@ bool areMatchingWearables(const LLViewerInventoryItem *a, const LLViewerInventor
 	return (a->isWearableType() && b->isWearableType() &&
 			(a->getWearableType() == b->getWearableType()));
 }
-/* static */
+
 void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update )
 {
 	LLViewerInventoryItem *vitem = dynamic_cast<LLViewerInventoryItem*>(item);
@@ -1138,7 +1123,6 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update )
 	return;
 }
 
-/* static */
 void LLAppearanceManager::wearEnsemble( LLInventoryCategory* cat, bool do_update )
 {
 #if SUPPORT_ENSEMBLES
@@ -1153,7 +1137,6 @@ void LLAppearanceManager::wearEnsemble( LLInventoryCategory* cat, bool do_update
 #endif
 }
 
-/* static */
 void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update)
 {
 	LLInventoryModel::cat_array_t cat_array;
@@ -1178,7 +1161,6 @@ void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update)
 
 //#define DUMP_CAT_VERBOSE
 
-/* static */
 void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg)
 {
 	LLInventoryModel::cat_array_t cats;
@@ -1200,7 +1182,6 @@ void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg)
 	llinfos << msg << " count " << items.count() << llendl;
 }
 
-/* static */
 void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& items,
 										const std::string& msg)
 {
@@ -1213,15 +1194,19 @@ void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& it
 	llinfos << llendl;
 }
 
+LLAppearanceManager::LLAppearanceManager():
+	mAttachmentInvLinkEnabled(false)
+{
+}
 
-std::set<LLUUID> LLAppearanceManager::sRegisteredAttachments;
-bool LLAppearanceManager::sAttachmentInvLinkEnabled(false);
+LLAppearanceManager::~LLAppearanceManager()
+{
+}
 
-/* static */
 void LLAppearanceManager::setAttachmentInvLinkEnable(bool val)
 {
 	llinfos << "setAttachmentInvLinkEnable => " << (int) val << llendl;
-	sAttachmentInvLinkEnabled = val;
+	mAttachmentInvLinkEnabled = val;
 }
 
 void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg)
@@ -1241,13 +1226,12 @@ void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg)
        llinfos << llendl;
 }
 
-/* static */
 void LLAppearanceManager::registerAttachment(const LLUUID& item_id)
 {
-       sRegisteredAttachments.insert(item_id);
-       //dumpAttachmentSet(sRegisteredAttachments,"after register:");
+       mRegisteredAttachments.insert(item_id);
+       //dumpAttachmentSet(mRegisteredAttachments,"after register:");
 
-	   if (sAttachmentInvLinkEnabled)
+	   if (mAttachmentInvLinkEnabled)
 	   {
 		   LLViewerInventoryItem *item = gInventory.getItem(item_id);
 		   if (item)
@@ -1264,13 +1248,12 @@ void LLAppearanceManager::registerAttachment(const LLUUID& item_id)
 	   }
 }
 
-/* static */
 void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id)
 {
-       sRegisteredAttachments.erase(item_id);
-       //dumpAttachmentSet(sRegisteredAttachments,"after unregister:");
+       mRegisteredAttachments.erase(item_id);
+       //dumpAttachmentSet(mRegisteredAttachments,"after unregister:");
 
-	   if (sAttachmentInvLinkEnabled)
+	   if (mAttachmentInvLinkEnabled)
 	   {
 		   //LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:");
 		   LLAppearanceManager::removeItemLinks(item_id, false);
@@ -1284,11 +1267,10 @@ void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id)
 	   }
 }
 
-/* static */
 void LLAppearanceManager::linkRegisteredAttachments()
 {
-	for (std::set<LLUUID>::iterator it = sRegisteredAttachments.begin();
-		 it != sRegisteredAttachments.end();
+	for (std::set<LLUUID>::iterator it = mRegisteredAttachments.begin();
+		 it != mRegisteredAttachments.end();
 		 ++it)
 	{
 		LLUUID item_id = *it;
@@ -1300,5 +1282,5 @@ void LLAppearanceManager::linkRegisteredAttachments()
 			gInventory.notifyObservers();
 		}
 	}
-	sRegisteredAttachments.clear();
+	mRegisteredAttachments.clear();
 }
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 7dea16b6cf0..b0ecb2e23e8 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -42,66 +42,74 @@ struct LLWearableHoldingPattern;
 
 class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 {
+	friend class LLSingleton<LLAppearanceManager>;
+	
 public:
-	static void updateAppearanceFromCOF();
-	static bool needToSaveCOF();
-	static void changeOutfit(bool proceed, const LLUUID& category, bool append);
-	static void updateCOF(const LLUUID& category, bool append = false);
-	static void updateCOFFromCategory(const LLUUID& category, bool append);
-	static void rebuildCOFFromOutfit(const LLUUID& category);
-	static void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append);
-	static void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append);
-	static void wearOutfitByName(const std::string& name);
-	static void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
+	void updateAppearanceFromCOF();
+	bool needToSaveCOF();
+	void updateCOF(const LLUUID& category, bool append = false);
+	void updateCOFFromCategory(const LLUUID& category, bool append);
+	void rebuildCOFFromOutfit(const LLUUID& category);
+	void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append);
+	void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append);
+	void wearOutfitByName(const std::string& name);
+	void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
 									LLPointer<LLInventoryCallback> cb);
 
 	// Add COF link to individual item.
-	static void wearItem(LLInventoryItem* item, bool do_update = true);
+	void wearItem(LLInventoryItem* item, bool do_update = true);
 
 	// Add COF link to ensemble folder.
-	static void wearEnsemble(LLInventoryCategory* item, bool do_update = true);
-	static LLUUID getCOF();
+	void wearEnsemble(LLInventoryCategory* item, bool do_update = true);
+	LLUUID getCOF();
 
 	// Remove COF entries
-	static void removeItemLinks(const LLUUID& item_id, bool do_update = true);
+	void removeItemLinks(const LLUUID& item_id, bool do_update = true);
 
 	// For debugging - could be moved elsewhere.
-	static void dumpCat(const LLUUID& cat_id, const std::string& msg);
-	static void dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg);
-	static void unregisterAttachment(const LLUUID& item_id);
-	static void registerAttachment(const LLUUID& item_id);
-	static void setAttachmentInvLinkEnable(bool val);
-	static void linkRegisteredAttachments();
+	void dumpCat(const LLUUID& cat_id, const std::string& msg);
+	void dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg);
+	void unregisterAttachment(const LLUUID& item_id);
+	void registerAttachment(const LLUUID& item_id);
+	void setAttachmentInvLinkEnable(bool val);
+	void linkRegisteredAttachments();
+
+protected:
+	LLAppearanceManager();
+	~LLAppearanceManager();
 
 private:
-	static void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type);
-	static void linkAll(const LLUUID& category,
+
+	void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type);
+	void linkAll(const LLUUID& category,
 						LLInventoryModel::item_array_t& items,
 						LLPointer<LLInventoryCallback> cb);
 	
-	static void getDescendentsOfAssetType(const LLUUID& category, 
+	void getDescendentsOfAssetType(const LLUUID& category, 
 										  LLInventoryModel::item_array_t& items,
 										  LLAssetType::EType type,
 										  bool follow_folder_links);
 
-	static void getCOFValidDescendents(const LLUUID& category, 
+	void getCOFValidDescendents(const LLUUID& category, 
 									   LLInventoryModel::item_array_t& items);
 									   
-	static void getUserDescendents(const LLUUID& category, 
+	void getUserDescendents(const LLUUID& category, 
 								   LLInventoryModel::item_array_t& wear_items,
 								   LLInventoryModel::item_array_t& obj_items,
 								   LLInventoryModel::item_array_t& gest_items,
 								   bool follow_folder_links);
-	static void onWearableAssetFetch(LLWearable* wearable, void* data);
-	static void updateAgentWearables(LLWearableHoldingPattern* holder, bool append);
-	static bool isMandatoryWearableType(EWearableType type);
-	static void checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found);
-	static void purgeCOFBeforeRebuild(const LLUUID& category);
-	static void purgeCategory(const LLUUID& category, bool keep_outfit_links);
+	void updateAgentWearables(LLWearableHoldingPattern* holder, bool append);
+	bool isMandatoryWearableType(EWearableType type);
+	void checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found);
+	void purgeCOFBeforeRebuild(const LLUUID& category);
+	void purgeCategory(const LLUUID& category, bool keep_outfit_links);
 
-	static std::set<LLUUID> sRegisteredAttachments;
-	static bool sAttachmentInvLinkEnabled;
+	std::set<LLUUID> mRegisteredAttachments;
+	bool mAttachmentInvLinkEnabled;
 
+	// Static callbacks
+	static void onWearableAssetFetch(LLWearable* wearable, void* data);
+	static void changeOutfit(bool proceed, const LLUUID& category, bool append);
 };
 
 #define SUPPORT_ENSEMBLES 0
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 1bc9297bba3..caff8258593 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -1687,7 +1687,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
 				// BAP - should skip if dup.
 				if (move_is_into_current_outfit)
 				{
-					LLAppearanceManager::wearEnsemble(inv_cat);
+					LLAppearanceManager::instance().wearEnsemble(inv_cat);
 				}
 				else
 				{
@@ -2044,7 +2044,7 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask)
 				    mContentsCount)
 				{
 					gInventory.removeObserver(this);
-					LLAppearanceManager::wearInventoryCategory(category, FALSE, TRUE);
+					LLAppearanceManager::instance().wearInventoryCategory(category, FALSE, TRUE);
 					delete this;
 				}
 			}
@@ -2089,7 +2089,7 @@ void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model
 		if(!model) return;
 		LLViewerInventoryCategory* cat = getCategory();
 		if(!cat) return;
-		LLAppearanceManager::wearEnsemble(cat,true);
+		LLAppearanceManager::instance().wearEnsemble(cat,true);
 		return;
 	}
 #endif
@@ -2730,7 +2730,7 @@ void LLFolderBridge::modifyOutfit(BOOL append)
 
 	// BAP - was:
 	// wear_inventory_category_on_avatar( cat, append );
-	LLAppearanceManager::wearInventoryCategory( cat, FALSE, append );
+	LLAppearanceManager::instance().wearInventoryCategory( cat, FALSE, append );
 }
 
 // helper stuff
@@ -2953,7 +2953,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
 				// BAP - should skip if dup.
 				if (move_is_into_current_outfit)
 				{
-					LLAppearanceManager::wearItem(inv_item);
+					LLAppearanceManager::instance().wearItem(inv_item);
 				}
 				else
 				{
@@ -4206,7 +4206,7 @@ void wear_inventory_item_on_avatar( LLInventoryItem* item )
 		lldebugs << "wear_inventory_item_on_avatar( " << item->getName()
 				 << " )" << llendl;
 
-		LLAppearanceManager::wearItem(item);
+		LLAppearanceManager::instance().wearItem(item);
 	}
 }
 
@@ -4771,7 +4771,7 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
 	}
 
 	// Find and remove this item from the COF.
-	LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::getCOF());
+	LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::instance().getCOF());
 	llassert(items.size() == 1); // Should always have one and only one item linked to this in the COF.
 	for (LLInventoryModel::item_array_t::const_iterator iter = items.begin();
 		 iter != items.end();
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index dfd4af5c287..9ee2defc017 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -694,7 +694,7 @@ void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_foc
 {
 	// Don't select objects in COF (e.g. to prevent refocus when items are worn).
 	const LLInventoryObject *obj = gInventory.getObject(obj_id);
-	if (obj && obj->getParentUUID() == LLAppearanceManager::getCOF())
+	if (obj && obj->getParentUUID() == LLAppearanceManager::instance().getCOF())
 	{
 		return;
 	}
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 64dcd7b97fb..84371b75cd8 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -2630,10 +2630,10 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
 	}
 	else
 	{
-		LLAppearanceManager::wearOutfitByName(outfit_folder_name);
+		LLAppearanceManager::instance().wearOutfitByName(outfit_folder_name);
 	}
-	LLAppearanceManager::wearOutfitByName(gestures);
-	LLAppearanceManager::wearOutfitByName(COMMON_GESTURES_FOLDER);
+	LLAppearanceManager::instance().wearOutfitByName(gestures);
+	LLAppearanceManager::instance().wearOutfitByName(COMMON_GESTURES_FOLDER);
 
 	// This is really misnamed -- it means we have started loading
 	// an outfit/shape that will give the avatar a gender eventually. JC
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 959cb3f1822..fbd86d0edfc 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -2508,7 +2508,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(
 		if(drop)
 		{
 		    BOOL append = ( (mask & MASK_SHIFT) ? TRUE : FALSE );
-			LLAppearanceManager::wearInventoryCategory(category, false, append);
+			LLAppearanceManager::instance().wearInventoryCategory(category, false, append);
 		}
 		return ACCEPT_YES_MULTI;
 	}
@@ -2516,7 +2516,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(
 	{
 		if(drop)
 		{
-			LLAppearanceManager::wearInventoryCategory(category, true, false);
+			LLAppearanceManager::instance().wearInventoryCategory(category, true, false);
 		}
 		return ACCEPT_YES_MULTI;
 	}
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 728fb7c6164..4cc1d986bb4 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -6424,13 +6424,13 @@ void handle_selected_texture_info(void*)
 
 void handle_test_male(void*)
 {
-	LLAppearanceManager::wearOutfitByName("Male Shape & Outfit");
+	LLAppearanceManager::instance().wearOutfitByName("Male Shape & Outfit");
 	//gGestureList.requestResetFromServer( TRUE );
 }
 
 void handle_test_female(void*)
 {
-	LLAppearanceManager::wearOutfitByName("Female Shape & Outfit");
+	LLAppearanceManager::instance().wearOutfitByName("Female Shape & Outfit");
 	//gGestureList.requestResetFromServer( FALSE );
 }
 
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 185274d40d2..d57090f808d 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -1039,7 +1039,7 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view
 	if (attachment->isObjectAttached(viewer_object))
 	{
 		const LLUUID& attachment_id = viewer_object->getItemID();
-		LLAppearanceManager::registerAttachment(attachment_id);
+		LLAppearanceManager::instance().registerAttachment(attachment_id);
 	}
 
 	return attachment;
@@ -1078,7 +1078,7 @@ BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object)
 		}
 		else
 		{
-			LLAppearanceManager::unregisterAttachment(attachment_id);
+			LLAppearanceManager::instance().unregisterAttachment(attachment_id);
 		}
 		
 		return TRUE;
-- 
GitLab


From 7adf642ecbe48a1bc84ff54672f1777a6067c14f Mon Sep 17 00:00:00 2001
From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com>
Date: Thu, 12 Nov 2009 15:20:37 -0500
Subject: [PATCH 200/557] Corrected 9-slice coords (again) for Tooltip.

---
 indra/newview/skins/default/textures/textures.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 260112d2cb3..eea2dfb1a1c 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -532,7 +532,7 @@
   <texture name="Toolbar_Right_Press" file_name="containers/Toolbar_Right_Press.png" preload="false" />
   <texture name="Toolbar_Right_Selected" file_name="containers/Toolbar_Right_Selected.png" preload="false" />
   
-  <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="14" scale.right="99" scale.bottom="1" />
+  <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="16" scale.right="100" scale.bottom="3" />
 
   <texture name="TrashItem_Disabled" file_name="icons/TrashItem_Disabled.png" preload="false" />
   <texture name="TrashItem_Off" file_name="icons/TrashItem_Off.png" preload="false" />
-- 
GitLab


From 315af3fb82574698078dce00236e2778d6ce9730 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Thu, 12 Nov 2009 16:03:59 -0500
Subject: [PATCH 201/557] LLAppearanceManager cleanup - no static at all

--HG--
branch : avatar-pipeline
---
 indra/newview/llappearancemgr.cpp | 57 ++++++++++++++++---------------
 indra/newview/llappearancemgr.h   |  7 ++--
 2 files changed, 31 insertions(+), 33 deletions(-)

diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 5f2d22d78c9..9301a47e6e1 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -361,6 +361,31 @@ static void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLIn
 	dst = new_dst;
 }
 
+static void onWearableAssetFetch(LLWearable* wearable, void* data)
+{
+	LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data;
+	bool append = holder->append;
+	
+	if(wearable)
+	{
+		for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin();
+			 iter != holder->mFoundList.end(); ++iter)
+		{
+			LLFoundData* data = *iter;
+			if(wearable->getAssetID() == data->mAssetID)
+			{
+				data->mWearable = wearable;
+				break;
+			}
+		}
+	}
+	holder->mResolved += 1;
+	if(holder->mResolved >= (S32)holder->mFoundList.size())
+	{
+		LLAppearanceManager::instance().updateAgentWearables(holder, append);
+	}
+}
+
 LLUUID LLAppearanceManager::getCOF()
 {
 	return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
@@ -760,32 +785,6 @@ void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category)
 	}
 }
 
-/* static */
-void LLAppearanceManager::onWearableAssetFetch(LLWearable* wearable, void* data)
-{
-	LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data;
-	bool append = holder->append;
-	
-	if(wearable)
-	{
-		for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin();
-			 iter != holder->mFoundList.end(); ++iter)
-		{
-			LLFoundData* data = *iter;
-			if(wearable->getAssetID() == data->mAssetID)
-			{
-				data->mWearable = wearable;
-				break;
-			}
-		}
-	}
-	holder->mResolved += 1;
-	if(holder->mResolved >= (S32)holder->mFoundList.size())
-	{
-		LLAppearanceManager::instance().updateAgentWearables(holder, append);
-	}
-}
-
 void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, bool append)
 {
 	lldebugs << "updateAgentWearables()" << llendl;
@@ -893,7 +892,7 @@ void LLAppearanceManager::updateAppearanceFromCOF()
 			LLWearableList::instance().getAsset(found->mAssetID,
 												found->mName,
 												found->mAssetType,
-												LLAppearanceManager::onWearableAssetFetch,
+												onWearableAssetFetch,
 												(void*)holder);
 		}
 	}
@@ -1009,7 +1008,9 @@ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* ca
 			 	
 	if( gFloaterCustomize )
 	{
-		gFloaterCustomize->askToSaveIfDirty(boost::bind(LLAppearanceManager::changeOutfit, _1, category->getUUID(), append));
+		gFloaterCustomize->askToSaveIfDirty(boost::bind(&LLAppearanceManager::changeOutfit,
+														&LLAppearanceManager::instance(),
+														_1, category->getUUID(), append));
 	}
 	else
 	{
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index b0ecb2e23e8..4401596e2c4 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -55,6 +55,7 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 	void wearOutfitByName(const std::string& name);
 	void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
 									LLPointer<LLInventoryCallback> cb);
+	void changeOutfit(bool proceed, const LLUUID& category, bool append);
 
 	// Add COF link to individual item.
 	void wearItem(LLInventoryItem* item, bool do_update = true);
@@ -73,6 +74,7 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 	void registerAttachment(const LLUUID& item_id);
 	void setAttachmentInvLinkEnable(bool val);
 	void linkRegisteredAttachments();
+	void updateAgentWearables(LLWearableHoldingPattern* holder, bool append);
 
 protected:
 	LLAppearanceManager();
@@ -98,7 +100,6 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 								   LLInventoryModel::item_array_t& obj_items,
 								   LLInventoryModel::item_array_t& gest_items,
 								   bool follow_folder_links);
-	void updateAgentWearables(LLWearableHoldingPattern* holder, bool append);
 	bool isMandatoryWearableType(EWearableType type);
 	void checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found);
 	void purgeCOFBeforeRebuild(const LLUUID& category);
@@ -106,10 +107,6 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 
 	std::set<LLUUID> mRegisteredAttachments;
 	bool mAttachmentInvLinkEnabled;
-
-	// Static callbacks
-	static void onWearableAssetFetch(LLWearable* wearable, void* data);
-	static void changeOutfit(bool proceed, const LLUUID& category, bool append);
 };
 
 #define SUPPORT_ENSEMBLES 0
-- 
GitLab


From a51285994cc723ec001f3f523f41c0b86bb878d7 Mon Sep 17 00:00:00 2001
From: Xiaohong Bao <none@none>
Date: Thu, 12 Nov 2009 13:36:39 -0800
Subject: [PATCH 202/557] fix a bug of making invisible spatial group visible.

---
 indra/newview/llspatialpartition.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 8c5439d47ea..6ca67345984 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -435,7 +435,7 @@ void LLSpatialGroup::clearDrawMap()
 
 BOOL LLSpatialGroup::isRecentlyVisible() const
 {
-	return (LLDrawable::getCurrentFrame() - (S32)mVisible) < LLDrawable::getMinVisFrameRange() ;
+	return (LLDrawable::getCurrentFrame() - mVisible[LLViewerCamera::sCurCameraID]) < LLDrawable::getMinVisFrameRange() ;
 }
 
 BOOL LLSpatialGroup::isVisible() const
-- 
GitLab


From 3fe0287d122c508f686b05c5a8449a61c3ab7be2 Mon Sep 17 00:00:00 2001
From: Xiaohong Bao <none@none>
Date: Thu, 12 Nov 2009 13:40:53 -0800
Subject: [PATCH 203/557] do not apply additional decode priority to textures
 with high boost levels.

---
 indra/newview/llviewertexture.cpp | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index fc4a2b0c0c9..85bc26c9c0e 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -1483,9 +1483,8 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
 		if ( mBoostLevel > BOOST_HIGH)
 		{
 			priority += 10000000.f;
-		}
-		
-		if(mAdditionalDecodePriority > 0.0f)
+		}		
+		else if(mAdditionalDecodePriority > 0.0f)
 		{
 			// 1-9
 			S32 additional_priority = (S32)(1.0f + mAdditionalDecodePriority*8.0f + .5f); // round
@@ -3145,8 +3144,7 @@ F32 LLViewerMediaTexture::getMaxVirtualSize()
 
 	if(mNeedsResetMaxVirtualSize)
 	{
-		mMaxVirtualSize = 0.f ;//reset
-		mNeedsResetMaxVirtualSize = FALSE ;
+		addTextureStats(0.f, FALSE) ;//reset
 	}
 
 	if(mIsPlaying) //media is playing
-- 
GitLab


From 8c90e4d468f2b4d7f1ce3b3faec163886cbf9fd5 Mon Sep 17 00:00:00 2001
From: richard <none@none>
Date: Thu, 12 Nov 2009 13:54:30 -0800
Subject: [PATCH 204/557] DEV-42747 - lltreeiterators_test.cpp broken on
 Windows

reviewed by Nat
---
 indra/llcommon/llpreprocessor.h               | 1 +
 indra/llcommon/tests/lltreeiterators_test.cpp | 3 ---
 2 files changed, 1 insertion(+), 3 deletions(-)

diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h
index 48244480b12..bb3301df9ff 100644
--- a/indra/llcommon/llpreprocessor.h
+++ b/indra/llcommon/llpreprocessor.h
@@ -122,6 +122,7 @@
 #pragma warning( 3      :  4264 )	// "'virtual_function' : no override available for virtual member function from base 'class'; function is hidden"
 #pragma warning( 3       : 4265 )	// "class has virtual functions, but destructor is not virtual"
 #pragma warning( 3      :  4266 )	// 'function' : no override available for virtual member function from base 'type'; function is hidden
+#pragma warning (disable : 4180)	// qualifier applied to function type has no meaning; ignored
 #pragma warning( disable : 4284 )	// silly MS warning deep inside their <map> include file
 #pragma warning( disable : 4503 )	// 'decorated name length exceeded, name was truncated'. Does not seem to affect compilation.
 #pragma warning( disable : 4800 )	// 'BOOL' : forcing value to bool 'true' or 'false' (performance warning)
diff --git a/indra/llcommon/tests/lltreeiterators_test.cpp b/indra/llcommon/tests/lltreeiterators_test.cpp
index d6d9f681103..31c70b4daa7 100644
--- a/indra/llcommon/tests/lltreeiterators_test.cpp
+++ b/indra/llcommon/tests/lltreeiterators_test.cpp
@@ -35,9 +35,6 @@
 // Precompiled header
 #include "linden_common.h"
 
-#if LL_WINDOWS
-#pragma warning (disable : 4180) // qualifier applied to function type has no meaning; ignored
-#endif
 
 // STL headers
 // std headers
-- 
GitLab


From 8863987cae0354db6d248633f33787bdf62293ca Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Thu, 12 Nov 2009 17:11:47 -0500
Subject: [PATCH 205/557] EXT-2354 menus contain multiple lines not editable in
 XUI

We're building a pie menu in code, complete with separators for this particular
branch of submenus. This is terrible and ugly and needs to be killed, but
for now I removed the lines that cause the separators to be added where there
are empty pie slices.

Code reviewed by Vir
---
 indra/newview/llvoavatarself.cpp | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 185274d40d2..94081ada550 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -487,18 +487,10 @@ BOOL LLVOAvatarSelf::buildMenus()
 		}
 
 		// add in requested order to pie menu, inserting separators as necessary
-		S32 cur_pie_slice = 0;
 		for (std::multimap<S32, S32>::iterator attach_it = attachment_pie_menu_map.begin();
 			 attach_it != attachment_pie_menu_map.end(); ++attach_it)
 		{
-			S32 requested_pie_slice = attach_it->first;
 			S32 attach_index = attach_it->second;
-			while (cur_pie_slice < requested_pie_slice)
-			{
-				gAttachBodyPartPieMenus[group]->addSeparator();
-				gDetachBodyPartPieMenus[group]->addSeparator();
-				cur_pie_slice++;
-			}
 
 			LLViewerJointAttachment* attachment = get_if_there(mAttachmentPoints, attach_index, (LLViewerJointAttachment*)NULL);
 			if (attachment)
@@ -520,7 +512,6 @@ BOOL LLVOAvatarSelf::buildMenus()
 				item_params.on_enable.parameter = attach_index;
 				item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
 				gDetachBodyPartPieMenus[group]->addChild(item);
-				cur_pie_slice++;
 			}
 		}
 	}
-- 
GitLab


From 56df94412b230d6cec7d253cc431e3a97d008f67 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Thu, 12 Nov 2009 17:20:53 -0500
Subject: [PATCH 206/557] LLAppearanceManager cleanup - removed dead code

--HG--
branch : avatar-pipeline
---
 indra/newview/llappearancemgr.cpp | 233 +-----------------------------
 indra/newview/llappearancemgr.h   |  22 +--
 2 files changed, 12 insertions(+), 243 deletions(-)

diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 9301a47e6e1..456eaa43c67 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -396,121 +396,7 @@ void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, boo
 {
 	if (!proceed)
 		return;
-
-#if 1 
 	LLAppearanceManager::instance().updateCOF(category,append);
-#else
-	if (append)
-	{
-		LLAppearanceManager::instance().updateCOFFromCategory(category, append); // append is true - add non-duplicates to COF.
-	}
-	else
-	{
-		LLViewerInventoryCategory* catp = gInventory.getCategory(category);
-		if (catp->getPreferredType() == LLFolderType::FT_NONE ||
-			LLFolderType::lookupIsEnsembleType(catp->getPreferredType()))
-		{
-			LLAppearanceManager::instance().updateCOFFromCategory(category, append);  // append is false - rebuild COF.
-		}
-		else if (catp->getPreferredType() == LLFolderType::FT_OUTFIT)
-		{
-			LLAppearanceManager::instance().rebuildCOFFromOutfit(category);
-		}
-	}
-#endif
-}
-
-// Append to current COF contents by recursively traversing a folder.
-void LLAppearanceManager::updateCOFFromCategory(const LLUUID& category, bool append)
-{
-		// BAP consolidate into one "get all 3 types of descendents" function, use both places.
-	LLInventoryModel::item_array_t wear_items;
-	LLInventoryModel::item_array_t obj_items;
-	LLInventoryModel::item_array_t gest_items;
-	bool follow_folder_links = false;
-	getUserDescendents(category, wear_items, obj_items, gest_items, follow_folder_links);
-
-	// Find all the wearables that are in the category's subtree.	
-	lldebugs << "appendCOFFromCategory()" << llendl;
-	if( !wear_items.count() && !obj_items.count() && !gest_items.count())
-	{
-		LLNotifications::instance().add("CouldNotPutOnOutfit");
-		return;
-	}
-		
-	const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
-	// Processes that take time should show the busy cursor
-	//inc_busy_count();
-		
-	LLInventoryModel::cat_array_t cof_cats;
-	LLInventoryModel::item_array_t cof_items;
-	gInventory.collectDescendents(current_outfit_id, cof_cats, cof_items,
-								  LLInventoryModel::EXCLUDE_TRASH);
-	// Remove duplicates
-	if (append)
-	{
-		removeDuplicateItems(wear_items, cof_items);
-		removeDuplicateItems(obj_items, cof_items);
-		removeDuplicateItems(gest_items, cof_items);
-	}
-
-	S32 total_links = gest_items.count() + wear_items.count() + obj_items.count();
-
-	if (!append && total_links > 0)
-	{
-		purgeCOFBeforeRebuild(category);
-	}
-
-	LLPointer<LLUpdateAppearanceOnDestroy> link_waiter = new LLUpdateAppearanceOnDestroy;
-	
-	// Link all gestures in this folder
-	if (gest_items.count() > 0)
-	{
-		llinfos << "Linking " << gest_items.count() << " gestures" << llendl;
-		for (S32 i = 0; i < gest_items.count(); ++i)
-		{
-			const LLInventoryItem* gest_item = gest_items.get(i).get();
-			link_inventory_item(gAgent.getID(), gest_item->getLinkedUUID(), current_outfit_id,
-								gest_item->getName(),
-								LLAssetType::AT_LINK, link_waiter);
-		}
-	}
-
-	// Link all wearables
-	if(wear_items.count() > 0)
-	{
-		llinfos << "Linking " << wear_items.count() << " wearables" << llendl;
-		for(S32 i = 0; i < wear_items.count(); ++i)
-		{
-			// Populate the current outfit folder with links to the newly added wearables
-			const LLInventoryItem* wear_item = wear_items.get(i).get();
-			link_inventory_item(gAgent.getID(), 
-								wear_item->getLinkedUUID(), // If this item is a link, then we'll use the linked item's UUID.
-								current_outfit_id, 
-								wear_item->getName(),
-								LLAssetType::AT_LINK, 
-								link_waiter);
-		}
-	}
-
-	// Link all attachments.
-	if( obj_items.count() > 0 )
-	{
-		llinfos << "Linking " << obj_items.count() << " attachments" << llendl;
-		LLVOAvatar* avatar = gAgent.getAvatarObject();
-		if( avatar )
-		{
-			for(S32 i = 0; i < obj_items.count(); ++i)
-			{
-				const LLInventoryItem* obj_item = obj_items.get(i).get();
-				link_inventory_item(gAgent.getID(), 
-									obj_item->getLinkedUUID(), // If this item is a link, then we'll use the linked item's UUID.
-									current_outfit_id, 
-									obj_item->getName(),
-									LLAssetType::AT_LINK, link_waiter);
-			}
-		}
-	}
 }
 
 void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
@@ -556,6 +442,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID
 		}
 	}
 }
+
 void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links)
 {
 	LLInventoryModel::cat_array_t cats;
@@ -681,110 +568,6 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
 							  
 }
 
-bool LLAppearanceManager::isMandatoryWearableType(EWearableType type)
-{
-	return (type==WT_SHAPE) || (type==WT_SKIN) || (type== WT_HAIR) || (type==WT_EYES);
-}
-
-// For mandatory body parts.
-void LLAppearanceManager::checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found)
-{
-	LLInventoryModel::cat_array_t new_cats;
-	LLInventoryModel::item_array_t new_items;
-	gInventory.collectDescendents(category, new_cats, new_items,
-								  LLInventoryModel::EXCLUDE_TRASH);
-	std::set<EWearableType> wt_types_found;
-	for (S32 i = 0; i < new_items.count(); ++i)
-	{
-		LLViewerInventoryItem *itemp = new_items.get(i);
-		if (itemp->isWearableType())
-		{
-			EWearableType type = itemp->getWearableType();
-			if (isMandatoryWearableType(type))
-			{
-				types_found.insert(type);
-			}
-		}
-	}
-}
-
-// Remove everything from the COF that we safely can before replacing
-// with contents of new category.  This means preserving any mandatory
-// body parts that aren't present in the new category, and getting rid
-// of everything else.
-void LLAppearanceManager::purgeCOFBeforeRebuild(const LLUUID& category)
-{
-	// See which mandatory body types are present in the new category.
-	std::set<EWearableType> wt_types_found;
-	checkMandatoryWearableTypes(category,wt_types_found);
-	
-	LLInventoryModel::cat_array_t cof_cats;
-	LLInventoryModel::item_array_t cof_items;
-	gInventory.collectDescendents(getCOF(), cof_cats, cof_items,
-								  LLInventoryModel::EXCLUDE_TRASH);
-	for (S32 i = 0; i < cof_items.count(); ++i)
-	{
-		LLViewerInventoryItem *itemp = cof_items.get(i);
-		if (itemp->isWearableType())
-		{
-			EWearableType type = itemp->getWearableType();
-			if (!isMandatoryWearableType(type) || (wt_types_found.find(type) != wt_types_found.end()))
-			{
-				// Not mandatory or supplied by the new category - OK to delete
-				gInventory.purgeObject(cof_items.get(i)->getUUID());
-			}
-		}
-		else
-		{
-			// Not a wearable - always purge
-			gInventory.purgeObject(cof_items.get(i)->getUUID());
-		}
-	}
-	gInventory.notifyObservers();
-}
-
-// Replace COF contents from a given outfit folder.
-void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category)
-{
-	lldebugs << "rebuildCOFFromOutfit()" << llendl;
-
-	dumpCat(category,"start, source outfit");
-	dumpCat(getCOF(),"start, COF");
-
-	// Find all the wearables that are in the category's subtree.	
-	LLInventoryModel::item_array_t items;
-	getCOFValidDescendents(category, items);
-
-	if( items.count() == 0)
-	{
-		LLNotifications::instance().add("CouldNotPutOnOutfit");
-		return;
-	}
-
-	// Processes that take time should show the busy cursor
-	//inc_busy_count();
-
-	//dumpCat(current_outfit_id,"COF before remove:");
-
-	//dumpCat(current_outfit_id,"COF after remove:");
-
-	purgeCOFBeforeRebuild(category);
-	
-	LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy;
-	LLUUID current_outfit_id = getCOF();
-	LLAppearanceManager::shallowCopyCategory(category, current_outfit_id, link_waiter);
-
-	//dumpCat(current_outfit_id,"COF after shallow copy:");
-
-	// Create a link to the outfit that we wore.
-	LLViewerInventoryCategory* catp = gInventory.getCategory(category);
-	if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT)
-	{
-		link_inventory_item(gAgent.getID(), category, current_outfit_id, catp->getName(),
-							LLAssetType::AT_LINK_FOLDER, link_waiter);
-	}
-}
-
 void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, bool append)
 {
 	lldebugs << "updateAgentWearables()" << llendl;
@@ -905,20 +688,6 @@ void LLAppearanceManager::updateAppearanceFromCOF()
 	}
 }
 
-void LLAppearanceManager::getCOFValidDescendents(const LLUUID& category,
-												 LLInventoryModel::item_array_t& items)
-{
-	LLInventoryModel::cat_array_t cats;
-	LLFindCOFValidItems is_cof_valid;
-	bool follow_folder_links = false;
-	gInventory.collectDescendentsIf(category,
-									cats, 
-									items, 
-									LLInventoryModel::EXCLUDE_TRASH,
-									is_cof_valid, 
-									follow_folder_links);
-}
-
 void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category,
 													LLInventoryModel::item_array_t& items,
 													LLAssetType::EType type,
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 4401596e2c4..736dabea313 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -48,13 +48,9 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 	void updateAppearanceFromCOF();
 	bool needToSaveCOF();
 	void updateCOF(const LLUUID& category, bool append = false);
-	void updateCOFFromCategory(const LLUUID& category, bool append);
-	void rebuildCOFFromOutfit(const LLUUID& category);
 	void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append);
 	void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append);
 	void wearOutfitByName(const std::string& name);
-	void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
-									LLPointer<LLInventoryCallback> cb);
 	void changeOutfit(bool proceed, const LLUUID& category, bool append);
 
 	// Add COF link to individual item.
@@ -62,19 +58,28 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 
 	// Add COF link to ensemble folder.
 	void wearEnsemble(LLInventoryCategory* item, bool do_update = true);
+
+	// Copy all items in a category.
+	void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
+							 LLPointer<LLInventoryCallback> cb);
+
+	// Find the Current Outfit folder.
 	LLUUID getCOF();
 
 	// Remove COF entries
 	void removeItemLinks(const LLUUID& item_id, bool do_update = true);
 
+	void updateAgentWearables(LLWearableHoldingPattern* holder, bool append);
+
 	// For debugging - could be moved elsewhere.
 	void dumpCat(const LLUUID& cat_id, const std::string& msg);
 	void dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg);
+
+	// Attachment link management
 	void unregisterAttachment(const LLUUID& item_id);
 	void registerAttachment(const LLUUID& item_id);
 	void setAttachmentInvLinkEnable(bool val);
 	void linkRegisteredAttachments();
-	void updateAgentWearables(LLWearableHoldingPattern* holder, bool append);
 
 protected:
 	LLAppearanceManager();
@@ -92,17 +97,12 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 										  LLAssetType::EType type,
 										  bool follow_folder_links);
 
-	void getCOFValidDescendents(const LLUUID& category, 
-									   LLInventoryModel::item_array_t& items);
-									   
 	void getUserDescendents(const LLUUID& category, 
 								   LLInventoryModel::item_array_t& wear_items,
 								   LLInventoryModel::item_array_t& obj_items,
 								   LLInventoryModel::item_array_t& gest_items,
 								   bool follow_folder_links);
-	bool isMandatoryWearableType(EWearableType type);
-	void checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found);
-	void purgeCOFBeforeRebuild(const LLUUID& category);
+
 	void purgeCategory(const LLUUID& category, bool keep_outfit_links);
 
 	std::set<LLUUID> mRegisteredAttachments;
-- 
GitLab


From 7af2e9326537d2e57424367bd260744205fb76d8 Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Thu, 12 Nov 2009 17:58:31 -0500
Subject: [PATCH 207/557] EXT-2190 share button in IM should open sidepanel
 inventory

share button in im popup now opens sidepanel inventory.

Code reviewed by Seraph
---
 indra/newview/llpanelimcontrolpanel.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index 1770138b3ec..b2e05ccead3 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -43,6 +43,7 @@
 #include "llparticipantlist.h"
 #include "llimview.h"
 #include "llvoicechannel.h"
+#include "llsidetray.h"
 
 void LLPanelChatControlPanel::onCallButtonClicked()
 {
@@ -158,7 +159,8 @@ void LLPanelIMControlPanel::onAddFriendButtonClicked()
 
 void LLPanelIMControlPanel::onShareButtonClicked()
 {
-	// *TODO: Implement
+	LLSD key;
+	LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
 }
 
 void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
-- 
GitLab


From 7f76507ddcae12795326efac31816ad829a34088 Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Thu, 12 Nov 2009 18:08:22 -0500
Subject: [PATCH 208/557] EXT-2387 crash on dump local textures

we didn't check local_tex_obj for NULL before using it. checked to make sure
pointer is not null before calling ->getImage()
---
 indra/newview/llvoavatarself.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 94081ada550..f382a09d195 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -1578,7 +1578,7 @@ void LLVOAvatarSelf::dumpLocalTextures() const
 			llinfos << "LocTex " << name << ": Baked " << getTEImage(baked_equiv)->getID() << llendl;
 #endif
 		}
-		else if (local_tex_obj->getImage() != NULL)
+		else if (local_tex_obj && local_tex_obj->getImage() != NULL)
 		{
 			if (local_tex_obj->getImage()->getID() == IMG_DEFAULT_AVATAR)
 			{
-- 
GitLab


From b685895dd09c4520027bbdcb48c749e5ea2e0485 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Thu, 12 Nov 2009 18:11:25 -0500
Subject: [PATCH 209/557] EXT-2426 : Remove COF processing that is causing
 recursive calls to gInventory.notifyObservers

Changing COF processing to happen during idle(), versus within done().

Reviewed by: Vir

--HG--
branch : avatar-pipeline
---
 indra/newview/llagentwearables.cpp | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 9b4986247fd..5bf1573a2cc 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -35,6 +35,7 @@
 #include "llagent.h" 
 #include "llagentwearables.h"
 
+#include "llcallbacklist.h"
 #include "llfloatercustomize.h"
 #include "llfloaterinventory.h"
 #include "llinventorybridge.h"
@@ -82,6 +83,8 @@ class LLInitialWearablesFetch : public LLInventoryFetchDescendentsObserver
 
 protected:
 	void processWearablesMessage();
+	void processContents();
+	static void onIdle(void *userdata);
 };
 
 LLAgentWearables gAgentWearables;
@@ -2002,11 +2005,34 @@ void LLAgentWearables::updateServer()
 	gAgent.sendAgentSetAppearance();
 }
 
+//--------------------------------------------------------------------
+// InitialWearablesFetch
+// 
+// This grabs contents from the COF and processes them.
+// The processing is handled in idle(), i.e. outside of done(),
+// to avoid gInventory.notifyObservers recursion.
+//--------------------------------------------------------------------
+
+// virtual
 void LLInitialWearablesFetch::done()
 {
-	// No longer need this observer hanging around.
+	// Delay processing the actual results of this so it's not handled within
+	// gInventory.notifyObservers.  The results will be handled in the next
+	// idle tick instead.
 	gInventory.removeObserver(this);
+	gIdleCallbacks.addFunction(onIdle, this);
+}
 
+// static
+void LLInitialWearablesFetch::onIdle(void *data)
+{
+	gIdleCallbacks.deleteFunction(onIdle, data);
+	LLInitialWearablesFetch *self = reinterpret_cast<LLInitialWearablesFetch*>(data);
+	self->processContents();
+}
+
+void LLInitialWearablesFetch::processContents()
+{
 	// Fetch the wearable items from the Current Outfit Folder
 	LLInventoryModel::cat_array_t cat_array;
 	LLInventoryModel::item_array_t wearable_array;
-- 
GitLab


From 759cf798c30e5480fa43fdc9dc25d8f4ddf92349 Mon Sep 17 00:00:00 2001
From: skolb <none@none>
Date: Thu, 12 Nov 2009 15:36:04 -0800
Subject: [PATCH 210/557] EXT-2135 [BSI] Scrolling the TOS agreement makes the
 entire agreement unreadable

---
 .../skins/default/xui/en/floater_tos.xml       | 18 +-----------------
 1 file changed, 1 insertion(+), 17 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_tos.xml b/indra/newview/skins/default/xui/en/floater_tos.xml
index 4e2cce1428c..1adb824e2a6 100644
--- a/indra/newview/skins/default/xui/en/floater_tos.xml
+++ b/indra/newview/skins/default/xui/en/floater_tos.xml
@@ -53,22 +53,6 @@
         Please read the following Terms of Service carefully. To continue logging in to [SECOND_LIFE],
 you must accept the agreement.
     </text>
-    <text_editor
-     type="string"
-     length="1"
-     follows="left|top"
-     font="SansSerif"
-     height="283"
-     layout="topleft"
-     left_delta="0"
-     max_length="65536"
-     name="tos_text"
-     top_pad="43"
-     width="568"
-     handle_edit_keys_directly="true" 
-     word_wrap="true">
-        TOS_TEXT
-    </text_editor>
     <web_browser
      follows="left|top"
      height="340"
@@ -76,6 +60,6 @@ you must accept the agreement.
      left_delta="0"
      name="tos_html"
      start_url="data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E"
-     top_delta="-27"
+     top_delta="0"
      width="568" />
 </floater>
-- 
GitLab


From 5a220b63ca3a485ac251f44f7bebf029a7670542 Mon Sep 17 00:00:00 2001
From: richard <none@none>
Date: Thu, 12 Nov 2009 16:01:48 -0800
Subject: [PATCH 211/557] added comments to textures.xml

---
 .../skins/default/textures/textures.xml       | 30 +++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index eea2dfb1a1c..4c272b6bb57 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -1,3 +1,33 @@
+<!--
+This file contains metadata about how to load, display, and scale textures for rendering in the UI.
+Images do *NOT* have to appear in this file in order to use them as textures in the UI...simply refer 
+to them by filename (relative to textures directory).
+NOTE: if you want to reuse an image file with different metadata, simply create a new texture entry 
+with the same filename but different name
+
+<texture
+  name="MyTexture" (mandatory)
+    - this is the name you reference the texture by in XUI.  For example, <button image_unselected="MyTexture"/>
+  file_name="images/my_texture.png" (optional)
+    - this is the path to the actual file asset, relative to the current skins "textures" directory.  
+      If not supplied, the filename will be taken from the texture name itself, "MyTexture" in this case.  
+      NOTE: you need to provide an extension on the filename (".png", ".tga", ".jpg") for us to decode the image properly
+  preload="true" (optional, false by default)
+    - If true, we will attempt to load the image before displaying any UI.  
+      If false, we will load in the background after initializing the UI.
+  use_mips="true" (currently unused)
+  scale.left="1"
+  scale.bottom="1"
+  scale.top="15"
+  scale.right="31"
+    - Specifies the segmentation for 9-slice image scaling.  Specifically, the pixel offsets from the LOWER LEFT corner
+      that define the region of the image that is stretched to make the whole image fit in the required space.
+      In this example, if the source image is 32x16 pixels, we have defined a center region that starts one pixel up
+      and to the right from the bottom left corner and extends to 31 pixels right and 15 pixels up from the bottom left 
+      corner.  The end result is that the image will keep a 1 pixel border all around while stretching to fit the required 
+      region.
+-->
+
 <textures version="101">
   <!-- Please add new files alphabetically to prevent merge conflicts. JC -->
   <texture name="Accordion_ArrowClosed_Off" file_name="containers/Accordion_ArrowClosed_Off.png" preload="false" />
-- 
GitLab


From ffadb3d29fe4e7be69dbb26650737c061c3cb206 Mon Sep 17 00:00:00 2001
From: richard <none@none>
Date: Thu, 12 Nov 2009 16:13:46 -0800
Subject: [PATCH 212/557] renamed UIImageDeclaration::scale_rect to scale to be
 consistent with XML attribute name

---
 indra/newview/llviewertexturelist.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 081b7cc4831..de854cb7b42 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -1461,14 +1461,14 @@ struct UIImageDeclaration : public LLInitParam::Block<UIImageDeclaration>
 	Mandatory<std::string>	name;
 	Optional<std::string>	file_name;
 	Optional<bool>			preload;
-	Optional<LLRect>		scale_rect;
+	Optional<LLRect>		scale;
 	Optional<bool>			use_mips;
 
 	UIImageDeclaration()
 	:	name("name"),
 		file_name("file_name"),
 		preload("preload", false),
-		scale_rect("scale"),
+		scale("scale"),
 		use_mips("use_mips", false)
 	{}
 };
@@ -1558,7 +1558,7 @@ bool LLUIImageList::initFromFile()
 			{
 				continue;
 			}
-			preloadUIImage(image_it->name, file_name, image_it->use_mips, image_it->scale_rect);
+			preloadUIImage(image_it->name, file_name, image_it->use_mips, image_it->scale);
 		}
 
 		if (cur_pass == PASS_DECODE_NOW && !gSavedSettings.getBOOL("NoPreload"))
-- 
GitLab


From 31ceac828920bac39c330ba1eb6b7f7d9cc918b1 Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Thu, 12 Nov 2009 19:16:01 -0500
Subject: [PATCH 213/557] EXT-1796 right click menu has "take off items" for
 gestures

renamed "take off items" to "remove from outfit"

Code reviewed by Seraph
---
 indra/newview/llinventorybridge.cpp                   | 2 +-
 indra/newview/skins/default/xui/en/menu_inventory.xml | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 1bc9297bba3..12fb580825b 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -2404,7 +2404,7 @@ void LLFolderBridge::folderOptionsMenu()
 		{
 			mItems.push_back(std::string("Wear As Ensemble"));
 		}
-		mItems.push_back(std::string("Take Off Items"));
+		mItems.push_back(std::string("Remove From Outfit"));
 	}
 	hide_context_entries(*mMenu, mItems, disabled_items);
 }
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index 8b6ab4e4d81..c86d32c8c49 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -434,9 +434,9 @@
     <menu_item_separator
      layout="topleft" />
     <menu_item_call
-     label="Take Off Items"
+     label="Remove From Outfit"
      layout="topleft"
-     name="Take Off Items">
+     name="Remove From Outfit">
         <menu_item_call.on_click
          function="Inventory.DoToSelected"
          parameter="removefromoutfit" />
-- 
GitLab


From 2f97829aab549a4d65daead298361a0c25399be2 Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Thu, 12 Nov 2009 20:11:53 -0500
Subject: [PATCH 214/557] Introduce LLEventDispatcher::begin()/end() to iterate
 over (name, desc) pairs for all registered operations. (untested) Introduce
 LLEventDispatcher::getMetadata(name) query so you can discover, for a given
 named operation, its query string and required parameters. (untested)
 Introduce LLEventDispatcher::add() convenience methods allowing you to omit
 description strings. Fix LLLoginInstance (which uses a non-LLEventAPI
 LLEventDispatcher) back to description-less add() calls. However, filter
 LLEventDispatcher::add() methods inherited by LLEventAPI so that an
 LLEventAPI subclass *must* provide a description string.

---
 indra/llcommon/lleventapi.h          | 13 ++++++
 indra/llcommon/lleventdispatcher.cpp | 14 ++++++
 indra/llcommon/lleventdispatcher.h   | 65 +++++++++++++++++++++++-----
 indra/newview/lllogininstance.cpp    |  6 +--
 4 files changed, 83 insertions(+), 15 deletions(-)

diff --git a/indra/llcommon/lleventapi.h b/indra/llcommon/lleventapi.h
index fef12988cb4..b45be6802b7 100644
--- a/indra/llcommon/lleventapi.h
+++ b/indra/llcommon/lleventapi.h
@@ -46,6 +46,19 @@ class LLEventAPI: public LLDispatchListener,
     /// Get the documentation string
     std::string getDesc() const { return mDesc; }
 
+    /**
+     * Publish only selected add() methods from LLEventDispatcher.
+     * Every LLEventAPI add() @em must have a description string.
+     */
+    template <typename CALLABLE>
+    void add(const std::string& name,
+             const std::string& desc,
+             CALLABLE callable,
+             const LLSD& required=LLSD())
+    {
+        LLEventDispatcher::add(name, desc, callable, required);
+    }
+
 private:
     std::string mDesc;
 };
diff --git a/indra/llcommon/lleventdispatcher.cpp b/indra/llcommon/lleventdispatcher.cpp
index 017bf3a5219..5fa6059718c 100644
--- a/indra/llcommon/lleventdispatcher.cpp
+++ b/indra/llcommon/lleventdispatcher.cpp
@@ -121,6 +121,20 @@ LLEventDispatcher::Callable LLEventDispatcher::get(const std::string& name) cons
     return found->second.mFunc;
 }
 
+LLSD LLEventDispatcher::getMetadata(const std::string& name) const
+{
+    DispatchMap::const_iterator found = mDispatch.find(name);
+    if (found == mDispatch.end())
+    {
+        return LLSD();
+    }
+    LLSD meta;
+    meta["name"] = name;
+    meta["desc"] = found->second.mDesc;
+    meta["required"] = found->second.mRequired;
+    return meta;
+}
+
 LLDispatchListener::LLDispatchListener(const std::string& pumpname, const std::string& key):
     LLEventDispatcher(pumpname, key),
     mPump(pumpname, true),          // allow tweaking for uniqueness
diff --git a/indra/llcommon/lleventdispatcher.h b/indra/llcommon/lleventdispatcher.h
index eba7b607f18..c8c4fe0c3ca 100644
--- a/indra/llcommon/lleventdispatcher.h
+++ b/indra/llcommon/lleventdispatcher.h
@@ -19,6 +19,7 @@
 #include <map>
 #include <boost/function.hpp>
 #include <boost/bind.hpp>
+#include <boost/iterator/transform_iterator.hpp>
 #include <typeinfo>
 #include "llevents.h"
 
@@ -73,6 +74,16 @@ class LL_COMMON_API LLEventDispatcher
         addMethod<CLASS>(name, desc, method, required);
     }
 
+    /// Convenience: for LLEventDispatcher, not every callable needs a
+    /// documentation string.
+    template <typename CALLABLE>
+    void add(const std::string& name,
+             CALLABLE callable,
+             const LLSD& required=LLSD())
+    {
+        add(name, "", callable, required);
+    }
+
     /// Unregister a callable
     bool remove(const std::string& name);
 
@@ -87,10 +98,47 @@ class LL_COMMON_API LLEventDispatcher
     /// @a required prototype specified at add() time, die with LL_ERRS.
     void operator()(const LLSD& event) const;
 
+    /// @name Iterate over defined names
+    //@{
+    typedef std::pair<std::string, std::string> NameDesc;
+
+private:
+    struct DispatchEntry
+    {
+        DispatchEntry(const Callable& func, const std::string& desc, const LLSD& required):
+            mFunc(func),
+            mDesc(desc),
+            mRequired(required)
+        {}
+        Callable mFunc;
+        std::string mDesc;
+        LLSD mRequired;
+    };
+    typedef std::map<std::string, DispatchEntry> DispatchMap;
+
+public:
+    /// We want the flexibility to redefine what data we store per name,
+    /// therefore our public interface doesn't expose DispatchMap iterators,
+    /// or DispatchMap itself, or DispatchEntry. Instead we explicitly
+    /// transform each DispatchMap item to NameDesc on dereferencing.
+    typedef boost::transform_iterator<NameDesc(*)(const DispatchMap::value_type&), DispatchMap::const_iterator> const_iterator;
+    const_iterator begin() const
+    {
+        return boost::make_transform_iterator(mDispatch.begin(), makeNameDesc);
+    }
+    const_iterator end() const
+    {
+        return boost::make_transform_iterator(mDispatch.end(), makeNameDesc);
+    }
+    //@}
+
     /// Fetch the Callable for the specified name. If no such name was
     /// registered, return an empty() Callable.
     Callable get(const std::string& name) const;
 
+    /// Get information about a specific Callable
+    LLSD getMetadata(const std::string& name) const;
+
 private:
     template <class CLASS, typename METHOD>
     void addMethod(const std::string& name, const std::string& desc,
@@ -111,19 +159,12 @@ class LL_COMMON_API LLEventDispatcher
     bool attemptCall(const std::string& name, const LLSD& event) const;
 
     std::string mDesc, mKey;
-    struct DispatchEntry
-    {
-        DispatchEntry(const Callable& func, const std::string& desc, const LLSD& required):
-            mFunc(func),
-            mDesc(desc),
-            mRequired(required)
-        {}
-        Callable mFunc;
-        std::string mDesc;
-        LLSD mRequired;
-    };
-    typedef std::map<std::string, DispatchEntry> DispatchMap;
     DispatchMap mDispatch;
+
+    static NameDesc makeNameDesc(const DispatchMap::value_type& item)
+    {
+        return NameDesc(item.first, item.second.mDesc);
+    }
 };
 
 /**
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index 945294f3f27..e5f347ddc40 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -73,9 +73,9 @@ LLLoginInstance::LLLoginInstance() :
 {
 	mLoginModule->getEventPump().listen("lllogininstance", 
 		boost::bind(&LLLoginInstance::handleLoginEvent, this, _1));
-	mDispatcher.add("fail.login", "", boost::bind(&LLLoginInstance::handleLoginFailure, this, _1));
-	mDispatcher.add("connect",    "", boost::bind(&LLLoginInstance::handleLoginSuccess, this, _1));
-	mDispatcher.add("disconnect", "", boost::bind(&LLLoginInstance::handleDisconnect, this, _1));
+	mDispatcher.add("fail.login", boost::bind(&LLLoginInstance::handleLoginFailure, this, _1));
+	mDispatcher.add("connect",    boost::bind(&LLLoginInstance::handleLoginSuccess, this, _1));
+	mDispatcher.add("disconnect", boost::bind(&LLLoginInstance::handleDisconnect, this, _1));
 }
 
 LLLoginInstance::~LLLoginInstance()
-- 
GitLab


From 1bbcc4be8359b177aca093be0b451c12212f8a7d Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Thu, 12 Nov 2009 20:21:33 -0500
Subject: [PATCH 215/557] EXT-24131 : Diagnose warning spam: "WARNING:
 LLObjectBridge::performAction: object not found - ignoring"

This warning is a false positive, also existed in 1.23.  Removing.

--HG--
branch : avatar-pipeline
---
 indra/newview/llappearancemgr.cpp   |   1 +
 indra/newview/llinventorybridge.cpp |   7 +-
 indra/newview/llinventorymodel.cpp  |   5 +-
 indra/newview/llinventorypanel.cpp  | 116 ++++++++++++++--------------
 4 files changed, 65 insertions(+), 64 deletions(-)

diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 0901289dace..e7123d50005 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -1167,6 +1167,7 @@ void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update)
 		const LLInventoryItem* item = item_array.get(i).get();
 		if (item->getLinkedUUID() == item_id)
 		{
+			llinfos << "Purging object " << item->getUUID() << "for linked item " << item->getLinkedUUID() << llendl;
 			gInventory.purgeObject(item_array.get(i)->getUUID());
 		}
 	}
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 1bc9297bba3..10c4b620df6 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -3889,16 +3889,11 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model
 			gMessageSystem->sendReliable( gAgent.getRegion()->getHost());
 		}
 		// this object might have been selected, so let the selection manager know it's gone now
-		LLViewerObject *found_obj =
-			gObjectList.findObject(item->getUUID());
+		LLViewerObject *found_obj = gObjectList.findObject(item->getLinkedUUID());
 		if (found_obj)
 		{
 			LLSelectMgr::getInstance()->remove(found_obj);
 		}
-		else
-		{
-			llwarns << "object not found - ignoring" << llendl;
-		}
 	}
 	else LLItemBridge::performAction(folder, model, action);
 }
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 4b0d524906c..a61f45c2c9f 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -886,7 +886,7 @@ void LLInventoryModel::moveObject(const LLUUID& object_id, const LLUUID& cat_id)
 // Delete a particular inventory object by ID.
 void LLInventoryModel::deleteObject(const LLUUID& id)
 {
-	purgeLinkedObjects(id);
+	//purgeLinkedObjects(id);
 	lldebugs << "LLInventoryModel::deleteObject()" << llendl;
 	LLPointer<LLInventoryObject> obj = getObject(id);
 	if(obj)
@@ -923,13 +923,14 @@ void LLInventoryModel::deleteObject(const LLUUID& id)
 		}
 		addChangedMask(LLInventoryObserver::REMOVE, id);
 		obj = NULL; // delete obj
+		gInventory.notifyObservers();
 	}
 }
 
 // Delete a particular inventory item by ID, and remove it from the server.
 void LLInventoryModel::purgeObject(const LLUUID &id)
 {
-	lldebugs << "LLInventoryModel::purgeObject()" << llendl;
+	lldebugs << "LLInventoryModel::purgeObject() id:" << id << llendl;
 	LLPointer<LLInventoryObject> obj = getObject(id);
 	if(obj)
 	{
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index dfd4af5c287..1a800b96d1d 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -346,73 +346,77 @@ void LLInventoryPanel::modelChanged(U32 mask)
 				LLInventoryObject* model_item = model->getObject(*id_it);
 				LLFolderViewItem* view_item = mFolders->getItemByID(*id_it);
 
-				if (model_item)
+				// ADD operation
+				if (model_item && !view_item)
 				{
-					if (!view_item)
+					// this object was just created, need to build a view for it
+					if ((mask & LLInventoryObserver::ADD) != LLInventoryObserver::ADD)
 					{
-						// this object was just created, need to build a view for it
-						if ((mask & LLInventoryObserver::ADD) != LLInventoryObserver::ADD)
-						{
-							llwarns << *id_it << " is in model but not in view, but ADD flag not set" << llendl;
-						}
-						buildNewViews(*id_it);
-						
-						// select any newly created object
-						// that has the auto rename at top of folder
-						// root set
-						if(mFolders->getRoot()->needsAutoRename())
-						{
-							setSelection(*id_it, FALSE);
-						}
+						llwarns << "( Operation: " << mask << " panel name: " << mStartFolderString << " ) Item in model but not in view, but ADD flag not set [ Name: " << model_item->getName() << " UUID: " << *id_it << " ]" << llendl;
 					}
-					else
+					buildNewViews(*id_it);
+					
+					// select any newly created object
+					// that has the auto rename at top of folder
+					// root set
+					if(mFolders->getRoot()->needsAutoRename())
 					{
-						// this object was probably moved, check its parent
-						if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE)
-						{
-							llwarns << *id_it << " is in model and in view, but STRUCTURE flag not set" << " for model (Name :" << model_item->getName() << " )" << llendl;
-						}
-
-						LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
-
-						// added check against NULL for cases when Inventory panel contains startFolder.
-						// in this case parent is LLFolderView (LLInventoryPanel::mFolders) itself.
-						// this check is a fix for bug EXT-1859.
-						if (NULL != new_parent && view_item->getParentFolder() != new_parent)
-						{
-							view_item->getParentFolder()->extractItem(view_item);
-							view_item->addToFolder(new_parent, mFolders);
-						}
-/*
-						 on the other side in case Inventory Panel has content of the any folder
-						 it is possible that item moved to some folder which is absent in current
-						 Panel. For ex. removing item (via moving to trash).
-						 In this case we need to check if new parent is other then inventory start folder
-						 and simply remove its View from the hierarchy.
-						 See details in EXT-2098.
-*/
-						// So, let check if item was moved into folder out of this Inventory Panel.
-						else if (mStartFolderID.notNull() && NULL == new_parent && model_item->getParentUUID() != mStartFolderID)
-						{
-							view_item->getParentFolder()->extractItem(view_item);
-						}
+						setSelection(*id_it, FALSE);
 					}
 				}
-				else
+
+				// STRUCTURE operation
+				if (model_item && view_item)
 				{
-					if (view_item)
+					// this object was probably moved, check its parent
+					if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE)
 					{
-						if ((mask & LLInventoryObserver::REMOVE) != LLInventoryObserver::REMOVE)
-						{
-							llwarns << *id_it << " is not in model but in view, but REMOVE flag not set" << llendl;
-						}
-						// item in view but not model, need to delete view
-						view_item->destroyView();
+						llwarns << "( Operation: " << mask << " panel name: " << mStartFolderString << " ) Item in model and in view, but STRUCTURE flag not set [ Name:" << model_item->getName() << " UUID: " << *id_it << " ]" << llendl;
+					}
+					
+					LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
+					
+					// added check against NULL for cases when Inventory panel contains startFolder.
+					// in this case parent is LLFolderView (LLInventoryPanel::mFolders) itself.
+					// this check is a fix for bug EXT-1859.
+					if (NULL != new_parent && view_item->getParentFolder() != new_parent)
+					{
+						view_item->getParentFolder()->extractItem(view_item);
+						view_item->addToFolder(new_parent, mFolders);
+					}
+					/*
+					  on the other side in case Inventory Panel has content of the any folder
+					  it is possible that item moved to some folder which is absent in current
+					  Panel. For ex. removing item (via moving to trash).
+					  In this case we need to check if new parent is other then inventory start folder
+					  and simply remove its View from the hierarchy.
+					  See details in EXT-2098.
+					*/
+					// So, let check if item was moved into folder out of this Inventory Panel.
+					else if (mStartFolderID.notNull() && NULL == new_parent && model_item->getParentUUID() != mStartFolderID)
+					{
+						view_item->getParentFolder()->extractItem(view_item);
 					}
-					else
+				}
+
+				// REMOVE operation
+				if (!model_item && view_item)
+				{
+					if ((mask & LLInventoryObserver::REMOVE) != LLInventoryObserver::REMOVE)
 					{
-						llwarns << *id_it << "Item does not exist in either view or model, but notification triggered" << llendl;
+						llwarns << "( Operation: " << mask << " panel name: " << mStartFolderString << " ) Item is not in model but in view, but REMOVE flag not set [ UUID: " << *id_it << " ] " << llendl;
 					}
+					// item in view but not model, need to delete view
+					view_item->destroyView();
+					llinfos << "Deleting " << *id_it << " from " << this << llendl;
+				}
+
+				// False positive.  This item probably just doesn't exist in the 
+				// particular inventory panel (e.g. is outside the root folder of the inventory panel).
+				// Ignore the operation.
+				if (!model_item && !view_item)
+				{
+					// llwarns << "( Operation: " << mask << " panel name: " << mStartFolderString << " ) Item does not exist in either view or model, but notification triggered [ UUID: " << *id_it << " ] " << llendl;
 				}
 			}
 		}
-- 
GitLab


From 2ea1b06440369d059eb67eb47dc4945975dbdc65 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Thu, 12 Nov 2009 20:29:07 -0500
Subject: [PATCH 216/557] Backed out changeset: 153709ddee86

--HG--
branch : avatar-pipeline
---
 indra/newview/llappearancemgr.cpp   |   1 -
 indra/newview/llinventorybridge.cpp |   7 +-
 indra/newview/llinventorymodel.cpp  |   5 +-
 indra/newview/llinventorypanel.cpp  | 116 ++++++++++++++--------------
 4 files changed, 64 insertions(+), 65 deletions(-)

diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index e7123d50005..0901289dace 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -1167,7 +1167,6 @@ void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update)
 		const LLInventoryItem* item = item_array.get(i).get();
 		if (item->getLinkedUUID() == item_id)
 		{
-			llinfos << "Purging object " << item->getUUID() << "for linked item " << item->getLinkedUUID() << llendl;
 			gInventory.purgeObject(item_array.get(i)->getUUID());
 		}
 	}
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 10c4b620df6..1bc9297bba3 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -3889,11 +3889,16 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model
 			gMessageSystem->sendReliable( gAgent.getRegion()->getHost());
 		}
 		// this object might have been selected, so let the selection manager know it's gone now
-		LLViewerObject *found_obj = gObjectList.findObject(item->getLinkedUUID());
+		LLViewerObject *found_obj =
+			gObjectList.findObject(item->getUUID());
 		if (found_obj)
 		{
 			LLSelectMgr::getInstance()->remove(found_obj);
 		}
+		else
+		{
+			llwarns << "object not found - ignoring" << llendl;
+		}
 	}
 	else LLItemBridge::performAction(folder, model, action);
 }
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index a61f45c2c9f..4b0d524906c 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -886,7 +886,7 @@ void LLInventoryModel::moveObject(const LLUUID& object_id, const LLUUID& cat_id)
 // Delete a particular inventory object by ID.
 void LLInventoryModel::deleteObject(const LLUUID& id)
 {
-	//purgeLinkedObjects(id);
+	purgeLinkedObjects(id);
 	lldebugs << "LLInventoryModel::deleteObject()" << llendl;
 	LLPointer<LLInventoryObject> obj = getObject(id);
 	if(obj)
@@ -923,14 +923,13 @@ void LLInventoryModel::deleteObject(const LLUUID& id)
 		}
 		addChangedMask(LLInventoryObserver::REMOVE, id);
 		obj = NULL; // delete obj
-		gInventory.notifyObservers();
 	}
 }
 
 // Delete a particular inventory item by ID, and remove it from the server.
 void LLInventoryModel::purgeObject(const LLUUID &id)
 {
-	lldebugs << "LLInventoryModel::purgeObject() id:" << id << llendl;
+	lldebugs << "LLInventoryModel::purgeObject()" << llendl;
 	LLPointer<LLInventoryObject> obj = getObject(id);
 	if(obj)
 	{
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 1a800b96d1d..dfd4af5c287 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -346,77 +346,73 @@ void LLInventoryPanel::modelChanged(U32 mask)
 				LLInventoryObject* model_item = model->getObject(*id_it);
 				LLFolderViewItem* view_item = mFolders->getItemByID(*id_it);
 
-				// ADD operation
-				if (model_item && !view_item)
+				if (model_item)
 				{
-					// this object was just created, need to build a view for it
-					if ((mask & LLInventoryObserver::ADD) != LLInventoryObserver::ADD)
+					if (!view_item)
 					{
-						llwarns << "( Operation: " << mask << " panel name: " << mStartFolderString << " ) Item in model but not in view, but ADD flag not set [ Name: " << model_item->getName() << " UUID: " << *id_it << " ]" << llendl;
+						// this object was just created, need to build a view for it
+						if ((mask & LLInventoryObserver::ADD) != LLInventoryObserver::ADD)
+						{
+							llwarns << *id_it << " is in model but not in view, but ADD flag not set" << llendl;
+						}
+						buildNewViews(*id_it);
+						
+						// select any newly created object
+						// that has the auto rename at top of folder
+						// root set
+						if(mFolders->getRoot()->needsAutoRename())
+						{
+							setSelection(*id_it, FALSE);
+						}
 					}
-					buildNewViews(*id_it);
-					
-					// select any newly created object
-					// that has the auto rename at top of folder
-					// root set
-					if(mFolders->getRoot()->needsAutoRename())
+					else
 					{
-						setSelection(*id_it, FALSE);
+						// this object was probably moved, check its parent
+						if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE)
+						{
+							llwarns << *id_it << " is in model and in view, but STRUCTURE flag not set" << " for model (Name :" << model_item->getName() << " )" << llendl;
+						}
+
+						LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
+
+						// added check against NULL for cases when Inventory panel contains startFolder.
+						// in this case parent is LLFolderView (LLInventoryPanel::mFolders) itself.
+						// this check is a fix for bug EXT-1859.
+						if (NULL != new_parent && view_item->getParentFolder() != new_parent)
+						{
+							view_item->getParentFolder()->extractItem(view_item);
+							view_item->addToFolder(new_parent, mFolders);
+						}
+/*
+						 on the other side in case Inventory Panel has content of the any folder
+						 it is possible that item moved to some folder which is absent in current
+						 Panel. For ex. removing item (via moving to trash).
+						 In this case we need to check if new parent is other then inventory start folder
+						 and simply remove its View from the hierarchy.
+						 See details in EXT-2098.
+*/
+						// So, let check if item was moved into folder out of this Inventory Panel.
+						else if (mStartFolderID.notNull() && NULL == new_parent && model_item->getParentUUID() != mStartFolderID)
+						{
+							view_item->getParentFolder()->extractItem(view_item);
+						}
 					}
 				}
-
-				// STRUCTURE operation
-				if (model_item && view_item)
+				else
 				{
-					// this object was probably moved, check its parent
-					if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE)
+					if (view_item)
 					{
-						llwarns << "( Operation: " << mask << " panel name: " << mStartFolderString << " ) Item in model and in view, but STRUCTURE flag not set [ Name:" << model_item->getName() << " UUID: " << *id_it << " ]" << llendl;
-					}
-					
-					LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
-					
-					// added check against NULL for cases when Inventory panel contains startFolder.
-					// in this case parent is LLFolderView (LLInventoryPanel::mFolders) itself.
-					// this check is a fix for bug EXT-1859.
-					if (NULL != new_parent && view_item->getParentFolder() != new_parent)
-					{
-						view_item->getParentFolder()->extractItem(view_item);
-						view_item->addToFolder(new_parent, mFolders);
-					}
-					/*
-					  on the other side in case Inventory Panel has content of the any folder
-					  it is possible that item moved to some folder which is absent in current
-					  Panel. For ex. removing item (via moving to trash).
-					  In this case we need to check if new parent is other then inventory start folder
-					  and simply remove its View from the hierarchy.
-					  See details in EXT-2098.
-					*/
-					// So, let check if item was moved into folder out of this Inventory Panel.
-					else if (mStartFolderID.notNull() && NULL == new_parent && model_item->getParentUUID() != mStartFolderID)
-					{
-						view_item->getParentFolder()->extractItem(view_item);
+						if ((mask & LLInventoryObserver::REMOVE) != LLInventoryObserver::REMOVE)
+						{
+							llwarns << *id_it << " is not in model but in view, but REMOVE flag not set" << llendl;
+						}
+						// item in view but not model, need to delete view
+						view_item->destroyView();
 					}
-				}
-
-				// REMOVE operation
-				if (!model_item && view_item)
-				{
-					if ((mask & LLInventoryObserver::REMOVE) != LLInventoryObserver::REMOVE)
+					else
 					{
-						llwarns << "( Operation: " << mask << " panel name: " << mStartFolderString << " ) Item is not in model but in view, but REMOVE flag not set [ UUID: " << *id_it << " ] " << llendl;
+						llwarns << *id_it << "Item does not exist in either view or model, but notification triggered" << llendl;
 					}
-					// item in view but not model, need to delete view
-					view_item->destroyView();
-					llinfos << "Deleting " << *id_it << " from " << this << llendl;
-				}
-
-				// False positive.  This item probably just doesn't exist in the 
-				// particular inventory panel (e.g. is outside the root folder of the inventory panel).
-				// Ignore the operation.
-				if (!model_item && !view_item)
-				{
-					// llwarns << "( Operation: " << mask << " panel name: " << mStartFolderString << " ) Item does not exist in either view or model, but notification triggered [ UUID: " << *id_it << " ] " << llendl;
 				}
 			}
 		}
-- 
GitLab


From 2886d0ec924fe21448cdb6902bc24841b0bdd079 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Thu, 12 Nov 2009 20:29:48 -0500
Subject: [PATCH 217/557] EXT-24131 : Diagnose warning spam: "WARNING:
 LLObjectBridge::performAction: object not found - ignoring"

This warning is a false positive, also existed in 1.23.  Removing.

--HG--
branch : avatar-pipeline
---
 indra/newview/llinventorybridge.cpp | 11 +----------
 1 file changed, 1 insertion(+), 10 deletions(-)

diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 1bc9297bba3..68daf53241b 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -3889,16 +3889,11 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model
 			gMessageSystem->sendReliable( gAgent.getRegion()->getHost());
 		}
 		// this object might have been selected, so let the selection manager know it's gone now
-		LLViewerObject *found_obj =
-			gObjectList.findObject(item->getUUID());
+		LLViewerObject *found_obj = gObjectList.findObject(item->getLinkedUUID());
 		if (found_obj)
 		{
 			LLSelectMgr::getInstance()->remove(found_obj);
 		}
-		else
-		{
-			llwarns << "object not found - ignoring" << llendl;
-		}
 	}
 	else LLItemBridge::performAction(folder, model, action);
 }
@@ -4325,10 +4320,6 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
 				{
 					LLSelectMgr::getInstance()->remove(found_obj);
 				}
-				else
-				{
-					llwarns << "object not found, ignoring" << llendl;
-				}
 			}
 		}
 
-- 
GitLab


From 999b9e28ce511b9a0753ebd87ce32cc524ef42ee Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Thu, 12 Nov 2009 20:36:54 -0500
Subject: [PATCH 218/557] EXT-2349 : Diagnose warning spam: "[X] is in model
 and in view, but STRUCTURE flag not set" EXT-2432 : Diagnose warning spam:
 "[X] does not exist in either view or model, but notification triggered"

Restructured llinventorypanel's handling of add/remove/structure so it's easier to understand
Removed false positive "notification triggered" warning since objects can now exist outside of various inventory panels' directories.

--HG--
branch : avatar-pipeline
---
 indra/newview/llinventorymodel.cpp |   6 +-
 indra/newview/llinventorypanel.cpp | 115 +++++++++++++++--------------
 2 files changed, 63 insertions(+), 58 deletions(-)

diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 4b0d524906c..ed5b7df5fa7 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -886,7 +886,8 @@ void LLInventoryModel::moveObject(const LLUUID& object_id, const LLUUID& cat_id)
 // Delete a particular inventory object by ID.
 void LLInventoryModel::deleteObject(const LLUUID& id)
 {
-	purgeLinkedObjects(id);
+	// Disabling this; let users manually purge linked objects.
+	// purgeLinkedObjects(id);
 	lldebugs << "LLInventoryModel::deleteObject()" << llendl;
 	LLPointer<LLInventoryObject> obj = getObject(id);
 	if(obj)
@@ -923,13 +924,14 @@ void LLInventoryModel::deleteObject(const LLUUID& id)
 		}
 		addChangedMask(LLInventoryObserver::REMOVE, id);
 		obj = NULL; // delete obj
+		gInventory.notifyObservers();
 	}
 }
 
 // Delete a particular inventory item by ID, and remove it from the server.
 void LLInventoryModel::purgeObject(const LLUUID &id)
 {
-	lldebugs << "LLInventoryModel::purgeObject()" << llendl;
+	lldebugs << "LLInventoryModel::purgeObject() [ id: " << id << " ] " << llendl;
 	LLPointer<LLInventoryObject> obj = getObject(id);
 	if(obj)
 	{
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index dfd4af5c287..583cb341b0a 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -346,73 +346,76 @@ void LLInventoryPanel::modelChanged(U32 mask)
 				LLInventoryObject* model_item = model->getObject(*id_it);
 				LLFolderViewItem* view_item = mFolders->getItemByID(*id_it);
 
-				if (model_item)
+				// ADD operation
+				if (model_item && !view_item)
 				{
-					if (!view_item)
+					// this object was just created, need to build a view for it
+					if ((mask & LLInventoryObserver::ADD) != LLInventoryObserver::ADD)
 					{
-						// this object was just created, need to build a view for it
-						if ((mask & LLInventoryObserver::ADD) != LLInventoryObserver::ADD)
-						{
-							llwarns << *id_it << " is in model but not in view, but ADD flag not set" << llendl;
-						}
-						buildNewViews(*id_it);
-						
-						// select any newly created object
-						// that has the auto rename at top of folder
-						// root set
-						if(mFolders->getRoot()->needsAutoRename())
-						{
-							setSelection(*id_it, FALSE);
-						}
+						llwarns << "( Operation: " << mask << " panel name: " << mStartFolderString << " ) Item in model but not in view, but ADD flag not set [ Name: " << model_item->getName() << " UUID: " << *id_it << " ]" << llendl;
 					}
-					else
+					buildNewViews(*id_it);
+					
+					// select any newly created object
+					// that has the auto rename at top of folder
+					// root set
+					if(mFolders->getRoot()->needsAutoRename())
 					{
-						// this object was probably moved, check its parent
-						if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE)
-						{
-							llwarns << *id_it << " is in model and in view, but STRUCTURE flag not set" << " for model (Name :" << model_item->getName() << " )" << llendl;
-						}
-
-						LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
-
-						// added check against NULL for cases when Inventory panel contains startFolder.
-						// in this case parent is LLFolderView (LLInventoryPanel::mFolders) itself.
-						// this check is a fix for bug EXT-1859.
-						if (NULL != new_parent && view_item->getParentFolder() != new_parent)
-						{
-							view_item->getParentFolder()->extractItem(view_item);
-							view_item->addToFolder(new_parent, mFolders);
-						}
-/*
-						 on the other side in case Inventory Panel has content of the any folder
-						 it is possible that item moved to some folder which is absent in current
-						 Panel. For ex. removing item (via moving to trash).
-						 In this case we need to check if new parent is other then inventory start folder
-						 and simply remove its View from the hierarchy.
-						 See details in EXT-2098.
-*/
-						// So, let check if item was moved into folder out of this Inventory Panel.
-						else if (mStartFolderID.notNull() && NULL == new_parent && model_item->getParentUUID() != mStartFolderID)
-						{
-							view_item->getParentFolder()->extractItem(view_item);
-						}
+						setSelection(*id_it, FALSE);
 					}
 				}
-				else
+
+				// STRUCTURE operation
+				if (model_item && view_item)
 				{
-					if (view_item)
+					// this object was probably moved, check its parent
+					if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE)
 					{
-						if ((mask & LLInventoryObserver::REMOVE) != LLInventoryObserver::REMOVE)
-						{
-							llwarns << *id_it << " is not in model but in view, but REMOVE flag not set" << llendl;
-						}
-						// item in view but not model, need to delete view
-						view_item->destroyView();
+						llwarns << "( Operation: " << mask << " panel name: " << mStartFolderString << " ) Item in model and in view, but STRUCTURE flag not set [ Name:" << model_item->getName() << " UUID: " << *id_it << " ]" << llendl;
+					}
+					
+					LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
+					
+					// added check against NULL for cases when Inventory panel contains startFolder.
+					// in this case parent is LLFolderView (LLInventoryPanel::mFolders) itself.
+					// this check is a fix for bug EXT-1859.
+					if (NULL != new_parent && view_item->getParentFolder() != new_parent)
+					{
+						view_item->getParentFolder()->extractItem(view_item);
+						view_item->addToFolder(new_parent, mFolders);
+					}
+					/*
+					  on the other side in case Inventory Panel has content of the any folder
+					  it is possible that item moved to some folder which is absent in current
+					  Panel. For ex. removing item (via moving to trash).
+					  In this case we need to check if new parent is other then inventory start folder
+					  and simply remove its View from the hierarchy.
+					  See details in EXT-2098.
+					*/
+					// So, let check if item was moved into folder out of this Inventory Panel.
+					else if (mStartFolderID.notNull() && NULL == new_parent && model_item->getParentUUID() != mStartFolderID)
+					{
+						view_item->getParentFolder()->extractItem(view_item);
 					}
-					else
+				}
+
+				// REMOVE operation
+				if (!model_item && view_item)
+				{
+					if ((mask & LLInventoryObserver::REMOVE) != LLInventoryObserver::REMOVE)
 					{
-						llwarns << *id_it << "Item does not exist in either view or model, but notification triggered" << llendl;
+						llwarns << "( Operation: " << mask << " panel name: " << mStartFolderString << " ) Item is not in model but in view, but REMOVE flag not set [ UUID: " << *id_it << " ] " << llendl;
 					}
+					// item in view but not model, need to delete view
+					view_item->destroyView();
+				}
+
+				// False positive.  This item probably just doesn't exist in the 
+				// particular inventory panel (e.g. is outside the root folder of the inventory panel).
+				// Ignore the operation.
+				if (!model_item && !view_item)
+				{
+					// llwarns << "( Operation: " << mask << " panel name: " << mStartFolderString << " ) Item does not exist in either view or model, but notification triggered [ UUID: " << *id_it << " ] " << llendl;
 				}
 			}
 		}
-- 
GitLab


From bc9daf3ab2ed5c33a738e5f882b1237c7bd3d120 Mon Sep 17 00:00:00 2001
From: Erica <erica@lindenlab.com>
Date: Thu, 12 Nov 2009 17:46:50 -0800
Subject: [PATCH 219/557]   EXT-2433 Fix tab max width on build tools

---
 .../skins/default/xui/en/floater_tools.xml     | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index c33d7cf31d8..b2f46bc4339 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -262,6 +262,18 @@
 		  <check_box.commit_callback
 			function="BuildTool.selectComponent"/>
 	</check_box>
+
+   <text
+   text_color="LtGray_50"
+   follows="top|left"
+   halign="left"
+   left="13"
+   name="RenderingCost"
+   top_pad="9"
+   type="string"
+   width="100">
+   þ: [COUNT]
+   </text>
 	<check_box
      control_name="ScaleUniform"
      height="19"
@@ -325,7 +337,7 @@
 	 <button.commit_callback
 	     function="BuildTool.gridOptions"/>
 	</button>
-    <button
+   <button
      follows="left|top"
      height="20"
      image_disabled="Object_Cube"
@@ -701,6 +713,7 @@
 	     function="BuildTool.applyToSelection"/>
     </button>
     <text
+    text_color="LtGray_50"
      type="string"
      length="1"
      height="12"
@@ -714,6 +727,7 @@
         Objects: [COUNT]
     </text>
     <text
+    text_color="LtGray_50"
      type="string"
      length="1"
      follows="left|top"
@@ -730,7 +744,7 @@
      halign="center"
      left="0"
      name="Object Info Tabs"
-     tab_max_width="55"
+     tab_max_width="54"
      tab_min_width="40"
      tab_position="top"
      tab_height="25"
-- 
GitLab


From 1aa4e4e68d972ed118ebab14d01c829dc79cfc18 Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Thu, 12 Nov 2009 20:54:00 -0500
Subject: [PATCH 220/557] EXT-2434 update avatar rendering cost

First crack at updating the rendering cost calculation for avatars to account
for the possibility of invisible avatars. Also generalized rendering cost of
attachments to be more general - added debug code to build floater

will be post-reviewed
---
 indra/newview/llfloatertools.cpp |  27 +++++++
 indra/newview/llfloatertools.h   |   1 +
 indra/newview/llvoavatar.cpp     | 121 +++----------------------------
 indra/newview/llvovolume.cpp     | 101 ++++++++++++++++++++++++++
 indra/newview/llvovolume.h       |   2 +-
 5 files changed, 141 insertions(+), 111 deletions(-)

diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 3c3dfb760ee..672160073ea 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -422,6 +422,12 @@ void LLFloaterTools::refresh()
 	LLResMgr::getInstance()->getIntegerString(prim_count_string, LLSelectMgr::getInstance()->getSelection()->getObjectCount());
 	childSetTextArg("prim_count", "[COUNT]", prim_count_string);
 
+	// calculate selection rendering cost
+	std::string prim_cost_string;
+	LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost());
+	childSetTextArg("render_cost", "[COUNT]", prim_cost_string);
+
+
 	// disable the object and prim counts if nothing selected
 	bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty();
 	childSetEnabled("obj_count", have_selection);
@@ -964,6 +970,27 @@ void LLFloaterTools::onClickGridOptions()
 	//floaterp->addDependentFloater(LLFloaterBuildOptions::getInstance(), FALSE);
 }
 
+S32 LLFloaterTools::calcRenderCost()
+{
+	S32 cost = 0;
+	for (LLObjectSelection::iterator selection_iter = LLSelectMgr::getInstance()->getSelection()->begin();
+		  selection_iter != LLSelectMgr::getInstance()->getSelection()->end();
+		  ++selection_iter)
+	{
+		LLSelectNode *select_node = *selection_iter;
+		if (select_node)
+		{
+			LLVOVolume *viewer_volume = (LLVOVolume*)select_node->getObject();
+			if (viewer_volume)
+			{
+					cost += viewer_volume->getRenderCost();
+			}
+		}
+	}
+
+	return cost;
+}
+
 // static
 void LLFloaterTools::setEditTool(void* tool_pointer)
 {
diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h
index a3e0cac0342..05a88a31d31 100644
--- a/indra/newview/llfloatertools.h
+++ b/indra/newview/llfloatertools.h
@@ -121,6 +121,7 @@ class LLFloaterTools
 	static bool multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response);
 	static void setObjectType( LLPCode pcode );
 	void onClickGridOptions();
+	S32 calcRenderCost();
 
 public:
 	LLButton		*mBtnFocus;
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 62ac8adad0b..d7e31e8436f 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -624,7 +624,6 @@ F32 LLVOAvatar::sGreyUpdateTime = 0.f;
 // Helper functions
 //-----------------------------------------------------------------------------
 static F32 calc_bouncy_animation(F32 x);
-static U32 calc_shame(const LLVOVolume* volume, std::set<LLUUID> &textures);
 
 //-----------------------------------------------------------------------------
 // LLVOAvatar()
@@ -7637,9 +7636,17 @@ void LLVOAvatar::idleUpdateRenderCost()
 		return;
 	}
 
-	U32 shame = 1;
+	U32 shame = 0;
 
-	std::set<LLUUID> textures;
+	for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)
+	{
+		const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index);
+		ETextureIndex tex_index = baked_dict->mTextureIndex;
+		if (isTextureVisible(tex_index))
+		{
+			shame +=25;
+		}
+	}
 
 	for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); 
 		 iter != mAttachmentPoints.end();
@@ -7660,15 +7667,13 @@ void LLVOAvatar::idleUpdateRenderCost()
 					const LLVOVolume* volume = drawable->getVOVolume();
 					if (volume)
 					{
-						shame += calc_shame(volume, textures);
+						shame += volume->getRenderCost();
 					}
 				}
 			}
 		}
 	}
 
-	shame += textures.size() * 5;
-
 	setDebugText(llformat("%d", shame));
 	F32 green = 1.f-llclamp(((F32) shame-1024.f)/1024.f, 0.f, 1.f);
 	F32 red = llmin((F32) shame/1024.f, 1.f);
@@ -7713,110 +7718,6 @@ const std::string LLVOAvatar::getBakedStatusForPrintout() const
 }
 
 
-U32 calc_shame(const LLVOVolume* volume, std::set<LLUUID> &textures)
-{
-	if (!volume)
-	{
-		return 0;
-	}
-
-	U32 shame = 0;
-
-	U32 invisi = 0;
-	U32 shiny = 0;
-	U32 glow = 0;
-	U32 alpha = 0;
-	U32 flexi = 0;
-	U32 animtex = 0;
-	U32 particles = 0;
-	U32 scale = 0;
-	U32 bump = 0;
-	U32 planar = 0;
-	
-	if (volume->isFlexible())
-	{
-		flexi = 1;
-	}
-	if (volume->isParticleSource())
-	{
-		particles = 1;
-	}
-
-	const LLVector3& sc = volume->getScale();
-	scale += (U32) sc.mV[0] + (U32) sc.mV[1] + (U32) sc.mV[2];
-
-	const LLDrawable* drawablep = volume->mDrawable;
-
-	if (volume->isSculpted())
-	{
-		const LLSculptParams *sculpt_params = (LLSculptParams *) volume->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
-		LLUUID sculpt_id = sculpt_params->getSculptTexture();
-		textures.insert(sculpt_id);
-	}
-
-	for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
-	{
-		const LLFace* face = drawablep->getFace(i);
-		const LLTextureEntry* te = face->getTextureEntry();
-		const LLViewerTexture* img = face->getTexture();
-
-		textures.insert(img->getID());
-
-		if (face->getPoolType() == LLDrawPool::POOL_ALPHA)
-		{
-			alpha++;
-		}
-		else if (img->getPrimaryFormat() == GL_ALPHA)
-		{
-			invisi = 1;
-		}
-
-		if (te)
-		{
-			if (te->getBumpmap())
-			{
-				bump = 1;
-			}
-			if (te->getShiny())
-			{
-				shiny = 1;
-			}
-			if (te->getGlow() > 0.f)
-			{
-				glow = 1;
-			}
-			if (face->mTextureMatrix != NULL)
-			{
-				animtex++;
-			}
-			if (te->getTexGen())
-			{
-				planar++;
-			}
-		}
-	}
-
-	shame += invisi + shiny + glow + alpha*4 + flexi*8 + animtex*4 + particles*16+bump*4+scale+planar;
-
-	LLViewerObject::const_child_list_t& child_list = volume->getChildren();
-	for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
-		 iter != child_list.end(); 
-		 ++iter)
-	{
-		const LLViewerObject* child_objectp = *iter;
-		const LLDrawable* child_drawablep = child_objectp->mDrawable;
-		if (child_drawablep)
-		{
-			const LLVOVolume* child_volumep = child_drawablep->getVOVolume();
-			if (child_volumep)
-			{
-				shame += calc_shame(child_volumep, textures);
-			}
-		}
-	}
-
-	return shame;
-}
 
 //virtual
 S32 LLVOAvatar::getTexImageSize() const
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 2def905bbba..e5531a14977 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -2541,6 +2541,107 @@ const LLMatrix4 LLVOVolume::getRenderMatrix() const
 	return mDrawable->getWorldMatrix();
 }
 
+U32 LLVOVolume::getRenderCost() const
+{
+	U32 shame = 0;
+
+	U32 invisi = 0;
+	U32 shiny = 0;
+	U32 glow = 0;
+	U32 alpha = 0;
+	U32 flexi = 0;
+	U32 animtex = 0;
+	U32 particles = 0;
+	U32 scale = 0;
+	U32 bump = 0;
+	U32 planar = 0;
+
+	if (isFlexible())
+	{
+		flexi = 1;
+	}
+	if (isParticleSource())
+	{
+		particles = 1;
+	}
+
+	const LLVector3& sc = getScale();
+	scale += (U32) sc.mV[0] + (U32) sc.mV[1] + (U32) sc.mV[2];
+
+	const LLDrawable* drawablep = mDrawable;
+
+	if (isSculpted())
+	{
+		const LLSculptParams *sculpt_params = (LLSculptParams *) getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+		LLUUID sculpt_id = sculpt_params->getSculptTexture();
+		shame += 5;
+	}
+
+	for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
+	{
+		const LLFace* face = drawablep->getFace(i);
+		const LLTextureEntry* te = face->getTextureEntry();
+		const LLViewerTexture* img = face->getTexture();
+
+		shame += 5;
+
+		if (face->getPoolType() == LLDrawPool::POOL_ALPHA)
+		{
+			alpha++;
+		}
+		else if (img->getPrimaryFormat() == GL_ALPHA)
+		{
+			invisi = 1;
+		}
+
+		if (te)
+		{
+			if (te->getBumpmap())
+			{
+				bump = 1;
+			}
+			if (te->getShiny())
+			{
+				shiny = 1;
+			}
+			if (te->getGlow() > 0.f)
+			{
+				glow = 1;
+			}
+			if (face->mTextureMatrix != NULL)
+			{
+				animtex++;
+			}
+			if (te->getTexGen())
+			{
+				planar++;
+			}
+		}
+	}
+
+	shame += invisi + shiny + glow + alpha*4 + flexi*8 + animtex*4 + particles*16+bump*4+scale+planar;
+
+	LLViewerObject::const_child_list_t& child_list = getChildren();
+	for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+		 iter != child_list.end(); 
+		 ++iter)
+	{
+		const LLViewerObject* child_objectp = *iter;
+		const LLDrawable* child_drawablep = child_objectp->mDrawable;
+		if (child_drawablep)
+		{
+			const LLVOVolume* child_volumep = child_drawablep->getVOVolume();
+			if (child_volumep)
+			{
+				shame += child_volumep->getRenderCost();
+			}
+		}
+	}
+
+	return shame;
+
+}
+
 //static
 void LLVOVolume::preUpdateGeom()
 {
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 10fc8865fc5..fb543efc048 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -120,7 +120,7 @@ class LLVOVolume : public LLViewerObject
 	const LLMatrix4&	getRelativeXform() const				{ return mRelativeXform; }
 	const LLMatrix3&	getRelativeXformInvTrans() const		{ return mRelativeXformInvTrans; }
 	/*virtual*/	const LLMatrix4	getRenderMatrix() const;
-
+				U32 	getRenderCost() const;
 
 	/*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, 
 										  S32 face = -1,                        // which face to check, -1 = ALL_SIDES
-- 
GitLab


From 4a020b2a1ab85ebfa078ab12457402d1f805f811 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Thu, 12 Nov 2009 18:25:42 -0800
Subject: [PATCH 221/557] Couple LLMimeDiscoveryResponder more tightly with
 LLViewerMediaImpl.  This should fix DEV-41596, as well as other potential
 problems.

---
 indra/newview/llviewermedia.cpp | 95 +++++++++++++++++++++++++++++----
 indra/newview/llviewermedia.h   |  5 +-
 2 files changed, 89 insertions(+), 11 deletions(-)

diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 493457704bb..69d4da373e8 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -135,9 +135,19 @@ LOG_CLASS(LLMimeDiscoveryResponder);
 	LLMimeDiscoveryResponder( viewer_media_t media_impl)
 		: mMediaImpl(media_impl),
 		  mInitialized(false)
-	{}
-
+	{
+		if(mMediaImpl->mMimeTypeProbe != NULL)
+		{
+			llerrs << "impl already has an outstanding responder" << llendl;
+		}
+		
+		mMediaImpl->mMimeTypeProbe = this;
+	}
 
+	~LLMimeDiscoveryResponder()
+	{
+		disconnectOwner();
+	}
 
 	virtual void completedHeader(U32 status, const std::string& reason, const LLSD& content)
 	{
@@ -149,23 +159,54 @@ LOG_CLASS(LLMimeDiscoveryResponder);
 
 	virtual void error( U32 status, const std::string& reason )
 	{
+		llwarns << "responder failed with status " << status << ", reason " << reason << llendl;
+		if(mMediaImpl)
+		{
+			mMediaImpl->mMediaSourceFailed = true;
+		}
 		// completeAny(status, "none/none");
 	}
 
 	void completeAny(U32 status, const std::string& mime_type)
 	{
-		if(!mInitialized && ! mime_type.empty())
+		// the call to initializeMedia may disconnect the responder, which will clear mMediaImpl.
+		// Make a local copy so we can call loadURI() afterwards.
+		LLViewerMediaImpl *impl = mMediaImpl;
+		
+		if(impl && !mInitialized && ! mime_type.empty())
 		{
-			if(mMediaImpl->initializeMedia(mime_type))
+			if(impl->initializeMedia(mime_type))
 			{
 				mInitialized = true;
-				mMediaImpl->loadURI();
+				impl->loadURI();
+				disconnectOwner();
 			}
 		}
 	}
+	
+	void cancelRequest()
+	{
+		disconnectOwner();
+	}
+	
+private:
+	void disconnectOwner()
+	{
+		if(mMediaImpl)
+		{
+			if(mMediaImpl->mMimeTypeProbe != this)
+			{
+				llerrs << "internal error: mMediaImpl->mMimeTypeProbe != this" << llendl;
+			}
 
-	public:
-		viewer_media_t mMediaImpl;
+			mMediaImpl->mMimeTypeProbe = NULL;
+		}
+		mMediaImpl = NULL;
+	}
+	
+	
+public:
+		LLViewerMediaImpl *mMediaImpl;
 		bool mInitialized;
 };
 static LLViewerMedia::impl_list sViewerMediaImplList;
@@ -708,6 +749,7 @@ LLViewerMediaImpl::LLViewerMediaImpl(	  const LLUUID& texture_id,
 	mIsDisabled(false),
 	mIsParcelMedia(false),
 	mProximity(-1),
+	mMimeTypeProbe(NULL),
 	mIsUpdated(false)
 { 
 
@@ -811,7 +853,9 @@ void LLViewerMediaImpl::destroyMediaSource()
 	{
 		oldImage->setPlaying(FALSE) ;
 	}
-
+	
+	cancelMimeTypeProbe();
+	
 	if(mMediaSource)
 	{
 		delete mMediaSource;
@@ -1316,6 +1360,8 @@ void LLViewerMediaImpl::unload()
 //////////////////////////////////////////////////////////////////////////////////////////
 void LLViewerMediaImpl::navigateTo(const std::string& url, const std::string& mime_type,  bool rediscover_type, bool server_request)
 {
+	cancelMimeTypeProbe();
+
 	if(mMediaURL != url)
 	{
 		// Don't carry media play state across distinct URLs.
@@ -1358,6 +1404,12 @@ void LLViewerMediaImpl::navigateInternal()
 	// Helpful to have media urls in log file. Shouldn't be spammy.
 	llinfos << "media id= " << mTextureId << " url=" << mMediaURL << " mime_type=" << mMimeType << llendl;
 
+	if(mMimeTypeProbe != NULL)
+	{
+		llwarns << "MIME type probe already in progress -- bailing out." << llendl;
+		return;
+	}
+	
 	if(mNavigateServerRequest)
 	{
 		setNavState(MEDIANAVSTATE_SERVER_SENT);
@@ -1390,7 +1442,7 @@ void LLViewerMediaImpl::navigateInternal()
 
 		if(scheme.empty() || "http" == scheme || "https" == scheme)
 		{
-			LLHTTPClient::getHeaderOnly( mMediaURL, new LLMimeDiscoveryResponder(this));
+			LLHTTPClient::getHeaderOnly( mMediaURL, new LLMimeDiscoveryResponder(this), 10.0f);
 		}
 		else if("data" == scheme || "file" == scheme || "about" == scheme)
 		{
@@ -1521,7 +1573,15 @@ void LLViewerMediaImpl::update()
 {
 	if(mMediaSource == NULL)
 	{
-		if(mPriority != LLPluginClassMedia::PRIORITY_UNLOADED)
+		if(mPriority == LLPluginClassMedia::PRIORITY_UNLOADED)
+		{
+			// This media source should not be loaded.
+		}
+		else if(mMimeTypeProbe != NULL)
+		{
+			// this media source is doing a MIME type probe -- don't try loading it again.
+		}
+		else
 		{
 			// This media may need to be loaded.
 			if(sMediaCreateTimer.hasExpired())
@@ -2120,6 +2180,21 @@ void LLViewerMediaImpl::setNavState(EMediaNavState state)
 	}
 }
 
+void LLViewerMediaImpl::cancelMimeTypeProbe()
+{
+	if(mMimeTypeProbe != NULL)
+	{
+		// There doesn't seem to be a way to actually cancel an outstanding request.
+		// Simulate it by telling the LLMimeDiscoveryResponder not to write back any results.
+		mMimeTypeProbe->cancelRequest();
+		
+		// The above should already have set mMimeTypeProbe to NULL.
+		if(mMimeTypeProbe != NULL)
+		{
+			llerrs << "internal error: mMimeTypeProbe is not NULL after cancelling request." << llendl;
+		}
+	}
+}
 
 void LLViewerMediaImpl::addObject(LLVOVolume* obj) 
 {
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 3f5f3ca746c..719deb28bf6 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -48,6 +48,7 @@ class LLUUID;
 class LLViewerMediaTexture;
 class LLMediaEntry;
 class LLVOVolume ;
+class LLMimeDiscoveryResponder;
 
 typedef LLPointer<LLViewerMediaImpl> viewer_media_t;
 ///////////////////////////////////////////////////////////////////////////////
@@ -294,6 +295,7 @@ class LLViewerMediaImpl
 	EMediaNavState getNavState() { return mMediaNavState; }
 	void setNavState(EMediaNavState state);
 	
+	void cancelMimeTypeProbe();
 public:
 	// a single media url with some data and an impl.
 	LLPluginClassMedia* mMediaSource;
@@ -331,7 +333,8 @@ class LLViewerMediaImpl
 	bool mIsDisabled;
 	bool mIsParcelMedia;
 	S32 mProximity;
-
+	LLMimeDiscoveryResponder *mMimeTypeProbe;
+	
 private:
 	BOOL mIsUpdated ;
 	std::list< LLVOVolume* > mObjectList ;
-- 
GitLab


From 9054f31f89963f2f24a6b872fbc6816ee01f0d70 Mon Sep 17 00:00:00 2001
From: "Mark Palange (Mani)" <palange@lindenlab.com>
Date: Thu, 12 Nov 2009 18:56:55 -0800
Subject: [PATCH 222/557] Temporary build un breakage - removing broken unit
 test from build while fixing.

---
 indra/viewer_components/login/tests/lllogin_test.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/indra/viewer_components/login/tests/lllogin_test.cpp b/indra/viewer_components/login/tests/lllogin_test.cpp
index 56c21016bd5..99ea796ad01 100644
--- a/indra/viewer_components/login/tests/lllogin_test.cpp
+++ b/indra/viewer_components/login/tests/lllogin_test.cpp
@@ -416,6 +416,7 @@ namespace tut
 		ensure_equals("Failed to offline", listener.lastEvent()["state"].asString(), "offline");
 	}
 
+/*
     template<> template<>
     void llviewerlogin_object::test<5>()
     {
@@ -451,4 +452,5 @@ namespace tut
 
 		ensure_equals("SRV Failure", listener.lastEvent()["change"].asString(), "fail.login"); 
 	}
+*/
 }
-- 
GitLab


From 20c0a0b68f82908bc73872ec132775e8c69cca4d Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Thu, 12 Nov 2009 19:24:31 -0800
Subject: [PATCH 223/557] Test intentionally not-found LLUICtrl.

---
 indra/newview/llfloatertestinspectors.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/indra/newview/llfloatertestinspectors.cpp b/indra/newview/llfloatertestinspectors.cpp
index 8af011c17a9..e68faba712b 100644
--- a/indra/newview/llfloatertestinspectors.cpp
+++ b/indra/newview/llfloatertestinspectors.cpp
@@ -53,6 +53,8 @@ LLFloaterTestInspectors::~LLFloaterTestInspectors()
 
 BOOL LLFloaterTestInspectors::postBuild()
 {
+	getChild<LLUICtrl>("intentionally-not-found");
+
 //	getChild<LLUICtrl>("avatar_2d_btn")->setCommitCallback(
 //		boost::bind(&LLFloaterTestInspectors::onClickAvatar2D, this));
 	getChild<LLUICtrl>("avatar_3d_btn")->setCommitCallback(
-- 
GitLab


From 01f1eaf7e0faaa3ecde36ac28a346fed53a571fd Mon Sep 17 00:00:00 2001
From: angela <angela@lindenlab.com>
Date: Fri, 13 Nov 2009 15:19:37 +0800
Subject: [PATCH 224/557] fix style readonlycolor overwriting color

---
 indra/newview/llchathistory.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 2b050f3eb5c..69e1f8d4289 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -351,6 +351,7 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat)
 	
 	LLStyle::Params style_params;
 	style_params.color(txt_color);
+	style_params.readonly_color(txt_color);
 	style_params.font(fontp);
 
 	
@@ -383,7 +384,6 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat)
 	appendWidget(p, view_text, false);
 
 	//Append the text message
-	
 	appendText(chat.mText, FALSE, style_params);
 
 	mLastFromName = chat.mFromName;
-- 
GitLab


From d116185bfd1d64c7108e75ea1a7745f08cb2a3d0 Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Fri, 13 Nov 2009 12:26:57 +0200
Subject: [PATCH 225/557] Fixed Low bug EXT-2404-Nearby Chat: There is
 redundant semicolon in the log for system messages

--HG--
branch : product-engine
---
 indra/newview/llchathistory.cpp | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 046e1d92dcb..5efecfa78f9 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -53,7 +53,7 @@ std::string formatCurrentTime()
 	time_t utc_time;
 	utc_time = time_corrected();
 	std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
-		+LLTrans::getString("TimeMin")+"] ";
+		+LLTrans::getString("TimeMin")+"]";
 
 	LLSD substitution;
 
@@ -344,7 +344,9 @@ LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style
 void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& style_params)
 {
 	LLView* view = NULL;
-	std::string view_text = "\n[" + formatCurrentTime() + "] " + chat.mFromName + ": ";
+	std::string view_text = "\n[" + formatCurrentTime() + "] ";
+	if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM)
+		view_text += chat.mFromName + ": ";
 
 	LLInlineViewSegment::Params p;
 	p.force_newline = true;
-- 
GitLab


From 05d2f3f7647269ffca2da8cba9bd6b91b56a1905 Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Fri, 13 Nov 2009 12:32:06 +0200
Subject: [PATCH 226/557] No ticket. A little refactoring.

--HG--
branch : product-engine
---
 indra/newview/lltoastimpanel.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp
index 9370e318cfb..1ea5f515b76 100644
--- a/indra/newview/lltoastimpanel.cpp
+++ b/indra/newview/lltoastimpanel.cpp
@@ -69,7 +69,7 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) :	LLToastPanel(p.notif
 	mNotification = p.notification;
 
 	// if message comes from the system - there shouldn't be a reply btn
-	if(p.from == "Second Life")
+	if(p.from == SYSTEM_FROM)
 	{
 		mAvatar->setVisible(FALSE);
 		sys_msg_icon->setVisible(TRUE);
-- 
GitLab


From eb1484a0c9b6a075c900371cc5d7e8c4c0a4f93f Mon Sep 17 00:00:00 2001
From: Andrew Polunin <apolunin@productengine.com>
Date: Fri, 13 Nov 2009 12:37:52 +0200
Subject: [PATCH 227/557] implemented normal task EXT-2175 Set up functionality
 for \"Leave Selected Group\" option

--HG--
branch : product-engine
---
 indra/newview/llpanelpeople.cpp                      |  2 +-
 .../default/xui/en/menu_people_groups_view_sort.xml  | 12 ++++--------
 2 files changed, 5 insertions(+), 9 deletions(-)

diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 9ba94c8ca98..ba30a4710a1 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -519,7 +519,6 @@ BOOL LLPanelPeople::postBuild()
 	LLPanel* groups_panel = getChild<LLPanel>(GROUP_TAB_NAME);
 	groups_panel->childSetAction("activate_btn", boost::bind(&LLPanelPeople::onActivateButtonClicked,	this));
 	groups_panel->childSetAction("plus_btn",	boost::bind(&LLPanelPeople::onGroupPlusButtonClicked,	this));
-	groups_panel->childSetAction("minus_btn",	boost::bind(&LLPanelPeople::onGroupMinusButtonClicked,	this));
 
 	LLPanel* friends_panel = getChild<LLPanel>(FRIENDS_TAB_NAME);
 	friends_panel->childSetAction("add_btn",	boost::bind(&LLPanelPeople::onAddFriendWizButtonClicked,	this));
@@ -568,6 +567,7 @@ BOOL LLPanelPeople::postBuild()
 	LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
 	
 	registrar.add("People.Group.Plus.Action",  boost::bind(&LLPanelPeople::onGroupPlusMenuItemClicked,  this, _2));
+	registrar.add("People.Group.Minus.Action", boost::bind(&LLPanelPeople::onGroupMinusButtonClicked,  this));
 	registrar.add("People.Friends.ViewSort.Action",  boost::bind(&LLPanelPeople::onFriendsViewSortMenuItemClicked,  this, _2));
 	registrar.add("People.Nearby.ViewSort.Action",  boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemClicked,  this, _2));
 	registrar.add("People.Groups.ViewSort.Action",  boost::bind(&LLPanelPeople::onGroupsViewSortMenuItemClicked,  this, _2));
diff --git a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
index 6dd44255bf3..304492bedb2 100644
--- a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
@@ -13,15 +13,11 @@
        function="CheckControl"
        parameter="GroupListShowIcons" />
   </menu_item_check>
-  <menu_item_check
+  <menu_item_call
    label="Leave Selected Group"
    layout="topleft"
    name="Leave Selected Group">
-      <menu_item_check.on_click
-       function="People.Groups.ViewSort.Action"
-       parameter="show_icons" />
-      <menu_item_check.on_check
-       function="CheckControl"
-       parameter="GroupListShowIcons" />
-  </menu_item_check>
+      <menu_item_call.on_click
+       function="People.Group.Minus.Action"/>
+  </menu_item_call>
 </menu>
-- 
GitLab


From bed508f9ef3bce8fb67669ab60b01cd4119a7f76 Mon Sep 17 00:00:00 2001
From: Yuri Chebotarev <ychebotarev@productengine.com>
Date: Fri, 13 Nov 2009 12:58:05 +0200
Subject: [PATCH 228/557] EXT-2339 Chat : Nearby chat does not show full text -
 increase max_length to 512

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
index a77094e9420..ecf35523cd8 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
@@ -23,7 +23,7 @@
      layout="topleft"
      left_delta="7"
      left="0"
-     max_length="254"
+     max_length="512"
      name="chat_box"
      tool_tip="Press Enter to say, Ctrl+Enter to shout"
      top="0"
-- 
GitLab


From b256d57b0dbdd39dd36abcdb51a6b70698c60bba Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Fri, 13 Nov 2009 12:59:19 +0200
Subject: [PATCH 229/557] No ticket. Fix to prevent crash.

--HG--
branch : product-engine
---
 indra/newview/llimpanel.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index 0b8b5935f87..3178658faa0 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -849,7 +849,8 @@ void LLFloaterIMPanel::processSessionUpdate(const LLSD& session_update)
 
 
 		//update the speakers dropdown too
-		mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated);
+		if (mSpeakerPanel)
+			mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated);
 	}
 }
 
-- 
GitLab


From 9e11895c258d4dc7bc141804d8b7aa2762de4013 Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Fri, 13 Nov 2009 13:10:30 +0200
Subject: [PATCH 230/557] No ticket. Fixed crash caused by wierdly coded
 std::map by MS

--HG--
branch : product-engine
---
 indra/newview/llspeakers.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 2ed82b7d621..261bdbcfc05 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -359,6 +359,9 @@ void LLSpeakerMgr::updateSpeakerList()
 
 LLPointer<LLSpeaker> LLSpeakerMgr::findSpeaker(const LLUUID& speaker_id)
 {
+	//In some conditions map causes crash if it is empty(Windows only), adding check (EK)
+	if (mSpeakers.size() == 0)
+		return NULL;
 	speaker_map_t::iterator found_it = mSpeakers.find(speaker_id);
 	if (found_it == mSpeakers.end())
 	{
-- 
GitLab


From 0c7a4b6a7d2675a916efacfb9f2f1a6098c027dd Mon Sep 17 00:00:00 2001
From: Yuri Chebotarev <ychebotarev@productengine.com>
Date: Fri, 13 Nov 2009 13:49:14 +0200
Subject: [PATCH 231/557] EXT-2342 Script : Fails to work in Alpha 6 ok toast
 for objects are back... also add object inspector to nearby chat object
 context menu

--HG--
branch : product-engine
---
 indra/newview/llchathistory.cpp       | 4 ++++
 indra/newview/llnearbychathandler.cpp | 3 ++-
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 5efecfa78f9..f2283730636 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -84,6 +84,10 @@ class LLChatHistoryHeader: public LLPanel
 
 		if (level == "profile")
 		{
+			LLSD params;
+			params["object_id"] = getAvatarId();
+
+			LLFloaterReg::showInstance("inspect_object", params);
 		}
 		else if (level == "block")
 		{
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index b4e0ab198af..f3b63c8616c 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -332,7 +332,8 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg)
 	//only messages from AGENTS
 	if(CHAT_SOURCE_OBJECT == chat_msg.mSourceType)
 	{
-		return;//dn't show toast for messages from objects
+		if(chat_msg.mChatType == CHAT_TYPE_DEBUG_MSG)
+			return;//ok for now we don't skip messeges from object, so skip only debug messages
 	}
 
 	LLUUID id;
-- 
GitLab


From a3dbbeef702317b86de09592412a9d55d3de5991 Mon Sep 17 00:00:00 2001
From: Dmitry Oleshko <doleshko@productengine.com>
Date: Fri, 13 Nov 2009 13:55:09 +0200
Subject: [PATCH 232/557] fix of normal bug (EXT-2411) Toast for a group
 notification has bigger width, than other toasts

fixed panel's size in XML. Also formatted XML according to standards using viewer's XML util.

--HG--
branch : product-engine
---
 .../default/xui/en/panel_group_notify.xml     | 194 +++++++++++-------
 1 file changed, 117 insertions(+), 77 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_group_notify.xml b/indra/newview/skins/default/xui/en/panel_group_notify.xml
index ef3120174e8..984a799b41a 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notify.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notify.xml
@@ -1,77 +1,117 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel background_visible="true" bevel_style="in" bg_alpha_color="0 0 0 0"
-	height="155" label="instant_message" layout="topleft" left="0"
-	name="panel_group_notify" top="0" width="350">
-    <string
-     name="message_max_lines_count">
-        4
-    </string>
-	<panel follows="top" background_visible="true" bevel_style="in" bg_alpha_color="black"
-		height="30" label="header" layout="topleft" left="0" name="header"
-		top="0" width="350">
-		<icon follows="left|top|right|bottom" height="20"  width="20" layout="topleft"
-			top="5"  left="5" mouse_opaque="true" name="group_icon"/>
-		<text type="string" length="1" follows="left|top|right|bottom"
-			font="SansSerifBigBold" height="20" layout="topleft" left_pad="10" name="title"
-			text_color="GroupNotifyTextColor" top="5" width="275" use_ellipses="true">
-			Sender Name / Group Name
-        </text>
-	</panel>
-	<text
-     follows="top"
-     height="20"
-     layout="topleft"
-     left="25"
-     name="subject"
-     text_color="GroupNotifyTextColor"
-     font="SansSerifBig"
-     top="40"
-     use_ellipses="true"
-     value="subject"
-     width="300"
-     word_wrap="true">
-     subject 
-    </text>
-    <text
-     follows="top"
-     height="20"
-     layout="topleft"
-     left="25"
-     name="datetime"
-     text_color="GroupNotifyTextColor"
-     font="SansSerif"
-     top="80"
-     use_ellipses="true"
-     value="datetime"
-     width="300"
-     word_wrap="true">
-     datetime
-    </text>
-    <text
-     follows="left|top|bottom|right"
-     height="0"
-     layout="topleft"
-     left="25"
-     name="message"
-     text_color="GroupNotifyTextColor"
-     top="100"
-     use_ellipses="true"
-     value="message"
-     width="300"
-     word_wrap="true"
-     visible="true" >
-    </text>
-    <icon
-	  follows="left|bottom|right" height="15" width="15"
-		layout="topleft" bottom="122" left="25" mouse_opaque="true" name="attachment_icon" visible="true"
-	/>
-	<text font="SansSerif" font.style="UNDERLINE" font_shadow="none"
-		type="string" length="1" follows="left|bottom|right" layout="topleft"
-		left="45" bottom="122" height="15" width="280" name="attachment"
-		text_color="GroupNotifyTextColor" visible="true">
-		Attachment
-     </text>
-
-	<button label="OK" layout="topleft" bottom="145" left="140" height="20"
-		width="70" name="btn_ok" follows="bottom" />
-</panel>
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ bevel_style="in"
+ bg_alpha_color="0 0 0 0"
+ height="135"
+ label="instant_message"
+ layout="topleft"
+ left="0"
+ name="panel_group_notify"
+ top="0"
+ width="305">
+    <string
+     name="message_max_lines_count"
+     value="4" />
+    <panel
+     background_visible="true"
+     bevel_style="in"
+     bg_alpha_color="black"
+     follows="top"
+     height="30"
+     label="header"
+     layout="topleft"
+     left="0"
+     name="header"
+     top="0"
+     width="305">
+        <icon
+         follows="left|top|right|bottom"
+         height="20"
+         layout="topleft"
+         left="5"
+         mouse_opaque="true"
+         name="group_icon"
+         top="5"
+         width="20" />
+        <text
+         follows="left|top|right|bottom"
+         font="SansSerifBigBold"
+         height="20"
+         layout="topleft"
+         left_pad="10"
+         name="title"
+         text_color="GroupNotifyTextColor"
+         top="5"
+         use_ellipses="true"
+         value="Sender Name / Group Name"
+         width="230" />
+    </panel>
+    <text
+     follows="top"
+     font="SansSerifBig"
+     height="20"
+     layout="topleft"
+     left="25"
+     name="subject"
+     text_color="GroupNotifyTextColor"
+     top="40"
+     use_ellipses="true"
+     value="subject"
+     width="270"
+     wrap="true" />
+    <text
+     follows="top"
+     font="SansSerif"
+     height="20"
+     layout="topleft"
+     left="25"
+     name="datetime"
+     text_color="GroupNotifyTextColor"
+     top="80"
+     use_ellipses="true"
+     value="datetime"
+     width="270"
+     wrap="true" />
+    <text
+     follows="left|top|bottom|right"
+     height="0"
+     layout="topleft"
+     left="25"
+     name="message"
+     text_color="GroupNotifyTextColor"
+     top="100"
+     use_ellipses="true"
+     value="message"
+     width="270"
+     wrap="true" />
+    <icon
+     bottom="122"
+     follows="left|bottom|right"
+     height="15"
+     layout="topleft"
+     left="25"
+     mouse_opaque="true"
+     name="attachment_icon"
+     width="15" />
+    <text
+     bottom="122"
+     follows="left|bottom|right"
+     font="SansSerif"
+     height="15"
+     layout="topleft"
+     left="45"
+     name="attachment"
+     text_color="GroupNotifyTextColor"
+     value="Attachment"
+     width="280" />
+    <button
+     bottom="130"
+     follows="bottom"
+     height="20"
+     label="OK"
+     layout="topleft"
+     left="25"
+     name="btn_ok"
+     width="70" />
+</panel>
-- 
GitLab


From fc9741f9ae1b0090db24847b134c193686f6ae59 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Fri, 13 Nov 2009 14:32:23 +0200
Subject: [PATCH 233/557] Work on major sub-task EXT-991 (Update bottom bar
 behavior on resize) Implemented functionality to process shrink after bottom
 tray min width is reached

--HG--
branch : product-engine
---
 indra/newview/llbottomtray.cpp                | 121 ++++++++++--------
 indra/newview/llbottomtray.h                  |   2 +-
 .../skins/default/xui/en/panel_bottomtray.xml |   2 +-
 3 files changed, 70 insertions(+), 55 deletions(-)

diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 291f645ea23..2b7a5bc8a99 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -331,74 +331,87 @@ void LLBottomTray::verifyChildControlsSizes()
 		mNearbyChatBar->setRect(rect);
 	}
 }
-#define __FEATURE_EXT_991
+
 void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
 {
-	lldebugs << "****************************************" << llendl;
+	static S32 debug_calling_number = 0;
+	lldebugs << "**************************************** " << ++debug_calling_number << llendl;
 
 	S32 current_width = getRect().getWidth();
+	S32 delta_width = width - current_width;
 	lldebugs << "Reshaping: " 
 		<< ", width: " << width
-		<< ", height: " << height
-		<< ", called_from_parent: " << called_from_parent
 		<< ", cur width: " << current_width
-		<< ", cur height: " << getRect().getHeight()
+		<< ", delta_width: " << delta_width
+		<< ", called_from_parent: " << called_from_parent
 		<< llendl;
 
 	if (mNearbyChatBar)			log(mNearbyChatBar, "before");
 	if (mChicletPanel)			log(mChicletPanel, "before");
 
+	// stores width size on which bottom tray is less than width required by its children. EXT-991
+	static S32 extra_shrink_width = 0;
+	bool should_be_reshaped = true;
+
 	if (mChicletPanel && mToolbarStack && mNearbyChatBar)
 	{
 		mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE);
  		verifyChildControlsSizes();
- 		updateResizeState(width, current_width);
-	}
-
-	LLPanel::reshape(width, height, called_from_parent);
-
-
-	if (mNearbyChatBar)			log(mNearbyChatBar, "after");
-	if (mChicletPanel)			log(mChicletPanel, "after");
-}
-
-void LLBottomTray::updateResizeState(S32 new_width, S32 cur_width)
-{
-	mResizeState = RS_NORESIZE;
-
-	S32 delta_width = new_width - cur_width;
-//	if (delta_width == 0) return;
-	bool shrink = new_width < cur_width;
-
-	const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
-	const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
-
-	const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
-	const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
-	const S32 chatbar_panel_max_width = mNearbyChatBar->getMaxWidth();
 
-	lldebugs << "chatbar_panel_width: " << chatbar_panel_width
-		<< ", chatbar_panel_min_width: " << chatbar_panel_min_width
-		<< ", chatbar_panel_max_width: " << chatbar_panel_max_width
-		<< ", chiclet_panel_width: " << chiclet_panel_width
-		<< ", chiclet_panel_min_width: " << chiclet_panel_min_width
-		<< llendl;
+		// bottom tray is narrowed
+		if (delta_width < 0)
+		{
+			if (extra_shrink_width > 0)
+			{
+				// is world rect was extra shrunk and decreasing again only update this value
+				// to delta_width negative
+				extra_shrink_width -= delta_width; // use "-=" because delta_width is negative
+				should_be_reshaped = false;
+			}
+			else
+			{
+				extra_shrink_width = processWidthDecreased(delta_width);
 
-	// bottom tray is narrowed
-	if (shrink)
-	{
-		processWidthDecreased(delta_width);
+				// increase new width to extra_shrink_width value to not reshape less than bottom tray minimum
+				width += extra_shrink_width;
+			}
+		}
+		// bottom tray is widen
+		else
+		{
+			if (extra_shrink_width > delta_width)
+			{
+				// Less than minimum width is more than increasing (delta_width) 
+				// only reduce it value and make no reshape
+				extra_shrink_width -= delta_width;
+				should_be_reshaped = false;
+			}
+			else 
+			{
+				if (extra_shrink_width > 0)
+				{
+					// If we have some extra shrink width let's reduce delta_width & width
+					delta_width -= extra_shrink_width;
+					width -= extra_shrink_width;
+					extra_shrink_width = 0;
+				}
+				processWidthIncreased(delta_width);
+			}
+		}
 	}
-	// bottom tray is widen
-	else
+
+	lldebugs << "There is no enough width to reshape all children: " << extra_shrink_width << llendl;
+	if (should_be_reshaped)
 	{
-		processWidthIncreased(delta_width);
+		lldebugs << "Reshape all children with width: " << width << llendl;
+		LLPanel::reshape(width, height, called_from_parent);
 	}
 
-	lldebugs << "New resize state: " << mResizeState << llendl;
+	if (mNearbyChatBar)			log(mNearbyChatBar, "after");
+	if (mChicletPanel)			log(mChicletPanel, "after");
 }
 
-void LLBottomTray::processWidthDecreased(S32 delta_width)
+S32 LLBottomTray::processWidthDecreased(S32 delta_width)
 {
 	bool still_should_be_processed = true;
 
@@ -409,7 +422,6 @@ void LLBottomTray::processWidthDecreased(S32 delta_width)
 	{
 		// we have some space to decrease chiclet panel
 		S32 panel_delta_min = chiclet_panel_width - chiclet_panel_min_width;
-		mResizeState |= RS_CHICLET_PANEL;
 
 		S32 delta_panel = llmin(-delta_width, panel_delta_min);
 
@@ -437,27 +449,25 @@ void LLBottomTray::processWidthDecreased(S32 delta_width)
 	{
 		// we have some space to decrease chatbar panel
 		S32 panel_delta_min = chatbar_panel_width - chatbar_panel_min_width;
-		mResizeState |= RS_CHATBAR_INPUT;
 
 		S32 delta_panel = llmin(-delta_width, panel_delta_min);
 
-		// is chatbar panel width enough to process resizing?
+		// whether chatbar panel width is enough to process resizing?
 		delta_width += panel_delta_min;
 
-
 		still_should_be_processed = delta_width < 0;
 
 		mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mNearbyChatBar->getRect().getHeight());
 
+		log(mChicletPanel, "after processing panel decreasing via nearby chatbar panel");
+
 		lldebugs << "RS_CHATBAR_INPUT"
 			<< ", delta_panel: " << delta_panel
 			<< ", delta_width: " << delta_width
 			<< llendl;
-
-		log(mChicletPanel, "after nearby was processed");
-
 	}
 
+	S32 extra_shrink_width = 0;
 	S32 buttons_freed_width = 0;
 	if (still_should_be_processed)
 	{
@@ -480,7 +490,9 @@ void LLBottomTray::processWidthDecreased(S32 delta_width)
 
 		if (delta_width < 0)
 		{
-			llwarns << "WARNING: there is no enough room for bottom tray, resizing still should be processed" << llendl;
+			extra_shrink_width = -delta_width;
+			lldebugs << "There is no enough room for bottom tray, resizing still should be processed: " 
+				<< extra_shrink_width << llendl;
 		}
 
 		if (buttons_freed_width > 0)
@@ -491,10 +503,14 @@ void LLBottomTray::processWidthDecreased(S32 delta_width)
 			lldebugs << buttons_freed_width << llendl;
 		}
 	}
+
+	return extra_shrink_width;
 }
 
 void LLBottomTray::processWidthIncreased(S32 delta_width)
 {
+	if (delta_width <= 0) return;
+
 	const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
 	const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
 
@@ -573,7 +589,6 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
 	S32 chatbar_panel_width_ = mNearbyChatBar->getRect().getWidth();
 	if (delta_width > 0 && chatbar_panel_width_ < chatbar_panel_max_width)
 	{
-		mResizeState |= RS_CHATBAR_INPUT;
 		S32 delta_panel_max = chatbar_panel_max_width - chatbar_panel_width_;
 		S32 delta_panel = llmin(delta_width, delta_panel_max);
 		delta_width -= delta_panel_max;
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 2972a2b1ac7..090537042b6 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -98,7 +98,7 @@ class LLBottomTray
 
 	void updateResizeState(S32 new_width, S32 cur_width);
 	void verifyChildControlsSizes();
-	void processWidthDecreased(S32 delta_width);
+	S32 processWidthDecreased(S32 delta_width);
 	void processWidthIncreased(S32 delta_width);
 	void log(LLView* panel, const std::string& descr);
 	bool processShowButton(EResizeState shown_object_type, S32* available_width, S32* buttons_required_width);
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 81880164552..3c2971797e8 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -333,6 +333,6 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
          min_width="4" 
          right="-1"
          top="0"
-         width="26"/>
+         width="4"/>
     </layout_stack>
 </panel>
-- 
GitLab


From 03a0b86335216ec22192c353b7bd4d9ee58dc732 Mon Sep 17 00:00:00 2001
From: Dmitry Oleshko <doleshko@productengine.com>
Date: Fri, 13 Nov 2009 14:50:52 +0200
Subject: [PATCH 234/557] fixed normal bug (EXT-2454) "Unread message"
 indicator isn't reset for chiclet in the Message Well after opening IM window

added a check, whether a new message came, in order to prevent unwanted return from function, that makes impossible updating chiclets' states

--HG--
branch : product-engine
---
 indra/newview/llchiclet.cpp | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index fd861926509..9e290c8c046 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -838,11 +838,15 @@ void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){
 	LLUUID session_id = data["session_id"].asUUID();
 	LLUUID from_id = data["from_id"].asUUID();
 	const std::string from = data["from"].asString();
+	S32 unread = data["num_unread"].asInteger();
 
-	//we do not show balloon (indicator of new messages) for system messages and our own messages
-	if (from_id.isNull() || from_id == gAgentID || SYSTEM_FROM == from) return;
+	// if new message came
+	if(unread != 0)
+	{
+		//we do not show balloon (indicator of new messages) for system messages and our own messages
+		if (from_id.isNull() || from_id == gAgentID || SYSTEM_FROM == from) return;
+	}
 
-	S32 unread = data["num_unread"].asInteger();
 	LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
 	if (im_floater && im_floater->getVisible())
 	{
@@ -862,7 +866,6 @@ void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){
 	    	llwarns << "Unable to set counter for chiclet " << session_id << llendl;
 	    }
 	}
-
 }
 
 
-- 
GitLab


From a69bce6928f84d53edc776b19018c7726002be74 Mon Sep 17 00:00:00 2001
From: Lynx Linden <lynx@lindenlab.com>
Date: Fri, 13 Nov 2009 12:55:34 +0000
Subject: [PATCH 235/557] EXT-2458: Added global mute/unmute button to the
 status bar.

---
 indra/newview/llstatusbar.cpp                 | 27 +++++++++++++++++++
 indra/newview/llstatusbar.h                   |  6 +++--
 .../skins/default/xui/en/panel_status_bar.xml | 18 ++++++++++---
 3 files changed, 45 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index 4dccdfd7e6c..b649a0c38eb 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -109,6 +109,7 @@ const S32 TEXT_HEIGHT = 18;
 static void onClickBuyCurrency(void*);
 static void onClickHealth(void*);
 static void onClickScriptDebug(void*);
+static void onClickVolume(void*);
 
 std::vector<std::string> LLStatusBar::sDays;
 std::vector<std::string> LLStatusBar::sMonths;
@@ -116,6 +117,12 @@ const U32 LLStatusBar::MAX_DATE_STRING_LENGTH = 2000;
 
 LLStatusBar::LLStatusBar(const LLRect& rect)
 :	LLPanel(),
+	mTextHealth(NULL),
+	mTextTime(NULL),
+	mSGBandwidth(NULL),
+	mSGPacketLoss(NULL),
+	mBtnBuyCurrency(NULL),
+	mBtnVolume(NULL),
 	mBalance(0),
 	mHealth(100),
 	mSquareMetersCredit(0),
@@ -148,6 +155,11 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
 	mBtnBuyCurrency = getChild<LLButton>( "buycurrency" );
 	mBtnBuyCurrency->setClickedCallback( onClickBuyCurrency, this );
 
+	mBtnVolume = getChild<LLButton>( "volume_btn" );
+	mBtnVolume->setClickedCallback( onClickVolume, this );
+
+	gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&LLStatusBar::onVolumeChanged, this, _2));
+
 	childSetAction("scriptout", onClickScriptDebug, this);
 	childSetAction("health", onClickHealth, this);
 
@@ -333,6 +345,10 @@ void LLStatusBar::refresh()
 	mSGBandwidth->setVisible(net_stats_visible);
 	mSGPacketLoss->setVisible(net_stats_visible);
 	childSetEnabled("stat_btn", net_stats_visible);
+
+	// update the master volume button state
+	BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio");
+	mBtnVolume->setToggleState(mute_audio);
 }
 
 void LLStatusBar::setVisibleForMouselook(bool visible)
@@ -488,6 +504,13 @@ static void onClickScriptDebug(void*)
 	LLFloaterScriptDebug::show(LLUUID::null);
 }
 
+static void onClickVolume(void* data)
+{
+	// toggle the master mute setting
+	BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio");
+	gSavedSettings.setBOOL("MuteAudio", !mute_audio);
+}
+
 // sets the static variables necessary for the date
 void LLStatusBar::setupDate()
 {
@@ -562,6 +585,10 @@ BOOL can_afford_transaction(S32 cost)
 	return((cost <= 0)||((gStatusBar) && (gStatusBar->getBalance() >=cost)));
 }
 
+void LLStatusBar::onVolumeChanged(const LLSD& newvalue)
+{
+	refresh();
+}
 
 // Implements secondlife:///app/balance/request to request a L$ balance
 // update via UDP message system. JC
diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h
index d5629e6f1eb..3ce35499615 100644
--- a/indra/newview/llstatusbar.h
+++ b/indra/newview/llstatusbar.h
@@ -91,9 +91,10 @@ class LLStatusBar
 	// simple method to setup the part that holds the date
 	void setupDate();
 
-	static void onCommitSearch(LLUICtrl*, void* data);
-	static void onClickSearch(void* data);
+	void onVolumeChanged(const LLSD& newvalue);
+
 	static void onClickStatGraph(void* data);
+	
 
 private:
 	LLTextBox	*mTextHealth;
@@ -103,6 +104,7 @@ class LLStatusBar
 	LLStatGraph *mSGPacketLoss;
 
 	LLButton	*mBtnBuyCurrency;
+	LLButton	*mBtnVolume;
 
 	S32				mBalance;
 	S32				mHealth;
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 1171a8f0b5d..8fc78c67019 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -46,14 +46,24 @@
      font="SansSerifSmall"
      image_selected="BuyArrow_Over"
      image_unselected="BuyArrow_Off"
-	image_pressed="BuyArrow_Press"
+     image_pressed="BuyArrow_Press"
      height="16"
-     left="-220"
+     left="-245"
      name="buycurrency"
      pad_right="22px"
      tool_tip="My Balance: Click to buy more L$"
      top="1"
      width="117" />
+    <button
+     follows="right|bottom"
+     height="16"
+     image_selected="parcel_drk_VoiceNo"
+     image_unselected="parcel_drk_Voice"
+     is_toggle="true"
+     left_pad="15"
+     top="1"
+     name="volume_btn"
+     width="16" />
     <text
      type="string"
      length="1"
@@ -61,9 +71,9 @@
      follows="right|bottom"
      halign="right"
      height="16"
-     top="3"
+     top="5"
      layout="topleft"
-     left_pad="15"
+     left_pad="7"
      name="TimeText"
      text_color="TimeTextColor"
      tool_tip="Current time (Pacific)"
-- 
GitLab


From 61556f1acf36a1a8fc459fd17a8c0a4a74cc6eeb Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Fri, 13 Nov 2009 15:08:41 +0200
Subject: [PATCH 236/557] Fixed EXT-2320 "Viewer creates empty Friends folders
 every startup". - Added check for "Friends" folder and all its contents to be
 fetched from server. Only after fetch is complete friends cards are
 synchronized with agent's buddies list.

--HG--
branch : product-engine
---
 indra/newview/llfriendcard.cpp | 265 ++++++++++++++++++---------------
 indra/newview/llfriendcard.h   |  47 +++---
 indra/newview/llstartup.cpp    |   7 +-
 3 files changed, 172 insertions(+), 147 deletions(-)

diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp
index 1ff2566dca2..481b75cf739 100644
--- a/indra/newview/llfriendcard.cpp
+++ b/indra/newview/llfriendcard.cpp
@@ -91,44 +91,39 @@ const LLUUID& get_folder_uuid(const LLUUID& parentFolderUUID, LLInventoryCollect
 	return LLUUID::null;
 }
 
-
-// LLViewerInventoryCategory::fetchDescendents has it own period of fetching.
-// for now it is FETCH_TIMER_EXPIRY = 10.0f; So made our period a bit more.
-const F32 FETCH_FRIENDS_DESCENDENTS_PERIOD = 11.0f;
-
-
 /**
- * Intended to call passed callback after the specified period of time.
+ * Class for fetching initial friend cards data
  *
- * Implemented to fix an issue when Inventory folders are in incomplete state. See EXT-2061, EXT-1935, EXT-813.
- * For now it uses to periodically sync Inventory Friends/All folder with a Agent's Friends List
- * until it is complete.
- */ 
-class FriendListUpdater : public LLEventTimer
+ * Implemented to fix an issue when Inventory folders are in incomplete state.
+ * See EXT-2320, EXT-2061, EXT-1935, EXT-813.
+ * Uses a callback to sync Inventory Friends/All folder with agent's Friends List.
+ */
+class LLInitialFriendCardsFetch : public LLInventoryFetchDescendentsObserver
 {
 public:
-	typedef boost::function<bool()> callback_t;
+	typedef boost::function<void()> callback_t;
 
-	FriendListUpdater(callback_t cb, F32 period)
-		:	LLEventTimer(period)
-		,	mCallback(cb)
-	{
-		mEventTimer.start();
-	}
+	LLInitialFriendCardsFetch(callback_t cb)
+		:	mCheckFolderCallback(cb)	{}
 
-	virtual BOOL tick() // from LLEventTimer
-	{
-		return mCallback();
-	}
+	/* virtual */ void done();
 
 private:
-	callback_t		mCallback;
+	callback_t		mCheckFolderCallback;
 };
 
+void LLInitialFriendCardsFetch::done()
+{
+	// This observer is no longer needed.
+	gInventory.removeObserver(this);
+
+	mCheckFolderCallback();
+
+	delete this;
+}
 
 // LLFriendCardsManager Constructor / Destructor
 LLFriendCardsManager::LLFriendCardsManager()
-: mFriendsAllFolderCompleted(true)
 {
 	LLAvatarTracker::instance().addObserver(this);
 }
@@ -167,30 +162,6 @@ const LLUUID LLFriendCardsManager::extractAvatarID(const LLUUID& avatarID)
 	return rv;
 }
 
-// be sure LLInventoryModel::buildParentChildMap() has been called before it.
-// and this method must be called before any actions with friend list
-void LLFriendCardsManager::ensureFriendFoldersExist()
-{
-	const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
-
-	LLUUID friendFolderUUID = findFriendFolderUUIDImpl();
-
-	if (friendFolderUUID.isNull())
-	{
-		friendFolderUUID = gInventory.createNewCategory(callingCardsFolderID,
-			LLFolderType::FT_CALLINGCARD, get_friend_folder_name());
-	}
-
-	LLUUID friendAllSubfolderUUID = findFriendAllSubfolderUUIDImpl();
-
-	if (friendAllSubfolderUUID.isNull())
-	{
-		friendAllSubfolderUUID = gInventory.createNewCategory(friendFolderUUID,
-			LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name());
-	}
-}
-
-
 bool LLFriendCardsManager::isItemInAnyFriendsList(const LLViewerInventoryItem* item)
 {
 	if (item->getType() != LLAssetType::AT_CALLINGCARD)
@@ -305,63 +276,12 @@ bool LLFriendCardsManager::isAnyFriendCategory(const LLUUID& catID) const
 	return TRUE == gInventory.isObjectDescendentOf(catID, friendFolderID);
 }
 
-bool LLFriendCardsManager::syncFriendsFolder()
+void LLFriendCardsManager::syncFriendCardsFolders()
 {
-	//lets create "Friends" and "Friends/All" in the Inventory "Calling Cards" if they are absent
-	LLFriendCardsManager::instance().ensureFriendFoldersExist();
-
-	LLAvatarTracker::buddy_map_t all_buddies;
-	LLAvatarTracker::instance().copyBuddyList(all_buddies);
-
-	// 1. Remove Friend Cards for non-friends
-	LLInventoryModel::cat_array_t cats;
-	LLInventoryModel::item_array_t items;
-
-	gInventory.collectDescendents(findFriendAllSubfolderUUIDImpl(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
-	
-	LLInventoryModel::item_array_t::const_iterator it;
-	for (it = items.begin(); it != items.end(); ++it)
-	{
-		lldebugs << "Check if buddy is in list: " << (*it)->getName() << " " << (*it)->getCreatorUUID() << llendl;
-		if (NULL == get_ptr_in_map(all_buddies, (*it)->getCreatorUUID()))
-		{
-			lldebugs << "NONEXISTS, so remove it" << llendl;
-			removeFriendCardFromInventory((*it)->getCreatorUUID());
-		}
-	}
-
-	// 2. Add missing Friend Cards for friends
-	LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
-	llinfos << "try to build friends, count: " << all_buddies.size() << llendl; 
-	mFriendsAllFolderCompleted = true;
-	for(; buddy_it != all_buddies.end(); ++buddy_it)
-	{
-		const LLUUID& buddy_id = (*buddy_it).first;
-		addFriendCardToInventory(buddy_id);
-	}
-
-	if (!mFriendsAllFolderCompleted)
-	{
-		forceFriendListIsLoaded(findFriendAllSubfolderUUIDImpl());
-
-		static bool timer_started = false;
-		if (!timer_started)
-		{
-			lldebugs << "Create and start timer to sync Inventory Friends All folder with Friends list" << llendl;
-
-			// do not worry about destruction of the FriendListUpdater. 
-			// It will be deleted by LLEventTimer::updateClass when FriendListUpdater::tick() returns true.
-			new FriendListUpdater(boost::bind(&LLFriendCardsManager::syncFriendsFolder, this),
-				FETCH_FRIENDS_DESCENDENTS_PERIOD);
-		}
-		timer_started = true;
-	}
-	else
-	{
-		lldebugs << "Friends/All Inventory folder is synchronized with the Agent's Friends List" << llendl;
-	}
+	const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
 
-	return mFriendsAllFolderCompleted;
+	fetchAndCheckFolderDescendents(callingCardsFolderID,
+			boost::bind(&LLFriendCardsManager::ensureFriendsFolderExists, this));
 }
 
 void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const
@@ -482,6 +402,122 @@ void LLFriendCardsManager::findMatchedFriendCards(const LLUUID& avatarID, LLInve
 	}
 }
 
+void LLFriendCardsManager::fetchAndCheckFolderDescendents(const LLUUID& folder_id,  callback_t cb)
+{
+	// This instance will be deleted in LLInitialFriendCardsFetch::done().
+	LLInitialFriendCardsFetch* fetch = new LLInitialFriendCardsFetch(cb);
+
+	LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+	folders.push_back(folder_id);
+
+	fetch->fetchDescendents(folders);
+	if(fetch->isEverythingComplete())
+	{
+		// everything is already here - call done.
+		fetch->done();
+	}
+	else
+	{
+		// it's all on it's way - add an observer, and the inventory
+		// will call done for us when everything is here.
+		gInventory.addObserver(fetch);
+	}
+}
+
+// Make sure LLInventoryModel::buildParentChildMap() has been called before it.
+// This method must be called before any actions with friends list.
+void LLFriendCardsManager::ensureFriendsFolderExists()
+{
+	const LLUUID calling_cards_folder_ID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
+
+	// If "Friends" folder exists in "Calling Cards" we should check if "All" sub-folder
+	// exists in "Friends", otherwise we create it.
+	LLUUID friends_folder_ID = findFriendFolderUUIDImpl();
+	if (friends_folder_ID.notNull())
+	{
+		fetchAndCheckFolderDescendents(friends_folder_ID,
+				boost::bind(&LLFriendCardsManager::ensureFriendsAllFolderExists, this));
+	}
+	else
+	{
+		if (!gInventory.isCategoryComplete(calling_cards_folder_ID))
+		{
+			LLViewerInventoryCategory* cat = gInventory.getCategory(calling_cards_folder_ID);
+			std::string cat_name = cat ? cat->getName() : "unknown";
+			llwarns << "Failed to find \"" << cat_name << "\" category descendents in Category Tree." << llendl;
+		}
+
+		friends_folder_ID = gInventory.createNewCategory(calling_cards_folder_ID,
+			LLFolderType::FT_CALLINGCARD, get_friend_folder_name());
+
+		gInventory.createNewCategory(friends_folder_ID,
+			LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name());
+
+		// Now when we have all needed folders we can sync their contents with buddies list.
+		syncFriendsFolder();
+	}
+}
+
+// Make sure LLFriendCardsManager::ensureFriendsFolderExists() has been called before it.
+void LLFriendCardsManager::ensureFriendsAllFolderExists()
+{
+	LLUUID friends_all_folder_ID = findFriendAllSubfolderUUIDImpl();
+	if (friends_all_folder_ID.notNull())
+	{
+		fetchAndCheckFolderDescendents(friends_all_folder_ID,
+				boost::bind(&LLFriendCardsManager::syncFriendsFolder, this));
+	}
+	else
+	{
+		LLUUID friends_folder_ID = findFriendFolderUUIDImpl();
+
+		if (!gInventory.isCategoryComplete(friends_folder_ID))
+		{
+			LLViewerInventoryCategory* cat = gInventory.getCategory(friends_folder_ID);
+			std::string cat_name = cat ? cat->getName() : "unknown";
+			llwarns << "Failed to find \"" << cat_name << "\" category descendents in Category Tree." << llendl;
+		}
+
+		friends_all_folder_ID = gInventory.createNewCategory(friends_folder_ID,
+			LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name());
+
+		// Now when we have all needed folders we can sync their contents with buddies list.
+		syncFriendsFolder();
+	}
+}
+
+void LLFriendCardsManager::syncFriendsFolder()
+{
+	LLAvatarTracker::buddy_map_t all_buddies;
+	LLAvatarTracker::instance().copyBuddyList(all_buddies);
+
+	// 1. Remove Friend Cards for non-friends
+	LLInventoryModel::cat_array_t cats;
+	LLInventoryModel::item_array_t items;
+
+	gInventory.collectDescendents(findFriendAllSubfolderUUIDImpl(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
+
+	LLInventoryModel::item_array_t::const_iterator it;
+	for (it = items.begin(); it != items.end(); ++it)
+	{
+		lldebugs << "Check if buddy is in list: " << (*it)->getName() << " " << (*it)->getCreatorUUID() << llendl;
+		if (NULL == get_ptr_in_map(all_buddies, (*it)->getCreatorUUID()))
+		{
+			lldebugs << "NONEXISTS, so remove it" << llendl;
+			removeFriendCardFromInventory((*it)->getCreatorUUID());
+		}
+	}
+
+	// 2. Add missing Friend Cards for friends
+	LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
+	llinfos << "try to build friends, count: " << all_buddies.size() << llendl;
+	for(; buddy_it != all_buddies.end(); ++buddy_it)
+	{
+		const LLUUID& buddy_id = (*buddy_it).first;
+		addFriendCardToInventory(buddy_id);
+	}
+}
+
 class CreateFriendCardCallback : public LLInventoryCallback
 {
 public:
@@ -494,9 +530,8 @@ class CreateFriendCardCallback : public LLInventoryCallback
 	}
 };
 
-bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)
+void LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)
 {
-	LLInventoryModel* invModel = &gInventory;
 
 	bool shouldBeAdded = true;
 	std::string name;
@@ -518,13 +553,6 @@ bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)
 		lldebugs << "is found in sentRequests: " << name << llendl; 
 	}
 
-	LLUUID friendListFolderID = findFriendAllSubfolderUUIDImpl();
-	if (friendListFolderID.notNull() && shouldBeAdded && !invModel->isCategoryComplete(friendListFolderID))
-	{
-		mFriendsAllFolderCompleted = false;
-		shouldBeAdded = false;
-		lldebugs << "Friends/All category is not completed" << llendl; 
-	}
 	if (shouldBeAdded)
 	{
 		putAvatarData(avatarID);
@@ -533,10 +561,8 @@ bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)
 		// TODO: mantipov: Is CreateFriendCardCallback really needed? Probably not
 		LLPointer<LLInventoryCallback> cb = new CreateFriendCardCallback();
 
-		create_inventory_callingcard(avatarID, friendListFolderID, cb);
+		create_inventory_callingcard(avatarID, findFriendAllSubfolderUUIDImpl(), cb);
 	}
-
-	return shouldBeAdded;
 }
 
 void LLFriendCardsManager::removeFriendCardFromInventory(const LLUUID& avatarID)
@@ -582,11 +608,4 @@ void LLFriendCardsManager::onFriendListUpdate(U32 changed_mask)
 	}
 }
 
-void LLFriendCardsManager::forceFriendListIsLoaded(const LLUUID& folder_id) const
-{
-	bool fetching_inventory = gInventory.fetchDescendentsOf(folder_id);
-	lldebugs << "Trying to fetch descendants of Friends/All Inventory folder, fetched: "
-		<< fetching_inventory << llendl;
-}
-
 // EOF
diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h
index feea05bc1dc..98dc3153d0d 100644
--- a/indra/newview/llfriendcard.h
+++ b/indra/newview/llfriendcard.h
@@ -57,14 +57,6 @@ class LLFriendCardsManager
 		onFriendListUpdate(mask);
 	}
 
-	/**
-	 *	Ensures that all necessary folders are created in Inventory.
-	 * 
-	 *	For now it processes Calling Card, Calling Card/Friends & Calling Card/Friends/All folders
-	 */
-	void ensureFriendFoldersExist();
-
-
 	/**
 	 *	Determines if specified Inventory Calling Card exists in any of lists 
 	 *	in the Calling Card/Friends/ folder (Default, or Custom)
@@ -88,11 +80,10 @@ class LLFriendCardsManager
 	bool isAnyFriendCategory(const LLUUID& catID) const;
 
 	/**
-	 *	Synchronizes content of the Calling Card/Friends/All Global Inventory folder with Agent's Friend List
-	 *
-	 *	@return true - if folder is already synchronized, false otherwise.
+	 *	Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" category
+	 *	(creates them otherwise) and fetches their contents to synchronize with Agent's Friends List.
 	 */
-	bool syncFriendsFolder();
+	void syncFriendCardsFolders();
 
 	/*!
 	 * \brief
@@ -108,6 +99,8 @@ class LLFriendCardsManager
 	void collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const;
 
 private:
+	typedef boost::function<void()> callback_t;
+
 	LLFriendCardsManager();
 	~LLFriendCardsManager();
 
@@ -133,10 +126,29 @@ class LLFriendCardsManager
 	const LLUUID& findFriendCardInventoryUUIDImpl(const LLUUID& avatarID);
 	void findMatchedFriendCards(const LLUUID& avatarID, LLInventoryModel::item_array_t& items) const;
 
+	void fetchAndCheckFolderDescendents(const LLUUID& folder_id, callback_t cb);
+
+	/**
+	 *	Checks whether "Calling Cards/Friends" folder exists. If not, creates it with "All"
+	 *	sub-folder and synchronizes its contents with buddies list.
+	 */
+	void ensureFriendsFolderExists();
+
+	/**
+	 *	Checks whether "Calling Cards/Friends/All" folder exists. If not, creates it and
+	 *	synchronizes its contents with buddies list.
+	 */
+	void ensureFriendsAllFolderExists();
+
+	/**
+	 *	Synchronizes content of the Calling Card/Friends/All Global Inventory folder with Agent's Friend List
+	 */
+	void syncFriendsFolder();
+
 	/**
 	 *	Adds avatar specified by its UUID into the Calling Card/Friends/All Global Inventory folder
 	 */
-	bool addFriendCardToInventory(const LLUUID& avatarID);
+	void addFriendCardToInventory(const LLUUID& avatarID);
 
 	/**
 	 *	Removes an avatar specified by its UUID from the Calling Card/Friends/All Global Inventory folder
@@ -146,20 +158,11 @@ class LLFriendCardsManager
 
 	void onFriendListUpdate(U32 changed_mask);
 
-	/**
-	 * Force fetching of the Inventory folder specified by passed folder's LLUUID.
-	 *
-	 * It only sends request to server, server reply should be processed in other place.
-	 * Because request can be sent via UDP we need to periodically check if request was completed with success.
-	 */
-	void forceFriendListIsLoaded(const LLUUID& folder_id) const;
-
 
 private:
 	typedef std::set<LLUUID> avatar_uuid_set_t;
 
 	avatar_uuid_set_t mBuddyIDSet;
-	bool mFriendsAllFolderCompleted;
 };
 
 #endif // LL_LLFRIENDCARD_H
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 64dcd7b97fb..9be80c3add6 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -1688,8 +1688,11 @@ bool idle_startup()
 		//all categories loaded. lets create "My Favorites" category
 		gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE,true);
 
-		// lets create "Friends" and "Friends/All" in the Inventory "Calling Cards" and fill it with buddies
-		LLFriendCardsManager::instance().syncFriendsFolder();
+		// Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" folder,
+		// fetches their contents if needed and synchronizes it with buddies list.
+		// If the folders are not found they are created.
+		LLFriendCardsManager::instance().syncFriendCardsFolders();
+
 
 		// set up callbacks
 		llinfos << "Registering Callbacks" << llendl;
-- 
GitLab


From fdf287d9b634d194fb22655155fa26f9c7233db7 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Fri, 13 Nov 2009 13:50:07 +0000
Subject: [PATCH 237/557] trivial comment change.

---
 indra/newview/llvoicechannel.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index d93913b9443..03e0f99727b 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -870,7 +870,7 @@ void LLVoiceChannelP2P::setSessionHandle(const std::string& handle, const std::s
 
 void LLVoiceChannelP2P::setState(EState state)
 {
-	// HACK: Open/close the call window if needed.
+	// *HACK: Open/close the call window if needed.
 	toggleCallWindowIfNeeded(state);
 	
 	// *HACK: open outgoing call floater if needed, might be better done elsewhere.
-- 
GitLab


From 0ec8d0aacf47913ab8fd30d8424fa7146f135d15 Mon Sep 17 00:00:00 2001
From: Denis Serdjuk <dserduk@productengine.com>
Date: Fri, 13 Nov 2009 15:51:22 +0200
Subject: [PATCH 238/557] implemented major task EXT-1897  Ctl + G Gestures
 floater should show ALL gestures from inventory, not just Active Gestures
 refactoring of gesture's manager

--HG--
branch : product-engine
---
 indra/newview/llchatbar.cpp                   |   5 +-
 indra/newview/llfloatergesture.cpp            | 255 ++++++++++++------
 indra/newview/llfloatergesture.h              |  12 +-
 indra/newview/llgesturemgr.cpp                |  31 ++-
 indra/newview/llgesturemgr.h                  |  30 ++-
 indra/newview/llnearbychatbar.cpp             |   5 +-
 .../skins/default/xui/en/floater_gesture.xml  |  10 +-
 7 files changed, 235 insertions(+), 113 deletions(-)

diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp
index 4523267eddb..442dc660cdb 100644
--- a/indra/newview/llchatbar.cpp
+++ b/indra/newview/llchatbar.cpp
@@ -210,8 +210,9 @@ void LLChatBar::refreshGestures()
 
 		// collect list of unique gestures
 		std::map <std::string, BOOL> unique;
-		LLGestureManager::item_map_t::iterator it;
-		for (it = LLGestureManager::instance().mActive.begin(); it != LLGestureManager::instance().mActive.end(); ++it)
+		LLGestureManager::item_map_t::const_iterator it;
+		const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures();
+		for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
 		{
 			LLMultiGesture* gesture = (*it).second;
 			if (gesture)
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index c114eed4a24..ca0ba96a08f 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -89,6 +89,52 @@ LLFloaterGesture::LLFloaterGesture(const LLSD& key)
 	//LLUICtrlFactory::getInstance()->buildFloater(this, "floater_gesture.xml");
 }
 
+void LLFloaterGesture::done()
+{
+	//this method can be called twice: for GestureFolder and once after loading all sudir of GestureFolder
+	if (gInventory.isCategoryComplete(mGestureFolderID))
+	{
+		LL_DEBUGS("Gesture")<< "mGestureFolderID loaded" << LL_ENDL;
+		// we load only gesture folder without childred.
+		LLInventoryModel::cat_array_t* categories;
+		LLInventoryModel::item_array_t* items;
+		folder_ref_t unloaded_folders;
+		LL_DEBUGS("Gesture")<< "Get subdirs of Gesture Folder...." << LL_ENDL;
+		gInventory.getDirectDescendentsOf(mGestureFolderID, categories, items);
+		if (categories->empty())
+		{
+			gInventory.removeObserver(this);
+			LL_INFOS("Gesture")<< "Gesture dos NOT contains sub-directories."<< LL_ENDL;
+			return;
+		}
+		LL_DEBUGS("Gesture")<< "There are " << categories->size() << " Folders "<< LL_ENDL;
+		for (LLInventoryModel::cat_array_t::iterator it = categories->begin(); it != categories->end(); it++)
+		{
+			if (!gInventory.isCategoryComplete(it->get()->getUUID()))
+			{
+				unloaded_folders.push_back(it->get()->getUUID());
+				LL_DEBUGS("Gesture")<< it->get()->getName()<< " Folder added to fetchlist"<< LL_ENDL;
+			}
+
+		}
+		if (!unloaded_folders.empty())
+		{
+			LL_DEBUGS("Gesture")<< "Fetching subdirectories....." << LL_ENDL;
+			fetchDescendents(unloaded_folders);
+		}
+		else
+		{
+			LL_DEBUGS("Gesture")<< "All Gesture subdirectories have been loaded."<< LL_ENDL;
+			gInventory.removeObserver(this);
+			buildGestureList();
+		}
+	}
+	else
+	{
+		LL_WARNS("Gesture")<< "Gesture list was NOT loaded"<< LL_ENDL;
+	}
+}
+
 // virtual
 LLFloaterGesture::~LLFloaterGesture()
 {
@@ -121,7 +167,14 @@ BOOL LLFloaterGesture::postBuild()
 	childSetVisible("play_btn", true);
 	childSetVisible("stop_btn", false);
 	setDefaultBtn("play_btn");
-	
+	mGestureFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE, false);
+
+	folder_ref_t folders;
+	folders.push_back(mGestureFolderID);
+	//perform loading Gesture directory anyway to make sure that all subdirectory are loaded too. See method done() for details.
+	gInventory.addObserver(this);
+	fetchDescendents(folders);
+
 	buildGestureList();
 	
 	childSetFocus("gesture_list");
@@ -171,101 +224,125 @@ void LLFloaterGesture::buildGestureList()
 
 	if (! (list && scroll)) return;
 
-	// attempt to preserve scroll position through re-builds
-	// since we do re-build any time anything dirties
-	S32 current_scroll_pos = scroll->getScrollPos();
-	
+	LLUUID selected_item = list->getCurrentID();
+	LL_DEBUGS("Gesture")<< "Rebuilding gesture list "<< LL_ENDL;
 	list->operateOnAll(LLCtrlListInterface::OP_DELETE);
 
-	LLGestureManager::item_map_t::iterator it;
-	for (it = LLGestureManager::instance().mActive.begin(); it != LLGestureManager::instance().mActive.end(); ++it)
+	LLGestureManager::item_map_t::const_iterator it;
+	const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures();
+	for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
 	{
-		const LLUUID& item_id = (*it).first;
-		LLMultiGesture* gesture = (*it).second;
+		addGesture(it->first,it->second, list);
+	}
+	if (gInventory.isCategoryComplete(mGestureFolderID))
+	{
+		LLIsType is_gesture(LLAssetType::AT_GESTURE);
+		LLInventoryModel::cat_array_t categories;
+		LLInventoryModel::item_array_t items;
+		gInventory.collectDescendentsIf(mGestureFolderID, categories, items,
+				LLInventoryModel::EXCLUDE_TRASH, is_gesture);
 
-		// Note: Can have NULL item if inventory hasn't arrived yet.
-		std::string item_name = getString("loading");
-		LLInventoryItem* item = gInventory.getItem(item_id);
-		if (item)
+		for (LLInventoryModel::item_array_t::iterator it = items.begin(); it!= items.end(); ++it)
 		{
-			item_name = item->getName();
+			LLInventoryItem* item = it->get();
+			if (active_gestures.find(item->getUUID()) == active_gestures.end())
+			{
+				// if gesture wasn't loaded yet, we can display only name
+				addGesture(item->getUUID(), NULL, list);
+			}
 		}
+	}
+	// attempt to preserve scroll position through re-builds
+	// since we do re-build any time anything dirties
+	if(list->selectByValue(LLSD(selected_item)))
+	{
+		scroll->scrollToShowSelected();
+	}
+}
 
-		std::string font_style = "NORMAL";
-		// If gesture is playing, bold it
+void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gesture,LLCtrlListInterface * list )
+{
+	// Note: Can have NULL item if inventory hasn't arrived yet.
+	static std::string item_name = getString("loading");
+	LLInventoryItem* item = gInventory.getItem(item_id);
+	if (item)
+	{
+		item_name = item->getName();
+	}
+
+	static std::string font_style = "NORMAL";
+	// If gesture is playing, bold it
 
-		LLSD element;
-		element["id"] = item_id;
+	LLSD element;
+	element["id"] = item_id;
 
-		if (gesture)
+	if (gesture)
+	{
+		if (gesture->mPlaying)
 		{
-			if (gesture->mPlaying)
-			{
-				font_style = "BOLD";
-			}
+			font_style = "BOLD";
+		}
 
-			element["columns"][0]["column"] = "trigger";
-			element["columns"][0]["value"] = gesture->mTrigger;
-			element["columns"][0]["font"]["name"] = "SANSSERIF";
-			element["columns"][0]["font"]["style"] = font_style;
+		element["columns"][0]["column"] = "trigger";
+		element["columns"][0]["value"] = gesture->mTrigger;
+		element["columns"][0]["font"]["name"] = "SANSSERIF";
+		element["columns"][0]["font"]["style"] = font_style;
 
-			std::string key_string = LLKeyboard::stringFromKey(gesture->mKey);
-			std::string buffer;
+		std::string key_string = LLKeyboard::stringFromKey(gesture->mKey);
+		std::string buffer;
 
-			if (gesture->mKey == KEY_NONE)
-			{
-				buffer = "---";
-				key_string = "~~~";		// alphabetize to end
-			}
-			else
-			{
-				buffer = LLKeyboard::stringFromAccelerator( gesture->mMask, gesture->mKey );
-			}
+		if (gesture->mKey == KEY_NONE)
+		{
+			buffer = "---";
+			key_string = "~~~"; // alphabetize to end
+		}
+		else
+		{
+			buffer = LLKeyboard::stringFromAccelerator(gesture->mMask,
+					gesture->mKey);
+		}
 
-			element["columns"][1]["column"] = "shortcut";
-			element["columns"][1]["value"] = buffer;
-			element["columns"][1]["font"]["name"] = "SANSSERIF";
-			element["columns"][1]["font"]["style"] = font_style;
+		element["columns"][1]["column"] = "shortcut";
+		element["columns"][1]["value"] = buffer;
+		element["columns"][1]["font"]["name"] = "SANSSERIF";
+		element["columns"][1]["font"]["style"] = font_style;
 
-			// hidden column for sorting
-			element["columns"][2]["column"] = "key";
-			element["columns"][2]["value"] = key_string;
-			element["columns"][2]["font"]["name"] = "SANSSERIF";
-			element["columns"][2]["font"]["style"] = font_style;
+		// hidden column for sorting
+		element["columns"][2]["column"] = "key";
+		element["columns"][2]["value"] = key_string;
+		element["columns"][2]["font"]["name"] = "SANSSERIF";
+		element["columns"][2]["font"]["style"] = font_style;
 
-			// Only add "playing" if we've got the name, less confusing. JC
-			if (item && gesture->mPlaying)
-			{
-				item_name += " " + getString("playing");
-			}
-			element["columns"][3]["column"] = "name";
-			element["columns"][3]["value"] = item_name;
-			element["columns"][3]["font"]["name"] = "SANSSERIF";
-			element["columns"][3]["font"]["style"] = font_style;
-		}
-		else
+		// Only add "playing" if we've got the name, less confusing. JC
+		if (item && gesture->mPlaying)
 		{
-			element["columns"][0]["column"] = "trigger";
-			element["columns"][0]["value"] = "";
-			element["columns"][0]["font"]["name"] = "SANSSERIF";
-			element["columns"][0]["font"]["style"] = font_style;
-			element["columns"][0]["column"] = "trigger";
-			element["columns"][0]["value"] = "---";
-			element["columns"][0]["font"]["name"] = "SANSSERIF";
-			element["columns"][0]["font"]["style"] = font_style;
-			element["columns"][2]["column"] = "key";
-			element["columns"][2]["value"] = "~~~";
-			element["columns"][2]["font"]["name"] = "SANSSERIF";
-			element["columns"][2]["font"]["style"] = font_style;
-			element["columns"][3]["column"] = "name";
-			element["columns"][3]["value"] = item_name;
-			element["columns"][3]["font"]["name"] = "SANSSERIF";
-			element["columns"][3]["font"]["style"] = font_style;
+			item_name += " " + getString("playing");
 		}
-		list->addElement(element, ADD_BOTTOM);
+		element["columns"][3]["column"] = "name";
+		element["columns"][3]["value"] = item_name;
+		element["columns"][3]["font"]["name"] = "SANSSERIF";
+		element["columns"][3]["font"]["style"] = font_style;
 	}
-	
-	scroll->setScrollPos(current_scroll_pos);
+	else
+	{
+		element["columns"][0]["column"] = "trigger";
+		element["columns"][0]["value"] = "";
+		element["columns"][0]["font"]["name"] = "SANSSERIF";
+		element["columns"][0]["font"]["style"] = font_style;
+		element["columns"][0]["column"] = "trigger";
+		element["columns"][0]["value"] = "---";
+		element["columns"][0]["font"]["name"] = "SANSSERIF";
+		element["columns"][0]["font"]["style"] = font_style;
+		element["columns"][2]["column"] = "key";
+		element["columns"][2]["value"] = "~~~";
+		element["columns"][2]["font"]["name"] = "SANSSERIF";
+		element["columns"][2]["font"]["style"] = font_style;
+		element["columns"][3]["column"] = "name";
+		element["columns"][3]["value"] = item_name;
+		element["columns"][3]["font"]["name"] = "SANSSERIF";
+		element["columns"][3]["font"]["style"] = font_style;
+	}
+	list->addElement(element, ADD_BOTTOM);
 }
 
 void LLFloaterGesture::onClickInventory()
@@ -284,14 +361,21 @@ void LLFloaterGesture::onClickPlay()
 	LLCtrlListInterface *list = childGetListInterface("gesture_list");
 	if (!list) return;
 	const LLUUID& item_id = list->getCurrentID();
+	if(item_id.isNull()) return;
 
-	if (LLGestureManager::instance().isGesturePlaying(item_id))
+	LL_DEBUGS("Gesture")<<" Trying to play gesture id: "<< item_id <<LL_ENDL;
+	if(!LLGestureManager::instance().isGestureActive(item_id))
 	{
-		LLGestureManager::instance().stopGesture(item_id);
+		// we need to inform server about gesture activating to be consistent with LLPreviewGesture.
+		BOOL inform_server = TRUE;
+		BOOL deactivate_similar = FALSE;
+		LLGestureManager::instance().activateGestureWithAsset(item_id, gInventory.getItem(item_id)->getAssetUUID(), inform_server, deactivate_similar);
+		LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL;
+		LLGestureManager::instance().setGestureLoadedCallback(item_id, boost::bind(&LLFloaterGesture::playGesture, this, item_id));
 	}
 	else
 	{
-		LLGestureManager::instance().playGesture(item_id);
+		playGesture(item_id);
 	}
 }
 
@@ -345,3 +429,14 @@ void LLFloaterGesture::onCommitList()
 		childSetVisible("stop_btn", false);
 	}
 }
+void LLFloaterGesture::playGesture(LLUUID item_id)
+{
+	if (LLGestureManager::instance().isGesturePlaying(item_id))
+	{
+		LLGestureManager::instance().stopGesture(item_id);
+	}
+	else
+	{
+		LLGestureManager::instance().playGesture(item_id);
+	}
+}
diff --git a/indra/newview/llfloatergesture.h b/indra/newview/llfloatergesture.h
index 9c1ab27cb0c..9d047bf1cf8 100644
--- a/indra/newview/llfloatergesture.h
+++ b/indra/newview/llfloatergesture.h
@@ -38,7 +38,7 @@
 #define LL_LLFLOATERGESTURE_H
 
 #include "llfloater.h"
-
+#include "llinventorymodel.h"
 #include "lldarray.h"
 
 class LLScrollContainer;
@@ -51,31 +51,35 @@ class LLGestureOptions;
 class LLScrollListCtrl;
 class LLFloaterGestureObserver;
 class LLFloaterGestureInventoryObserver;
+class LLMultiGesture;
 
 class LLFloaterGesture
-:	public LLFloater
+:	public LLFloater, LLInventoryFetchDescendentsObserver
 {
+	LOG_CLASS(LLFloaterGesture);
 public:
 	LLFloaterGesture(const LLSD& key);
 	virtual ~LLFloaterGesture();
 
 	virtual BOOL postBuild();
-
+	virtual void done ();
 	void refreshAll();
 
 protected:
 	// Reads from the gesture manager's list of active gestures
 	// and puts them in this list.
 	void buildGestureList();
-
+	void addGesture(const LLUUID& item_id, LLMultiGesture* gesture, LLCtrlListInterface * list);
 	void onClickInventory();
 	void onClickEdit();
 	void onClickPlay();
 	void onClickNew();
 	void onCommitList();
+	void playGesture(LLUUID item_id);
 
 protected:
 	LLUUID mSelectedID;
+	LLUUID mGestureFolderID;
 
 	LLFloaterGestureObserver* mObserver;
 };
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 59274c8638c..8e774dc199b 100644
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -37,7 +37,6 @@
 // system
 #include <functional>
 #include <algorithm>
-#include <boost/tokenizer.hpp>
 
 // library
 #include "lldatapacker.h"
@@ -206,6 +205,9 @@ struct LLLoadInfo
 
 // If inform_server is true, will send a message upstream to update
 // the user_gesture_active table.
+/**
+ * It will load a gesture from remote storage
+ */
 void LLGestureManager::activateGestureWithAsset(const LLUUID& item_id,
 												const LLUUID& asset_id,
 												BOOL inform_server,
@@ -921,8 +923,8 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
 
 	delete info;
 	info = NULL;
-
-	LLGestureManager::instance().mLoadingCount--;
+	LLGestureManager& self = LLGestureManager::instance();
+	self.mLoadingCount--;
 
 	if (0 == status)
 	{
@@ -944,15 +946,15 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
 		{
 			if (deactivate_similar)
 			{
-				LLGestureManager::instance().deactivateSimilarGestures(gesture, item_id);
+				self.deactivateSimilarGestures(gesture, item_id);
 
 				// Display deactivation message if this was the last of the bunch.
-				if (LLGestureManager::instance().mLoadingCount == 0
-					&& LLGestureManager::instance().mDeactivateSimilarNames.length() > 0)
+				if (self.mLoadingCount == 0
+					&& self.mDeactivateSimilarNames.length() > 0)
 				{
 					// we're done with this set of deactivations
 					LLSD args;
-					args["NAMES"] = LLGestureManager::instance().mDeactivateSimilarNames;
+					args["NAMES"] = self.mDeactivateSimilarNames;
 					LLNotifications::instance().add("DeactivatedGesturesTrigger", args);
 				}
 			}
@@ -965,9 +967,9 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
 			else
 			{
 				// Watch this item and set gesture name when item exists in inventory
-				LLGestureManager::instance().watchItem(item_id);
+				self.watchItem(item_id);
 			}
-			LLGestureManager::instance().mActive[item_id] = gesture;
+			self.mActive[item_id] = gesture;
 
 			// Everything has been successful.  Add to the active list.
 			gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
@@ -989,14 +991,21 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
 
 				gAgent.sendReliableMessage();
 			}
+			callback_map_t::iterator i_cb = self.mCallbackMap.find(item_id);
+			
+			if(i_cb != self.mCallbackMap.end())
+			{
+				i_cb->second(gesture);
+				self.mCallbackMap.erase(i_cb);
+			}
 
-			LLGestureManager::instance().notifyObservers();
+			self.notifyObservers();
 		}
 		else
 		{
 			llwarns << "Unable to load gesture" << llendl;
 
-			LLGestureManager::instance().mActive.erase(item_id);
+			self.mActive.erase(item_id);
 			
 			delete gesture;
 			gesture = NULL;
diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h
index 947773d66dc..7c3b7427808 100644
--- a/indra/newview/llgesturemgr.h
+++ b/indra/newview/llgesturemgr.h
@@ -57,6 +57,12 @@ class LLGestureManagerObserver
 class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventoryCompletionObserver
 {
 public:
+
+	typedef boost::function<void (LLMultiGesture* loaded_gesture)> gesture_loaded_callback_t;
+	// Maps inventory item_id to gesture
+	typedef std::map<LLUUID, LLMultiGesture*> item_map_t;
+	typedef std::map<LLUUID, gesture_loaded_callback_t> callback_map_t;
+
 	LLGestureManager();
 	~LLGestureManager();
 
@@ -97,6 +103,7 @@ class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventor
 
 	BOOL isGesturePlaying(const LLUUID& item_id);
 
+	const item_map_t& getActiveGestures() const { return mActive; }
 	// Force a gesture to be played, for example, if it is being
 	// previewed.
 	void playGesture(LLMultiGesture* gesture);
@@ -106,7 +113,15 @@ class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventor
 	// Also remove from playing list
 	void stopGesture(LLMultiGesture* gesture);
 	void stopGesture(const LLUUID& item_id);
-
+	/**
+	 * Add cb into callbackMap.
+	 * Note:
+	 * Manager will call cb after gesture will be loaded and will remove cb automatically. 
+	 */
+	void setGestureLoadedCallback(LLUUID inv_item_id, gesture_loaded_callback_t cb)
+	{
+		mCallbackMap[inv_item_id] = cb;
+	}
 	// Trigger the first gesture that matches this key.
 	// Returns TRUE if it finds a gesture bound to that key.
 	BOOL triggerGesture(KEY key, MASK mask);
@@ -144,13 +159,7 @@ class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventor
 						   LLAssetType::EType type,
 						   void* user_data, S32 status, LLExtStat ext_status);
 
-public:
-	BOOL mValid;
-	std::vector<LLMultiGesture*> mPlaying;
-
-	// Maps inventory item_id to gesture
-	typedef std::map<LLUUID, LLMultiGesture*> item_map_t;
-
+private:
 	// Active gestures.
 	// NOTE: The gesture pointer CAN BE NULL.  This means that
 	// there is a gesture with that item_id, but the asset data
@@ -159,8 +168,11 @@ class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventor
 
 	S32 mLoadingCount;
 	std::string mDeactivateSimilarNames;
-
+	
 	std::vector<LLGestureManagerObserver*> mObservers;
+	callback_map_t mCallbackMap;
+	std::vector<LLMultiGesture*> mPlaying;	
+	BOOL mValid;
 };
 
 #endif
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 39934313118..236eaf8f0f4 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -98,9 +98,10 @@ void LLGestureComboBox::refreshGestures()
 	clearRows();
 	mGestures.clear();
 
-	LLGestureManager::item_map_t::iterator it;
+	LLGestureManager::item_map_t::const_iterator it;
+	const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures();
 	LLSD::Integer idx(0);
-	for (it = LLGestureManager::instance().mActive.begin(); it != LLGestureManager::instance().mActive.end(); ++it)
+	for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
 	{
 		LLMultiGesture* gesture = (*it).second;
 		if (gesture)
diff --git a/indra/newview/skins/default/xui/en/floater_gesture.xml b/indra/newview/skins/default/xui/en/floater_gesture.xml
index b23482655cf..a3ac8782028 100644
--- a/indra/newview/skins/default/xui/en/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_gesture.xml
@@ -84,21 +84,21 @@
                  top_delta="0"
                  width="18" />
                 <button
-                 follows="bottom|left"
+                 follows="bottom|right"
                  font="SansSerifBigBold"
                  height="18"
                  image_selected="TrashItem_Press"
                  image_unselected="TrashItem_Off"
                  image_disabled="TrashItem_Disabled"
                  layout="topleft"
-                 left_pad="230"
                  name="del_btn"
+                 right="-5"
                  tool_tip="Delete this gesture"
                  top_delta="0"
                  width="18" />
             </panel>
     <button
-     follows="bottom|right"
+     follows="left|bottom"
      height="23"
      label="Edit"
      layout="topleft"
@@ -107,7 +107,7 @@
      top_pad="5"
      width="83" />
     <button
-     follows="bottom|right"
+     follows="left|bottom"
      height="23"
      label="Play"
      layout="topleft"
@@ -116,7 +116,7 @@
      top_delta="0"
      width="83" />
     <button
-     follows="bottom|right"
+     follows="left|bottom"
      height="23"
      label="Stop"
      layout="topleft"
-- 
GitLab


From 8039b75ae8320a03a2a5339e5d0d1238de0335d2 Mon Sep 17 00:00:00 2001
From: Dmitry Oleshko <doleshko@productengine.com>
Date: Fri, 13 Nov 2009 15:56:47 +0200
Subject: [PATCH 239/557] fixed normal bug (EXT-1217) Non-interactive
 notifications in queue aren't dismissed when overflow toast is dismissed
 proactively

returned a call to the appropriate function "onOverflowToastHide" that was brocen by commit r2150 to SVN

--HG--
branch : product-engine
---
 indra/newview/llscreenchannel.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index ed606d54570..81eb133b07f 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -455,7 +455,7 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)
 	if(!mOverflowToastPanel)
 		return;
 
-	mOverflowToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::closeOverflowToastPanel, this));
+	mOverflowToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onOverflowToastHide, this));
 
 	LLTextBox* text_box = mOverflowToastPanel->getChild<LLTextBox>("toast_text");
 	std::string	text = llformat(mOverflowFormatString.c_str(),mHiddenToastsNum);
-- 
GitLab


From b59afa93961a30b8a5e4c6645b48c2cc8f3054df Mon Sep 17 00:00:00 2001
From: Dmitry Oleshko <doleshko@productengine.com>
Date: Fri, 13 Nov 2009 16:50:18 +0200
Subject: [PATCH 240/557] fixed normal bug (EXT-2393) Items aren't highlighted
 on mouse over in the Message Well

returned necessary attributes to the corresponding XML-files that were corrupted by Erica's commit (changesets 3991 and 3992)

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_activeim_row.xml  | 4 +++-
 indra/newview/skins/default/xui/en/panel_sys_well_item.xml | 5 ++++-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_activeim_row.xml b/indra/newview/skins/default/xui/en/panel_activeim_row.xml
index 5562ec84066..38294c907a3 100644
--- a/indra/newview/skins/default/xui/en/panel_activeim_row.xml
+++ b/indra/newview/skins/default/xui/en/panel_activeim_row.xml
@@ -7,7 +7,9 @@
 	left="0"
 	height="35"
 	width="318"
-	background_visible="false">
+  background_opaque="false"
+  background_visible="true"
+  bg_alpha_color="0.0 0.0 0.0 0.0" >
   <chiclet_im_p2p
 		name="p2p_chiclet"
 		layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_sys_well_item.xml b/indra/newview/skins/default/xui/en/panel_sys_well_item.xml
index 7722583ce21..63e60aab784 100644
--- a/indra/newview/skins/default/xui/en/panel_sys_well_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_sys_well_item.xml
@@ -9,7 +9,10 @@
   width="300"
   height="35"
   layout="topleft"
-  follows="left|right">
+  follows="left|right"
+  background_opaque="false"
+  background_visible="true"
+  bg_alpha_color="0.0 0.0 0.0 0.0" >
   <text
     top="2"
     left="10"
-- 
GitLab


From 977b731dd6cb5ce0ef754633a2c95130ee016ee4 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Fri, 13 Nov 2009 17:28:19 +0200
Subject: [PATCH 241/557] Work on major sub-task EXT-991 (Update bottom bar
 behavior on resize) Implemented functionality to process Buttons hidden/shown
 via context menu 1. hidden buttons are not processed while resizing 2.
 setTrayButtonVisibleIfPossible() is implemented: 	 * If it is impossible
 to show required button via context menu due to there is no enough room in
 bottom tray 	 * it will no be shown. 	 * Method also stores resize
 state to be processed while future bottom tray extending: 	 *  - if
 hidden while resizing button should be hidden it will not be shown while
 extending; 	 *  - if hidden via context menu button should be shown but
 there is no enough room for now 	 *    it will be shown while
 extending.

--HG--
branch : product-engine
---
 indra/newview/llbottomtray.cpp | 76 +++++++++++++++++++++++++++-------
 indra/newview/llbottomtray.h   | 22 ++++++++--
 2 files changed, 81 insertions(+), 17 deletions(-)

diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 76cb31e2a63..c0ab0b27e5e 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -52,6 +52,7 @@ LLBottomTray::LLBottomTray(const LLSD&)
 	mNearbyChatBar(NULL),
 	mToolbarStack(NULL)
 ,	mMovementButton(NULL)
+,	mResizeState(RS_NORESIZE)
 // Add more members
 {
 	mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL);
@@ -261,22 +262,22 @@ void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask)
 
 void LLBottomTray::showGestureButton(BOOL visible)
 {
-	showTrayButton(RS_BUTTON_GESTURES, visible);
+	setTrayButtonVisibleIfPossible(RS_BUTTON_GESTURES, visible);
 }
 
 void LLBottomTray::showMoveButton(BOOL visible)
 {
-	showTrayButton(RS_BUTTON_MOVEMENT, visible);
+	setTrayButtonVisibleIfPossible(RS_BUTTON_MOVEMENT, visible);
 }
 
 void LLBottomTray::showCameraButton(BOOL visible)
 {
-	showTrayButton(RS_BUTTON_CAMERA, visible);
+	setTrayButtonVisibleIfPossible(RS_BUTTON_CAMERA, visible);
 }
 
 void LLBottomTray::showSnapshotButton(BOOL visible)
 {
-	showTrayButton(RS_BUTTON_SNAPSHOT, visible);
+	setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible);
 }
 
 namespace
@@ -640,7 +641,7 @@ bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* availa
 		lldebugs << "There is no object to process for state: " << shown_object_type << llendl;
 		return false;
 	}
-	bool can_be_shown = canButtonBeShown(panel);
+	bool can_be_shown = canButtonBeShown(shown_object_type);
 	if (can_be_shown)
 	{
 		//validate if we have enough room to show this button
@@ -651,22 +652,23 @@ bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* availa
 			*available_width -= required_width;
 			*buttons_required_width += required_width;
 
-			showTrayButton(shown_object_type, true);
+			setTrayButtonVisible(shown_object_type, true);
 
 			lldebugs << "processing object type: " << shown_object_type
 				<< ", buttons_required_width: " << *buttons_required_width
 				<< llendl;
+			mResizeState &= ~shown_object_type;
 		}
 	}
 	return can_be_shown;
 }
 
-void LLBottomTray::processHideButton(EResizeState shown_object_type, S32* required_width, S32* buttons_freed_width)
+void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width)
 {
-	LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
+	LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
 	if (NULL == panel)
 	{
-		lldebugs << "There is no object to process for state: " << shown_object_type << llendl;
+		lldebugs << "There is no object to process for state: " << processed_object_type << llendl;
 		return;
 	}
 
@@ -679,17 +681,19 @@ void LLBottomTray::processHideButton(EResizeState shown_object_type, S32* requir
 			*buttons_freed_width += *required_width;
 		}
 
-		showTrayButton(shown_object_type, false);
+		setTrayButtonVisible(processed_object_type, false);
 
-		lldebugs << "processing object type: " << shown_object_type
+		mResizeState |= processed_object_type;
+
+		lldebugs << "processing object type: " << processed_object_type
 			<< ", buttons_freed_width: " << *buttons_freed_width
 			<< llendl;
 	}
 }
 
-bool LLBottomTray::canButtonBeShown(LLPanel* panel) const
+bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const
 {
-	bool can_be_shown = !panel->getVisible();
+	bool can_be_shown = mResizeState & processed_object_type;
 	if (can_be_shown)
 	{
 		// *TODO: mantipov: synchronize with situation when button was hidden via context menu;
@@ -705,7 +709,7 @@ void LLBottomTray::initStateProcessedObjectMap()
 	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, mSnapshotPanel));
 }
 
-void LLBottomTray::showTrayButton(EResizeState shown_object_type, bool visible)
+void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible)
 {
 	LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
 	if (NULL == panel)
@@ -716,4 +720,48 @@ void LLBottomTray::showTrayButton(EResizeState shown_object_type, bool visible)
 
 	panel->setVisible(visible);
 }
+
+void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible)
+{
+	bool can_be_set = true;
+
+	if (visible)
+	{
+		LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
+		if (NULL == panel)
+		{
+			lldebugs << "There is no object to process for state: " << shown_object_type << llendl;
+			return;
+		}
+
+		const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
+		const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
+
+		const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
+		const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
+
+		const S32 available_width = (chatbar_panel_width - chatbar_panel_min_width)
+			+ (chiclet_panel_width - chiclet_panel_min_width);
+
+		const S32 required_width = panel->getRect().getWidth();
+		can_be_set = available_width >= required_width;
+	}
+
+	if (can_be_set)
+	{
+		setTrayButtonVisible(shown_object_type, visible);
+
+		// if we hide the button mark it NOT to show while future bottom tray extending
+		if (!visible)
+		{
+			mResizeState &= ~shown_object_type;
+		}
+	}
+	else
+	{
+		// mark this button to show it while future bottom tray extending
+		mResizeState |= shown_object_type;
+	}
+}
+
 //EOF
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index e88cd8edde0..86d341f2334 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -107,10 +107,26 @@ class LLBottomTray
 	void processWidthIncreased(S32 delta_width);
 	void log(LLView* panel, const std::string& descr);
 	bool processShowButton(EResizeState shown_object_type, S32* available_width, S32* buttons_required_width);
-	void processHideButton(EResizeState shown_object_type, S32* required_width, S32* buttons_freed_width);
-	bool canButtonBeShown(LLPanel* panel) const;
+	void processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width);
+	bool canButtonBeShown(EResizeState processed_object_type) const;
 	void initStateProcessedObjectMap();
-	void showTrayButton(EResizeState shown_object_type, bool visible);
+
+	/**
+	 * Sets passed visibility to object specified by resize type.
+	 */
+	void setTrayButtonVisible(EResizeState shown_object_type, bool visible);
+
+	/**
+	 * Sets passed visibility to object specified by resize type if it is possible.
+	 *
+	 * If it is impossible to show required button due to there is no enough room in bottom tray
+	 * it will no be shown. Is called via context menu commands.
+	 * Method also stores resize state to be processed while future bottom tray extending:
+	 *  - if hidden while resizing button should be hidden it will not be shown while extending;
+	 *  - if hidden via context menu button should be shown but there is no enough room for now
+	 *    it will be shown while extending.
+	 */
+	void setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible);
 
 	MASK mResizeState;
 
-- 
GitLab


From e60ba28953090d264f0be08b83798ca4eda1d9eb Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Fri, 13 Nov 2009 15:37:44 +0000
Subject: [PATCH 242/557] minor code restructuring to aid more state-change
 dialog-jiggery.

---
 indra/newview/llvoicechannel.cpp | 38 ++++++++++++++++++--------------
 1 file changed, 22 insertions(+), 16 deletions(-)

diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index 03e0f99727b..bb2965b9ce3 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -873,26 +873,32 @@ void LLVoiceChannelP2P::setState(EState state)
 	// *HACK: Open/close the call window if needed.
 	toggleCallWindowIfNeeded(state);
 	
-	// *HACK: open outgoing call floater if needed, might be better done elsewhere.
-	mCallDialogPayload["session_id"] = mSessionID;
-	mCallDialogPayload["session_name"] = mSessionName;
-	mCallDialogPayload["other_user_id"] = mOtherUserID;
-	if (!mReceivedCall && state == STATE_RINGING)
-	{
-		llinfos << "RINGINGGGGGGGG " << mSessionName << llendl;
-		if (!mSessionName.empty())
+	if (mReceivedCall) // incoming call
+	{
+		// you only "answer" voice invites in p2p mode
+		// so provide a special purpose message here
+		if (mReceivedCall && state == STATE_RINGING)
 		{
-			LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE);
+			gIMMgr->addSystemMessage(mSessionID, "answering", mNotifyArgs);
+			doSetState(state);
+			return;
 		}
 	}
-
-	// you only "answer" voice invites in p2p mode
-	// so provide a special purpose message here
-	if (mReceivedCall && state == STATE_RINGING)
+	else // outgoing call
 	{
-		gIMMgr->addSystemMessage(mSessionID, "answering", mNotifyArgs);
-		doSetState(state);
-		return;
+		mCallDialogPayload["session_id"] = mSessionID;
+		mCallDialogPayload["session_name"] = mSessionName;
+		mCallDialogPayload["other_user_id"] = mOtherUserID;
+		if (state == STATE_RINGING)
+		{
+			// *HACK: open outgoing call floater if needed, might be better done elsewhere.
+			llinfos << "RINGINGGGGGGGG " << mSessionName << llendl;
+			if (!mSessionName.empty())
+			{
+				LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE);
+			}
+		}
 	}
+
 	LLVoiceChannel::setState(state);
 }
-- 
GitLab


From fa1e64ffaa73db8a86a47c9008e29b72e48e8176 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Fri, 13 Nov 2009 15:50:05 +0000
Subject: [PATCH 243/557] remove debug llinfos

---
 indra/newview/llvoicechannel.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index bb2965b9ce3..3397fc1e48e 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -892,7 +892,6 @@ void LLVoiceChannelP2P::setState(EState state)
 		if (state == STATE_RINGING)
 		{
 			// *HACK: open outgoing call floater if needed, might be better done elsewhere.
-			llinfos << "RINGINGGGGGGGG " << mSessionName << llendl;
 			if (!mSessionName.empty())
 			{
 				LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE);
-- 
GitLab


From 806edae08493b746edc46f3def332030f69a02df Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Fri, 13 Nov 2009 17:52:57 +0200
Subject: [PATCH 244/557] Work on major sub-task EXT-991 (Update bottom bar
 behavior on resize) Improved functionality to process Buttons showing via
 context menu  - added new alert dialog ("BottomTrayButtonCanNotBeShown") in
 case when there is no enough space to show button

For now it contains a such message:
"Selected button can not be shown right now.
The button will be shown when there is enough space for it."

It should be reviewed by XUI team

--HG--
branch : product-engine
---
 indra/newview/llbottomtray.cpp                       | 1 +
 indra/newview/skins/default/xui/en/notifications.xml | 9 +++++++++
 2 files changed, 10 insertions(+)

diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index c0ab0b27e5e..dd069594727 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -761,6 +761,7 @@ void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type
 	{
 		// mark this button to show it while future bottom tray extending
 		mResizeState |= shown_object_type;
+		LLNotifications::instance().add("BottomTrayButtonCanNotBeShown");
 	}
 }
 
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index ff0cd7ffebe..194378ea942 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -5739,6 +5739,15 @@ Are you sure you want to delete your teleport history?
      yestext="OK"/>
   </notification>
 
+  <notification
+   icon="alert.tga"
+   name="BottomTrayButtonCanNotBeShown"
+   type="alert">
+Selected button can not be shown right now.
+The button will be shown when there is enough space for it.
+  </notification>
+
+
   <global name="UnsupportedCPU">
 - Your CPU speed does not meet the minimum requirements.
   </global>
-- 
GitLab


From e66fc02224062e631a816fa9ed8de62f7cb83f83 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Fri, 13 Nov 2009 15:53:17 +0000
Subject: [PATCH 245/557] Remove reference to mozilla in the linux viewer
 launch-script.

---
 indra/newview/linux_tools/wrapper.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh
index 3209654498c..f84102e1fbe 100755
--- a/indra/newview/linux_tools/wrapper.sh
+++ b/indra/newview/linux_tools/wrapper.sh
@@ -118,7 +118,7 @@ if [ -n "$LL_TCMALLOC" ]; then
     fi
 fi
 
-export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"`pwd`"/app_settings/mozilla-runtime-linux-i686:"${LD_LIBRARY_PATH}"'
+export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"${LD_LIBRARY_PATH}"'
 export SL_CMD='$LL_WRAPPER bin/do-not-directly-run-secondlife-bin'
 export SL_OPT="`cat etc/gridargs.dat` $@"
 
-- 
GitLab


From 63ea6ccf58b8d275ddd96b3e6fc9eaf76d8508ff Mon Sep 17 00:00:00 2001
From: Dmitry Oleshko <doleshko@productengine.com>
Date: Fri, 13 Nov 2009 18:06:57 +0200
Subject: [PATCH 246/557] fixed normal bug (EXT-2372) Region restart toasts
 have no text

returned necessary attributes to the panel_notification.xml file that was corrupted by Chuck's commit (changeset 3862:a7bf90cddcdb)

--HG--
branch : product-engine
---
 .../default/xui/en/panel_notification.xml     | 24 ++++++++++---------
 1 file changed, 13 insertions(+), 11 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml
index 34a185fb44a..004773d4b7f 100644
--- a/indra/newview/skins/default/xui/en/panel_notification.xml
+++ b/indra/newview/skins/default/xui/en/panel_notification.xml
@@ -10,7 +10,7 @@
   left="0"
   name="notification_panel"
   top="0"
-  	height="10"
+  	height="140"
   width="305">
   <!-- THIS PANEL CONTROLS TOAST HEIGHT? -->
   <panel
@@ -20,18 +20,18 @@
   bg_alpha_color="0.3 0.3 0.3 0"
   bg_opaque_color="0.3 0.3 0.3 0"
     follows="left|right|top"
-    height="10"
+    height="100"
     label="info_panel"
     layout="topleft"
     left="0"
     name="info_panel"
     top="0"
     width="305">
-  <!--  <text
+    <text
       border_visible="false"
       follows="left|right|top|bottom"
       font="SansSerif"
-      height="90"
+      height="85"
       layout="topleft"
       left="10"
       name="text_box"
@@ -39,21 +39,21 @@
       text_color="white"
       top="10"
       visible="false" 
-      width="300"
+      width="285"
       wrap="true"/>
     <text
       border_visible="false"
       follows="left|right|top|bottom"
       font="SansSerifBold"
-      height="90"
+      height="85"
       layout="topleft"
-      left="45"
+      left="10"
       name="caution_text_box"
       text_color="1 0.82 0.46 1"
-      top="5"
+      top="10"
       visible="false"
-      width="300"
-      wrap="true"/>  -->
+      width="285"
+      wrap="true"/>
     <text_editor
     	h_pad="0"
 	v_pad="0"
@@ -63,6 +63,7 @@
       enabled="false"
       follows="left|right|top|bottom"
       font="SansSerif"
+      height="85" 
       layout="topleft"
       left="10"
       mouse_opaque="false"
@@ -79,12 +80,13 @@
   <panel
     background_visible="false"
     follows="left|right|bottom"
+    height="40" 
     label="control_panel"
     layout="topleft"
     left="0"
     left_delta="-38"
     name="control_panel"
-    top="20">
+    top_pad="0">
   </panel>
   <!--
   <icon
-- 
GitLab


From 606256b9e68ba9538c39bd91e81bb1882c12b910 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Fri, 13 Nov 2009 11:08:28 -0500
Subject: [PATCH 247/557] Removed llinfos spam on prefetched items (changed to
 lldebugs).

--HG--
branch : avatar-pipeline
---
 indra/newview/llinventorymodel.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index ed5b7df5fa7..3354a430010 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -3345,7 +3345,7 @@ void LLInventoryModel::processInventoryDescendents(LLMessageSystem* msg,void**)
 		// If the item has already been added (e.g. from link prefetch), then it doesn't need to be re-added.
 		if (gInventory.getItem(titem->getUUID()))
 		{
-			llinfos << "Skipping prefetched item [ Name: " << titem->getName() << " | Type: " << titem->getActualType() << " | ItemUUID: " << titem->getUUID() << " ] " << llendl;
+			lldebugs << "Skipping prefetched item [ Name: " << titem->getName() << " | Type: " << titem->getActualType() << " | ItemUUID: " << titem->getUUID() << " ] " << llendl;
 			continue;
 		}
 		gInventory.updateItem(titem);
-- 
GitLab


From cf6e4c5059befb5cf7b90fa7b7670398936312e5 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Fri, 13 Nov 2009 11:08:45 -0500
Subject: [PATCH 248/557] EXT-2349 : Diagnose warning spam: "[X] is in model
 and in view, but STRUCTURE flag not set" EXT-2432 : Diagnose warning spam:
 "[X] does not exist in either view or model, but notification triggered"

Restructured llinventorypanel's handling of add/remove/structure so it's easier to understand
Removed false positive "notification triggered" warning since objects can now exist outside of various inventory panels' directories.

--HG--
branch : avatar-pipeline
---
 indra/newview/llinventorypanel.cpp | 91 +++++++++++++-----------------
 1 file changed, 38 insertions(+), 53 deletions(-)

diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 583cb341b0a..7a7e1fae23b 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -302,7 +302,7 @@ void LLInventoryPanel::modelChanged(U32 mask)
 		return;
 	}
 
-	if(mask & LLInventoryObserver::LABEL)
+	if (mask & LLInventoryObserver::LABEL)
 	{
 		handled = true;
 		// label change - empty out the display name for each object
@@ -327,9 +327,15 @@ void LLInventoryPanel::modelChanged(U32 mask)
 			}
 		}
 	}
-	if((mask & (LLInventoryObserver::STRUCTURE
-				| LLInventoryObserver::ADD
-				| LLInventoryObserver::REMOVE)) != 0)
+
+	// We don't really care which of these masks the item is actually flagged with, since the masks
+	// may not be accurate (e.g. in the main inventory panel, I move an item from My Inventory into
+	// Landmarks; this is a STRUCTURE change for that panel but is an ADD change for the Landmarks
+	// panel).  What's relevant is that the item and UI are probably out of sync and thus need to be
+	// resynchronized.
+	if (mask & (LLInventoryObserver::STRUCTURE |
+				LLInventoryObserver::ADD |
+				LLInventoryObserver::REMOVE))
 	{
 		handled = true;
 		// Record which folders are open by uuid.
@@ -346,77 +352,56 @@ void LLInventoryPanel::modelChanged(U32 mask)
 				LLInventoryObject* model_item = model->getObject(*id_it);
 				LLFolderViewItem* view_item = mFolders->getItemByID(*id_it);
 
-				// ADD operation
+				// Item exists in memory but a UI element hasn't been created for it.
 				if (model_item && !view_item)
 				{
-					// this object was just created, need to build a view for it
-					if ((mask & LLInventoryObserver::ADD) != LLInventoryObserver::ADD)
-					{
-						llwarns << "( Operation: " << mask << " panel name: " << mStartFolderString << " ) Item in model but not in view, but ADD flag not set [ Name: " << model_item->getName() << " UUID: " << *id_it << " ]" << llendl;
-					}
+					// Add the UI element for this item.
 					buildNewViews(*id_it);
-					
-					// select any newly created object
-					// that has the auto rename at top of folder
-					// root set
+					// Select any newly created object that has the auto rename at top of folder root set.
 					if(mFolders->getRoot()->needsAutoRename())
 					{
 						setSelection(*id_it, FALSE);
 					}
 				}
 
-				// STRUCTURE operation
+				// This item already exists in both memory and UI.  It was probably moved
+				// around in the panel's directory structure (i.e. reparented).
 				if (model_item && view_item)
 				{
-					// this object was probably moved, check its parent
-					if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE)
-					{
-						llwarns << "( Operation: " << mask << " panel name: " << mStartFolderString << " ) Item in model and in view, but STRUCTURE flag not set [ Name:" << model_item->getName() << " UUID: " << *id_it << " ]" << llendl;
-					}
-					
 					LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
-					
-					// added check against NULL for cases when Inventory panel contains startFolder.
-					// in this case parent is LLFolderView (LLInventoryPanel::mFolders) itself.
-					// this check is a fix for bug EXT-1859.
-					if (NULL != new_parent && view_item->getParentFolder() != new_parent)
+
+					// Item has been moved.
+					if (view_item->getParentFolder() != new_parent)
 					{
-						view_item->getParentFolder()->extractItem(view_item);
-						view_item->addToFolder(new_parent, mFolders);
+						if (new_parent != NULL)
+						{
+							// Item is to be moved and we found its new parent in the panel's directory, so move the item's UI.
+							view_item->getParentFolder()->extractItem(view_item);
+							view_item->addToFolder(new_parent, mFolders);
+						}
+						else 
+						{
+							// Item is to be moved outside the panel's directory (e.g. moved to trash for a panel that 
+							// doesn't include trash).  Just remove the item's UI.
+							view_item->destroyView();
+						}
 					}
-					/*
-					  on the other side in case Inventory Panel has content of the any folder
-					  it is possible that item moved to some folder which is absent in current
-					  Panel. For ex. removing item (via moving to trash).
-					  In this case we need to check if new parent is other then inventory start folder
-					  and simply remove its View from the hierarchy.
-					  See details in EXT-2098.
-					*/
-					// So, let check if item was moved into folder out of this Inventory Panel.
-					else if (mStartFolderID.notNull() && NULL == new_parent && model_item->getParentUUID() != mStartFolderID)
+					else
 					{
-						view_item->getParentFolder()->extractItem(view_item);
+						// Hmm, we got an ADD/REMOVE/STRUCTURE notification for this item but there's nothing to be done to it.
+						llwarns << "Notification triggered for item that isn't changing.  "
+								<< "Operation: ( mask: " << mask << " panel name: " << mStartFolderString << " ) "
+								<< "Item: [ Name:" << model_item->getName() << " UUID: " << *id_it << " ]" << llendl;
+						
 					}
 				}
 
-				// REMOVE operation
+				// This item has been removed from memory, but its associated UI element still exists.
 				if (!model_item && view_item)
 				{
-					if ((mask & LLInventoryObserver::REMOVE) != LLInventoryObserver::REMOVE)
-					{
-						llwarns << "( Operation: " << mask << " panel name: " << mStartFolderString << " ) Item is not in model but in view, but REMOVE flag not set [ UUID: " << *id_it << " ] " << llendl;
-					}
-					// item in view but not model, need to delete view
+					// Remove the item's UI.
 					view_item->destroyView();
 				}
-
-				// False positive.  This item probably just doesn't exist in the 
-				// particular inventory panel (e.g. is outside the root folder of the inventory panel).
-				// Ignore the operation.
-				if (!model_item && !view_item)
-				{
-					// llwarns << "( Operation: " << mask << " panel name: " << mStartFolderString << " ) Item does not exist in either view or model, but notification triggered [ UUID: " << *id_it << " ] " << llendl;
-				}
 			}
 		}
 	}
-- 
GitLab


From e310e18481b5a69b2a7e0ae89d8491cc601d3af0 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Fri, 13 Nov 2009 18:11:11 +0200
Subject: [PATCH 249/557] implemented EXT-1286 "Need support for [ITEM_ICON],
 [AN_OBJECTTYPE], [ITEM_SLURL], in notifications.xml"

--HG--
branch : product-engine
---
 indra/newview/llnotificationofferhandler.cpp              | 4 ++--
 indra/newview/llviewermessage.cpp                         | 4 +++-
 indra/newview/skins/default/xui/en/notifications.xml      | 8 +++++---
 indra/newview/skins/default/xui/en/panel_notification.xml | 4 +++-
 4 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index 471dd284265..94e733913d4 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -96,11 +96,11 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
 		if (!LLIMMgr::instance().hasSession(session_id))
 		{
 			session_id = LLIMMgr::instance().addSession(
-					notification->getSubstitutions()["NAME"], IM_NOTHING_SPECIAL,
+					notification->getSubstitutions()["OBJECTFROMNAME"], IM_NOTHING_SPECIAL,
 					notification->getPayload()["from_id"]);
 		}
 		LLIMMgr::instance().addMessage(session_id, LLUUID(),
-				notification->getSubstitutions()["NAME"],
+				notification->getSubstitutions()["OBJECTFROMNAME"],
 				notification->getMessage());
 
 		LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 4088eafe16c..b1efec83e60 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1365,7 +1365,9 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)
 
 	payload["from_id"] = info->mFromID;
 	args["OBJECTFROMNAME"] = info->mFromName;
-	args["NAME"] = info->mFromName;
+	args["NAME"] = LLSLURL::buildCommand("agent", info->mFromID, "about");
+	std::string verb = "highlight?name=" + msg;
+	args["ITEM_SLURL"] = LLSLURL::buildCommand("inventory", info->mObjectID, verb.c_str());
 
 	LLNotification::Params p("ObjectGiveItem");
 	p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, info, _1, _2));
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index ff0cd7ffebe..9c4e394f0d9 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -4957,8 +4957,9 @@ No valid parcel could be found.
   <notification
    icon="notify.tga"
    name="ObjectGiveItem"
-   type="notify">
-An object named [OBJECTFROMNAME] owned by [FIRST] [LAST] has given you a [OBJECTTYPE] named [OBJECTNAME].
+   type="offer">
+An object named [OBJECTFROMNAME] owned by [NAME] has offered you [OBJECTTYPE]:
+[ITEM_SLURL]
     <form name="form">
       <button
        index="0"
@@ -5000,7 +5001,8 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a
    icon="notify.tga"
    name="UserGiveItem"
    type="offer">
-[NAME] has given you a [OBJECTTYPE] named &apos;[OBJECTNAME]&apos;.
+[NAME] has offered you [OBJECTTYPE]:
+[ITEM_SLURL]
     <form name="form">
       <button
        index="0"
diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml
index 34a185fb44a..40f8da0c2c6 100644
--- a/indra/newview/skins/default/xui/en/panel_notification.xml
+++ b/indra/newview/skins/default/xui/en/panel_notification.xml
@@ -74,7 +74,9 @@
       top="10"
       visible="false"
       width="285"
-      wrap="true"/>
+      wrap="true"
+      parse_highlights="true"
+      allow_html="true"/>
   </panel>
   <panel
     background_visible="false"
-- 
GitLab


From 69f4b29761aa31d2ac46268eccf5b1cb7edf30f1 Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Fri, 13 Nov 2009 11:11:11 -0500
Subject: [PATCH 250/557] EXT-2434 update rendering cost to reflect changes in
 avatar rendering

finished the updates to avatar rendering cost and formalized the
display of selected object render cost in the build tools floater.

Both checkins reviewed by Vir.
---
 indra/newview/llfloatertools.cpp | 6 ++++--
 indra/newview/llvoavatar.cpp     | 2 +-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 672160073ea..9854d2594b2 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -425,13 +425,14 @@ void LLFloaterTools::refresh()
 	// calculate selection rendering cost
 	std::string prim_cost_string;
 	LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost());
-	childSetTextArg("render_cost", "[COUNT]", prim_cost_string);
+	childSetTextArg("RenderingCost", "[COUNT]", prim_cost_string);
 
 
 	// disable the object and prim counts if nothing selected
 	bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty();
 	childSetEnabled("obj_count", have_selection);
 	childSetEnabled("prim_count", have_selection);
+	childSetEnabled("RenderingCost", have_selection);
 
 	// Refresh child tabs
 	mPanelPermissions->refresh();
@@ -562,6 +563,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
 
 	mBtnEdit	->setToggleState( edit_visible );
 	mRadioGroupEdit->setVisible( edit_visible );
+	childSetVisible("RenderingCost", edit_visible || focus_visible || move_visible);
 
 	if (mCheckSelectIndividual)
 	{
@@ -983,7 +985,7 @@ S32 LLFloaterTools::calcRenderCost()
 			LLVOVolume *viewer_volume = (LLVOVolume*)select_node->getObject();
 			if (viewer_volume)
 			{
-					cost += viewer_volume->getRenderCost();
+				cost += viewer_volume->getRenderCost();
 			}
 		}
 	}
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index d7e31e8436f..b6c1ee2f117 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -7644,7 +7644,7 @@ void LLVOAvatar::idleUpdateRenderCost()
 		ETextureIndex tex_index = baked_dict->mTextureIndex;
 		if (isTextureVisible(tex_index))
 		{
-			shame +=25;
+			shame +=20;
 		}
 	}
 
-- 
GitLab


From 9fd06f55f9fc1434a247f20db9209b30b6f1f5aa Mon Sep 17 00:00:00 2001
From: Lynx Linden <lynx@lindenlab.com>
Date: Fri, 13 Nov 2009 16:11:14 +0000
Subject: [PATCH 251/557] DEV-41324: Rename Spatial Chat to Nearby Voice Chat,
 as per spec.

---
 .../skins/default/xui/en/floater_incoming_call.xml     |  2 +-
 .../skins/default/xui/en/floater_outgoing_call.xml     |  2 +-
 indra/newview/skins/default/xui/en/notifications.xml   | 10 +++++-----
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_incoming_call.xml b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
index 9c2898945ba..526fda90d1d 100644
--- a/indra/newview/skins/default/xui/en/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
@@ -12,7 +12,7 @@
  width="410">
     <floater.string
      name="localchat">
-        Local Voice Chat
+        Nearby Voice Chat
     </floater.string>
     <floater.string
      name="anonymous">
diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
index 67137003720..a6eea222c63 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -12,7 +12,7 @@
  width="410">
     <floater.string
      name="localchat">
-        Local Voice Chat
+        Nearby Voice Chat
     </floater.string>
     <floater.string
      name="anonymous">
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 96c6d970c2a..81577030fbd 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -5580,7 +5580,7 @@ We&apos;re sorry.  This area has reached maximum capacity for voice conversation
    icon="notifytip.tga"
    name="VoiceChannelDisconnected"
    type="notifytip">
-You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnected to spatial voice chat.
+You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnected to Nearby Voice Chat.
     <unique>
       <context key="VOICE_CHANNEL_NAME"/>
     </unique>
@@ -5590,7 +5590,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnect
    icon="notifytip.tga"
    name="VoiceChannelDisconnectedP2P"
    type="notifytip">
-[VOICE_CHANNEL_NAME] has ended the call.  You will now be reconnected to spatial voice chat.
+[VOICE_CHANNEL_NAME] has ended the call.  You will now be reconnected to Nearby Voice Chat.
     <unique>
       <context key="VOICE_CHANNEL_NAME"/>
     </unique>
@@ -5600,7 +5600,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnect
    icon="notifytip.tga"
    name="P2PCallDeclined"
    type="notifytip">
-[VOICE_CHANNEL_NAME] has declined your call.  You will now be reconnected to spatial voice chat.
+[VOICE_CHANNEL_NAME] has declined your call.  You will now be reconnected to Nearby Voice Chat.
     <unique>
       <context key="VOICE_CHANNEL_NAME"/>
     </unique>
@@ -5610,7 +5610,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnect
    icon="notifytip.tga"
    name="P2PCallNoAnswer"
    type="notifytip">
-[VOICE_CHANNEL_NAME] is not available to take your call.  You will now be reconnected to spatial voice chat.
+[VOICE_CHANNEL_NAME] is not available to take your call.  You will now be reconnected to Nearby Voice Chat.
     <unique>
       <context key="VOICE_CHANNEL_NAME"/>
     </unique>
@@ -5620,7 +5620,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnect
    icon="notifytip.tga"
    name="VoiceChannelJoinFailed"
    type="notifytip">
-Failed to connect to [VOICE_CHANNEL_NAME], please try again later.  You will now be reconnected to spatial voice chat.
+Failed to connect to [VOICE_CHANNEL_NAME], please try again later.  You will now be reconnected to Nearby Voice Chat.
     <unique>
       <context key="VOICE_CHANNEL_NAME"/>
     </unique>
-- 
GitLab


From 3add88cd9775639b10e8bb8090bc39470588ffa4 Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Fri, 13 Nov 2009 18:12:55 +0200
Subject: [PATCH 252/557] Fixed normal bug EXT-1014 (Unable to move undocked
 camera controls bar)

--HG--
branch : product-engine
---
 indra/newview/lljoystickbutton.cpp            | 23 +++++++++++++++----
 indra/newview/lljoystickbutton.h              |  2 ++
 .../skins/default/xui/en/floater_camera.xml   |  1 +
 3 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp
index bd6702a0b2f..d7eaad94f01 100644
--- a/indra/newview/lljoystickbutton.cpp
+++ b/indra/newview/lljoystickbutton.cpp
@@ -134,16 +134,31 @@ void LLJoystick::updateSlop()
 	return;
 }
 
+BOOL LLJoystick::pointInCircle(S32 x, S32 y) const 
+{ 
+	//cnt is x and y coordinates of center of joystick circle, and also its radius,
+	//because area is not just rectangular, it's a square!
+	//Make sure to change method if this changes.
+	int cnt = this->getLocalRect().mTop/2;
+	if((x-cnt)*(x-cnt)+(y-cnt)*(y-cnt)<=cnt*cnt)
+		return TRUE;
+	return FALSE;
+}
 
 BOOL LLJoystick::handleMouseDown(S32 x, S32 y, MASK mask)
 {
 	//llinfos << "joystick mouse down " << x << ", " << y << llendl;
+	bool handles = false;
 
-	mLastMouse.set(x, y);
-	mFirstMouse.set(x, y);
+	if(handles = pointInCircle(x, y))
+	{
+		mLastMouse.set(x, y);
+		mFirstMouse.set(x, y);
+		mMouseDownTimer.reset();
+		handles = LLButton::handleMouseDown(x, y, mask);
+	}
 
-	mMouseDownTimer.reset();
-	return LLButton::handleMouseDown(x, y, mask);
+	return handles;
 }
 
 
diff --git a/indra/newview/lljoystickbutton.h b/indra/newview/lljoystickbutton.h
index 4c657913b8c..0465f78031f 100644
--- a/indra/newview/lljoystickbutton.h
+++ b/indra/newview/lljoystickbutton.h
@@ -78,6 +78,8 @@ class LLJoystick
 
 	static void		onBtnHeldDown(void *userdata);		// called by llbutton callback handler
 	void            setInitialQuadrant(EJoystickQuadrant initial) { mInitialQuadrant = initial; };
+
+	BOOL			pointInCircle(S32 x, S32 y) const;
 	
 	static std::string nameFromQuadrant(const EJoystickQuadrant quadrant);
 	static EJoystickQuadrant quadrantFromName(const std::string& name);
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index 2af451400ec..f553184c19a 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -107,6 +107,7 @@
          image_unselected="Cam_Rotate_Out"
          layout="topleft"
          left="45"
+         mouse_opaque="false" 
          name="cam_rotate_stick"
          quadrant="left"
          scale_image="false"
-- 
GitLab


From 036b0b7d8d16bc37ccc618b616db864c67c940e4 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Fri, 13 Nov 2009 11:43:32 -0500
Subject: [PATCH 253/557] removed dead code that was triggering a warning on
 some platforms

--HG--
branch : avatar-pipeline
---
 indra/newview/llappearancemgr.cpp | 38 -------------------------------
 1 file changed, 38 deletions(-)

diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 456eaa43c67..8d66cefa4f8 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -323,44 +323,6 @@ static void removeDuplicateItems(LLInventoryModel::item_array_t& items)
 	items = new_items;
 }
 
-static void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventoryModel::item_array_t& src)
-{
-	LLInventoryModel::item_array_t new_dst;
-	std::set<LLUUID> mark_inventory;
-
-	S32 inventory_dups = 0;
-	
-	for (LLInventoryModel::item_array_t::const_iterator src_pos = src.begin();
-		  src_pos != src.end();
-		  ++src_pos)
-	{
-		LLUUID src_item_id = (*src_pos)->getLinkedUUID();
-		mark_inventory.insert(src_item_id);
-	}
-
-	for (LLInventoryModel::item_array_t::const_iterator dst_pos = dst.begin();
-		  dst_pos != dst.end();
-		  ++dst_pos)
-	{
-		LLUUID dst_item_id = (*dst_pos)->getLinkedUUID();
-
-		if (mark_inventory.find(dst_item_id) == mark_inventory.end())
-		{
-			// Item is not already present in COF.
-			new_dst.put(*dst_pos);
-			mark_inventory.insert(dst_item_id);
-		}
-		else
-		{
-			inventory_dups++;
-		}
-	}
-	llinfos << "removeDups, original " << dst.count() << " final " << new_dst.count()
-			<< " inventory dups " << inventory_dups << llendl;
-	
-	dst = new_dst;
-}
-
 static void onWearableAssetFetch(LLWearable* wearable, void* data)
 {
 	LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data;
-- 
GitLab


From 8a0341f42e2ba3a91a3ad5bc355966b07ac6801f Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Fri, 13 Nov 2009 18:58:23 +0200
Subject: [PATCH 254/557] Work on major sub-task EXT-991 (Update bottom bar
 behavior on resize) Fixed issue: "Snapshort button can appear first due to
 its the least width while Bottom Bar extending" 	- implemented ordering
 in which buttons can be shown: Gesture, Move, View, Snapshot.

--HG--
branch : product-engine
---
 indra/newview/llbottomtray.cpp | 21 ++++++++++++++++++++-
 indra/newview/llbottomtray.h   |  9 +++++++++
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index dd069594727..fd711b72b0e 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -696,7 +696,26 @@ bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const
 	bool can_be_shown = mResizeState & processed_object_type;
 	if (can_be_shown)
 	{
-		// *TODO: mantipov: synchronize with situation when button was hidden via context menu;
+		static MASK MOVEMENT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES;
+		static MASK CAMERA_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT;
+		static MASK SNAPSHOT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT | RS_BUTTON_CAMERA;
+
+		switch(processed_object_type)
+		{
+		case RS_BUTTON_GESTURES: // Gestures should be shown first
+			break;
+		case RS_BUTTON_MOVEMENT: // Move only if gesture is shown
+			can_be_shown = !(MOVEMENT_PREVIOUS_BUTTONS_MASK & mResizeState);
+			break;
+		case RS_BUTTON_CAMERA:
+			can_be_shown = !(CAMERA_PREVIOUS_BUTTONS_MASK & mResizeState);
+			break;
+		case RS_BUTTON_SNAPSHOT:
+			can_be_shown = !(SNAPSHOT_PREVIOUS_BUTTONS_MASK & mResizeState);
+			break;
+		default: // nothing to do here
+			break;
+		}
 	}
 	return can_be_shown;
 }
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 86d341f2334..974289d5e0f 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -108,6 +108,13 @@ class LLBottomTray
 	void log(LLView* panel, const std::string& descr);
 	bool processShowButton(EResizeState shown_object_type, S32* available_width, S32* buttons_required_width);
 	void processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width);
+
+	/**
+	 * Determines if specified by type object can be shown. It should be hidden by shrink before.
+	 *
+	 * Processes buttons a such way to show buttons in constant order:
+	 *   - Gestures, Move, View, Snapshot
+	 */
 	bool canButtonBeShown(EResizeState processed_object_type) const;
 	void initStateProcessedObjectMap();
 
@@ -121,6 +128,8 @@ class LLBottomTray
 	 *
 	 * If it is impossible to show required button due to there is no enough room in bottom tray
 	 * it will no be shown. Is called via context menu commands.
+	 * In this case Alert Dialog will be shown to notify user about that.
+	 *
 	 * Method also stores resize state to be processed while future bottom tray extending:
 	 *  - if hidden while resizing button should be hidden it will not be shown while extending;
 	 *  - if hidden via context menu button should be shown but there is no enough room for now
-- 
GitLab


From 543fdfd512ae63a6a2e077c50027fc5ceb0a8e2a Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Fri, 13 Nov 2009 09:07:14 -0800
Subject: [PATCH 255/557] More explicit test code for dummy widget creation.
 Added "Inspectors Test" back to login debug menu.

---
 indra/newview/llfloatertestinspectors.cpp         | 3 ++-
 indra/newview/skins/default/xui/en/menu_login.xml | 7 +++++++
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llfloatertestinspectors.cpp b/indra/newview/llfloatertestinspectors.cpp
index e68faba712b..09996b0b92c 100644
--- a/indra/newview/llfloatertestinspectors.cpp
+++ b/indra/newview/llfloatertestinspectors.cpp
@@ -53,7 +53,8 @@ LLFloaterTestInspectors::~LLFloaterTestInspectors()
 
 BOOL LLFloaterTestInspectors::postBuild()
 {
-	getChild<LLUICtrl>("intentionally-not-found");
+	// Test the dummy widget construction code
+	getChild<LLUICtrl>("intentionally-not-found")->setEnabled(true);
 
 //	getChild<LLUICtrl>("avatar_2d_btn")->setCommitCallback(
 //		boost::bind(&LLFloaterTestInspectors::onClickAvatar2D, this));
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index bd60574a955..07940e18b62 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -193,6 +193,13 @@
              function="ShowFloater"
              parameter="test_widgets" />
         </menu_item_call>
+        <menu_item_call
+         label="Inspectors Test"
+         name="Inspectors Test">
+            <menu_item_call.on_click
+             function="ShowFloater"
+             parameter="test_inspectors" />
+        </menu_item_call>
       <menu_item_check
          label="Reg In Client Test (restart)"
          name="Reg In Client Test (restart)">
-- 
GitLab


From 1b0b439c23a8f4d27950e0205cd4ba2be6e034a3 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Fri, 13 Nov 2009 17:53:12 +0000
Subject: [PATCH 256/557] make the outgoing call dialog appear and disappear
 smarter. this is sort of less like the spec but more like... reality...

---
 indra/newview/llimview.cpp                    |  1 +
 indra/newview/llvoicechannel.cpp              | 28 ++++++++++++++++++-
 .../default/xui/en/floater_outgoing_call.xml  | 12 ++++++++
 3 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index ee785e7ecbb..982fa54a93a 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1124,6 +1124,7 @@ void LLOutgoingCallDialog::onOpen(const LLSD& key)
 
 	LLSD callee_id = mPayload["other_user_id"];
 	childSetTextArg("calling", "[CALLEE_NAME]", callee_name);
+	childSetTextArg("connecting", "[CALLEE_NAME]", callee_name);
 	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
 	icon->setValue(callee_id);
 
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index 3397fc1e48e..ae32ec7d117 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -892,11 +892,37 @@ void LLVoiceChannelP2P::setState(EState state)
 		if (state == STATE_RINGING)
 		{
 			// *HACK: open outgoing call floater if needed, might be better done elsewhere.
+			// *TODO: should move this squirrelly ui-fudging crap into LLOutgoingCallDialog itself
 			if (!mSessionName.empty())
 			{
-				LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE);
+				LLOutgoingCallDialog *ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
+				if (ocd)
+				{
+					ocd->getChild<LLTextBox>("calling")->setVisible(true);
+					ocd->getChild<LLTextBox>("leaving")->setVisible(true);
+					ocd->getChild<LLTextBox>("connecting")->setVisible(false);
+				}
 			}
 		}
+		/*else if (state == STATE_CONNECTED)
+		{
+				LLOutgoingCallDialog *ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
+				if (ocd)
+				{
+					ocd->getChild<LLTextBox>("calling")->setVisible(false);
+					ocd->getChild<LLTextBox>("leaving")->setVisible(false);
+					ocd->getChild<LLTextBox>("connecting")->setVisible(true);
+				}			
+				}*/
+		else if (state == STATE_HUNG_UP ||
+			 state == STATE_CONNECTED)
+		{
+				LLOutgoingCallDialog *ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
+				if (ocd)
+				{
+					ocd->closeFloater();
+				}			
+		}
 	}
 
 	LLVoiceChannel::setState(state);
diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
index 525cfbab186..82417de8a7d 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -35,6 +35,18 @@
      left_delta="19"
      top="35"
      width="36" />
+    <text
+     font="SansSerifLarge"
+     height="20"
+     layout="topleft"
+     left="77"
+     name="connecting"
+     top="27"
+     visible="false"
+     width="315"
+     word_wrap="true">
+Connecting to [CALLEE_NAME]
+    </text>
     <text
      font="SansSerifLarge"
      height="20"
-- 
GitLab


From be72748d2a69ddda51c4b41c0c8f2beba077b265 Mon Sep 17 00:00:00 2001
From: callum <none@none>
Date: Fri, 13 Nov 2009 11:03:39 -0800
Subject: [PATCH 257/557] Fix for DEV-42152 (Streaming media broken on
 QuickTime)

---
 .../quicktime/media_plugin_quicktime.cpp         | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
index de927de1cd6..dac05095317 100644
--- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
+++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
@@ -528,11 +528,17 @@ class MediaPluginQuickTime : public MediaPluginBase
 		if ( ! mMovieController )
 			return;
 
-		// service QuickTime
-		// Calling it this way doesn't have good behavior on Windows...
-//		MoviesTask( mMovieHandle, milliseconds );
-		// This was the original, but I think using both MoviesTask and MCIdle is redundant.  Trying with only MCIdle.
-//		MoviesTask( mMovieHandle, 0 );
+		// this wasn't required in 1.xx viewer but we have to manually 
+		// work the Windows message pump now
+		#if defined( LL_WINDOWS )
+		MSG msg;
+		while ( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) 
+		{
+			GetMessage( &msg, NULL, 0, 0 );
+			TranslateMessage( &msg );
+			DispatchMessage( &msg );
+		};
+		#endif
 
 		MCIdle( mMovieController );
 
-- 
GitLab


From 7722105e4ea4b5268f2eb1862eae2d55b3bfc933 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Fri, 13 Nov 2009 19:38:13 +0000
Subject: [PATCH 258/557] set the outgoing call window's dock point in
 postBuild() instead of onOpen() to avoid it being in the wrong place for a
 frame.

---
 indra/newview/llimview.cpp | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 982fa54a93a..dc32291714b 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1127,11 +1127,6 @@ void LLOutgoingCallDialog::onOpen(const LLSD& key)
 	childSetTextArg("connecting", "[CALLEE_NAME]", callee_name);
 	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
 	icon->setValue(callee_id);
-
-	// dock the dialog to the sys well, where other sys messages appear
-	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
-					 this, getDockTongue(), LLDockControl::TOP,
-					 boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1)));
 }
 
 
@@ -1156,6 +1151,11 @@ BOOL LLOutgoingCallDialog::postBuild()
 
 	childSetAction("Cancel", onCancel, this);
 
+	// dock the dialog to the sys well, where other sys messages appear
+	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
+					 this, getDockTongue(), LLDockControl::TOP,
+					 boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1)));
+
 	return success;
 }
 
-- 
GitLab


From 0fb0ce836d286063a21c540cadbdbd12160cb9e1 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Fri, 13 Nov 2009 14:42:28 -0500
Subject: [PATCH 259/557] EXT-2428 : Wearing a look should update the "Current
 Look" sidepanel string

Both double-clicking on an outfit to wear, and wearing an outfit from side panel, will now update the current look string.

--HG--
branch : avatar-pipeline
---
 indra/newview/llappearancemgr.cpp | 21 +++++++++++++++------
 indra/newview/llsidetray.cpp      | 18 ++++++++++++++++++
 indra/newview/llsidetray.h        |  7 ++++++-
 3 files changed, 39 insertions(+), 7 deletions(-)

diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 456eaa43c67..aac0fd60884 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -32,18 +32,20 @@
 
 #include "llviewerprecompiledheaders.h"
 
+#include "llagent.h"
+#include "llagentwearables.h"
 #include "llappearancemgr.h"
-#include "llinventorymodel.h"
-#include "llnotifications.h"
+#include "llfloatercustomize.h"
 #include "llgesturemgr.h"
 #include "llinventorybridge.h"
-#include "llwearablelist.h"
-#include "llagentwearables.h"
-#include "llagent.h"
+#include "llinventorymodel.h"
+#include "llnotifications.h"
+#include "llpanelappearance.h"
+#include "llsidetray.h"
 #include "llvoavatar.h"
 #include "llvoavatarself.h"
 #include "llviewerregion.h"
-#include "llfloatercustomize.h"
+#include "llwearablelist.h"
 
 class LLWearInventoryCategoryCallback : public LLInventoryCallback
 {
@@ -564,6 +566,13 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
 	{
 		link_inventory_item(gAgent.getID(), category, cof, catp->getName(),
 							LLAssetType::AT_LINK_FOLDER, link_waiter);
+
+		// Update the current outfit name of the appearance sidepanel.
+		LLPanelAppearance* panel_appearance = dynamic_cast<LLPanelAppearance *>(LLSideTray::getInstance()->getPanel("panel_appearance"));
+		if (panel_appearance)
+		{
+			panel_appearance->refreshCurrentLookName(catp->getName());
+		}
 	}
 							  
 }
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 70dc04f575f..7711f3c7330 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -673,6 +673,24 @@ LLPanel*	LLSideTray::showPanel		(const std::string& panel_name, const LLSD& para
 	return NULL;
 }
 
+LLPanel*	LLSideTray::getPanel		(const std::string& panel_name)
+{
+	child_vector_const_iter_t child_it;
+	for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
+	{
+		LLView* view = (*child_it)->findChildView(panel_name,true);
+		if(view)
+		{
+			LLPanel* panel = dynamic_cast<LLPanel*>(view);
+			if(panel)
+			{
+				return panel;
+			}
+		}
+	}
+	return NULL;
+}
+
 // *TODO: Eliminate magic constants.
 static const S32	fake_offset = 132;
 static const S32	fake_top_offset = 18;
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index 8b30199c456..54652c11085 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -36,8 +36,8 @@
 #include "llpanel.h"
 #include "string"
 
-class LLSideTrayTab;
 class LLAccordionCtrl;
+class LLSideTrayTab;
 
 // added inheritance from LLDestroyClass<LLSideTray> to enable Side Tray perform necessary actions 
 // while disconnecting viewer in LLAppViewer::disconnectViewer().
@@ -97,6 +97,11 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>
     LLPanel*	showPanel		(const std::string& panel_name, const LLSD& params);
 
 	/*
+	 * get the panel (don't show it or do anything else with it)
+	 */
+    LLPanel*	getPanel		(const std::string& panel_name);
+
+	/*
      * collapse SideBar, hiding visible tab and moving tab buttons
      * to the right corner of the screen
      */
-- 
GitLab


From 1303b7371c882c7ae64657ae1aa97ab43a2a3f92 Mon Sep 17 00:00:00 2001
From: Leyla Farazha <leyla@lindenlab.com>
Date: Fri, 13 Nov 2009 11:45:52 -0800
Subject: [PATCH 260/557] Backed out changeset fb21e02f8f08

---
 indra/newview/skins/default/xui/en/main_view.xml | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
index 9e35c95d45a..08f7ee456e4 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -51,13 +51,6 @@
                name="main_view"
                user_resize="true"
                width="500">
-          <view bottom="500"
-                follows="all"
-                height="500"
-                left="0"
-                mouse_opaque="false"
-                name="world_view_rect"
-                width="500"/>
           <layout_stack border_size="0"
                         bottom="500"
                         follows="all"
@@ -73,6 +66,13 @@
                    mouse_opaque="false"
                    name="hud container"
                    width="500">
+              <view bottom="500"
+                    follows="all"
+                    height="500"
+                    left="0"
+                    mouse_opaque="false"
+                    name="world_view_rect"
+                    width="500"/>
               <panel follows="right|top|bottom"
                      height="500"
                      mouse_opaque="false"
-- 
GitLab


From ca630bf6bb1c7c8e04f5ed1e7d649d29d504a6e1 Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Fri, 13 Nov 2009 11:52:12 -0800
Subject: [PATCH 261/557] Add background to media controls

This actually required some help from James and Richard.  Thanks, guys!

This adds custom-drawing of a background image underneath the
icons that make up the media controls in the layout stack.
In order to have this work, we had to publicize API in lllayoutstack
to force relayout to calculate the size.

I also did another cleanup pass ("Boy Scout Rule") that
squirreled away all pertinent controls into membed variables,
instead of doing a getChild() every time updateShape() is called.

Readjusted a bunch of components as well.
---
 indra/llui/lllayoutstack.h                    |   5 +-
 indra/newview/llpanelprimmediacontrols.cpp    | 373 +++++++++---------
 indra/newview/llpanelprimmediacontrols.h      |  45 ++-
 .../xui/en/panel_prim_media_controls.xml      | 274 +++++++------
 4 files changed, 382 insertions(+), 315 deletions(-)

diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index 3a073fa1b28..9cbcb285dca 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -81,8 +81,8 @@ class LLLayoutStack : public LLView, public LLInstanceTracker<LLLayoutStack>
 	S32 getNumPanels() { return mPanels.size(); }
 
 	void updatePanelAutoResize(const std::string& panel_name, BOOL auto_resize);
-
-
+	
+	void updateLayout(BOOL force_resize = FALSE);
 	static void updateClass();
 
 protected:
@@ -92,7 +92,6 @@ class LLLayoutStack : public LLView, public LLInstanceTracker<LLLayoutStack>
 private:
 	struct LayoutPanel;
 
-	void updateLayout(BOOL force_resize = FALSE);
 	void calcMinExtents();
 	S32 getDefaultHeight(S32 cur_height);
 	S32 getDefaultWidth(S32 cur_width);
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 24de2dcdfc5..9744d9ac0d6 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -44,6 +44,7 @@
 #include "llbutton.h"
 #include "llface.h"
 #include "llcombobox.h"
+#include "lllayoutstack.h"
 #include "llslider.h"
 #include "llhudview.h"
 #include "lliconctrl.h"
@@ -84,8 +85,7 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
 	mUpdateSlider(true),
 	mClearFaceOnFade(false),
 	mCurrentRate(0.0),
-	mMovieDuration(0.0),
-	mUpdatePercent(0)
+	mMovieDuration(0.0)
 {
 	mCommitCallbackRegistrar.add("MediaCtrl.Close",		boost::bind(&LLPanelPrimMediaControls::onClickClose, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.Back",		boost::bind(&LLPanelPrimMediaControls::onClickBack, this));
@@ -117,37 +117,69 @@ LLPanelPrimMediaControls::~LLPanelPrimMediaControls()
 
 BOOL LLPanelPrimMediaControls::postBuild()
 {
-	LLButton* scroll_up_ctrl = getChild<LLButton>("scrollup");
-	if (scroll_up_ctrl)
+	mMediaRegion			= getChild<LLView>("media_region"); assert(mMediaRegion);
+	mBackCtrl				= getChild<LLUICtrl>("back"); assert(mBackCtrl);
+	mFwdCtrl				= getChild<LLUICtrl>("fwd"); assert(mFwdCtrl);
+	mReloadCtrl				= getChild<LLUICtrl>("reload"); assert(mReloadCtrl);
+	mPlayCtrl				= getChild<LLUICtrl>("play"); assert(mPlayCtrl);
+	mPauseCtrl				= getChild<LLUICtrl>("pause"); assert(mPauseCtrl);
+	mStopCtrl				= getChild<LLUICtrl>("stop"); assert(mStopCtrl);
+	mMediaStopCtrl			= getChild<LLUICtrl>("media_stop"); assert(mMediaStopCtrl);
+	mHomeCtrl				= getChild<LLUICtrl>("home"); assert(mHomeCtrl);
+	mUnzoomCtrl				= getChild<LLUICtrl>("close"); assert(mUnzoomCtrl); // This is actually "unzoom" 
+	mOpenCtrl				= getChild<LLUICtrl>("new_window"); assert(mOpenCtrl);
+	mZoomCtrl				= getChild<LLUICtrl>("zoom_frame"); assert(mZoomCtrl);
+	mMediaProgressPanel		= getChild<LLPanel>("media_progress_indicator"); assert(mMediaProgressPanel);
+	mMediaProgressBar		= getChild<LLProgressBar>("media_progress_bar"); assert(mMediaProgressBar);
+	mMediaAddressCtrl		= getChild<LLUICtrl>("media_address"); assert(mMediaAddressCtrl);
+	mMediaAddress			= getChild<LLUICtrl>("media_address_url"); assert(mMediaAddress);
+	mMediaPlaySliderPanel	= getChild<LLUICtrl>("media_play_position"); assert(mMediaPlaySliderPanel);
+	mMediaPlaySliderCtrl	= getChild<LLUICtrl>("media_play_slider"); assert(mMediaPlaySliderCtrl);
+	mVolumeCtrl				= getChild<LLUICtrl>("media_volume"); assert(mVolumeCtrl);
+	mVolumeBtn				= getChild<LLButton>("media_volume_button"); assert(mVolumeBtn);
+	mVolumeUpCtrl			= getChild<LLUICtrl>("volume_up"); assert(mVolumeUpCtrl);
+	mVolumeDownCtrl			= getChild<LLUICtrl>("volume_down"); assert(mVolumeDownCtrl);
+	mWhitelistIcon			= getChild<LLIconCtrl>("media_whitelist_flag"); assert(mWhitelistIcon);
+	mSecureLockIcon			= getChild<LLIconCtrl>("media_secure_lock_flag"); assert(mSecureLockIcon);
+	mMediaControlsStack		= getChild<LLLayoutStack>("media_controls"); assert(mMediaControlsStack);
+	mLeftBookend			= getChild<LLUICtrl>("left_bookend"); assert(mLeftBookend);
+	mRightBookend			= getChild<LLUICtrl>("right_bookend"); assert(mRightBookend);
+	mBackgroundImage		= LLUI::getUIImage(getString("control_background_image_name")); assert(mBackgroundImage);
+
+	// These are currently removed...but getChild creates a "dummy" widget.
+	// This class handles them missing.
+	mMediaPanelScroll		= findChild<LLUICtrl>("media_panel_scroll");
+	mScrollUpCtrl			= findChild<LLButton>("scrollup");
+	mScrollLeftCtrl			= findChild<LLButton>("scrollleft");
+	mScrollRightCtrl		= findChild<LLButton>("scrollright");
+	mScrollDownCtrl			= findChild<LLButton>("scrolldown");	
+	
+	if (mScrollUpCtrl)
 	{
-		scroll_up_ctrl->setClickedCallback(onScrollUp, this);
-		scroll_up_ctrl->setHeldDownCallback(onScrollUpHeld, this);
-		scroll_up_ctrl->setMouseUpCallback(onScrollStop, this);
+		mScrollUpCtrl->setClickedCallback(onScrollUp, this);
+		mScrollUpCtrl->setHeldDownCallback(onScrollUpHeld, this);
+		mScrollUpCtrl->setMouseUpCallback(onScrollStop, this);
 	}
-	LLButton* scroll_left_ctrl = getChild<LLButton>("scrollleft");
-	if (scroll_left_ctrl)
+	if (mScrollLeftCtrl)
 	{
-		scroll_left_ctrl->setClickedCallback(onScrollLeft, this);
-		scroll_left_ctrl->setHeldDownCallback(onScrollLeftHeld, this);
-		scroll_left_ctrl->setMouseUpCallback(onScrollStop, this);
+		mScrollLeftCtrl->setClickedCallback(onScrollLeft, this);
+		mScrollLeftCtrl->setHeldDownCallback(onScrollLeftHeld, this);
+		mScrollLeftCtrl->setMouseUpCallback(onScrollStop, this);
 	}
-	LLButton* scroll_right_ctrl = getChild<LLButton>("scrollright");
-	if (scroll_right_ctrl)
+	if (mScrollRightCtrl)
 	{
-		scroll_right_ctrl->setClickedCallback(onScrollRight, this);
-		scroll_right_ctrl->setHeldDownCallback(onScrollRightHeld, this);
-		scroll_right_ctrl->setMouseUpCallback(onScrollStop, this);
+		mScrollRightCtrl->setClickedCallback(onScrollRight, this);
+		mScrollRightCtrl->setHeldDownCallback(onScrollRightHeld, this);
+		mScrollRightCtrl->setMouseUpCallback(onScrollStop, this);
 	}
-	LLButton* scroll_down_ctrl = getChild<LLButton>("scrolldown");
-	if (scroll_down_ctrl)
+	if (mScrollDownCtrl)
 	{
-		scroll_down_ctrl->setClickedCallback(onScrollDown, this);
-		scroll_down_ctrl->setHeldDownCallback(onScrollDownHeld, this);
-		scroll_down_ctrl->setMouseUpCallback(onScrollStop, this);
+		mScrollDownCtrl->setClickedCallback(onScrollDown, this);
+		mScrollDownCtrl->setHeldDownCallback(onScrollDownHeld, this);
+		mScrollDownCtrl->setMouseUpCallback(onScrollStop, this);
 	}
 	
-	LLUICtrl* media_address	= getChild<LLUICtrl>("media_address");
-	media_address->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this ));
+	mMediaAddress->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this ));
 	mInactiveTimeout = gSavedSettings.getF32("MediaControlTimeout");
 	mControlFadeTime = gSavedSettings.getF32("MediaControlFadeTime");
 
@@ -261,90 +293,63 @@ void LLPanelPrimMediaControls::updateShape()
 		//
 		// Set the state of the buttons
 		//
-		LLUICtrl* back_ctrl					= getChild<LLUICtrl>("back");
-		LLUICtrl* fwd_ctrl					= getChild<LLUICtrl>("fwd");
-		LLUICtrl* reload_ctrl				= getChild<LLUICtrl>("reload");
-		LLUICtrl* play_ctrl					= getChild<LLUICtrl>("play");
-		LLUICtrl* pause_ctrl				= getChild<LLUICtrl>("pause");
-		LLUICtrl* stop_ctrl					= getChild<LLUICtrl>("stop");
-		LLUICtrl* media_stop_ctrl			= getChild<LLUICtrl>("media_stop");
-		LLUICtrl* home_ctrl					= getChild<LLUICtrl>("home");
-		LLUICtrl* unzoom_ctrl				= getChild<LLUICtrl>("close"); // This is actually "unzoom"
-		LLUICtrl* open_ctrl					= getChild<LLUICtrl>("new_window");
-        LLUICtrl* zoom_ctrl					= getChild<LLUICtrl>("zoom_frame");
-		LLPanel* media_loading_panel		= getChild<LLPanel>("media_progress_indicator");
-		LLUICtrl* media_address_ctrl		= getChild<LLUICtrl>("media_address");
-		LLUICtrl* media_play_slider_panel	= getChild<LLUICtrl>("media_play_position");
-		LLUICtrl* media_play_slider_ctrl	= getChild<LLUICtrl>("media_play_slider");
-		LLUICtrl* volume_ctrl				= getChild<LLUICtrl>("media_volume");
-		LLButton* volume_btn				= getChild<LLButton>("media_volume_button");
-		LLUICtrl* volume_up_ctrl			= getChild<LLUICtrl>("volume_up");
-		LLUICtrl* volume_down_ctrl			= getChild<LLUICtrl>("volume_down");
-		LLIconCtrl* whitelist_icon			= getChild<LLIconCtrl>("media_whitelist_flag");
-		LLIconCtrl* secure_lock_icon		= getChild<LLIconCtrl>("media_secure_lock_flag");
-		
-		LLUICtrl* media_panel_scroll		= getChild<LLUICtrl>("media_panel_scroll");
-		LLUICtrl* scroll_up_ctrl			= getChild<LLUICtrl>("scrollup");
-		LLUICtrl* scroll_left_ctrl			= getChild<LLUICtrl>("scrollleft");
-		LLUICtrl* scroll_right_ctrl			= getChild<LLUICtrl>("scrollright");
-		LLUICtrl* scroll_down_ctrl			= getChild<LLUICtrl>("scrolldown");		
 				
 		// XXX RSP: TODO: FIXME: clean this up so that it is clearer what mode we are in,
 		// and that only the proper controls get made visible/enabled according to that mode. 
-		back_ctrl->setVisible(has_focus);
-		fwd_ctrl->setVisible(has_focus);
-		reload_ctrl->setVisible(has_focus);
-		stop_ctrl->setVisible(false);
-		home_ctrl->setVisible(has_focus);
-		zoom_ctrl->setVisible(!is_zoomed);
-		unzoom_ctrl->setVisible(has_focus && is_zoomed);
-		open_ctrl->setVisible(true);
-		media_address_ctrl->setVisible(has_focus && !mini_controls);
-		media_play_slider_panel->setVisible(has_focus && !mini_controls);
-		volume_ctrl->setVisible(false);
-		volume_up_ctrl->setVisible(false);
-		volume_down_ctrl->setVisible(false);
+		mBackCtrl->setVisible(has_focus);
+		mFwdCtrl->setVisible(has_focus);
+		mReloadCtrl->setVisible(has_focus);
+		mStopCtrl->setVisible(false);
+		mHomeCtrl->setVisible(has_focus);
+		mZoomCtrl->setVisible(!is_zoomed);
+		mUnzoomCtrl->setVisible(has_focus && is_zoomed);
+		mOpenCtrl->setVisible(true);
+		mMediaAddressCtrl->setVisible(has_focus && !mini_controls);
+		mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
+		mVolumeCtrl->setVisible(false);
+		mVolumeUpCtrl->setVisible(false);
+		mVolumeDownCtrl->setVisible(false);
 		
-		whitelist_icon->setVisible(!mini_controls && (media_data)?media_data->getWhiteListEnable():false);
+		mWhitelistIcon->setVisible(!mini_controls && (media_data)?media_data->getWhiteListEnable():false);
 		// Disable zoom if HUD
-		zoom_ctrl->setEnabled(!objectp->isHUDAttachment());
-		unzoom_ctrl->setEnabled(!objectp->isHUDAttachment());
-		secure_lock_icon->setVisible(false);
+		mZoomCtrl->setEnabled(!objectp->isHUDAttachment());
+		mUnzoomCtrl->setEnabled(!objectp->isHUDAttachment());
+		mSecureLockIcon->setVisible(false);
 		mCurrentURL = media_impl->getCurrentMediaURL();
 		
-		back_ctrl->setEnabled((media_impl != NULL) && media_impl->canNavigateBack() && can_navigate);
-		fwd_ctrl->setEnabled((media_impl != NULL) && media_impl->canNavigateForward() && can_navigate);
-		stop_ctrl->setEnabled(has_focus && can_navigate);
-		home_ctrl->setEnabled(has_focus && can_navigate);
+		mBackCtrl->setEnabled((media_impl != NULL) && media_impl->canNavigateBack() && can_navigate);
+		mFwdCtrl->setEnabled((media_impl != NULL) && media_impl->canNavigateForward() && can_navigate);
+		mStopCtrl->setEnabled(has_focus && can_navigate);
+		mHomeCtrl->setEnabled(has_focus && can_navigate);
 		LLPluginClassMediaOwner::EMediaStatus result = ((media_impl != NULL) && media_impl->hasMedia()) ? media_plugin->getStatus() : LLPluginClassMediaOwner::MEDIA_NONE;
 
 		if(media_plugin && media_plugin->pluginSupportsMediaTime())
 		{
-			reload_ctrl->setEnabled(FALSE);
-			reload_ctrl->setVisible(FALSE);
-			media_stop_ctrl->setVisible(has_focus);
-			home_ctrl->setVisible(FALSE);
-			back_ctrl->setEnabled(has_focus);
-			fwd_ctrl->setEnabled(has_focus);
-			media_address_ctrl->setVisible(false);
-			media_address_ctrl->setEnabled(false);
-			media_play_slider_panel->setVisible(has_focus && !mini_controls);
-			media_play_slider_panel->setEnabled(has_focus && !mini_controls);
+			mReloadCtrl->setEnabled(FALSE);
+			mReloadCtrl->setVisible(FALSE);
+			mMediaStopCtrl->setVisible(has_focus);
+			mHomeCtrl->setVisible(FALSE);
+			mBackCtrl->setEnabled(has_focus);
+			mFwdCtrl->setEnabled(has_focus);
+			mMediaAddressCtrl->setVisible(false);
+			mMediaAddressCtrl->setEnabled(false);
+			mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
+			mMediaPlaySliderPanel->setEnabled(has_focus && !mini_controls);
 				
-			volume_ctrl->setVisible(has_focus);
-			volume_up_ctrl->setVisible(has_focus);
-			volume_down_ctrl->setVisible(has_focus);
-			volume_ctrl->setEnabled(has_focus);
-
-			whitelist_icon->setVisible(false);
-			secure_lock_icon->setVisible(false);
-			if (media_panel_scroll)
+			mVolumeCtrl->setVisible(has_focus);
+			mVolumeUpCtrl->setVisible(has_focus);
+			mVolumeDownCtrl->setVisible(has_focus);
+			mVolumeCtrl->setEnabled(has_focus);
+
+			mWhitelistIcon->setVisible(false);
+			mSecureLockIcon->setVisible(false);
+			if (mMediaPanelScroll)
 			{
-				media_panel_scroll->setVisible(false);
-				scroll_up_ctrl->setVisible(false);
-				scroll_left_ctrl->setVisible(false);
-				scroll_right_ctrl->setVisible(false);
-				scroll_down_ctrl->setVisible(false);
+				mMediaPanelScroll->setVisible(false);
+				mScrollUpCtrl->setVisible(false);
+				mScrollDownCtrl->setVisible(false);
+				mScrollRightCtrl->setVisible(false);
+				mScrollDownCtrl->setVisible(false);
 			}
 				
 			F32 volume = media_impl->getVolume();
@@ -358,8 +363,8 @@ void LLPanelPrimMediaControls::updateShape()
 			if(mMovieDuration == 0) 
 			{
 				mMovieDuration = media_plugin->getDuration();
-				media_play_slider_ctrl->setValue(0);
-				media_play_slider_ctrl->setEnabled(false);
+				mMediaPlaySliderCtrl->setValue(0);
+				mMediaPlaySliderCtrl->setEnabled(false);
 			}
 			// TODO: What if it's not fully loaded
 					
@@ -367,48 +372,48 @@ void LLPanelPrimMediaControls::updateShape()
 			{
 				F64 current_time =  media_plugin->getCurrentTime();
 				F32 percent = current_time / mMovieDuration;
-				media_play_slider_ctrl->setValue(percent);
-				media_play_slider_ctrl->setEnabled(true);
+				mMediaPlaySliderCtrl->setValue(percent);
+				mMediaPlaySliderCtrl->setEnabled(true);
 			}
 				
 			// video vloume
 			if(volume <= 0.0)
 			{
-				volume_up_ctrl->setEnabled(TRUE);
-				volume_down_ctrl->setEnabled(FALSE);
+				mVolumeUpCtrl->setEnabled(TRUE);
+				mVolumeDownCtrl->setEnabled(FALSE);
 				media_impl->setVolume(0.0);
-				volume_btn->setToggleState(true);
+				mVolumeBtn->setToggleState(true);
 			}
 			else if (volume >= 1.0)
 			{
-				volume_up_ctrl->setEnabled(FALSE);
-				volume_down_ctrl->setEnabled(TRUE);
+				mVolumeUpCtrl->setEnabled(FALSE);
+				mVolumeDownCtrl->setEnabled(TRUE);
 				media_impl->setVolume(1.0);
-				volume_btn->setToggleState(false);
+				mVolumeBtn->setToggleState(false);
 			}
 			else
 			{
-				volume_up_ctrl->setEnabled(TRUE);
-				volume_down_ctrl->setEnabled(TRUE);
+				mVolumeUpCtrl->setEnabled(TRUE);
+				mVolumeDownCtrl->setEnabled(TRUE);
 			}
 				
 			switch(result)
 			{
 				case LLPluginClassMediaOwner::MEDIA_PLAYING:
-					play_ctrl->setEnabled(FALSE);
-					play_ctrl->setVisible(FALSE);
-					pause_ctrl->setEnabled(TRUE);
-					pause_ctrl->setVisible(has_focus);
-					media_stop_ctrl->setEnabled(TRUE);
+					mPlayCtrl->setEnabled(FALSE);
+					mPlayCtrl->setVisible(FALSE);
+					mPauseCtrl->setEnabled(TRUE);
+					mPauseCtrl->setVisible(has_focus);
+					mMediaStopCtrl->setEnabled(TRUE);
 					
 					break;
 				case LLPluginClassMediaOwner::MEDIA_PAUSED:
 				default:
-					pause_ctrl->setEnabled(FALSE);
-					pause_ctrl->setVisible(FALSE);
-					play_ctrl->setEnabled(TRUE);
-					play_ctrl->setVisible(has_focus);
-					media_stop_ctrl->setEnabled(FALSE);
+					mPauseCtrl->setEnabled(FALSE);
+					mPauseCtrl->setVisible(FALSE);
+					mPlayCtrl->setEnabled(TRUE);
+					mPlayCtrl->setVisible(has_focus);
+					mMediaStopCtrl->setEnabled(FALSE);
 					break;
 			}
 		}
@@ -423,28 +428,28 @@ void LLPanelPrimMediaControls::updateShape()
 				mCurrentURL.clear();
 			}
 				
-			play_ctrl->setVisible(FALSE);
-			pause_ctrl->setVisible(FALSE);
-			media_stop_ctrl->setVisible(FALSE);
-			media_address_ctrl->setVisible(has_focus && !mini_controls);
-			media_address_ctrl->setEnabled(has_focus && !mini_controls);
-			media_play_slider_panel->setVisible(FALSE);
-			media_play_slider_panel->setEnabled(FALSE);
+			mPlayCtrl->setVisible(FALSE);
+			mPauseCtrl->setVisible(FALSE);
+			mMediaStopCtrl->setVisible(FALSE);
+			mMediaAddressCtrl->setVisible(has_focus && !mini_controls);
+			mMediaAddressCtrl->setEnabled(has_focus && !mini_controls);
+			mMediaPlaySliderPanel->setVisible(FALSE);
+			mMediaPlaySliderPanel->setEnabled(FALSE);
 				
-			volume_ctrl->setVisible(FALSE);
-			volume_up_ctrl->setVisible(FALSE);
-			volume_down_ctrl->setVisible(FALSE);
-			volume_ctrl->setEnabled(FALSE);
-			volume_up_ctrl->setEnabled(FALSE);
-			volume_down_ctrl->setEnabled(FALSE);
+			mVolumeCtrl->setVisible(FALSE);
+			mVolumeUpCtrl->setVisible(FALSE);
+			mVolumeDownCtrl->setVisible(FALSE);
+			mVolumeCtrl->setEnabled(FALSE);
+			mVolumeUpCtrl->setEnabled(FALSE);
+			mVolumeDownCtrl->setEnabled(FALSE);
 			
-			if (media_panel_scroll)
+			if (mMediaPanelScroll)
 			{
-				media_panel_scroll->setVisible(has_focus);
-				scroll_up_ctrl->setVisible(has_focus);
-				scroll_left_ctrl->setVisible(has_focus);
-				scroll_right_ctrl->setVisible(has_focus);
-				scroll_down_ctrl->setVisible(has_focus);
+				mMediaPanelScroll->setVisible(has_focus);
+				mScrollUpCtrl->setVisible(has_focus);
+				mScrollDownCtrl->setVisible(has_focus);
+				mScrollRightCtrl->setVisible(has_focus);
+				mScrollDownCtrl->setVisible(has_focus);
 			}
 			// TODO: get the secure lock bool from media plug in
 			std::string prefix =  std::string("https://");
@@ -452,7 +457,7 @@ void LLPanelPrimMediaControls::updateShape()
 			LLStringUtil::toLower(test_prefix);
 			if(test_prefix == prefix)
 			{
-				secure_lock_icon->setVisible(has_focus);
+				mSecureLockIcon->setVisible(has_focus);
 			}
 				
 			if(mCurrentURL!=mPreviousURL)
@@ -463,17 +468,17 @@ void LLPanelPrimMediaControls::updateShape()
 
 			if(result == LLPluginClassMediaOwner::MEDIA_LOADING)
 			{
-				reload_ctrl->setEnabled(FALSE);
-				reload_ctrl->setVisible(FALSE);
-				stop_ctrl->setEnabled(TRUE);
-				stop_ctrl->setVisible(has_focus);
+				mReloadCtrl->setEnabled(FALSE);
+				mReloadCtrl->setVisible(FALSE);
+				mStopCtrl->setEnabled(TRUE);
+				mStopCtrl->setVisible(has_focus);
 			}
 			else
 			{
-				reload_ctrl->setEnabled(TRUE);
-				reload_ctrl->setVisible(has_focus);
-				stop_ctrl->setEnabled(FALSE);
-				stop_ctrl->setVisible(FALSE);
+				mReloadCtrl->setEnabled(TRUE);
+				mReloadCtrl->setVisible(has_focus);
+				mStopCtrl->setEnabled(FALSE);
+				mStopCtrl->setVisible(FALSE);
 			}
 		}
 
@@ -483,16 +488,15 @@ void LLPanelPrimMediaControls::updateShape()
 			//
 			// Handle progress bar
 			//
-			mUpdatePercent = media_plugin->getProgressPercent();
-			if(mUpdatePercent<100.0f)
-			{
-				media_loading_panel->setVisible(true);
-				getChild<LLProgressBar>("media_progress_bar")->setPercent(mUpdatePercent);
-				gFocusMgr.setTopCtrl(media_loading_panel);
+			if(LLPluginClassMediaOwner::MEDIA_LOADING == media_plugin->getStatus())
+			{	
+				mMediaProgressPanel->setVisible(true);
+				mMediaProgressBar->setPercent(media_plugin->getProgressPercent());
+				gFocusMgr.setTopCtrl(mMediaProgressPanel);
 			}
 			else
 			{
-				media_loading_panel->setVisible(false);
+				mMediaProgressPanel->setVisible(false);
 				gFocusMgr.setTopCtrl(NULL);
 			}
 		}
@@ -589,11 +593,10 @@ void LLPanelPrimMediaControls::updateShape()
 		// grow panel so that screenspace bounding box fits inside "media_region" element of HUD
 		LLRect media_controls_rect;
 		getParent()->screenRectToLocal(LLRect(screen_min.mX, screen_max.mY, screen_max.mX, screen_min.mY), &media_controls_rect);
-		LLView* media_region = getChild<LLView>("media_region");
-		media_controls_rect.mLeft -= media_region->getRect().mLeft;
-		media_controls_rect.mBottom -= media_region->getRect().mBottom;
-		media_controls_rect.mTop += getRect().getHeight() - media_region->getRect().mTop;
-		media_controls_rect.mRight += getRect().getWidth() - media_region->getRect().mRight;
+		media_controls_rect.mLeft -= mMediaRegion->getRect().mLeft;
+		media_controls_rect.mBottom -= mMediaRegion->getRect().mBottom;
+		media_controls_rect.mTop += getRect().getHeight() - mMediaRegion->getRect().mTop;
+		media_controls_rect.mRight += getRect().getWidth() - mMediaRegion->getRect().mRight;
 
 		LLRect old_hud_rect = media_controls_rect;
 		// keep all parts of HUD on-screen
@@ -669,6 +672,20 @@ void LLPanelPrimMediaControls::draw()
 		}
 	}
 	
+	// Build rect for icon area in coord system of this panel
+	// Assumes layout_stack is a direct child of this panel
+	mMediaControlsStack->updateLayout();
+	LLRect icon_area = mMediaControlsStack->getRect();
+	
+	// adjust to ignore space from left bookend padding
+	icon_area.mLeft += mLeftBookend->getRect().getWidth();
+	
+	// ignore space from right bookend padding
+	icon_area.mRight -= mRightBookend->getRect().getWidth();
+	
+	// get UI image
+	mBackgroundImage->draw( icon_area, UI_VERTEX_COLOR % alpha);
+	
 	{
 		LLViewDrawContext context(alpha);
 		LLPanel::draw();
@@ -711,16 +728,13 @@ bool LLPanelPrimMediaControls::isMouseOver()
 		S32 x, y;
 		getWindow()->getCursorPosition(&cursor_pos_window);
 		getWindow()->convertCoords(cursor_pos_window, &cursor_pos_gl);
-		
-		LLView* controls_view = NULL;
-		controls_view = getChild<LLView>("media_controls");
-		
+				
 		//FIXME: rewrite as LLViewQuery or get hover set from LLViewerWindow?
-		if(controls_view && controls_view->getVisible())
+		if(mMediaControlsStack && mMediaControlsStack->getVisible())
 		{
-			controls_view->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y);
+			mMediaControlsStack->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y);
 
-			LLView *hit_child = controls_view->childFromPoint(x, y);
+			LLView *hit_child = mMediaControlsStack->childFromPoint(x, y);
 			if(hit_child && hit_child->getVisible())
 			{
 				// This was useful for debugging both coordinate translation and view hieararchy problems...
@@ -1002,8 +1016,7 @@ void LLPanelPrimMediaControls::onCommitURL()
 {
 	focusOnTarget();
 
-	LLUICtrl *media_address_ctrl = getChild<LLUICtrl>("media_address_url");
-	std::string url = media_address_ctrl->getValue().asString();
+	std::string url = mMediaAddress->getValue().asString();
 	if(getTargetMediaImpl() && !url.empty())
 	{
 		getTargetMediaImpl()->navigateTo( url, "", true);
@@ -1032,19 +1045,18 @@ void LLPanelPrimMediaControls::onInputURL(LLFocusableElement* caller, void *user
 void LLPanelPrimMediaControls::setCurrentURL()
 {	
 #ifdef USE_COMBO_BOX_FOR_MEDIA_URL
-	LLComboBox* media_address_combo	= getChild<LLComboBox>("media_address_combo");
-	// redirects will navigate momentarily to about:blank, don't add to history
-	if (media_address_combo && mCurrentURL != "about:blank")
-	{
-		media_address_combo->remove(mCurrentURL);
-		media_address_combo->add(mCurrentURL, ADD_SORTED);
-		media_address_combo->selectByValue(mCurrentURL);
-	}
+//	LLComboBox* media_address_combo	= getChild<LLComboBox>("media_address_combo");
+//	// redirects will navigate momentarily to about:blank, don't add to history
+//	if (media_address_combo && mCurrentURL != "about:blank")
+//	{
+//		media_address_combo->remove(mCurrentURL);
+//		media_address_combo->add(mCurrentURL, ADD_SORTED);
+//		media_address_combo->selectByValue(mCurrentURL);
+//	}
 #else   // USE_COMBO_BOX_FOR_MEDIA_URL
-	LLLineEditor* media_address_url = getChild<LLLineEditor>("media_address_url");
-	if (media_address_url && mCurrentURL != "about:blank")
+	if (mMediaAddress && mCurrentURL != "about:blank")
 	{
-		media_address_url->setValue(mCurrentURL);
+		mMediaAddress->setValue(mCurrentURL);
 	}
 #endif	// USE_COMBO_BOX_FOR_MEDIA_URL
 }
@@ -1053,12 +1065,11 @@ void LLPanelPrimMediaControls::onCommitSlider()
 {
 	focusOnTarget();
 
-	LLSlider* media_play_slider_ctrl	= getChild<LLSlider>("media_play_slider");
 	LLViewerMediaImpl* media_impl = getTargetMediaImpl();
 	if (media_impl) 
 	{
 		// get slider value
-		F64 slider_value = media_play_slider_ctrl->getValue().asReal();
+		F64 slider_value = mMediaPlaySliderCtrl->getValue().asReal();
 		if(slider_value <= 0.0)
 		{	
 			media_impl->stop();
@@ -1087,7 +1098,7 @@ void LLPanelPrimMediaControls::onCommitVolumeUp()
 		}
 		
 		media_impl->setVolume(volume);
-		getChild<LLButton>("media_volume")->setToggleState(false);
+		mVolumeBtn->setToggleState(false);
 	}
 }		
 
@@ -1107,7 +1118,7 @@ void LLPanelPrimMediaControls::onCommitVolumeDown()
 		}
 
 		media_impl->setVolume(volume);
-		getChild<LLButton>("media_volume")->setToggleState(false);
+		mVolumeBtn->setToggleState(false);
 	}
 }		
 
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index 3ec7aa2356c..124fa9cce48 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -35,7 +35,11 @@
 #include "llpanel.h"
 #include "llviewermedia.h"
 
+class LLButton;
 class LLCoordWindow;
+class LLIconCtrl;
+class LLLayoutStack;
+class LLProgressBar;
 class LLViewerMediaImpl;
 
 class LLPanelPrimMediaControls : public LLPanel
@@ -119,6 +123,44 @@ class LLPanelPrimMediaControls : public LLPanel
 	LLViewerMediaImpl* getTargetMediaImpl();
 	LLViewerObject* getTargetObject();
 	LLPluginClassMedia* getTargetMediaPlugin();
+	
+private:
+	
+	LLView *mMediaRegion;
+	LLUICtrl *mBackCtrl;
+	LLUICtrl *mFwdCtrl;
+	LLUICtrl *mReloadCtrl;
+	LLUICtrl *mPlayCtrl;
+	LLUICtrl *mPauseCtrl;
+	LLUICtrl *mStopCtrl;
+	LLUICtrl *mMediaStopCtrl;
+	LLUICtrl *mHomeCtrl;
+	LLUICtrl *mUnzoomCtrl;
+	LLUICtrl *mOpenCtrl;
+	LLUICtrl *mZoomCtrl;
+	LLPanel  *mMediaProgressPanel;
+	LLProgressBar *mMediaProgressBar;
+	LLUICtrl *mMediaAddressCtrl;
+	LLUICtrl *mMediaAddress;
+	LLUICtrl *mMediaPlaySliderPanel;
+	LLUICtrl *mMediaPlaySliderCtrl;
+	LLUICtrl *mVolumeCtrl;
+	LLButton *mVolumeBtn;
+	LLUICtrl *mVolumeUpCtrl;
+	LLUICtrl *mVolumeDownCtrl;
+	LLIconCtrl *mWhitelistIcon;
+	LLIconCtrl *mSecureLockIcon;
+	LLLayoutStack *mMediaControlsStack;
+	LLUICtrl *mLeftBookend;
+	LLUICtrl *mRightBookend;
+	LLUIImage* mBackgroundImage;
+	
+	LLUICtrl *mMediaPanelScroll;
+	LLButton *mScrollUpCtrl;
+	LLButton *mScrollLeftCtrl;
+	LLButton *mScrollRightCtrl;
+	LLButton *mScrollDownCtrl;
+	
 	bool mPauseFadeout;
 	bool mUpdateSlider;
 	bool mClearFaceOnFade;
@@ -137,8 +179,7 @@ class LLPanelPrimMediaControls : public LLPanel
 	std::string mPreviousURL;
 	F64 mCurrentRate;
 	F64 mMovieDuration;
-	int mUpdatePercent;
-
+	
 	LLUUID mTargetObjectID;
 	S32 mTargetObjectFace;
 	LLUUID mTargetImplID;
diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
index 3bdd7114eed..70c5d7b8239 100644
--- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
@@ -2,19 +2,18 @@
 <panel
 	follows="left|right|top|bottom"
 	name="MediaControls"
-	bg_alpha_color="1 1 1 0"
+	background_visible="false"
 	height="160"
 	layout="topleft"
 	mouse_opaque="false"
 	width="800">
+  <string name="control_background_image_name">Inspector_Background</string>
   <panel
 	  name="media_region"
 	  bottom="125"
 	  follows="left|right|top|bottom"
 	  layout="topleft"
-	  left="20"
 	  mouse_opaque="false"
-	  right="-20"
 	  top="20" />
   <layout_stack
 	  follows="left|right|bottom"
@@ -33,6 +32,7 @@
 		name="media_progress_indicator"
 		height="22"
 		layout="topleft"
+		visible="false"
 		left="0"
 		top="0"
 		auto_resize="false"
@@ -64,6 +64,7 @@
 	  top="128">
 	<!-- outer layout_panels center the inner one -->
 	<layout_panel
+		name="left_bookend"
 		width="0"
 		layout="topleft"
 		user_resize="false" />
@@ -83,6 +84,7 @@
 		  layout="topleft"
 		  tool_tip="Step back"
 		  width="22"
+		  left="0"
 		  top_delta="4">
 		<button.commit_callback
 			function="MediaCtrl.Back" />
@@ -109,22 +111,22 @@
 			function="MediaCtrl.Forward" />
 	  </button>
 	</layout_panel>
-<!--
-	<panel
+	<!--
+		<panel
 		height="22"
 		layout="topleft"
 		auto_resize="false"
 		min_width="3"
 		width="3">
-	  <icon
-		  height="22"
-		  image_name="media_panel_divider.png"
-		  layout="topleft"
-		  top="0"
-		  min_width="3"
-		  width="3" />
-	</panel>
--->
+		<icon
+		height="22"
+		image_name="media_panel_divider.png"
+		layout="topleft"
+		top="0"
+		min_width="3"
+		width="3" />
+		</panel>
+	-->
 	<layout_panel
 		name="home"
 		auto_resize="false"
@@ -165,22 +167,22 @@
 			function="MediaCtrl.Stop" />
 	  </button>
 	</layout_panel>
-<!--
-	<panel
+	<!--
+		<panel
 		height="22"
 		layout="topleft"
 		auto_resize="false"
 		min_width="3"
 		width="3">
-	  <icon
-		  height="22"
-		  image_name="media_panel_divider.png"
-		  layout="topleft"
-		  top="0"
-		  min_width="3"
-		  width="3" />
-	</panel>
--->
+		<icon
+		height="22"
+		image_name="media_panel_divider.png"
+		layout="topleft"
+		top="0"
+		min_width="3"
+		width="3" />
+		</panel>
+	-->
 	<layout_panel
 		name="reload"
 		auto_resize="false"
@@ -294,31 +296,43 @@ function="MediaCtrl.CommitURL" />
 			function="MediaCtrl.CommitURL"/>
 	  </line_editor>
 	  <layout_stack
+		  name="media_address_url_icons"
 		  animate="false"
 		  follows="right"
-		  width="32"
-		  min_width="32"
-		  height="16"
-		  top="3"
-		  orientation="horizontal"
-		  left_pad="-38">
-		<icon
-			name="media_whitelist_flag"
-			follows="top|right"
-			height="16"
-			image_name="smicon_warn.tga"
+		  height="20"
+		  width="38"
+		  right="-2"
+		  top="-1"
+		  orientation="horizontal">
+		<layout_panel
 			layout="topleft"
-			tool_tip="White List enabled"
-			min_width="16"
-			width="16" />
-		<icon
-			name="media_secure_lock_flag"
-			height="16"
-			image_name="inv_item_eyes.tga"
+			width="16"
+			auto_resize="false"
+			user_resize="false">
+		  <icon
+			  name="media_whitelist_flag"
+			  follows="top|right"
+			  height="16"
+			  image_name="smicon_warn.tga"
+			  layout="topleft"
+			  tool_tip="White List enabled"
+			  min_width="16"
+			  width="16" />
+		</layout_panel>
+		<layout_panel
 			layout="topleft"
-			tool_tip="Secured Browsing"
-			min_width="16"
-			width="16" />
+			width="16"
+			auto_resize="false"
+			user_resize="false">
+		  <icon
+			  name="media_secure_lock_flag"
+			  height="16"
+			  image_name="icon_lock.tga"
+			  layout="topleft"
+			  tool_tip="Secured Browsing"
+			  min_width="16"
+			  width="16" />
+		</layout_panel>
 	  </layout_stack>
 	</layout_panel>
 	<layout_panel
@@ -412,9 +426,9 @@ function="MediaCtrl.CommitURL" />
 	  </button>
 	</layout_panel>
 	<!-- Scroll pad -->
-<!--
-disabled
-	<layout_panel
+	<!--
+		disabled
+		<layout_panel
 		name="media_panel_scroll"
 		auto_resize="false"
 		user_resize="false"
@@ -423,64 +437,64 @@ disabled
 		layout="topleft"
 		min_width="32"
 		width="32">
-	  <icon
-		  height="32"
-		  image_name="media_panel_scrollbg.png"
-		  layout="topleft"
-		  top="0"
-		  min_width="32"
-		  width="32" />
-	  <button
-		  name="scrollup"
-		  height="8"
-		  image_selected="media_btn_scrollup.png"
-		  image_unselected="media_btn_scrollup.png"
-		  layout="topleft"
-		  tool_tip="Scroll up"
-		  scale_image="false"
-		  left="12"
-		  top_delta="4"
-		  min_width="8"
-		  width="8" />
-	  <button
-		  name="scrollleft"
-		  height="8"
-		  image_selected="media_btn_scrollleft.png"
-		  image_unselected="media_btn_scrollleft.png"
-		  layout="topleft"
-		  left="3"
-		  tool_tip="Scroll left"
-		  scale_image="false"
-		  top="12"
-		  min_width="8"
-		  width="8" />
-	  <button
-		  name="scrollright"
-		  height="8"
-		  image_selected="media_btn_scrollright.png"
-		  image_unselected="media_btn_scrollright.png"
-		  layout="topleft"
-		  left_pad="9"
-		  tool_tip="Scroll right"
-		  scale_image="false"
-		  top_delta="0"
-		  min_width="8"
-		  width="8" />
-	  <button
-		  name="scrolldown"
-		  height="8"
-		  image_selected="media_btn_scrolldown.png"
-		  image_unselected="media_btn_scrolldown.png"
-		  layout="topleft"
-		  left="12"
-		  tool_tip="Scroll down"
-		  scale_image="false"
-		  top="20"
-		  min_width="8"
-		  width="8" />
-	</layout_panel>
-disabled
--->
+		<icon
+		height="32"
+		image_name="media_panel_scrollbg.png"
+		layout="topleft"
+		top="0"
+		min_width="32"
+		width="32" />
+		<button
+		name="scrollup"
+		height="8"
+		image_selected="media_btn_scrollup.png"
+		image_unselected="media_btn_scrollup.png"
+		layout="topleft"
+		tool_tip="Scroll up"
+		scale_image="false"
+		left="12"
+		top_delta="4"
+		min_width="8"
+		width="8" />
+		<button
+		name="scrollleft"
+		height="8"
+		image_selected="media_btn_scrollleft.png"
+		image_unselected="media_btn_scrollleft.png"
+		layout="topleft"
+		left="3"
+		tool_tip="Scroll left"
+		scale_image="false"
+		top="12"
+		min_width="8"
+		width="8" />
+		<button
+		name="scrollright"
+		height="8"
+		image_selected="media_btn_scrollright.png"
+		image_unselected="media_btn_scrollright.png"
+		layout="topleft"
+		left_pad="9"
+		tool_tip="Scroll right"
+		scale_image="false"
+		top_delta="0"
+		min_width="8"
+		width="8" />
+		<button
+		name="scrolldown"
+		height="8"
+		image_selected="media_btn_scrolldown.png"
+		image_unselected="media_btn_scrolldown.png"
+		layout="topleft"
+		left="12"
+		tool_tip="Scroll down"
+		scale_image="false"
+		top="20"
+		min_width="8"
+		width="8" />
+		</layout_panel>
+		disabled
+	-->
 	<layout_panel
 		name="zoom_frame"
 		auto_resize="false"
@@ -520,22 +534,22 @@ disabled
 			function="MediaCtrl.Close" />
 	  </button>
 	</layout_panel>
-<!--
-	<panel
+	<!--
+		<panel
 		height="22"
 		layout="topleft"
 		auto_resize="false"
 		min_width="3"
 		width="3">
-	  <icon
-		  height="22"
-		  image_name="media_panel_divider.png"
-		  layout="topleft"
-		  top="0"
-		  min_width="3"
-		  width="3" />
-	</panel>
--->
+		<icon
+		height="22"
+		image_name="media_panel_divider.png"
+		layout="topleft"
+		top="0"
+		min_width="3"
+		width="3" />
+		</panel>
+	-->
 	<layout_panel
 		name="new_window"
 		auto_resize="false"
@@ -556,23 +570,25 @@ disabled
 			function="MediaCtrl.Open" />
 	  </button>
 	</layout_panel>
-<!--
-	<panel
+	<!--
+		<panel
 		height="22"
 		layout="topleft"
 		auto_resize="false"
 		min_width="3"
 		width="3">
-	  <icon
-		  height="22"
-		  image_name="media_panel_divider.png"
-		  layout="topleft"
-		  top="0"
-		  min_width="3"
-		  width="3" />
-	</panel>
--->
+		<icon
+		height="22"
+		image_name="media_panel_divider.png"
+		layout="topleft"
+		top="0"
+		min_width="3"
+		width="3" />
+		</panel>
+	-->
+	<!-- bookend panel -->
 	<layout_panel
+		name="right_bookend"
 		width="0"
 		layout="topleft"
 		user_resize="false" />
-- 
GitLab


From 2aa9f1bcbe0c51f9de24d52a08726dc13038f5b8 Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Fri, 13 Nov 2009 14:57:06 -0500
Subject: [PATCH 262/557] EXT-2477 minimizing while in appearance editing mode
 leaves a bad state

when minimizing the viewer while in appearance editing mode with unsaved changes
kicks you out of appearance editing mode and leaves you unable to recover as
the editor always starts itself on the shape tab. Fixed this in two ways:

1) if a wearable is dirty when the editor is opened, that is the tab that is
   selected.

2) the camera mode is not forcibly changed away from appearance editing mode
   on minimize. This only needs to happen if we are in mouselook.

Code reviewed by Vir.

--HG--
branch : avatar-pipeline
---
 indra/newview/llviewerwindow.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 1054223dcf1..90a79698f6f 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1015,7 +1015,10 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)
 		}
 		
 		// SL-53351: Make sure we're not in mouselook when minimised, to prevent control issues
-		gAgent.changeCameraToDefault();
+		if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK)
+		{
+			gAgent.changeCameraToDefault();
+		}
 		
 		send_agent_pause();
 		
-- 
GitLab


From 4b05dc4890d82b5c13c74ad502f0123fb83072a9 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Fri, 13 Nov 2009 15:20:54 -0500
Subject: [PATCH 263/557] LLAppearanceManager cleanup - 2 methods renamed

--HG--
branch : avatar-pipeline
---
 indra/newview/llappearancemgr.cpp   | 8 ++++----
 indra/newview/llappearancemgr.h     | 4 ++--
 indra/newview/llinventorybridge.cpp | 8 ++++----
 3 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 8d66cefa4f8..f7d13967070 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -802,7 +802,7 @@ bool areMatchingWearables(const LLViewerInventoryItem *a, const LLViewerInventor
 			(a->getWearableType() == b->getWearableType()));
 }
 
-void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update )
+void LLAppearanceManager::addItemLink( LLInventoryItem* item, bool do_update )
 {
 	LLViewerInventoryItem *vitem = dynamic_cast<LLViewerInventoryItem*>(item);
 	if (!vitem)
@@ -855,7 +855,7 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update )
 	return;
 }
 
-void LLAppearanceManager::wearEnsemble( LLInventoryCategory* cat, bool do_update )
+void LLAppearanceManager::addEnsembleLink( LLInventoryCategory* cat, bool do_update )
 {
 #if SUPPORT_ENSEMBLES
 	// BAP add check for already in COF.
@@ -969,7 +969,7 @@ void LLAppearanceManager::registerAttachment(const LLUUID& item_id)
 		   if (item)
 		   {
 			   //LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Adding attachment link:");
-			   LLAppearanceManager::wearItem(item,false);  // Add COF link for item.
+			   LLAppearanceManager::addItemLink(item,false);  // Add COF link for item.
 			   gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
 			   gInventory.notifyObservers();
 		   }
@@ -1009,7 +1009,7 @@ void LLAppearanceManager::linkRegisteredAttachments()
 		LLViewerInventoryItem *item = gInventory.getItem(item_id);
 		if (item)
 		{
-			wearItem(item, false);
+			addItemLink(item, false);
 			gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
 			gInventory.notifyObservers();
 		}
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 736dabea313..88d3320d1fa 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -54,10 +54,10 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 	void changeOutfit(bool proceed, const LLUUID& category, bool append);
 
 	// Add COF link to individual item.
-	void wearItem(LLInventoryItem* item, bool do_update = true);
+	void addItemLink(LLInventoryItem* item, bool do_update = true);
 
 	// Add COF link to ensemble folder.
-	void wearEnsemble(LLInventoryCategory* item, bool do_update = true);
+	void addEnsembleLink(LLInventoryCategory* item, bool do_update = true);
 
 	// Copy all items in a category.
 	void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 4aef7b51a56..7162b088450 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -1687,7 +1687,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
 				// BAP - should skip if dup.
 				if (move_is_into_current_outfit)
 				{
-					LLAppearanceManager::instance().wearEnsemble(inv_cat);
+					LLAppearanceManager::instance().addEnsembleLink(inv_cat);
 				}
 				else
 				{
@@ -2089,7 +2089,7 @@ void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model
 		if(!model) return;
 		LLViewerInventoryCategory* cat = getCategory();
 		if(!cat) return;
-		LLAppearanceManager::instance().wearEnsemble(cat,true);
+		LLAppearanceManager::instance().addEnsembleLink(cat,true);
 		return;
 	}
 #endif
@@ -2953,7 +2953,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
 				// BAP - should skip if dup.
 				if (move_is_into_current_outfit)
 				{
-					LLAppearanceManager::instance().wearItem(inv_item);
+					LLAppearanceManager::instance().addItemLink(inv_item);
 				}
 				else
 				{
@@ -4206,7 +4206,7 @@ void wear_inventory_item_on_avatar( LLInventoryItem* item )
 		lldebugs << "wear_inventory_item_on_avatar( " << item->getName()
 				 << " )" << llendl;
 
-		LLAppearanceManager::instance().wearItem(item);
+		LLAppearanceManager::instance().addItemLink(item);
 	}
 }
 
-- 
GitLab


From f9cacc57e28a2dcbe5801c71becbb8e2b8eae3e4 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Fri, 13 Nov 2009 12:36:41 -0800
Subject: [PATCH 264/557] EXT-2491 IM text does not appear in private IMs

---
 indra/newview/llimfloater.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 0f32d0b313d..1467e4e0e0b 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -479,6 +479,7 @@ void LLIMFloater::updateMessages()
 			LLChat chat;
 			chat.mFromID = from_id;
 			chat.mFromName = from;
+			chat.mText = message;
 
 			mChatHistory->appendWidgetMessage(chat);
 
-- 
GitLab


From 581fccecc805d27b8d9dfacb76cefebe26f9e0b9 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Fri, 13 Nov 2009 15:47:49 -0500
Subject: [PATCH 265/557] For DEV-41818 - text change 'Goto Link' -> 'Find
 Original'

--HG--
branch : avatar-pipeline
---
 indra/newview/llinventorybridge.cpp                   | 6 +++---
 indra/newview/skins/default/xui/en/menu_inventory.xml | 4 ++--
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 7162b088450..62ae6f501e9 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -4053,7 +4053,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 		LLInventoryItem* item = getItem();
 		if (item && item->getIsLinkType())
 		{
-			items.push_back(std::string("Goto Link"));
+			items.push_back(std::string("Find Original"));
 		}
 
 		items.push_back(std::string("Properties"));
@@ -4493,7 +4493,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 
 		if (item && item->getIsLinkType())
 		{
-			items.push_back(std::string("Goto Link"));
+			items.push_back(std::string("Find Original"));
 		}
 
 		items.push_back(std::string("Properties"));
@@ -5157,7 +5157,7 @@ void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 	}
 	else
 	{
-		items.push_back(std::string("Goto Link"));
+		items.push_back(std::string("Find Original"));
 		items.push_back(std::string("Delete"));
 		if (!isItemRemovable())
 		{
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index c86d32c8c49..b65a49eaed9 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -356,9 +356,9 @@
          parameter="restore" />
     </menu_item_call>
     <menu_item_call
-     label="Goto Link"
+     label="Find Original"
      layout="topleft"
-     name="Goto Link">
+     name="Find Original">
         <menu_item_call.on_click
          function="Inventory.DoToSelected"
          parameter="goto" />
-- 
GitLab


From 2e70e4e2d7adbca52884186975623e26ab7fb9fb Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Fri, 13 Nov 2009 12:59:17 -0800
Subject: [PATCH 266/557] Add functionality to nearby media floater: parcel
 media & autoplay

This change implements the enabling/disabling of parcel media,
as well as setting the user's autoplay preference.  I still
am quite confused by this UI, so we'll need to play with it a bit
to ensure it is what we want to present to users.

This adds a few helpers to llviewerparcelmedia to get the name and URL
of media.
---
 indra/newview/llviewermedia.cpp       |  6 ++++--
 indra/newview/llviewermedia.h         |  3 +++
 indra/newview/llviewerparcelmedia.cpp | 26 ++++++++++++++++++++++++++
 indra/newview/llviewerparcelmedia.h   |  2 ++
 4 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 69d4da373e8..36fef07989f 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -54,6 +54,8 @@
 #include <boost/bind.hpp>	// for SkinFolder listener
 #include <boost/signals2.hpp>
 
+/*static*/ const char* LLViewerMedia::AUTO_PLAY_MEDIA_SETTING = "AutoPlayMedia";
+
 // Move this to its own file.
 
 LLViewerMediaEventEmitter::~LLViewerMediaEventEmitter()
@@ -313,7 +315,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
 			// If (the media was already loaded OR the media was set to autoplay) AND this update didn't come from this agent,
 			// do a navigate.
 			
-			if((was_loaded || (media_entry->getAutoPlay() && gSavedSettings.getBOOL("AutoPlayMedia"))) && !update_from_self)
+			if((was_loaded || (media_entry->getAutoPlay() && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING))) && !update_from_self)
 			{
 				needs_navigate = (media_entry->getCurrentURL() != previous_url);
 			}
@@ -330,7 +332,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
 		
 		media_impl->setHomeURL(media_entry->getHomeURL());
 		
-		if(media_entry->getAutoPlay() && gSavedSettings.getBOOL("AutoPlayMedia"))
+		if(media_entry->getAutoPlay() && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING))
 		{
 			needs_navigate = true;
 		}
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 719deb28bf6..639aed4b8a2 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -74,6 +74,9 @@ class LLViewerMedia
 	LOG_CLASS(LLViewerMedia);
 	public:
 
+		// String to get/set media autoplay in gSavedSettings
+		static const char *AUTO_PLAY_MEDIA_SETTING;
+	
 		typedef std::vector<LLViewerMediaImpl*> impl_list;
 
 		// Special case early init for just web browser component
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index 336d7f684e6..7559fd8e72c 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -324,10 +324,36 @@ std::string LLViewerParcelMedia::getMimeType()
 {
 	return sMediaImpl.notNull() ? sMediaImpl->getMimeType() : "none/none";
 }
+
+//static 
+std::string LLViewerParcelMedia::getURL()
+{
+	std::string url;
+	if(sMediaImpl.notNull())
+		url = sMediaImpl->getMediaURL();
+	
+	if (url.empty())
+		url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaCurrentURL();
+	
+	if (url.empty())
+		url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaURL();
+	
+	return url;
+}
+
+//static 
+std::string LLViewerParcelMedia::getName()
+{
+	if(sMediaImpl.notNull())
+		return sMediaImpl->getName();
+	return "";
+}
+
 viewer_media_t LLViewerParcelMedia::getParcelMedia()
 {
 	return sMediaImpl;
 }
+
 //////////////////////////////////////////////////////////////////////////////////////////
 // static
 void LLViewerParcelMedia::processParcelMediaCommandMessage( LLMessageSystem *msg, void ** )
diff --git a/indra/newview/llviewerparcelmedia.h b/indra/newview/llviewerparcelmedia.h
index 3f7f8983569..19e1ef78d43 100644
--- a/indra/newview/llviewerparcelmedia.h
+++ b/indra/newview/llviewerparcelmedia.h
@@ -71,6 +71,8 @@ class LLViewerParcelMedia : public LLViewerMediaObserver
 
 		static LLPluginClassMediaOwner::EMediaStatus getStatus();
 		static std::string getMimeType();
+		static std::string getURL();
+		static std::string getName();
 		static viewer_media_t getParcelMedia();
 
 		static void processParcelMediaCommandMessage( LLMessageSystem *msg, void ** );
-- 
GitLab


From 5890c850f8db30e105717b7c5fbbec91c434ebff Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Fri, 13 Nov 2009 13:05:16 -0800
Subject: [PATCH 267/557] Prevent the about:blank url from the initial navigate
 from leaking out of the webkit plugin.  This should fix DEV-42766.

---
 .../webkit/media_plugin_webkit.cpp            | 128 +++++++++++++-----
 1 file changed, 94 insertions(+), 34 deletions(-)

diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index 3ce8ff3deb8..1e79720f43f 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -74,8 +74,17 @@ class MediaPluginWebKit :
 
 private:
 
+	enum
+	{
+		INIT_STATE_UNINITIALIZED,		// Browser instance hasn't been set up yet
+		INIT_STATE_NAVIGATING,			// Browser instance has been set up and initial navigate to about:blank has been issued
+		INIT_STATE_NAVIGATE_COMPLETE,	// initial navigate to about:blank has completed
+		INIT_STATE_WAIT_REDRAW,			// First real navigate begin has been received, waiting for page changed event to start handling redraws
+		INIT_STATE_RUNNING				// All initialization gymnastics are complete.
+	};
 	int mBrowserWindowId;
-	bool mBrowserInitialized;
+	int mInitState;
+	std::string mInitialNavigateURL;
 	bool mNeedsUpdate;
 
 	bool	mCanCut;
@@ -93,7 +102,17 @@ class MediaPluginWebKit :
 		
 		checkEditState();
 		
-		if ( mNeedsUpdate )
+		if(mInitState == INIT_STATE_NAVIGATE_COMPLETE)
+		{
+			if(!mInitialNavigateURL.empty())
+			{
+				// We already have the initial navigate URL -- kick off the navigate.
+				LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, mInitialNavigateURL );
+				mInitialNavigateURL.clear();
+			}
+		}
+		
+		if ( (mInitState == INIT_STATE_RUNNING) && mNeedsUpdate )
 		{
 			const unsigned char* browser_pixels = LLQtWebKit::getInstance()->grabBrowserWindow( mBrowserWindowId );
 
@@ -123,7 +142,7 @@ class MediaPluginWebKit :
 	bool initBrowser()
 	{
 		// already initialized
-		if ( mBrowserInitialized )
+		if ( mInitState > INIT_STATE_UNINITIALIZED )
 			return true;
 
 		// not enough information to initialize the browser yet.
@@ -210,20 +229,21 @@ class MediaPluginWebKit :
 			// set background color to be black - mostly for initial login page
 			LLQtWebKit::getInstance()->setBackgroundColor( mBrowserWindowId, 0x00, 0x00, 0x00 );
 
+			// Set state _before_ starting the navigate, since onNavigateBegin might get called before this call returns.
+			mInitState = INIT_STATE_NAVIGATING;
+
 			// Don't do this here -- it causes the dreaded "white flash" when loading a browser instance.
 			// FIXME: Re-added this because navigating to a "page" initializes things correctly - especially
 			// for the HTTP AUTH dialog issues (DEV-41731). Will fix at a later date.
 			LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, "about:blank" );
 
-			// set flag so we don't do this again
-			mBrowserInitialized = true;
-
 			return true;
 		};
 
 		return false;
 	};
 
+
 	////////////////////////////////////////////////////////////////////////////////
 	// virtual
 	void onCursorChanged(const EventType& event)
@@ -263,6 +283,11 @@ class MediaPluginWebKit :
 	// virtual
 	void onPageChanged( const EventType& event )
 	{
+		if(mInitState == INIT_STATE_WAIT_REDRAW)
+		{
+			mInitState = INIT_STATE_RUNNING;
+		}
+		
 		// flag that an update is required
 		mNeedsUpdate = true;
 	};
@@ -271,62 +296,90 @@ class MediaPluginWebKit :
 	// virtual
 	void onNavigateBegin(const EventType& event)
 	{
-		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");
-		message.setValue("uri", event.getEventUri());
-		sendMessage(message);
-
-		setStatus(STATUS_LOADING);
+		if(mInitState > INIT_STATE_NAVIGATE_COMPLETE)
+		{
+			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");
+			message.setValue("uri", event.getEventUri());
+			sendMessage(message);
+		
+			setStatus(STATUS_LOADING);
+		}
+		else if(mInitState == INIT_STATE_NAVIGATE_COMPLETE)
+		{
+			mInitState = INIT_STATE_WAIT_REDRAW;
+		}
+		
 	}
 
 	////////////////////////////////////////////////////////////////////////////////
 	// virtual
 	void onNavigateComplete(const EventType& event)
 	{
-		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete");
-		message.setValue("uri", event.getEventUri());
-		message.setValueS32("result_code", event.getIntValue());
-		message.setValue("result_string", event.getStringValue());
-		message.setValueBoolean("history_back_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK));
-		message.setValueBoolean("history_forward_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_FORWARD));
-		sendMessage(message);
-		
-		setStatus(STATUS_LOADED);
+		if(mInitState > INIT_STATE_NAVIGATE_COMPLETE)
+		{
+			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete");
+			message.setValue("uri", event.getEventUri());
+			message.setValueS32("result_code", event.getIntValue());
+			message.setValue("result_string", event.getStringValue());
+			message.setValueBoolean("history_back_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK));
+			message.setValueBoolean("history_forward_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_FORWARD));
+			sendMessage(message);
+			
+			setStatus(STATUS_LOADED);
+		}
+		else if(mInitState == INIT_STATE_NAVIGATING)
+		{
+			mInitState = INIT_STATE_NAVIGATE_COMPLETE;
+		}
+
 	}
 
 	////////////////////////////////////////////////////////////////////////////////
 	// virtual
 	void onUpdateProgress(const EventType& event)
 	{
-		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "progress");
-		message.setValueS32("percent", event.getIntValue());
-		sendMessage(message);
+		if(mInitState > INIT_STATE_NAVIGATE_COMPLETE)
+		{
+			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "progress");
+			message.setValueS32("percent", event.getIntValue());
+			sendMessage(message);
+		}
 	}
 	
 	////////////////////////////////////////////////////////////////////////////////
 	// virtual
 	void onStatusTextChange(const EventType& event)
 	{
-		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "status_text");
-		message.setValue("status", event.getStringValue());
-		sendMessage(message);
+		if(mInitState > INIT_STATE_NAVIGATE_COMPLETE)
+		{
+			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "status_text");
+			message.setValue("status", event.getStringValue());
+			sendMessage(message);
+		}
 	}
 
 	////////////////////////////////////////////////////////////////////////////////
 	// virtual
 	void onTitleChange(const EventType& event)
 	{
-		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text");
-		message.setValue("name", event.getStringValue());
-		sendMessage(message);
+		if(mInitState > INIT_STATE_NAVIGATE_COMPLETE)
+		{
+			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text");
+			message.setValue("name", event.getStringValue());
+			sendMessage(message);
+		}
 	}
 
 	////////////////////////////////////////////////////////////////////////////////
 	// virtual
 	void onLocationChange(const EventType& event)
 	{
-		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "location_changed");
-		message.setValue("uri", event.getEventUri());
-		sendMessage(message);
+		if(mInitState > INIT_STATE_NAVIGATE_COMPLETE)
+		{
+			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "location_changed");
+			message.setValue("uri", event.getEventUri());
+			sendMessage(message);
+		}
 	}
 	
 	////////////////////////////////////////////////////////////////////////////////
@@ -488,7 +541,7 @@ MediaPluginWebKit::MediaPluginWebKit(LLPluginInstance::sendMessageFunction host_
 //	std::cerr << "MediaPluginWebKit constructor" << std::endl;
 
 	mBrowserWindowId = 0;
-	mBrowserInitialized = false;
+	mInitState = INIT_STATE_UNINITIALIZED;
 	mNeedsUpdate = true;
 	mCanCut = false;
 	mCanCopy = false;
@@ -674,7 +727,14 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
 				
 				if(!uri.empty())
 				{
-					LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, uri );
+					if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
+					{
+						LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, uri );
+					}
+					else
+					{
+						mInitialNavigateURL = uri;
+					}
 				}
 			}
 			else if(message_name == "mouse_event")
-- 
GitLab


From 39c53fcf0eb718b0a3d1f43a3c9ee1a38ffef49f Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Fri, 13 Nov 2009 13:05:56 -0800
Subject: [PATCH 268/557] Clear the media texture to black instead of
 almost-black.

---
 indra/newview/llviewermedia.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 69d4da373e8..513fae41eb1 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -1704,7 +1704,7 @@ LLViewerMediaTexture* LLViewerMediaImpl::updatePlaceholderImage()
 		// MEDIAOPT: seems insane that we actually have to make an imageraw then
 		// immediately discard it
 		LLPointer<LLImageRaw> raw = new LLImageRaw(texture_width, texture_height, texture_depth);
-		raw->clear(0x0f, 0x0f, 0x0f, 0xff);
+		raw->clear(0x00, 0x00, 0x00, 0xff);
 		int discard_level = 0;
 
 		// ask media source for correct GL image format constants
-- 
GitLab


From f0cd44a6a2c4001111e82425cf2bd4fee63fad27 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Fri, 13 Nov 2009 16:18:53 -0500
Subject: [PATCH 269/557] EXT-2482 : Newly created folders have wrong default
 type

Removed AT_ROOT_CATEGORY and FT_ROOT_CATEGORY since those types are unused.  Changed FT_CATEGORY to FT_ROOT_INVENTORY to make its purpose more clear.

This change assumes that no agent inventories have category type 9 for either inventory type or folder preferred type.

--HG--
branch : avatar-pipeline
---
 indra/llcommon/llassettype.h           |  5 -----
 indra/llcommon/llfoldertype.cpp        |  3 +--
 indra/llcommon/llfoldertype.h          | 17 +++--------------
 indra/llinventory/llinventorytype.cpp  |  2 +-
 indra/newview/llfloaterbuy.cpp         |  4 ----
 indra/newview/llfloaterbuycontents.cpp |  6 +-----
 indra/newview/llinventorybridge.cpp    |  5 -----
 indra/newview/llinventorymodel.cpp     |  4 ++--
 indra/newview/llviewerassettype.cpp    |  1 -
 indra/newview/llviewerfoldertype.cpp   |  3 +--
 indra/newview/llviewermenu.cpp         |  3 +--
 indra/newview/llviewermessage.cpp      |  6 ++----
 12 files changed, 12 insertions(+), 47 deletions(-)

diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h
index ec2290d30e8..c7bbc2e74aa 100644
--- a/indra/llcommon/llassettype.h
+++ b/indra/llcommon/llassettype.h
@@ -78,11 +78,6 @@ class LL_COMMON_API LLAssetType
 			// Holds a collection of inventory items.
 			// It's treated as an item in the inventory and therefore needs a type.
 
-		AT_ROOT_CATEGORY = 9,
-			// A user's root inventory category.
-			// We decided to expose it visually, so it seems logical to fold
-			// it into the asset types.
-
 		AT_LSL_TEXT = 10,
 		AT_LSL_BYTECODE = 11,
 			// The LSL is the scripting language. 
diff --git a/indra/llcommon/llfoldertype.cpp b/indra/llcommon/llfoldertype.cpp
index 9107b11597e..079e670b1ab 100644
--- a/indra/llcommon/llfoldertype.cpp
+++ b/indra/llcommon/llfoldertype.cpp
@@ -72,8 +72,7 @@ LLFolderDictionary::LLFolderDictionary()
 	addEntry(LLFolderType::FT_CLOTHING, 			new FolderEntry("clothing",	TRUE));
 	addEntry(LLFolderType::FT_OBJECT, 				new FolderEntry("object",	TRUE));
 	addEntry(LLFolderType::FT_NOTECARD, 			new FolderEntry("notecard",	TRUE));
-	addEntry(LLFolderType::FT_CATEGORY, 			new FolderEntry("category",	TRUE));
-	addEntry(LLFolderType::FT_ROOT_CATEGORY, 		new FolderEntry("root",		TRUE));
+	addEntry(LLFolderType::FT_ROOT_INVENTORY, 		new FolderEntry("root_inv",	TRUE));
 	addEntry(LLFolderType::FT_LSL_TEXT, 			new FolderEntry("lsltext",	TRUE));
 	addEntry(LLFolderType::FT_BODYPART, 			new FolderEntry("bodypart",	TRUE));
 	addEntry(LLFolderType::FT_TRASH, 				new FolderEntry("trash",	TRUE));
diff --git a/indra/llcommon/llfoldertype.h b/indra/llcommon/llfoldertype.h
index 5374ffd829a..7aa77f7f7e4 100644
--- a/indra/llcommon/llfoldertype.h
+++ b/indra/llcommon/llfoldertype.h
@@ -52,23 +52,18 @@ class LL_COMMON_API LLFolderType
 
 		FT_LANDMARK = 3,
 
-		// FT_SCRIPT = 4,
-
 		FT_CLOTHING = 5,
 
 		FT_OBJECT = 6,
 
 		FT_NOTECARD = 7,
 
-		FT_CATEGORY = 8,
-
-		FT_ROOT_CATEGORY = 9,
+		FT_ROOT_INVENTORY = 8,
+			// We'd really like to change this to 9 since AT_CATEGORY is 8,
+			// but "My Inventory" has been type 8 for a long time.
 
 		FT_LSL_TEXT = 10,
 
-		// FT_LSL_BYTECODE = 11,
-		// FT_TEXTURE_TGA = 12,
-
 		FT_BODYPART = 13,
 
 		FT_TRASH = 14,
@@ -77,16 +72,10 @@ class LL_COMMON_API LLFolderType
 
 		FT_LOST_AND_FOUND = 16,
 
-		// FT_SOUND_WAV = 17,
-		// FT_IMAGE_TGA = 18,
-		// FT_IMAGE_JPEG = 19,
-
 		FT_ANIMATION = 20,
 
 		FT_GESTURE = 21,
 
-		// FT_SIMSTATE = 22,
-
 		FT_FAVORITE = 23,
 
 		FT_ENSEMBLE_START = 26,
diff --git a/indra/llinventory/llinventorytype.cpp b/indra/llinventory/llinventorytype.cpp
index 0e71c0d12d8..4ef5df0b289 100644
--- a/indra/llinventory/llinventorytype.cpp
+++ b/indra/llinventory/llinventorytype.cpp
@@ -106,7 +106,7 @@ DEFAULT_ASSET_FOR_INV_TYPE[LLAssetType::AT_COUNT] =
 	LLInventoryType::IT_OBJECT,			// AT_OBJECT
 	LLInventoryType::IT_NOTECARD,		// AT_NOTECARD
 	LLInventoryType::IT_CATEGORY,		// AT_CATEGORY
-	LLInventoryType::IT_ROOT_CATEGORY,	// AT_ROOT_CATEGORY
+	LLInventoryType::IT_NONE,			// (null entry)
 	LLInventoryType::IT_LSL,			// AT_LSL_TEXT
 	LLInventoryType::IT_LSL,			// AT_LSL_BYTECODE
 	LLInventoryType::IT_TEXTURE,		// AT_TEXTURE_TGA
diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp
index cefd7a38080..c8df6c61358 100644
--- a/indra/newview/llfloaterbuy.cpp
+++ b/indra/newview/llfloaterbuy.cpp
@@ -230,10 +230,6 @@ void LLFloaterBuy::inventoryChanged(LLViewerObject* obj,
 		if (obj->getType() == LLAssetType::AT_CATEGORY)
 			continue;
 
-		// Skip root folders, so we know we have inventory items only
-		if (obj->getType() == LLAssetType::AT_ROOT_CATEGORY) 
-			continue;
-
 		// Skip the mysterious blank InventoryObject 
 		if (obj->getType() == LLAssetType::AT_NONE)
 			continue;
diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp
index 32802f6a200..a99d0c918dd 100644
--- a/indra/newview/llfloaterbuycontents.cpp
+++ b/indra/newview/llfloaterbuycontents.cpp
@@ -187,10 +187,6 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,
 		if (asset_type == LLAssetType::AT_CATEGORY)
 			continue;
 
-		// Skip root folders, so we know we have inventory items only
-		if (asset_type == LLAssetType::AT_ROOT_CATEGORY) 
-			continue;
-
 		LLInventoryItem* inv_item = (LLInventoryItem*)((LLInventoryObject*)(*it));
 		inv_type = inv_item->getInventoryType();
 
@@ -286,7 +282,7 @@ void LLFloaterBuyContents::onClickBuy()
 
 	// Put the items where we put new folders.
 	LLUUID category_id;
-	category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CATEGORY);
+	category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_ROOT_INVENTORY);
 
 	// *NOTE: doesn't work for multiple object buy, which UI does not
 	// currently support sale info is used for verification only, if
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 6087df33b96..7d2922b5610 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -892,7 +892,6 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
 			new_listener = new LLWearableBridge(inventory, uuid, asset_type, inv_type, (EWearableType)flags);
 			break;
 		case LLAssetType::AT_CATEGORY:
-		case LLAssetType::AT_ROOT_CATEGORY:
 			if (actual_asset_type == LLAssetType::AT_LINK_FOLDER)
 			{
 				// Create a link folder handler instead.
@@ -2847,10 +2846,6 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
 		BOOL is_movable = TRUE;
 		switch( inv_item->getActualType() )
 		{
-		case LLAssetType::AT_ROOT_CATEGORY:
-			is_movable = FALSE;
-			break;
-
 		case LLAssetType::AT_CATEGORY:
 			is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType());
 			break;
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 3354a430010..3a1d457877d 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -341,7 +341,7 @@ const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bo
 const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type) const
 {
 	const LLUUID &root_id = gInventory.getRootFolderID();
-	if(LLFolderType::FT_CATEGORY == preferred_type)
+	if(LLFolderType::FT_ROOT_INVENTORY == preferred_type)
 	{
 		return root_id;
 	}
@@ -2465,7 +2465,7 @@ void LLInventoryModel::buildParentChildMap()
 			{
 				cat->setParent(findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND));
 			}
-			else if(LLFolderType::FT_CATEGORY == pref)
+			else if(LLFolderType::FT_ROOT_INVENTORY == pref)
 			{
 				// it's the root
 				cat->setParent(LLUUID::null);
diff --git a/indra/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp
index c974171c2c2..b382ff63069 100644
--- a/indra/newview/llviewerassettype.cpp
+++ b/indra/newview/llviewerassettype.cpp
@@ -71,7 +71,6 @@ LLViewerAssetDictionary::LLViewerAssetDictionary()
 	addEntry(LLViewerAssetType::AT_OBJECT, 				new ViewerAssetEntry(DAD_OBJECT));
 	addEntry(LLViewerAssetType::AT_NOTECARD, 			new ViewerAssetEntry(DAD_NOTECARD));
 	addEntry(LLViewerAssetType::AT_CATEGORY, 			new ViewerAssetEntry(DAD_CATEGORY));
-	addEntry(LLViewerAssetType::AT_ROOT_CATEGORY, 		new ViewerAssetEntry(DAD_ROOT_CATEGORY));
 	addEntry(LLViewerAssetType::AT_LSL_TEXT, 			new ViewerAssetEntry(DAD_SCRIPT));
 	addEntry(LLViewerAssetType::AT_LSL_BYTECODE, 		new ViewerAssetEntry(DAD_NONE));
 	addEntry(LLViewerAssetType::AT_TEXTURE_TGA, 		new ViewerAssetEntry(DAD_NONE));
diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp
index 384538364f0..6aabcb11b82 100644
--- a/indra/newview/llviewerfoldertype.cpp
+++ b/indra/newview/llviewerfoldertype.cpp
@@ -109,8 +109,7 @@ LLViewerFolderDictionary::LLViewerFolderDictionary()
 	addEntry(LLFolderType::FT_CLOTHING, 			new ViewerFolderEntry("Clothing",				"inv_folder_clothing.tga"));
 	addEntry(LLFolderType::FT_OBJECT, 				new ViewerFolderEntry("Objects",				"inv_folder_object.tga"));
 	addEntry(LLFolderType::FT_NOTECARD, 			new ViewerFolderEntry("Notecards",				"inv_folder_notecard.tga"));
-	addEntry(LLFolderType::FT_CATEGORY, 			new ViewerFolderEntry("New Folder",				"inv_folder_plain_closed.tga"));
-	addEntry(LLFolderType::FT_ROOT_CATEGORY, 		new ViewerFolderEntry("Inventory",				""));
+	addEntry(LLFolderType::FT_ROOT_INVENTORY, 		new ViewerFolderEntry("My Inventory",			""));
 	addEntry(LLFolderType::FT_LSL_TEXT, 			new ViewerFolderEntry("Scripts",				"inv_folder_script.tga"));
 	addEntry(LLFolderType::FT_BODYPART, 			new ViewerFolderEntry("Body Parts",				"inv_folder_bodypart.tga"));
 	addEntry(LLFolderType::FT_TRASH, 				new ViewerFolderEntry("Trash",					"inv_folder_trash.tga"));
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 4cc1d986bb4..68a9aaef757 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -3879,8 +3879,7 @@ void god_force_inv_owner_permissive(LLViewerObject* object,
 	InventoryObjectList::const_iterator inv_end = inventory->end();
 	for ( ; inv_it != inv_end; ++inv_it)
 	{
-		if(((*inv_it)->getType() != LLAssetType::AT_CATEGORY)
-		   && ((*inv_it)->getType() != LLAssetType::AT_ROOT_CATEGORY))
+		if(((*inv_it)->getType() != LLAssetType::AT_CATEGORY))
 		{
 			LLInventoryObject* obj = *inv_it;
 			LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem((LLViewerInventoryItem*)obj);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 4088eafe16c..f0c1823def0 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -4833,8 +4833,7 @@ void container_inventory_arrived(LLViewerObject* object,
 		InventoryObjectList::const_iterator end = inventory->end();
 		for ( ; it != end; ++it)
 		{
-			if ((*it)->getType() != LLAssetType::AT_CATEGORY &&
-				(*it)->getType() != LLAssetType::AT_ROOT_CATEGORY)
+			if ((*it)->getType() != LLAssetType::AT_CATEGORY)
 			{
 				LLInventoryObject* obj = (LLInventoryObject*)(*it);
 				LLInventoryItem* item = (LLInventoryItem*)(obj);
@@ -4869,8 +4868,7 @@ void container_inventory_arrived(LLViewerObject* object,
 		// one actual object
 		InventoryObjectList::iterator it = inventory->begin();
 
-		if ((*it)->getType() == LLAssetType::AT_CATEGORY ||
-			(*it)->getType() == LLAssetType::AT_ROOT_CATEGORY)
+		if ((*it)->getType() == LLAssetType::AT_CATEGORY)
 		{
 			++it;
 		}
-- 
GitLab


From d191143cbc3aef7cd68cad98e480fb656c9e8c01 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Fri, 13 Nov 2009 13:47:18 -0800
Subject: [PATCH 270/557] Special-case a "401" status ("auth required") in
 LLMimeDiscoveryResponder::error() to be treated as a mime type of "text/html"
 instead of a failure.

---
 indra/newview/llviewermedia.cpp | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 513fae41eb1..b4164a94e8a 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -159,12 +159,21 @@ LOG_CLASS(LLMimeDiscoveryResponder);
 
 	virtual void error( U32 status, const std::string& reason )
 	{
-		llwarns << "responder failed with status " << status << ", reason " << reason << llendl;
-		if(mMediaImpl)
+		if(status == 401)
+		{
+			// This is the "you need to authenticate" status.  
+			// Treat this like an html page.
+			completeAny(status, "text/html");
+		}
+		else
 		{
-			mMediaImpl->mMediaSourceFailed = true;
+			llwarns << "responder failed with status " << status << ", reason " << reason << llendl;
+		
+			if(mMediaImpl)
+			{
+				mMediaImpl->mMediaSourceFailed = true;
+			}
 		}
-		// completeAny(status, "none/none");
 	}
 
 	void completeAny(U32 status, const std::string& mime_type)
-- 
GitLab


From 2c05c3dab31ee0887d58382cecab903707ae0ee4 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Fri, 13 Nov 2009 16:48:53 -0500
Subject: [PATCH 271/557] For DEV-41820: Allow dragging links to Looks and
 Current Look: copy the link, wear if Current Look

--HG--
branch : avatar-pipeline
---
 indra/newview/llinventorybridge.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 62ae6f501e9..bfd30df085a 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -2337,7 +2337,7 @@ void LLFolderBridge::pasteLinkFromClipboard()
 			{
 				link_inventory_item(
 					gAgent.getID(),
-					item->getUUID(),
+					item->getLinkedUUID(),
 					parent_id,
 					item->getName(),
 					LLAssetType::AT_LINK,
@@ -2960,9 +2960,9 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
 					LLPointer<LLInventoryCallback> cb = NULL;
 					link_inventory_item(
 						gAgent.getID(),
-						inv_item->getUUID(),
+						inv_item->getLinkedUUID(),
 						mUUID,
-						std::string(),
+						inv_item->getName(),
 						LLAssetType::AT_LINK,
 						cb);
 				}
-- 
GitLab


From 3027c9fcce0660a3f69a8ce6f6ccbb0de148a3e2 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Fri, 13 Nov 2009 16:58:08 -0500
Subject: [PATCH 272/557] Header file #include cleanup for llinventorymodel and
 llinventorypanel.

Removed a bunch of unnecessary header inclues.

--HG--
branch : avatar-pipeline
---
 indra/newview/llinventorymodel.cpp | 30 +++++----------------
 indra/newview/llinventorypanel.cpp | 43 ++----------------------------
 2 files changed, 9 insertions(+), 64 deletions(-)

diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 3a1d457877d..ffe5f7181dd 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -31,40 +31,24 @@
  */
 
 #include "llviewerprecompiledheaders.h"
-
 #include "llinventorymodel.h"
 
-#include "llassetstorage.h"
-#include "llcrc.h"
-#include "lldir.h"
-#include "llsys.h"
-#include "llxfermanager.h"
-#include "message.h"
-
 #include "llagent.h"
 #include "llagentwearables.h"
-#include "llfloater.h"
-#include "llfocusmgr.h"
-#include "llinventorybridge.h"
-#include "llinventoryfunctions.h"
 #include "llinventorypanel.h"
 #include "llfloaterinventory.h"
-#include "llviewerfoldertype.h"
-#include "llviewerinventory.h"
+#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
+#include "llwindow.h"
+#include "llviewercontrol.h"
+#include "llpreview.h" 
 #include "llviewermessage.h"
+#include "llviewerfoldertype.h"
 #include "llviewerwindow.h"
-#include "llviewerregion.h"
 #include "llappviewer.h"
-#include "lldbstrings.h"
-#include "llviewerstats.h"
-#include "llmutelist.h"
-#include "llnotifications.h"
+#include "llviewerregion.h"
 #include "llcallbacklist.h"
-#include "llpreview.h"
-#include "llviewercontrol.h"
 #include "llvoavatarself.h"
-#include "llsdutil.h"
-#include <deque>
 
 //#define DIFF_INVENTORY_FILES
 #ifdef DIFF_INVENTORY_FILES
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index edb65511bc2..6b1f7313dd7 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -38,55 +38,16 @@
 
 // Seraph TODO: Remove unnecessary headers
 
-// library includes
 #include "llagent.h"
 #include "llagentwearables.h"
-#include "llcallingcard.h"
-#include "llfloaterreg.h"
-#include "llsdserialize.h"
-#include "llfiltereditor.h"
-#include "llspinctrl.h"
-#include "llui.h"
-#include "message.h"
-
-// newview includes
 #include "llappearancemgr.h"
-#include "llappviewer.h"
-#include "llfirstuse.h"
-#include "llfloaterchat.h"
-#include "llfloatercustomize.h"
-#include "llfocusmgr.h"
-#include "llfolderview.h"
-#include "llgesturemgr.h"
-#include "lliconctrl.h"
+#include "llfloaterreg.h"
 #include "llimview.h"
 #include "llinventorybridge.h"
-#include "llinventoryclipboard.h"
-#include "llinventorymodel.h"
-#include "lllineeditor.h"
-#include "llmenugl.h"
-#include "llpreviewanim.h"
-#include "llpreviewgesture.h"
-#include "llpreviewnotecard.h"
-#include "llpreviewscript.h"
-#include "llpreviewsound.h"
-#include "llpreviewtexture.h"
-#include "llresmgr.h"
-#include "llscrollbar.h"
 #include "llscrollcontainer.h"
-#include "llselectmgr.h"
-#include "lltabcontainer.h"
-#include "lltooldraganddrop.h"
-#include "lluictrlfactory.h"
 #include "llviewerfoldertype.h"
-#include "llviewerinventory.h"
-#include "llviewermessage.h"
-#include "llviewerobjectlist.h"
-#include "llviewerregion.h"
-#include "llviewerwindow.h"
-#include "llvoavatarself.h"
-#include "llwearablelist.h"
 #include "llimfloater.h"
+#include "llvoavatarself.h"
 
 static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel");
 
-- 
GitLab


From 21357c482256be27780ebf46749b5ccad1c96a9d Mon Sep 17 00:00:00 2001
From: Erica <erica@lindenlab.com>
Date: Fri, 13 Nov 2009 14:28:58 -0800
Subject: [PATCH 273/557] fixing media texture image names - removing file
 extention

---
 .../skins/default/textures/textures.xml       | 56 +++++++++----------
 1 file changed, 28 insertions(+), 28 deletions(-)

diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index eea2dfb1a1c..d5293bdbb51 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -23,13 +23,13 @@
   <texture name="Arrow_Up" file_name="widgets/Arrow_Up.png" preload="true" />
   <texture name="Arrow_Down" file_name="widgets/Arrow_Down.png" preload="true" />
 
-  <texture name="AudioMute_Off.png" file_name="icons/AudioMute_Off.png" preload="false" />
-  <texture name="AudioMute_Over.png" file_name="icons/AudioMute_Over.png" preload="false" />
-  <texture name="AudioMute_Press.png" file_name="icons/AudioMute_Press.png" preload="false" />
+  <texture name="AudioMute_Off" file_name="icons/AudioMute_Off.png" preload="false" />
+  <texture name="AudioMute_Over" file_name="icons/AudioMute_Over.png" preload="false" />
+  <texture name="AudioMute_Press" file_name="icons/AudioMute_Press.png" preload="false" />
 
-  <texture name="Audio_Off.png" file_name="icons/Audio_Off.png" preload="false" />
-  <texture name="Audio_Over.png" file_name="icons/Audio_Over.png" preload="false" />
-  <texture name="Audio_Press.png" file_name="icons/Audio_Press.png" preload="false" />
+  <texture name="Audio_Off" file_name="icons/Audio_Off.png" preload="false" />
+  <texture name="Audio_Over" file_name="icons/Audio_Over.png" preload="false" />
+  <texture name="Audio_Press" file_name="icons/Audio_Press.png" preload="false" />
 
   <texture name="BackArrow_Disabled" file_name="icons/BackArrow_Disabled.png" preload="false" />
   <texture name="BackArrow_Off" file_name="icons/BackArrow_Off.png" preload="false" />
@@ -109,9 +109,9 @@
 
   <texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" />
 
-  <texture name="ExternalBrowser_Off.png" file_name="icons/ExternalBrowser_Off.png" preload="false" />
-  <texture name="ExternalBrowser_Over.png" file_name="icons/ExternalBrowser_Over.png" preload="false" />
-  <texture name="ExternalBrowser_Press.png" file_name="icons/ExternalBrowser_Press.png" preload="false" />
+  <texture name="ExternalBrowser_Off" file_name="icons/ExternalBrowser_Off.png" preload="false" />
+  <texture name="ExternalBrowser_Over" file_name="icons/ExternalBrowser_Over.png" preload="false" />
+  <texture name="ExternalBrowser_Press" file_name="icons/ExternalBrowser_Press.png" preload="false" />
 
   <texture name="Favorite_Star_Active" file_name="navbar/Favorite_Star_Active.png" preload="false" />
   <texture name="Favorite_Star_Off" file_name="navbar/Favorite_Star_Off.png" preload="false" />
@@ -338,12 +338,12 @@
  <texture name="parcel_lght_Voice" file_name="icons/parcel_lght_Voice.png" preload="false" />
  <texture name="parcel_lght_VoiceNo" file_name="icons/parcel_lght_VoiceNo.png" preload="false" />
 
-  <texture name="Pause_Off.png" file_name="icons/Pause_Off.png" preload="false" />
-  <texture name="Pause_Over.png" file_name="icons/Pause_Over.png" preload="false" />
-  <texture name="Pause_Press.png" file_name="icons/Pause_Press.png" preload="false" />
-  <texture name="Play_Off.png" file_name="icons/Play_Off.png" preload="false" />
-  <texture name="Play_Over.png" file_name="icons/Play_Over.png" preload="false" />
-  <texture name="Play_Press.png" file_name="icons/Play_Press.png" preload="false" />
+  <texture name="Pause_Off" file_name="icons/Pause_Off.png" preload="false" />
+  <texture name="Pause_Over" file_name="icons/Pause_Over.png" preload="false" />
+  <texture name="Pause_Press" file_name="icons/Pause_Press.png" preload="false" />
+  <texture name="Play_Off" file_name="icons/Play_Off.png" preload="false" />
+  <texture name="Play_Over" file_name="icons/Play_Over.png" preload="false" />
+  <texture name="Play_Press" file_name="icons/Play_Press.png" preload="false" />
 
   <texture name="Progress_1" file_name="icons/Progress_1.png" preload="false" />
   <texture name="Progress_2" file_name="icons/Progress_2.png" preload="false" />
@@ -425,12 +425,12 @@
   <texture name="SegmentedBtn_Right_Selected_Press" file_name="widgets/SegmentedBtn_Right_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
   <texture name="SegmentedBtn_Right_Selected_Disabled" file_name="widgets/SegmentedBtn_Right_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
 
-  <texture name="SkipBackward_Off.png" file_name="icons/SkipBackward_Off.png" preload="false" />
-  <texture name="SkipBackward_Over.png" file_name="icons/SkipBackward_Over.png" preload="false" />
-  <texture name="SkipBackward_Press.png" file_name="icons/SkipBackward_Press.png" preload="false" />
-  <texture name="SkipForward_Off.png" file_name="icons/SkipForward_Off.png" preload="false" />
-  <texture name="SkipForward_Over.png" file_name="icons/SkipForward_Over.png" preload="false" />
-  <texture name="SkipForward_Press.png" file_name="icons/SkipForward_Press.png" preload="false" />
+  <texture name="SkipBackward_Off" file_name="icons/SkipBackward_Off.png" preload="false" />
+  <texture name="SkipBackward_Over" file_name="icons/SkipBackward_Over.png" preload="false" />
+  <texture name="SkipBackward_Press" file_name="icons/SkipBackward_Press.png" preload="false" />
+  <texture name="SkipForward_Off" file_name="icons/SkipForward_Off.png" preload="false" />
+  <texture name="SkipForward_Over" file_name="icons/SkipForward_Over.png" preload="false" />
+  <texture name="SkipForward_Press" file_name="icons/SkipForward_Press.png" preload="false" />
 
   <texture name="SliderTrack_Horiz" file_name="widgets/SliderTrack_Horiz.png" scale.left="4" scale.top="4" scale.right="100" scale.bottom="2" />
   <texture name="SliderTrack_Vert" file_name="widgets/SliderTrack_Vert.png" scale.left="2" scale.top="100" scale.right="4" scale.bottom="4" />
@@ -449,9 +449,9 @@
   <texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="true" />
   <texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="true" />
 
-  <texture name="StopReload_Off.png" file_name="icons/StopReload_Off.png" preload="false" />
-  <texture name="StopReload_Over.png" file_name="icons/StopReload_Over.png" preload="false" />
-  <texture name="StopReload_Press.png" file_name="icons/StopReload_Press.png" preload="false" />
+  <texture name="StopReload_Off" file_name="icons/StopReload_Off.png" preload="false" />
+  <texture name="StopReload_Over" file_name="icons/StopReload_Over.png" preload="false" />
+  <texture name="StopReload_Press" file_name="icons/StopReload_Press.png" preload="false" />
 
   <texture name="TabIcon_Appearance_Large" file_name="taskpanel/TabIcon_Appearance_Large.png" preload="false" />
   <texture name="TabIcon_Appearance_Off" file_name="taskpanel/TabIcon_Appearance_Off.png" preload="false" />
@@ -531,7 +531,7 @@
   <texture name="Toolbar_Right_Off" file_name="containers/Toolbar_Right_Off.png" preload="false" />
   <texture name="Toolbar_Right_Press" file_name="containers/Toolbar_Right_Press.png" preload="false" />
   <texture name="Toolbar_Right_Selected" file_name="containers/Toolbar_Right_Selected.png" preload="false" />
-  
+
   <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="16" scale.right="100" scale.bottom="3" />
 
   <texture name="TrashItem_Disabled" file_name="icons/TrashItem_Disabled.png" preload="false" />
@@ -563,9 +563,9 @@
 
   <texture name="YouAreHere_Badge" file_name="icons/YouAreHere_Badge.png" preload="false" />
 
-  <texture name="Zoom_Off.png" file_name="icons/Zoom_Off.png" preload="false" />
-  <texture name="Zoom_Over.png" file_name="icons/Zoom_Over.png" preload="false" />
-  <texture name="Zoom_Press.png" file_name="icons/Zoom_Press.png" preload="false" />
+  <texture name="Zoom_Off" file_name="icons/Zoom_Off.png" preload="false" />
+  <texture name="Zoom_Over" file_name="icons/Zoom_Over.png" preload="false" />
+  <texture name="Zoom_Press" file_name="icons/Zoom_Press.png" preload="false" />
 
   <!--WARNING OLD ART *do not use*-->
 
-- 
GitLab


From acdce232994fce7edf9a67a360db2368c5ad6594 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Fri, 13 Nov 2009 17:47:00 -0500
Subject: [PATCH 274/557] Header file cleanup

Removed unnecessary "#include llinventorymodel.h" now that llinventoryobserver was split from llinventorymodel.

--HG--
branch : avatar-pipeline
---
 indra/newview/llagentwearables.cpp        |  2 +-
 indra/newview/llappearancemgr.cpp         |  2 +-
 indra/newview/llassetuploadresponders.cpp |  2 +-
 indra/newview/llcallingcard.cpp           |  2 +-
 indra/newview/llfavoritesbar.h            |  1 +
 indra/newview/llfloaterproperties.cpp     |  1 +
 indra/newview/llfloaterworldmap.cpp       |  1 +
 indra/newview/llfoldervieweventlistener.h |  2 ++
 indra/newview/llfolderviewitem.cpp        |  1 -
 indra/newview/llgesturemgr.h              |  2 +-
 indra/newview/llinventorybridge.h         | 10 ++++++----
 indra/newview/llinventorymodel.cpp        |  1 +
 indra/newview/llinventorymodel.h          |  5 -----
 indra/newview/lllocationinputctrl.cpp     |  2 +-
 indra/newview/llpanelmaininventory.h      |  3 ++-
 indra/newview/llpanelpeople.cpp           |  1 +
 indra/newview/llpreview.h                 |  2 +-
 indra/newview/llpreviewscript.h           |  2 +-
 indra/newview/llsidepaneliteminfo.cpp     |  1 +
 indra/newview/lltexturectrl.cpp           |  2 +-
 indra/newview/lltracker.cpp               |  1 +
 indra/newview/llviewermessage.cpp         |  1 +
 22 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 5dbbcd727ce..17e7eea2f12 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -39,7 +39,7 @@
 #include "llfloatercustomize.h"
 #include "llfloaterinventory.h"
 #include "llinventorybridge.h"
-#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
 #include "llinventorypanel.h"
 #include "llnotify.h"
 #include "llviewerregion.h"
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index e46cfe6af91..61c1081d224 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -38,7 +38,7 @@
 #include "llfloatercustomize.h"
 #include "llgesturemgr.h"
 #include "llinventorybridge.h"
-#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
 #include "llnotifications.h"
 #include "llpanelappearance.h"
 #include "llsidetray.h"
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
index 4d85ecb97cd..38843c72215 100644
--- a/indra/newview/llassetuploadresponders.cpp
+++ b/indra/newview/llassetuploadresponders.cpp
@@ -40,7 +40,7 @@
 #include "llfloaterbuycurrency.h"
 #include "llfilepicker.h"
 #include "llnotify.h"
-#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
 #include "llinventorypanel.h"
 #include "llfloaterinventory.h"
 #include "llpermissionsflags.h"
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index e8812d87ee0..0b10255c2f2 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -51,7 +51,7 @@
 
 #include "llagent.h"
 #include "llbutton.h"
-//#include "llinventory.h"
+#include "llinventoryobserver.h"
 #include "llinventorymodel.h"
 #include "llnotify.h"
 #include "llresmgr.h"
diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h
index e90d13f9d51..20a324c67c9 100644
--- a/indra/newview/llfavoritesbar.h
+++ b/indra/newview/llfavoritesbar.h
@@ -35,6 +35,7 @@
 
 #include "lluictrl.h"
 
+#include "llinventoryobserver.h"
 #include "llinventorymodel.h"
 
 class LLFavoritesBarCtrl : public LLUICtrl, public LLInventoryObserver
diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp
index 928126bff94..e0d4a59d9d6 100644
--- a/indra/newview/llfloaterproperties.cpp
+++ b/indra/newview/llfloaterproperties.cpp
@@ -44,6 +44,7 @@
 #include "llbutton.h"
 #include "llcheckboxctrl.h"
 #include "llavataractions.h"
+#include "llinventoryobserver.h"
 #include "llinventorymodel.h"
 #include "lllineeditor.h"
 //#include "llspinctrl.h"
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index 7d2eb98111f..85847e5fce8 100644
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -51,6 +51,7 @@
 #include "llfloaterreg.h"		// getTypedInstance()
 #include "llfocusmgr.h"
 #include "llinventorymodel.h"
+#include "llinventoryobserver.h"
 #include "lllandmarklist.h"
 #include "lllineeditor.h"
 #include "llregionhandle.h"
diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h
index 60ece75cead..473d0be912b 100644
--- a/indra/newview/llfoldervieweventlistener.h
+++ b/indra/newview/llfoldervieweventlistener.h
@@ -34,6 +34,8 @@
 #include "lldarray.h"	// JAMESDEBUG convert to std::vector
 #include "llfoldertype.h"
 #include "llfontgl.h"	// just for StyleFlags enum
+#include "llinventorytype.h"
+#include "llpermissionsflags.h"
 #include "llpointer.h"
 
 
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 6fdaefd21ab..102651f4320 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -38,7 +38,6 @@
 #include "llfoldervieweventlistener.h"
 #include "llinventorybridge.h"	// for LLItemBridge in LLInventorySort::operator()
 #include "llinventoryfilter.h"
-#include "llinventorymodel.h"	// *TODO: make it take a pointer to an inventory-model interface
 #include "llviewercontrol.h"	// gSavedSettings
 #include "llviewerwindow.h"		// Argh, only for setCursor()
 
diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h
index 947773d66dc..c8b26f7309c 100644
--- a/indra/newview/llgesturemgr.h
+++ b/indra/newview/llgesturemgr.h
@@ -38,7 +38,7 @@
 #include <vector>
 
 #include "llassetstorage.h"	// LLAssetType
-#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
 #include "llsingleton.h"
 #include "llviewerinventory.h"
 
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 3ffeb55d6cf..4c7b0a0517c 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -33,14 +33,16 @@
 #ifndef LL_LLINVENTORYBRIDGE_H
 #define LL_LLINVENTORYBRIDGE_H
 
-#include "llfloaterproperties.h"
-#include "llwearable.h"
-#include "llviewercontrol.h"
 #include "llcallingcard.h"
-#include "llinventorymodel.h"
+#include "llfloaterproperties.h"
 #include "llfoldervieweventlistener.h"
+#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
+#include "llviewercontrol.h"
+#include "llwearable.h"
 
 class LLInventoryPanel;
+class LLInventoryModel;
 class LLMenuGL;
 
 enum EInventoryIcon
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index ffe5f7181dd..a8e5c4c216e 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -39,6 +39,7 @@
 #include "llfloaterinventory.h"
 #include "llinventorybridge.h"
 #include "llinventoryfunctions.h"
+#include "llinventoryobserver.h"
 #include "llwindow.h"
 #include "llviewercontrol.h"
 #include "llpreview.h" 
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index bd64591194c..3c1f606d5c1 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -46,11 +46,6 @@
 #include <string>
 #include <vector>
 
-// ! REFACTOR ! Remove llinventoryobservers.h and have other files that need it explicitly 
-// include llinventoryobservers.h instead of llinventorymodel.h .  This will reduce dependency on
-// llinventorymodel.h.
-#include "llinventoryobserver.h" 
-
 class LLInventoryObserver;
 class LLInventoryObject;
 class LLInventoryItem;
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 8fe317a2921..7e35cfa04c2 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -45,7 +45,7 @@
 #include "lltooltip.h"
 
 // newview includes
-#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
 #include "lllandmarkactions.h"
 #include "lllandmarklist.h"
 #include "lllocationhistory.h"
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index 29e9baa6cf2..fbc0f09c506 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -35,7 +35,8 @@
 #define LL_LLPANELMAININVENTORY_H
 
 #include "llpanel.h"
-#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
+
 #include "llfolderview.h"
 
 class LLFolderViewItem;
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 2bbb2b71536..69edccf09fe 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -54,6 +54,7 @@
 #include "llfriendcard.h"
 #include "llgroupactions.h"
 #include "llgrouplist.h"
+#include "llinventoryobserver.h"
 #include "llpanelpeoplemenus.h"
 #include "llrecentpeople.h"
 #include "llviewercontrol.h"		// for gSavedSettings
diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h
index 506c135ca64..3b9f7f98827 100644
--- a/indra/newview/llpreview.h
+++ b/indra/newview/llpreview.h
@@ -37,7 +37,7 @@
 #include "llresizehandle.h"
 #include "llpointer.h"
 #include "lluuid.h"
-#include "llinventorymodel.h"	// LLInventoryObserver
+#include "llinventoryobserver.h"
 #include <map>
 
 class LLInventoryItem;
diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h
index a00f580e327..28a409d3ee8 100644
--- a/indra/newview/llpreviewscript.h
+++ b/indra/newview/llpreviewscript.h
@@ -41,7 +41,6 @@
 #include "lliconctrl.h"
 #include "llframetimer.h"
 
-
 class LLMessageSystem;
 class LLTextEditor;
 class LLButton;
@@ -52,6 +51,7 @@ struct 	LLEntryAndEdCore;
 class LLMenuBarGL;
 class LLFloaterScriptSearch;
 class LLKeywordToken;
+class LLViewerInventoryItem;
 
 // Inner, implementation class.  LLPreviewScript and LLLiveLSLEditor each own one of these.
 class LLScriptEdCore : public LLPanel
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index 9d2960fbed1..a3efea7b7e2 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -41,6 +41,7 @@
 #include "llfloaterreg.h"
 #include "llgroupactions.h"
 #include "llinventorymodel.h"
+#include "llinventoryobserver.h"
 #include "lllineeditor.h"
 #include "llradiogroup.h"
 #include "llviewercontrol.h"
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index de00ca8420b..5f7c2f5080b 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -48,7 +48,7 @@
 #include "llfoldervieweventlistener.h"
 #include "llinventory.h"
 #include "llinventoryfunctions.h"
-#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
 #include "llinventorypanel.h"
 #include "llfloaterinventory.h"
 #include "lllineeditor.h"
diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp
index 1a617176588..407cc23d0d7 100644
--- a/indra/newview/lltracker.cpp
+++ b/indra/newview/lltracker.cpp
@@ -55,6 +55,7 @@
 #include "llhudtext.h"
 #include "llhudview.h"
 #include "llinventorymodel.h"
+#include "llinventoryobserver.h"
 #include "lllandmarklist.h"
 #include "llsky.h"
 #include "llui.h"
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index f0c1823def0..7f25e567d03 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -89,6 +89,7 @@
 #include "llhudeffecttrail.h"
 #include "llhudmanager.h"
 #include "llinventorymodel.h"
+#include "llinventoryobserver.h"
 #include "llinventorypanel.h"
 #include "llfloaterinventory.h"
 #include "llmenugl.h"
-- 
GitLab


From 6cb4b27897462582428e9d469feb6bf8c9335b06 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Fri, 13 Nov 2009 14:48:24 -0800
Subject: [PATCH 275/557] Fix for DEV-42161
 (LLViewerMediaImpl::navigateInternal spam when editing object properties).

Made LLPanelMediaSettingsGeneral::updateMediaPreview() only do a navigate when the URL actually changes.
---
 indra/newview/llpanelmediasettingsgeneral.cpp | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp
index 2cf56d55711..ad8a379cc1d 100644
--- a/indra/newview/llpanelmediasettingsgeneral.cpp
+++ b/indra/newview/llpanelmediasettingsgeneral.cpp
@@ -322,13 +322,19 @@ void LLPanelMediaSettingsGeneral::updateMediaPreview()
 {
 	if ( mHomeURL->getValue().asString().length() > 0 )
 	{
-		mPreviewMedia->navigateTo( mHomeURL->getValue().asString() );
+		if(mPreviewMedia->getCurrentNavUrl() != mHomeURL->getValue().asString())
+		{
+			mPreviewMedia->navigateTo( mHomeURL->getValue().asString() );
+		}
 	}
 	else
 	// new home URL will be empty if media is deleted so display a 
 	// "preview goes here" data url page
 	{
-		mPreviewMedia->navigateTo( CHECKERBOARD_DATA_URL );
+		if(mPreviewMedia->getCurrentNavUrl() != CHECKERBOARD_DATA_URL)
+		{
+			mPreviewMedia->navigateTo( CHECKERBOARD_DATA_URL );
+		}
 	};
 }
 
-- 
GitLab


From a4addf39e5293e008b534c9c1cfcad14956afe1a Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Fri, 13 Nov 2009 15:09:59 -0800
Subject: [PATCH 276/557] Small mods based on code review feedback from James

---
 indra/newview/llpanelprimmediacontrols.cpp | 59 +++++++++++-----------
 1 file changed, 29 insertions(+), 30 deletions(-)

diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 9744d9ac0d6..12ad070efd5 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -117,34 +117,34 @@ LLPanelPrimMediaControls::~LLPanelPrimMediaControls()
 
 BOOL LLPanelPrimMediaControls::postBuild()
 {
-	mMediaRegion			= getChild<LLView>("media_region"); assert(mMediaRegion);
-	mBackCtrl				= getChild<LLUICtrl>("back"); assert(mBackCtrl);
-	mFwdCtrl				= getChild<LLUICtrl>("fwd"); assert(mFwdCtrl);
-	mReloadCtrl				= getChild<LLUICtrl>("reload"); assert(mReloadCtrl);
-	mPlayCtrl				= getChild<LLUICtrl>("play"); assert(mPlayCtrl);
-	mPauseCtrl				= getChild<LLUICtrl>("pause"); assert(mPauseCtrl);
-	mStopCtrl				= getChild<LLUICtrl>("stop"); assert(mStopCtrl);
-	mMediaStopCtrl			= getChild<LLUICtrl>("media_stop"); assert(mMediaStopCtrl);
-	mHomeCtrl				= getChild<LLUICtrl>("home"); assert(mHomeCtrl);
-	mUnzoomCtrl				= getChild<LLUICtrl>("close"); assert(mUnzoomCtrl); // This is actually "unzoom" 
-	mOpenCtrl				= getChild<LLUICtrl>("new_window"); assert(mOpenCtrl);
-	mZoomCtrl				= getChild<LLUICtrl>("zoom_frame"); assert(mZoomCtrl);
-	mMediaProgressPanel		= getChild<LLPanel>("media_progress_indicator"); assert(mMediaProgressPanel);
-	mMediaProgressBar		= getChild<LLProgressBar>("media_progress_bar"); assert(mMediaProgressBar);
-	mMediaAddressCtrl		= getChild<LLUICtrl>("media_address"); assert(mMediaAddressCtrl);
-	mMediaAddress			= getChild<LLUICtrl>("media_address_url"); assert(mMediaAddress);
-	mMediaPlaySliderPanel	= getChild<LLUICtrl>("media_play_position"); assert(mMediaPlaySliderPanel);
-	mMediaPlaySliderCtrl	= getChild<LLUICtrl>("media_play_slider"); assert(mMediaPlaySliderCtrl);
-	mVolumeCtrl				= getChild<LLUICtrl>("media_volume"); assert(mVolumeCtrl);
-	mVolumeBtn				= getChild<LLButton>("media_volume_button"); assert(mVolumeBtn);
-	mVolumeUpCtrl			= getChild<LLUICtrl>("volume_up"); assert(mVolumeUpCtrl);
-	mVolumeDownCtrl			= getChild<LLUICtrl>("volume_down"); assert(mVolumeDownCtrl);
-	mWhitelistIcon			= getChild<LLIconCtrl>("media_whitelist_flag"); assert(mWhitelistIcon);
-	mSecureLockIcon			= getChild<LLIconCtrl>("media_secure_lock_flag"); assert(mSecureLockIcon);
-	mMediaControlsStack		= getChild<LLLayoutStack>("media_controls"); assert(mMediaControlsStack);
-	mLeftBookend			= getChild<LLUICtrl>("left_bookend"); assert(mLeftBookend);
-	mRightBookend			= getChild<LLUICtrl>("right_bookend"); assert(mRightBookend);
-	mBackgroundImage		= LLUI::getUIImage(getString("control_background_image_name")); assert(mBackgroundImage);
+	mMediaRegion			= getChild<LLView>("media_region");
+	mBackCtrl				= getChild<LLUICtrl>("back");
+	mFwdCtrl				= getChild<LLUICtrl>("fwd");
+	mReloadCtrl				= getChild<LLUICtrl>("reload");
+	mPlayCtrl				= getChild<LLUICtrl>("play");
+	mPauseCtrl				= getChild<LLUICtrl>("pause");
+	mStopCtrl				= getChild<LLUICtrl>("stop");
+	mMediaStopCtrl			= getChild<LLUICtrl>("media_stop");
+	mHomeCtrl				= getChild<LLUICtrl>("home");
+	mUnzoomCtrl				= getChild<LLUICtrl>("close"); // This is actually "unzoom" 
+	mOpenCtrl				= getChild<LLUICtrl>("new_window");
+	mZoomCtrl				= getChild<LLUICtrl>("zoom_frame");
+	mMediaProgressPanel		= getChild<LLPanel>("media_progress_indicator");
+	mMediaProgressBar		= getChild<LLProgressBar>("media_progress_bar");
+	mMediaAddressCtrl		= getChild<LLUICtrl>("media_address");
+	mMediaAddress			= getChild<LLUICtrl>("media_address_url");
+	mMediaPlaySliderPanel	= getChild<LLUICtrl>("media_play_position");
+	mMediaPlaySliderCtrl	= getChild<LLUICtrl>("media_play_slider");
+	mVolumeCtrl				= getChild<LLUICtrl>("media_volume");
+	mVolumeBtn				= getChild<LLButton>("media_volume_button");
+	mVolumeUpCtrl			= getChild<LLUICtrl>("volume_up");
+	mVolumeDownCtrl			= getChild<LLUICtrl>("volume_down");
+	mWhitelistIcon			= getChild<LLIconCtrl>("media_whitelist_flag");
+	mSecureLockIcon			= getChild<LLIconCtrl>("media_secure_lock_flag");
+	mMediaControlsStack		= getChild<LLLayoutStack>("media_controls");
+	mLeftBookend			= getChild<LLUICtrl>("left_bookend");
+	mRightBookend			= getChild<LLUICtrl>("right_bookend");
+	mBackgroundImage		= LLUI::getUIImage(getString("control_background_image_name"));
 
 	// These are currently removed...but getChild creates a "dummy" widget.
 	// This class handles them missing.
@@ -729,8 +729,7 @@ bool LLPanelPrimMediaControls::isMouseOver()
 		getWindow()->getCursorPosition(&cursor_pos_window);
 		getWindow()->convertCoords(cursor_pos_window, &cursor_pos_gl);
 				
-		//FIXME: rewrite as LLViewQuery or get hover set from LLViewerWindow?
-		if(mMediaControlsStack && mMediaControlsStack->getVisible())
+		if(mMediaControlsStack->getVisible())
 		{
 			mMediaControlsStack->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y);
 
-- 
GitLab


From be429a3ae9bdb45b1fe4bbc185814604167ab18c Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Fri, 13 Nov 2009 18:19:22 -0500
Subject: [PATCH 277/557] EXT-2429 body parts out of sync with COF

Visual param definitions weren't working properly when the wearable being
loaded had fewer visual parameters than the current definition of the wearable.
This occurred when you were loading wearables that had been created in older
versions of the client (or from the library).

Added missing parameters to mSavedVisualParamMap, and modified revertValues()
to ensure that the two maps are kept fully in sync on finishing loading the
wearable and when reverting the values.

Code reviewed by Vir

--HG--
branch : avatar-pipeline
---
 indra/newview/llwearable.cpp | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index c5c97e7649c..e37dffd5269 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -831,6 +831,7 @@ void LLWearable::addVisualParam(LLVisualParam *param)
 	}
 	param->setIsDummy(FALSE);
 	mVisualParamIndexMap[param->getID()] = param;
+	mSavedVisualParamMap[param->getID()] = param->getDefaultWeight();
 }
 
 void LLWearable::setVisualParams()
@@ -933,11 +934,39 @@ void LLWearable::setClothesColor( S32 te, const LLColor4& new_color, BOOL upload
 void LLWearable::revertValues()
 {
 	//update saved settings so wearable is no longer dirty
+	// non-driver params first
 	for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++)
 	{
 		S32 id = iter->first;
 		F32 value = iter->second;
-		setVisualParamWeight(id, value, TRUE);
+		LLVisualParam *param = getVisualParam(id);
+		if(param &&  !dynamic_cast<LLDriverParam*>(param) )
+		{
+			setVisualParamWeight(id, value, TRUE);
+		}
+	}
+
+	//then driver params
+	for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++)
+	{
+		S32 id = iter->first;
+		F32 value = iter->second;
+		LLVisualParam *param = getVisualParam(id);
+		if(param &&  dynamic_cast<LLDriverParam*>(param) )
+		{
+			setVisualParamWeight(id, value, TRUE);
+		}
+	}
+
+	// make sure that saved values are sane
+	for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++)
+	{
+		S32 id = iter->first;
+		LLVisualParam *param = getVisualParam(id);
+		if( param )
+		{
+			mSavedVisualParamMap[id] = param->getWeight();
+		}
 	}
 
 	syncImages(mSavedTEMap, mTEMap);
-- 
GitLab


From 42319d1ab89bd3d6ba193cc2c374ddc1571f2bdf Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Fri, 13 Nov 2009 18:22:00 -0500
Subject: [PATCH 278/557] Header file cleanup

Moved LLInventoryPanelObserver to be private to LLInventoryPanel

--HG--
branch : avatar-pipeline
---
 indra/newview/llinventorybridge.cpp | 10 ----------
 indra/newview/llinventorybridge.h   | 16 ----------------
 indra/newview/llinventorypanel.cpp  | 26 ++++++++++++++++++++++++--
 3 files changed, 24 insertions(+), 28 deletions(-)

diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index d7be09efa9a..2a1fdb081e5 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -162,16 +162,6 @@ std::string ICON_NAME[ICON_NAME_COUNT] =
 	"inv_item_linkfolder.tga"
 };
 
-
-// +=================================================+
-// |        LLInventoryPanelObserver                 |
-// +=================================================+
-void LLInventoryPanelObserver::changed(U32 mask)
-{
-	mIP->modelChanged(mask);
-}
-
-
 // +=================================================+
 // |        LLInvFVBridge                            |
 // +=================================================+
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 4c7b0a0517c..56cb0f93ed9 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -107,22 +107,6 @@ struct LLAttachmentRezAction
 	S32		mAttachPt;
 };
 
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryPanelObserver
-//
-// Bridge to support knowing when the inventory has changed.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLInventoryPanelObserver : public LLInventoryObserver
-{
-public:
-	LLInventoryPanelObserver(LLInventoryPanel* ip) : mIP(ip) {}
-	virtual ~LLInventoryPanelObserver() {}
-	virtual void changed(U32 mask);
-protected:
-	LLInventoryPanel* mIP;
-};
-
 const std::string safe_inv_type_lookup(LLInventoryType::EType inv_type);
 void hide_context_entries(LLMenuGL& menu, 
 						const std::vector<std::string> &entries_to_show,
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 6b1f7313dd7..dc704f2b82c 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -36,8 +36,6 @@
 
 #include "llinventorypanel.h"
 
-// Seraph TODO: Remove unnecessary headers
-
 #include "llagent.h"
 #include "llagentwearables.h"
 #include "llappearancemgr.h"
@@ -56,6 +54,22 @@ const std::string LLInventoryPanel::RECENTITEMS_SORT_ORDER = std::string("Recent
 const std::string LLInventoryPanel::INHERIT_SORT_ORDER = std::string("");
 static const LLInventoryFVBridgeBuilder INVENTORY_BRIDGE_BUILDER;
 
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryPanelObserver
+//
+// Bridge to support knowing when the inventory has changed.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryPanelObserver : public LLInventoryObserver
+{
+public:
+	LLInventoryPanelObserver(LLInventoryPanel* ip) : mIP(ip) {}
+	virtual ~LLInventoryPanelObserver() {}
+	virtual void changed(U32 mask);
+protected:
+	LLInventoryPanel* mIP;
+};
+
 LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :	
 	LLPanel(p),
 	mInventoryObserver(NULL),
@@ -872,3 +886,11 @@ void example_param_block_usage()
 
 	LLUICtrlFactory::create<LLInventoryPanel>(param_block);
 }
+
+// +=================================================+
+// |        LLInventoryPanelObserver                 |
+// +=================================================+
+void LLInventoryPanelObserver::changed(U32 mask)
+{
+	mIP->modelChanged(mask);
+}
-- 
GitLab


From 3abee9a4506ed225f15934ab82881e16fa5f9113 Mon Sep 17 00:00:00 2001
From: Leyla Farazha <leyla@lindenlab.com>
Date: Fri, 13 Nov 2009 15:56:46 -0800
Subject: [PATCH 279/557] Fix for nearby chat toasts occluding the bottom bar.

---
 indra/newview/llnearbychathandler.cpp | 11 -----------
 1 file changed, 11 deletions(-)

diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index cd77f59ee18..458845fff3f 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -63,8 +63,6 @@ class LLNearbyChatScreenChannel: public LLScreenChannelBase
 public:
 	LLNearbyChatScreenChannel(const LLUUID& id):LLScreenChannelBase(id) { mStopProcessing = false;};
 
-	void init				(S32 channel_left, S32 channel_right);
-
 	void addNotification	(LLSD& notification);
 	void arrangeToasts		();
 	void showToastsBottom	();
@@ -120,15 +118,6 @@ class LLNearbyChatScreenChannel: public LLScreenChannelBase
 	bool	mStopProcessing;
 };
 
-void LLNearbyChatScreenChannel::init(S32 channel_left, S32 channel_right)
-{
-	S32 channel_top = gViewerWindow->getWorldViewRectRaw().getHeight();
-	S32 channel_bottom = gViewerWindow->getWorldViewRectRaw().mBottom;
-	setRect(LLRect(channel_left, channel_top, channel_right, channel_bottom));
-	setVisible(TRUE);
-}
-
-
 void	LLNearbyChatScreenChannel::createOverflowToast(S32 bottom, F32 timer)
 {
 	//we don't need overflow toast in nearby chat
-- 
GitLab


From c8ed7710c5305d1a1ec65a04543e3a2b1aad24f1 Mon Sep 17 00:00:00 2001
From: Leyla Farazha <leyla@lindenlab.com>
Date: Fri, 13 Nov 2009 15:57:38 -0800
Subject: [PATCH 280/557] Backed out changeset db8e08f8ba36 adding
 main_view.xml change rev 4863 back

---
 indra/newview/skins/default/xui/en/main_view.xml | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
index 08f7ee456e4..9e35c95d45a 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -51,6 +51,13 @@
                name="main_view"
                user_resize="true"
                width="500">
+          <view bottom="500"
+                follows="all"
+                height="500"
+                left="0"
+                mouse_opaque="false"
+                name="world_view_rect"
+                width="500"/>
           <layout_stack border_size="0"
                         bottom="500"
                         follows="all"
@@ -66,13 +73,6 @@
                    mouse_opaque="false"
                    name="hud container"
                    width="500">
-              <view bottom="500"
-                    follows="all"
-                    height="500"
-                    left="0"
-                    mouse_opaque="false"
-                    name="world_view_rect"
-                    width="500"/>
               <panel follows="right|top|bottom"
                      height="500"
                      mouse_opaque="false"
-- 
GitLab


From 0daf4297d43e97a4b715196e9821cc290ebd65b3 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Fri, 13 Nov 2009 16:16:12 -0800
Subject: [PATCH 281/557] EXT-2484 Auto Set Touch to Buy when a user checks the
 For Sale option Reviewed with Richard.

---
 indra/newview/llpanelpermissions.cpp | 35 +++++++++++++++++++---------
 1 file changed, 24 insertions(+), 11 deletions(-)

diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 2d3f9013709..1051326e72e 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -970,19 +970,32 @@ void LLPanelPermissions::setAllSaleInfo()
 	if (price < 0)
 		sale_type = LLSaleInfo::FS_NOT;
 
-	LLSaleInfo sale_info(sale_type, price);
-	LLSelectMgr::getInstance()->selectionSetObjectSaleInfo(sale_info);
+	LLSaleInfo old_sale_info;
+	LLSelectMgr::getInstance()->selectGetSaleInfo(old_sale_info);
+
+	LLSaleInfo new_sale_info(sale_type, price);
+	LLSelectMgr::getInstance()->selectionSetObjectSaleInfo(new_sale_info);
 	
-	// If turned off for-sale, make sure click-action buy is turned
-	// off as well
-	if (sale_type == LLSaleInfo::FS_NOT)
+	U8 old_click_action = 0;
+	LLSelectMgr::getInstance()->selectionGetClickAction(&old_click_action);
+
+	if (old_sale_info.isForSale()
+		&& !new_sale_info.isForSale()
+		&& old_click_action == CLICK_ACTION_BUY)
 	{
-		U8 click_action = 0;
-		LLSelectMgr::getInstance()->selectionGetClickAction(&click_action);
-		if (click_action == CLICK_ACTION_BUY)
-		{
-			LLSelectMgr::getInstance()->selectionSetClickAction(CLICK_ACTION_TOUCH);
-		}
+		// If turned off for-sale, make sure click-action buy is turned
+		// off as well
+		LLSelectMgr::getInstance()->
+			selectionSetClickAction(CLICK_ACTION_TOUCH);
+	}
+	else if (new_sale_info.isForSale()
+		&& !old_sale_info.isForSale()
+		&& old_click_action == CLICK_ACTION_TOUCH)
+	{
+		// If just turning on for-sale, preemptively turn on one-click buy
+		// unless user have a different click action set
+		LLSelectMgr::getInstance()->
+			selectionSetClickAction(CLICK_ACTION_BUY);
 	}
 }
 
-- 
GitLab


From 890da1d3914ffb52d0899c333fe8b8c280fe4d34 Mon Sep 17 00:00:00 2001
From: richard <none@none>
Date: Fri, 13 Nov 2009 16:50:17 -0800
Subject: [PATCH 282/557] fix for layout of urls with icons

---
 indra/llui/lltextbase.cpp | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 7b1aaac35cb..313d37379b3 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -2377,6 +2377,14 @@ bool LLNormalTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& widt
 	width = mStyle->getFont()->getWidth(text.c_str(), mStart + first_char, num_chars);
 	// if last character is a newline, then return true, forcing line break
 	llwchar last_char = text[mStart + first_char + num_chars - 1];
+
+	LLUIImagePtr image = mStyle->getImage();
+	if( image.notNull())
+	{
+		width += image->getWidth();
+		height = llmax(height, image->getHeight());
+	}
+
 	return num_chars >= 1 && last_char == '\n';
 }
 
-- 
GitLab


From 6f52f1e502cf030ceb4e14963fdda1021ea33023 Mon Sep 17 00:00:00 2001
From: "Eric M. Tulla (BigPapi)" <tulla@lindenlab.com>
Date: Fri, 13 Nov 2009 20:18:44 -0500
Subject: [PATCH 283/557] Post merge compile fixes

--HG--
branch : avatar-pipeline
---
 indra/newview/llfloatergesture.cpp | 2 +-
 indra/newview/llfloatergesture.h   | 1 +
 indra/newview/llfriendcard.cpp     | 1 +
 3 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index ca0ba96a08f..854d02873a7 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -98,7 +98,7 @@ void LLFloaterGesture::done()
 		// we load only gesture folder without childred.
 		LLInventoryModel::cat_array_t* categories;
 		LLInventoryModel::item_array_t* items;
-		folder_ref_t unloaded_folders;
+		LLInventoryFetchDescendentsObserver::folder_ref_t unloaded_folders;
 		LL_DEBUGS("Gesture")<< "Get subdirs of Gesture Folder...." << LL_ENDL;
 		gInventory.getDirectDescendentsOf(mGestureFolderID, categories, items);
 		if (categories->empty())
diff --git a/indra/newview/llfloatergesture.h b/indra/newview/llfloatergesture.h
index 9d047bf1cf8..e7819d2a032 100644
--- a/indra/newview/llfloatergesture.h
+++ b/indra/newview/llfloatergesture.h
@@ -39,6 +39,7 @@
 
 #include "llfloater.h"
 #include "llinventorymodel.h"
+#include "llinventoryobserver.h"
 #include "lldarray.h"
 
 class LLScrollContainer;
diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp
index 481b75cf739..23d9436fa61 100644
--- a/indra/newview/llfriendcard.cpp
+++ b/indra/newview/llfriendcard.cpp
@@ -33,6 +33,7 @@
 #include "llviewerprecompiledheaders.h"
 
 #include "llinventory.h"
+#include "llinventoryobserver.h"
 #include "lltrans.h"
 
 #include "llfriendcard.h"
-- 
GitLab


From 6be35d363fb9e9f04c5344cab808ef40e63cbfab Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Fri, 13 Nov 2009 17:42:38 -0800
Subject: [PATCH 284/557] Integrated most of the final artwork into the media
 controls

---
 .../xui/en/panel_prim_media_controls.xml      | 372 +++++++++---------
 1 file changed, 193 insertions(+), 179 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
index 70c5d7b8239..98025e28db8 100644
--- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
@@ -77,10 +77,14 @@
 		width="22"
 		top="4">
 	  <button
+		  image_overlay="Arrow_Left_Off"
+		  image_disabled="PushButton_Disabled"
+		  image_disabled_selected="PushButton_Disabled"
+		  image_selected="PushButton_Selected"
+		  image_unselected="PushButton_Off"
+		  hover_glow_amount="0.15"
 		  auto_resize="false"
 		  height="22"
-		  image_selected="media_btn_back.png"
-		  image_unselected="media_btn_back.png"
 		  layout="topleft"
 		  tool_tip="Step back"
 		  width="22"
@@ -96,37 +100,25 @@
 		user_resize="false"
 		layout="topleft"
 		top="10"
-		min_width="17"
-		width="17">
+		min_width="22"
+		width="22">
 	  <button
+		  image_overlay="Arrow_Right_Off"
+		  image_disabled="PushButton_Disabled"
+		  image_disabled_selected="PushButton_Disabled"
+		  image_selected="PushButton_Selected"
+		  image_unselected="PushButton_Off"
+		  hover_glow_amount="0.15"
 		  height="22"
-		  image_selected="media_btn_forward.png"
-		  image_unselected="media_btn_forward.png"
 		  layout="topleft"
 		  tool_tip="Step forward"
 		  top_delta="0"
-		  min_width="17"
-		  width="17">
+		  min_width="22"
+		  width="22">
 		<button.commit_callback
 			function="MediaCtrl.Forward" />
 	  </button>
 	</layout_panel>
-	<!--
-		<panel
-		height="22"
-		layout="topleft"
-		auto_resize="false"
-		min_width="3"
-		width="3">
-		<icon
-		height="22"
-		image_name="media_panel_divider.png"
-		layout="topleft"
-		top="0"
-		min_width="3"
-		width="3" />
-		</panel>
-	-->
 	<layout_panel
 		name="home"
 		auto_resize="false"
@@ -136,11 +128,15 @@
 		min_width="22"
 		width="22">
 	  <button
-		  height="22"
-		  image_selected="media_btn_home.png"
-		  image_unselected="media_btn_home.png"
+		  image_disabled="PushButton_Disabled"
+		  image_disabled_selected="PushButton_Disabled"
+		  image_overlay="Home_Off"
+		  image_selected="PushButton_Selected"
+		  image_unselected="PushButton_Off"
+		  hover_glow_amount="0.15"
 		  layout="topleft"
 		  tool_tip="Home page"
+		  height="22"
 		  min_width="22"
 		  width="22">
 		<button.commit_callback
@@ -155,10 +151,15 @@
 		top="2"
 		min_width="22"
 		width="22">
+	  <!-- The stop button here is temporary artwork -->
 	  <button
+		  image_overlay="media_btn_stoploading.png"
+		  image_disabled="PushButton_Disabled"
+		  image_disabled_selected="PushButton_Disabled"
+		  image_selected="PushButton_Selected"
+		  image_unselected="PushButton_Off"
+		  hover_glow_amount="0.15"
 		  height="22"
-		  image_selected="button_anim_stop.tga"
-		  image_unselected="button_anim_stop.tga"
 		  layout="topleft"
 		  tool_tip="Stop media"
 		  min_width="22"
@@ -167,22 +168,6 @@
 			function="MediaCtrl.Stop" />
 	  </button>
 	</layout_panel>
-	<!--
-		<panel
-		height="22"
-		layout="topleft"
-		auto_resize="false"
-		min_width="3"
-		width="3">
-		<icon
-		height="22"
-		image_name="media_panel_divider.png"
-		layout="topleft"
-		top="0"
-		min_width="3"
-		width="3" />
-		</panel>
-	-->
 	<layout_panel
 		name="reload"
 		auto_resize="false"
@@ -193,8 +178,12 @@
 		width="22">
 	  <button
 		  height="22"
-		  image_selected="media_btn_reload.png"
-		  image_unselected="media_btn_reload.png"
+		  image_overlay="Refresh_Off"
+		  image_disabled="PushButton_Disabled"
+		  image_disabled_selected="PushButton_Disabled"
+		  image_selected="PushButton_Selected"
+		  image_unselected="PushButton_Off"
+		  hover_glow_amount="0.15"
 		  layout="topleft"
 		  tool_tip="Reload"
 		  min_width="22"
@@ -213,8 +202,12 @@
 		width="22">
 	  <button
 		  height="22"
-		  image_selected="media_btn_stoploading.png"
-		  image_unselected="media_btn_stoploading.png"
+		  image_overlay="StopReload_Off"
+		  image_disabled="PushButton_Disabled"
+		  image_disabled_selected="PushButton_Disabled"
+		  image_selected="PushButton_Selected"
+		  image_unselected="PushButton_Off"
+		  hover_glow_amount="0.15"
 		  layout="topleft"
 		  tool_tip = "Stop loading"
 		  min_width="22"
@@ -232,11 +225,15 @@
 		min_width="22"
 		width="22">
 	  <button
-		  height="22"
-		  image_selected="button_anim_play.tga"
-		  image_unselected="button_anim_play.tga"
+		  image_overlay="Play_Off"
+		  image_disabled="PushButton_Disabled"
+		  image_disabled_selected="PushButton_Disabled"
+		  image_selected="PushButton_Selected"
+		  image_unselected="PushButton_Off"
+		  hover_glow_amount="0.15"
 		  layout="topleft"
 		  tool_tip = "Play media"
+		  height="22"
 		  min_width="22"
 		  width="22">
 		<button.commit_callback
@@ -252,10 +249,14 @@
 		min_width="22"
 		width="22">
 	  <button
-		  height="22"
-		  image_selected="button_anim_pause.tga"
-		  image_unselected="button_anim_pause.tga"
+		  image_overlay="Pause_Off"
+		  image_disabled="PushButton_Disabled"
+		  image_disabled_selected="PushButton_Disabled"
+		  image_selected="PushButton_Selected"
+		  image_unselected="PushButton_Off"
+		  hover_glow_amount="0.15"
 		  layout="topleft"
+		  height="22"
 		  tool_tip = "Pause media">
 		<button.commit_callback
 			function="MediaCtrl.Pause" />
@@ -266,7 +267,7 @@
 		name="media_address"
 		auto_resize="true"
 		user_resize="false"
-		height="22"
+		height="24"
 		follows="left|right|bottom"
 		layout="topleft"
 		width="190"
@@ -313,7 +314,7 @@ function="MediaCtrl.CommitURL" />
 			  name="media_whitelist_flag"
 			  follows="top|right"
 			  height="16"
-			  image_name="smicon_warn.tga"
+			  image_name="Flag"
 			  layout="topleft"
 			  tool_tip="White List enabled"
 			  min_width="16"
@@ -327,7 +328,7 @@ function="MediaCtrl.CommitURL" />
 		  <icon
 			  name="media_secure_lock_flag"
 			  height="16"
-			  image_name="icon_lock.tga"
+			  image_name="Lock2"
 			  layout="topleft"
 			  tool_tip="Secured Browsing"
 			  min_width="16"
@@ -351,6 +352,7 @@ function="MediaCtrl.CommitURL" />
 		  initial_value="0.5"
 		  layout="topleft"
 		  tool_tip="Movie play progress"
+		  top="8"
 		  min_width="100"
 		  width="200">
 		<slider_bar.commit_callback
@@ -362,43 +364,55 @@ function="MediaCtrl.CommitURL" />
 		auto_resize="false"
 		user_resize="false"
 		layout="topleft"
-		height="24"
-		min_width="24"
-		width="24">
+		height="22"
+		min_width="22"
+		width="22">
+	  <!-- Note: this isn't quite right either...the mute button is not the -->
+	  <!-- same as the others because it can't have the "image_overlay" be  -->
+	  <!-- two different images.  -->
 	  <button
+		  image_disabled="PushButton_Disabled"
+		  image_disabled_selected="PushButton_Disabled"
+		  image_selected="AudioMute_Off"
+		  image_unselected="Audio_Off"
+		  hover_glow_amount="0.15"
 		  name="media_volume_button"
 		  height="22"
-		  image_selected="icn_speaker-muted_dark.tga"
-		  image_unselected="icn_speaker_dark.tga"
 		  is_toggle="true"
 		  layout="topleft"
 		  scale_image="false" 
 		  tool_tip="Mute This Media"
-		  top_delta="22"
-		  min_width="24"
-		  width="24" >
+		  top_delta="18"
+		  min_width="22"
+		  width="22" >
 		<button.commit_callback
 			function="MediaCtrl.ToggleMute" />
 	  </button>
 	</layout_panel>
+	<!-- We don't have a design yet for "volume", so this is a temporary -->
+	<!-- solution.  See DEV-42827. -->
 	<layout_panel
 		name="volume_up"
 		auto_resize="false"
 		user_resize="false"
 		layout="topleft"
-		min_width="20"
+		min_width="14"
 		height="14"
-		width="20">
+		width="14">
 	  <button
-		  top="-3"
+		  image_overlay="media_btn_scrollup.png"
+		  image_disabled="PushButton_Disabled"
+		  image_disabled_selected="PushButton_Disabled"
+		  image_selected="PushButton_Selected"
+		  image_unselected="PushButton_Off"
+		  hover_glow_amount="0.15"
+		  top="-5"
 		  height="14"
-		  image_selected="media_btn_scrollup.png"
-		  image_unselected="media_btn_scrollup.png"
 		  layout="topleft"
 		  tool_tip="Volume up"
 		  scale_image="true"
-		  min_width="20"
-		  width="20" >
+		  min_width="14"
+		  width="14" >
 		<button.commit_callback
 			function="MediaCtrl.CommitVolumeUp" />
 	  </button>
@@ -408,27 +422,33 @@ function="MediaCtrl.CommitURL" />
 		auto_resize="false"
 		user_resize="false"
 		layout="topleft"
-		min_width="20"
+		min_width="14"
 		height="14"
-		width="20">
+		width="14">
 	  <button
-		  top="-5"
-		  height="14"
-		  image_selected="media_btn_scrolldown.png"
-		  image_unselected="media_btn_scrolldown.png"
+		  image_overlay="media_btn_scrolldown.png"
+		  image_disabled="PushButton_Disabled"
+		  image_disabled_selected="PushButton_Disabled"
+		  image_selected="PushButton_Selected"
+		  image_unselected="PushButton_Off"
+		  hover_glow_amount="0.15"
 		  layout="topleft"
 		  tool_tip="Volume down"
 		  scale_image="true"
-		  min_width="20"
-		  width="20">
+		  top="-5"
+		  height="14"
+		  min_width="14"
+		  width="14">
 		<button.commit_callback
 			function="MediaCtrl.CommitVolumeDown" />
 	  </button>
 	</layout_panel>
 	<!-- Scroll pad -->
+	<!-- This was removed from the design, but is still here because it is --> 
+	<!-- complex, and recreating it would be hard.  In case the design -->
+	<!-- changes, here it lies: --> 
 	<!--
-		disabled
-		<layout_panel
+	<layout_panel
 		name="media_panel_scroll"
 		auto_resize="false"
 		user_resize="false"
@@ -437,64 +457,77 @@ function="MediaCtrl.CommitURL" />
 		layout="topleft"
 		min_width="32"
 		width="32">
-		<icon
-		height="32"
-		image_name="media_panel_scrollbg.png"
-		layout="topleft"
-		top="0"
-		min_width="32"
-		width="32" />
-		<button
-		name="scrollup"
-		height="8"
-		image_selected="media_btn_scrollup.png"
-		image_unselected="media_btn_scrollup.png"
-		layout="topleft"
-		tool_tip="Scroll up"
-		scale_image="false"
-		left="12"
-		top_delta="4"
-		min_width="8"
-		width="8" />
-		<button
-		name="scrollleft"
-		height="8"
-		image_selected="media_btn_scrollleft.png"
-		image_unselected="media_btn_scrollleft.png"
-		layout="topleft"
-		left="3"
-		tool_tip="Scroll left"
-		scale_image="false"
-		top="12"
-		min_width="8"
-		width="8" />
-		<button
-		name="scrollright"
-		height="8"
-		image_selected="media_btn_scrollright.png"
-		image_unselected="media_btn_scrollright.png"
-		layout="topleft"
-		left_pad="9"
-		tool_tip="Scroll right"
-		scale_image="false"
-		top_delta="0"
-		min_width="8"
-		width="8" />
-		<button
-		name="scrolldown"
-		height="8"
-		image_selected="media_btn_scrolldown.png"
-		image_unselected="media_btn_scrolldown.png"
-		layout="topleft"
-		left="12"
-		tool_tip="Scroll down"
-		scale_image="false"
-		top="20"
-		min_width="8"
-		width="8" />
-		</layout_panel>
-		disabled
+	  <icon
+		  height="32"
+		  image_name="media_panel_scrollbg.png"
+		  layout="topleft"
+		  top="0"
+		  min_width="32"
+		  width="32" />
+	  <button
+		  name="scrollup"
+		  height="8"
+		  image_selected="media_btn_scrollup.png"
+		  image_unselected="media_btn_scrollup.png"
+		  layout="topleft"
+		  tool_tip="Scroll up"
+		  scale_image="false"
+		  left="12"
+		  top_delta="4"
+		  min_width="8"
+		  width="8" />
+	  <button
+		  name="scrollleft"
+		  height="8"
+		  image_selected="media_btn_scrollleft.png"
+		  image_unselected="media_btn_scrollleft.png"
+		  layout="topleft"
+		  left="3"
+		  tool_tip="Scroll left"
+		  scale_image="false"
+		  top="12"
+		  min_width="8"
+		  width="8" />
+	  <button
+		  name="scrollright"
+		  height="8"
+		  image_selected="media_btn_scrollright.png"
+		  image_unselected="media_btn_scrollright.png"
+		  layout="topleft"
+		  left_pad="9"
+		  tool_tip="Scroll right"
+		  scale_image="false"
+		  top_delta="0"
+		  min_width="8"
+		  width="8" />
+	  <button
+		  name="scrolldown"
+		  height="8"
+		  image_selected="media_btn_scrolldown.png"
+		  image_unselected="media_btn_scrolldown.png"
+		  layout="topleft"
+		  left="12"
+		  tool_tip="Scroll down"
+		  scale_image="false"
+		  top="20"
+		  min_width="8"
+		  width="8" />
+	</layout_panel>
 	-->
+	<panel
+		height="28"
+		layout="topleft"
+		auto_resize="false"
+		min_width="3"
+		width="3">
+	  <icon
+		  height="26"
+		  image_name="media_panel_divider.png"
+		  layout="topleft"
+		  top="0"
+		  min_width="3"
+		  width="3" />
+	</panel>
 	<layout_panel
 		name="zoom_frame"
 		auto_resize="false"
@@ -504,9 +537,13 @@ function="MediaCtrl.CommitURL" />
 		min_width="22"
 		width="22">
 	  <button
+		  image_overlay="Zoom_Off"
+		  image_disabled="PushButton_Disabled"
+		  image_disabled_selected="PushButton_Disabled"
+		  image_selected="PushButton_Selected"
+		  image_unselected="PushButton_Off"
+		  hover_glow_amount="0.15"
 		  height="22"
-		  image_selected="media_btn_optimalzoom.png"
-		  image_unselected="media_btn_optimalzoom.png"
 		  layout="topleft"
 		  tool_tip="Zoom into media"
 		  min_width="22"
@@ -522,10 +559,15 @@ function="MediaCtrl.CommitURL" />
 		layout="topleft"
 		min_width="21"
 		width="21" >
+	  <!-- There is no "Zoom out" icon, so we use this temporarily -->
 	  <button
+		  image_overlay="ForwardArrow_Off"
+		  image_disabled="PushButton_Disabled"
+		  image_disabled_selected="PushButton_Disabled"
+		  image_selected="PushButton_Selected"
+		  image_unselected="PushButton_Off"
+		  hover_glow_amount="0.15"
 		  height="22"
-		  image_selected="media_btn_done.png"
-		  image_unselected="media_btn_done.png"
 		  layout="topleft"
 		  tool_tip ="Zoom Back"
 		  top_delta="-4"
@@ -534,22 +576,6 @@ function="MediaCtrl.CommitURL" />
 			function="MediaCtrl.Close" />
 	  </button>
 	</layout_panel>
-	<!--
-		<panel
-		height="22"
-		layout="topleft"
-		auto_resize="false"
-		min_width="3"
-		width="3">
-		<icon
-		height="22"
-		image_name="media_panel_divider.png"
-		layout="topleft"
-		top="0"
-		min_width="3"
-		width="3" />
-		</panel>
-	-->
 	<layout_panel
 		name="new_window"
 		auto_resize="false"
@@ -558,34 +584,22 @@ function="MediaCtrl.CommitURL" />
 		min_width="22"
 		width="22">
 	  <button
+		  image_overlay="ExternalBrowser_Off"
+		  image_disabled="PushButton_Disabled"
+		  image_disabled_selected="PushButton_Disabled"
+		  image_selected="PushButton_Selected"
+		  image_unselected="PushButton_Off"
+		  hover_glow_amount="0.15"
 		  height="22"
-		  image_selected="media_btn_newwindow.png"
-		  image_unselected="media_btn_newwindow.png"
 		  layout="topleft"
 		  tool_tip = "Open URL in browser"
-		  top_delta="-3"
+		  top_delta="-4"
 		  min_width="24"
 		  width="24" >
 		<button.commit_callback
 			function="MediaCtrl.Open" />
 	  </button>
 	</layout_panel>
-	<!--
-		<panel
-		height="22"
-		layout="topleft"
-		auto_resize="false"
-		min_width="3"
-		width="3">
-		<icon
-		height="22"
-		image_name="media_panel_divider.png"
-		layout="topleft"
-		top="0"
-		min_width="3"
-		width="3" />
-		</panel>
-	-->
 	<!-- bookend panel -->
 	<layout_panel
 		name="right_bookend"
-- 
GitLab


From a58dd26b205d4e626028f1c7d27858d2ec927e41 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Fri, 13 Nov 2009 18:15:35 -0800
Subject: [PATCH 285/557] Tweaks to media priority calculation.

Enabled CPU limit setting by default (set to 100% of 1 CPU).

Lowered default limits on plugin priorities: 2 normal+, 4 low, 8 total.

Limit on total number of instances now only applies to inworld media -- media instances in the UI (such as the help browser and search) don't count toward the limit.  UI media will still bump inworld media down from normal/low priority, though.

Several improvements to plugin manager debug code in the nearby media list.

Don't load unloaded instances that are at PRIORITY_SLIDESHOW or PRIORITY_HIDDEN (they don't get unloaded, they just won't be loaded unless they're at higher priority).

Added LLViewerMediaImpl::isPlayable(), which indicates whether an instance would be loaded if it were high enough in the priority list (taking into account autoplay and current load state).  Priority algorithm now takes this into account.

Fixed a couple of issues with approximate texture interest calculation and its use in setting priorities.

Adjusted sleep times on low and normal priorities to be more friendly.
---
 indra/llplugin/llpluginclassmedia.cpp   |  4 +-
 indra/llplugin/llpluginprocesschild.cpp |  5 +-
 indra/newview/app_settings/settings.xml | 10 ++--
 indra/newview/llviewermedia.cpp         | 75 ++++++++++++++++++++++---
 indra/newview/llviewermedia.h           |  5 +-
 5 files changed, 80 insertions(+), 19 deletions(-)

diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index 42d5ec49cd3..c3d8a5aa236 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -593,10 +593,10 @@ void LLPluginClassMedia::setPriority(EPriority priority)
 				mSleepTime = 1.0f;
 			break;
 			case PRIORITY_LOW:		
-				mSleepTime = 1.0f / 50.0f;
+				mSleepTime = 1.0f / 25.0f;
 			break;
 			case PRIORITY_NORMAL:	
-				mSleepTime = 1.0f / 100.0f;
+				mSleepTime = 1.0f / 50.0f;
 			break;
 			case PRIORITY_HIGH:		
 				mSleepTime = 1.0f / 100.0f;
diff --git a/indra/llplugin/llpluginprocesschild.cpp b/indra/llplugin/llpluginprocesschild.cpp
index 450dcb3c789..fc95136d9e3 100644
--- a/indra/llplugin/llpluginprocesschild.cpp
+++ b/indra/llplugin/llpluginprocesschild.cpp
@@ -37,12 +37,13 @@
 #include "llpluginmessageclasses.h"
 
 static const F32 HEARTBEAT_SECONDS = 1.0f;
+static const F32 PLUGIN_IDLE_SECONDS = 1.0f / 100.0f;  // Each call to idle will give the plugin this much time.
 
 LLPluginProcessChild::LLPluginProcessChild()
 {
 	mInstance = NULL;
 	mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP);
-	mSleepTime = 1.0f / 100.0f;	// default: send idle messages at 100Hz
+	mSleepTime = PLUGIN_IDLE_SECONDS;	// default: send idle messages at 100Hz
 	mCPUElapsed = 0.0f;
 }
 
@@ -155,7 +156,7 @@ void LLPluginProcessChild::idle(void)
 				{
 					// Provide some time to the plugin
 					LLPluginMessage message("base", "idle");
-					message.setValueReal("time", mSleepTime);
+					message.setValueReal("time", PLUGIN_IDLE_SECONDS);
 					sendMessageToPlugin(message);
 					
 					mInstance->idle();
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 8ad52784d33..52de17bff5c 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -5369,7 +5369,7 @@
       <key>Type</key>
       <string>F32</string>
       <key>Value</key>
-      <real>0.0</real>
+      <real>1.0</real>
     </map>
     <key>PluginInstancesLow</key>
     <map>
@@ -5385,24 +5385,24 @@
     <key>PluginInstancesNormal</key>
     <map>
       <key>Comment</key>
-      <string>Limit on the number of inworld media plugins that will run at "normal" priority</string>
+      <string>Limit on the number of inworld media plugins that will run at "normal" or higher priority</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
       <string>U32</string>
       <key>Value</key>
-      <integer>4</integer>
+      <integer>2</integer>
     </map>
     <key>PluginInstancesTotal</key>
     <map>
       <key>Comment</key>
-      <string>Hard limit on the number of plugins that will be instantiated at once</string>
+      <string>Hard limit on the number of plugins that will be instantiated at once for inworld media</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
       <string>U32</string>
       <key>Value</key>
-      <integer>16</integer>
+      <integer>8</integer>
     </map>
     <key>PrecachingDelay</key>
     <map>
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 251d7d4a133..70490d3a6ee 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -541,6 +541,16 @@ bool LLViewerMedia::priorityComparitor(const LLViewerMediaImpl* i1, const LLView
 		// The item with user focus always comes to the front of the list, period.
 		return false;
 	}
+	else if(i1->isParcelMedia())
+	{
+		// The parcel media impl sorts above all other inworld media, unless one has focus.
+		return true;
+	}
+	else if(i2->isParcelMedia())
+	{
+		// The parcel media impl sorts above all other inworld media, unless one has focus.
+		return false;
+	}
 	else if(i1->getUsedInUI() && !i2->getUsedInUI())
 	{
 		// i1 is a UI element, i2 is not.  This makes i1 "less than" i2, so it sorts earlier in our list.
@@ -551,14 +561,14 @@ bool LLViewerMedia::priorityComparitor(const LLViewerMediaImpl* i1, const LLView
 		// i2 is a UI element, i1 is not.  This makes i2 "less than" i1, so it sorts earlier in our list.
 		return false;
 	}
-	else if(i1->isParcelMedia())
+	else if(i1->isPlayable() && !i2->isPlayable())
 	{
-		// The parcel media impl sorts above all other inworld media, unless one has focus.
+		// Playable items sort above ones that wouldn't play even if they got high enough priority
 		return true;
 	}
-	else if(i2->isParcelMedia())
+	else if(!i1->isPlayable() && i2->isPlayable())
 	{
-		// The parcel media impl sorts above all other inworld media, unless one has focus.
+		// Playable items sort above ones that wouldn't play even if they got high enough priority
 		return false;
 	}
 	else
@@ -629,10 +639,12 @@ void LLViewerMedia::updateMedia()
 		else if(pimpl->hasFocus())
 		{
 			new_priority = LLPluginClassMedia::PRIORITY_HIGH;
+			impl_count_interest_normal++;	// count this against the count of "normal" instances for priority purposes
 		}
 		else if(pimpl->getUsedInUI())
 		{
 			new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
+			impl_count_interest_normal++;
 		}
 		else
 		{
@@ -640,7 +652,17 @@ void LLViewerMedia::updateMedia()
 			
 			// Heuristic -- if the media texture's approximate screen area is less than 1/4 of the native area of the texture,
 			// turn it down to low instead of normal.  This may downsample for plugins that support it.
-			bool media_is_small = pimpl->getInterest() < (pimpl->getApproximateTextureInterest() / 4);
+			bool media_is_small = false;
+			F64 approximate_interest = pimpl->getApproximateTextureInterest();
+			if(approximate_interest == 0.0f)
+			{
+				// this media has no current size, which probably means it's not loaded.
+				media_is_small = true;
+			}
+			else if(pimpl->getInterest() < (approximate_interest / 4))
+			{
+				media_is_small = true;
+			}
 			
 			if(pimpl->getInterest() == 0.0f)
 			{
@@ -678,7 +700,7 @@ void LLViewerMedia::updateMedia()
 			}
 		}
 		
-		if(new_priority != LLPluginClassMedia::PRIORITY_UNLOADED)
+		if(!pimpl->getUsedInUI() && (new_priority != LLPluginClassMedia::PRIORITY_UNLOADED))
 		{
 			impl_count_total++;
 		}
@@ -1588,6 +1610,10 @@ void LLViewerMediaImpl::update()
 		{
 			// This media source should not be loaded.
 		}
+		else if(mPriority <= LLPluginClassMedia::PRIORITY_SLIDESHOW)
+		{
+			// Don't load new instances that are at PRIORITY_SLIDESHOW or below.  They're just kept around to preserve state.
+		}
 		else if(mMimeTypeProbe != NULL)
 		{
 			// this media source is doing a MIME type probe -- don't try loading it again.
@@ -1816,7 +1842,7 @@ bool LLViewerMediaImpl::isMediaPaused()
 
 //////////////////////////////////////////////////////////////////////////////////////////
 //
-bool LLViewerMediaImpl::hasMedia()
+bool LLViewerMediaImpl::hasMedia() const
 {
 	return mMediaSource != NULL;
 }
@@ -1850,6 +1876,31 @@ bool LLViewerMediaImpl::isForcedUnloaded() const
 	return false;
 }
 
+//////////////////////////////////////////////////////////////////////////////////////////
+//
+bool LLViewerMediaImpl::isPlayable() const
+{
+	if(isForcedUnloaded())
+	{
+		// All of the forced-unloaded criteria also imply not playable.
+		return false;
+	}
+	
+	if(hasMedia())
+	{
+		// Anything that's already playing is, by definition, playable.
+		return true;
+	}
+	
+	if(!mMediaURL.empty())
+	{
+		// If something has navigated the instance, it's ready to be played.
+		return true;
+	}
+	
+	return false;
+}
+
 //////////////////////////////////////////////////////////////////////////////////////////
 void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginClassMediaOwner::EMediaEvent event)
 {
@@ -2094,7 +2145,13 @@ F64 LLViewerMediaImpl::getApproximateTextureInterest()
 		result = mMediaSource->getFullWidth();
 		result *= mMediaSource->getFullHeight();
 	}
-	
+	else
+	{
+		// No media source is loaded -- all we have to go on is the texture size that has been set on the impl, if any.
+		result = mMediaWidth;
+		result *= mMediaHeight;
+	}
+
 	return result;
 }
 
@@ -2135,7 +2192,7 @@ void LLViewerMediaImpl::setPriority(LLPluginClassMedia::EPriority priority)
 {
 	if(mPriority != priority)
 	{
-		LL_INFOS("PluginPriority")
+		LL_DEBUGS("PluginPriority")
 			<< "changing priority of media id " << mTextureId
 			<< " from " << LLPluginClassMedia::priorityToString(mPriority)
 			<< " to " << LLPluginClassMedia::priorityToString(priority)
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 639aed4b8a2..a06079786e9 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -194,7 +194,7 @@ class LLViewerMediaImpl
 
 	bool isMediaPlaying();
 	bool isMediaPaused();
-	bool hasMedia();
+	bool hasMedia() const;
 	bool isMediaFailed() const { return mMediaSourceFailed; };
 	void resetPreviousMediaState();
 	
@@ -204,6 +204,9 @@ class LLViewerMediaImpl
 	// returns true if this instance should not be loaded (disabled, muted object, crashed, etc.)
 	bool isForcedUnloaded() const;
 	
+	// returns true if this instance could be playable based on autoplay setting, current load state, etc.
+	bool isPlayable() const;
+	
 	void setIsParcelMedia(bool is_parcel_media) { mIsParcelMedia = is_parcel_media; };
 	bool isParcelMedia() const { return mIsParcelMedia; };
 
-- 
GitLab


From 68c6ff791ffdd01e98cf7fae61b868db4a6d1698 Mon Sep 17 00:00:00 2001
From: "Eric M. Tulla (BigPapi)" <tulla@lindenlab.com>
Date: Fri, 13 Nov 2009 22:22:30 -0500
Subject: [PATCH 286/557] Fix for post-merge compile error.

---
 indra/newview/llagentwearables.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index a6664778fb0..ab518adaddd 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -2145,7 +2145,7 @@ void LLLibraryOutfitsFetch::contentsDone(void)
 														LLFolderType::FT_OUTFIT,
 														mOutfits[i].second);
 		
-		LLAppearanceManager::shallowCopyCategory(mOutfits[i].first, folder_id, NULL);
+		LLAppearanceManager::getInstance()->shallowCopyCategory(mOutfits[i].first, folder_id, NULL);
 		gInventory.notifyObservers();
 	}
 	mOutfitsPopulated = true;
-- 
GitLab


From f67a8ad12ee4984a37d8ac7e551cdcc03ed5ecd3 Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Fri, 13 Nov 2009 22:54:55 -0800
Subject: [PATCH 287/557] Mutex lock fix for texture cache. Also a fix for
 texture purging when reducing the cache size.

---
 indra/llcommon/llqueuedthread.cpp |  1 +
 indra/newview/lltexturecache.cpp  | 58 ++++++++++++++++++-------------
 2 files changed, 34 insertions(+), 25 deletions(-)

diff --git a/indra/llcommon/llqueuedthread.cpp b/indra/llcommon/llqueuedthread.cpp
index e7ad571a905..eacbbb3ee0b 100644
--- a/indra/llcommon/llqueuedthread.cpp
+++ b/indra/llcommon/llqueuedthread.cpp
@@ -96,6 +96,7 @@ void LLQueuedThread::shutdown()
 		if (req->getStatus() == STATUS_QUEUED || req->getStatus() == STATUS_INPROGRESS)
 		{
 			++active_count;
+			req->setStatus(STATUS_ABORTED); // avoid assert in deleteRequest
 		}
 		req->deleteRequest();
 	}
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 9be342c424c..2e2f342cca4 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -834,9 +834,9 @@ bool LLTextureCache::updateTextureEntryList(const LLUUID& id, S32 bodysize)
 			S32 idx = openAndReadEntry(id, entry, false);
 			if (idx < 0)
 			{
-				// TODO: change to llwarns
-				llerrs << "Failed to open entry: " << id << llendl;
-				removeFromCache(id);
+				llwarns << "Failed to open entry: " << id << llendl;	
+				removeHeaderCacheEntry(id);
+				LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());
 				return false;
 			}			
 			else if (oldbodysize != entry.mBodySize)
@@ -1212,9 +1212,9 @@ void LLTextureCache::readHeaderCache()
 		if (num_entries)
 		{
 			U32 empty_entries = 0;
-			typedef std::pair<U32, LLUUID> lru_data_t;
+			typedef std::pair<U32, S32> lru_data_t;
 			std::set<lru_data_t> lru;
-			std::vector<LLUUID> purge_list;
+			std::vector<S32> purge_list;
 			for (U32 i=0; i<num_entries; i++)
 			{
 				Entry& entry = entries[i];
@@ -1226,14 +1226,14 @@ void LLTextureCache::readHeaderCache()
 				}
 				else
 				{
-					lru.insert(std::make_pair(entry.mTime, id));
+					lru.insert(std::make_pair(entry.mTime, i));
 					if (entry.mBodySize > 0)
 					{
 						if (entry.mBodySize > entry.mImageSize)
 						{
 							// Shouldn't happen, failsafe only
 							llwarns << "Bad entry: " << i << ": " << id << ": BodySize: " << entry.mBodySize << llendl;
-							purge_list.push_back(id);
+							purge_list.push_back(i);
 						}
 					}
 				}
@@ -1243,6 +1243,7 @@ void LLTextureCache::readHeaderCache()
 				// Special case: cache size was reduced, need to remove entries
 				// Note: After we prune entries, we will call this again and create the LRU
 				U32 entries_to_purge = (num_entries-empty_entries) - sCacheMaxEntries;
+				llinfos << "Texture Cache Entries: " << num_entries << " Max: " << sCacheMaxEntries << " Empty: " << empty_entries << " Purging: " << entries_to_purge << llendl;
 				if (entries_to_purge > 0)
 				{
 					for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter)
@@ -1252,13 +1253,17 @@ void LLTextureCache::readHeaderCache()
 							break;
 					}
 				}
+				llassert_always(entries_to_purge <= 0);
+				llassert_always(purge_list.size() == entries_to_purge);
 			}
 			else
 			{
 				S32 lru_entries = (S32)((F32)sCacheMaxEntries * TEXTURE_CACHE_LRU_SIZE);
 				for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter)
 				{
-					mLRU.insert(iter->second);
+					S32 idx = iter->second;
+					const LLUUID& id = entries[idx].mID;
+					mLRU.insert(id);
 // 					llinfos << "LRU: " << iter->first << " : " << iter->second << llendl;
 					if (--lru_entries <= 0)
 						break;
@@ -1267,9 +1272,14 @@ void LLTextureCache::readHeaderCache()
 			
 			if (purge_list.size() > 0)
 			{
-				for (std::vector<LLUUID>::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter)
+				for (std::vector<S32>::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter)
 				{
-					removeFromCache(*iter);
+					S32 idx = *iter;
+					const LLUUID& id = entries[idx].mID;
+					entries[idx].mImageSize = -1; // set cached entry size to -1
+					bool res = removeHeaderCacheEntry(id); // sets entry size on disk to -1
+					llassert_always(res);
+					LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());
 				}
 				// If we removed any entries, we need to rebuild the entries list,
 				// write the header, and call this again
@@ -1307,6 +1317,7 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
 		for (S32 i=0; i<16; i++)
 		{
 			std::string dirname = mTexturesDirName + delem + subdirs[i];
+			llinfos << "Deleting files in directory: " << dirname << llendl;
 			gDirUtilp->deleteFilesInDir(dirname,mask);
 			if (purge_directories)
 			{
@@ -1624,24 +1635,20 @@ void LLTextureCache::addCompleted(Responder* responder, bool success)
 //////////////////////////////////////////////////////////////////////////////
 
 // Called from MAIN thread (endWork())
-
+// Ensuere that mHeaderMutex is locked first!
 bool LLTextureCache::removeHeaderCacheEntry(const LLUUID& id)
 {
-	if (!mReadOnly)
+	Entry entry;
+	S32 idx = openAndReadEntry(id, entry, false);
+	if (idx >= 0)
 	{
-		LLMutexLock lock(&mHeaderMutex);
-		Entry entry;
-		S32 idx = openAndReadEntry(id, entry, false);
-		if (idx >= 0)
-		{
-			entry.mImageSize = -1;
-			entry.mBodySize = 0;
-			writeEntryAndClose(idx, entry);
-			mFreeList.insert(idx);
-			mHeaderIDMap.erase(id);
-			mTexturesSizeMap.erase(id);
-			return true;
-		}
+		entry.mImageSize = -1;
+		entry.mBodySize = 0;
+		writeEntryAndClose(idx, entry);
+		mFreeList.insert(idx);
+		mHeaderIDMap.erase(id);
+		mTexturesSizeMap.erase(id);
+		return true;
 	}
 	return false;
 }
@@ -1651,6 +1658,7 @@ void LLTextureCache::removeFromCache(const LLUUID& id)
 	//llwarns << "Removing texture from cache: " << id << llendl;
 	if (!mReadOnly)
 	{
+		LLMutexLock lock(&mHeaderMutex);
 		removeHeaderCacheEntry(id);
 		LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());
 	}
-- 
GitLab


From 9e11d70225d3e53e2ee31304c4930f01939fe1c3 Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Sat, 14 Nov 2009 18:12:18 +0200
Subject: [PATCH 288/557] Fixed major bug EXT-2316 "Insert the option "pay" in
 the profile": - Added menu item according to Communications design spec in
 section 4.1.2.1.

--HG--
branch : product-engine
---
 indra/newview/llpanelavatar.cpp               | 25 +++++++++++++++++++
 indra/newview/llpanelavatar.h                 | 12 +++++++--
 .../default/xui/en/menu_profile_overflow.xml  | 15 +++++++++++
 .../skins/default/xui/en/panel_profile.xml    | 20 +++++++++++----
 4 files changed, 65 insertions(+), 7 deletions(-)
 create mode 100644 indra/newview/skins/default/xui/en/menu_profile_overflow.xml

diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 3b54f1546e8..f0aa189b7f4 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -41,6 +41,7 @@
 #include "llimview.h"
 #include "lltexteditor.h"
 #include "lltexturectrl.h"
+#include "lltoggleablemenu.h"
 #include "lltooldraganddrop.h"
 #include "llscrollcontainer.h"
 #include "llavatariconctrl.h"
@@ -333,8 +334,14 @@ BOOL LLPanelAvatarProfile::postBuild()
 	childSetCommitCallback("im",(boost::bind(&LLPanelAvatarProfile::onIMButtonClick,this)),NULL);
 	childSetCommitCallback("call",(boost::bind(&LLPanelAvatarProfile::onCallButtonClick,this)),NULL);
 	childSetCommitCallback("teleport",(boost::bind(&LLPanelAvatarProfile::onTeleportButtonClick,this)),NULL);
+	childSetCommitCallback("overflow_btn", boost::bind(&LLPanelAvatarProfile::onOverflowButtonClicked, this), NULL);
 	childSetCommitCallback("share",(boost::bind(&LLPanelAvatarProfile::onShareButtonClick,this)),NULL);
 
+	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+	registrar.add("Profile.Pay",  boost::bind(&LLPanelAvatarProfile::pay, this));
+
+	mProfileMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_profile_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+
 	LLTextureCtrl* pic = getChild<LLTextureCtrl>("2nd_life_pic");
 	pic->setFallbackImageName("default_profile_picture.j2c");
 
@@ -513,6 +520,11 @@ void LLPanelAvatarProfile::fillAccountStatus(const LLAvatarData* avatar_data)
 	childSetValue("acc_status_text", caption_text);
 }
 
+void LLPanelAvatarProfile::pay()
+{
+	LLAvatarActions::pay(getAvatarId());
+}
+
 void LLPanelAvatarProfile::onUrlTextboxClicked(const std::string& url)
 {
 	LLWeb::loadURL(url);
@@ -552,6 +564,19 @@ void LLPanelAvatarProfile::onShareButtonClick()
 	//*TODO not implemented
 }
 
+void LLPanelAvatarProfile::onOverflowButtonClicked()
+{
+	if (!mProfileMenu->toggleVisibility())
+		return;
+
+	LLView* btn = getChild<LLView>("overflow_btn");
+	LLRect rect = btn->getRect();
+
+	mProfileMenu->updateParent(LLMenuGL::sMenuContainer);
+	mProfileMenu->setButtonRect(btn->getLocalRect(), btn);
+	LLMenuGL::showPopup(this, mProfileMenu, rect.mRight, rect.mTop);
+}
+
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index ae0b8e98449..a0caf0c9156 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -38,6 +38,7 @@
 
 class LLComboBox;
 class LLLineEditor;
+class LLToggleableMenu;
 
 enum EOnlineStatus
 {
@@ -160,12 +161,17 @@ class LLPanelAvatarProfile
 	 * Fills Avatar's online status.
 	 */
 	virtual void fillOnlineStatus(const LLAvatarData* avatar_data);
-	
+
 	/**
 	 * Fills account status.
 	 */
 	virtual void fillAccountStatus(const LLAvatarData* avatar_data);
 
+	/**
+	 * Opens "Pay Resident" dialog.
+	 */
+	void pay();
+
 	void onUrlTextboxClicked(const std::string& url);
 	void onHomepageTextboxClicked();
 	void onAddFriendButtonClick();
@@ -173,10 +179,12 @@ class LLPanelAvatarProfile
 	void onCallButtonClick();
 	void onTeleportButtonClick();
 	void onShareButtonClick();
+	void onOverflowButtonClicked();
 
 private:
 
-	std::string mGroups;
+	std::string 			mGroups;
+	LLToggleableMenu*		mProfileMenu;
 };
 
 /**
diff --git a/indra/newview/skins/default/xui/en/menu_profile_overflow.xml b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml
new file mode 100644
index 00000000000..7b52fecef71
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ height="50"
+ layout="topleft"
+ mouse_opaque="false"
+ name="profile_overflow_menu"
+ width="120">
+    <menu_item_call
+     label="Pay"
+     layout="topleft"
+     name="pay">
+        <menu_item_call.on_click
+         function="Profile.Pay" />
+    </menu_item_call>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 0f5e96416df..5110b6b2ef5 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -283,7 +283,7 @@
          mouse_opaque="false"
          name="add_friend"
          top="5"
-         width="75" />
+         width="76" />
         <button
          follows="bottom|left"
          height="19"
@@ -292,7 +292,7 @@
          name="im"
          top="5"
          left_pad="5"
-         width="45" />
+         width="31" />
         <button
          follows="bottom|left"
          height="19"
@@ -301,7 +301,7 @@
          name="call"
          left_pad="5"
          top="5"
-         width="45" />
+         width="40" />
         <button
          enabled="false"
          follows="bottom|left"
@@ -311,7 +311,7 @@
          name="show_on_map_btn"
          top="5"
          left_pad="5"
-         width="45" />
+         width="42" />
         <button
          follows="bottom|left"
          height="19"
@@ -320,7 +320,17 @@
          name="teleport"
          left_pad="5"
          top="5"
-         width="80" />
+         width="64" />
+        <button
+         follows="bottom|right"
+         font="SansSerifSmall"
+         height="19"
+         label="â–¼"
+         layout="topleft"
+         name="overflow_btn"
+         right="-1"
+         top="5"
+         width="21" />
  </panel>
  <panel
      follows="bottom|left"
-- 
GitLab


From 93c1e1bd6eaa8f77e746b1346b1729ed564081b4 Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Sat, 14 Nov 2009 19:15:51 +0200
Subject: [PATCH 289/557] No ticket. - Fixed toggleable menu in Picks panel. -
 Minor optimization of LLToggleableMenu.

--HG--
branch : product-engine
---
 indra/llui/lltoggleablemenu.cpp  |  9 ++++++++-
 indra/llui/lltoggleablemenu.h    |  3 +++
 indra/newview/llfavoritesbar.cpp |  5 ++++-
 indra/newview/llpanelavatar.cpp  |  8 ++++++--
 indra/newview/llpanelpicks.cpp   | 13 ++++++++++---
 indra/newview/llpanelplaces.cpp  |  5 ++++-
 6 files changed, 35 insertions(+), 8 deletions(-)

diff --git a/indra/llui/lltoggleablemenu.cpp b/indra/llui/lltoggleablemenu.cpp
index 717e135412e..5df1d353832 100644
--- a/indra/llui/lltoggleablemenu.cpp
+++ b/indra/llui/lltoggleablemenu.cpp
@@ -40,6 +40,7 @@ static LLDefaultChildRegistry::Register<LLToggleableMenu> r("toggleable_menu");
 
 LLToggleableMenu::LLToggleableMenu(const LLToggleableMenu::Params& p)
 :	LLMenuGL(p),
+	mButtonRect(),
 	mClosedByButtonClick(false)
 {
 }
@@ -56,13 +57,19 @@ void LLToggleableMenu::handleVisibilityChange (BOOL curVisibilityIn)
 	}
 }
 
-void LLToggleableMenu::setButtonRect(const LLRect& rect, LLView* current_view) 
+void LLToggleableMenu::setButtonRect(const LLRect& rect, LLView* current_view)
 {
 	LLRect screen;
 	current_view->localRectToScreen(rect, &screen);
 	mButtonRect = screen;
 }
 
+void LLToggleableMenu::setButtonRect(LLView* current_view)
+{
+	LLRect rect = current_view->getLocalRect();
+	setButtonRect(rect, current_view);
+}
+
 bool LLToggleableMenu::toggleVisibility() 
 {
 	if (mClosedByButtonClick)
diff --git a/indra/llui/lltoggleablemenu.h b/indra/llui/lltoggleablemenu.h
index 3cd66e04a8b..9d8c5261b9c 100644
--- a/indra/llui/lltoggleablemenu.h
+++ b/indra/llui/lltoggleablemenu.h
@@ -49,8 +49,11 @@ class LLToggleableMenu : public LLMenuGL
 public:
 	virtual void handleVisibilityChange (BOOL curVisibilityIn);
 
+	const LLRect& getButtonRect() const { return mButtonRect; }
+
 	// Converts the given local button rect to a screen rect
 	void setButtonRect(const LLRect& rect, LLView* current_view);
+	void setButtonRect(LLView* current_view);
 
 	// Returns "true" if menu was not closed by button click
 	// and is not still visible. If menu is visible toggles
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index 18135fc5587..01603f390de 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -901,7 +901,10 @@ void LLFavoritesBarCtrl::showDropDownMenu()
 				menu->buildDrawLabels();
 				menu->updateParent(LLMenuGL::sMenuContainer);
 
-				menu->setButtonRect(mChevronRect, this);
+				if (menu->getButtonRect().isEmpty())
+				{
+					menu->setButtonRect(mChevronRect, this);
+				}
 
 				LLMenuGL::showPopup(this, menu, getRect().getWidth() - menu->getRect().getWidth(), 0);
 				return;
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index f0aa189b7f4..2254684f215 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -570,10 +570,14 @@ void LLPanelAvatarProfile::onOverflowButtonClicked()
 		return;
 
 	LLView* btn = getChild<LLView>("overflow_btn");
-	LLRect rect = btn->getRect();
 
+	if (mProfileMenu->getButtonRect().isEmpty())
+	{
+		mProfileMenu->setButtonRect(btn);
+	}
 	mProfileMenu->updateParent(LLMenuGL::sMenuContainer);
-	mProfileMenu->setButtonRect(btn->getLocalRect(), btn);
+
+	LLRect rect = btn->getRect();
 	LLMenuGL::showPopup(this, mProfileMenu, rect.mRight, rect.mTop);
 }
 
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 6905c7e546f..04b4226f82f 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -346,11 +346,18 @@ void LLPanelPicks::onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab)
 
 void LLPanelPicks::onOverflowButtonClicked()
 {
-	LLRect rect;
-	childGetRect(XML_BTN_OVERFLOW, rect);
+	if (!mOverflowMenu->toggleVisibility())
+		return;
+
+	LLView* btn = getChild<LLView>(XML_BTN_OVERFLOW);
 
+	if (mOverflowMenu->getButtonRect().isEmpty())
+	{
+		mOverflowMenu->setButtonRect(btn);
+	}
 	mOverflowMenu->updateParent(LLMenuGL::sMenuContainer);
-	mOverflowMenu->setButtonRect(rect, this);
+
+	LLRect rect = btn->getRect();
 	LLMenuGL::showPopup(this, mOverflowMenu, rect.mRight, rect.mTop);
 }
 
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index 3d0fba9426a..eb10d97b371 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -601,9 +601,12 @@ void LLPanelPlaces::onOverflowButtonClicked()
 	if (!menu->toggleVisibility())
 		return;
 
+	if (menu->getButtonRect().isEmpty())
+	{
+		menu->setButtonRect(mOverflowBtn);
+	}
 	menu->updateParent(LLMenuGL::sMenuContainer);
 	LLRect rect = mOverflowBtn->getRect();
-	menu->setButtonRect(rect, this);
 	LLMenuGL::showPopup(this, menu, rect.mRight, rect.mTop);
 }
 
-- 
GitLab


From 637b6673bcceb90783b674ed90217143ecb48fe3 Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Sat, 14 Nov 2009 10:22:32 -0800
Subject: [PATCH 290/557] More texture cache fixes, including a possible
 deadlock when the cache was getting purged. Significantly reduced spurrious
 warnings and delition of non sin-based texture fetch comptabable sided cache
 files.

---
 indra/newview/app_settings/settings.xml       |  2 +-
 indra/newview/lltexturecache.cpp              | 43 +++++++++++--------
 indra/newview/lltexturefetch.cpp              |  3 +-
 .../xui/en/panel_preferences_setup.xml        |  8 ++--
 4 files changed, 33 insertions(+), 23 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 8ad52784d33..75c8961d602 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -1132,7 +1132,7 @@
       <key>Type</key>
       <string>U32</string>
       <key>Value</key>
-      <integer>500</integer>
+      <integer>512</integer>
     </map>
     <key>CacheValidateCounter</key>
     <map>
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 2e2f342cca4..4f199e9da44 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -1002,7 +1002,7 @@ void LLTextureCache::closeHeaderEntriesFile()
 void LLTextureCache::readEntriesHeader()
 {
 	// mHeaderEntriesInfo initializes to default values so safe not to read it
-		llassert_always(mHeaderAPRFile == NULL);
+	llassert_always(mHeaderAPRFile == NULL);
 	if (LLAPRFile::isExist(mHeaderEntriesFileName, getLocalAPRFilePool()))
 	{
 		LLAPRFile::readEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo),
@@ -1192,7 +1192,7 @@ void LLTextureCache::writeEntriesAndClose(const std::vector<Entry>& entries)
 // Called from either the main thread or the worker thread
 void LLTextureCache::readHeaderCache()
 {
-	LLMutexLock lock(&mHeaderMutex);
+	mHeaderMutex.lock();
 
 	mLRU.clear(); // always clear the LRU
 
@@ -1214,14 +1214,14 @@ void LLTextureCache::readHeaderCache()
 			U32 empty_entries = 0;
 			typedef std::pair<U32, S32> lru_data_t;
 			std::set<lru_data_t> lru;
-			std::vector<S32> purge_list;
+			std::set<LLUUID> purge_list;
 			for (U32 i=0; i<num_entries; i++)
 			{
 				Entry& entry = entries[i];
 				const LLUUID& id = entry.mID;
 				if (entry.mImageSize < 0)
 				{
-					// This will be in the Free List, don't put it in the LRY
+					// This will be in the Free List, don't put it in the LRU
 					++empty_entries;
 				}
 				else
@@ -1233,7 +1233,8 @@ void LLTextureCache::readHeaderCache()
 						{
 							// Shouldn't happen, failsafe only
 							llwarns << "Bad entry: " << i << ": " << id << ": BodySize: " << entry.mBodySize << llendl;
-							purge_list.push_back(i);
+							purge_list.insert(entry.mID);
+							entry.mImageSize = -1; // empty/available
 						}
 					}
 				}
@@ -1248,13 +1249,17 @@ void LLTextureCache::readHeaderCache()
 				{
 					for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter)
 					{
-						purge_list.push_back(iter->second);
-						if (--entries_to_purge <= 0)
-							break;
+						S32 idx = iter->second;
+						if (entries[idx].mImageSize >= 0)
+						{
+							purge_list.insert(entries[idx].mID);
+							entries[idx].mImageSize = -1;
+							if (purge_list.size() >= entries_to_purge)
+								break;
+						}
 					}
 				}
-				llassert_always(entries_to_purge <= 0);
-				llassert_always(purge_list.size() == entries_to_purge);
+				llassert_always(purge_list.size() >= entries_to_purge);
 			}
 			else
 			{
@@ -1272,11 +1277,9 @@ void LLTextureCache::readHeaderCache()
 			
 			if (purge_list.size() > 0)
 			{
-				for (std::vector<S32>::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter)
+				for (std::set<LLUUID>::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter)
 				{
-					S32 idx = *iter;
-					const LLUUID& id = entries[idx].mID;
-					entries[idx].mImageSize = -1; // set cached entry size to -1
+					const LLUUID& id = *iter;
 					bool res = removeHeaderCacheEntry(id); // sets entry size on disk to -1
 					llassert_always(res);
 					LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());
@@ -1295,7 +1298,9 @@ void LLTextureCache::readHeaderCache()
 				llassert_always(new_entries.size() <= sCacheMaxEntries);
 				mHeaderEntriesInfo.mEntries = new_entries.size();
 				writeEntriesAndClose(new_entries);
+				mHeaderMutex.unlock(); // unlock the mutex before calling again
 				readHeaderCache(); // repeat with new entries file
+				mHeaderMutex.lock();
 			}
 			else
 			{
@@ -1303,6 +1308,7 @@ void LLTextureCache::readHeaderCache()
 			}
 		}
 	}
+	mHeaderMutex.unlock();
 }
 
 //////////////////////////////////////////////////////////////////////////////
@@ -1348,9 +1354,12 @@ void LLTextureCache::purgeTextures(bool validate)
 		return;
 	}
 
-	// *FIX:Mani - watchdog off.
-	LLAppViewer::instance()->pauseMainloopTimeout();
-
+	if (!mThreaded)
+	{
+		// *FIX:Mani - watchdog off.
+		LLAppViewer::instance()->pauseMainloopTimeout();
+	}
+	
 	LLMutexLock lock(&mHeaderMutex);
 
 	llinfos << "TEXTURE CACHE: Purging." << llendl;
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index c918f988952..6f3dabe5a73 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -524,6 +524,7 @@ void LLTextureFetchWorker::setDesiredDiscard(S32 discard, S32 size)
 		mDesiredSize = size;
 		prioritize = true;
 	}
+	mDesiredSize = llmax(mDesiredSize, TEXTURE_CACHE_ENTRY_SIZE);
 	if ((prioritize && mState == INIT) || mState == DONE)
 	{
 		mState = INIT;
@@ -613,6 +614,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
 		mCacheReadHandle = LLTextureCache::nullHandle();
 		mCacheWriteHandle = LLTextureCache::nullHandle();
 		mState = LOAD_FROM_TEXTURE_CACHE;
+		mDesiredSize = llmax(mDesiredSize, TEXTURE_CACHE_ENTRY_SIZE); // min desired size is TEXTURE_CACHE_ENTRY_SIZE
 		LL_DEBUGS("Texture") << mID << ": Priority: " << llformat("%8.0f",mImagePriority)
 							 << " Desired Discard: " << mDesiredDiscard << " Desired Size: " << mDesiredSize << LL_ENDL;
 		// fall through
@@ -681,7 +683,6 @@ bool LLTextureFetchWorker::doWork(S32 param)
 
 	if (mState == CACHE_POST)
 	{
-		mDesiredSize = llmax(mDesiredSize, TEXTURE_CACHE_ENTRY_SIZE);
 		mCachedSize = mFormattedImage.notNull() ? mFormattedImage->getDataSize() : 0;
 		// Successfully loaded
 		if ((mCachedSize >= mDesiredSize) || mHaveAllData)
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
index 9cf0bd26d88..5cabae5fa01 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -169,12 +169,12 @@
      decimal_digits="0"
      follows="left|top"
      height="15"
-     increment="10"
-     initial_value="50"
+     increment="16"
+     initial_value="512"
      layout="topleft"
      left_delta="150"
-     max_val="1000"
-     min_val="10"
+     max_val="1024"
+     min_val="32"
      name="cache_size"
      top_delta="-1"
      width="180" />
-- 
GitLab


From f17399212edec08faf16fc844b2f9e5882f224f2 Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Sat, 14 Nov 2009 11:09:07 -0800
Subject: [PATCH 291/557] Compile fix for Windows

---
 indra/newview/llagentwearables.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index ab518adaddd..6cb96d13361 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -2137,7 +2137,7 @@ void LLLibraryOutfitsFetch::outfitsDone(void)
 
 void LLLibraryOutfitsFetch::contentsDone(void)
 {
-	for(S32 i = 0; i < mOutfits.size(); ++i)
+	for(S32 i = 0; i < (S32)mOutfits.size(); ++i)
 	{
 		// First, make a folder in the My Outfits directory.
 		const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
-- 
GitLab


From da4f76c17a19addb6a96b4c032fce5a873bee6e1 Mon Sep 17 00:00:00 2001
From: CG Linden <cg@lindenlab.com>
Date: Sun, 15 Nov 2009 09:22:00 -0800
Subject: [PATCH 292/557] Set PATH to devenv.com to avoid problem with
 develop.py's use of os.system()

---
 indra/develop.py | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/indra/develop.py b/indra/develop.py
index 79baa613adb..7941600b684 100755
--- a/indra/develop.py
+++ b/indra/develop.py
@@ -576,8 +576,10 @@ def get_build_cmd(self):
             return "buildconsole %s.sln /build %s" % (self.project_name, config)
 
         # devenv.com is CLI friendly, devenv.exe... not so much.
-        return ('"%sdevenv.com" %s.sln /build %s' % 
-                (self.find_visual_studio(), self.project_name, self.build_type))
+        #return ('"%sdevenv.com" %s.sln /build %s' % 
+        #        (self.find_visual_studio(), self.project_name, self.build_type))
+        return ('devenv.com %s.sln /build %s' % 
+                (self.project_name, self.build_type))
 
     def run(self, command, name=None, retry_on=None, retries=1):
         '''Run a program.  If the program fails, raise an exception.'''
-- 
GitLab


From 853faf531672a230c3bf7b4ed3069e0b6c2f6349 Mon Sep 17 00:00:00 2001
From: CG Linden <cg@lindenlab.com>
Date: Sun, 15 Nov 2009 09:41:07 -0800
Subject: [PATCH 293/557] Invoke native python for develop.py, not CYGWIN
 python, revert develop.py's original usage

---
 indra/develop.py | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/indra/develop.py b/indra/develop.py
index 7941600b684..3040b312baa 100755
--- a/indra/develop.py
+++ b/indra/develop.py
@@ -576,10 +576,10 @@ def get_build_cmd(self):
             return "buildconsole %s.sln /build %s" % (self.project_name, config)
 
         # devenv.com is CLI friendly, devenv.exe... not so much.
-        #return ('"%sdevenv.com" %s.sln /build %s' % 
-        #        (self.find_visual_studio(), self.project_name, self.build_type))
-        return ('devenv.com %s.sln /build %s' % 
-                (self.project_name, self.build_type))
+        return ('"%sdevenv.com" %s.sln /build %s' % 
+                (self.find_visual_studio(), self.project_name, self.build_type))
+        #return ('devenv.com %s.sln /build %s' % 
+        #        (self.project_name, self.build_type))
 
     def run(self, command, name=None, retry_on=None, retries=1):
         '''Run a program.  If the program fails, raise an exception.'''
-- 
GitLab


From 6b47e36b159a0e036beb442b82b1356aa756f152 Mon Sep 17 00:00:00 2001
From: CG Linden <cg@lindenlab.com>
Date: Sun, 15 Nov 2009 11:39:00 -0800
Subject: [PATCH 294/557] Add some debug output to develop.py

---
 indra/develop.py | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/indra/develop.py b/indra/develop.py
index 3040b312baa..05ad12f20e2 100755
--- a/indra/develop.py
+++ b/indra/develop.py
@@ -585,7 +585,9 @@ def run(self, command, name=None, retry_on=None, retries=1):
         '''Run a program.  If the program fails, raise an exception.'''
         while retries:
             retries = retries - 1
+            print "develop.py tries to run:", command
             ret = os.system(command)
+            print "got ret", ret, "from", command
             if ret:
                 if name is None:
                     name = command.split(None, 1)[0]
-- 
GitLab


From d02987453170b7ec395746a6f860d2c4e1356cdd Mon Sep 17 00:00:00 2001
From: "Eric M. Tulla (BigPapi)" <tulla@lindenlab.com>
Date: Sun, 15 Nov 2009 23:21:28 -0500
Subject: [PATCH 295/557] EXT-2203 & EXT-2302 - Look->Outfit rename and wear
 button enabling not properly hooked up

---
 indra/newview/llpanelappearancetab.h | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/indra/newview/llpanelappearancetab.h b/indra/newview/llpanelappearancetab.h
index 8a9ba66ec0b..c2f8dbd074a 100644
--- a/indra/newview/llpanelappearancetab.h
+++ b/indra/newview/llpanelappearancetab.h
@@ -53,12 +53,8 @@ class LLPanelAppearanceTab : public LLPanel
 
 	bool isTabVisible(); // Check if parent TabContainer is visible.
 
-	void setPanelAppearanceButtons(LLPanelAppearance* panel);
-
 
 protected:
-	LLButton*				mWearBtn;
-	LLButton*				mEditBtn;
 	LLPanelAppearance*		mParent;
 };
 
-- 
GitLab


From 651541a899f8674e06501686de4fc4715ff0d044 Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Sun, 15 Nov 2009 22:39:48 -0800
Subject: [PATCH 296/557] Fixed a deadlock causing textrue caching to stall.

---
 indra/newview/lltexturecache.cpp | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 4f199e9da44..c33c652935a 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -1506,7 +1506,7 @@ S32 LLTextureCache::getHeaderCacheEntry(const LLUUID& id, S32& imagesize)
 // Writes imagesize to the header, updates timestamp
 S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, S32 imagesize)
 {
-	LLMutexLock lock(&mHeaderMutex);
+	mHeaderMutex.lock();
 	llassert_always(imagesize >= 0);
 	Entry entry;
 	S32 idx = openAndReadEntry(id, entry, true);
@@ -1514,11 +1514,15 @@ S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, S32 imagesize)
 	{
 		entry.mImageSize = imagesize;
 		writeEntryAndClose(idx, entry);
+		mHeaderMutex.unlock();
 	}
 	else // retry
 	{
+		mHeaderMutex.unlock();
 		readHeaderCache(); // We couldn't write an entry, so refresh the LRU
+		mHeaderMutex.lock();
 		llassert_always(!mLRU.empty() || mHeaderEntriesInfo.mEntries < sCacheMaxEntries);
+		mHeaderMutex.unlock();
 		idx = setHeaderCacheEntry(id, imagesize); // assert above ensures no inf. recursion
 	}
 	return idx;
@@ -1644,7 +1648,7 @@ void LLTextureCache::addCompleted(Responder* responder, bool success)
 //////////////////////////////////////////////////////////////////////////////
 
 // Called from MAIN thread (endWork())
-// Ensuere that mHeaderMutex is locked first!
+// Ensure that mHeaderMutex is locked first!
 bool LLTextureCache::removeHeaderCacheEntry(const LLUUID& id)
 {
 	Entry entry;
-- 
GitLab


From e7519e8a977138627b429ca43a10184c82efc66e Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Mon, 16 Nov 2009 11:41:21 +0200
Subject: [PATCH 297/557] fixed EXT-2402 "Clicking on notification item in the
 Message Well should bring it to front" made LLToast and LLDockableFloater
 goes foreground on setVisible(TRUE);

--HG--
branch : product-engine
---
 indra/llui/lldockablefloater.cpp  |  4 ++++
 indra/newview/llsyswellwindow.cpp | 11 +++++++----
 indra/newview/lltoast.cpp         |  1 +
 3 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp
index f56cb2eee72..c3dd4ae647d 100644
--- a/indra/llui/lldockablefloater.cpp
+++ b/indra/llui/lldockablefloater.cpp
@@ -127,6 +127,10 @@ void LLDockableFloater::setVisible(BOOL visible)
 		mDockControl.get()->repositionDockable();
 	}
 
+	if (visible)
+	{
+		LLFloater::setFrontmost(TRUE);
+	}
 	LLFloater::setVisible(visible);
 }
 
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index 2fb6550107a..eada3879456 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -90,9 +90,9 @@ BOOL LLSysWellWindow::postBuild()
 void LLSysWellWindow::setMinimized(BOOL minimize)
 {
 	// we don't show empty Message Well window
-	if (!minimize)
+	if (!minimize && isWindowEmpty())
 	{
-		setVisible(!isWindowEmpty());
+		return;
 	}
 
 	LLDockableFloater::setMinimized(minimize);
@@ -268,8 +268,11 @@ void LLSysWellWindow::toggleWindow()
 	{
 		setVisible(FALSE);
 	}
-	//set window in foreground
-	setFocus(getVisible());
+	else if(!isDocked())
+	{
+		// bring to front undocked floater
+		setVisible(TRUE);
+	}
 }
 
 //---------------------------------------------------------------------------------
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index 903df21e785..513439daeb9 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -225,6 +225,7 @@ void LLToast::setVisible(BOOL show)
 		{
 			mTimer.start();
 		}
+		LLModalDialog::setFrontmost(TRUE);
 	}
 	LLPanel::setVisible(show);
 	if(mPanel)
-- 
GitLab


From 602921ba2d70f39cee6f19946b5d9a43d3cd8f33 Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Mon, 16 Nov 2009 13:15:09 +0200
Subject: [PATCH 298/557] Fixed normal bug EXT-2452 (Favorites Bar tooltip
 shows only 2 out of 3 coordinates).

--HG--
branch : product-engine
---
 indra/newview/llfavoritesbar.cpp    | 18 +++++++++++++++---
 indra/newview/lllandmarkactions.cpp |  4 ++--
 indra/newview/lllandmarkactions.h   |  2 +-
 3 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index 01603f390de..ae5be8cc7c9 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -74,6 +74,7 @@ class LLLandmarkInfoGetter
 		mName("(Loading...)"),
 		mPosX(0),
 		mPosY(0),
+		mPosZ(0),
 		mLoaded(false) 
 	{}
 
@@ -101,6 +102,14 @@ class LLLandmarkInfoGetter
 			requestNameAndPos();
 		return mPosY;
 	}
+
+	S32 getPosZ()
+	{
+		if (!mLoaded)
+			requestNameAndPos();
+		return mPosZ;
+	}
+
 private:
 	/**
 	 * Requests landmark data from server.
@@ -114,14 +123,15 @@ class LLLandmarkInfoGetter
 		if(LLLandmarkActions::getLandmarkGlobalPos(mLandmarkID, g_pos))
 		{
 			LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(g_pos,
-				boost::bind(&LLLandmarkInfoGetter::landmarkNameCallback, this, _1, _2, _3));
+				boost::bind(&LLLandmarkInfoGetter::landmarkNameCallback, this, _1, _2, _3, _4));
 		}
 	}
 
-	void landmarkNameCallback(const std::string& name, S32 x, S32 y)
+	void landmarkNameCallback(const std::string& name, S32 x, S32 y, S32 z)
 	{
 		mPosX = x;
 		mPosY = y;
+		mPosZ = z;
 		mName = name;
 		mLoaded = true;
 	}
@@ -130,6 +140,7 @@ class LLLandmarkInfoGetter
 	std::string mName;
 	S32 mPosX;
 	S32 mPosY;
+	S32 mPosZ;
 	bool mLoaded;
 };
 
@@ -151,7 +162,8 @@ class LLFavoriteLandmarkButton : public LLButton
 		if (!region_name.empty())
 		{
 			LLToolTip::Params params;
-			params.message = llformat("%s\n%s (%d, %d)", getLabelSelected().c_str(), region_name.c_str(), mLandmarkInfoGetter.getPosX(), mLandmarkInfoGetter.getPosY());
+			params.message = llformat("%s\n%s (%d, %d, %d)", getLabelSelected().c_str(), region_name.c_str(), 
+				mLandmarkInfoGetter.getPosX(), mLandmarkInfoGetter.getPosY(), mLandmarkInfoGetter.getPosZ());
 			params.sticky_rect = calcScreenRect();
 			LLToolTipMgr::instance().show(params);
 		}
diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp
index e0dc1b6f0fc..003afafa87a 100644
--- a/indra/newview/lllandmarkactions.cpp
+++ b/indra/newview/lllandmarkactions.cpp
@@ -324,7 +324,7 @@ void LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(const LLVector3d& gl
 	{
 		LLVector3 pos = sim_infop->getLocalPos(global_pos);
 		std::string name = sim_infop->getName() ;
-		cb(name, llround(pos.mV[VX]), llround(pos.mV[VY]));
+		cb(name, llround(pos.mV[VX]), llround(pos.mV[VY]),llround(pos.mV[VZ]));
 	}
 	else
 	{
@@ -368,7 +368,7 @@ void LLLandmarkActions::onRegionResponseNameAndCoords(region_name_and_coords_cal
 	{
 		LLVector3 local_pos = sim_infop->getLocalPos(global_pos);
 		std::string name = sim_infop->getName() ;
-		cb(name, llround(local_pos.mV[VX]), llround(local_pos.mV[VY]));
+		cb(name, llround(local_pos.mV[VX]), llround(local_pos.mV[VY]), llround(local_pos.mV[VZ]));
 	}
 }
 
diff --git a/indra/newview/lllandmarkactions.h b/indra/newview/lllandmarkactions.h
index 1c524c820c9..c65b831f3e6 100644
--- a/indra/newview/lllandmarkactions.h
+++ b/indra/newview/lllandmarkactions.h
@@ -43,7 +43,7 @@ class LLLandmarkActions
 {
 public:
 	typedef boost::function<void(std::string& slurl)> slurl_callback_t;
-	typedef boost::function<void(std::string& slurl, S32 x, S32 y)> region_name_and_coords_callback_t;
+	typedef boost::function<void(std::string& slurl, S32 x, S32 y, S32 z)> region_name_and_coords_callback_t;
 
 	/**
 	 * @brief Fetches landmark LLViewerInventoryItems for the given landmark name. 
-- 
GitLab


From 75fe049b1817c7a04bad480ae53f42260fecba5e Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Mon, 16 Nov 2009 13:18:42 +0200
Subject: [PATCH 299/557] Work on major sub-task EXT-991 (Update bottom bar
 behavior on resize) - code cleaned up, removed commented out & unused code
 Functionality was not changed

--HG--
branch : product-engine
---
 indra/newview/llbottomtray.cpp    | 35 -------------------------------
 indra/newview/llbottomtray.h      |  2 --
 indra/newview/llchiclet.cpp       |  2 --
 indra/newview/llnearbychatbar.cpp | 13 ------------
 4 files changed, 52 deletions(-)

diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index fd711b72b0e..958dbf226a8 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -317,11 +317,6 @@ BOOL LLBottomTray::postBuild()
 	// Registering Chat Bar to receive Voice client status change notifications.
 	gVoiceClient->addObserver(this);
 
-	if (mChicletPanel && mToolbarStack && mNearbyChatBar)
-	{
-		verifyChildControlsSizes();
-	}
-
 	return TRUE;
 }
 
@@ -340,35 +335,6 @@ void LLBottomTray::log(LLView* panel, const std::string& descr)
 		; 
 }
 
-void LLBottomTray::verifyChildControlsSizes()
-{
-	LLRect rect = mChicletPanel->getRect();
-	/*
-	if (rect.getWidth() < mChicletPanel->getMinWidth())
-	{
-		llwarns << "QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ: chiclet panel less then min" << llendl;
-		mChicletPanel->reshape(mChicletPanel->getMinWidth(), rect.getHeight());
-	}
-*/
-	rect = mNearbyChatBar->getRect();
-/*
-	if (rect.getWidth() < mNearbyChatBar->getMinWidth())
-	{
-		llwarns << "WWWWWWWWWWWWWWWWWWWWWWWWWWWWW: near chat panel less then min" << llendl;
-		mNearbyChatBar->reshape(mNearbyChatBar->getMinWidth(), rect.getHeight());
-	}
-	else 
-*/
-		if (rect.getWidth() > mNearbyChatBar->getMaxWidth())
-	{
-		llerrs << "WWWWWWWWWWWWWWWWWWWWWWWWWWWWW: near chat panel more then max width" << llendl;
-
-		rect.setLeftTopAndSize(rect.mLeft, rect.mTop, mNearbyChatBar->getMaxWidth(), rect.getHeight());
-		mNearbyChatBar->reshape(mNearbyChatBar->getMaxWidth(), rect.getHeight());
-		mNearbyChatBar->setRect(rect);
-	}
-}
-
 void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
 {
 	static S32 debug_calling_number = 0;
@@ -393,7 +359,6 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
 	if (mChicletPanel && mToolbarStack && mNearbyChatBar)
 	{
 		mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE);
- 		verifyChildControlsSizes();
 
 		// bottom tray is narrowed
 		if (delta_width < 0)
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 974289d5e0f..8989816bfec 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -101,8 +101,6 @@ class LLBottomTray
 		, RS_RESIZABLE_BUTTONS			= /*RS_BUTTON_SNAPSHOT | */RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES
 	}EResizeState;
 
-	void updateResizeState(S32 new_width, S32 cur_width);
-	void verifyChildControlsSizes();
 	S32 processWidthDecreased(S32 delta_width);
 	void processWidthIncreased(S32 delta_width);
 	void log(LLView* panel, const std::string& descr);
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 9e290c8c046..4078fac4ecb 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -797,13 +797,11 @@ LLChicletPanel::Params::Params()
 	chiclet_padding = 3;
 	scrolling_offset = 40;
 
-/*
 	if (!min_width.isProvided())
 	{
 		// min_width = 4 chiclets + 3 paddings
 		min_width = 180 + 3*chiclet_padding;
 	}
-*/
 };
 
 LLChicletPanel::LLChicletPanel(const Params&p)
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 333646d2c5e..8fb4ea42119 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -252,19 +252,6 @@ bool LLNearbyChatBar::instanceExists()
 
 void LLNearbyChatBar::draw()
 {
-// TODO: mantipov: remove
-/*
-	LLRect rect = getRect();
-	S32 max_width = getMaxWidth();
-
-	if (rect.getWidth() > max_width)
-	{
-		rect.setLeftTopAndSize(rect.mLeft, rect.mTop, max_width, rect.getHeight());
-		reshape(rect.getWidth(), rect.getHeight(), FALSE);
-		setRect(rect);
-	}
-*/
-
 	displaySpeakingIndicator();
 	LLPanel::draw();
 }
-- 
GitLab


From e62d7410ee0d4b3db1d0b5aaa247c14ad0f4091e Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Mon, 16 Nov 2009 13:24:50 +0200
Subject: [PATCH 300/557] Fixed normal bug EXT-2376 (Friends List folder not
 being correctly identified/fetched)

--HG--
branch : product-engine
---
 indra/newview/llfriendcard.cpp | 45 ++++++++++++++++------------------
 indra/newview/llfriendcard.h   |  2 +-
 2 files changed, 22 insertions(+), 25 deletions(-)

diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp
index 481b75cf739..83684a0a3df 100644
--- a/indra/newview/llfriendcard.cpp
+++ b/indra/newview/llfriendcard.cpp
@@ -43,27 +43,24 @@
 
 // Constants;
 
-static const std::string INVENTORY_STRING_FRIENDS_SUBFOLDER = "Friends";
-static const std::string INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER = "All";
+static const std::string INVENTORY_STRING_FRIENDS_SUBFOLDER = "InvFolder Friends";
+static const std::string INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER = "InvFolder All";
 
 // helper functions
 
-/*
-mantipov *NOTE: unable to use 
-LLTrans::getString("InvFolder Friends"); or
-LLTrans::getString("InvFolder FriendsAll");
-in next two functions to set localized folders' names because of there is a hack in the
-LLFolderViewItem::refreshFromListener() method for protected asset types.
-So, localized names will be got from the strings with "InvFolder LABEL_NAME" in the strings.xml
-*/
-inline const std::string& get_friend_folder_name()
+// NOTE: Usage of LLTrans::getString(); in next two functions to set localized
+// folders' names is caused by a hack in the LLFolderViewItem::refreshFromListener()
+// method for protected asset types.
+// So, localized names will be got from the strings with "InvFolder LABEL_NAME"
+// in the strings.xml
+inline const std::string get_friend_folder_name()
 {
-	return INVENTORY_STRING_FRIENDS_SUBFOLDER;
+	return LLTrans::getString(INVENTORY_STRING_FRIENDS_SUBFOLDER);
 }
 
-inline const std::string& get_friend_all_subfolder_name()
+inline const std::string get_friend_all_subfolder_name()
 {
-	return INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER;
+	return LLTrans::getString(INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER);
 }
 
 void move_from_to_arrays(LLInventoryModel::cat_array_t& from, LLInventoryModel::cat_array_t& to)
@@ -80,15 +77,20 @@ const LLUUID& get_folder_uuid(const LLUUID& parentFolderUUID, LLInventoryCollect
 	LLInventoryModel::cat_array_t cats;
 	LLInventoryModel::item_array_t items;
 
-	gInventory.collectDescendentsIf(parentFolderUUID, cats, items, 
+	gInventory.collectDescendentsIf(parentFolderUUID, cats, items,
 		LLInventoryModel::EXCLUDE_TRASH, matchFunctor);
 
-	if (cats.count() == 1)
+	S32 cats_count = cats.count();
+
+	if (cats_count > 1)
 	{
-		return cats.get(0)->getUUID();
+		LL_WARNS("LLFriendCardsManager")
+			<< "There is more than one Friend card folder."
+			<< "The first folder will be used."
+			<< LL_ENDL;
 	}
 
-	return LLUUID::null;
+	return (cats_count >= 1) ? cats.get(0)->getUUID() : LLUUID::null;
 }
 
 /**
@@ -347,13 +349,8 @@ const LLUUID& LLFriendCardsManager::findFriendAllSubfolderUUIDImpl() const
 	return findChildFolderUUID(friendFolderUUID, friendAllSubfolderName);
 }
 
-const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& folderLabel) const
+const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& localizedName) const
 {
-	// mantipov *HACK: get localaized name in the same way like in the LLFolderViewItem::refreshFromListener() method.
-	// be sure these both methods are synchronized.
-	// see also get_friend_folder_name() and get_friend_all_subfolder_name() functions
-	std::string localizedName = LLTrans::getString("InvFolder " + folderLabel);
-
 	LLNameCategoryCollector matchFolderFunctor(localizedName);
 
 	return get_folder_uuid(parentFolderUUID, matchFolderFunctor);
diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h
index 98dc3153d0d..b94d5ec2c00 100644
--- a/indra/newview/llfriendcard.h
+++ b/indra/newview/llfriendcard.h
@@ -120,7 +120,7 @@ class LLFriendCardsManager
 		return (mBuddyIDSet.end() != mBuddyIDSet.find(avatarID));
 	}
 
-	const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& folderLabel) const;
+	const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& localizedName) const;
 	const LLUUID& findFriendFolderUUIDImpl() const;
 	const LLUUID& findFriendAllSubfolderUUIDImpl() const;
 	const LLUUID& findFriendCardInventoryUUIDImpl(const LLUUID& avatarID);
-- 
GitLab


From 508097d0f691e9705ab25d0b42f13a8d02a90049 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Mon, 16 Nov 2009 14:11:50 +0200
Subject: [PATCH 301/557] fixed EXT-2500 "Avatar stops moving when
 online/offline notification toast popups"

--HG--
branch : product-engine
---
 indra/newview/lltoast.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index 513439daeb9..ed2cedbd10d 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -225,7 +225,7 @@ void LLToast::setVisible(BOOL show)
 		{
 			mTimer.start();
 		}
-		LLModalDialog::setFrontmost(TRUE);
+		LLModalDialog::setFrontmost(FALSE);
 	}
 	LLPanel::setVisible(show);
 	if(mPanel)
-- 
GitLab


From eeaeca81b9a0d35b12c047497dc388593b2e9f29 Mon Sep 17 00:00:00 2001
From: Yuri Chebotarev <ychebotarev@productengine.com>
Date: Mon, 16 Nov 2009 14:13:36 +0200
Subject: [PATCH 302/557] fix for normal ticket EXT-2459 Nearby toasts aren't
 visible when nearby chat console is minimized

--HG--
branch : product-engine
---
 indra/newview/llnearbychat.cpp | 9 ++++++++-
 indra/newview/llnearbychat.h   | 1 +
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index ac806d7106a..8bf964f0a7d 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -292,5 +292,12 @@ void LLNearbyChat::getAllowedRect(LLRect& rect)
 {
 	rect = gViewerWindow->getWorldViewRectRaw();
 }
-
+void LLNearbyChat::setMinimized	(BOOL minimize)
+{
+	if(minimize && !isDocked())
+	{
+		setVisible(FALSE);
+	}
+	LLDockableFloater::setMinimized(minimize);
+}
 
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
index cb4654654a9..ac3f3465384 100644
--- a/indra/newview/llnearbychat.h
+++ b/indra/newview/llnearbychat.h
@@ -57,6 +57,7 @@ class LLNearbyChat: public LLDockableFloater
 	/*virtual*/ void	onOpen	(const LLSD& key);
 
 	virtual void setRect		(const LLRect &rect);
+	virtual void setMinimized	(BOOL minimize);
 
 private:
 	virtual void    applySavedVariables();
-- 
GitLab


From 154f501cb19ee99ab9fdb41b918478f18b220f40 Mon Sep 17 00:00:00 2001
From: Dmitry Oleshko <doleshko@productengine.com>
Date: Mon, 16 Nov 2009 14:34:38 +0200
Subject: [PATCH 303/557] fixed normal bug (EXT-2503) Clicking on (x) button in
 Message Well Window doesn't dismiss a group notice

Added to the handler of group notices functionality on rejecting of notifications.
This behavior was broken earlier in the handler for script notifications.

--HG--
branch : product-engine
---
 indra/newview/llnotificationgrouphandler.cpp | 14 ++++++++++++++
 indra/newview/llnotificationhandler.h        |  3 +++
 2 files changed, 17 insertions(+)

diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp
index fc6fb25644a..26730e1f108 100644
--- a/indra/newview/llnotificationgrouphandler.cpp
+++ b/indra/newview/llnotificationgrouphandler.cpp
@@ -37,6 +37,7 @@
 #include "llgroupactions.h"
 #include "llviewercontrol.h"
 #include "llviewerwindow.h"
+#include "llnotificationmanager.h"
 
 using namespace LLNotificationsUI;
 
@@ -47,6 +48,9 @@ LLGroupHandler::LLGroupHandler(e_notification_type type, const LLSD& id)
 
 	// Getting a Channel for our notifications
 	mChannel = LLChannelManager::getInstance()->createNotificationChannel();
+	LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+	if(channel)
+		channel->setOnRejectToastCallback(boost::bind(&LLGroupHandler::onRejectToast, this, _1));
 }
 
 //--------------------------------------------------------------------------
@@ -118,5 +122,15 @@ void LLGroupHandler::onDeleteToast(LLToast* toast)
 }
 
 //--------------------------------------------------------------------------
+void LLGroupHandler::onRejectToast(LLUUID& id)
+{
+	LLNotificationPtr notification = LLNotifications::instance().find(id);
+
+	if (notification && LLNotificationManager::getInstance()->getHandlerForNotification(notification->getType()) == this)
+	{
+		LLNotifications::instance().cancel(notification);
+	}
+}
 
+//--------------------------------------------------------------------------
 
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index 23998a0e5d1..42cc7cacc23 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -209,6 +209,9 @@ class LLGroupHandler : public LLSysHandler
 protected:
 	virtual void onDeleteToast(LLToast* toast);
 	virtual void initChannel();
+
+	// own handlers
+	void onRejectToast(LLUUID& id);
 };
 
 /**
-- 
GitLab


From 89e917599b7d24e2fc7ec9c58522756f4877ad92 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Mon, 16 Nov 2009 14:36:09 +0200
Subject: [PATCH 304/557] fixed EXT-862 "Add support for Busy mode into
 notifications"; disabled showing toasts except alertmodal in busy mode

--HG--
branch : product-engine
---
 indra/newview/llagent.cpp          | 3 +++
 indra/newview/llchannelmanager.cpp | 9 ++++++++-
 indra/newview/llchannelmanager.h   | 7 +++++++
 3 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index ca1688ad1f7..1257cf97897 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -107,6 +107,7 @@
 
 #include "llnavigationbar.h" //to show/hide navigation bar when changing mouse look state
 #include "llagentui.h"
+#include "llchannelmanager.h"
 
 using namespace LLVOAvatarDefines;
 
@@ -2166,6 +2167,7 @@ void LLAgent::setBusy()
 	{
 		gBusyMenu->setLabel(LLTrans::getString("AvatarSetNotBusy"));
 	}
+	LLNotificationsUI::LLChannelManager::getInstance()->muteAllChannels(true);
 }
 
 //-----------------------------------------------------------------------------
@@ -2179,6 +2181,7 @@ void LLAgent::clearBusy()
 	{
 		gBusyMenu->setLabel(LLTrans::getString("AvatarSetBusy"));
 	}
+	LLNotificationsUI::LLChannelManager::getInstance()->muteAllChannels(false);
 }
 
 //-----------------------------------------------------------------------------
diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp
index 914435b6409..3443d8b593a 100644
--- a/indra/newview/llchannelmanager.cpp
+++ b/indra/newview/llchannelmanager.cpp
@@ -220,5 +220,12 @@ void LLChannelManager::removeChannelByID(const LLUUID id)
 }
 
 //--------------------------------------------------------------------------
-
+void LLChannelManager::muteAllChannels(bool mute)
+{
+	for (std::vector<ChannelElem>::iterator it = mChannelList.begin();
+			it != mChannelList.end(); it++)
+	{
+		it->channel->setShowToasts(!mute);
+	}
+}
 
diff --git a/indra/newview/llchannelmanager.h b/indra/newview/llchannelmanager.h
index b927d369cd4..4b66a1ef892 100644
--- a/indra/newview/llchannelmanager.h
+++ b/indra/newview/llchannelmanager.h
@@ -102,6 +102,13 @@ class LLChannelManager : public LLSingleton<LLChannelManager>
 	// remove channel methods
 	void	removeChannelByID(const LLUUID id);
 
+	/**
+	 * Manages toasts showing for all channels.
+	 *
+	 * @param mute Flag to disable/enable toasts showing.
+	 */
+	void muteAllChannels(bool mute);
+
 private:
 
 	LLScreenChannel* createChannel(LLChannelManager::Params& p);
-- 
GitLab


From 1baf1d218644ac5dc00d9b41119a1ef168c709a2 Mon Sep 17 00:00:00 2001
From: angela <angela@lindenlab.com>
Date: Mon, 16 Nov 2009 20:46:40 +0800
Subject: [PATCH 305/557] fix chat format for /me

---
 indra/llui/llstyle.cpp                     | 29 ++++++++++++++--
 indra/llui/llstyle.h                       |  5 +++
 indra/llui/lltextbase.cpp                  | 11 +++---
 indra/newview/llchathistory.cpp            |  6 ++--
 indra/newview/llchathistory.h              |  2 +-
 indra/newview/llchatitemscontainerctrl.cpp | 24 +++++++++++--
 indra/newview/llexpandabletextbox.cpp      |  5 ++-
 indra/newview/llimfloater.cpp              | 28 ++++++++++++++-
 indra/newview/llnearbychat.cpp             | 28 ++++++++++++++-
 indra/newview/llnearbychathandler.cpp      |  1 +
 indra/newview/lltoastimpanel.cpp           |  4 +--
 indra/newview/llviewerchat.cpp             | 17 +++++++++
 indra/newview/llviewerchat.h               |  3 +-
 indra/newview/llviewermessage.cpp          | 40 ++++++++++++----------
 14 files changed, 163 insertions(+), 40 deletions(-)

diff --git a/indra/llui/llstyle.cpp b/indra/llui/llstyle.cpp
index 71511f69a41..92c0b7c1b46 100644
--- a/indra/llui/llstyle.cpp
+++ b/indra/llui/llstyle.cpp
@@ -44,7 +44,10 @@ LLStyle::Params::Params()
 	color("color", LLColor4::black),
 	font("font", LLFontGL::getFontMonospace()),
 	image("image"),
-	link_href("href")
+	link_href("href"),
+	italic("italic", false ),
+	bold("bold", false),
+    underline("bold", false)
 {}
 
 
@@ -55,7 +58,10 @@ LLStyle::LLStyle(const LLStyle::Params& p)
 	mFont(p.font()),
 	mLink(p.link_href),
 	mDropShadow(p.drop_shadow),
-	mImagep(p.image())
+	mImagep(p.image()),
+	mItalic(p.italic()),
+	mBold(p.bold),
+	mUnderline(p.underline)
 {}
 
 void LLStyle::setFont(const LLFontGL* font)
@@ -69,6 +75,25 @@ const LLFontGL* LLStyle::getFont() const
 	return mFont;
 }
 
+const S32 LLStyle::getFontStyle() const
+{
+	S32 ret = 0;
+	if (mBold)
+	{
+		ret |= LLFontGL::BOLD;
+	}
+	if (mItalic)
+	{
+		ret |= LLFontGL::ITALIC;
+	}
+	if (mUnderline)
+	{
+		ret |= LLFontGL::UNDERLINE;
+	}
+	return ret;
+}
+
+
 void LLStyle::setLinkHREF(const std::string& href)
 {
 	mLink = href;
diff --git a/indra/llui/llstyle.h b/indra/llui/llstyle.h
index ee9ca730e94..cc72011903c 100644
--- a/indra/llui/llstyle.h
+++ b/indra/llui/llstyle.h
@@ -51,12 +51,17 @@ class LLStyle : public LLRefCount
 		Optional<const LLFontGL*>		font;
 		Optional<LLUIImage*>			image;
 		Optional<std::string>			link_href;
+		Optional<bool>					italic;
+		Optional<bool>					bold;
+		Optional<bool>					underline;
 		Params();
 	};
 	LLStyle(const Params& p = Params());
 public:
 	const LLColor4& getColor() const { return mColor; }
 	void setColor(const LLColor4 &color) { mColor = color; }
+	
+	const S32 getFontStyle() const;
 
 	const LLColor4& getReadOnlyColor() const { return mReadOnlyColor; }
 
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 7b1aaac35cb..d7697ac7cc7 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1506,9 +1506,8 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c
 			LLStyle::Params link_params = style_params;
 			link_params.color = match.getColor();
 			// apply font name from requested style_params
-			std::string font_name = LLFontGL::nameFromFont(style_params.font());
-			link_params.font.name.setIfNotProvided(font_name);
-			link_params.font.style = "UNDERLINE";
+			std::string font_name = LLFontGL::nameFromFont(style_params.font());			
+			link_params.underline = true;
 			link_params.link_href = match.getUrl();
 
 			// output the text before the Url
@@ -2251,7 +2250,7 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
 					rect.mLeft, rect.mTop, 
 					color, 
 					LLFontGL::LEFT, LLFontGL::TOP, 
-					0, 
+					mStyle->getFontStyle(), 
 					mStyle->getShadowType(), 
 					length, rect.getWidth(), 
 					&right_x, 
@@ -2270,7 +2269,7 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
 					rect.mLeft, rect.mTop,
 					LLColor4( 1.f - color.mV[0], 1.f - color.mV[1], 1.f - color.mV[2], 1.f ),
 					LLFontGL::LEFT, LLFontGL::TOP, 
-					0, 
+					mStyle->getFontStyle(), 
 					LLFontGL::NO_SHADOW, 
 					length, rect.mRight, 
 					&right_x, 
@@ -2287,7 +2286,7 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
 					rect.mLeft, rect.mTop, 
 					color, 
 					LLFontGL::LEFT, LLFontGL::TOP, 
-					0, 
+					mStyle->getFontStyle(), 
 					mStyle->getShadowType(), 
 					length, rect.mRight, 
 					&right_x, 
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 028bb7a3848..bec8eb26665 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -345,7 +345,7 @@ LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style
 	return header;
 }
 
-void LLChatHistory::appendWidgetMessage(const LLChat& chat)
+void LLChatHistory::appendWidgetMessage(const LLChat& chat, const LLStyle::Params& input_append_params)
 {
 	LLView* view = NULL;
 	std::string view_text = "\n[" + formatCurrentTime() + "] ";
@@ -367,7 +367,9 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat)
 	style_params.color(txt_color);
 	style_params.readonly_color(txt_color);
 	style_params.font(fontp);
-
+	style_params.italic = input_append_params.italic;
+	style_params.underline = input_append_params.underline;
+	style_params.bold = input_append_params.bold;
 	
 	if (mLastFromName == chat.mFromName)
 	{
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index f689a225fe3..c89d4b4ec67 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -109,7 +109,7 @@ class LLChatHistory : public LLTextEditor
 		 * @param time time of a message.
 		 * @param message message itself.
 		 */
-		void appendWidgetMessage(const LLChat& chat);
+		void appendWidgetMessage(const LLChat& chat, const LLStyle::Params& input_append_params = LLStyle::Params());
 
 	private:
 		std::string mLastFromName;
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index d2e3247250b..1cc6b2beefc 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -173,10 +173,28 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
 	
 	caption->getChild<LLTextBox>("msg_time", false)->setText(appendTime() , style_params );
 
-
 	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
-	msg_text->setText(mText, style_params);
 
+
+	if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC)
+	{
+		if (mFromName.size() > 0)
+		{
+			style_params.italic= true;
+			
+			msg_text->setText(mFromName, style_params);
+		}
+		mText = mText.substr(3);
+		style_params.underline = true;
+		msg_text->addText(mText,style_params);
+	}
+	else 
+	{
+		msg_text->setText(mText, style_params);
+	}
+
+
+	
 	LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector");
 	if(mSourceType != CHAT_SOURCE_AGENT)
 		msg_inspector->setVisible(false);
@@ -196,6 +214,8 @@ void	LLNearbyChatToastPanel::setMessage	(const LLChat& chat_msg)
 	notification["from_id"] = chat_msg.mFromID;
 	notification["time"] = chat_msg.mTime;
 	notification["source"] = (S32)chat_msg.mSourceType;
+	notification["chat_type"] = (S32)chat_msg.mChatType;
+	notification["chat_style"] = (S32)chat_msg.mChatStyle;
 	
 	std::string r_color_name="White";
 	F32 r_color_alpha = 1.0f; 
diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index 6d7da107ac1..27df6be7307 100644
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -80,7 +80,7 @@ class LLExpanderSegment : public LLTextSegment
 									draw_rect.mRight, draw_rect.mTop, 
 									mStyle->getColor(), 
 									LLFontGL::RIGHT, LLFontGL::TOP, 
-									0, 
+									mStyle->getFontStyle(), 
 									mStyle->getShadowType(), 
 									end - start, draw_rect.getWidth(), 
 									&right_x, 
@@ -164,8 +164,7 @@ void LLExpandableTextBox::LLTextBoxEx::showExpandText()
 		S32 last_line = visible_lines.second - 1;
 
 		LLStyle::Params expander_style = getDefaultStyle();
-		expander_style.font.name.setIfNotProvided(LLFontGL::nameFromFont(expander_style.font));
-		expander_style.font.style = "UNDERLINE";
+		expander_style.underline = true;
 		expander_style.color = LLUIColorTable::instance().getColor("HTMLLinkColor");
 		LLExpanderSegment* expanderp = new LLExpanderSegment(new LLStyle(expander_style), getLineStart(last_line), getLength() + 1, mExpanderLabel, *this);
 		insertSegment(expanderp);
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index e3121fbc7a5..dff27ee032f 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -477,7 +477,33 @@ void LLIMFloater::updateMessages()
 			chat.mFromName = from;
 			chat.mText = message;
 
-			mChatHistory->appendWidgetMessage(chat);
+			LLStyle::Params append_style_params;
+			//Handle IRC styled /me messages.
+			std::string prefix = message.substr(0, 4);
+			if (prefix == "/me " || prefix == "/me'")
+			{
+				if (from.size() > 0)
+				{
+					append_style_params.italic= true;
+					chat.mText = from + " ";
+					mChatHistory->appendWidgetMessage(chat, append_style_params);
+				}
+				message = message.substr(3);
+				
+				LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
+				LLViewerChat::getChatColor(chat,txt_color);
+				LLFontGL* fontp = LLViewerChat::getChatFont();
+				append_style_params.color(txt_color);
+				append_style_params.readonly_color(txt_color);
+				append_style_params.font(fontp);
+				append_style_params.underline = true;
+				mChatHistory->appendText(message, FALSE, append_style_params);
+			}
+			else
+			{
+				chat.mText = message;
+				mChatHistory->appendWidgetMessage(chat);
+			}
 
 			mLastMessageIndex = msg["index"].asInteger();
 		}
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 85db69174d9..68677decae4 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -155,7 +155,33 @@ void	LLNearbyChat::addMessage(const LLChat& chat)
 	
 	if (!chat.mMuted)
 	{
-		mChatHistory->appendWidgetMessage(chat);
+		std::string message = chat.mText;
+		std::string prefix = message.substr(0, 4);
+		if (chat.mChatStyle == CHAT_STYLE_IRC)
+		{
+			LLStyle::Params append_style_params;
+			if (chat.mFromName.size() > 0)
+			{
+				append_style_params.italic= true;
+				LLChat add_chat=chat;
+				add_chat.mText = chat.mFromName + " ";
+				mChatHistory->appendWidgetMessage(add_chat, append_style_params);
+			}
+			message = message.substr(3);
+			
+			LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
+			LLViewerChat::getChatColor(chat,txt_color);
+			LLFontGL* fontp = LLViewerChat::getChatFont();
+			append_style_params.color(txt_color);
+			append_style_params.readonly_color(txt_color);
+			append_style_params.font(fontp);
+			append_style_params.underline = true;
+			mChatHistory->appendText(message, FALSE, append_style_params);
+		}
+		else
+		{
+			mChatHistory->appendWidgetMessage(chat);
+		}
 	}
 }
 
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index 458845fff3f..74a75d03695 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -341,6 +341,7 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg)
 		notification["time"] = chat_msg.mTime;
 		notification["source"] = (S32)chat_msg.mSourceType;
 		notification["chat_type"] = (S32)chat_msg.mChatType;
+		notification["chat_style"] = (S32)chat_msg.mChatStyle;
 		
 		std::string r_color_name = "White";
 		F32 r_color_alpha = 1.0f; 
diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp
index 1ea5f515b76..3acab85bf75 100644
--- a/indra/newview/lltoastimpanel.cpp
+++ b/indra/newview/lltoastimpanel.cpp
@@ -56,9 +56,9 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) :	LLToastPanel(p.notif
 	if (prefix == "/me " || prefix == "/me'")
 	{
 		mMessage->clear();
-		style_params.font.style= "ITALIC";
+		style_params.italic = true;
 		mMessage->appendText(p.from + " ", FALSE, style_params);
-		style_params.font.style= "UNDERLINE";
+		style_params.underline = true;
 		mMessage->appendText(p.message.substr(3), FALSE, style_params);
 	}
 	else
diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp
index d65a060bbc1..ccf9ce90561 100644
--- a/indra/newview/llviewerchat.cpp
+++ b/indra/newview/llviewerchat.cpp
@@ -201,3 +201,20 @@ S32 LLViewerChat::getChatFontSize()
 {
 	return gSavedSettings.getS32("ChatFontSize");
 }
+
+
+//static
+void LLViewerChat::formatChatMsg(const LLChat& chat, std::string& formated_msg)
+{
+	std::string tmpmsg = chat.mText;
+	
+	if(chat.mChatStyle == CHAT_STYLE_IRC)
+	{
+		formated_msg = chat.mFromName + tmpmsg.substr(3);
+	}
+	else 
+	{
+		formated_msg = tmpmsg;
+	}
+
+}
\ No newline at end of file
diff --git a/indra/newview/llviewerchat.h b/indra/newview/llviewerchat.h
index d8840d5dd24..502d6ea7e52 100644
--- a/indra/newview/llviewerchat.h
+++ b/indra/newview/llviewerchat.h
@@ -45,8 +45,7 @@ class LLViewerChat
 	static void getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha);
 	static LLFontGL* getChatFont();
 	static S32 getChatFontSize();
-	
-
+	static void formatChatMsg(const LLChat& chat, std::string& formated_msg);
 
 };
 
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 01531168870..ef6a621323b 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -2343,14 +2343,14 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
 		std::string prefix = mesg.substr(0, 4);
 		if (prefix == "/me " || prefix == "/me'")
 		{
-			chat.mText = from_name;
-			chat.mText += mesg.substr(3);
+//			chat.mText = from_name;
+//			chat.mText += mesg.substr(3);
 			ircstyle = TRUE;
 		}
-		else
-		{
+//		else
+//		{
 			chat.mText = mesg;
-		}
+//		}
 
 		// Look for the start of typing so we can put "..." in the bubbles.
 		if (CHAT_TYPE_START == chat.mChatType)
@@ -2376,19 +2376,6 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
 			return;
 		}
 
-		// We have a real utterance now, so can stop showing "..." and proceed.
-		if (chatter && chatter->isAvatar())
-		{
-			LLLocalSpeakerMgr::getInstance()->setSpeakerTyping(from_id, FALSE);
-			((LLVOAvatar*)chatter)->stopTyping();
-
-			if (!is_muted && !is_busy)
-			{
-				visible_in_chat_bubble = gSavedSettings.getBOOL("UseChatBubbles");
-				((LLVOAvatar*)chatter)->addChat(chat);
-			}
-		}
-
 		// Look for IRC-style emotes
 		if (ircstyle)
 		{
@@ -2428,6 +2415,23 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
 			chat.mText += mesg;
 		}
 		
+		// We have a real utterance now, so can stop showing "..." and proceed.
+		if (chatter && chatter->isAvatar())
+		{
+			LLLocalSpeakerMgr::getInstance()->setSpeakerTyping(from_id, FALSE);
+			((LLVOAvatar*)chatter)->stopTyping();
+			
+			if (!is_muted && !is_busy)
+			{
+				visible_in_chat_bubble = gSavedSettings.getBOOL("UseChatBubbles");
+				std::string formated_msg = "";
+				LLViewerChat::formatChatMsg(chat, formated_msg);
+				LLChat chat_bubble = chat;
+				chat_bubble.mText = formated_msg;
+				((LLVOAvatar*)chatter)->addChat(chat_bubble);
+			}
+		}
+		
 		if (chatter)
 		{
 			chat.mPosAgent = chatter->getPositionAgent();
-- 
GitLab


From bce2cab144214b5a90a702e62f1e7c98e93fefc3 Mon Sep 17 00:00:00 2001
From: angela <angela@lindenlab.com>
Date: Mon, 16 Nov 2009 21:27:08 +0800
Subject: [PATCH 306/557]   EXT-2317  I18N: use the localized names for
 [ATTACHMENT_POINT] in strings.xml WornOnAttachmentPoint

---
 indra/newview/llinventorybridge.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index d7be09efa9a..d18f9affe3c 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -3937,7 +3937,6 @@ std::string LLObjectBridge::getLabelSuffix() const
 	if( avatar && avatar->isWearingAttachment( mUUID ) )
 	{
 		std::string attachment_point_name = avatar->getAttachedPointName(mUUID);
-		LLStringUtil::toLower(attachment_point_name);
 
 		LLStringUtil::format_map_t args;
 		args["[ATTACHMENT_POINT]"] =  attachment_point_name.c_str();
-- 
GitLab


From beb62fa222863a2d8c94e7c1a50667d19cb17003 Mon Sep 17 00:00:00 2001
From: Denis Serdjuk <dserduk@productengine.com>
Date: Mon, 16 Nov 2009 15:37:30 +0200
Subject: [PATCH 307/557] Fix for bug EXT-1234. Crash after click on For Sale
 banner for remote place Cause: After teleporting LLViewerParcelMgr resets
 current selected parcel. Changes: Complementary check of selected parcel has
 been added.

--HG--
branch : product-engine
---
 indra/newview/llpanelplaceprofile.cpp | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
index 61501cc1b1b..0c7cc9af385 100644
--- a/indra/newview/llpanelplaceprofile.cpp
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -542,16 +542,16 @@ void LLPanelPlaceProfile::updateCovenantText(const std::string &text)
 void LLPanelPlaceProfile::onForSaleBannerClick()
 {
 	LLViewerParcelMgr* mgr = LLViewerParcelMgr::getInstance();
-	LLParcelSelectionHandle hParcel = mgr->getFloatingParcelSelection();
+	LLParcel* parcel = mgr->getFloatingParcelSelection()->getParcel();
 	LLViewerRegion* selected_region =  mgr->getSelectionRegion();
-	if(!hParcel.isNull() && selected_region)
+	if(parcel && selected_region)
 	{
-		if(hParcel->getParcel()->getLocalID() == mSelectedParcelID &&
+		if(parcel->getLocalID() == mSelectedParcelID &&
 				mLastSelectedRegionID ==selected_region->getRegionID())
 		{
-			if(hParcel->getParcel()->getSalePrice() - gStatusBar->getBalance() > 0)
+			if(parcel->getSalePrice() - gStatusBar->getBalance() > 0)
 			{
-				LLFloaterBuyCurrency::buyCurrency("Buying selected land ", hParcel->getParcel()->getSalePrice());
+				LLFloaterBuyCurrency::buyCurrency("Buying selected land ", parcel->getSalePrice());
 			}
 			else
 			{
-- 
GitLab


From a77bf7a1c2bc2b198f1b9c6c95f61ed0110ff62d Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Mon, 16 Nov 2009 16:51:06 +0200
Subject: [PATCH 308/557] fixed EXT-2365 "LLAlertHandler should can process
 notifications before login."; initialized notifications screen channels after
 LLViewerWindow instantiated and disabled all old notifications
 widgets(LLNotifyBox, LLGroupNotifyBox, LLAlertDialog);

--HG--
branch : product-engine
---
 indra/newview/llappviewer.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 845a264327d..f82d1780895 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -89,6 +89,8 @@
 #include "llvfsthread.h"
 #include "llvolumemgr.h"
 
+#include "llnotificationmanager.h"
+
 // Third party library includes
 #include <boost/bind.hpp>
 
@@ -2340,6 +2342,8 @@ bool LLAppViewer::initWindow()
 		gSavedSettings.getS32("WindowX"), gSavedSettings.getS32("WindowY"),
 		gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"),
 		FALSE, ignorePixelDepth);
+
+	LLNotificationsUI::LLNotificationManager::getInstance();
 		
 	if (gSavedSettings.getBOOL("WindowFullScreen"))
 	{
-- 
GitLab


From 32d8e9e396d497a83eb068888d794dd34216f6d7 Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Mon, 16 Nov 2009 18:09:33 +0200
Subject: [PATCH 309/557] Some coding style changes of EXT-1014 (Unable to move
 undocked camera controls bar) fix (c63047a5bf60).

--HG--
branch : product-engine
---
 indra/newview/lljoystickbutton.cpp | 18 ++++++++++--------
 indra/newview/lljoystickbutton.h   |  8 +++++++-
 2 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp
index d7eaad94f01..0acc67ff5a8 100644
--- a/indra/newview/lljoystickbutton.cpp
+++ b/indra/newview/lljoystickbutton.cpp
@@ -134,15 +134,17 @@ void LLJoystick::updateSlop()
 	return;
 }
 
-BOOL LLJoystick::pointInCircle(S32 x, S32 y) const 
+bool LLJoystick::pointInCircle(S32 x, S32 y) const 
 { 
-	//cnt is x and y coordinates of center of joystick circle, and also its radius,
-	//because area is not just rectangular, it's a square!
-	//Make sure to change method if this changes.
-	int cnt = this->getLocalRect().mTop/2;
-	if((x-cnt)*(x-cnt)+(y-cnt)*(y-cnt)<=cnt*cnt)
+	if(this->getLocalRect().mTop!=this->getLocalRect().mRight)
+	{
+		llwarns << "Joystick shape is not square"<<llendl;
 		return TRUE;
-	return FALSE;
+	}
+	//center is x and y coordinates of center of joystick circle, and also its radius
+	int center = this->getLocalRect().mTop/2;
+	bool in_circle = (x - center) * (x - center) + (y - center) * (y - center) <= center * center;
+	return in_circle;
 }
 
 BOOL LLJoystick::handleMouseDown(S32 x, S32 y, MASK mask)
@@ -150,7 +152,7 @@ BOOL LLJoystick::handleMouseDown(S32 x, S32 y, MASK mask)
 	//llinfos << "joystick mouse down " << x << ", " << y << llendl;
 	bool handles = false;
 
-	if(handles = pointInCircle(x, y))
+	if(pointInCircle(x, y))
 	{
 		mLastMouse.set(x, y);
 		mFirstMouse.set(x, y);
diff --git a/indra/newview/lljoystickbutton.h b/indra/newview/lljoystickbutton.h
index 0465f78031f..2b071a8999b 100644
--- a/indra/newview/lljoystickbutton.h
+++ b/indra/newview/lljoystickbutton.h
@@ -79,7 +79,13 @@ class LLJoystick
 	static void		onBtnHeldDown(void *userdata);		// called by llbutton callback handler
 	void            setInitialQuadrant(EJoystickQuadrant initial) { mInitialQuadrant = initial; };
 
-	BOOL			pointInCircle(S32 x, S32 y) const;
+	/**
+	 * Checks if click location is inside joystick circle.
+	 *
+	 * Image containing circle is square and this square has adherent points with joystick
+	 * circle. Make sure to change method according to shape other than square. 
+	 */
+	bool			pointInCircle(S32 x, S32 y) const;
 	
 	static std::string nameFromQuadrant(const EJoystickQuadrant quadrant);
 	static EJoystickQuadrant quadrantFromName(const std::string& name);
-- 
GitLab


From 914e76fe41ba14b6c51c5e25164086ab8ce84921 Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Mon, 16 Nov 2009 18:30:33 +0200
Subject: [PATCH 310/557] Fixed low bug EXT-2324 ('+' btn do nothing in Recent
 and Nearby tabs on People panel when focus is set to non-friend avatar)

--HG--
branch : product-engine
---
 indra/newview/llpanelpeople.cpp                     |  9 +++++----
 indra/newview/skins/default/xui/en/panel_people.xml | 10 ++++++++--
 2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 1f5ffb7335b..709525d4e26 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -448,6 +448,7 @@ LLPanelPeople::LLPanelPeople()
 	mFriendListUpdater = new LLFriendListUpdater(boost::bind(&LLPanelPeople::updateFriendList,	this));
 	mNearbyListUpdater = new LLNearbyListUpdater(boost::bind(&LLPanelPeople::updateNearbyList,	this));
 	mRecentListUpdater = new LLRecentListUpdater(boost::bind(&LLPanelPeople::updateRecentList,	this));
+	mCommitCallbackRegistrar.add("People.addFriend", boost::bind(&LLPanelPeople::onAddFriendButtonClicked, this));
 }
 
 LLPanelPeople::~LLPanelPeople()
@@ -547,7 +548,6 @@ BOOL LLPanelPeople::postBuild()
 		boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _2, mOnlineFriendList));
 
 	buttonSetAction("view_profile_btn",	boost::bind(&LLPanelPeople::onViewProfileButtonClicked,	this));
-	buttonSetAction("add_friend_btn",	boost::bind(&LLPanelPeople::onAddFriendButtonClicked,	this));
 	buttonSetAction("group_info_btn",	boost::bind(&LLPanelPeople::onGroupInfoButtonClicked,	this));
 	buttonSetAction("chat_btn",			boost::bind(&LLPanelPeople::onChatButtonClicked,		this));
 	buttonSetAction("im_btn",			boost::bind(&LLPanelPeople::onImButtonClicked,			this));
@@ -707,7 +707,7 @@ void LLPanelPeople::updateButtons()
 	bool nearby_tab_active	= (cur_tab == NEARBY_TAB_NAME);
 	bool friends_tab_active = (cur_tab == FRIENDS_TAB_NAME);
 	bool group_tab_active	= (cur_tab == GROUP_TAB_NAME);
-	bool recent_tab_active	= (cur_tab == RECENT_TAB_NAME);
+	//bool recent_tab_active	= (cur_tab == RECENT_TAB_NAME);
 	LLUUID selected_id;
 
 	std::vector<LLUUID> selected_uuids;
@@ -717,7 +717,6 @@ void LLPanelPeople::updateButtons()
 
 	buttonSetVisible("group_info_btn",		group_tab_active);
 	buttonSetVisible("chat_btn",			group_tab_active);
-	buttonSetVisible("add_friend_btn",		nearby_tab_active || recent_tab_active);
 	buttonSetVisible("view_profile_btn",	!group_tab_active);
 	buttonSetVisible("im_btn",				!group_tab_active);
 	buttonSetVisible("call_btn",			!group_tab_active);
@@ -750,7 +749,9 @@ void LLPanelPeople::updateButtons()
 			is_friend = LLAvatarTracker::instance().getBuddyInfo(selected_id) != NULL;
 		}
 
-		childSetEnabled("add_friend_btn",	!is_friend);
+		LLPanel* cur_panel = mTabContainer->getCurrentPanel();
+		if (cur_panel)
+			cur_panel->childSetEnabled("add_friend_btn", !is_friend);
 	}
 
 	buttonSetEnabled("teleport_btn",		friends_tab_active && item_selected && isFriendOnline(selected_uuids.front()));
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 9fac7d34f75..a370b450e9a 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -107,7 +107,10 @@ background_visible="true"
                  name="add_friend_btn"
                  top_delta="0"
                  tool_tip="Add selected resident to your friends List"
-                 width="18" />
+                 width="18">
+               <commit_callback
+                  function="People.addFriend" />
+             </button>
             </panel>
         </panel>
         <panel
@@ -325,7 +328,10 @@ background_visible="true"
                  name="add_friend_btn"
                  top_delta="0"
                  tool_tip="Add selected resident to your friends List"
-                 width="18" />
+                 width="18">
+                <commit_callback
+                   function="People.addFriend" />
+              </button>
             </panel>
         </panel>
     </tab_container>
-- 
GitLab


From aba8b04cfc6763ee565a5ae9929e8be044272b08 Mon Sep 17 00:00:00 2001
From: Dmitry Oleshko <doleshko@productengine.com>
Date: Mon, 16 Nov 2009 18:51:54 +0200
Subject: [PATCH 311/557] fix of a normal bug (EXT-2448) [BSI] Notification
 toasts should resize when text is to long to be displayed

A maximum number of characters for textbox/texteditor could be set only through XML.
In case when a corresponding attribute was absent - the maximun number was set to 255, and there were no chance (no function) to change it.
So in this fix such a function was added.

--HG--
branch : product-engine
---
 indra/llui/lltextbase.h              | 1 +
 indra/newview/lltoastnotifypanel.cpp | 1 +
 2 files changed, 2 insertions(+)

diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 70d78c77cde..c376a73615c 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -139,6 +139,7 @@ class LLTextBase
 	// TODO: add optional style parameter
 	virtual void			setText(const LLStringExplicit &utf8str , const LLStyle::Params& input_params = LLStyle::Params()); // uses default style
 	virtual std::string		getText() const;
+	void					setMaxTextLength(S32 length) { mMaxTextByteLength = length; }
 
 	// wide-char versions
 	void					setWText(const LLWString& text);
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index 0c23947a8ce..48b68e4292f 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -128,6 +128,7 @@ mAddedDefaultBtn(false)
 	// *TODO: magic numbers(???) - copied from llnotify.cpp(250)
 	const S32 MAX_LENGTH = 512 + 20 + DB_FIRST_NAME_BUF_SIZE + DB_LAST_NAME_BUF_SIZE + DB_INV_ITEM_NAME_BUF_SIZE; 
 
+	mTextBox->setMaxTextLength(MAX_LENGTH);
 	mTextBox->setVisible(TRUE);
 	mTextBox->setValue(notification->getMessage());
 
-- 
GitLab


From 211529eee9a4cbb36961af75e94af73da920d08d Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Mon, 16 Nov 2009 11:54:53 -0500
Subject: [PATCH 312/557] re-adding "make outfit button"

the "make outfit" button in the appearance editor was accidentally removed (merge issue).
Re-adding the XML tag for the button to floater_customize.xml

Reviewed by Bigpapi
---
 .../newview/skins/default/xui/en/floater_customize.xml | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml
index 6c4f10e61e1..9d2a811d9fc 100644
--- a/indra/newview/skins/default/xui/en/floater_customize.xml
+++ b/indra/newview/skins/default/xui/en/floater_customize.xml
@@ -3379,6 +3379,16 @@ scratch and wear it.
          layout="topleft"
          name="panel_list" />
     </scroll_container>
+    <button
+     bottom="536"
+     follows="right|bottom"
+     height="20"
+     label="Make Outfit"
+     label_selected="Make Outfit"
+     layout="topleft"
+     name="make_outfit_btn"
+     right="-216"
+     width="100" />
     <button
      bottom="536"
      follows="right|bottom"
-- 
GitLab


From 2128df33ec894d1b5ac1a0e0ad7023fe483abfe3 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Mon, 16 Nov 2009 17:13:02 +0000
Subject: [PATCH 313/557] Be more generous with the voicechannel states that
 trigger the Calling popup. Huh, the voicechannel state machine isn't much of
 a state machine.

---
 indra/newview/llvoicechannel.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index ae32ec7d117..871f302c3d2 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -873,6 +873,8 @@ void LLVoiceChannelP2P::setState(EState state)
 	// *HACK: Open/close the call window if needed.
 	toggleCallWindowIfNeeded(state);
 	
+	llinfos << "CALL STATE CHANGE: incoming=" << int(mReceivedCall) << " oldstate=" << mState << " newstate=" << state << llendl;
+
 	if (mReceivedCall) // incoming call
 	{
 		// you only "answer" voice invites in p2p mode
@@ -889,7 +891,8 @@ void LLVoiceChannelP2P::setState(EState state)
 		mCallDialogPayload["session_id"] = mSessionID;
 		mCallDialogPayload["session_name"] = mSessionName;
 		mCallDialogPayload["other_user_id"] = mOtherUserID;
-		if (state == STATE_RINGING)
+		if (state == STATE_RINGING ||
+		    state == STATE_CALL_STARTED)
 		{
 			// *HACK: open outgoing call floater if needed, might be better done elsewhere.
 			// *TODO: should move this squirrelly ui-fudging crap into LLOutgoingCallDialog itself
-- 
GitLab


From 85e142b949c83c674d316493ddaed71661e73066 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Mon, 16 Nov 2009 12:23:39 -0500
Subject: [PATCH 314/557] Header file cleanup

Removed unnecessary headers from llagent.cpp.  Alphabetized headers in llagent.h and llagent.cpp.
Trivial whitespace addition to llcallingcard.h

--HG--
branch : avatar-pipeline
---
 indra/newview/llagent.cpp     | 56 ++++++++---------------------------
 indra/newview/llagent.h       |  9 +++---
 indra/newview/llcallingcard.h |  1 +
 3 files changed, 18 insertions(+), 48 deletions(-)

diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index ca1688ad1f7..a093c1d4342 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -31,83 +31,53 @@
  */
 
 #include "llviewerprecompiledheaders.h"
-
 #include "llagent.h" 
-#include "llagentwearables.h"
+
+#include "pipeline.h"
 
 #include "llagentlistener.h"
+#include "llagentwearables.h"
+#include "llagentui.h"
+
 #include "llanimationstates.h"
+#include "llbottomtray.h"
 #include "llcallingcard.h"
 #include "llconsole.h"
-#include "lldrawable.h"
 #include "llfirstuse.h"
-#include "llfloaterreg.h"
-#include "llspeakers.h"
 #include "llfloatercamera.h"
 #include "llfloatercustomize.h"
-
-#include "llfloaterland.h"
-#include "llfloatersnapshot.h"
+#include "llfloaterreg.h"
 #include "llfloatertools.h"
-#include "llfloaterworldmap.h"
-
 #include "llgroupactions.h"
-
-#include "llfocusmgr.h"
 #include "llgroupmgr.h"
 #include "llhomelocationresponder.h"
-#include "llimview.h"
 #include "llhudmanager.h"
 #include "lljoystickbutton.h"
-#include "llmenugl.h"
 #include "llmorphview.h"
 #include "llmoveview.h"
+#include "llnavigationbar.h" // to show/hide navigation bar when changing mouse look state
+#include "llnearbychatbar.h"
 #include "llparcel.h"
-#include "llquantize.h"
-#include "llrand.h"
-#include "llregionhandle.h"
 #include "llsdutil.h"
-#include "llselectmgr.h"
+#include "llsidetray.h"
 #include "llsky.h"
-#include "llslurl.h"
 #include "llsmoothstep.h"
-#include "llsidetray.h"
 #include "llstatusbar.h"
-#include "llteleportflags.h"
-#include "llteleporthistory.h"
-#include "lltexturestats.h"
-#include "lltexturestats.h"
 #include "lltool.h"
-#include "lltoolcomp.h"
 #include "lltoolmgr.h"
-#include "lluictrlfactory.h"
-#include "llurldispatcher.h"
-
-#include "llviewercamera.h"
+#include "lltrans.h"
+#include "llviewercontrol.h"
 #include "llviewerdisplay.h"
+#include "llviewerjoystick.h"
 #include "llviewermediafocus.h"
 #include "llviewerobjectlist.h"
 #include "llviewerparcelmgr.h"
 #include "llviewerstats.h"
-#include "llviewerwindow.h"
-#include "llviewercontrol.h"
-#include "llviewerjoystick.h"
-
 #include "llvoavatarself.h"
 #include "llwindow.h"
 #include "llworld.h"
 #include "llworldmap.h"
 
-#include "pipeline.h"
-#include "lltrans.h"
-#include "llbottomtray.h"
-#include "llnearbychatbar.h"
-#include "stringize.h"
-#include "llcapabilitylistener.h"
-
-#include "llnavigationbar.h" //to show/hide navigation bar when changing mouse look state
-#include "llagentui.h"
-
 using namespace LLVOAvatarDefines;
 
 extern LLMenuBarGL* gMenuBarView;
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 99a9bdd8e63..4162dfce1e5 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -36,14 +36,13 @@
 #include "indra_constants.h"
 #include "llevent.h" 				// LLObservable base class
 #include "llagentaccess.h"
-#include "llagentaccess.h"
 #include "llagentconstants.h"
-#include "llhudeffectpointat.h" 	// ELookAtType
-#include "llhudeffectlookat.h" 		// EPointAtType
-#include "llpointer.h"
+#include "llagentdata.h" 			// gAgentID, gAgentSessionID
 #include "llcharacter.h" 			// LLAnimPauseRequest
 #include "llfollowcam.h" 			// Ventrella
-#include "llagentdata.h" 			// gAgentID, gAgentSessionID
+#include "llhudeffectlookat.h" 		// EPointAtType
+#include "llhudeffectpointat.h" 	// ELookAtType
+#include "llpointer.h"
 #include "lluicolor.h"
 #include "llvoavatardefines.h"
 
diff --git a/indra/newview/llcallingcard.h b/indra/newview/llcallingcard.h
index bd58b2fbe61..47b0dcb9039 100644
--- a/indra/newview/llcallingcard.h
+++ b/indra/newview/llcallingcard.h
@@ -45,6 +45,7 @@
 //class LLInventoryObserver;
 class LLMessageSystem;
 class LLTrackingData;
+
 class LLFriendObserver
 {
 public:
-- 
GitLab


From e12126bf89ee862603f02f709f69bb013c8a8635 Mon Sep 17 00:00:00 2001
From: Denis Serdjuk <dserduk@productengine.com>
Date: Mon, 16 Nov 2009 19:27:35 +0200
Subject: [PATCH 315/557] implemented task EXT-1899   Add button to Gestures
 floater which activates/deactivates

--HG--
branch : product-engine
---
 indra/newview/llfloatergesture.cpp            | 30 +++++++++++++++----
 indra/newview/llfloatergesture.h              |  6 +++-
 .../skins/default/xui/en/floater_gesture.xml  | 15 +++++++++-
 3 files changed, 43 insertions(+), 8 deletions(-)

diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index 854d02873a7..af86274472a 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -161,6 +161,7 @@ BOOL LLFloaterGesture::postBuild()
 
 	getChild<LLUICtrl>("play_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickPlay, this));
 	getChild<LLUICtrl>("stop_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickPlay, this));
+	getChild<LLButton>("activate_btn")->setClickedCallback(boost::bind(&LLFloaterGesture::onActivateBtnClick, this));
 
 	getChild<LLUICtrl>("new_gesture_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickNew, this));
 
@@ -179,7 +180,7 @@ BOOL LLFloaterGesture::postBuild()
 	
 	childSetFocus("gesture_list");
 
-	LLCtrlListInterface *list = childGetListInterface("gesture_list");
+	LLCtrlListInterface *list = getGestureList();
 	if (list)
 	{
 		const BOOL ascending = TRUE;
@@ -198,7 +199,7 @@ void LLFloaterGesture::refreshAll()
 {
 	buildGestureList();
 
-	LLCtrlListInterface *list = childGetListInterface("gesture_list");
+	LLCtrlListInterface *list = getGestureList();
 	if (!list) return;
 
 	if (mSelectedID.isNull())
@@ -219,7 +220,7 @@ void LLFloaterGesture::refreshAll()
 
 void LLFloaterGesture::buildGestureList()
 {
-	LLCtrlListInterface *list = childGetListInterface("gesture_list");
+	LLCtrlListInterface *list = getGestureList();
 	LLCtrlScrollInterface *scroll = childGetScrollInterface("gesture_list");
 
 	if (! (list && scroll)) return;
@@ -347,7 +348,7 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur
 
 void LLFloaterGesture::onClickInventory()
 {
-	LLCtrlListInterface *list = childGetListInterface("gesture_list");
+	LLCtrlListInterface *list = getGestureList();
 	if (!list) return;
 	const LLUUID& item_id = list->getCurrentID();
 
@@ -358,7 +359,7 @@ void LLFloaterGesture::onClickInventory()
 
 void LLFloaterGesture::onClickPlay()
 {
-	LLCtrlListInterface *list = childGetListInterface("gesture_list");
+	LLCtrlListInterface *list = getGestureList();
 	if (!list) return;
 	const LLUUID& item_id = list->getCurrentID();
 	if(item_id.isNull()) return;
@@ -396,10 +397,27 @@ void LLFloaterGesture::onClickNew()
 		LLInventoryType::IT_GESTURE, NOT_WEARABLE, PERM_MOVE | PERM_TRANSFER, cb);
 }
 
+void LLFloaterGesture::onActivateBtnClick()
+{
+	LLCtrlListInterface* list = getGestureList();
+	
+	LLUUID gesture_inv_id = list->getSelectedValue();
+	LLGestureManager* gm = LLGestureManager::getInstance();
+	
+	if(gm->isGestureActive(gesture_inv_id))
+	{
+		gm->deactivateGesture(gesture_inv_id);
+	}
+	else
+	{
+		gm->activateGesture(gesture_inv_id);
+	}
+}
+
 
 void LLFloaterGesture::onClickEdit()
 {
-	LLCtrlListInterface *list = childGetListInterface("gesture_list");
+	LLCtrlListInterface *list = getGestureList();
 	if (!list) return;
 	const LLUUID& item_id = list->getCurrentID();
 
diff --git a/indra/newview/llfloatergesture.h b/indra/newview/llfloatergesture.h
index e7819d2a032..50bef818daa 100644
--- a/indra/newview/llfloatergesture.h
+++ b/indra/newview/llfloatergesture.h
@@ -77,7 +77,11 @@ class LLFloaterGesture
 	void onClickNew();
 	void onCommitList();
 	void playGesture(LLUUID item_id);
-
+	LLCtrlListInterface* getGestureList() const 
+	{
+		return childGetListInterface("gesture_list");
+	}
+	void onActivateBtnClick();
 protected:
 	LLUUID mSelectedID;
 	LLUUID mGestureFolderID;
diff --git a/indra/newview/skins/default/xui/en/floater_gesture.xml b/indra/newview/skins/default/xui/en/floater_gesture.xml
index a3ac8782028..21d292847ab 100644
--- a/indra/newview/skins/default/xui/en/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_gesture.xml
@@ -83,7 +83,20 @@
                  tool_tip="Make new gesture"
                  top_delta="0"
                  width="18" />
-                <button
+              <button
+                 follows="bottom|left"
+                 font="SansSerifBigBold"
+                 height="10"
+                 image_hover_selected="Activate_Checkmark"
+                 image_selected="Activate_Checkmark"
+                 image_unselected="Activate_Checkmark"
+                 layout="topleft"
+                 left_pad="5"
+                 name="activate_btn"
+                 tool_tip="Activate/Deactivate selected gesture"
+                 top="10"
+                 width="10" />
+              <button
                  follows="bottom|right"
                  font="SansSerifBigBold"
                  height="18"
-- 
GitLab


From 5b6002f5cc9bd209372fb7453728ec3bd4842430 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Mon, 16 Nov 2009 17:36:07 +0000
Subject: [PATCH 316/557] speculative attempt at a 'no answer' dialog state,
 and some more debug spew.

---
 indra/newview/llvoicechannel.cpp              | 26 +++++++++++++++----
 .../default/xui/en/floater_outgoing_call.xml  | 11 ++++++++
 2 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index 871f302c3d2..9e48e80ca0d 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -747,6 +747,8 @@ LLVoiceChannelP2P::LLVoiceChannelP2P(const LLUUID& session_id, const std::string
 
 void LLVoiceChannelP2P::handleStatusChange(EStatusType type)
 {
+	llinfos << "CALL CHANNEL STATUS CHANGE: " << type << llendl;
+
 	// status updates
 	switch(type)
 	{
@@ -904,6 +906,7 @@ void LLVoiceChannelP2P::setState(EState state)
 					ocd->getChild<LLTextBox>("calling")->setVisible(true);
 					ocd->getChild<LLTextBox>("leaving")->setVisible(true);
 					ocd->getChild<LLTextBox>("connecting")->setVisible(false);
+					ocd->getChild<LLTextBox>("noanswer")->setVisible(false);
 				}
 			}
 		}
@@ -915,16 +918,29 @@ void LLVoiceChannelP2P::setState(EState state)
 					ocd->getChild<LLTextBox>("calling")->setVisible(false);
 					ocd->getChild<LLTextBox>("leaving")->setVisible(false);
 					ocd->getChild<LLTextBox>("connecting")->setVisible(true);
+					ocd->getChild<LLTextBox>("noanswer")->setVisible(false);
 				}			
 				}*/
+		else if (state == STATE_ERROR)
+		{
+			LLOutgoingCallDialog *ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
+			if (ocd)
+			{
+				ocd->getChild<LLTextBox>("calling")->setVisible(false);
+				ocd->getChild<LLTextBox>("leaving")->setVisible(false);
+				ocd->getChild<LLTextBox>("connecting")->setVisible(false);
+				ocd->getChild<LLTextBox>("noanswer")->setVisible(true);
+			}			
+		}
 		else if (state == STATE_HUNG_UP ||
 			 state == STATE_CONNECTED)
 		{
-				LLOutgoingCallDialog *ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
-				if (ocd)
-				{
-					ocd->closeFloater();
-				}			
+			// hide popup
+			LLOutgoingCallDialog *ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
+			if (ocd)
+			{
+				ocd->closeFloater();
+			}			
 		}
 	}
 
diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
index 82417de8a7d..ae4d5042efc 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -57,6 +57,17 @@ Connecting to [CALLEE_NAME]
      width="315"
      word_wrap="true">
 Calling [CALLEE_NAME]
+    </text>
+    <text
+     font="SansSerifLarge"
+     height="20"
+     layout="topleft"
+     left="77"
+     name="noanswer"
+     top="27"
+     width="315"
+     word_wrap="true">
+No Answer.  Please try again later.
     </text>
     <text
      font="SansSerif"
-- 
GitLab


From 743c8f7cbbc189e5ba3d0f5058790232ac6d03aa Mon Sep 17 00:00:00 2001
From: Denis Serdjuk <dserduk@productengine.com>
Date: Mon, 16 Nov 2009 19:53:07 +0200
Subject: [PATCH 317/557] fixed minor bug EXT-2292   Teleport History items
 don't fit to width of panel

--HG--
branch : product-engine
---
 .../skins/default/xui/en/panel_teleport_history_item.xml      | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
index 1f67a0a7328..4ab6175805a 100644
--- a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
@@ -26,7 +26,7 @@
      name="selected_icon"
      top="0"
      visible="false"
-     width="320" />
+     width="380" />
     <icon
      height="16"
      follows="top|left"
@@ -46,7 +46,7 @@
      text_color="white"
      top="4"
      value="..."
-     width="242" />
+     width="330" />
     <button
      follows="right"
      height="20"
-- 
GitLab


From b42b421d25f3b3a7ea4f571388acb64f98e1f51d Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Mon, 16 Nov 2009 17:53:17 +0000
Subject: [PATCH 318/557] better debug spew yes, it looks like we really don't
 get much detail from llvoiceclient, it's not just llvoicechannel that's
 dumbed-down!

---
 indra/newview/llvoicechannel.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index 9e48e80ca0d..7036d9ebb63 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -747,7 +747,7 @@ LLVoiceChannelP2P::LLVoiceChannelP2P(const LLUUID& session_id, const std::string
 
 void LLVoiceChannelP2P::handleStatusChange(EStatusType type)
 {
-	llinfos << "CALL CHANNEL STATUS CHANGE: " << type << llendl;
+	llinfos << "P2P CALL CHANNEL STATUS CHANGE: incoming=" << int(mReceivedCall) << " newstatus=" << LLVoiceClientStatusObserver::status2string(type) << " (mState=" << mState << ")" << llendl;
 
 	// status updates
 	switch(type)
@@ -875,7 +875,7 @@ void LLVoiceChannelP2P::setState(EState state)
 	// *HACK: Open/close the call window if needed.
 	toggleCallWindowIfNeeded(state);
 	
-	llinfos << "CALL STATE CHANGE: incoming=" << int(mReceivedCall) << " oldstate=" << mState << " newstate=" << state << llendl;
+	llinfos << "P2P CALL STATE CHANGE: incoming=" << int(mReceivedCall) << " oldstate=" << mState << " newstate=" << state << llendl;
 
 	if (mReceivedCall) // incoming call
 	{
-- 
GitLab


From 909125258dabd0722785519f689d20608bb13fc1 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Mon, 16 Nov 2009 14:23:46 -0500
Subject: [PATCH 319/557] Minor cleanup, changed inventorypanel start folder
 special casing keyword "INVENTORY" to using generic "My Inventory" keyword.

--HG--
branch : avatar-pipeline
---
 indra/newview/llinventorypanel.cpp                     | 6 +-----
 indra/newview/skins/default/xui/en/panel_landmarks.xml | 2 +-
 2 files changed, 2 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 129178e42e8..c113b9f0d02 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -149,11 +149,7 @@ BOOL LLInventoryPanel::postBuild()
 	// of that folder (i.e. not including the folder itself).
 	const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString);
 
-	if ("INVENTORY" == mStartFolderString)
-	{
-		mStartFolderID = gInventory.getRootFolderID();
-	}
-	else if ("LIBRARY" == mStartFolderString)
+	if ("LIBRARY" == mStartFolderString)
 	{
 		mStartFolderID = gInventory.getLibraryRootFolderID();
 	}
diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml
index f05684db107..4b91dc6294d 100644
--- a/indra/newview/skins/default/xui/en/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml
@@ -63,7 +63,7 @@
              left="0"
              mouse_opaque="true"
              name="my_inventory_list"
-             start_folder="INVENTORY"
+             start_folder="My Inventory"
              width="380"/>
           </accordion_tab>
           <accordion_tab
-- 
GitLab


From 81b64fd88be9793688c0924bcc25aa38b0ba85b4 Mon Sep 17 00:00:00 2001
From: richard <none@none>
Date: Mon, 16 Nov 2009 11:35:33 -0800
Subject: [PATCH 320/557] changed spacing to accomodate icons in owner/creator
 label

---
 indra/newview/skins/default/xui/en/inspect_object.xml | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/inspect_object.xml b/indra/newview/skins/default/xui/en/inspect_object.xml
index 1365a0483f6..09a26f59269 100644
--- a/indra/newview/skins/default/xui/en/inspect_object.xml
+++ b/indra/newview/skins/default/xui/en/inspect_object.xml
@@ -40,14 +40,14 @@ owner [OWNER]
   <text
    follows="all"
    font="SansSerif"
-   height="30"
+   height="33"
    left="8"
    name="object_creator"
    top_pad="0"
    use_ellipses="true"
    width="275">
-by Longavatarname Johnsonlongstonnammer
-owner James Linden
+    by secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
   </text>
   <!-- *TODO: Replace this icon -->
   <icon
@@ -56,7 +56,7 @@ owner James Linden
   left="7"
   width="16"
   height="16"
-  top="52"
+  top="56"
   follows="left|top"
   />
   <text
@@ -66,7 +66,7 @@ owner James Linden
    left_pad="5"
    name="price_text"
    text_color="white"
-   top="54"
+   top="58"
    font_shadow="none"
    width="150">
 L$300,000
-- 
GitLab


From 19d90dc5ed5494308744c02be9afb7eb021244e0 Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Mon, 16 Nov 2009 21:40:11 +0200
Subject: [PATCH 321/557] fixed minor bug EXT-2506 ('Add friend' menu item is
 enabled in fiend miniinspector's gear menu).

--HG--
branch : product-engine
---
 indra/newview/llinspectavatar.cpp                        | 9 +++++++++
 .../skins/default/xui/en/menu_inspect_avatar_gear.xml    | 2 ++
 2 files changed, 11 insertions(+)

diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index 8dc7833f6ac..baddd90d460 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -117,6 +117,9 @@ class LLInspectAvatar : public LLInspect
 	bool onVisibleZoomIn();
 	void onClickMuteVolume();
 	void onVolumeChange(const LLSD& data);
+
+	// Is used to determine if "Add friend" option should be enabled in gear menu
+	bool isNotFriend();
 	
 	// Callback for gCacheName to look up avatar name
 	void nameUpdatedCallback(
@@ -208,6 +211,7 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
 		boost::bind(&LLInspectAvatar::onVisibleFreezeEject, this));	
 	mVisibleCallbackRegistrar.add("InspectAvatar.VisibleZoomIn", 
 		boost::bind(&LLInspectAvatar::onVisibleZoomIn, this));
+	mEnableCallbackRegistrar.add("InspectAvatar.Gear.Enable", boost::bind(&LLInspectAvatar::isNotFriend, this));
 
 	// can't make the properties request until the widgets are constructed
 	// as it might return immediately, so do it in postBuild.
@@ -473,6 +477,11 @@ void LLInspectAvatar::onClickViewProfile()
 	closeFloater();
 }
 
+bool LLInspectAvatar::isNotFriend()
+{
+	return !LLAvatarActions::isFriend(mAvatarID);
+}
+
 bool LLInspectAvatar::onVisibleFindOnMap()
 {
 	return gAgent.isGodlike() || is_agent_mappable(mAvatarID);
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
index 590621062c2..a731996a1a2 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
@@ -17,6 +17,8 @@
    name="add_friend">
     <menu_item_call.on_click
      function="InspectAvatar.AddFriend"/>
+    <menu_item_call.on_enable
+     function="InspectAvatar.Gear.Enable"/>
   </menu_item_call>
   <menu_item_call
    label="IM"
-- 
GitLab


From d5efbfcd2874dd7045baabe33944da37e738872e Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Mon, 16 Nov 2009 12:36:35 -0800
Subject: [PATCH 322/557] Convert mForcePressedState to bool from BOOL

---
 indra/llui/llbutton.cpp     | 2 +-
 indra/llui/llbutton.h       | 4 ++--
 indra/llui/llmenubutton.cpp | 4 ++--
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index bbaf908d2e5..b65f248db27 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -146,7 +146,7 @@ LLButton::LLButton(const LLButton::Params& p)
 	mHoverGlowStrength(p.hover_glow_amount),
 	mCommitOnReturn(p.commit_on_return),
 	mFadeWhenDisabled(FALSE),
-	mForcePressedState(FALSE),
+	mForcePressedState(false),
 	mLastDrawCharsCount(0)
 {
 	static LLUICachedControl<S32> llbutton_orig_h_pad ("UIButtonOrigHPad", 0);
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 08f289092f2..3c1b57c4bef 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -238,7 +238,7 @@ class LLButton
 	static void		setDockableFloaterToggle(LLUICtrl* ctrl, const LLSD& sdname);
 	static void		showHelp(LLUICtrl* ctrl, const LLSD& sdname);
 
-	void		setForcePressedState(BOOL b) { mForcePressedState = b; }
+	void		setForcePressedState(bool b) { mForcePressedState = b; }
 	
 protected:
 	LLPointer<LLUIImage> getImageUnselected() const	{ return mImageUnselected; }
@@ -315,7 +315,7 @@ class LLButton
 	BOOL						mNeedsHighlight;
 	BOOL						mCommitOnReturn;
 	BOOL						mFadeWhenDisabled;
-	BOOL						mForcePressedState;
+	bool						mForcePressedState;
 
 	LLFrameTimer				mFlashingTimer;
 };
diff --git a/indra/llui/llmenubutton.cpp b/indra/llui/llmenubutton.cpp
index a657ed039a0..cdbd17e4dc4 100644
--- a/indra/llui/llmenubutton.cpp
+++ b/indra/llui/llmenubutton.cpp
@@ -133,11 +133,11 @@ void LLMenuButton::draw()
 	
 	if (mMenuVisibleLastFrame)
 	{
-		setForcePressedState(TRUE);
+		setForcePressedState(true);
 	}
 
 	LLButton::draw();
 
-	setForcePressedState(FALSE);
+	setForcePressedState(false);
 }
 
-- 
GitLab


From 7cc233b3a83bd82f7a42bf1f64901d2578beaf2c Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Mon, 16 Nov 2009 12:52:25 -0800
Subject: [PATCH 323/557] EXT-772 Dropbox widget needs "pressed" state -
 currently shows wrong art Reviewed with Richard.

---
 indra/llui/llcombobox.cpp                     | 19 +++++++++++++++++--
 indra/llui/llcombobox.h                       |  3 ++-
 .../skins/default/textures/textures.xml       |  1 +
 .../skins/default/xui/en/widgets/button.xml   |  4 ++++
 .../default/xui/en/widgets/combo_box.xml      |  4 +++-
 5 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp
index 36e309d639e..803978bfa28 100644
--- a/indra/llui/llcombobox.cpp
+++ b/indra/llui/llcombobox.cpp
@@ -109,7 +109,8 @@ LLComboBox::LLComboBox(const LLComboBox::Params& p)
 	// Text label button
 
 	LLButton::Params button_params = (mAllowTextEntry ? p.combo_button : p.drop_down_button);
-	button_params.mouse_down_callback.function(boost::bind(&LLComboBox::onButtonDown, this));
+	button_params.mouse_down_callback.function(
+		boost::bind(&LLComboBox::onButtonMouseDown, this));
 	button_params.follows.flags(FOLLOWS_LEFT|FOLLOWS_BOTTOM|FOLLOWS_RIGHT);
 	button_params.rect(p.rect);
 
@@ -140,6 +141,10 @@ LLComboBox::LLComboBox(const LLComboBox::Params& p)
 	mList = LLUICtrlFactory::create<LLScrollListCtrl>(params);
 	addChild(mList);
 
+	// Mouse-down on button will transfer mouse focus to the list
+	// Grab the mouse-up event and make sure the button state is correct
+	mList->setMouseUpCallback(boost::bind(&LLComboBox::onListMouseUp, this));
+
 	for (LLInitParam::ParamIterator<ItemParams>::const_iterator it = p.items().begin();
 		it != p.items().end();
 		++it)
@@ -644,7 +649,7 @@ void LLComboBox::hideList()
 	}
 }
 
-void LLComboBox::onButtonDown()
+void LLComboBox::onButtonMouseDown()
 {
 	if (!mList->getVisible())
 	{
@@ -670,6 +675,10 @@ void LLComboBox::onButtonDown()
 		if (mButton->hasMouseCapture())
 		{
 			gFocusMgr.setMouseCapture(mList);
+
+			// But keep the "pressed" look, which buttons normally lose when they
+			// lose focus
+			mButton->setForcePressedState(true);
 		}
 	}
 	else
@@ -679,6 +688,12 @@ void LLComboBox::onButtonDown()
 
 }
 
+void LLComboBox::onListMouseUp()
+{
+	// In some cases this is the termination of a mouse click that started on
+	// the button, so clear its pressed state
+	mButton->setForcePressedState(false);
+}
 
 //------------------------------------------------------------------
 // static functions
diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h
index 6285ca5170b..11acdb9b8fc 100644
--- a/indra/llui/llcombobox.h
+++ b/indra/llui/llcombobox.h
@@ -204,7 +204,8 @@ class LLComboBox
 
 	void			setButtonVisible(BOOL visible);
 
-	void			onButtonDown();
+	void			onButtonMouseDown();
+	void			onListMouseUp();
 	void			onItemSelected(const LLSD& data);
 	void			onTextCommit(const LLSD& data);
 
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index d5293bdbb51..8af65b25e98 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -106,6 +106,7 @@
   <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
   <texture name="DropDown_Selected" file_name="widgets/DropDown_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
   <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+  <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
 
   <texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" />
 
diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml
index 5bb48ef5aa2..6b11e722474 100644
--- a/indra/newview/skins/default/xui/en/widgets/button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/button.xml
@@ -1,4 +1,8 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Additional attributes:
+  image_pressed
+	image_pressed_selected
+   -->
 <button image_unselected="PushButton_Off"
         image_selected="PushButton_Selected"
         image_disabled_selected="PushButton_Selected_Disabled"
diff --git a/indra/newview/skins/default/xui/en/widgets/combo_box.xml b/indra/newview/skins/default/xui/en/widgets/combo_box.xml
index fa3cb9275ec..132bd24bcae 100644
--- a/indra/newview/skins/default/xui/en/widgets/combo_box.xml
+++ b/indra/newview/skins/default/xui/en/widgets/combo_box.xml
@@ -16,7 +16,9 @@
                               scale_image="true"
                               pad_right="24"
                               image_unselected="DropDown_Off"
-                              image_selected="DropDown_Selected"
+                              image_selected="DropDown_On"
+                              image_pressed="DropDown_Press" 
+                              image_pressed_selected="DropDown_Press"
                               image_disabled="DropDown_Disabled" />
   <combo_box.combo_list bg_writeable_color="MenuDefaultBgColor"
                         background_visible="true"
-- 
GitLab


From 9d6816a61302bddfe63284c141391c6580d8ea38 Mon Sep 17 00:00:00 2001
From: Ramzi Linden <ramzi@lindenlab.com>
Date: Tue, 17 Nov 2009 04:54:47 +0800
Subject: [PATCH 324/557] DEV-42911 Remove the Tier3 localized languages which
 we cannot support in the 2.0 release.

---
 .../xui/en/panel_preferences_general.xml      | 36 ++++---------------
 1 file changed, 6 insertions(+), 30 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
index a6ca73d4b7f..6bb937e3c64 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -66,11 +66,7 @@
          label="Italiano (Italian) - Beta"
          name="Italian"
          value="it" />
-        <combo_box.item
-         enabled="true"
-         label="Magyar (Hungarian) - Beta"
-         name="Hungarian"
-         value="hu" />
+
         <combo_box.item
          enabled="true"
          label="Nederlands (Dutch) - Beta"
@@ -86,36 +82,16 @@
          label="Portugués (Portuguese) - Beta"
          name="Portugese"
          value="pt" />
-        <combo_box.item
-         enabled="true"
-         label="Русский (Russian) - Beta"
-         name="Russian"
-         value="ru" />
-        <combo_box.item
-         enabled="true"
-         label="Türkçe (Turkish) - Beta"
-         name="Turkish"
-         value="tr" />
-        <combo_box.item
-         enabled="true"
-         label="Українська (Ukrainian) - Beta"
-         name="Ukrainian"
-         value="uk" />
-        <combo_box.item
-         enabled="true"
-         label="中文 (简体) (Chinese) - Beta"
-         name="Chinese"
-         value="zh" />
+
+
+
+
         <combo_box.item
          enabled="true"
          label="日本語 (Japanese) - Beta"
          name="(Japanese)"
          value="ja" />
-        <combo_box.item
-         enabled="true"
-         label="한국어 (Korean) - Beta"
-         name="(Korean)"
-         value="ko" />
+
         <combo_box.item
          enabled="true"
          label="Test Language"
-- 
GitLab


From 4b80c9978c48b6a9eaac2ed358e81cf06f3e2cb5 Mon Sep 17 00:00:00 2001
From: Vadim Savchuk <vsavchuk@productengine.com>
Date: Mon, 16 Nov 2009 23:17:24 +0200
Subject: [PATCH 325/557] Fixed Stand / Stop flying buttons (EXT-2408,
 EXT-2467, EXT-2513). The buttons are now attached to the movement controls
 floater while it's visible (EXT-984).

--HG--
branch : product-engine
---
 indra/newview/llmoveview.cpp     | 115 +++++++++++++++----------------
 indra/newview/llmoveview.h       |  35 +++++++++-
 indra/newview/llviewerwindow.cpp |   2 -
 3 files changed, 89 insertions(+), 63 deletions(-)

diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp
index e3ba1b8e4ad..0ee883e221a 100644
--- a/indra/newview/llmoveview.cpp
+++ b/indra/newview/llmoveview.cpp
@@ -83,6 +83,11 @@ LLFloaterMove::LLFloaterMove(const LLSD& key)
 {
 }
 
+LLFloaterMove::~LLFloaterMove()
+{
+	LLPanelStandStopFlying::getInstance()->reparent(NULL);
+}
+
 // virtual
 BOOL LLFloaterMove::postBuild()
 {
@@ -425,42 +430,15 @@ void LLFloaterMove::showModeButtons(BOOL bShow)
 		return;
 	mModeActionsPanel->setVisible(bShow);
 
-	if (isDocked())
-	{
-		return;
-	}
-
-	updateHeight(bShow);
-}
-
-void LLFloaterMove::updateHeight(bool show_mode_buttons)
-{
-	static bool size_changed = false;
-	static S32 origin_height = getRect().getHeight();
-	LLRect rect = getRect();
-
-	static S32 mode_panel_height = mModeActionsPanel->getRect().getHeight();
-
-	S32 newHeight = getRect().getHeight();
-
-	if (!show_mode_buttons && origin_height == newHeight)
-	{
-		newHeight -= mode_panel_height;
-		size_changed = true;
-	}
-	else if (show_mode_buttons && origin_height > newHeight)
+	if (bShow)
+		LLPanelStandStopFlying::getInstance()->reparent(NULL);
+	else
 	{
-		newHeight += mode_panel_height;
-		size_changed = true;
+		LLPanelStandStopFlying* ssf_panel = LLPanelStandStopFlying::getInstance();
+		ssf_panel->reparent(this);
+		const LLRect& mode_actions_rect = mModeActionsPanel->getRect();
+		ssf_panel->setOrigin(mode_actions_rect.mLeft, mode_actions_rect.mBottom);
 	}
-
-	if (!size_changed)
-		return;
-
-	rect.setLeftTopAndSize(rect.mLeft, rect.mTop, rect.getWidth(), newHeight);
-	reshape(rect.getWidth(), rect.getHeight());
-	setRect(rect);
-	size_changed = false;
 }
 
 //static
@@ -504,14 +482,6 @@ void LLFloaterMove::onOpen(const LLSD& key)
 //virtual
 void LLFloaterMove::setDocked(bool docked, bool pop_on_undock/* = true*/)
 {
-	LLDockableFloater::setDocked(docked, pop_on_undock);
-	bool show_mode_buttons = isDocked() || !gAgent.getFlying();
-
-	if (!isMinimized())
-	{
-		updateHeight(show_mode_buttons);
-	}
-
 	LLTransientDockableFloater::setDocked(docked, pop_on_undock);
 }
 
@@ -535,7 +505,8 @@ void LLFloaterMove::setModeButtonToggleState(const EMovementMode mode)
 /************************************************************************/
 LLPanelStandStopFlying::LLPanelStandStopFlying() :
 	mStandButton(NULL),
-	mStopFlyingButton(NULL)
+	mStopFlyingButton(NULL),
+	mAttached(false)
 {
 	// make sure we have the only instance of this class
 	static bool b = true;
@@ -624,6 +595,45 @@ BOOL LLPanelStandStopFlying::handleToolTip(S32 x, S32 y, MASK mask)
 	return TRUE;
 }
 
+void LLPanelStandStopFlying::reparent(LLFloaterMove* move_view)
+{
+	LLPanel* parent = dynamic_cast<LLPanel*>(getParent());
+	if (!parent)
+	{
+		llwarns << "Stand/stop flying panel parent is unset" << llendl;
+		return;
+	}
+
+	if (move_view != NULL)
+	{
+		llassert(move_view != parent); // sanity check
+	
+		// Save our original container.
+		if (!mOriginalParent.get())
+			mOriginalParent = parent->getHandle();
+
+		// Attach to movement controls.
+		parent->removeChild(this);
+		move_view->addChild(this);
+		// Origin must be set by movement controls.
+		mAttached = true;
+	}
+	else
+	{
+		if (!mOriginalParent.get())
+		{
+			llwarns << "Original parent of the stand / stop flying panel not found" << llendl;
+			return;
+		}
+
+		// Detach from movement controls. 
+		parent->removeChild(this);
+		mOriginalParent.get()->addChild(this);
+		mAttached = false;
+		updatePosition(); // don't defer until next draw() to avoid flicker
+	}
+}
+
 //////////////////////////////////////////////////////////////////////////
 // Private Section
 //////////////////////////////////////////////////////////////////////////
@@ -668,27 +678,14 @@ void LLPanelStandStopFlying::onStopFlyingButtonClick()
  */
 void LLPanelStandStopFlying::updatePosition()
 {
-
 	LLBottomTray* tray = LLBottomTray::getInstance();
-	if (!tray) return;
+	if (!tray || mAttached) return;
 
 	LLButton* movement_btn = tray->getChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME);
 
-	//align centers of a button and a floater
+	// Align centers of the button and the panel.
 	S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2;
-
-	S32 y = 0;
-
-	LLFloater *move_floater = LLFloaterReg::findInstance("moveview");
-	if (move_floater)
-	{
-		if (move_floater->isDocked())
-		{
-			y = move_floater->getRect().mBottom + getRect().getHeight();
-		}
-	}
-
-	setOrigin(x, y);
+	setOrigin(x, 0);
 }
 
 
diff --git a/indra/newview/llmoveview.h b/indra/newview/llmoveview.h
index cee6078ee99..2664fe6e401 100644
--- a/indra/newview/llmoveview.h
+++ b/indra/newview/llmoveview.h
@@ -46,11 +46,12 @@ class LLJoystickAgentSlide;
 class LLFloaterMove
 :	public LLTransientDockableFloater
 {
+	LOG_CLASS(LLFloaterMove);
 	friend class LLFloaterReg;
 
 private:
 	LLFloaterMove(const LLSD& key);
-	~LLFloaterMove() {}
+	~LLFloaterMove();
 public:
 
 	/*virtual*/	BOOL	postBuild();
@@ -96,7 +97,6 @@ class LLFloaterMove
 	void updateButtonsWithMovementMode(const EMovementMode newMode);
 	void updatePosition();
 	void showModeButtons(BOOL bShow);
-	void updateHeight(bool show_mode_buttons);
 
 public:
 
@@ -126,6 +126,7 @@ class LLFloaterMove
  */
 class LLPanelStandStopFlying : public LLPanel
 {
+	LOG_CLASS(LLPanelStandStopFlying);
 public:
 	typedef enum stand_stop_flying_mode_t
 	{
@@ -133,6 +134,19 @@ class LLPanelStandStopFlying : public LLPanel
 		SSFM_STOP_FLYING
 	} EStandStopFlyingMode;
 
+	/**
+	 * Attach or detach the panel to/from the movement controls floater.
+	 * 
+	 * Called when the floater gets opened/closed, user sits, stands up or starts/stops flying.
+	 * 
+	 * @param move_view The floater to attach to (not always accessible via floater registry).
+	 *        If NULL is passed, the panel gets reparented to its original container.
+	 *
+	 * @see mAttached
+	 * @see mOriginalParent 
+	 */
+	void reparent(LLFloaterMove* move_view);
+
 	static LLPanelStandStopFlying* getInstance();
 	static void setStandStopFlyingMode(EStandStopFlyingMode mode);
 	static void clearStandStopFlyingMode(EStandStopFlyingMode mode);
@@ -157,6 +171,23 @@ class LLPanelStandStopFlying : public LLPanel
 
 	LLButton* mStandButton;
 	LLButton* mStopFlyingButton;
+
+	/**
+	 * The original parent of the panel.
+	 *  
+	 * Makes it possible to move (reparent) the panel to the movement controls floater and back.
+	 * 
+	 * @see reparent()
+	 */
+	LLHandle<LLPanel> mOriginalParent;
+
+	/**
+	 * True if the panel is currently attached to the movement controls floater.
+	 * 
+	 * @see reparent()
+	 * @see updatePosition()
+	 */
+	bool	mAttached;
 };
 
 
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 90a79698f6f..48f0f7516fd 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1566,8 +1566,6 @@ void LLViewerWindow::initWorldUI()
 
 	LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("stand_stop_flying_container");
 	LLPanelStandStopFlying* panel_stand_stop_flying	= LLPanelStandStopFlying::getInstance();
-	panel_stand_stop_flying->setShape(panel_ssf_container->getLocalRect());
-	panel_stand_stop_flying->setFollowsAll();
 	panel_ssf_container->addChild(panel_stand_stop_flying);
 	panel_ssf_container->setVisible(TRUE);
 
-- 
GitLab


From 19267a29c91b4b7e800df1a62af2e77a8d6b9214 Mon Sep 17 00:00:00 2001
From: "Eric M. Tulla (BigPapi)" <tulla@lindenlab.com>
Date: Mon, 16 Nov 2009 16:22:35 -0500
Subject: [PATCH 326/557] EXT-491 - Renaming item expanded all closed folders

---
 indra/newview/llfolderview.cpp | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 21458f83cdb..4192c6a5862 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -909,11 +909,7 @@ void LLFolderView::finishRenamingItem( void )
 		mRenameItem->rename( mRenamer->getText() );
 	}
 
-	mRenamer->setCommitOnFocusLost( FALSE );
-	mRenamer->setFocus( FALSE );
-	mRenamer->setVisible( FALSE );
-	mRenamer->setCommitOnFocusLost( TRUE );
-	gFocusMgr.setTopCtrl( NULL );
+	gFocusMgr.setTopCtrl( NULL );	
 
 	if( mRenameItem )
 	{
-- 
GitLab


From e3236a906d01e95432990aa436121b19cf994301 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Mon, 16 Nov 2009 13:47:54 -0800
Subject: [PATCH 327/557] EXT-2512 Turned off Hover Glow Objects by default.
 Should resolve EXT-2499 EXT-2522 EXT-2514 Consider turning back on for Viewer
 2.1 and tuning.

---
 indra/newview/app_settings/settings.xml            | 4 ++--
 indra/newview/lltoolpie.cpp                        | 2 +-
 indra/newview/skins/default/xui/en/menu_viewer.xml | 4 ++--
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 48ba71f446d..f2193c4139e 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -6304,7 +6304,7 @@
     <real>1.0</real>
   </map>
 
-  <key>RenderHighlightEnable</key>
+  <key>RenderHoverGlowEnable</key>
   <map>
     <key>Comment</key>
     <string>Show glow effect when hovering on interactive objects.</string>
@@ -6313,7 +6313,7 @@
     <key>Type</key>
     <string>Boolean</string>
     <key>Value</key>
-    <integer>1</integer>
+    <integer>0</integer>
   </map>
 
   <key>RenderHighlightFadeTime</key>
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index d49ea5109dd..9c8fca35528 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -526,7 +526,7 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
 	}
 
 	static LLCachedControl<bool> enable_highlight(
-		gSavedSettings, "RenderHighlightEnable", false);
+		gSavedSettings, "RenderHoverGlowEnable", false);
 	LLDrawable* drawable = NULL;
 	if (enable_highlight && show_highlight && object)
 	{
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index e98a6d57bbb..181994a1bdc 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -2572,10 +2572,10 @@
              name="Hover Glow Objects">
                 <menu_item_check.on_check
                  function="CheckControl"
-                 parameter="RenderHighlightEnable" />
+                 parameter="RenderHoverGlowEnable" />
                 <menu_item_check.on_click
                  function="ToggleControl"
-                 parameter="RenderHighlightEnable" />
+                 parameter="RenderHoverGlowEnable" />
             </menu_item_check>
         </menu>
 
-- 
GitLab


From d19d581b485bf314d7a97e1348a77bad8835db77 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Mon, 16 Nov 2009 13:48:50 -0800
Subject: [PATCH 328/557] Fix a logic error in the code to hide the initial
 about:blank navigate that caused DEV-42093 to recur.

---
 .../media_plugins/webkit/media_plugin_webkit.cpp  | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index 1e79720f43f..09348782a45 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -296,7 +296,7 @@ class MediaPluginWebKit :
 	// virtual
 	void onNavigateBegin(const EventType& event)
 	{
-		if(mInitState > INIT_STATE_NAVIGATE_COMPLETE)
+		if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
 		{
 			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");
 			message.setValue("uri", event.getEventUri());
@@ -304,7 +304,8 @@ class MediaPluginWebKit :
 		
 			setStatus(STATUS_LOADING);
 		}
-		else if(mInitState == INIT_STATE_NAVIGATE_COMPLETE)
+
+		if(mInitState == INIT_STATE_NAVIGATE_COMPLETE)
 		{
 			mInitState = INIT_STATE_WAIT_REDRAW;
 		}
@@ -315,7 +316,7 @@ class MediaPluginWebKit :
 	// virtual
 	void onNavigateComplete(const EventType& event)
 	{
-		if(mInitState > INIT_STATE_NAVIGATE_COMPLETE)
+		if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
 		{
 			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete");
 			message.setValue("uri", event.getEventUri());
@@ -338,7 +339,7 @@ class MediaPluginWebKit :
 	// virtual
 	void onUpdateProgress(const EventType& event)
 	{
-		if(mInitState > INIT_STATE_NAVIGATE_COMPLETE)
+		if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
 		{
 			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "progress");
 			message.setValueS32("percent", event.getIntValue());
@@ -350,7 +351,7 @@ class MediaPluginWebKit :
 	// virtual
 	void onStatusTextChange(const EventType& event)
 	{
-		if(mInitState > INIT_STATE_NAVIGATE_COMPLETE)
+		if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
 		{
 			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "status_text");
 			message.setValue("status", event.getStringValue());
@@ -362,7 +363,7 @@ class MediaPluginWebKit :
 	// virtual
 	void onTitleChange(const EventType& event)
 	{
-		if(mInitState > INIT_STATE_NAVIGATE_COMPLETE)
+		if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
 		{
 			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text");
 			message.setValue("name", event.getStringValue());
@@ -374,7 +375,7 @@ class MediaPluginWebKit :
 	// virtual
 	void onLocationChange(const EventType& event)
 	{
-		if(mInitState > INIT_STATE_NAVIGATE_COMPLETE)
+		if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
 		{
 			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "location_changed");
 			message.setValue("uri", event.getEventUri());
-- 
GitLab


From f1da0a4ff4e6de98422f0b4534034120bec558b7 Mon Sep 17 00:00:00 2001
From: Leyla Farazha <leyla@lindenlab.com>
Date: Mon, 16 Nov 2009 13:55:51 -0800
Subject: [PATCH 329/557] EXT-1478   	 Tool-tip background and border colors
 are being ignored - hooked up xml EXT-2237   	 Preferences > Alerts shows
 "$ignoretext" in the list EXT-1582   	 The current edit coordinates are
 displaced from their background EXT-1466   	 Change Mouselook text "Press
 ESC to return to World View" to match stylesheet reviewed by James

---
 indra/newview/llmanip.cpp                                | 7 ++++---
 indra/newview/llviewerwindow.cpp                         | 2 +-
 indra/newview/skins/default/xui/en/notifications.xml     | 7 ++++---
 indra/newview/skins/default/xui/en/widgets/inspector.xml | 3 ++-
 indra/newview/skins/default/xui/en/widgets/tool_tip.xml  | 3 ++-
 5 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp
index fa1dbe06034..9ca207a579f 100644
--- a/indra/newview/llmanip.cpp
+++ b/indra/newview/llmanip.cpp
@@ -429,9 +429,10 @@ void LLManip::renderXYZ(const LLVector3 &vec)
 	const S32 PAD = 10;
 	std::string feedback_string;
 	LLVector3 camera_pos = LLViewerCamera::getInstance()->getOrigin() + LLViewerCamera::getInstance()->getAtAxis();
-	S32 vertical_offset = gViewerWindow->getWindowHeightScaled() / 2 - VERTICAL_OFFSET;
-	S32 window_center_x = gViewerWindow->getWindowWidthScaled() / 2;
-	S32 window_center_y = gViewerWindow->getWindowHeightScaled() / 2;
+	S32 window_center_x = gViewerWindow->getWorldViewRectScaled().getWidth() / 2;
+	S32 window_center_y = gViewerWindow->getWorldViewRectScaled().getHeight() / 2;
+	S32 vertical_offset = window_center_y - VERTICAL_OFFSET;
+
 
 	glPushMatrix();
 	{
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 1054223dcf1..0c5d813f456 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -4129,7 +4129,7 @@ void LLViewerWindow::drawMouselookInstructions()
 {
 	// Draw instructions for mouselook ("Press ESC to return to World View" partially transparent at the bottom of the screen.)
 	const std::string instructions = LLTrans::getString("LeaveMouselook");
-	const LLFontGL* font = LLFontGL::getFont(LLFontDescriptor("SansSerif", "Huge", LLFontGL::BOLD));
+	const LLFontGL* font = LLFontGL::getFont(LLFontDescriptor("SansSerif", "Large", LLFontGL::BOLD));
 	
 	//to be on top of Bottom bar when it is opened
 	const S32 INSTRUCTIONS_PAD = 50;
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index ff0cd7ffebe..d6e1c5edc50 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -581,9 +581,10 @@ Multiple faces are currently selected.
 If you continue this action, separate instances of media will be set on multiple faces of the object.
 To place the media on only one face, choose Select Texture and click on the desired face of that object then click Add.
     <usetemplate
-	 name="okcancelignore"
-     notext="Cancel"
-     yestext="OK"/>
+      ignoretext="Media will be set on multiple selected faces"
+      name="okcancelignore"
+      notext="Cancel"
+      yestext="OK"/>
   </notification>
 
   <notification
diff --git a/indra/newview/skins/default/xui/en/widgets/inspector.xml b/indra/newview/skins/default/xui/en/widgets/inspector.xml
index 61950d7554e..f631ef3957c 100644
--- a/indra/newview/skins/default/xui/en/widgets/inspector.xml
+++ b/indra/newview/skins/default/xui/en/widgets/inspector.xml
@@ -1,8 +1,9 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <!-- See also settings.xml UIFloater* settings for configuration -->
 <inspector name="inspector"
-          bg_opaque_color="ToolTipBgColor"
+          bg_opaque_color="DkGray_66"
           background_visible="true"
           bg_opaque_image="none"
+          background_opaque="true"
           bg_alpha_image="none"
  />
diff --git a/indra/newview/skins/default/xui/en/widgets/tool_tip.xml b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml
index 6b49f832fd7..c209c26c923 100644
--- a/indra/newview/skins/default/xui/en/widgets/tool_tip.xml
+++ b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml
@@ -5,6 +5,7 @@
           padding="4"
           wrap="true"
           font="SansSerif"
-          bg_opaque_color="ToolTipBgColor"
+          bg_opaque_image="Tooltip"
+          background_opaque="true"
           background_visible="true"
  />
-- 
GitLab


From 6098706ae532131a4df890988dc209961ff52a33 Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Mon, 16 Nov 2009 17:24:05 -0500
Subject: [PATCH 330/557] EXT-2445 appearance editor doesn't show correct
 previews

This system is in dire need of a rewrite, but the bug reported is fairly simple.
The visual params in the avatar are no longer authoritative, the real values are
stored in the wearable itself. The appearance editor was manipulating the values
in the avatar object, resulting in no change. Updated the preview windows to use
the parameter objects stored in the wearable.

Code reviewed by Bigpapi

--HG--
branch : avatar-pipeline
---
 indra/newview/llscrollingpanelparam.cpp | 4 ++--
 indra/newview/lltoolmorph.cpp           | 6 +++---
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp
index 1fbaeb94f53..b5e55df1f59 100644
--- a/indra/newview/llscrollingpanelparam.cpp
+++ b/indra/newview/llscrollingpanelparam.cpp
@@ -73,9 +73,9 @@ LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_param
 	F32 min_weight = param->getMinWeight();
 	F32 max_weight = param->getMaxWeight();
 
-	mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, param,  min_weight);
+	mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()),  min_weight);
 	pos_x += PARAM_HINT_WIDTH + 3 * BTN_BORDER;
-	mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, param, max_weight );
+	mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), max_weight );
 	
 	mHintMin->setAllowsUpdates( FALSE );
 	mHintMax->setAllowsUpdates( FALSE );
diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp
index d7d7b5f44b0..14524580bf7 100644
--- a/indra/newview/lltoolmorph.cpp
+++ b/indra/newview/lltoolmorph.cpp
@@ -146,8 +146,8 @@ void LLVisualParamHint::preRender(BOOL clear_depth)
 {
 	LLVOAvatarSelf* avatarp = gAgent.getAvatarObject();
 
-	mLastParamWeight = avatarp->getVisualParamWeight(mVisualParam);
-	avatarp->setVisualParamWeight(mVisualParam, mVisualParamWeight);
+	mLastParamWeight = mVisualParam->getWeight();
+	mVisualParam->setWeight(mVisualParamWeight, FALSE);
 	avatarp->setVisualParamWeight("Blink_Left", 0.f);
 	avatarp->setVisualParamWeight("Blink_Right", 0.f);
 	avatarp->updateComposites();
@@ -242,7 +242,7 @@ BOOL LLVisualParamHint::render()
 		gGL.setSceneBlendType(LLRender::BT_ALPHA);
 		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
 	}
-	avatarp->setVisualParamWeight(mVisualParam, mLastParamWeight);
+	mVisualParam->setWeight(mLastParamWeight, FALSE);
 	gGL.color4f(1,1,1,1);
 	mGLTexturep->setGLTextureCreated(true);
 	return TRUE;
-- 
GitLab


From 12c29e745faec05df678ac7f7f1f2fc76b9512b9 Mon Sep 17 00:00:00 2001
From: Lis Pardi <lis@lindenlab.com>
Date: Mon, 16 Nov 2009 17:48:26 -0500
Subject: [PATCH 331/557] ext-1639 removed Use Fullscreen checkbox from
 panel_preferences_graphics1.xml

---
 .../xui/en/panel_preferences_graphics1.xml    | 75 +------------------
 1 file changed, 1 insertion(+), 74 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index 9b10edde339..ec25d117f0a 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -16,81 +16,8 @@
      height="12"
      layout="topleft"
      left="30"
-     name="WindowSizeLabel"
-     top="10"
-     width="300">
-        Window size:
-    </text>
-    <check_box
-     control_name="WindowFullScreen"
-     height="16"
-     label="Use fullscreen"
-     layout="topleft"
-     left_delta="50"
-     name="windowed mode"
-     top_pad="4"
-     width="175">
-    </check_box>
-	<combo_box
-	 visiblity_control="WindowFullScreen"
-	 allow_text_entry="false"
-	 enabled="true"
-	 layout="topleft"
-	 height="18"
-	 left_delta="220"
-	 max_chars="20"
-	 mouse_opaque="true"
-	 name="windowsize combo"
-	 top_delta="-1"
-	 width="150">
-		<combo_box.item
-		 type="string"
-	     length="1"
-	     enabled="true"
-	     name="640x480"
-	     value="640 x 480"
-	     label="640x480"/>
-	    <combo_box.item
-	     type="string"
-	     length="1"
-	     enabled="true"
-	     name="800x600"
-	     value="800 x 600"
-	     label="800x600"/>
-	    <combo_box.item
-	     type="string"
-	     length="1"
-	     enabled="true"
-	     name="720x480"
-	     value="720 x 480"
-	     label="720x480 (NTSC)"/>
-	    <combo_box.item
-	     type="string"
-	     length="1"
-	     enabled="true"
-	     name="768x576"
-	     value="768 x 576"
-	     label="768x576 (PAL)"/>
-	    <combo_box.item
-	     type="string"
-	     length="1"
-	     enabled="true"
-	     name="1024x768"
-	     value="1024 x 768"
-	     label="1024x768"/>
-	    <combo_box.commit_callback
-	     function="Pref.setControlFalse"
-	     parameter="FullScreenAutoDetectAspectRatio" />
- 	</combo_box>
-	<text
-     type="string"
-     length="1"
-     follows="left|top"
-     height="12"
-     layout="topleft"
-     left="30"
      name="UI Size:"
-     top_pad="4"
+     top="10"
      width="300">
         UI size:
     </text>
-- 
GitLab


From 4110307f28b0210311179b15bc4e85de3bdfbce0 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Mon, 16 Nov 2009 17:49:11 -0500
Subject: [PATCH 332/557] EXT-2527 : Allow contents of Appearance panel to be
 expandable

Changed the InventoryFilter logic slightly, so that if it's filtering by categories, it allows the contents of those categories to pass.

--HG--
branch : avatar-pipeline
---
 indra/newview/llinventoryfilter.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index 7ec8d3d0034..3e4b3327db5 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -108,6 +108,10 @@ BOOL LLInventoryFilter::check(LLFolderViewItem* item)
 				passed_type |= ((1LL << cat->getPreferredType() & mFilterOps.mFilterTypes) != U64(0));
 			}
 		}
+		else
+		{
+			passed_type = TRUE;
+		}
 	}
 	else
 	{
-- 
GitLab


From faef48504c6f07fc143f664271fa5cc2e1071cc4 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Mon, 16 Nov 2009 17:52:15 -0500
Subject: [PATCH 333/557] EXT-2526 : Disable "double click to wear" on outfit
 folders EXT-1763 : Places - Landmarks : Unable to drop a landmark into
 Landamrks & FavoriteBar accordian panels

Threefixes in here.
(1) Simple disable of double-click.
(2) Corrected typos "hierary"-> "hierarchy".
(3) Now adding start folder to specialized inventory panels, so that we get the start folder's listener for drag&drop operations.

--HG--
branch : avatar-pipeline
---
 indra/newview/llfolderviewitem.cpp |  16 ++--
 indra/newview/llfolderviewitem.h   |   8 +-
 indra/newview/llinventorypanel.cpp | 142 ++++++++++++++---------------
 3 files changed, 83 insertions(+), 83 deletions(-)

diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index d39a17ca3b2..bf74c5c936a 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -133,8 +133,8 @@ LLFolderViewItem::LLFolderViewItem(LLFolderViewItem::Params p)
 	mIconOpen(p.icon_open),
 	mListener(p.listener),
 	mArrowImage(p.folder_arrow_image),
-	mBoxImage(p.selection_image)
-,	mDontShowInHierarhy(false)
+	mBoxImage(p.selection_image),
+	mDontShowInHierarchy(false)
 {
 	refresh();
 }
@@ -411,7 +411,7 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)
 
 S32 LLFolderViewItem::getItemHeight()
 {
-	if (mDontShowInHierarhy) return 0;
+	if (mDontShowInHierarchy) return 0;
 
 	S32 icon_height = mIcon->getHeight();
 	S32 label_height = llround(getLabelFontForStyle(mLabelStyle)->getLineHeight());
@@ -819,7 +819,7 @@ BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
 
 void LLFolderViewItem::draw()
 {
-	if (mDontShowInHierarhy) return;
+	if (mDontShowInHierarchy) return;
 
 	static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
 	static LLUIColor sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE);
@@ -995,14 +995,14 @@ void LLFolderViewItem::draw()
 				S32 right = left + font->getWidth(combined_string, mStringMatchOffset, filter_string_length) + 2;
 				S32 bottom = llfloor(getRect().getHeight() - font->getLineHeight() - 3);
 				S32 top = getRect().getHeight();
-
+				
 				LLRect box_rect(left, top, right, bottom);
 				sBoxImage->draw(box_rect, sFilterBGColor);
 				F32 match_string_left = text_left + font->getWidthF32(combined_string, 0, mStringMatchOffset);
 				F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD;
 				font->renderUTF8( combined_string, mStringMatchOffset, match_string_left, y,
-						   sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
-					filter_string_length, S32_MAX, &right_x, FALSE );
+								  sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
+								  filter_string_length, S32_MAX, &right_x, FALSE );
 			}
 		}
 	}
@@ -2166,6 +2166,7 @@ BOOL LLFolderViewFolder::handleMouseDown( S32 x, S32 y, MASK mask )
 
 BOOL LLFolderViewFolder::handleDoubleClick( S32 x, S32 y, MASK mask )
 {
+	/* Disable outfit double click to wear
 	const LLUUID &cat_uuid = getListener()->getUUID();
 	const LLViewerInventoryCategory *cat = gInventory.getCategory(cat_uuid);
 	if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT)
@@ -2173,6 +2174,7 @@ BOOL LLFolderViewFolder::handleDoubleClick( S32 x, S32 y, MASK mask )
 		getListener()->performAction(NULL, NULL,"replaceoutfit");
 		return TRUE;
 	}
+	*/
 
 	BOOL handled = FALSE;
 	if( mIsOpen )
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index 7c429fc76ef..30387812a66 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -158,7 +158,7 @@ class LLFolderViewItem : public LLView
 	LLUIImagePtr				mBoxImage;
 	BOOL                            mIsLoading;
 	LLTimer                         mTimeSinceRequestStart;
-	bool						mDontShowInHierarhy;
+	bool						mDontShowInHierarchy;
 
 	// helper function to change the selection from the root.
 	void changeSelectionFromRoot(LLFolderViewItem* selection, BOOL selected);
@@ -201,8 +201,8 @@ class LLFolderViewItem : public LLView
 	// makes sure that this view and it's children are the right size.
 	virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
 	virtual S32 getItemHeight();
-	void setDontShowInHierarchy(bool dont_show) { mDontShowInHierarhy = dont_show; }
-	bool getDontShowInHierarchy() { return mDontShowInHierarhy; }
+	void setDontShowInHierarchy(bool dont_show) { mDontShowInHierarchy = dont_show; }
+	bool getDontShowInHierarchy() { return mDontShowInHierarchy; }
 
 	// applies filters to control visibility of inventory items
 	virtual void filter( LLInventoryFilter& filter);
@@ -343,7 +343,7 @@ typedef bool (*sort_order_f)(LLFolderViewItem* a, LLFolderViewItem* b);
 //
 // An instance of an LLFolderViewFolder represents a collection of
 // more folders and items. This is used to build the hierarchy of
-// items found in the folder view. :)
+// items found in the folder view.
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 class LLFolderViewFolder : public LLFolderViewItem
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index c113b9f0d02..7b7090d10d9 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -406,88 +406,86 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
 {
 	LLMemType mt(LLMemType::MTYPE_INVENTORY_BUILD_NEW_VIEWS);
 	LLFolderViewItem* itemp = NULL;
-	LLInventoryObject* objectp = NULL;
-
-	// Don't add the start folder (the inventory panel will show contents
-	// beginning with the children of the starting folder, excluding the starting folder itself).
-	if (id != mStartFolderID)
+	LLInventoryObject* objectp = gInventory.getObject(id);
+	if (objectp)
 	{
-		objectp = gInventory.getObject(id);
-		if (objectp)
-		{		
-			const LLUUID &parent_id = objectp->getParentUUID();
-			// If this item's parent is the starting folder, then just add it to the top level (recall that 
-			// the starting folder isn't actually represented in the view, parent_folder would be NULL in
-			// this case otherwise).
-			LLFolderViewFolder* parent_folder = (parent_id == mStartFolderID ?
-				mFolders : (LLFolderViewFolder*)mFolders->getItemByID(parent_id));
-
+		const LLUUID &parent_id = objectp->getParentUUID();
+		LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)mFolders->getItemByID(parent_id);
+		if (id == mStartFolderID)
+			parent_folder = mFolders;
+		
+		if (!parent_folder)
+		{
 			// This item exists outside the inventory's hierarchy, so don't add it.
-			if (!parent_folder)
-			{
-				return;
-			}
-
-			if (objectp->getType() <= LLAssetType::AT_NONE ||
-				objectp->getType() >= LLAssetType::AT_COUNT)
-			{
-				llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " << 
-					((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID() << llendl;
-				return;
-			}
+			return;
+		}
+		
+		if (objectp->getType() <= LLAssetType::AT_NONE ||
+			objectp->getType() >= LLAssetType::AT_COUNT)
+		{
+			llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " << 
+				((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID() << llendl;
+			return;
+		}
+		
+		if (objectp->getType() == LLAssetType::AT_CATEGORY &&
+			objectp->getActualType() != LLAssetType::AT_LINK_FOLDER) 
+		{
+			LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(),
+																			objectp->getType(),
+																			LLInventoryType::IT_CATEGORY,
+																			this,
+																			objectp->getUUID());
 			
-			if (objectp->getType() == LLAssetType::AT_CATEGORY &&
-					 objectp->getActualType() != LLAssetType::AT_LINK_FOLDER) 
+			if (new_listener)
 			{
-				LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(),
-																				objectp->getType(),
-																				LLInventoryType::IT_CATEGORY,
-																				this,
-																				objectp->getUUID());
-
-				if (new_listener)
+				LLFolderViewFolder::Params p;
+				p.name = new_listener->getDisplayName();
+				p.icon = new_listener->getIcon();
+				p.root = mFolders;
+				p.listener = new_listener;
+				p.tool_tip = p.name;
+				LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(p);
+				folderp->setItemSortOrder(mFolders->getSortOrder());
+				itemp = folderp;
+
+				// Hide the root folder, so we can show the contents of a folder
+				// flat but still have the parent folder present for listener-related
+				// operations.
+				if (id == mStartFolderID)
 				{
-					LLFolderViewFolder::Params p;
-					p.name = new_listener->getDisplayName();
-					p.icon = new_listener->getIcon();
-					p.root = mFolders;
-					p.listener = new_listener;
-					p.tool_tip = p.name;
-					LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(p);
-				
-					folderp->setItemSortOrder(mFolders->getSortOrder());
-					itemp = folderp;
+					folderp->setDontShowInHierarchy(TRUE);
 				}
 			}
-			else 
+		}
+		else 
+		{
+			// Build new view for item
+			LLInventoryItem* item = (LLInventoryItem*)objectp;
+			LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(item->getType(),
+																			item->getActualType(),
+																			item->getInventoryType(),
+																			this,
+																			item->getUUID(),
+																			item->getFlags());
+
+			if (new_listener)
 			{
-				// Build new view for item
-				LLInventoryItem* item = (LLInventoryItem*)objectp;
-				LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(item->getType(),
-																				item->getActualType(),
-																				item->getInventoryType(),
-																				this,
-																				item->getUUID(),
-																				item->getFlags());
-
-				if (new_listener)
-				{
-					LLFolderViewItem::Params params;
-					params.name(new_listener->getDisplayName());
-					params.icon(new_listener->getIcon());
-					params.creation_date(new_listener->getCreationDate());
-					params.root(mFolders);
-					params.listener(new_listener);
-					params.rect(LLRect (0, 0, 0, 0));
-					params.tool_tip = params.name;
-					itemp = LLUICtrlFactory::create<LLFolderViewItem> (params);
-				}
+				LLFolderViewItem::Params params;
+				params.name(new_listener->getDisplayName());
+				params.icon(new_listener->getIcon());
+				params.creation_date(new_listener->getCreationDate());
+				params.root(mFolders);
+				params.listener(new_listener);
+				params.rect(LLRect (0, 0, 0, 0));
+				params.tool_tip = params.name;
+				itemp = LLUICtrlFactory::create<LLFolderViewItem> (params);
 			}
+		}
 
-			if (itemp)
-			{
-				itemp->addToFolder(parent_folder, mFolders);
-			}
+		if (itemp)
+		{
+			itemp->addToFolder(parent_folder, mFolders);
 		}
 	}
 
-- 
GitLab


From 22813613ab774f08e9e2f109b7c4b00821934ca0 Mon Sep 17 00:00:00 2001
From: Erica <erica@lindenlab.com>
Date: Mon, 16 Nov 2009 14:52:28 -0800
Subject: [PATCH 334/557] EXT-1898 Improve layout of Person Inspector, EXT-2533
 Match layout of object inspectors to style guide, EXT-2534 Widen picks list
 layout to use available space, provide for longer descriptions

---
 .../skins/default/xui/en/inspect_avatar.xml   | 137 +++++++++---------
 .../skins/default/xui/en/inspect_object.xml   | 118 +++++++--------
 .../default/xui/en/panel_pick_list_item.xml   |  40 +++--
 3 files changed, 138 insertions(+), 157 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml
index 2c1e2b6dc0e..dd3cf079db8 100644
--- a/indra/newview/skins/default/xui/en/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml
@@ -4,18 +4,18 @@
   Single instance - only have one at a time, recycle it each spawn
 -->
 <floater
- legacy_header_height="18"
+ legacy_header_height="25"
  bevel_style="in"
- bg_opaque_image="Inspector_Background" 
+ bg_opaque_image="Inspector_Background"
  can_close="false"
  can_minimize="false"
- height="138"
+ height="148"
  layout="topleft"
  name="inspect_avatar"
  single_instance="true"
  sound_flags="0"
  visible="true"
- width="245">
+ width="228">
   <!-- Allowed fields include:
 	[BORN_ON] ("12/3/2008")
 	[SL_PROFILE] (Second Life profile),
@@ -30,7 +30,7 @@
   </string>
   <string
      name="Details">
-[ACCTTYPE][COMMA] [PAYMENTINFO]
+[SL_PROFILE]
     </string>
   <string
      name="Partner">
@@ -38,45 +38,45 @@
   </string>
   <text
      follows="all"
-     font="SansSerifLargeBold"
-     height="18"
+     font="SansSerifLarge"
+     height="16"
      left="8"
      name="user_name"
-     top="5"
-     text_color="white"
+     top="10"
+     text_color="White"
      use_ellipses="true"
      value="Grumpity ProductEngine"
-     width="240"
-     word_wrap="false" />
+     width="175" />
     <text
      follows="all"
      height="16"
      left="8"
-     value="Grumpity ProductEngine moose moose"
-     name="user_details"
-     top_pad="0"
-     width="170"
-     use_ellipses="true"
-     word_wrap="false" />
-    <text
-     follows="all"
-   font="SansSerifSmallBold"
+     name="user_subtitle"
+   font="SansSerifSmall"
    text_color="White"
-   height="18"
+     value="11 Months, 3 days old"
+     width="175"
+     use_ellipses="true" />
+     <text
+     follows="all"
+   height="25"
    left="8"
-     name="user_subtitle"
-     use_ellipses="true"
-     top_pad="0"
-     width="170" />
+     name="user_details"
+     word_wrap="true"
+     top_pad="6"
+     width="220">This is my second life description and I really think it is great.
+    </text>
     <text
      follows="all"
-     height="16"
+     height="13"
      left="8"
      name="user_partner"
-     top_pad="8"
-     width="240"
+     top_pad="3"
+     width="220"
      use_ellipses="true"
-     word_wrap="false" />
+     word_wrap="false">
+    Erica Linden
+  </text>
     <slider
      follows="top|left"
      height="23"
@@ -89,15 +89,15 @@
      tool_tip="Voice volume"
      top_pad="0"
      value="0.5"
-     width="150" />
+     width="195" />
     <button
      follows="all"
      height="16"
-     image_disabled="Inv_Sound"
-     image_disabled_selected="Inv_Sound"
-     image_hover_selected="Inv_Sound"
-     image_selected="Inv_Sound"
-     image_unselected="Inv_Sound"
+     image_disabled="Audio_Off"
+     image_disabled_selected="AudioMute_Off"
+     image_hover_selected="AudioMute_Over"
+     image_selected="AudioMute_Off"
+     image_unselected="Audio_Off"
      is_toggle="true"
      left_pad="0"
      top_delta="4"
@@ -106,67 +106,60 @@
     <avatar_icon
      follows="all"
      height="38"
-     right="-25"
+     right="-10"
      bevel_style="in"
      border_style="line"
      mouse_opaque="true"
      name="avatar_icon"
-     top="24"
+     top="10"
      width="38" />
-    <button
-     follows="top|left"
-     height="18"
-     image_disabled="ForwardArrow_Disabled"
-     image_selected="ForwardArrow_Press"
-     image_unselected="ForwardArrow_Off"
-     layout="topleft"
-     name="view_profile_btn"
-     right="-8"
-     top="35"
-     left_delta="110"
-     tab_stop="false"
-     width="18" />
   <!-- Overlapping buttons for default actions
     llinspectavatar.cpp makes visible the most likely default action -->
     <button
      follows="bottom|left"
-     height="23"
+     height="20"
      label="Add Friend"
      left="8"
-     top="246"
+     top="119"
      name="add_friend_btn"
-     width="100" />
+     width="90" />
     <button
      follows="bottom|left"
-     height="23"
+     height="20"
      label="IM"
      left_delta="0"
      top_delta="0"
      name="im_btn"
-     width="100"
+     width="80"
      commit_callback.function="InspectAvatar.IM"
      />
-    <menu_button
+          <button
      follows="top|left"
-     height="18"
-     image_disabled="OptionsMenu_Disabled"
-     image_selected="OptionsMenu_Press"
-     image_unselected="OptionsMenu_Off"
+     height="20"
+     label="More"
+     layout="topleft"
+     name="view_profile_btn"
+     left_delta="96"
+     top_delta="0"
+     tab_stop="false"
+     width="80" />
+      <!--  gear buttons here -->
+     <menu_button
+     height="20"
+     layout="topleft"
+     image_overlay="OptionsMenu_Off"
      menu_filename="menu_inspect_avatar_gear.xml"
      name="gear_btn"
-     right="-10"
-     top="249"
-     width="18" />
-  <menu_button
-     visible="false" 
+     right="-5"
+     top_delta="0"
+     width="35" />
+         <menu_button
      follows="top|left"
-     height="18"
-     image_disabled="OptionsMenu_Disabled"
-     image_selected="OptionsMenu_Press"
-     image_unselected="OptionsMenu_Off"
+     height="20"
+     image_overlay="OptionsMenu_Off"
      menu_filename="menu_inspect_self_gear.xml"
      name="gear_self_btn"
-     right="-10"
-     top="249"
-     width="18" />
+     right="-5"
+     top_delta="0"
+     width="35" />
 </floater>
diff --git a/indra/newview/skins/default/xui/en/inspect_object.xml b/indra/newview/skins/default/xui/en/inspect_object.xml
index 1365a0483f6..83570e25288 100644
--- a/indra/newview/skins/default/xui/en/inspect_object.xml
+++ b/indra/newview/skins/default/xui/en/inspect_object.xml
@@ -4,48 +4,46 @@
   Single instance - only have one at a time, recycle it each spawn
 -->
 <floater
- legacy_header_height="18"
+ legacy_header_height="25"
  bevel_style="in"
- bg_opaque_image="Inspector_Background" 
+ bg_opaque_image="Inspector_Background"
  can_close="false"
  can_minimize="false"
- height="145"
+ height="148"
  layout="topleft"
  name="inspect_object"
  single_instance="true"
  sound_flags="0"
  visible="true"
- width="300">
+ width="228">
   <string name="Creator">By [CREATOR]</string>
   <string name="CreatorAndOwner">
 by [CREATOR]
 owner [OWNER]
   </string>
-  <!-- *TODO: Might need to change to [AMOUNT] if icon contains "L$" -->
   <string name="Price">L$[AMOUNT]</string>
   <string name="PriceFree">Free!</string>
   <string name="Touch">Touch</string>
   <string name="Sit">Sit</string>
   <text
      follows="all"
-     font="SansSerifLargeBold"
+     font="SansSerifLarge"
      height="16"
      left="8"
      name="object_name"
      text_color="White"
-     top="5"
+     top="10"
      use_ellipses="true"
      value="Test Object Name That Is Really Long"
-     width="291" />
+     width="220" />
   <text
    follows="all"
-   font="SansSerif"
    height="30"
    left="8"
    name="object_creator"
    top_pad="0"
    use_ellipses="true"
-   width="275">
+   width="220">
 by Longavatarname Johnsonlongstonnammer
 owner James Linden
   </text>
@@ -53,32 +51,34 @@ owner James Linden
   <icon
   name="price_icon"
   image_name="Icon_For_Sale"
-  left="7"
+  right="-5"
   width="16"
   height="16"
-  top="52"
+  top="50"
   follows="left|top"
   />
   <text
    follows="all"
-   font="SansSerifSmallBold"
+   font="SansSerifSmall"
+   font.style="BOLD"
    height="16"
-   left_pad="5"
+   halign="right"
+   left="5"
    name="price_text"
    text_color="white"
-   top="54"
+   top="53"
    font_shadow="none"
-   width="150">
+   width="196">
 L$300,000
   </text>
    <text
    follows="all"
-   height="30"
+   font="SansSerifSmall"
+   height="36"
    left="8"
    name="object_description"
    top_pad="0"
-   width="291"
-   use_ellipses="true"
+   width="220"
    word_wrap="true">
 This is a really long description for an object being as how it is at least 80 characters in length and maybe more like 120 at this point. Who knows, really?
   </text>
@@ -86,69 +86,64 @@ This is a really long description for an object being as how it is at least 80 c
   for sale, "Sit" if can sit, etc. -->
    <text
    follows="all"
-   height="15"
+   font="SansSerifSmall"
+   height="13"
    left_delta="0"
    name="object_media_url"
-   top_pad="-5"
+   top_pad="0"
    width="291"
-   max_length = "50" 
-   use_ellipses="true"
-   word_wrap="true"/>   
-    
+   max_length = "50"
+   use_ellipses="true">
+   http://www.superdupertest.com
+</text>
   <button
    follows="top|left"
-   font="SansSerif"
    height="20"
    label="Buy"
-   left="10"
+   left="8"
    name="buy_btn"
-   top="114"
-   width="75" />
+   top="119"
+   width="80" />
   <button
    follows="top|left"
-   font="SansSerif"
    height="20"
    label="Pay"
    left_delta="0"
    name="pay_btn"
    top_delta="0"
-   width="75" />
+   width="80" />
   <button
    follows="top|left"
-   font="SansSerif"
-   height="23"
+   height="20"
    label="Take Copy"
    left_delta="0"
    name="take_free_copy_btn"
    top_delta="0"
-   width="75" />
+   width="80" />
   <button
    follows="top|left"
-   font="SansSerifSmall"
    height="20"
    label="Touch"
    left_delta="0"
    name="touch_btn"
    top_delta="0"
-   width="75" />
+   width="80" />
   <button
    follows="top|left"
-   font="SansSerif"
-   height="23"
+   height="20"
    label="Sit"
    left_delta="0"
    name="sit_btn"
    top_delta="0"
-   width="75" />
+   width="80" />
   <button
    follows="top|left"
-   font="SansSerifSmall"
    height="20"
    label="Open"
    left_delta="0"
    name="open_btn"
    top_delta="0"
-   width="75" />
+   width="80" />
   <icon
    name="secure_browsing"
    image_name="Lock"
@@ -156,33 +151,28 @@ This is a really long description for an object being as how it is at least 80 c
    visible="false"
    width="18"
    height="18"
-   top_delta="2"
+   top_delta="0"
    tool_tip="Secure Browsing"
-   follows="left|top"/> 
-   
+   follows="left|top" />
+
  <!--  non-overlapping buttons here -->
-    <menu_button
-     follows="top|left"
-     height="18"
-     image_disabled="OptionsMenu_Disabled"
-     image_selected="OptionsMenu_Press"
-     image_unselected="OptionsMenu_Off"
-     menu_filename="menu_inspect_object_gear.xml"
-     name="gear_btn"
-     right="-10"
-     top_delta="5"
-     width="18" />
-   <button
+     <button
      follows="top|left"
-     height="18"
-     image_disabled="ForwardArrow_Disabled"
-     image_selected="ForwardArrow_Press"
-     image_unselected="ForwardArrow_Off"
+     height="20"
+     label="More"
      layout="topleft"
      name="more_info_btn"
-     right="-5"
-     top="20"
-     left_delta="110"
+     left_delta="10"
+     top_delta="0"
      tab_stop="false"
-     width="18" />
+     width="80" />
+         <menu_button
+     follows="top|left"
+     height="20"
+     image_overlay="OptionsMenu_Off"
+     menu_filename="menu_inspect_object_gear.xml"
+     name="gear_btn"
+     right="-5"
+     top_delta="0"
+     width="35" />
 </floater>
diff --git a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
index 7ff227ecb60..023b1fc81d7 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
@@ -12,24 +12,24 @@
      follows="all"
      height="85"
      image_name="ListItem_Over"
-     right="-3"
+     right="-2"
      mouse_opaque="false"
      name="hovered_icon"
      top="1"
      scale_image="true"
      visible="false"
-     width="307"/>
+     width="308" />
     <icon
      follows="all"
      height="85"
      image_name="ListItem_Select"
-     right="-3"
+     right="-2"
      mouse_opaque="false"
      name="selected_icon"
      top="1"
      scale_image="true"
      visible="false"
-     width="307"/>
+     width="308" />
     <texture_picker
      allow_no_texture="true"
      border_enabled="true"
@@ -47,36 +47,34 @@
      width="90" />
     <text
      follows="top|left|right"
-     font="SansSerifSmallBold"
-     height="16"
+     font="SansSerifSmall"
+     height="15"
      layout="topleft"
      left="110"
      name="picture_name"
      text_color="white"
      top="9"
-     use_ellipses="false"
-     width="197"
+     use_ellipses="true"
+     width="193"
      word_wrap="false" />
     <expandable_text
      follows="top|left|right"
      font="SansSerifSmall"
-     height="40"
+     height="55"
      layout="topleft"
-     left="110"
+     left="103"
      name="picture_descr"
-     top_pad="3"
+     top_pad="0"
      width="178"
      word_wrap="true" />
-    <button
-     follows="top|right"
-     height="16"
-     image_selected="BuyArrow_Press"
-     image_pressed="BuyArrow_Press"
-     image_unselected="BuyArrow_Press"
+         <button
+     follows="right"
+     height="20"
+     image_overlay="ForwardArrow_Off"
      layout="topleft"
+     left_pad="5"
+     right="-8"
      name="info_chevron"
-     right="-7"
-     tab_stop="false"
-     top="27"
-     width="16" />
+     top_delta="15"
+     width="20" />
 </panel>
-- 
GitLab


From f11f2a1ea22223c5309d1b79775f6f4f18b77459 Mon Sep 17 00:00:00 2001
From: Lis Pardi <lis@lindenlab.com>
Date: Mon, 16 Nov 2009 18:07:28 -0500
Subject: [PATCH 335/557] ext-1639 Removed Use Fullscreen check box from
 Preferences > Graphics

---
 .../skins/default/xui/en/panel_preferences_graphics1.xml        | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index ec25d117f0a..eb00b9b79a0 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -28,7 +28,7 @@
      follows="left|top"
      height="15"
      increment="0.025"
-     initial_value="1"
+     initial_valu="1"
      layout="topleft"
      left_delta="52"
      max_val="1.4"
-- 
GitLab


From afe1ad54ee8a53525072a2c22782fa7135716d29 Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Mon, 16 Nov 2009 18:19:35 -0500
Subject: [PATCH 336/557] EXT-1068 appearance editor previews do not update

addendum: re-added changes to avatar-parameters as well as wearable parameters
so that the system knows to re-update the local composite after rendering
each preview.

Code reviewed by Bigpapi

--HG--
branch : avatar-pipeline
---
 indra/newview/lltoolmorph.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp
index 14524580bf7..4fb75f7a49f 100644
--- a/indra/newview/lltoolmorph.cpp
+++ b/indra/newview/lltoolmorph.cpp
@@ -148,6 +148,7 @@ void LLVisualParamHint::preRender(BOOL clear_depth)
 
 	mLastParamWeight = mVisualParam->getWeight();
 	mVisualParam->setWeight(mVisualParamWeight, FALSE);
+	avatarp->setVisualParamWeight(mVisualParam->getID(), mVisualParamWeight, FALSE);
 	avatarp->setVisualParamWeight("Blink_Left", 0.f);
 	avatarp->setVisualParamWeight("Blink_Right", 0.f);
 	avatarp->updateComposites();
@@ -242,6 +243,7 @@ BOOL LLVisualParamHint::render()
 		gGL.setSceneBlendType(LLRender::BT_ALPHA);
 		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
 	}
+	avatarp->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight);
 	mVisualParam->setWeight(mLastParamWeight, FALSE);
 	gGL.color4f(1,1,1,1);
 	mGLTexturep->setGLTextureCreated(true);
-- 
GitLab


From c0b10c29492683a734e1873ab0a31fcca8b351cb Mon Sep 17 00:00:00 2001
From: "Mark Palange (Mani)" <palange@lindenlab.com>
Date: Mon, 16 Nov 2009 15:19:42 -0800
Subject: [PATCH 337/557] EXT-2529 Fixed viewer_manifest.py to check
 secondlife-bin.exe for bad manifest linking. Reviewed by Palmer.

---
 indra/newview/viewer_manifest.py | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 7e5c30a9789..64cfdf27042 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -221,10 +221,12 @@ def disable_manifest_check(self):
 
     def construct(self):
         super(WindowsManifest, self).construct()
+
+        self.enable_crt_manifest_check()
+
         # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe.
         self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe())
 
-        self.enable_crt_manifest_check()
 
         # Plugin host application
         self.path(os.path.join(os.pardir,
-- 
GitLab


From e4453f9cc8479a4ac3344e68210004dbc39b17db Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Mon, 16 Nov 2009 15:34:33 -0800
Subject: [PATCH 338/557] Added MediaPerformanceManagerDebug debug setting.

---
 indra/newview/app_settings/settings.xml | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index f2193c4139e..94a2ca16f43 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -4545,6 +4545,17 @@
     <key>Value</key>
     <integer>1</integer>
   </map>
+  <key>MediaPerformanceManagerDebug</key>
+  <map>
+    <key>Comment</key>
+    <string>Whether to show debug data for the media performance manager in the nearby media list.</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Boolean</string>
+    <key>Value</key>
+    <integer>0</integer>
+  </map>
   <key>MemoryLogFrequency</key>
         <map>
         <key>Comment</key>
-- 
GitLab


From b62a8c14edb3f30cb39c67d3ad982a809c9ce5e8 Mon Sep 17 00:00:00 2001
From: Xiaohong Bao <bao@lindenlab.com>
Date: Mon, 16 Nov 2009 15:37:52 -0800
Subject: [PATCH 339/557] fix for DEV-2530: crash after teleporting to refion.

---
 indra/newview/llviewertexture.cpp |  5 +++--
 indra/newview/llvlcomposition.cpp | 13 +++++++++----
 2 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 85bc26c9c0e..0d29efaedf5 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -2121,10 +2121,11 @@ LLImageRaw* LLViewerFetchedTexture::reloadRawImage(S8 discard_level)
 	llassert_always(mGLTexturep.notNull()) ;
 	llassert_always(discard_level >= 0);
 	llassert_always(mComponents > 0);
+
 	if (mRawImage.notNull())
 	{
-		llerrs << "called with existing mRawImage" << llendl;
-		mRawImage = NULL;
+		//mRawImage is in use by somebody else, do not delete it.
+		return NULL ;
 	}
 
 	if(mSavedRawDiscardLevel >= 0 && mSavedRawDiscardLevel <= discard_level)
diff --git a/indra/newview/llvlcomposition.cpp b/indra/newview/llvlcomposition.cpp
index 999701ece16..6340189c934 100644
--- a/indra/newview/llvlcomposition.cpp
+++ b/indra/newview/llvlcomposition.cpp
@@ -287,17 +287,22 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y,
 				min_dim /= 2;
 			}
 
-			mDetailTextures[i]->reloadRawImage(ddiscard) ;
+			BOOL delete_raw = (mDetailTextures[i]->reloadRawImage(ddiscard) != NULL) ;
 			if(mDetailTextures[i]->getRawImageLevel() != ddiscard)//raw iamge is not ready, will enter here again later.
 			{
-				mDetailTextures[i]->destroyRawImage() ;
+				if(delete_raw)
+				{
+					mDetailTextures[i]->destroyRawImage() ;
+				}
 				lldebugs << "cached raw data for terrain detail texture is not ready yet: " << mDetailTextures[i]->getID() << llendl;
 				return FALSE;
 			}
 
 			mRawImages[i] = mDetailTextures[i]->getRawImage() ;
-			mDetailTextures[i]->destroyRawImage() ;
-
+			if(delete_raw)
+			{
+				mDetailTextures[i]->destroyRawImage() ;
+			}
 			if (mDetailTextures[i]->getWidth(ddiscard) != BASE_SIZE ||
 				mDetailTextures[i]->getHeight(ddiscard) != BASE_SIZE ||
 				mDetailTextures[i]->getComponents() != 3)
-- 
GitLab


From b88778ca7d2de5b381eb59722d9075c8e02ccb39 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Mon, 16 Nov 2009 18:40:59 -0500
Subject: [PATCH 340/557] Header file cleanup. Spelling cleanup.

Changed "Inventroy"->"Inventory".
Removed a couple of headers from llinventory.h.

--HG--
branch : avatar-pipeline
---
 indra/llinventory/llinventory.h    |  4 +---
 indra/newview/llpanellandmarks.cpp | 16 ++++++++--------
 indra/newview/llpanellandmarks.h   |  8 ++++----
 3 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/indra/llinventory/llinventory.h b/indra/llinventory/llinventory.h
index 3de9d14f542..9faecbea857 100644
--- a/indra/llinventory/llinventory.h
+++ b/indra/llinventory/llinventory.h
@@ -35,7 +35,6 @@
 
 #include <functional>
 
-#include "llassetstorage.h"
 #include "lldarray.h"
 #include "llfoldertype.h"
 #include "llinventorytype.h"
@@ -45,7 +44,6 @@
 #include "llsaleinfo.h"
 #include "llsd.h"
 #include "lluuid.h"
-#include "llxmlnode.h"
 
 // consts for Key field in the task inventory update message
 extern const U8 TASK_INVENTORY_ITEM_KEY;
@@ -357,7 +355,7 @@ class LLInventoryCategory : public LLInventoryObject
 
 typedef std::list<LLPointer<LLInventoryObject> > InventoryObjectList;
 
-// These functions convert between structured data and an inventroy
+// These functions convert between structured data and an inventory
 // item, appropriate for serialization.
 LLSD ll_create_sd_from_inventory_item(LLPointer<LLInventoryItem> item);
 //LLPointer<LLInventoryItem> ll_create_item_from_sd(const LLSD& sd_item);
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index ce1a7f98df9..e199db37abd 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -97,10 +97,10 @@ BOOL LLLandmarksPanel::postBuild()
 
 	U32 sort_order = gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER);
 	mSortByDate = sort_order & LLInventoryFilter::SO_DATE;
-	initFavoritesInventroyPanel();
-	initLandmarksInventroyPanel();
-	initMyInventroyPanel();
-	initLibraryInventroyPanel();
+	initFavoritesInventoryPanel();
+	initLandmarksInventoryPanel();
+	initMyInventoryPanel();
+	initLibraryInventoryPanel();
 	getChild<LLAccordionCtrlTab>("tab_favorites")->setDisplayChildren(true);
 	getChild<LLAccordionCtrlTab>("tab_landmarks")->setDisplayChildren(true);
 
@@ -357,7 +357,7 @@ void LLLandmarksPanel::setErrorStatus(U32 status, const std::string& reason)
 // PRIVATE METHODS
 //////////////////////////////////////////////////////////////////////////
 
-void LLLandmarksPanel::initFavoritesInventroyPanel()
+void LLLandmarksPanel::initFavoritesInventoryPanel()
 {
 	mFavoritesInventoryPanel = getChild<LLInventorySubTreePanel>("favorites_list");
 
@@ -366,7 +366,7 @@ void LLLandmarksPanel::initFavoritesInventroyPanel()
 	initAccordion("tab_favorites", mFavoritesInventoryPanel);
 }
 
-void LLLandmarksPanel::initLandmarksInventroyPanel()
+void LLLandmarksPanel::initLandmarksInventoryPanel()
 {
 	mLandmarksInventoryPanel = getChild<LLInventorySubTreePanel>("landmarks_list");
 
@@ -380,7 +380,7 @@ void LLLandmarksPanel::initLandmarksInventroyPanel()
 	initAccordion("tab_landmarks", mLandmarksInventoryPanel);
 }
 
-void LLLandmarksPanel::initMyInventroyPanel()
+void LLLandmarksPanel::initMyInventoryPanel()
 {
 	mMyInventoryPanel= getChild<LLInventorySubTreePanel>("my_inventory_list");
 
@@ -389,7 +389,7 @@ void LLLandmarksPanel::initMyInventroyPanel()
 	initAccordion("tab_inventory", mMyInventoryPanel);
 }
 
-void LLLandmarksPanel::initLibraryInventroyPanel()
+void LLLandmarksPanel::initLibraryInventoryPanel()
 {
 	mLibraryInventoryPanel = getChild<LLInventorySubTreePanel>("library_list");
 
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index 745f9364c22..097d79badf8 100644
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -78,10 +78,10 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
 	/*virtual*/ void setErrorStatus(U32 status, const std::string& reason);
 	
 private:
-	void initFavoritesInventroyPanel();
-	void initLandmarksInventroyPanel();
-	void initMyInventroyPanel();
-	void initLibraryInventroyPanel();
+	void initFavoritesInventoryPanel();
+	void initLandmarksInventoryPanel();
+	void initMyInventoryPanel();
+	void initLibraryInventoryPanel();
 	void initLandmarksPanel(LLInventorySubTreePanel* inventory_list);
 	void initAccordion(const std::string& accordion_tab_name, LLInventorySubTreePanel* inventory_list);
 	void onAccordionExpandedCollapsed(const LLSD& param, LLInventorySubTreePanel* inventory_list);
-- 
GitLab


From 63192ae2b9cb767b683672bba9a057dc4fb1ee10 Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Mon, 16 Nov 2009 15:46:53 -0800
Subject: [PATCH 341/557] EXT-2264 - Statistics window puts items in wrong
 categories

---
 .../skins/default/xui/en/floater_stats.xml    | 322 +++++++++---------
 1 file changed, 161 insertions(+), 161 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml
index 68a4867167f..f9dacf02077 100644
--- a/indra/newview/skins/default/xui/en/floater_stats.xml
+++ b/indra/newview/skins/default/xui/en/floater_stats.xml
@@ -405,179 +405,179 @@
 				 show_bar="false"
 				 show_mean="false" >
 			  </stat_bar>
+		  </stat_view>
 
-			  <stat_bar
-				 name="simagentups"
-				 label="Agent Updates/Sec"
-				 stat="simagentups"
-				 precision="1"
-				 bar_min="0.f"
-				 bar_max="100.f" 
-				 tick_spacing="25.f"
-				 label_spacing="50.f" 
-				 show_per_sec="false"
-				 show_bar="false"
-				 show_mean="false" >
-			  </stat_bar>
+			<stat_bar
+			   name="simagentups"
+			   label="Agent Updates/Sec"
+			   stat="simagentups"
+			   precision="1"
+			   bar_min="0.f"
+			   bar_max="100.f" 
+			   tick_spacing="25.f"
+			   label_spacing="50.f" 
+			   show_per_sec="false"
+			   show_bar="false"
+			   show_mean="false" >
+			</stat_bar>
 
-			  <stat_bar
-				 name="simmainagents"
-				 label="Main Agents"
-				 stat="simmainagents"
-				 precision="0"
-				 bar_min="0.f"
-				 bar_max="80.f" 
-				 tick_spacing="10.f"
-				 label_spacing="40.f" 
-				 show_per_sec="false"
-				 show_bar="false"
-				 show_mean="false" >
-			  </stat_bar>
+			<stat_bar
+			   name="simmainagents"
+			   label="Main Agents"
+			   stat="simmainagents"
+			   precision="0"
+			   bar_min="0.f"
+			   bar_max="80.f" 
+			   tick_spacing="10.f"
+			   label_spacing="40.f" 
+			   show_per_sec="false"
+			   show_bar="false"
+			   show_mean="false" >
+			</stat_bar>
 
-			  <stat_bar
-				 name="simchildagents"
-				 label="Child Agents"
-				 stat="simchildagents"
-				 precision="0"
-				 bar_min="0.f"
-				 bar_max="40.f" 
-				 tick_spacing="5.f"
-				 label_spacing="10.f" 
-				 show_per_sec="false"
-				 show_bar="false"
-				 show_mean="false" >
-			  </stat_bar>
+			<stat_bar
+			   name="simchildagents"
+			   label="Child Agents"
+			   stat="simchildagents"
+			   precision="0"
+			   bar_min="0.f"
+			   bar_max="40.f" 
+			   tick_spacing="5.f"
+			   label_spacing="10.f" 
+			   show_per_sec="false"
+			   show_bar="false"
+			   show_mean="false" >
+			</stat_bar>
 
-			  <stat_bar
-				 name="simobjects"
-				 label="Objects"
-				 stat="simobjects"
-				 precision="0"
-				 bar_min="0.f"
-				 bar_max="30000.f" 
-				 tick_spacing="5000.f"
-				 label_spacing="10000.f" 
-				 show_per_sec="false"
-				 show_bar="false"
-				 show_mean="false" >
-			  </stat_bar>
+			<stat_bar
+			   name="simobjects"
+			   label="Objects"
+			   stat="simobjects"
+			   precision="0"
+			   bar_min="0.f"
+			   bar_max="30000.f" 
+			   tick_spacing="5000.f"
+			   label_spacing="10000.f" 
+			   show_per_sec="false"
+			   show_bar="false"
+			   show_mean="false" >
+			</stat_bar>
 
-			  <stat_bar
-				 name="simactiveobjects"
-				 label="Active Objects"
-				 stat="simactiveobjects"
-				 precision="0"
-				 bar_min="0.f"
-				 bar_max="800.f" 
-				 tick_spacing="100.f"
-				 label_spacing="200.f" 
-				 show_per_sec="false"
-				 show_bar="false"
-				 show_mean="false" >
-			  </stat_bar>
+			<stat_bar
+			   name="simactiveobjects"
+			   label="Active Objects"
+			   stat="simactiveobjects"
+			   precision="0"
+			   bar_min="0.f"
+			   bar_max="800.f" 
+			   tick_spacing="100.f"
+			   label_spacing="200.f" 
+			   show_per_sec="false"
+			   show_bar="false"
+			   show_mean="false" >
+			</stat_bar>
 
-			  <stat_bar
-				 name="simactivescripts"
-				 label="Active Scripts"
-				 stat="simactivescripts"
-				 precision="0"
-				 bar_min="0.f"
-				 bar_max="800.f" 
-				 tick_spacing="100.f"
-				 label_spacing="200.f" 
-				 show_per_sec="false"
-				 show_bar="false"
-				 show_mean="false" >
-			  </stat_bar>
+			<stat_bar
+			   name="simactivescripts"
+			   label="Active Scripts"
+			   stat="simactivescripts"
+			   precision="0"
+			   bar_min="0.f"
+			   bar_max="800.f" 
+			   tick_spacing="100.f"
+			   label_spacing="200.f" 
+			   show_per_sec="false"
+			   show_bar="false"
+			   show_mean="false" >
+			</stat_bar>
 
-			  <stat_bar
-				 name="simscripteps"
-				 label="Script Events"
-				 stat="simscripteps"
-				 unit_label="eps"
-				 precision="0"
-				 bar_min="0.f"
-				 bar_max="20000.f" 
-				 tick_spacing="2500.f"
-				 label_spacing="5000.f" 
-				 show_per_sec="false"
-				 show_bar="false"
-				 show_mean="false" >
-			  </stat_bar>
+			<stat_bar
+			   name="simscripteps"
+			   label="Script Events"
+			   stat="simscripteps"
+			   unit_label="eps"
+			   precision="0"
+			   bar_min="0.f"
+			   bar_max="20000.f" 
+			   tick_spacing="2500.f"
+			   label_spacing="5000.f" 
+			   show_per_sec="false"
+			   show_bar="false"
+			   show_mean="false" >
+			</stat_bar>
 
-			  <stat_bar
-				 name="siminpps"
-				 label="Packets In"
-				 stat="siminpps"
-				 unit_label="pps"
-				 precision="0"
-				 bar_min="0.f"
-				 bar_max="2000.f" 
-				 tick_spacing="250.f"
-				 label_spacing="1000.f" 
-				 show_per_sec="false"
-				 show_bar="false"
-				 show_mean="false" >
-			  </stat_bar>
+			<stat_bar
+			   name="siminpps"
+			   label="Packets In"
+			   stat="siminpps"
+			   unit_label="pps"
+			   precision="0"
+			   bar_min="0.f"
+			   bar_max="2000.f" 
+			   tick_spacing="250.f"
+			   label_spacing="1000.f" 
+			   show_per_sec="false"
+			   show_bar="false"
+			   show_mean="false" >
+			</stat_bar>
 
-			  <stat_bar
-				 name="simoutpps"
-				 label="Packets Out"
-				 stat="simoutpps"
-				 unit_label="pps" 
-				 precision="0"
-				 bar_min="0.f"
-				 bar_max="2000.f" 
-				 tick_spacing="250.f"
-				 label_spacing="1000.f" 
-				 show_per_sec="false"
-				 show_bar="false"
-				 show_mean="false" >
-			  </stat_bar>
+			<stat_bar
+			   name="simoutpps"
+			   label="Packets Out"
+			   stat="simoutpps"
+			   unit_label="pps" 
+			   precision="0"
+			   bar_min="0.f"
+			   bar_max="2000.f" 
+			   tick_spacing="250.f"
+			   label_spacing="1000.f" 
+			   show_per_sec="false"
+			   show_bar="false"
+			   show_mean="false" >
+			</stat_bar>
 
-			  <stat_bar
-				 name="simpendingdownloads"
-				 label="Pending Downloads"
-				 stat="simpendingdownloads"
-				 precision="0"
-				 bar_min="0.f"
-				 bar_max="800.f" 
-				 tick_spacing="100.f"
-				 label_spacing="200.f" 
-				 show_per_sec="false"
-				 show_bar="false"
-				 show_mean="false" >
-			  </stat_bar>
+			<stat_bar
+			   name="simpendingdownloads"
+			   label="Pending Downloads"
+			   stat="simpendingdownloads"
+			   precision="0"
+			   bar_min="0.f"
+			   bar_max="800.f" 
+			   tick_spacing="100.f"
+			   label_spacing="200.f" 
+			   show_per_sec="false"
+			   show_bar="false"
+			   show_mean="false" >
+			</stat_bar>
 
-			  <stat_bar
-				 name="simpendinguploads"
-				 label="Pending Uploads"
-				 stat="simpendinguploads"
-				 precision="0"
-				 bar_min="0.f"
-				 bar_max="100.f" 
-				 tick_spacing="25.f"
-				 label_spacing="50.f" 
-				 show_per_sec="false"
-				 show_bar="false"
-				 show_mean="false" >
-			  </stat_bar>
+			<stat_bar
+			   name="simpendinguploads"
+			   label="Pending Uploads"
+			   stat="simpendinguploads"
+			   precision="0"
+			   bar_min="0.f"
+			   bar_max="100.f" 
+			   tick_spacing="25.f"
+			   label_spacing="50.f" 
+			   show_per_sec="false"
+			   show_bar="false"
+			   show_mean="false" >
+			</stat_bar>
 
-			  <stat_bar
-				 name="simtotalunackedbytes"
-				 label="Total Unacked Bytes"
-				 stat="simtotalunackedbytes"
-				 unit_label="kb"
-				 precision="0"
-				 bar_min="0.f"
-				 bar_max="100000.f" 
-				 tick_spacing="25000.f"
-				 label_spacing="50000.f" 
-				 show_per_sec="false"
-				 show_bar="false"
-				 show_mean="false" >
-			  </stat_bar>
-			</stat_view>
+			<stat_bar
+			   name="simtotalunackedbytes"
+			   label="Total Unacked Bytes"
+			   stat="simtotalunackedbytes"
+			   unit_label="kb"
+			   precision="0"
+			   bar_min="0.f"
+			   bar_max="100000.f" 
+			   tick_spacing="25000.f"
+			   label_spacing="50000.f" 
+			   show_per_sec="false"
+			   show_bar="false"
+			   show_mean="false" >
+			</stat_bar>
 
 			<stat_view
 			   name="simperf"
-- 
GitLab


From b38ca5ec323beecd7fa431addb021199c85764f6 Mon Sep 17 00:00:00 2001
From: richard <none@none>
Date: Mon, 16 Nov 2009 15:47:45 -0800
Subject: [PATCH 342/557] fix for UI scale != 1.0 breaking edit tools, web
 browser, world view rect, etc.

---
 indra/newview/llchannelmanager.cpp            |    2 +-
 indra/newview/llimfloater.cpp                 |    2 +-
 indra/newview/llimhandler.cpp                 |    2 +-
 indra/newview/llimview.cpp                    | 5108 ++++++++---------
 indra/newview/llmanip.cpp                     |    4 +-
 indra/newview/llmaniprotate.cpp               |   13 +-
 indra/newview/llmediactrl.cpp                 |   24 +-
 indra/newview/llnearbychat.cpp                |    2 +-
 indra/newview/llnotificationalerthandler.cpp  |    2 +-
 indra/newview/llnotificationgrouphandler.cpp  |    2 +-
 indra/newview/llnotificationofferhandler.cpp  |    2 +-
 indra/newview/llnotificationscripthandler.cpp |    2 +-
 indra/newview/llnotificationtiphandler.cpp    |    2 +-
 indra/newview/llscreenchannel.cpp             |    6 +-
 indra/newview/llsyswellwindow.cpp             |    2 +-
 indra/newview/lltoolfocus.cpp                 |    6 +-
 indra/newview/lltoolgrab.cpp                  |   14 +-
 indra/newview/llviewercamera.cpp              |   26 +-
 indra/newview/llviewerwindow.cpp              |   63 +-
 indra/newview/llviewerwindow.h                |    3 +
 20 files changed, 2659 insertions(+), 2628 deletions(-)

diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp
index 914435b6409..312eb692c4d 100644
--- a/indra/newview/llchannelmanager.cpp
+++ b/indra/newview/llchannelmanager.cpp
@@ -127,7 +127,7 @@ void LLChannelManager::onLoginCompleted()
 	gViewerWindow->getRootView()->addChild(mStartUpChannel);
 
 	// init channel's position and size
-	S32 channel_right_bound = gViewerWindow->getWorldViewRectRaw().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
+	S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
 	S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
 	mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound);
 	mStartUpChannel->setMouseDownCallback(boost::bind(&LLSysWellWindow::onStartUpToastClick, LLFloaterReg::getTypedInstance<LLSysWellWindow>("syswell_window"), _2, _3, _4));
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index e3121fbc7a5..e4cf1836d18 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -358,7 +358,7 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
 
 void LLIMFloater::getAllowedRect(LLRect& rect)
 {
-	rect = gViewerWindow->getWorldViewRectRaw();
+	rect = gViewerWindow->getWorldViewRectScaled();
 }
 
 void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
diff --git a/indra/newview/llimhandler.cpp b/indra/newview/llimhandler.cpp
index 524a889f972..c081af58793 100644
--- a/indra/newview/llimhandler.cpp
+++ b/indra/newview/llimhandler.cpp
@@ -58,7 +58,7 @@ LLIMHandler::~LLIMHandler()
 //--------------------------------------------------------------------------
 void LLIMHandler::initChannel()
 {
-	S32 channel_right_bound = gViewerWindow->getWorldViewRectRaw().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
+	S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
 	S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
 	mChannel->init(channel_right_bound - channel_width, channel_right_bound);
 }
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index dc32291714b..ab8cc0bad7e 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1,2555 +1,2555 @@
-/** 
- * @file LLIMMgr.cpp
- * @brief Container for Instant Messaging
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- * 
- * Copyright (c) 2001-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llimview.h"
-
-#include "llfloaterreg.h"
-#include "llfontgl.h"
-#include "llrect.h"
-#include "llerror.h"
-#include "llbutton.h"
-#include "llhttpclient.h"
-#include "llsdutil_math.h"
-#include "llstring.h"
-#include "lluictrlfactory.h"
-
-#include "llagent.h"
-#include "llavatariconctrl.h"
-#include "llbottomtray.h"
-#include "llcallingcard.h"
-#include "llchat.h"
-#include "llresmgr.h"
-#include "llfloaterchat.h"
-#include "llfloaterchatterbox.h"
-#include "llavataractions.h"
-#include "llhttpnode.h"
-#include "llimfloater.h"
-#include "llimpanel.h"
-#include "llresizebar.h"
-#include "lltabcontainer.h"
-#include "llviewercontrol.h"
-#include "llfloater.h"
-#include "llmutelist.h"
-#include "llresizehandle.h"
-#include "llkeyboard.h"
-#include "llui.h"
-#include "llviewermenu.h"
-#include "llcallingcard.h"
-#include "lltoolbar.h"
-#include "llviewermessage.h"
-#include "llviewerwindow.h"
-#include "llnotify.h"
-#include "llviewerregion.h"
-#include "llvoicechannel.h"
-#include "lltrans.h"
-#include "llrecentpeople.h"
-#include "llsyswellwindow.h"
-
-#include "llfirstuse.h"
-#include "llagentui.h"
-
-//
-// Globals
-//
-LLIMMgr* gIMMgr = NULL;
-
-//
-// Statics
-//
-// *FIXME: make these all either UIStrings or Strings
-
-const static std::string IM_SEPARATOR(": ");
-
-
-void toast_callback(const LLSD& msg){
-	// do not show toast in busy mode or it goes from agent
-	if (gAgent.getBusy() || gAgent.getID() == msg["from_id"])
-	{
-		return;
-	}
-
-	// check whether incoming IM belongs to an active session or not
-	if (LLIMModel::getInstance()->getActiveSessionID() == msg["session_id"])
-	{
-		return;
-	}
-
-	// Skip toasting for system messages
-	if (msg["from_id"].asUUID() == LLUUID::null)
-	{
-		return;
-	}
-
-	LLSD args;
-	args["MESSAGE"] = msg["message"];
-	args["TIME"] = msg["time"];
-	args["FROM"] = msg["from"];
-	args["FROM_ID"] = msg["from_id"];
-	args["SESSION_ID"] = msg["session_id"];
-
-	LLNotifications::instance().add("IMToast", args, LLSD(), boost::bind(&LLIMFloater::show, msg["session_id"].asUUID()));
-}
-
-void LLIMModel::setActiveSessionID(const LLUUID& session_id)
-{
-	// check if such an ID really exists
-	if (!findIMSession(session_id))
-	{
-		llwarns << "Trying to set as active a non-existent session!" << llendl;
-		return;
-	}
-
-	mActiveSessionID = session_id;
-}
-
-LLIMModel::LLIMModel() 
-{
-	addNewMsgCallback(LLIMFloater::newIMCallback);
-	addNewMsgCallback(toast_callback);
-}
-
-LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
-:	mSessionID(session_id),
-	mName(name),
-	mType(type),
-	mNumUnread(0),
-	mOtherParticipantID(other_participant_id),
-	mInitialTargetIDs(ids),
-	mVoiceChannel(NULL),
-	mSpeakers(NULL),
-	mSessionInitialized(false),
-	mCallBackEnabled(true),
-	mTextIMPossible(true),
-	mOtherParticipantIsAvatar(true)
-{
-	if (IM_NOTHING_SPECIAL == type || IM_SESSION_P2P_INVITE == type)
-	{
-		mVoiceChannel  = new LLVoiceChannelP2P(session_id, name, other_participant_id);
-	}
-	else
-	{
-		mVoiceChannel = new LLVoiceChannelGroup(session_id, name);
-	}
-	mSpeakers = new LLIMSpeakerMgr(mVoiceChannel);
-
-	// All participants will be added to the list of people we've recently interacted with.
-	mSpeakers->addListener(&LLRecentPeople::instance(), "add");
-
-	//we need to wait for session initialization for outgoing ad-hoc and group chat session
-	//correct session id for initiated ad-hoc chat will be received from the server
-	if (!LLIMModel::getInstance()->sendStartSession(mSessionID, mOtherParticipantID, 
-		mInitialTargetIDs, mType))
-	{
-		//we don't need to wait for any responses
-		//so we're already initialized
-		mSessionInitialized = true;
-	}
-
-	if (IM_NOTHING_SPECIAL == type)
-	{
-		mCallBackEnabled = LLVoiceClient::getInstance()->isSessionCallBackPossible(mSessionID);
-		mTextIMPossible = LLVoiceClient::getInstance()->isSessionTextIMPossible(mSessionID);
-		mOtherParticipantIsAvatar = LLVoiceClient::getInstance()->isParticipantAvatar(mSessionID);
-	}
-
-	if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") )
-		LLLogChat::loadHistory(mName, &chatFromLogFile, (void *)this);
-}
-
-LLIMModel::LLIMSession::~LLIMSession()
-{
-	delete mSpeakers;
-	mSpeakers = NULL;
-
-	// End the text IM session if necessary
-	if(gVoiceClient && mOtherParticipantID.notNull())
-	{
-		switch(mType)
-		{
-		case IM_NOTHING_SPECIAL:
-		case IM_SESSION_P2P_INVITE:
-			gVoiceClient->endUserIMSession(mOtherParticipantID);
-			break;
-
-		default:
-			// Appease the linux compiler
-			break;
-		}
-	}
-
-	// HAVE to do this here -- if it happens in the LLVoiceChannel destructor it will call the wrong version (since the object's partially deconstructed at that point).
-	mVoiceChannel->deactivate();
-	
-	delete mVoiceChannel;
-	mVoiceChannel = NULL;
-}
-
-void LLIMModel::LLIMSession::sessionInitReplyReceived(const LLUUID& new_session_id)
-{
-	mSessionInitialized = true;
-
-	if (new_session_id != mSessionID)
-	{
-		mSessionID = new_session_id;
-		mVoiceChannel->updateSessionID(new_session_id);
-	}
-}
-
-void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time)
-{
-	LLSD message;
-	message["from"] = from;
-	message["from_id"] = from_id;
-	message["message"] = utf8_text;
-	message["time"] = time; 
-	message["index"] = (LLSD::Integer)mMsgs.size(); 
-
-	mMsgs.push_front(message); 
-
-	if (mSpeakers && from_id.notNull())
-	{
-		mSpeakers->speakerChatted(from_id);
-		mSpeakers->setSpeakerTyping(from_id, FALSE);
-	}
-}
-
-void LLIMModel::LLIMSession::chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata)
-{
-	if (!userdata) return;
-
-	LLIMSession* self = (LLIMSession*) userdata;
-
-	if (type == LLLogChat::LOG_LINE)
-	{
-		self->addMessage("", LLSD(), msg["message"].asString(), "");
-	}
-	else if (type == LLLogChat::LOG_LLSD)
-	{
-		self->addMessage(msg["from"].asString(), msg["from_id"].asUUID(), msg["message"].asString(), msg["time"].asString());
-	}
-}
-
-LLIMModel::LLIMSession* LLIMModel::findIMSession(const LLUUID& session_id) const
-{
-	return get_if_there(mId2SessionMap, session_id,
-		(LLIMModel::LLIMSession*) NULL);
-}
-
-void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id)
-{
-	LLIMSession* session = findIMSession(old_session_id);
-	if (session)
-	{
-		session->sessionInitReplyReceived(new_session_id);
-
-		if (old_session_id != new_session_id)
-		{
-			mId2SessionMap.erase(old_session_id);
-			mId2SessionMap[new_session_id] = session;
-
-			gIMMgr->notifyObserverSessionIDUpdated(old_session_id, new_session_id);
-		}
-
-		LLIMFloater* im_floater = LLIMFloater::findInstance(old_session_id);
-		if (im_floater)
-		{
-			im_floater->sessionInitReplyReceived(new_session_id);
-		}
-	}
-
-	//*TODO remove this "floater" stuff when Communicate Floater is gone
-	LLFloaterIMPanel* floater = gIMMgr->findFloaterBySession(old_session_id);
-	if (floater)
-	{
-		floater->sessionInitReplyReceived(new_session_id);
-	}
-}
-
-void LLIMModel::testMessages()
-{
-	LLUUID bot1_id("d0426ec6-6535-4c11-a5d9-526bb0c654d9");
-	LLUUID bot1_session_id;
-	std::string from = "IM Tester";
-
-	bot1_session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, bot1_id);
-	newSession(bot1_session_id, from, IM_NOTHING_SPECIAL, bot1_id);
-	addMessage(bot1_session_id, from, bot1_id, "Test Message: Hi from testerbot land!");
-
-	LLUUID bot2_id;
-	std::string firstname[] = {"Roflcopter", "Joe"};
-	std::string lastname[] = {"Linden", "Tester", "Resident", "Schmoe"};
-
-	S32 rand1 = ll_rand(sizeof firstname)/(sizeof firstname[0]);
-	S32 rand2 = ll_rand(sizeof lastname)/(sizeof lastname[0]);
-	
-	from = firstname[rand1] + " " + lastname[rand2];
-	bot2_id.generate(from);
-	LLUUID bot2_session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, bot2_id);
-	newSession(bot2_session_id, from, IM_NOTHING_SPECIAL, bot2_id);
-	addMessage(bot2_session_id, from, bot2_id, "Test Message: Hello there, I have a question. Can I bother you for a second? ");
-	addMessage(bot2_session_id, from, bot2_id, "Test Message: OMGWTFBBQ.");
-}
-
-
-bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, 
-						   const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
-{
-	if (findIMSession(session_id))
-	{
-		llwarns << "IM Session " << session_id << " already exists" << llendl;
-		return false;
-	}
-
-	LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids);
-	mId2SessionMap[session_id] = session;
-
-	LLIMMgr::getInstance()->notifyObserverSessionAdded(session_id, name, other_participant_id);
-
-	return true;
-
-}
-
-bool LLIMModel::clearSession(const LLUUID& session_id)
-{
-	if (mId2SessionMap.find(session_id) == mId2SessionMap.end()) return false;
-	delete (mId2SessionMap[session_id]);
-	mId2SessionMap.erase(session_id);
-	return true;
-}
-
-void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index)
-{
-	LLIMSession* session = findIMSession(session_id);
-	if (!session) 
-	{
-		llwarns << "session " << session_id << "does not exist " << llendl;
-		return;
-	}
-
-	int i = session->mMsgs.size() - start_index;
-
-	for (std::list<LLSD>::iterator iter = session->mMsgs.begin(); 
-		iter != session->mMsgs.end() && i > 0;
-		iter++)
-	{
-		LLSD msg;
-		msg = *iter;
-		messages.push_back(*iter);
-		i--;
-	}
-
-	session->mNumUnread = 0;
-	
-	LLSD arg;
-	arg["session_id"] = session_id;
-	arg["num_unread"] = 0;
-	mNoUnreadMsgsSignal(arg);
-}
-
-bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text) {
-	
-	LLIMSession* session = findIMSession(session_id);
-
-	if (!session) 
-	{
-		llwarns << "session " << session_id << "does not exist " << llendl;
-		return false;
-	}
-
-	session->addMessage(from, from_id, utf8_text, LLLogChat::timestamp(false)); //might want to add date separately
-
-	return true;
-}
-
-bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
-{
-	S32 im_log_option =  gSavedPerAccountSettings.getS32("IMLogOptions");
-	if (im_log_option != LOG_CHAT)
-	{
-		if(im_log_option == LOG_BOTH_TOGETHER)
-		{
-			LLLogChat::saveHistory(std::string("chat"), from, from_id, utf8_text);
-			return true;
-		}
-		else
-		{
-			LLLogChat::saveHistory(LLIMModel::getInstance()->getName(session_id), from, from_id, utf8_text);
-			return true;
-		}
-	}
-	return false;
-}
-
-bool LLIMModel::proccessOnlineOfflineNotification(
-	const LLUUID& session_id, 
-	const std::string& utf8_text)
-{
-	// Add message to old one floater
-	LLFloaterIMPanel *floater = gIMMgr->findFloaterBySession(session_id);
-	if ( floater )
-	{
-		if ( !utf8_text.empty() )
-		{
-			floater->addHistoryLine(utf8_text, LLUIColorTable::instance().getColor("SystemChatColor"));
-		}
-	}
-	// Add system message to history
-	return addMessage(session_id, SYSTEM_FROM, LLUUID::null, utf8_text);
-}
-
-bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, 
-						   const std::string& utf8_text, bool log2file /* = true */) { 
-	LLIMSession* session = findIMSession(session_id);
-
-	if (!session) 
-	{
-		llwarns << "session " << session_id << "does not exist " << llendl;
-		return false;
-	}
-
-	addToHistory(session_id, from, from_id, utf8_text);
-	if (log2file) logToFile(session_id, from, from_id, utf8_text);
-
-	session->mNumUnread++;
-
-	// notify listeners
-	LLSD arg;
-	arg["session_id"] = session_id;
-	arg["num_unread"] = session->mNumUnread;
-	arg["message"] = utf8_text;
-	arg["from"] = from;
-	arg["from_id"] = from_id;
-	arg["time"] = LLLogChat::timestamp(false);
-	mNewMsgSignal(arg);
-
-	return true;
-}
-
-
-const std::string& LLIMModel::getName(const LLUUID& session_id) const
-{
-	LLIMSession* session = findIMSession(session_id);
-
-	if (!session) 
-	{
-		llwarns << "session " << session_id << "does not exist " << llendl;
-		return LLStringUtil::null;
-	}
-
-	return session->mName;
-}
-
-const S32 LLIMModel::getNumUnread(const LLUUID& session_id) const
-{
-	LLIMSession* session = findIMSession(session_id);
-	if (!session)
-	{
-		llwarns << "session " << session_id << "does not exist " << llendl;
-		return -1;
-	}
-
-	return session->mNumUnread;
-}
-
-const LLUUID& LLIMModel::getOtherParticipantID(const LLUUID& session_id) const
-{
-	LLIMSession* session = findIMSession(session_id);
-	if (!session)
-	{
-		llwarns << "session " << session_id << "does not exist " << llendl;
-		return LLUUID::null;
-	}
-
-	return session->mOtherParticipantID;
-}
-
-EInstantMessage LLIMModel::getType(const LLUUID& session_id) const
-{
-	LLIMSession* session = findIMSession(session_id);
-	if (!session)
-	{
-		llwarns << "session " << session_id << "does not exist " << llendl;
-		return IM_COUNT;
-	}
-
-	return session->mType;
-}
-
-LLVoiceChannel* LLIMModel::getVoiceChannel( const LLUUID& session_id ) const
-{
-	LLIMSession* session = findIMSession(session_id);
-	if (!session)
-	{
-		llwarns << "session " << session_id << "does not exist " << llendl;
-		return NULL;
-	}
-
-	return session->mVoiceChannel;
-}
-
-LLIMSpeakerMgr* LLIMModel::getSpeakerManager( const LLUUID& session_id ) const
-{
-	LLIMSession* session = findIMSession(session_id);
-	if (!session)
-	{
-		llwarns << "session " << session_id << "does not exist " << llendl;
-		return NULL;
-	}
-
-	return session->mSpeakers;
-}
-
-
-// TODO get rid of other participant ID
-void LLIMModel::sendTypingState(LLUUID session_id, LLUUID other_participant_id, BOOL typing) 
-{
-	std::string name;
-	LLAgentUI::buildFullname(name);
-
-	pack_instant_message(
-		gMessageSystem,
-		gAgent.getID(),
-		FALSE,
-		gAgent.getSessionID(),
-		other_participant_id,
-		name,
-		std::string("typing"),
-		IM_ONLINE,
-		(typing ? IM_TYPING_START : IM_TYPING_STOP),
-		session_id);
-	gAgent.sendReliableMessage();
-}
-
-void LLIMModel::sendLeaveSession(const LLUUID& session_id, const LLUUID& other_participant_id)
-{
-	if(session_id.notNull())
-	{
-		std::string name;
-		LLAgentUI::buildFullname(name);
-		pack_instant_message(
-			gMessageSystem,
-			gAgent.getID(),
-			FALSE,
-			gAgent.getSessionID(),
-			other_participant_id,
-			name, 
-			LLStringUtil::null,
-			IM_ONLINE,
-			IM_SESSION_LEAVE,
-			session_id);
-		gAgent.sendReliableMessage();
-	}
-}
-
-//*TODO this method is better be moved to the LLIMMgr
-void LLIMModel::sendMessage(const std::string& utf8_text,
-					 const LLUUID& im_session_id,
-					 const LLUUID& other_participant_id,
-					 EInstantMessage dialog)
-{
-	std::string name;
-	bool sent = false;
-	LLAgentUI::buildFullname(name);
-
-	const LLRelationship* info = NULL;
-	info = LLAvatarTracker::instance().getBuddyInfo(other_participant_id);
-	
-	U8 offline = (!info || info->isOnline()) ? IM_ONLINE : IM_OFFLINE;
-	
-	if((offline == IM_OFFLINE) && (LLVoiceClient::getInstance()->isOnlineSIP(other_participant_id)))
-	{
-		// User is online through the OOW connector, but not with a regular viewer.  Try to send the message via SLVoice.
-		sent = gVoiceClient->sendTextMessage(other_participant_id, utf8_text);
-	}
-	
-	if(!sent)
-	{
-		// Send message normally.
-
-		// default to IM_SESSION_SEND unless it's nothing special - in
-		// which case it's probably an IM to everyone.
-		U8 new_dialog = dialog;
-
-		if ( dialog != IM_NOTHING_SPECIAL )
-		{
-			new_dialog = IM_SESSION_SEND;
-		}
-		pack_instant_message(
-			gMessageSystem,
-			gAgent.getID(),
-			FALSE,
-			gAgent.getSessionID(),
-			other_participant_id,
-			name.c_str(),
-			utf8_text.c_str(),
-			offline,
-			(EInstantMessage)new_dialog,
-			im_session_id);
-		gAgent.sendReliableMessage();
-	}
-
-	// If there is a mute list and this is not a group chat...
-	if ( LLMuteList::getInstance() )
-	{
-		// ... the target should not be in our mute list for some message types.
-		// Auto-remove them if present.
-		switch( dialog )
-		{
-		case IM_NOTHING_SPECIAL:
-		case IM_GROUP_INVITATION:
-		case IM_INVENTORY_OFFERED:
-		case IM_SESSION_INVITE:
-		case IM_SESSION_P2P_INVITE:
-		case IM_SESSION_CONFERENCE_START:
-		case IM_SESSION_SEND: // This one is marginal - erring on the side of hearing.
-		case IM_LURE_USER:
-		case IM_GODLIKE_LURE_USER:
-		case IM_FRIENDSHIP_OFFERED:
-			LLMuteList::getInstance()->autoRemove(other_participant_id, LLMuteList::AR_IM);
-			break;
-		default: ; // do nothing
-		}
-	}
-
-	if((dialog == IM_NOTHING_SPECIAL) && 
-	   (other_participant_id.notNull()))
-	{
-		// Do we have to replace the /me's here?
-		std::string from;
-		LLAgentUI::buildFullname(from);
-		LLIMModel::getInstance()->addMessage(im_session_id, from, gAgentID, utf8_text);
-
-		//local echo for the legacy communicate panel
-		std::string history_echo;
-		LLAgentUI::buildFullname(history_echo);
-
-		history_echo += ": " + utf8_text;
-
-		LLFloaterIMPanel* floater = gIMMgr->findFloaterBySession(im_session_id);
-		if (floater) floater->addHistoryLine(history_echo, LLUIColorTable::instance().getColor("IMChatColor"), true, gAgent.getID());
-
-		LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(im_session_id);
-		if (speaker_mgr)
-		{
-			speaker_mgr->speakerChatted(gAgentID);
-			speaker_mgr->setSpeakerTyping(gAgentID, FALSE);
-		}
-	}
-
-	// Add the recipient to the recent people list.
-	LLRecentPeople::instance().add(other_participant_id);
-}
-
-void session_starter_helper(
-	const LLUUID& temp_session_id,
-	const LLUUID& other_participant_id,
-	EInstantMessage im_type)
-{
-	LLMessageSystem *msg = gMessageSystem;
-
-	msg->newMessageFast(_PREHASH_ImprovedInstantMessage);
-	msg->nextBlockFast(_PREHASH_AgentData);
-	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-
-	msg->nextBlockFast(_PREHASH_MessageBlock);
-	msg->addBOOLFast(_PREHASH_FromGroup, FALSE);
-	msg->addUUIDFast(_PREHASH_ToAgentID, other_participant_id);
-	msg->addU8Fast(_PREHASH_Offline, IM_ONLINE);
-	msg->addU8Fast(_PREHASH_Dialog, im_type);
-	msg->addUUIDFast(_PREHASH_ID, temp_session_id);
-	msg->addU32Fast(_PREHASH_Timestamp, NO_TIMESTAMP); // no timestamp necessary
-
-	std::string name;
-	LLAgentUI::buildFullname(name);
-
-	msg->addStringFast(_PREHASH_FromAgentName, name);
-	msg->addStringFast(_PREHASH_Message, LLStringUtil::null);
-	msg->addU32Fast(_PREHASH_ParentEstateID, 0);
-	msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null);
-	msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent());
-}
-
-void start_deprecated_conference_chat(
-	const LLUUID& temp_session_id,
-	const LLUUID& creator_id,
-	const LLUUID& other_participant_id,
-	const LLSD& agents_to_invite)
-{
-	U8* bucket;
-	U8* pos;
-	S32 count;
-	S32 bucket_size;
-
-	// *FIX: this could suffer from endian issues
-	count = agents_to_invite.size();
-	bucket_size = UUID_BYTES * count;
-	bucket = new U8[bucket_size];
-	pos = bucket;
-
-	for(S32 i = 0; i < count; ++i)
-	{
-		LLUUID agent_id = agents_to_invite[i].asUUID();
-		
-		memcpy(pos, &agent_id, UUID_BYTES);
-		pos += UUID_BYTES;
-	}
-
-	session_starter_helper(
-		temp_session_id,
-		other_participant_id,
-		IM_SESSION_CONFERENCE_START);
-
-	gMessageSystem->addBinaryDataFast(
-		_PREHASH_BinaryBucket,
-		bucket,
-		bucket_size);
-
-	gAgent.sendReliableMessage();
- 
-	delete[] bucket;
-}
-
-class LLStartConferenceChatResponder : public LLHTTPClient::Responder
-{
-public:
-	LLStartConferenceChatResponder(
-		const LLUUID& temp_session_id,
-		const LLUUID& creator_id,
-		const LLUUID& other_participant_id,
-		const LLSD& agents_to_invite)
-	{
-		mTempSessionID = temp_session_id;
-		mCreatorID = creator_id;
-		mOtherParticipantID = other_participant_id;
-		mAgents = agents_to_invite;
-	}
-
-	virtual void error(U32 statusNum, const std::string& reason)
-	{
-		//try an "old school" way.
-		if ( statusNum == 400 )
-		{
-			start_deprecated_conference_chat(
-				mTempSessionID,
-				mCreatorID,
-				mOtherParticipantID,
-				mAgents);
-		}
-
-		//else throw an error back to the client?
-		//in theory we should have just have these error strings
-		//etc. set up in this file as opposed to the IMMgr,
-		//but the error string were unneeded here previously
-		//and it is not worth the effort switching over all
-		//the possible different language translations
-	}
-
-private:
-	LLUUID mTempSessionID;
-	LLUUID mCreatorID;
-	LLUUID mOtherParticipantID;
-
-	LLSD mAgents;
-};
-
-// Returns true if any messages were sent, false otherwise.
-// Is sort of equivalent to "does the server need to do anything?"
-bool LLIMModel::sendStartSession(
-	const LLUUID& temp_session_id,
-	const LLUUID& other_participant_id,
-	const std::vector<LLUUID>& ids,
-	EInstantMessage dialog)
-{
-	if ( dialog == IM_SESSION_GROUP_START )
-	{
-		session_starter_helper(
-			temp_session_id,
-			other_participant_id,
-			dialog);
-		gMessageSystem->addBinaryDataFast(
-				_PREHASH_BinaryBucket,
-				EMPTY_BINARY_BUCKET,
-				EMPTY_BINARY_BUCKET_SIZE);
-		gAgent.sendReliableMessage();
-
-		return true;
-	}
-	else if ( dialog == IM_SESSION_CONFERENCE_START )
-	{
-		LLSD agents;
-		for (int i = 0; i < (S32) ids.size(); i++)
-		{
-			agents.append(ids[i]);
-		}
-
-		//we have a new way of starting conference calls now
-		LLViewerRegion* region = gAgent.getRegion();
-		if (region)
-		{
-			std::string url = region->getCapability(
-				"ChatSessionRequest");
-			LLSD data;
-			data["method"] = "start conference";
-			data["session-id"] = temp_session_id;
-
-			data["params"] = agents;
-
-			LLHTTPClient::post(
-				url,
-				data,
-				new LLStartConferenceChatResponder(
-					temp_session_id,
-					gAgent.getID(),
-					other_participant_id,
-					data["params"]));
-		}
-		else
-		{
-			start_deprecated_conference_chat(
-				temp_session_id,
-				gAgent.getID(),
-				other_participant_id,
-				agents);
-		}
-
-		//we also need to wait for reply from the server in case of ad-hoc chat (we'll get new session id)
-		return true;
-	}
-
-	return false;
-}
-
-// static
-void LLIMModel::sendSessionInitialized(const LLUUID &session_id)
-{
-	LLIMSession* session = getInstance()->findIMSession(session_id);
-	if (session)
-	{
-		LLSD arg;
-		arg["session_id"] = session_id;
-		getInstance()->mSessionInitializedSignal(arg);
-	}
-}
-
-//
-// Helper Functions
-//
-
-class LLViewerChatterBoxInvitationAcceptResponder :
-	public LLHTTPClient::Responder
-{
-public:
-	LLViewerChatterBoxInvitationAcceptResponder(
-		const LLUUID& session_id,
-		LLIMMgr::EInvitationType invitation_type)
-	{
-		mSessionID = session_id;
-		mInvitiationType = invitation_type;
-	}
-
-	void result(const LLSD& content)
-	{
-		if ( gIMMgr)
-		{
-			LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
-			if (speaker_mgr)
-			{
-				//we've accepted our invitation
-				//and received a list of agents that were
-				//currently in the session when the reply was sent
-				//to us.  Now, it is possible that there were some agents
-				//to slip in/out between when that message was sent to us
-				//and now.
-
-				//the agent list updates we've received have been
-				//accurate from the time we were added to the session
-				//but unfortunately, our base that we are receiving here
-				//may not be the most up to date.  It was accurate at
-				//some point in time though.
-				speaker_mgr->setSpeakers(content);
-
-				//we now have our base of users in the session
-				//that was accurate at some point, but maybe not now
-				//so now we apply all of the udpates we've received
-				//in case of race conditions
-				speaker_mgr->updateSpeakers(gIMMgr->getPendingAgentListUpdates(mSessionID));
-			}
-
-			if (LLIMMgr::INVITATION_TYPE_VOICE == mInvitiationType)
-			{
-				gIMMgr->startCall(mSessionID);
-			}
-
-			if ((mInvitiationType == LLIMMgr::INVITATION_TYPE_VOICE 
-				|| mInvitiationType == LLIMMgr::INVITATION_TYPE_IMMEDIATE)
-				&& LLIMModel::getInstance()->findIMSession(mSessionID))
-			{
-				// always open IM window when connecting to voice
-				LLIMFloater::show(mSessionID);
-			}
-
-			gIMMgr->clearPendingAgentListUpdates(mSessionID);
-			gIMMgr->clearPendingInvitation(mSessionID);
-		}
-	}
-
-	void error(U32 statusNum, const std::string& reason)
-	{		
-		//throw something back to the viewer here?
-		if ( gIMMgr )
-		{
-			gIMMgr->clearPendingAgentListUpdates(mSessionID);
-			gIMMgr->clearPendingInvitation(mSessionID);
-			if ( 404 == statusNum )
-			{
-				std::string error_string;
-				error_string = "does not exist";
-				gIMMgr->showSessionStartError(error_string, mSessionID);
-			}
-		}
-	}
-
-private:
-	LLUUID mSessionID;
-	LLIMMgr::EInvitationType mInvitiationType;
-};
-
-
-// the other_participant_id is either an agent_id, a group_id, or an inventory
-// folder item_id (collection of calling cards)
-
-// static
-LLUUID LLIMMgr::computeSessionID(
-	EInstantMessage dialog,
-	const LLUUID& other_participant_id)
-{
-	LLUUID session_id;
-	if (IM_SESSION_GROUP_START == dialog)
-	{
-		// slam group session_id to the group_id (other_participant_id)
-		session_id = other_participant_id;
-	}
-	else if (IM_SESSION_CONFERENCE_START == dialog)
-	{
-		session_id.generate();
-	}
-	else if (IM_SESSION_INVITE == dialog)
-	{
-		// use provided session id for invites
-		session_id = other_participant_id;
-	}
-	else
-	{
-		LLUUID agent_id = gAgent.getID();
-		if (other_participant_id == agent_id)
-		{
-			// if we try to send an IM to ourselves then the XOR would be null
-			// so we just make the session_id the same as the agent_id
-			session_id = agent_id;
-		}
-		else
-		{
-			// peer-to-peer or peer-to-asset session_id is the XOR
-			session_id = other_participant_id ^ agent_id;
-		}
-	}
-	return session_id;
-}
-
-inline LLFloater* getFloaterBySessionID(const LLUUID session_id)
-{
-	LLFloater* floater = NULL;
-	if ( gIMMgr )
-	{
-		floater = dynamic_cast < LLFloater* >
-			( gIMMgr->findFloaterBySession(session_id) );
-	}
-	if ( !floater )
-	{
-		floater = dynamic_cast < LLFloater* >
-			( LLIMFloater::findInstance(session_id) );
-	}
-	return floater;
-}
-
-void
-LLIMMgr::showSessionStartError(
-	const std::string& error_string,
-	const LLUUID session_id)
-{
-	const LLFloater* floater = getFloaterBySessionID (session_id);
-	if (!floater) return;
-
-	LLSD args;
-	args["REASON"] = LLTrans::getString(error_string);
-	args["RECIPIENT"] = floater->getTitle();
-
-	LLSD payload;
-	payload["session_id"] = session_id;
-
-	LLNotifications::instance().add(
-		"ChatterBoxSessionStartError",
-		args,
-		payload,
-		LLIMMgr::onConfirmForceCloseError);
-}
-
-void
-LLIMMgr::showSessionEventError(
-	const std::string& event_string,
-	const std::string& error_string,
-	const LLUUID session_id)
-{
-	const LLFloater* floater = getFloaterBySessionID (session_id);
-	if (!floater) return;
-
-	LLSD args;
-	args["REASON"] =
-		LLTrans::getString(error_string);
-	args["EVENT"] =
-		LLTrans::getString(event_string);
-	args["RECIPIENT"] = floater->getTitle();
-
-	LLNotifications::instance().add(
-		"ChatterBoxSessionEventError",
-		args);
-}
-
-void
-LLIMMgr::showSessionForceClose(
-	const std::string& reason_string,
-	const LLUUID session_id)
-{
-	const LLFloater* floater = getFloaterBySessionID (session_id);
-	if (!floater) return;
-
-	LLSD args;
-
-	args["NAME"] = floater->getTitle();
-	args["REASON"] = LLTrans::getString(reason_string);
-
-	LLSD payload;
-	payload["session_id"] = session_id;
-
-	LLNotifications::instance().add(
-		"ForceCloseChatterBoxSession",
-		args,
-		payload,
-		LLIMMgr::onConfirmForceCloseError);
-}
-
-//static
-bool
-LLIMMgr::onConfirmForceCloseError(
-	const LLSD& notification,
-	const LLSD& response)
-{
-	//only 1 option really
-	LLUUID session_id = notification["payload"]["session_id"];
-
-	LLFloater* floater = getFloaterBySessionID (session_id);
-	if ( floater )
-	{
-		floater->closeFloater(FALSE);
-	}
-	return false;
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLOutgoingCallDialog
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-LLOutgoingCallDialog::LLOutgoingCallDialog(const LLSD& payload) :
-	LLDockableFloater(NULL, false, payload),
-	mPayload(payload)
-{
-}
-
-void LLOutgoingCallDialog::getAllowedRect(LLRect& rect)
-{
-	rect = gViewerWindow->getWorldViewRectRaw();
-}
-
-void LLOutgoingCallDialog::onOpen(const LLSD& key)
-{
-	// tell the user which voice channel they are leaving
-	if (!mPayload["old_channel_name"].asString().empty())
-	{
-		childSetTextArg("leaving", "[CURRENT_CHAT]", mPayload["old_channel_name"].asString());
-	}
-	else
-	{
-		childSetTextArg("leaving", "[CURRENT_CHAT]", getString("localchat"));
-	}
-
-	std::string callee_name = mPayload["session_name"].asString();
-	if (callee_name == "anonymous")
-	{
-		callee_name = getString("anonymous");
-	}
-	
-	setTitle(callee_name);
-
-	LLSD callee_id = mPayload["other_user_id"];
-	childSetTextArg("calling", "[CALLEE_NAME]", callee_name);
-	childSetTextArg("connecting", "[CALLEE_NAME]", callee_name);
-	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
-	icon->setValue(callee_id);
-}
-
-
-//static
-void LLOutgoingCallDialog::onCancel(void* user_data)
-{
-	LLOutgoingCallDialog* self = (LLOutgoingCallDialog*)user_data;
-
-	if (!gIMMgr)
-		return;
-
-	LLUUID session_id = self->mPayload["session_id"].asUUID();
-	gIMMgr->endCall(session_id);
-	
-	self->closeFloater();
-}
-
-
-BOOL LLOutgoingCallDialog::postBuild()
-{
-	BOOL success = LLDockableFloater::postBuild();
-
-	childSetAction("Cancel", onCancel, this);
-
-	// dock the dialog to the sys well, where other sys messages appear
-	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
-					 this, getDockTongue(), LLDockControl::TOP,
-					 boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1)));
-
-	return success;
-}
-
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLIncomingCallDialog
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-LLIncomingCallDialog::LLIncomingCallDialog(const LLSD& payload) :
-	LLDockableFloater(NULL, false, payload),
-	mPayload(payload)
-{
-}
-
-BOOL LLIncomingCallDialog::postBuild()
-{
-	LLDockableFloater::postBuild();
-
-	LLSD caller_id = mPayload["caller_id"];
-	EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
-
-	std::string call_type = getString("VoiceInviteP2P");
-	std::string caller_name = mPayload["caller_name"].asString();
-	if (caller_name == "anonymous")
-	{
-		caller_name = getString("anonymous");
-	}
-	
-	setTitle(caller_name + " " + call_type);
-	
-	// If it is not a P2P invite, then it's an AdHoc invite
-	if ( type != IM_SESSION_P2P_INVITE )
-	{
-		call_type = getString("VoiceInviteAdHoc");
-	}
-
-	// check to see if this is an Avaline call
-	LLUUID session_id = mPayload["session_id"].asUUID();
+/** 
+ * @file LLIMMgr.cpp
+ * @brief Container for Instant Messaging
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llimview.h"
+
+#include "llfloaterreg.h"
+#include "llfontgl.h"
+#include "llrect.h"
+#include "llerror.h"
+#include "llbutton.h"
+#include "llhttpclient.h"
+#include "llsdutil_math.h"
+#include "llstring.h"
+#include "lluictrlfactory.h"
+
+#include "llagent.h"
+#include "llavatariconctrl.h"
+#include "llbottomtray.h"
+#include "llcallingcard.h"
+#include "llchat.h"
+#include "llresmgr.h"
+#include "llfloaterchat.h"
+#include "llfloaterchatterbox.h"
+#include "llavataractions.h"
+#include "llhttpnode.h"
+#include "llimfloater.h"
+#include "llimpanel.h"
+#include "llresizebar.h"
+#include "lltabcontainer.h"
+#include "llviewercontrol.h"
+#include "llfloater.h"
+#include "llmutelist.h"
+#include "llresizehandle.h"
+#include "llkeyboard.h"
+#include "llui.h"
+#include "llviewermenu.h"
+#include "llcallingcard.h"
+#include "lltoolbar.h"
+#include "llviewermessage.h"
+#include "llviewerwindow.h"
+#include "llnotify.h"
+#include "llviewerregion.h"
+#include "llvoicechannel.h"
+#include "lltrans.h"
+#include "llrecentpeople.h"
+#include "llsyswellwindow.h"
+
+#include "llfirstuse.h"
+#include "llagentui.h"
+
+//
+// Globals
+//
+LLIMMgr* gIMMgr = NULL;
+
+//
+// Statics
+//
+// *FIXME: make these all either UIStrings or Strings
+
+const static std::string IM_SEPARATOR(": ");
+
+
+void toast_callback(const LLSD& msg){
+	// do not show toast in busy mode or it goes from agent
+	if (gAgent.getBusy() || gAgent.getID() == msg["from_id"])
+	{
+		return;
+	}
+
+	// check whether incoming IM belongs to an active session or not
+	if (LLIMModel::getInstance()->getActiveSessionID() == msg["session_id"])
+	{
+		return;
+	}
+
+	// Skip toasting for system messages
+	if (msg["from_id"].asUUID() == LLUUID::null)
+	{
+		return;
+	}
+
+	LLSD args;
+	args["MESSAGE"] = msg["message"];
+	args["TIME"] = msg["time"];
+	args["FROM"] = msg["from"];
+	args["FROM_ID"] = msg["from_id"];
+	args["SESSION_ID"] = msg["session_id"];
+
+	LLNotifications::instance().add("IMToast", args, LLSD(), boost::bind(&LLIMFloater::show, msg["session_id"].asUUID()));
+}
+
+void LLIMModel::setActiveSessionID(const LLUUID& session_id)
+{
+	// check if such an ID really exists
+	if (!findIMSession(session_id))
+	{
+		llwarns << "Trying to set as active a non-existent session!" << llendl;
+		return;
+	}
+
+	mActiveSessionID = session_id;
+}
+
+LLIMModel::LLIMModel() 
+{
+	addNewMsgCallback(LLIMFloater::newIMCallback);
+	addNewMsgCallback(toast_callback);
+}
+
+LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
+:	mSessionID(session_id),
+	mName(name),
+	mType(type),
+	mNumUnread(0),
+	mOtherParticipantID(other_participant_id),
+	mInitialTargetIDs(ids),
+	mVoiceChannel(NULL),
+	mSpeakers(NULL),
+	mSessionInitialized(false),
+	mCallBackEnabled(true),
+	mTextIMPossible(true),
+	mOtherParticipantIsAvatar(true)
+{
+	if (IM_NOTHING_SPECIAL == type || IM_SESSION_P2P_INVITE == type)
+	{
+		mVoiceChannel  = new LLVoiceChannelP2P(session_id, name, other_participant_id);
+	}
+	else
+	{
+		mVoiceChannel = new LLVoiceChannelGroup(session_id, name);
+	}
+	mSpeakers = new LLIMSpeakerMgr(mVoiceChannel);
+
+	// All participants will be added to the list of people we've recently interacted with.
+	mSpeakers->addListener(&LLRecentPeople::instance(), "add");
+
+	//we need to wait for session initialization for outgoing ad-hoc and group chat session
+	//correct session id for initiated ad-hoc chat will be received from the server
+	if (!LLIMModel::getInstance()->sendStartSession(mSessionID, mOtherParticipantID, 
+		mInitialTargetIDs, mType))
+	{
+		//we don't need to wait for any responses
+		//so we're already initialized
+		mSessionInitialized = true;
+	}
+
+	if (IM_NOTHING_SPECIAL == type)
+	{
+		mCallBackEnabled = LLVoiceClient::getInstance()->isSessionCallBackPossible(mSessionID);
+		mTextIMPossible = LLVoiceClient::getInstance()->isSessionTextIMPossible(mSessionID);
+		mOtherParticipantIsAvatar = LLVoiceClient::getInstance()->isParticipantAvatar(mSessionID);
+	}
+
+	if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") )
+		LLLogChat::loadHistory(mName, &chatFromLogFile, (void *)this);
+}
+
+LLIMModel::LLIMSession::~LLIMSession()
+{
+	delete mSpeakers;
+	mSpeakers = NULL;
+
+	// End the text IM session if necessary
+	if(gVoiceClient && mOtherParticipantID.notNull())
+	{
+		switch(mType)
+		{
+		case IM_NOTHING_SPECIAL:
+		case IM_SESSION_P2P_INVITE:
+			gVoiceClient->endUserIMSession(mOtherParticipantID);
+			break;
+
+		default:
+			// Appease the linux compiler
+			break;
+		}
+	}
+
+	// HAVE to do this here -- if it happens in the LLVoiceChannel destructor it will call the wrong version (since the object's partially deconstructed at that point).
+	mVoiceChannel->deactivate();
+	
+	delete mVoiceChannel;
+	mVoiceChannel = NULL;
+}
+
+void LLIMModel::LLIMSession::sessionInitReplyReceived(const LLUUID& new_session_id)
+{
+	mSessionInitialized = true;
+
+	if (new_session_id != mSessionID)
+	{
+		mSessionID = new_session_id;
+		mVoiceChannel->updateSessionID(new_session_id);
+	}
+}
+
+void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time)
+{
+	LLSD message;
+	message["from"] = from;
+	message["from_id"] = from_id;
+	message["message"] = utf8_text;
+	message["time"] = time; 
+	message["index"] = (LLSD::Integer)mMsgs.size(); 
+
+	mMsgs.push_front(message); 
+
+	if (mSpeakers && from_id.notNull())
+	{
+		mSpeakers->speakerChatted(from_id);
+		mSpeakers->setSpeakerTyping(from_id, FALSE);
+	}
+}
+
+void LLIMModel::LLIMSession::chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata)
+{
+	if (!userdata) return;
+
+	LLIMSession* self = (LLIMSession*) userdata;
+
+	if (type == LLLogChat::LOG_LINE)
+	{
+		self->addMessage("", LLSD(), msg["message"].asString(), "");
+	}
+	else if (type == LLLogChat::LOG_LLSD)
+	{
+		self->addMessage(msg["from"].asString(), msg["from_id"].asUUID(), msg["message"].asString(), msg["time"].asString());
+	}
+}
+
+LLIMModel::LLIMSession* LLIMModel::findIMSession(const LLUUID& session_id) const
+{
+	return get_if_there(mId2SessionMap, session_id,
+		(LLIMModel::LLIMSession*) NULL);
+}
+
+void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id)
+{
+	LLIMSession* session = findIMSession(old_session_id);
+	if (session)
+	{
+		session->sessionInitReplyReceived(new_session_id);
+
+		if (old_session_id != new_session_id)
+		{
+			mId2SessionMap.erase(old_session_id);
+			mId2SessionMap[new_session_id] = session;
+
+			gIMMgr->notifyObserverSessionIDUpdated(old_session_id, new_session_id);
+		}
+
+		LLIMFloater* im_floater = LLIMFloater::findInstance(old_session_id);
+		if (im_floater)
+		{
+			im_floater->sessionInitReplyReceived(new_session_id);
+		}
+	}
+
+	//*TODO remove this "floater" stuff when Communicate Floater is gone
+	LLFloaterIMPanel* floater = gIMMgr->findFloaterBySession(old_session_id);
+	if (floater)
+	{
+		floater->sessionInitReplyReceived(new_session_id);
+	}
+}
+
+void LLIMModel::testMessages()
+{
+	LLUUID bot1_id("d0426ec6-6535-4c11-a5d9-526bb0c654d9");
+	LLUUID bot1_session_id;
+	std::string from = "IM Tester";
+
+	bot1_session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, bot1_id);
+	newSession(bot1_session_id, from, IM_NOTHING_SPECIAL, bot1_id);
+	addMessage(bot1_session_id, from, bot1_id, "Test Message: Hi from testerbot land!");
+
+	LLUUID bot2_id;
+	std::string firstname[] = {"Roflcopter", "Joe"};
+	std::string lastname[] = {"Linden", "Tester", "Resident", "Schmoe"};
+
+	S32 rand1 = ll_rand(sizeof firstname)/(sizeof firstname[0]);
+	S32 rand2 = ll_rand(sizeof lastname)/(sizeof lastname[0]);
+	
+	from = firstname[rand1] + " " + lastname[rand2];
+	bot2_id.generate(from);
+	LLUUID bot2_session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, bot2_id);
+	newSession(bot2_session_id, from, IM_NOTHING_SPECIAL, bot2_id);
+	addMessage(bot2_session_id, from, bot2_id, "Test Message: Hello there, I have a question. Can I bother you for a second? ");
+	addMessage(bot2_session_id, from, bot2_id, "Test Message: OMGWTFBBQ.");
+}
+
+
+bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, 
+						   const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
+{
+	if (findIMSession(session_id))
+	{
+		llwarns << "IM Session " << session_id << " already exists" << llendl;
+		return false;
+	}
+
+	LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids);
+	mId2SessionMap[session_id] = session;
+
+	LLIMMgr::getInstance()->notifyObserverSessionAdded(session_id, name, other_participant_id);
+
+	return true;
+
+}
+
+bool LLIMModel::clearSession(const LLUUID& session_id)
+{
+	if (mId2SessionMap.find(session_id) == mId2SessionMap.end()) return false;
+	delete (mId2SessionMap[session_id]);
+	mId2SessionMap.erase(session_id);
+	return true;
+}
+
+void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index)
+{
+	LLIMSession* session = findIMSession(session_id);
+	if (!session) 
+	{
+		llwarns << "session " << session_id << "does not exist " << llendl;
+		return;
+	}
+
+	int i = session->mMsgs.size() - start_index;
+
+	for (std::list<LLSD>::iterator iter = session->mMsgs.begin(); 
+		iter != session->mMsgs.end() && i > 0;
+		iter++)
+	{
+		LLSD msg;
+		msg = *iter;
+		messages.push_back(*iter);
+		i--;
+	}
+
+	session->mNumUnread = 0;
+	
+	LLSD arg;
+	arg["session_id"] = session_id;
+	arg["num_unread"] = 0;
+	mNoUnreadMsgsSignal(arg);
+}
+
+bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text) {
+	
+	LLIMSession* session = findIMSession(session_id);
+
+	if (!session) 
+	{
+		llwarns << "session " << session_id << "does not exist " << llendl;
+		return false;
+	}
+
+	session->addMessage(from, from_id, utf8_text, LLLogChat::timestamp(false)); //might want to add date separately
+
+	return true;
+}
+
+bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
+{
+	S32 im_log_option =  gSavedPerAccountSettings.getS32("IMLogOptions");
+	if (im_log_option != LOG_CHAT)
+	{
+		if(im_log_option == LOG_BOTH_TOGETHER)
+		{
+			LLLogChat::saveHistory(std::string("chat"), from, from_id, utf8_text);
+			return true;
+		}
+		else
+		{
+			LLLogChat::saveHistory(LLIMModel::getInstance()->getName(session_id), from, from_id, utf8_text);
+			return true;
+		}
+	}
+	return false;
+}
+
+bool LLIMModel::proccessOnlineOfflineNotification(
+	const LLUUID& session_id, 
+	const std::string& utf8_text)
+{
+	// Add message to old one floater
+	LLFloaterIMPanel *floater = gIMMgr->findFloaterBySession(session_id);
+	if ( floater )
+	{
+		if ( !utf8_text.empty() )
+		{
+			floater->addHistoryLine(utf8_text, LLUIColorTable::instance().getColor("SystemChatColor"));
+		}
+	}
+	// Add system message to history
+	return addMessage(session_id, SYSTEM_FROM, LLUUID::null, utf8_text);
+}
+
+bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, 
+						   const std::string& utf8_text, bool log2file /* = true */) { 
+	LLIMSession* session = findIMSession(session_id);
+
+	if (!session) 
+	{
+		llwarns << "session " << session_id << "does not exist " << llendl;
+		return false;
+	}
+
+	addToHistory(session_id, from, from_id, utf8_text);
+	if (log2file) logToFile(session_id, from, from_id, utf8_text);
+
+	session->mNumUnread++;
+
+	// notify listeners
+	LLSD arg;
+	arg["session_id"] = session_id;
+	arg["num_unread"] = session->mNumUnread;
+	arg["message"] = utf8_text;
+	arg["from"] = from;
+	arg["from_id"] = from_id;
+	arg["time"] = LLLogChat::timestamp(false);
+	mNewMsgSignal(arg);
+
+	return true;
+}
+
+
+const std::string& LLIMModel::getName(const LLUUID& session_id) const
+{
+	LLIMSession* session = findIMSession(session_id);
+
+	if (!session) 
+	{
+		llwarns << "session " << session_id << "does not exist " << llendl;
+		return LLStringUtil::null;
+	}
+
+	return session->mName;
+}
+
+const S32 LLIMModel::getNumUnread(const LLUUID& session_id) const
+{
+	LLIMSession* session = findIMSession(session_id);
+	if (!session)
+	{
+		llwarns << "session " << session_id << "does not exist " << llendl;
+		return -1;
+	}
+
+	return session->mNumUnread;
+}
+
+const LLUUID& LLIMModel::getOtherParticipantID(const LLUUID& session_id) const
+{
+	LLIMSession* session = findIMSession(session_id);
+	if (!session)
+	{
+		llwarns << "session " << session_id << "does not exist " << llendl;
+		return LLUUID::null;
+	}
+
+	return session->mOtherParticipantID;
+}
+
+EInstantMessage LLIMModel::getType(const LLUUID& session_id) const
+{
+	LLIMSession* session = findIMSession(session_id);
+	if (!session)
+	{
+		llwarns << "session " << session_id << "does not exist " << llendl;
+		return IM_COUNT;
+	}
+
+	return session->mType;
+}
+
+LLVoiceChannel* LLIMModel::getVoiceChannel( const LLUUID& session_id ) const
+{
+	LLIMSession* session = findIMSession(session_id);
+	if (!session)
+	{
+		llwarns << "session " << session_id << "does not exist " << llendl;
+		return NULL;
+	}
+
+	return session->mVoiceChannel;
+}
+
+LLIMSpeakerMgr* LLIMModel::getSpeakerManager( const LLUUID& session_id ) const
+{
+	LLIMSession* session = findIMSession(session_id);
+	if (!session)
+	{
+		llwarns << "session " << session_id << "does not exist " << llendl;
+		return NULL;
+	}
+
+	return session->mSpeakers;
+}
+
+
+// TODO get rid of other participant ID
+void LLIMModel::sendTypingState(LLUUID session_id, LLUUID other_participant_id, BOOL typing) 
+{
+	std::string name;
+	LLAgentUI::buildFullname(name);
+
+	pack_instant_message(
+		gMessageSystem,
+		gAgent.getID(),
+		FALSE,
+		gAgent.getSessionID(),
+		other_participant_id,
+		name,
+		std::string("typing"),
+		IM_ONLINE,
+		(typing ? IM_TYPING_START : IM_TYPING_STOP),
+		session_id);
+	gAgent.sendReliableMessage();
+}
+
+void LLIMModel::sendLeaveSession(const LLUUID& session_id, const LLUUID& other_participant_id)
+{
+	if(session_id.notNull())
+	{
+		std::string name;
+		LLAgentUI::buildFullname(name);
+		pack_instant_message(
+			gMessageSystem,
+			gAgent.getID(),
+			FALSE,
+			gAgent.getSessionID(),
+			other_participant_id,
+			name, 
+			LLStringUtil::null,
+			IM_ONLINE,
+			IM_SESSION_LEAVE,
+			session_id);
+		gAgent.sendReliableMessage();
+	}
+}
+
+//*TODO this method is better be moved to the LLIMMgr
+void LLIMModel::sendMessage(const std::string& utf8_text,
+					 const LLUUID& im_session_id,
+					 const LLUUID& other_participant_id,
+					 EInstantMessage dialog)
+{
+	std::string name;
+	bool sent = false;
+	LLAgentUI::buildFullname(name);
+
+	const LLRelationship* info = NULL;
+	info = LLAvatarTracker::instance().getBuddyInfo(other_participant_id);
+	
+	U8 offline = (!info || info->isOnline()) ? IM_ONLINE : IM_OFFLINE;
+	
+	if((offline == IM_OFFLINE) && (LLVoiceClient::getInstance()->isOnlineSIP(other_participant_id)))
+	{
+		// User is online through the OOW connector, but not with a regular viewer.  Try to send the message via SLVoice.
+		sent = gVoiceClient->sendTextMessage(other_participant_id, utf8_text);
+	}
+	
+	if(!sent)
+	{
+		// Send message normally.
+
+		// default to IM_SESSION_SEND unless it's nothing special - in
+		// which case it's probably an IM to everyone.
+		U8 new_dialog = dialog;
+
+		if ( dialog != IM_NOTHING_SPECIAL )
+		{
+			new_dialog = IM_SESSION_SEND;
+		}
+		pack_instant_message(
+			gMessageSystem,
+			gAgent.getID(),
+			FALSE,
+			gAgent.getSessionID(),
+			other_participant_id,
+			name.c_str(),
+			utf8_text.c_str(),
+			offline,
+			(EInstantMessage)new_dialog,
+			im_session_id);
+		gAgent.sendReliableMessage();
+	}
+
+	// If there is a mute list and this is not a group chat...
+	if ( LLMuteList::getInstance() )
+	{
+		// ... the target should not be in our mute list for some message types.
+		// Auto-remove them if present.
+		switch( dialog )
+		{
+		case IM_NOTHING_SPECIAL:
+		case IM_GROUP_INVITATION:
+		case IM_INVENTORY_OFFERED:
+		case IM_SESSION_INVITE:
+		case IM_SESSION_P2P_INVITE:
+		case IM_SESSION_CONFERENCE_START:
+		case IM_SESSION_SEND: // This one is marginal - erring on the side of hearing.
+		case IM_LURE_USER:
+		case IM_GODLIKE_LURE_USER:
+		case IM_FRIENDSHIP_OFFERED:
+			LLMuteList::getInstance()->autoRemove(other_participant_id, LLMuteList::AR_IM);
+			break;
+		default: ; // do nothing
+		}
+	}
+
+	if((dialog == IM_NOTHING_SPECIAL) && 
+	   (other_participant_id.notNull()))
+	{
+		// Do we have to replace the /me's here?
+		std::string from;
+		LLAgentUI::buildFullname(from);
+		LLIMModel::getInstance()->addMessage(im_session_id, from, gAgentID, utf8_text);
+
+		//local echo for the legacy communicate panel
+		std::string history_echo;
+		LLAgentUI::buildFullname(history_echo);
+
+		history_echo += ": " + utf8_text;
+
+		LLFloaterIMPanel* floater = gIMMgr->findFloaterBySession(im_session_id);
+		if (floater) floater->addHistoryLine(history_echo, LLUIColorTable::instance().getColor("IMChatColor"), true, gAgent.getID());
+
+		LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(im_session_id);
+		if (speaker_mgr)
+		{
+			speaker_mgr->speakerChatted(gAgentID);
+			speaker_mgr->setSpeakerTyping(gAgentID, FALSE);
+		}
+	}
+
+	// Add the recipient to the recent people list.
+	LLRecentPeople::instance().add(other_participant_id);
+}
+
+void session_starter_helper(
+	const LLUUID& temp_session_id,
+	const LLUUID& other_participant_id,
+	EInstantMessage im_type)
+{
+	LLMessageSystem *msg = gMessageSystem;
+
+	msg->newMessageFast(_PREHASH_ImprovedInstantMessage);
+	msg->nextBlockFast(_PREHASH_AgentData);
+	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+
+	msg->nextBlockFast(_PREHASH_MessageBlock);
+	msg->addBOOLFast(_PREHASH_FromGroup, FALSE);
+	msg->addUUIDFast(_PREHASH_ToAgentID, other_participant_id);
+	msg->addU8Fast(_PREHASH_Offline, IM_ONLINE);
+	msg->addU8Fast(_PREHASH_Dialog, im_type);
+	msg->addUUIDFast(_PREHASH_ID, temp_session_id);
+	msg->addU32Fast(_PREHASH_Timestamp, NO_TIMESTAMP); // no timestamp necessary
+
+	std::string name;
+	LLAgentUI::buildFullname(name);
+
+	msg->addStringFast(_PREHASH_FromAgentName, name);
+	msg->addStringFast(_PREHASH_Message, LLStringUtil::null);
+	msg->addU32Fast(_PREHASH_ParentEstateID, 0);
+	msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null);
+	msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent());
+}
+
+void start_deprecated_conference_chat(
+	const LLUUID& temp_session_id,
+	const LLUUID& creator_id,
+	const LLUUID& other_participant_id,
+	const LLSD& agents_to_invite)
+{
+	U8* bucket;
+	U8* pos;
+	S32 count;
+	S32 bucket_size;
+
+	// *FIX: this could suffer from endian issues
+	count = agents_to_invite.size();
+	bucket_size = UUID_BYTES * count;
+	bucket = new U8[bucket_size];
+	pos = bucket;
+
+	for(S32 i = 0; i < count; ++i)
+	{
+		LLUUID agent_id = agents_to_invite[i].asUUID();
+		
+		memcpy(pos, &agent_id, UUID_BYTES);
+		pos += UUID_BYTES;
+	}
+
+	session_starter_helper(
+		temp_session_id,
+		other_participant_id,
+		IM_SESSION_CONFERENCE_START);
+
+	gMessageSystem->addBinaryDataFast(
+		_PREHASH_BinaryBucket,
+		bucket,
+		bucket_size);
+
+	gAgent.sendReliableMessage();
+ 
+	delete[] bucket;
+}
+
+class LLStartConferenceChatResponder : public LLHTTPClient::Responder
+{
+public:
+	LLStartConferenceChatResponder(
+		const LLUUID& temp_session_id,
+		const LLUUID& creator_id,
+		const LLUUID& other_participant_id,
+		const LLSD& agents_to_invite)
+	{
+		mTempSessionID = temp_session_id;
+		mCreatorID = creator_id;
+		mOtherParticipantID = other_participant_id;
+		mAgents = agents_to_invite;
+	}
+
+	virtual void error(U32 statusNum, const std::string& reason)
+	{
+		//try an "old school" way.
+		if ( statusNum == 400 )
+		{
+			start_deprecated_conference_chat(
+				mTempSessionID,
+				mCreatorID,
+				mOtherParticipantID,
+				mAgents);
+		}
+
+		//else throw an error back to the client?
+		//in theory we should have just have these error strings
+		//etc. set up in this file as opposed to the IMMgr,
+		//but the error string were unneeded here previously
+		//and it is not worth the effort switching over all
+		//the possible different language translations
+	}
+
+private:
+	LLUUID mTempSessionID;
+	LLUUID mCreatorID;
+	LLUUID mOtherParticipantID;
+
+	LLSD mAgents;
+};
+
+// Returns true if any messages were sent, false otherwise.
+// Is sort of equivalent to "does the server need to do anything?"
+bool LLIMModel::sendStartSession(
+	const LLUUID& temp_session_id,
+	const LLUUID& other_participant_id,
+	const std::vector<LLUUID>& ids,
+	EInstantMessage dialog)
+{
+	if ( dialog == IM_SESSION_GROUP_START )
+	{
+		session_starter_helper(
+			temp_session_id,
+			other_participant_id,
+			dialog);
+		gMessageSystem->addBinaryDataFast(
+				_PREHASH_BinaryBucket,
+				EMPTY_BINARY_BUCKET,
+				EMPTY_BINARY_BUCKET_SIZE);
+		gAgent.sendReliableMessage();
+
+		return true;
+	}
+	else if ( dialog == IM_SESSION_CONFERENCE_START )
+	{
+		LLSD agents;
+		for (int i = 0; i < (S32) ids.size(); i++)
+		{
+			agents.append(ids[i]);
+		}
+
+		//we have a new way of starting conference calls now
+		LLViewerRegion* region = gAgent.getRegion();
+		if (region)
+		{
+			std::string url = region->getCapability(
+				"ChatSessionRequest");
+			LLSD data;
+			data["method"] = "start conference";
+			data["session-id"] = temp_session_id;
+
+			data["params"] = agents;
+
+			LLHTTPClient::post(
+				url,
+				data,
+				new LLStartConferenceChatResponder(
+					temp_session_id,
+					gAgent.getID(),
+					other_participant_id,
+					data["params"]));
+		}
+		else
+		{
+			start_deprecated_conference_chat(
+				temp_session_id,
+				gAgent.getID(),
+				other_participant_id,
+				agents);
+		}
+
+		//we also need to wait for reply from the server in case of ad-hoc chat (we'll get new session id)
+		return true;
+	}
+
+	return false;
+}
+
+// static
+void LLIMModel::sendSessionInitialized(const LLUUID &session_id)
+{
+	LLIMSession* session = getInstance()->findIMSession(session_id);
+	if (session)
+	{
+		LLSD arg;
+		arg["session_id"] = session_id;
+		getInstance()->mSessionInitializedSignal(arg);
+	}
+}
+
+//
+// Helper Functions
+//
+
+class LLViewerChatterBoxInvitationAcceptResponder :
+	public LLHTTPClient::Responder
+{
+public:
+	LLViewerChatterBoxInvitationAcceptResponder(
+		const LLUUID& session_id,
+		LLIMMgr::EInvitationType invitation_type)
+	{
+		mSessionID = session_id;
+		mInvitiationType = invitation_type;
+	}
+
+	void result(const LLSD& content)
+	{
+		if ( gIMMgr)
+		{
+			LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+			if (speaker_mgr)
+			{
+				//we've accepted our invitation
+				//and received a list of agents that were
+				//currently in the session when the reply was sent
+				//to us.  Now, it is possible that there were some agents
+				//to slip in/out between when that message was sent to us
+				//and now.
+
+				//the agent list updates we've received have been
+				//accurate from the time we were added to the session
+				//but unfortunately, our base that we are receiving here
+				//may not be the most up to date.  It was accurate at
+				//some point in time though.
+				speaker_mgr->setSpeakers(content);
+
+				//we now have our base of users in the session
+				//that was accurate at some point, but maybe not now
+				//so now we apply all of the udpates we've received
+				//in case of race conditions
+				speaker_mgr->updateSpeakers(gIMMgr->getPendingAgentListUpdates(mSessionID));
+			}
+
+			if (LLIMMgr::INVITATION_TYPE_VOICE == mInvitiationType)
+			{
+				gIMMgr->startCall(mSessionID);
+			}
+
+			if ((mInvitiationType == LLIMMgr::INVITATION_TYPE_VOICE 
+				|| mInvitiationType == LLIMMgr::INVITATION_TYPE_IMMEDIATE)
+				&& LLIMModel::getInstance()->findIMSession(mSessionID))
+			{
+				// always open IM window when connecting to voice
+				LLIMFloater::show(mSessionID);
+			}
+
+			gIMMgr->clearPendingAgentListUpdates(mSessionID);
+			gIMMgr->clearPendingInvitation(mSessionID);
+		}
+	}
+
+	void error(U32 statusNum, const std::string& reason)
+	{		
+		//throw something back to the viewer here?
+		if ( gIMMgr )
+		{
+			gIMMgr->clearPendingAgentListUpdates(mSessionID);
+			gIMMgr->clearPendingInvitation(mSessionID);
+			if ( 404 == statusNum )
+			{
+				std::string error_string;
+				error_string = "does not exist";
+				gIMMgr->showSessionStartError(error_string, mSessionID);
+			}
+		}
+	}
+
+private:
+	LLUUID mSessionID;
+	LLIMMgr::EInvitationType mInvitiationType;
+};
+
+
+// the other_participant_id is either an agent_id, a group_id, or an inventory
+// folder item_id (collection of calling cards)
+
+// static
+LLUUID LLIMMgr::computeSessionID(
+	EInstantMessage dialog,
+	const LLUUID& other_participant_id)
+{
+	LLUUID session_id;
+	if (IM_SESSION_GROUP_START == dialog)
+	{
+		// slam group session_id to the group_id (other_participant_id)
+		session_id = other_participant_id;
+	}
+	else if (IM_SESSION_CONFERENCE_START == dialog)
+	{
+		session_id.generate();
+	}
+	else if (IM_SESSION_INVITE == dialog)
+	{
+		// use provided session id for invites
+		session_id = other_participant_id;
+	}
+	else
+	{
+		LLUUID agent_id = gAgent.getID();
+		if (other_participant_id == agent_id)
+		{
+			// if we try to send an IM to ourselves then the XOR would be null
+			// so we just make the session_id the same as the agent_id
+			session_id = agent_id;
+		}
+		else
+		{
+			// peer-to-peer or peer-to-asset session_id is the XOR
+			session_id = other_participant_id ^ agent_id;
+		}
+	}
+	return session_id;
+}
+
+inline LLFloater* getFloaterBySessionID(const LLUUID session_id)
+{
+	LLFloater* floater = NULL;
+	if ( gIMMgr )
+	{
+		floater = dynamic_cast < LLFloater* >
+			( gIMMgr->findFloaterBySession(session_id) );
+	}
+	if ( !floater )
+	{
+		floater = dynamic_cast < LLFloater* >
+			( LLIMFloater::findInstance(session_id) );
+	}
+	return floater;
+}
+
+void
+LLIMMgr::showSessionStartError(
+	const std::string& error_string,
+	const LLUUID session_id)
+{
+	const LLFloater* floater = getFloaterBySessionID (session_id);
+	if (!floater) return;
+
+	LLSD args;
+	args["REASON"] = LLTrans::getString(error_string);
+	args["RECIPIENT"] = floater->getTitle();
+
+	LLSD payload;
+	payload["session_id"] = session_id;
+
+	LLNotifications::instance().add(
+		"ChatterBoxSessionStartError",
+		args,
+		payload,
+		LLIMMgr::onConfirmForceCloseError);
+}
+
+void
+LLIMMgr::showSessionEventError(
+	const std::string& event_string,
+	const std::string& error_string,
+	const LLUUID session_id)
+{
+	const LLFloater* floater = getFloaterBySessionID (session_id);
+	if (!floater) return;
+
+	LLSD args;
+	args["REASON"] =
+		LLTrans::getString(error_string);
+	args["EVENT"] =
+		LLTrans::getString(event_string);
+	args["RECIPIENT"] = floater->getTitle();
+
+	LLNotifications::instance().add(
+		"ChatterBoxSessionEventError",
+		args);
+}
+
+void
+LLIMMgr::showSessionForceClose(
+	const std::string& reason_string,
+	const LLUUID session_id)
+{
+	const LLFloater* floater = getFloaterBySessionID (session_id);
+	if (!floater) return;
+
+	LLSD args;
+
+	args["NAME"] = floater->getTitle();
+	args["REASON"] = LLTrans::getString(reason_string);
+
+	LLSD payload;
+	payload["session_id"] = session_id;
+
+	LLNotifications::instance().add(
+		"ForceCloseChatterBoxSession",
+		args,
+		payload,
+		LLIMMgr::onConfirmForceCloseError);
+}
+
+//static
+bool
+LLIMMgr::onConfirmForceCloseError(
+	const LLSD& notification,
+	const LLSD& response)
+{
+	//only 1 option really
+	LLUUID session_id = notification["payload"]["session_id"];
+
+	LLFloater* floater = getFloaterBySessionID (session_id);
+	if ( floater )
+	{
+		floater->closeFloater(FALSE);
+	}
+	return false;
+}
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLOutgoingCallDialog
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LLOutgoingCallDialog::LLOutgoingCallDialog(const LLSD& payload) :
+	LLDockableFloater(NULL, false, payload),
+	mPayload(payload)
+{
+}
+
+void LLOutgoingCallDialog::getAllowedRect(LLRect& rect)
+{
+	rect = gViewerWindow->getWorldViewRectScaled();
+}
+
+void LLOutgoingCallDialog::onOpen(const LLSD& key)
+{
+	// tell the user which voice channel they are leaving
+	if (!mPayload["old_channel_name"].asString().empty())
+	{
+		childSetTextArg("leaving", "[CURRENT_CHAT]", mPayload["old_channel_name"].asString());
+	}
+	else
+	{
+		childSetTextArg("leaving", "[CURRENT_CHAT]", getString("localchat"));
+	}
+
+	std::string callee_name = mPayload["session_name"].asString();
+	if (callee_name == "anonymous")
+	{
+		callee_name = getString("anonymous");
+	}
+	
+	setTitle(callee_name);
+
+	LLSD callee_id = mPayload["other_user_id"];
+	childSetTextArg("calling", "[CALLEE_NAME]", callee_name);
+	childSetTextArg("connecting", "[CALLEE_NAME]", callee_name);
+	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
+	icon->setValue(callee_id);
+}
+
+
+//static
+void LLOutgoingCallDialog::onCancel(void* user_data)
+{
+	LLOutgoingCallDialog* self = (LLOutgoingCallDialog*)user_data;
+
+	if (!gIMMgr)
+		return;
+
+	LLUUID session_id = self->mPayload["session_id"].asUUID();
+	gIMMgr->endCall(session_id);
+	
+	self->closeFloater();
+}
+
+
+BOOL LLOutgoingCallDialog::postBuild()
+{
+	BOOL success = LLDockableFloater::postBuild();
+
+	childSetAction("Cancel", onCancel, this);
+
+	// dock the dialog to the sys well, where other sys messages appear
+	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
+					 this, getDockTongue(), LLDockControl::TOP,
+					 boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1)));
+
+	return success;
+}
+
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLIncomingCallDialog
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LLIncomingCallDialog::LLIncomingCallDialog(const LLSD& payload) :
+	LLDockableFloater(NULL, false, payload),
+	mPayload(payload)
+{
+}
+
+BOOL LLIncomingCallDialog::postBuild()
+{
+	LLDockableFloater::postBuild();
+
+	LLSD caller_id = mPayload["caller_id"];
+	EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
+
+	std::string call_type = getString("VoiceInviteP2P");
+	std::string caller_name = mPayload["caller_name"].asString();
+	if (caller_name == "anonymous")
+	{
+		caller_name = getString("anonymous");
+	}
+	
+	setTitle(caller_name + " " + call_type);
+	
+	// If it is not a P2P invite, then it's an AdHoc invite
+	if ( type != IM_SESSION_P2P_INVITE )
+	{
+		call_type = getString("VoiceInviteAdHoc");
+	}
+
+	// check to see if this is an Avaline call
+	LLUUID session_id = mPayload["session_id"].asUUID();
 	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
-	childSetVisible("Start IM", is_avatar); // no IM for avaline
-
-	LLUICtrl* caller_name_widget = getChild<LLUICtrl>("caller name");
-	caller_name_widget->setValue(caller_name + " " + call_type);
-	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
-	icon->setValue(caller_id);
-
-	childSetAction("Accept", onAccept, this);
-	childSetAction("Reject", onReject, this);
-	childSetAction("Start IM", onStartIM, this);
-	childSetFocus("Accept");
-
-	return TRUE;
-}
-
-void LLIncomingCallDialog::getAllowedRect(LLRect& rect)
-{
-	rect = gViewerWindow->getWorldViewRectRaw();
-}
-
-void LLIncomingCallDialog::onOpen(const LLSD& key)
-{
-	// tell the user which voice channel they would be leaving
-	LLVoiceChannel *voice = LLVoiceChannel::getCurrentVoiceChannel();
-	if (voice && !voice->getSessionName().empty())
-	{
-		childSetTextArg("question", "[CURRENT_CHAT]", voice->getSessionName());
-	}
-	else
-	{
-		childSetTextArg("question", "[CURRENT_CHAT]", getString("localchat"));
-	}
-
-	// dock the dialog to the sys well, where other sys messages appear
-	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
-									 this, getDockTongue(), LLDockControl::TOP,
-									 boost::bind(&LLIncomingCallDialog::getAllowedRect, this, _1)));
-}
-
-//static
-void LLIncomingCallDialog::onAccept(void* user_data)
-{
-	LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data;
-	self->processCallResponse(0);
-	self->closeFloater();
-}
-
-//static
-void LLIncomingCallDialog::onReject(void* user_data)
-{
-	LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data;
-	self->processCallResponse(1);
-	self->closeFloater();
-}
-
-//static
-void LLIncomingCallDialog::onStartIM(void* user_data)
-{
-	LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data;
-	self->processCallResponse(2);
-	self->closeFloater();
-}
-
-void LLIncomingCallDialog::processCallResponse(S32 response)
-{
-	if (!gIMMgr)
-		return;
-
-	LLUUID session_id = mPayload["session_id"].asUUID();
-	EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
-	LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)mPayload["inv_type"].asInteger();
-	bool voice = true;
-	switch(response)
-	{
-	case 2: // start IM: just don't start the voice chat
-	{
-		voice = false;
-		/* FALLTHROUGH */
-	}
-	case 0: // accept
-	{
-		if (type == IM_SESSION_P2P_INVITE)
-		{
-			// create a normal IM session
-			session_id = gIMMgr->addP2PSession(
-				mPayload["session_name"].asString(),
-				mPayload["caller_id"].asUUID(),
-				mPayload["session_handle"].asString());
-
-			if (voice)
-			{
-				if (gIMMgr->startCall(session_id))
-				{
-					// always open IM window when connecting to voice
-					LLIMFloater::show(session_id);
-				}
-			}
-
-			gIMMgr->clearPendingAgentListUpdates(session_id);
-			gIMMgr->clearPendingInvitation(session_id);
-		}
-		else
-		{
-			LLUUID session_id = gIMMgr->addSession(
-				mPayload["session_name"].asString(),
-				type,
-				session_id);
-			if (session_id != LLUUID::null)
-			{
-				LLIMFloater::show(session_id);
-			}
-
-			std::string url = gAgent.getRegion()->getCapability(
-				"ChatSessionRequest");
-
-			if (voice)
-			{
-				LLSD data;
-				data["method"] = "accept invitation";
-				data["session-id"] = session_id;
-				LLHTTPClient::post(
-					url,
-					data,
-					new LLViewerChatterBoxInvitationAcceptResponder(
-						session_id,
-						inv_type));
-			}
-		}
-		if (voice)
-		{
-			break;
-		}
-	}
-	case 1: // decline
-	{
-		if (type == IM_SESSION_P2P_INVITE)
-		{
-			if(gVoiceClient)
-			{
-				std::string s = mPayload["session_handle"].asString();
-				gVoiceClient->declineInvite(s);
-			}
-		}
-		else
-		{
-			std::string url = gAgent.getRegion()->getCapability(
-				"ChatSessionRequest");
-
-			LLSD data;
-			data["method"] = "decline invitation";
-			data["session-id"] = session_id;
-			LLHTTPClient::post(
-				url,
-				data,
-				NULL);
-		}
-	}
-
-	gIMMgr->clearPendingAgentListUpdates(session_id);
-	gIMMgr->clearPendingInvitation(session_id);
-	}
-}
-
-bool inviteUserResponse(const LLSD& notification, const LLSD& response)
-{
-	if (!gIMMgr)
-		return false;
-
-	const LLSD& payload = notification["payload"];
-	LLUUID session_id = payload["session_id"].asUUID();
-	EInstantMessage type = (EInstantMessage)payload["type"].asInteger();
-	LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)payload["inv_type"].asInteger();
-	S32 option = LLNotification::getSelectedOption(notification, response);
-	switch(option) 
-	{
-	case 0: // accept
-		{
-			if (type == IM_SESSION_P2P_INVITE)
-			{
-				// create a normal IM session
-				session_id = gIMMgr->addP2PSession(
-					payload["session_name"].asString(),
-					payload["caller_id"].asUUID(),
-					payload["session_handle"].asString(),
-					payload["session_uri"].asString());
-
-				if (gIMMgr->startCall(session_id))
-				{
-					// always open IM window when connecting to voice
-					LLIMFloater::show(session_id);
-				}
-
-				gIMMgr->clearPendingAgentListUpdates(session_id);
-				gIMMgr->clearPendingInvitation(session_id);
-			}
-			else
-			{
-				LLUUID session_id = gIMMgr->addSession(
-					payload["session_name"].asString(),
-					type,
-					session_id);
-				if (session_id != LLUUID::null)
-				{
-					LLIMFloater::show(session_id);
-				}
-
-				std::string url = gAgent.getRegion()->getCapability(
-					"ChatSessionRequest");
-
-				LLSD data;
-				data["method"] = "accept invitation";
-				data["session-id"] = session_id;
-				LLHTTPClient::post(
-					url,
-					data,
-					new LLViewerChatterBoxInvitationAcceptResponder(
-						session_id,
-						inv_type));
-			}
-		}
-		break;
-	case 2: // mute (also implies ignore, so this falls through to the "ignore" case below)
-	{
-		// mute the sender of this invite
-		if (!LLMuteList::getInstance()->isMuted(payload["caller_id"].asUUID()))
-		{
-			LLMute mute(payload["caller_id"].asUUID(), payload["caller_name"].asString(), LLMute::AGENT);
-			LLMuteList::getInstance()->add(mute);
-		}
-	}
-	/* FALLTHROUGH */
-	
-	case 1: // decline
-	{
-		if (type == IM_SESSION_P2P_INVITE)
-		{
-			if(gVoiceClient)
-			{
-				std::string s = payload["session_handle"].asString();
-				gVoiceClient->declineInvite(s);
-			}
-		}
-		else
-		{
-			std::string url = gAgent.getRegion()->getCapability(
-				"ChatSessionRequest");
-
-			LLSD data;
-			data["method"] = "decline invitation";
-			data["session-id"] = session_id;
-			LLHTTPClient::post(
-				url,
-				data,
-				NULL);				
-		}
-	}
-
-	gIMMgr->clearPendingAgentListUpdates(session_id);
-	gIMMgr->clearPendingInvitation(session_id);
-	break;
-	}
-	
-	return false;
-}
-
-//
-// Member Functions
-//
-
-LLIMMgr::LLIMMgr() :
-	mIMReceived(FALSE)
-{
-	mPendingInvitations = LLSD::emptyMap();
-	mPendingAgentListUpdates = LLSD::emptyMap();
-}
-
-// Add a message to a session. 
-void LLIMMgr::addMessage(
-	const LLUUID& session_id,
-	const LLUUID& target_id,
-	const std::string& from,
-	const std::string& msg,
-	const std::string& session_name,
-	EInstantMessage dialog,
-	U32 parent_estate_id,
-	const LLUUID& region_id,
-	const LLVector3& position,
-	bool link_name) // If this is true, then we insert the name and link it to a profile
-{
-	LLUUID other_participant_id = target_id;
-
-	// don't process muted IMs
-	if (LLMuteList::getInstance()->isMuted(
-			other_participant_id,
-			LLMute::flagTextChat) && !LLMuteList::getInstance()->isLinden(from))
-	{
-		return;
-	}
-
-	LLFloaterIMPanel* floater;
-	LLUUID new_session_id = session_id;
-	if (new_session_id.isNull())
-	{
-		//no session ID...compute new one
-		new_session_id = computeSessionID(dialog, other_participant_id);
-	}
-
-	//*NOTE session_name is empty in case of incoming P2P sessions
-	std::string fixed_session_name = from;
-	if(!session_name.empty() && session_name.size()>1)
-	{
-		fixed_session_name = session_name;
-	}
-
-	bool new_session = !hasSession(new_session_id);
-	if (new_session)
-	{
-		LLIMModel::getInstance()->newSession(new_session_id, fixed_session_name, dialog, other_participant_id);
-	}
-
-	floater = findFloaterBySession(new_session_id);
-	if (!floater)
-	{
-		floater = findFloaterBySession(other_participant_id);
-		if (floater)
-		{
-			llinfos << "found the IM session " << session_id 
-				<< " by participant " << other_participant_id << llendl;
-		}
-	}
-
-	// create IM window as necessary
-	if(!floater)
-	{
-		floater = createFloater(
-			new_session_id,
-			other_participant_id,
-			fixed_session_name,
-			dialog,
-			FALSE);
-	}
-
-	if (new_session)
-	{
-		// When we get a new IM, and if you are a god, display a bit
-		// of information about the source. This is to help liaisons
-		// when answering questions.
-		if(gAgent.isGodlike())
-		{
-			// *TODO:translate (low priority, god ability)
-			std::ostringstream bonus_info;
-			bonus_info << LLTrans::getString("***")+ " "+ LLTrans::getString("IMParentEstate") + ":" + " "
-				<< parent_estate_id
-				<< ((parent_estate_id == 1) ? "," + LLTrans::getString("IMMainland") : "")
-				<< ((parent_estate_id == 5) ? "," + LLTrans::getString ("IMTeen") : "");
-
-			// once we have web-services (or something) which returns
-			// information about a region id, we can print this out
-			// and even have it link to map-teleport or something.
-			//<< "*** region_id: " << region_id << std::endl
-			//<< "*** position: " << position << std::endl;
-
-			floater->addHistoryLine(bonus_info.str(), LLUIColorTable::instance().getColor("SystemChatColor"));
-			LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, bonus_info.str());
-		}
-
-		make_ui_sound("UISndNewIncomingIMSession");
-	}
-
-	// now add message to floater
-	bool is_from_system = target_id.isNull() || (from == SYSTEM_FROM);
-	const LLColor4& color = ( is_from_system ? 
-							  LLUIColorTable::instance().getColor("SystemChatColor") : 
-							  LLUIColorTable::instance().getColor("IMChatColor"));
-	if ( !link_name )
-	{
-		floater->addHistoryLine(msg,color); // No name to prepend, so just add the message normally
-	}
-	else
-	{
-		floater->addHistoryLine(msg, color, true, other_participant_id, from); // Insert linked name to front of message
-	}
-
-	LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg);
-
-	if( !LLFloaterReg::instanceVisible("communicate") && !floater->getVisible())
-	{
-		LLFloaterChatterBox* chat_floater = LLFloaterChatterBox::getInstance();
-		
-		//if the IM window is not open and the floater is not visible (i.e. not torn off)
-		LLFloater* previouslyActiveFloater = chat_floater->getActiveFloater();
-
-		// select the newly added floater (or the floater with the new line added to it).
-		// it should be there.
-		chat_floater->selectFloater(floater);
-
-		//there was a previously unseen IM, make that old tab flashing
-		//it is assumed that the most recently unseen IM tab is the one current selected/active
-		if ( previouslyActiveFloater && getIMReceived() )
-		{
-			chat_floater->setFloaterFlashing(previouslyActiveFloater, TRUE);
-		}
-
-		//notify of a new IM
-		notifyNewIM();
-	}
-}
-
-void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& message_name, const LLSD& args)
-{
-	LLUIString message;
-	
-	// null session id means near me (chat history)
-	if (session_id.isNull())
-	{
-		message = LLTrans::getString(message_name);
-		message.setArgs(args);
-
-		LLChat chat(message);
-		chat.mSourceType = CHAT_SOURCE_SYSTEM;
-		LLFloaterChat::addChatHistory(chat);
-	}
-	else // going to IM session
-	{
-		if (hasSession(session_id))
-		{
-			message = LLTrans::getString(message_name + "-im");
-			message.setArgs(args);
-			gIMMgr->addMessage(session_id, LLUUID::null, SYSTEM_FROM, message.getString());
-		}
-	}
-}
-
-void LLIMMgr::notifyNewIM()
-{
-	if(!LLFloaterReg::instanceVisible("communicate"))
-	{
-		mIMReceived = TRUE;
-	}
-}
-
-S32 LLIMMgr::getNumberOfUnreadIM()
-{
-	std::map<LLUUID, LLIMModel::LLIMSession*>::iterator it;
-	
-	S32 num = 0;
-	for(it = LLIMModel::getInstance()->mId2SessionMap.begin(); it != LLIMModel::getInstance()->mId2SessionMap.end(); ++it)
-	{
-		num += (*it).second->mNumUnread;
-	}
-
-	return num;
-}
-
-void LLIMMgr::clearNewIMNotification()
-{
-	mIMReceived = FALSE;
-}
-
-BOOL LLIMMgr::getIMReceived() const
-{
-	return mIMReceived;
-}
-
-LLUUID LLIMMgr::addP2PSession(const std::string& name,
-							const LLUUID& other_participant_id,
-							const std::string& voice_session_handle,
-							const std::string& caller_uri)
-{
-	LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id);
-	if (session_id != LLUUID::null)
-	{
-		LLIMFloater::show(session_id);
-	}
-
-	LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
-	if (speaker_mgr)
-	{
-		LLVoiceChannelP2P* voice_channel = dynamic_cast<LLVoiceChannelP2P*>(speaker_mgr->getVoiceChannel());
-		if (voice_channel)
-		{
-			voice_channel->setSessionHandle(voice_session_handle, caller_uri);
-		}
-	}
-	return session_id;
-}
-
-// This adds a session to the talk view. The name is the local name of
-// the session, dialog specifies the type of session. If the session
-// exists, it is brought forward.  Specifying id = NULL results in an
-// im session to everyone. Returns the uuid of the session.
-LLUUID LLIMMgr::addSession(
-	const std::string& name,
-	EInstantMessage dialog,
-	const LLUUID& other_participant_id)
-{
-	LLDynamicArray<LLUUID> ids;
-	ids.put(other_participant_id);
-	return addSession(name, dialog, other_participant_id, ids);
-}
-
-// Adds a session using the given session_id.  If the session already exists 
-// the dialog type is assumed correct. Returns the uuid of the session.
-LLUUID LLIMMgr::addSession(
-	const std::string& name,
-	EInstantMessage dialog,
-	const LLUUID& other_participant_id,
-	const LLDynamicArray<LLUUID>& ids)
-{
-	if (0 == ids.getLength())
-	{
-		return LLUUID::null;
-	}
-
-	LLUUID session_id = computeSessionID(dialog,other_participant_id);
-
-	bool new_session = !LLIMModel::getInstance()->findIMSession(session_id);
-
-	if (new_session)
-	{
-		LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids);
-	}
-
-
-	//*TODO remove this "floater" thing when Communicate Floater's gone
-	LLFloaterIMPanel* floater = findFloaterBySession(session_id);
-	if(!floater)
-	{
-		// On creation, use the first element of ids as the
-		// "other_participant_id"
-		floater = createFloater(
-			session_id,
-			other_participant_id,
-			name,
-			dialog,
-			TRUE,
-			ids);
-	}
-
-	//we don't need to show notes about online/offline, mute/unmute users' statuses for existing sessions
-	if (!new_session) return session_id;
-	
-	noteOfflineUsers(session_id, floater, ids);
-
-	// Only warn for regular IMs - not group IMs
-	if( dialog == IM_NOTHING_SPECIAL )
-	{
-		noteMutedUsers(session_id, floater, ids);
-	}
-
-	return session_id;
-}
-
-bool LLIMMgr::leaveSession(const LLUUID& session_id)
-{
-	LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id);
-	if (!im_session) return false;
-
-	LLIMModel::getInstance()->sendLeaveSession(session_id, im_session->mOtherParticipantID);
-	gIMMgr->removeSession(session_id);
-	return true;
-}
-
-// Removes data associated with a particular session specified by session_id
-void LLIMMgr::removeSession(const LLUUID& session_id)
-{
-	llassert_always(hasSession(session_id));
-	
-	//*TODO remove this floater thing when Communicate Floater is being deleted (IB)
-	LLFloaterIMPanel* floater = findFloaterBySession(session_id);
-	if(floater)
-	{
-		mFloaters.erase(floater->getHandle());
-		LLFloaterChatterBox::getInstance()->removeFloater(floater);
-	}
-
-	clearPendingInvitation(session_id);
-	clearPendingAgentListUpdates(session_id);
-
-	LLIMModel::getInstance()->clearSession(session_id);
-
-	notifyObserverSessionRemoved(session_id);
-}
-
-void LLIMMgr::inviteToSession(
-	const LLUUID& session_id, 
-	const std::string& session_name, 
-	const LLUUID& caller_id, 
-	const std::string& caller_name,
-	EInstantMessage type,
-	EInvitationType inv_type,
-	const std::string& session_handle,
-	const std::string& session_uri)
-{
-	//ignore invites from muted residents
-	if (LLMuteList::getInstance()->isMuted(caller_id))
-	{
-		return;
-	}
-
-	std::string notify_box_type;
-
-	BOOL ad_hoc_invite = FALSE;
-	if(type == IM_SESSION_P2P_INVITE)
-	{
-		//P2P is different...they only have voice invitations
-		notify_box_type = "VoiceInviteP2P";
-	}
-	else if ( gAgent.isInGroup(session_id) )
-	{
-		//only really old school groups have voice invitations
-		notify_box_type = "VoiceInviteGroup";
-	}
-	else if ( inv_type == INVITATION_TYPE_VOICE )
-	{
-		//else it's an ad-hoc
-		//and a voice ad-hoc
-		notify_box_type = "VoiceInviteAdHoc";
-		ad_hoc_invite = TRUE;
-	}
-	else if ( inv_type == INVITATION_TYPE_IMMEDIATE )
-	{
-		notify_box_type = "InviteAdHoc";
-		ad_hoc_invite = TRUE;
-	}
-
-	LLSD payload;
-	payload["session_id"] = session_id;
-	payload["session_name"] = session_name;
-	payload["caller_id"] = caller_id;
-	payload["caller_name"] = caller_name;
-	payload["type"] = type;
-	payload["inv_type"] = inv_type;
-	payload["session_handle"] = session_handle;
-	payload["session_uri"] = session_uri;
-	payload["notify_box_type"] = notify_box_type;
-	
-	LLVoiceChannel* channelp = LLVoiceChannel::getChannelByID(session_id);
-	if (channelp && channelp->callStarted())
-	{
-		// you have already started a call to the other user, so just accept the invite
-		LLNotifications::instance().forceResponse(LLNotification::Params("VoiceInviteP2P").payload(payload), 0);
-		return;
-	}
-
-	if (type == IM_SESSION_P2P_INVITE || ad_hoc_invite)
-	{
-		// is the inviter a friend?
-		if (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL)
-		{
-			// if not, and we are ignoring voice invites from non-friends
-			// then silently decline
-			if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly"))
-			{
-				// invite not from a friend, so decline
-				LLNotifications::instance().forceResponse(LLNotification::Params("VoiceInviteP2P").payload(payload), 1);
-				return;
-			}
-		}
-	}
-
-	if ( !mPendingInvitations.has(session_id.asString()) )
-	{
-		if (caller_name.empty())
-		{
-			gCacheName->get(caller_id, FALSE, boost::bind(&LLIMMgr::onInviteNameLookup, payload, _1, _2, _3, _4));
-		}
-		else
-		{
-			if (notify_box_type == "VoiceInviteP2P" || notify_box_type == "VoiceInviteAdHoc")
-			{
-				LLFloaterReg::showInstance("incoming_call", payload, TRUE);
-			}
-			else
-			{
-				LLSD args;
-				args["NAME"] = caller_name;
-				args["GROUP"] = session_name;
-
-				LLNotifications::instance().add(notify_box_type, args, payload, &inviteUserResponse);
-			}
-		}
-		mPendingInvitations[session_id.asString()] = LLSD();
-	}
-}
-
-void LLIMMgr::onInviteNameLookup(LLSD payload, const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group)
-{
-	payload["caller_name"] = first + " " + last;
-	payload["session_name"] = payload["caller_name"].asString();
-
-	std::string notify_box_type = payload["notify_box_type"].asString();
-
-	if (notify_box_type == "VoiceInviteP2P" || notify_box_type == "VoiceInviteAdHoc")
-	{
-		LLFloaterReg::showInstance("incoming_call", payload, TRUE);
-	}
-	else
-	{
-		LLSD args;
-		args["NAME"] = payload["caller_name"].asString();
-	
-		LLNotifications::instance().add(
-			payload["notify_box_type"].asString(),
-			args, 
-			payload,
-			&inviteUserResponse);
-	}
-}
-
-void LLIMMgr::disconnectAllSessions()
-{
-	LLFloaterIMPanel* floater = NULL;
-	std::set<LLHandle<LLFloater> >::iterator handle_it;
-	for(handle_it = mFloaters.begin();
-		handle_it != mFloaters.end();
-		)
-	{
-		floater = (LLFloaterIMPanel*)handle_it->get();
-
-		// MUST do this BEFORE calling floater->onClose() because that may remove the item from the set, causing the subsequent increment to crash.
-		++handle_it;
-
-		if (floater)
-		{
-			floater->setEnabled(FALSE);
-			floater->closeFloater(TRUE);
-		}
-	}
-}
-
-
-// This method returns the im panel corresponding to the uuid
-// provided. The uuid can either be a session id or an agent
-// id. Returns NULL if there is no matching panel.
-LLFloaterIMPanel* LLIMMgr::findFloaterBySession(const LLUUID& session_id)
-{
-	LLFloaterIMPanel* rv = NULL;
-	std::set<LLHandle<LLFloater> >::iterator handle_it;
-	for(handle_it = mFloaters.begin();
-		handle_it != mFloaters.end();
-		++handle_it)
-	{
-		rv = (LLFloaterIMPanel*)handle_it->get();
-		if(rv && session_id == rv->getSessionID())
-		{
-			break;
-		}
-		rv = NULL;
-	}
-	return rv;
-}
-
-
-BOOL LLIMMgr::hasSession(const LLUUID& session_id)
-{
-	return LLIMModel::getInstance()->findIMSession(session_id) != NULL;
-}
-
-void LLIMMgr::clearPendingInvitation(const LLUUID& session_id)
-{
-	if ( mPendingInvitations.has(session_id.asString()) )
-	{
-		mPendingInvitations.erase(session_id.asString());
-	}
-}
-
-void LLIMMgr::processAgentListUpdates(const LLUUID& session_id, const LLSD& body)
-{
-	LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
-	if ( im_floater )
-	{
-		im_floater->processAgentListUpdates(body);
-	}
-	LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
-	if (speaker_mgr)
-	{
-		speaker_mgr->updateSpeakers(body);
-	}
-	else
-	{
-		//we don't have a speaker manager yet..something went wrong
-		//we are probably receiving an update here before
-		//a start or an acceptance of an invitation.  Race condition.
-		gIMMgr->addPendingAgentListUpdates(
-			session_id,
-			body);
-	}
-}
-
-LLSD LLIMMgr::getPendingAgentListUpdates(const LLUUID& session_id)
-{
-	if ( mPendingAgentListUpdates.has(session_id.asString()) )
-	{
-		return mPendingAgentListUpdates[session_id.asString()];
-	}
-	else
-	{
-		return LLSD();
-	}
-}
-
-void LLIMMgr::addPendingAgentListUpdates(
-	const LLUUID& session_id,
-	const LLSD& updates)
-{
-	LLSD::map_const_iterator iter;
-
-	if ( !mPendingAgentListUpdates.has(session_id.asString()) )
-	{
-		//this is a new agent list update for this session
-		mPendingAgentListUpdates[session_id.asString()] = LLSD::emptyMap();
-	}
-
-	if (
-		updates.has("agent_updates") &&
-		updates["agent_updates"].isMap() &&
-		updates.has("updates") &&
-		updates["updates"].isMap() )
-	{
-		//new school update
-		LLSD update_types = LLSD::emptyArray();
-		LLSD::array_iterator array_iter;
-
-		update_types.append("agent_updates");
-		update_types.append("updates");
-
-		for (
-			array_iter = update_types.beginArray();
-			array_iter != update_types.endArray();
-			++array_iter)
-		{
-			//we only want to include the last update for a given agent
-			for (
-				iter = updates[array_iter->asString()].beginMap();
-				iter != updates[array_iter->asString()].endMap();
-				++iter)
-			{
-				mPendingAgentListUpdates[session_id.asString()][array_iter->asString()][iter->first] =
-					iter->second;
-			}
-		}
-	}
-	else if (
-		updates.has("updates") &&
-		updates["updates"].isMap() )
-	{
-		//old school update where the SD contained just mappings
-		//of agent_id -> "LEAVE"/"ENTER"
-
-		//only want to keep last update for each agent
-		for (
-			iter = updates["updates"].beginMap();
-			iter != updates["updates"].endMap();
-			++iter)
-		{
-			mPendingAgentListUpdates[session_id.asString()]["updates"][iter->first] =
-				iter->second;
-		}
-	}
-}
-
-void LLIMMgr::clearPendingAgentListUpdates(const LLUUID& session_id)
-{
-	if ( mPendingAgentListUpdates.has(session_id.asString()) )
-	{
-		mPendingAgentListUpdates.erase(session_id.asString());
-	}
-}
-
-void LLIMMgr::notifyObserverSessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
-{
-	for (session_observers_list_t::iterator it = mSessionObservers.begin(); it != mSessionObservers.end(); it++)
-	{
-		(*it)->sessionAdded(session_id, name, other_participant_id);
-	}
-}
-
-void LLIMMgr::notifyObserverSessionRemoved(const LLUUID& session_id)
-{
-	for (session_observers_list_t::iterator it = mSessionObservers.begin(); it != mSessionObservers.end(); it++)
-	{
-		(*it)->sessionRemoved(session_id);
-	}
-}
-
-void LLIMMgr::notifyObserverSessionIDUpdated( const LLUUID& old_session_id, const LLUUID& new_session_id )
-{
-	for (session_observers_list_t::iterator it = mSessionObservers.begin(); it != mSessionObservers.end(); it++)
-	{
-		(*it)->sessionIDUpdated(old_session_id, new_session_id);
-	}
-
-}
-
-void LLIMMgr::addSessionObserver(LLIMSessionObserver *observer)
-{
-	mSessionObservers.push_back(observer);
-}
-
-void LLIMMgr::removeSessionObserver(LLIMSessionObserver *observer)
-{
-	mSessionObservers.remove(observer);
-}
-
-bool LLIMMgr::startCall(const LLUUID& session_id)
-{
-	LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(session_id);
-	if (!voice_channel) return false;
-	
-	voice_channel->activate();
-	return true;
-}
-
-bool LLIMMgr::endCall(const LLUUID& session_id)
-{
-	LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(session_id);
-	if (!voice_channel) return false;
-
-	voice_channel->deactivate();
-	return true;
-}
-
-// create a floater and update internal representation for
-// consistency. Returns the pointer, caller (the class instance since
-// it is a private method) is not responsible for deleting the
-// pointer.  Add the floater to this but do not select it.
-LLFloaterIMPanel* LLIMMgr::createFloater(
-	const LLUUID& session_id,
-	const LLUUID& other_participant_id,
-	const std::string& session_label,
-	EInstantMessage dialog,
-	BOOL user_initiated,
-	const LLDynamicArray<LLUUID>& ids)
-{
-	if (session_id.isNull())
-	{
-		llwarns << "Creating LLFloaterIMPanel with null session ID" << llendl;
-	}
-
-	llinfos << "LLIMMgr::createFloater: from " << other_participant_id 
-			<< " in session " << session_id << llendl;
-	LLFloaterIMPanel* floater = new LLFloaterIMPanel(session_label,
-													 session_id,
-													 other_participant_id,
-													 ids,
-													 dialog);
-	LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END;
-	LLFloaterChatterBox::getInstance()->addFloater(floater, FALSE, i_pt);
-	mFloaters.insert(floater->getHandle());
-	return floater;
-}
-
-void LLIMMgr::noteOfflineUsers(
-	const LLUUID& session_id,
-	LLFloaterIMPanel* floater,
-	const LLDynamicArray<LLUUID>& ids)
-{
-	S32 count = ids.count();
-	if(count == 0)
-	{
-		const std::string& only_user = LLTrans::getString("only_user_message");
-		if (floater)
-		{
-			floater->addHistoryLine(only_user, LLUIColorTable::instance().getColor("SystemChatColor"));
-		}
-		LLIMModel::getInstance()->addMessage(session_id, SYSTEM_FROM, LLUUID::null, only_user);
-	}
-	else
-	{
-		const LLRelationship* info = NULL;
-		LLAvatarTracker& at = LLAvatarTracker::instance();
-		LLIMModel& im_model = LLIMModel::instance();
-		for(S32 i = 0; i < count; ++i)
-		{
-			info = at.getBuddyInfo(ids.get(i));
-			std::string first, last;
-			if(info && !info->isOnline()
-			   && gCacheName->getName(ids.get(i), first, last))
-			{
-				LLUIString offline = LLTrans::getString("offline_message");
-				offline.setArg("[FIRST]", first);
-				offline.setArg("[LAST]", last);
-				im_model.proccessOnlineOfflineNotification(session_id, offline);
-			}
-		}
-	}
-}
-
-void LLIMMgr::noteMutedUsers(const LLUUID& session_id, LLFloaterIMPanel* floater,
-								  const LLDynamicArray<LLUUID>& ids)
-{
-	// Don't do this if we don't have a mute list.
-	LLMuteList *ml = LLMuteList::getInstance();
-	if( !ml )
-	{
-		return;
-	}
-
-	S32 count = ids.count();
-	if(count > 0)
-	{
-		LLIMModel* im_model = LLIMModel::getInstance();
-		
-		for(S32 i = 0; i < count; ++i)
-		{
-			if( ml->isMuted(ids.get(i)) )
-			{
-				LLUIString muted = LLTrans::getString("muted_message");
-
-				//*TODO remove this "floater" thing when Communicate Floater's gone
-				floater->addHistoryLine(muted);
-
-				im_model->addMessage(session_id, SYSTEM_FROM, LLUUID::null, muted);
-				break;
-			}
-		}
-	}
-}
-
-void LLIMMgr::processIMTypingStart(const LLIMInfo* im_info)
-{
-	processIMTypingCore(im_info, TRUE);
-}
-
-void LLIMMgr::processIMTypingStop(const LLIMInfo* im_info)
-{
-	processIMTypingCore(im_info, FALSE);
-}
-
-void LLIMMgr::processIMTypingCore(const LLIMInfo* im_info, BOOL typing)
-{
-	LLUUID session_id = computeSessionID(im_info->mIMType, im_info->mFromID);
-	LLFloaterIMPanel* floater = findFloaterBySession(session_id);
-	if (floater)
-	{
-		floater->processIMTyping(im_info, typing);
-	}
-
-	LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
-	if ( im_floater )
-	{
-		im_floater->processIMTyping(im_info, typing);
-	}
-}
-
-class LLViewerChatterBoxSessionStartReply : public LLHTTPNode
-{
-public:
-	virtual void describe(Description& desc) const
-	{
-		desc.shortInfo("Used for receiving a reply to a request to initialize an ChatterBox session");
-		desc.postAPI();
-		desc.input(
-			"{\"client_session_id\": UUID, \"session_id\": UUID, \"success\" boolean, \"reason\": string");
-		desc.source(__FILE__, __LINE__);
-	}
-
-	virtual void post(ResponsePtr response,
-					  const LLSD& context,
-					  const LLSD& input) const
-	{
-		LLSD body;
-		LLUUID temp_session_id;
-		LLUUID session_id;
-		bool success;
-
-		body = input["body"];
-		success = body["success"].asBoolean();
-		temp_session_id = body["temp_session_id"].asUUID();
-
-		if ( success )
-		{
-			session_id = body["session_id"].asUUID();
-
-			LLIMModel::getInstance()->processSessionInitializedReply(temp_session_id, session_id);
-
-			LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
-			if (speaker_mgr)
-			{
-				speaker_mgr->setSpeakers(body);
-				speaker_mgr->updateSpeakers(gIMMgr->getPendingAgentListUpdates(session_id));
-			}
-
-			LLFloaterIMPanel* floaterp = gIMMgr->findFloaterBySession(session_id);
-			if (floaterp)
-			{
-				if ( body.has("session_info") )
-				{
-					floaterp->processSessionUpdate(body["session_info"]);
-				}
-			}
-
-			LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
-			if ( im_floater )
-			{
-				if ( body.has("session_info") )
-				{
-					im_floater->processSessionUpdate(body["session_info"]);
-				}
-			}
-
-			gIMMgr->clearPendingAgentListUpdates(session_id);
-		}
-		else
-		{
-			//throw an error dialog and close the temp session's floater
-			gIMMgr->showSessionStartError(body["error"].asString(), temp_session_id);
-		}
-
-		gIMMgr->clearPendingAgentListUpdates(session_id);
-	}
-};
-
-class LLViewerChatterBoxSessionEventReply : public LLHTTPNode
-{
-public:
-	virtual void describe(Description& desc) const
-	{
-		desc.shortInfo("Used for receiving a reply to a ChatterBox session event");
-		desc.postAPI();
-		desc.input(
-			"{\"event\": string, \"reason\": string, \"success\": boolean, \"session_id\": UUID");
-		desc.source(__FILE__, __LINE__);
-	}
-
-	virtual void post(ResponsePtr response,
-					  const LLSD& context,
-					  const LLSD& input) const
-	{
-		LLUUID session_id;
-		bool success;
-
-		LLSD body = input["body"];
-		success = body["success"].asBoolean();
-		session_id = body["session_id"].asUUID();
-
-		if ( !success )
-		{
-			//throw an error dialog
-			gIMMgr->showSessionEventError(
-				body["event"].asString(),
-				body["error"].asString(),
-				session_id);
-		}
-	}
-};
-
-class LLViewerForceCloseChatterBoxSession: public LLHTTPNode
-{
-public:
-	virtual void post(ResponsePtr response,
-					  const LLSD& context,
-					  const LLSD& input) const
-	{
-		LLUUID session_id;
-		std::string reason;
-
-		session_id = input["body"]["session_id"].asUUID();
-		reason = input["body"]["reason"].asString();
-
-		gIMMgr->showSessionForceClose(reason, session_id);
-	}
-};
-
-class LLViewerChatterBoxSessionAgentListUpdates : public LLHTTPNode
-{
-public:
-	virtual void post(
-		ResponsePtr responder,
-		const LLSD& context,
-		const LLSD& input) const
-	{
-		const LLUUID& session_id = input["body"]["session_id"].asUUID();
-		gIMMgr->processAgentListUpdates(session_id, input["body"]);
-	}
-};
-
-class LLViewerChatterBoxSessionUpdate : public LLHTTPNode
-{
-public:
-	virtual void post(
-		ResponsePtr responder,
-		const LLSD& context,
-		const LLSD& input) const
-	{
-		LLUUID session_id = input["body"]["session_id"].asUUID();
-		LLFloaterIMPanel* floaterp = gIMMgr->findFloaterBySession(session_id);
-		if (floaterp)
-		{
-			floaterp->processSessionUpdate(input["body"]["info"]);
-		}
-		LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
-		if ( im_floater )
-		{
-			im_floater->processSessionUpdate(input["body"]["info"]);
-		}
-	}
-};
-
-
-class LLViewerChatterBoxInvitation : public LLHTTPNode
-{
-public:
-
-	virtual void post(
-		ResponsePtr response,
-		const LLSD& context,
-		const LLSD& input) const
-	{
-		//for backwards compatiblity reasons...we need to still
-		//check for 'text' or 'voice' invitations...bleh
-		if ( input["body"].has("instantmessage") )
-		{
-			LLSD message_params =
-				input["body"]["instantmessage"]["message_params"];
-
-			//do something here to have the IM invite behave
-			//just like a normal IM
-			//this is just replicated code from process_improved_im
-			//and should really go in it's own function -jwolk
-			if (gNoRender)
-			{
-				return;
-			}
-			LLChat chat;
-
-			std::string message = message_params["message"].asString();
-			std::string name = message_params["from_name"].asString();
-			LLUUID from_id = message_params["from_id"].asUUID();
-			LLUUID session_id = message_params["id"].asUUID();
-			std::vector<U8> bin_bucket = message_params["data"]["binary_bucket"].asBinary();
-			U8 offline = (U8)message_params["offline"].asInteger();
-			
-			time_t timestamp =
-				(time_t) message_params["timestamp"].asInteger();
-
-			BOOL is_busy = gAgent.getBusy();
-			BOOL is_muted = LLMuteList::getInstance()->isMuted(
-				from_id,
-				name,
-				LLMute::flagTextChat);
-
-			BOOL is_linden = LLMuteList::getInstance()->isLinden(name);
-			std::string separator_string(": ");
-			
-			chat.mMuted = is_muted && !is_linden;
-			chat.mFromID = from_id;
-			chat.mFromName = name;
-
-			if (!is_linden && (is_busy || is_muted))
-			{
-				return;
-			}
-
-			// standard message, not from system
-			std::string saved;
-			if(offline == IM_OFFLINE)
-			{
-				saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());
-			}
-			std::string buffer = saved + message;
-
-			BOOL is_this_agent = FALSE;
-			if(from_id == gAgentID)
-			{
-				is_this_agent = TRUE;
-			}
-			gIMMgr->addMessage(
-				session_id,
-				from_id,
-				name,
-				buffer,
-				std::string((char*)&bin_bucket[0]),
-				IM_SESSION_INVITE,
-				message_params["parent_estate_id"].asInteger(),
-				message_params["region_id"].asUUID(),
-				ll_vector3_from_sd(message_params["position"]),
-				true);
-
-			chat.mText = std::string("IM: ") + name + separator_string + saved + message;
-			LLFloaterChat::addChat(chat, TRUE, is_this_agent);
-
-			//K now we want to accept the invitation
-			std::string url = gAgent.getRegion()->getCapability(
-				"ChatSessionRequest");
-
-			if ( url != "" )
-			{
-				LLSD data;
-				data["method"] = "accept invitation";
-				data["session-id"] = session_id;
-				LLHTTPClient::post(
-					url,
-					data,
-					new LLViewerChatterBoxInvitationAcceptResponder(
-						session_id,
-						LLIMMgr::INVITATION_TYPE_INSTANT_MESSAGE));
-			}
-		} //end if invitation has instant message
-		else if ( input["body"].has("voice") )
-		{
-			if (gNoRender)
-			{
-				return;
-			}
-			
-			if(!LLVoiceClient::voiceEnabled())
-			{
-				// Don't display voice invites unless the user has voice enabled.
-				return;
-			}
-
-			gIMMgr->inviteToSession(
-				input["body"]["session_id"].asUUID(), 
-				input["body"]["session_name"].asString(), 
-				input["body"]["from_id"].asUUID(),
-				input["body"]["from_name"].asString(),
-				IM_SESSION_INVITE,
-				LLIMMgr::INVITATION_TYPE_VOICE);
-		}
-		else if ( input["body"].has("immediate") )
-		{
-			gIMMgr->inviteToSession(
-				input["body"]["session_id"].asUUID(), 
-				input["body"]["session_name"].asString(), 
-				input["body"]["from_id"].asUUID(),
-				input["body"]["from_name"].asString(),
-				IM_SESSION_INVITE,
-				LLIMMgr::INVITATION_TYPE_IMMEDIATE);
-		}
-	}
-};
-
-LLHTTPRegistration<LLViewerChatterBoxSessionStartReply>
-   gHTTPRegistrationMessageChatterboxsessionstartreply(
-	   "/message/ChatterBoxSessionStartReply");
-
-LLHTTPRegistration<LLViewerChatterBoxSessionEventReply>
-   gHTTPRegistrationMessageChatterboxsessioneventreply(
-	   "/message/ChatterBoxSessionEventReply");
-
-LLHTTPRegistration<LLViewerForceCloseChatterBoxSession>
-    gHTTPRegistrationMessageForceclosechatterboxsession(
-		"/message/ForceCloseChatterBoxSession");
-
-LLHTTPRegistration<LLViewerChatterBoxSessionAgentListUpdates>
-    gHTTPRegistrationMessageChatterboxsessionagentlistupdates(
-	    "/message/ChatterBoxSessionAgentListUpdates");
-
-LLHTTPRegistration<LLViewerChatterBoxSessionUpdate>
-    gHTTPRegistrationMessageChatterBoxSessionUpdate(
-	    "/message/ChatterBoxSessionUpdate");
-
-LLHTTPRegistration<LLViewerChatterBoxInvitation>
-    gHTTPRegistrationMessageChatterBoxInvitation(
-		"/message/ChatterBoxInvitation");
-
+	childSetVisible("Start IM", is_avatar); // no IM for avaline
+
+	LLUICtrl* caller_name_widget = getChild<LLUICtrl>("caller name");
+	caller_name_widget->setValue(caller_name + " " + call_type);
+	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
+	icon->setValue(caller_id);
+
+	childSetAction("Accept", onAccept, this);
+	childSetAction("Reject", onReject, this);
+	childSetAction("Start IM", onStartIM, this);
+	childSetFocus("Accept");
+
+	return TRUE;
+}
+
+void LLIncomingCallDialog::getAllowedRect(LLRect& rect)
+{
+	rect = gViewerWindow->getWorldViewRectScaled();
+}
+
+void LLIncomingCallDialog::onOpen(const LLSD& key)
+{
+	// tell the user which voice channel they would be leaving
+	LLVoiceChannel *voice = LLVoiceChannel::getCurrentVoiceChannel();
+	if (voice && !voice->getSessionName().empty())
+	{
+		childSetTextArg("question", "[CURRENT_CHAT]", voice->getSessionName());
+	}
+	else
+	{
+		childSetTextArg("question", "[CURRENT_CHAT]", getString("localchat"));
+	}
+
+	// dock the dialog to the sys well, where other sys messages appear
+	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
+									 this, getDockTongue(), LLDockControl::TOP,
+									 boost::bind(&LLIncomingCallDialog::getAllowedRect, this, _1)));
+}
+
+//static
+void LLIncomingCallDialog::onAccept(void* user_data)
+{
+	LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data;
+	self->processCallResponse(0);
+	self->closeFloater();
+}
+
+//static
+void LLIncomingCallDialog::onReject(void* user_data)
+{
+	LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data;
+	self->processCallResponse(1);
+	self->closeFloater();
+}
+
+//static
+void LLIncomingCallDialog::onStartIM(void* user_data)
+{
+	LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data;
+	self->processCallResponse(2);
+	self->closeFloater();
+}
+
+void LLIncomingCallDialog::processCallResponse(S32 response)
+{
+	if (!gIMMgr)
+		return;
+
+	LLUUID session_id = mPayload["session_id"].asUUID();
+	EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
+	LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)mPayload["inv_type"].asInteger();
+	bool voice = true;
+	switch(response)
+	{
+	case 2: // start IM: just don't start the voice chat
+	{
+		voice = false;
+		/* FALLTHROUGH */
+	}
+	case 0: // accept
+	{
+		if (type == IM_SESSION_P2P_INVITE)
+		{
+			// create a normal IM session
+			session_id = gIMMgr->addP2PSession(
+				mPayload["session_name"].asString(),
+				mPayload["caller_id"].asUUID(),
+				mPayload["session_handle"].asString());
+
+			if (voice)
+			{
+				if (gIMMgr->startCall(session_id))
+				{
+					// always open IM window when connecting to voice
+					LLIMFloater::show(session_id);
+				}
+			}
+
+			gIMMgr->clearPendingAgentListUpdates(session_id);
+			gIMMgr->clearPendingInvitation(session_id);
+		}
+		else
+		{
+			LLUUID session_id = gIMMgr->addSession(
+				mPayload["session_name"].asString(),
+				type,
+				session_id);
+			if (session_id != LLUUID::null)
+			{
+				LLIMFloater::show(session_id);
+			}
+
+			std::string url = gAgent.getRegion()->getCapability(
+				"ChatSessionRequest");
+
+			if (voice)
+			{
+				LLSD data;
+				data["method"] = "accept invitation";
+				data["session-id"] = session_id;
+				LLHTTPClient::post(
+					url,
+					data,
+					new LLViewerChatterBoxInvitationAcceptResponder(
+						session_id,
+						inv_type));
+			}
+		}
+		if (voice)
+		{
+			break;
+		}
+	}
+	case 1: // decline
+	{
+		if (type == IM_SESSION_P2P_INVITE)
+		{
+			if(gVoiceClient)
+			{
+				std::string s = mPayload["session_handle"].asString();
+				gVoiceClient->declineInvite(s);
+			}
+		}
+		else
+		{
+			std::string url = gAgent.getRegion()->getCapability(
+				"ChatSessionRequest");
+
+			LLSD data;
+			data["method"] = "decline invitation";
+			data["session-id"] = session_id;
+			LLHTTPClient::post(
+				url,
+				data,
+				NULL);
+		}
+	}
+
+	gIMMgr->clearPendingAgentListUpdates(session_id);
+	gIMMgr->clearPendingInvitation(session_id);
+	}
+}
+
+bool inviteUserResponse(const LLSD& notification, const LLSD& response)
+{
+	if (!gIMMgr)
+		return false;
+
+	const LLSD& payload = notification["payload"];
+	LLUUID session_id = payload["session_id"].asUUID();
+	EInstantMessage type = (EInstantMessage)payload["type"].asInteger();
+	LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)payload["inv_type"].asInteger();
+	S32 option = LLNotification::getSelectedOption(notification, response);
+	switch(option) 
+	{
+	case 0: // accept
+		{
+			if (type == IM_SESSION_P2P_INVITE)
+			{
+				// create a normal IM session
+				session_id = gIMMgr->addP2PSession(
+					payload["session_name"].asString(),
+					payload["caller_id"].asUUID(),
+					payload["session_handle"].asString(),
+					payload["session_uri"].asString());
+
+				if (gIMMgr->startCall(session_id))
+				{
+					// always open IM window when connecting to voice
+					LLIMFloater::show(session_id);
+				}
+
+				gIMMgr->clearPendingAgentListUpdates(session_id);
+				gIMMgr->clearPendingInvitation(session_id);
+			}
+			else
+			{
+				LLUUID session_id = gIMMgr->addSession(
+					payload["session_name"].asString(),
+					type,
+					session_id);
+				if (session_id != LLUUID::null)
+				{
+					LLIMFloater::show(session_id);
+				}
+
+				std::string url = gAgent.getRegion()->getCapability(
+					"ChatSessionRequest");
+
+				LLSD data;
+				data["method"] = "accept invitation";
+				data["session-id"] = session_id;
+				LLHTTPClient::post(
+					url,
+					data,
+					new LLViewerChatterBoxInvitationAcceptResponder(
+						session_id,
+						inv_type));
+			}
+		}
+		break;
+	case 2: // mute (also implies ignore, so this falls through to the "ignore" case below)
+	{
+		// mute the sender of this invite
+		if (!LLMuteList::getInstance()->isMuted(payload["caller_id"].asUUID()))
+		{
+			LLMute mute(payload["caller_id"].asUUID(), payload["caller_name"].asString(), LLMute::AGENT);
+			LLMuteList::getInstance()->add(mute);
+		}
+	}
+	/* FALLTHROUGH */
+	
+	case 1: // decline
+	{
+		if (type == IM_SESSION_P2P_INVITE)
+		{
+			if(gVoiceClient)
+			{
+				std::string s = payload["session_handle"].asString();
+				gVoiceClient->declineInvite(s);
+			}
+		}
+		else
+		{
+			std::string url = gAgent.getRegion()->getCapability(
+				"ChatSessionRequest");
+
+			LLSD data;
+			data["method"] = "decline invitation";
+			data["session-id"] = session_id;
+			LLHTTPClient::post(
+				url,
+				data,
+				NULL);				
+		}
+	}
+
+	gIMMgr->clearPendingAgentListUpdates(session_id);
+	gIMMgr->clearPendingInvitation(session_id);
+	break;
+	}
+	
+	return false;
+}
+
+//
+// Member Functions
+//
+
+LLIMMgr::LLIMMgr() :
+	mIMReceived(FALSE)
+{
+	mPendingInvitations = LLSD::emptyMap();
+	mPendingAgentListUpdates = LLSD::emptyMap();
+}
+
+// Add a message to a session. 
+void LLIMMgr::addMessage(
+	const LLUUID& session_id,
+	const LLUUID& target_id,
+	const std::string& from,
+	const std::string& msg,
+	const std::string& session_name,
+	EInstantMessage dialog,
+	U32 parent_estate_id,
+	const LLUUID& region_id,
+	const LLVector3& position,
+	bool link_name) // If this is true, then we insert the name and link it to a profile
+{
+	LLUUID other_participant_id = target_id;
+
+	// don't process muted IMs
+	if (LLMuteList::getInstance()->isMuted(
+			other_participant_id,
+			LLMute::flagTextChat) && !LLMuteList::getInstance()->isLinden(from))
+	{
+		return;
+	}
+
+	LLFloaterIMPanel* floater;
+	LLUUID new_session_id = session_id;
+	if (new_session_id.isNull())
+	{
+		//no session ID...compute new one
+		new_session_id = computeSessionID(dialog, other_participant_id);
+	}
+
+	//*NOTE session_name is empty in case of incoming P2P sessions
+	std::string fixed_session_name = from;
+	if(!session_name.empty() && session_name.size()>1)
+	{
+		fixed_session_name = session_name;
+	}
+
+	bool new_session = !hasSession(new_session_id);
+	if (new_session)
+	{
+		LLIMModel::getInstance()->newSession(new_session_id, fixed_session_name, dialog, other_participant_id);
+	}
+
+	floater = findFloaterBySession(new_session_id);
+	if (!floater)
+	{
+		floater = findFloaterBySession(other_participant_id);
+		if (floater)
+		{
+			llinfos << "found the IM session " << session_id 
+				<< " by participant " << other_participant_id << llendl;
+		}
+	}
+
+	// create IM window as necessary
+	if(!floater)
+	{
+		floater = createFloater(
+			new_session_id,
+			other_participant_id,
+			fixed_session_name,
+			dialog,
+			FALSE);
+	}
+
+	if (new_session)
+	{
+		// When we get a new IM, and if you are a god, display a bit
+		// of information about the source. This is to help liaisons
+		// when answering questions.
+		if(gAgent.isGodlike())
+		{
+			// *TODO:translate (low priority, god ability)
+			std::ostringstream bonus_info;
+			bonus_info << LLTrans::getString("***")+ " "+ LLTrans::getString("IMParentEstate") + ":" + " "
+				<< parent_estate_id
+				<< ((parent_estate_id == 1) ? "," + LLTrans::getString("IMMainland") : "")
+				<< ((parent_estate_id == 5) ? "," + LLTrans::getString ("IMTeen") : "");
+
+			// once we have web-services (or something) which returns
+			// information about a region id, we can print this out
+			// and even have it link to map-teleport or something.
+			//<< "*** region_id: " << region_id << std::endl
+			//<< "*** position: " << position << std::endl;
+
+			floater->addHistoryLine(bonus_info.str(), LLUIColorTable::instance().getColor("SystemChatColor"));
+			LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, bonus_info.str());
+		}
+
+		make_ui_sound("UISndNewIncomingIMSession");
+	}
+
+	// now add message to floater
+	bool is_from_system = target_id.isNull() || (from == SYSTEM_FROM);
+	const LLColor4& color = ( is_from_system ? 
+							  LLUIColorTable::instance().getColor("SystemChatColor") : 
+							  LLUIColorTable::instance().getColor("IMChatColor"));
+	if ( !link_name )
+	{
+		floater->addHistoryLine(msg,color); // No name to prepend, so just add the message normally
+	}
+	else
+	{
+		floater->addHistoryLine(msg, color, true, other_participant_id, from); // Insert linked name to front of message
+	}
+
+	LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg);
+
+	if( !LLFloaterReg::instanceVisible("communicate") && !floater->getVisible())
+	{
+		LLFloaterChatterBox* chat_floater = LLFloaterChatterBox::getInstance();
+		
+		//if the IM window is not open and the floater is not visible (i.e. not torn off)
+		LLFloater* previouslyActiveFloater = chat_floater->getActiveFloater();
+
+		// select the newly added floater (or the floater with the new line added to it).
+		// it should be there.
+		chat_floater->selectFloater(floater);
+
+		//there was a previously unseen IM, make that old tab flashing
+		//it is assumed that the most recently unseen IM tab is the one current selected/active
+		if ( previouslyActiveFloater && getIMReceived() )
+		{
+			chat_floater->setFloaterFlashing(previouslyActiveFloater, TRUE);
+		}
+
+		//notify of a new IM
+		notifyNewIM();
+	}
+}
+
+void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& message_name, const LLSD& args)
+{
+	LLUIString message;
+	
+	// null session id means near me (chat history)
+	if (session_id.isNull())
+	{
+		message = LLTrans::getString(message_name);
+		message.setArgs(args);
+
+		LLChat chat(message);
+		chat.mSourceType = CHAT_SOURCE_SYSTEM;
+		LLFloaterChat::addChatHistory(chat);
+	}
+	else // going to IM session
+	{
+		if (hasSession(session_id))
+		{
+			message = LLTrans::getString(message_name + "-im");
+			message.setArgs(args);
+			gIMMgr->addMessage(session_id, LLUUID::null, SYSTEM_FROM, message.getString());
+		}
+	}
+}
+
+void LLIMMgr::notifyNewIM()
+{
+	if(!LLFloaterReg::instanceVisible("communicate"))
+	{
+		mIMReceived = TRUE;
+	}
+}
+
+S32 LLIMMgr::getNumberOfUnreadIM()
+{
+	std::map<LLUUID, LLIMModel::LLIMSession*>::iterator it;
+	
+	S32 num = 0;
+	for(it = LLIMModel::getInstance()->mId2SessionMap.begin(); it != LLIMModel::getInstance()->mId2SessionMap.end(); ++it)
+	{
+		num += (*it).second->mNumUnread;
+	}
+
+	return num;
+}
+
+void LLIMMgr::clearNewIMNotification()
+{
+	mIMReceived = FALSE;
+}
+
+BOOL LLIMMgr::getIMReceived() const
+{
+	return mIMReceived;
+}
+
+LLUUID LLIMMgr::addP2PSession(const std::string& name,
+							const LLUUID& other_participant_id,
+							const std::string& voice_session_handle,
+							const std::string& caller_uri)
+{
+	LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id);
+	if (session_id != LLUUID::null)
+	{
+		LLIMFloater::show(session_id);
+	}
+
+	LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
+	if (speaker_mgr)
+	{
+		LLVoiceChannelP2P* voice_channel = dynamic_cast<LLVoiceChannelP2P*>(speaker_mgr->getVoiceChannel());
+		if (voice_channel)
+		{
+			voice_channel->setSessionHandle(voice_session_handle, caller_uri);
+		}
+	}
+	return session_id;
+}
+
+// This adds a session to the talk view. The name is the local name of
+// the session, dialog specifies the type of session. If the session
+// exists, it is brought forward.  Specifying id = NULL results in an
+// im session to everyone. Returns the uuid of the session.
+LLUUID LLIMMgr::addSession(
+	const std::string& name,
+	EInstantMessage dialog,
+	const LLUUID& other_participant_id)
+{
+	LLDynamicArray<LLUUID> ids;
+	ids.put(other_participant_id);
+	return addSession(name, dialog, other_participant_id, ids);
+}
+
+// Adds a session using the given session_id.  If the session already exists 
+// the dialog type is assumed correct. Returns the uuid of the session.
+LLUUID LLIMMgr::addSession(
+	const std::string& name,
+	EInstantMessage dialog,
+	const LLUUID& other_participant_id,
+	const LLDynamicArray<LLUUID>& ids)
+{
+	if (0 == ids.getLength())
+	{
+		return LLUUID::null;
+	}
+
+	LLUUID session_id = computeSessionID(dialog,other_participant_id);
+
+	bool new_session = !LLIMModel::getInstance()->findIMSession(session_id);
+
+	if (new_session)
+	{
+		LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids);
+	}
+
+
+	//*TODO remove this "floater" thing when Communicate Floater's gone
+	LLFloaterIMPanel* floater = findFloaterBySession(session_id);
+	if(!floater)
+	{
+		// On creation, use the first element of ids as the
+		// "other_participant_id"
+		floater = createFloater(
+			session_id,
+			other_participant_id,
+			name,
+			dialog,
+			TRUE,
+			ids);
+	}
+
+	//we don't need to show notes about online/offline, mute/unmute users' statuses for existing sessions
+	if (!new_session) return session_id;
+	
+	noteOfflineUsers(session_id, floater, ids);
+
+	// Only warn for regular IMs - not group IMs
+	if( dialog == IM_NOTHING_SPECIAL )
+	{
+		noteMutedUsers(session_id, floater, ids);
+	}
+
+	return session_id;
+}
+
+bool LLIMMgr::leaveSession(const LLUUID& session_id)
+{
+	LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id);
+	if (!im_session) return false;
+
+	LLIMModel::getInstance()->sendLeaveSession(session_id, im_session->mOtherParticipantID);
+	gIMMgr->removeSession(session_id);
+	return true;
+}
+
+// Removes data associated with a particular session specified by session_id
+void LLIMMgr::removeSession(const LLUUID& session_id)
+{
+	llassert_always(hasSession(session_id));
+	
+	//*TODO remove this floater thing when Communicate Floater is being deleted (IB)
+	LLFloaterIMPanel* floater = findFloaterBySession(session_id);
+	if(floater)
+	{
+		mFloaters.erase(floater->getHandle());
+		LLFloaterChatterBox::getInstance()->removeFloater(floater);
+	}
+
+	clearPendingInvitation(session_id);
+	clearPendingAgentListUpdates(session_id);
+
+	LLIMModel::getInstance()->clearSession(session_id);
+
+	notifyObserverSessionRemoved(session_id);
+}
+
+void LLIMMgr::inviteToSession(
+	const LLUUID& session_id, 
+	const std::string& session_name, 
+	const LLUUID& caller_id, 
+	const std::string& caller_name,
+	EInstantMessage type,
+	EInvitationType inv_type,
+	const std::string& session_handle,
+	const std::string& session_uri)
+{
+	//ignore invites from muted residents
+	if (LLMuteList::getInstance()->isMuted(caller_id))
+	{
+		return;
+	}
+
+	std::string notify_box_type;
+
+	BOOL ad_hoc_invite = FALSE;
+	if(type == IM_SESSION_P2P_INVITE)
+	{
+		//P2P is different...they only have voice invitations
+		notify_box_type = "VoiceInviteP2P";
+	}
+	else if ( gAgent.isInGroup(session_id) )
+	{
+		//only really old school groups have voice invitations
+		notify_box_type = "VoiceInviteGroup";
+	}
+	else if ( inv_type == INVITATION_TYPE_VOICE )
+	{
+		//else it's an ad-hoc
+		//and a voice ad-hoc
+		notify_box_type = "VoiceInviteAdHoc";
+		ad_hoc_invite = TRUE;
+	}
+	else if ( inv_type == INVITATION_TYPE_IMMEDIATE )
+	{
+		notify_box_type = "InviteAdHoc";
+		ad_hoc_invite = TRUE;
+	}
+
+	LLSD payload;
+	payload["session_id"] = session_id;
+	payload["session_name"] = session_name;
+	payload["caller_id"] = caller_id;
+	payload["caller_name"] = caller_name;
+	payload["type"] = type;
+	payload["inv_type"] = inv_type;
+	payload["session_handle"] = session_handle;
+	payload["session_uri"] = session_uri;
+	payload["notify_box_type"] = notify_box_type;
+	
+	LLVoiceChannel* channelp = LLVoiceChannel::getChannelByID(session_id);
+	if (channelp && channelp->callStarted())
+	{
+		// you have already started a call to the other user, so just accept the invite
+		LLNotifications::instance().forceResponse(LLNotification::Params("VoiceInviteP2P").payload(payload), 0);
+		return;
+	}
+
+	if (type == IM_SESSION_P2P_INVITE || ad_hoc_invite)
+	{
+		// is the inviter a friend?
+		if (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL)
+		{
+			// if not, and we are ignoring voice invites from non-friends
+			// then silently decline
+			if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly"))
+			{
+				// invite not from a friend, so decline
+				LLNotifications::instance().forceResponse(LLNotification::Params("VoiceInviteP2P").payload(payload), 1);
+				return;
+			}
+		}
+	}
+
+	if ( !mPendingInvitations.has(session_id.asString()) )
+	{
+		if (caller_name.empty())
+		{
+			gCacheName->get(caller_id, FALSE, boost::bind(&LLIMMgr::onInviteNameLookup, payload, _1, _2, _3, _4));
+		}
+		else
+		{
+			if (notify_box_type == "VoiceInviteP2P" || notify_box_type == "VoiceInviteAdHoc")
+			{
+				LLFloaterReg::showInstance("incoming_call", payload, TRUE);
+			}
+			else
+			{
+				LLSD args;
+				args["NAME"] = caller_name;
+				args["GROUP"] = session_name;
+
+				LLNotifications::instance().add(notify_box_type, args, payload, &inviteUserResponse);
+			}
+		}
+		mPendingInvitations[session_id.asString()] = LLSD();
+	}
+}
+
+void LLIMMgr::onInviteNameLookup(LLSD payload, const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group)
+{
+	payload["caller_name"] = first + " " + last;
+	payload["session_name"] = payload["caller_name"].asString();
+
+	std::string notify_box_type = payload["notify_box_type"].asString();
+
+	if (notify_box_type == "VoiceInviteP2P" || notify_box_type == "VoiceInviteAdHoc")
+	{
+		LLFloaterReg::showInstance("incoming_call", payload, TRUE);
+	}
+	else
+	{
+		LLSD args;
+		args["NAME"] = payload["caller_name"].asString();
+	
+		LLNotifications::instance().add(
+			payload["notify_box_type"].asString(),
+			args, 
+			payload,
+			&inviteUserResponse);
+	}
+}
+
+void LLIMMgr::disconnectAllSessions()
+{
+	LLFloaterIMPanel* floater = NULL;
+	std::set<LLHandle<LLFloater> >::iterator handle_it;
+	for(handle_it = mFloaters.begin();
+		handle_it != mFloaters.end();
+		)
+	{
+		floater = (LLFloaterIMPanel*)handle_it->get();
+
+		// MUST do this BEFORE calling floater->onClose() because that may remove the item from the set, causing the subsequent increment to crash.
+		++handle_it;
+
+		if (floater)
+		{
+			floater->setEnabled(FALSE);
+			floater->closeFloater(TRUE);
+		}
+	}
+}
+
+
+// This method returns the im panel corresponding to the uuid
+// provided. The uuid can either be a session id or an agent
+// id. Returns NULL if there is no matching panel.
+LLFloaterIMPanel* LLIMMgr::findFloaterBySession(const LLUUID& session_id)
+{
+	LLFloaterIMPanel* rv = NULL;
+	std::set<LLHandle<LLFloater> >::iterator handle_it;
+	for(handle_it = mFloaters.begin();
+		handle_it != mFloaters.end();
+		++handle_it)
+	{
+		rv = (LLFloaterIMPanel*)handle_it->get();
+		if(rv && session_id == rv->getSessionID())
+		{
+			break;
+		}
+		rv = NULL;
+	}
+	return rv;
+}
+
+
+BOOL LLIMMgr::hasSession(const LLUUID& session_id)
+{
+	return LLIMModel::getInstance()->findIMSession(session_id) != NULL;
+}
+
+void LLIMMgr::clearPendingInvitation(const LLUUID& session_id)
+{
+	if ( mPendingInvitations.has(session_id.asString()) )
+	{
+		mPendingInvitations.erase(session_id.asString());
+	}
+}
+
+void LLIMMgr::processAgentListUpdates(const LLUUID& session_id, const LLSD& body)
+{
+	LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+	if ( im_floater )
+	{
+		im_floater->processAgentListUpdates(body);
+	}
+	LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
+	if (speaker_mgr)
+	{
+		speaker_mgr->updateSpeakers(body);
+	}
+	else
+	{
+		//we don't have a speaker manager yet..something went wrong
+		//we are probably receiving an update here before
+		//a start or an acceptance of an invitation.  Race condition.
+		gIMMgr->addPendingAgentListUpdates(
+			session_id,
+			body);
+	}
+}
+
+LLSD LLIMMgr::getPendingAgentListUpdates(const LLUUID& session_id)
+{
+	if ( mPendingAgentListUpdates.has(session_id.asString()) )
+	{
+		return mPendingAgentListUpdates[session_id.asString()];
+	}
+	else
+	{
+		return LLSD();
+	}
+}
+
+void LLIMMgr::addPendingAgentListUpdates(
+	const LLUUID& session_id,
+	const LLSD& updates)
+{
+	LLSD::map_const_iterator iter;
+
+	if ( !mPendingAgentListUpdates.has(session_id.asString()) )
+	{
+		//this is a new agent list update for this session
+		mPendingAgentListUpdates[session_id.asString()] = LLSD::emptyMap();
+	}
+
+	if (
+		updates.has("agent_updates") &&
+		updates["agent_updates"].isMap() &&
+		updates.has("updates") &&
+		updates["updates"].isMap() )
+	{
+		//new school update
+		LLSD update_types = LLSD::emptyArray();
+		LLSD::array_iterator array_iter;
+
+		update_types.append("agent_updates");
+		update_types.append("updates");
+
+		for (
+			array_iter = update_types.beginArray();
+			array_iter != update_types.endArray();
+			++array_iter)
+		{
+			//we only want to include the last update for a given agent
+			for (
+				iter = updates[array_iter->asString()].beginMap();
+				iter != updates[array_iter->asString()].endMap();
+				++iter)
+			{
+				mPendingAgentListUpdates[session_id.asString()][array_iter->asString()][iter->first] =
+					iter->second;
+			}
+		}
+	}
+	else if (
+		updates.has("updates") &&
+		updates["updates"].isMap() )
+	{
+		//old school update where the SD contained just mappings
+		//of agent_id -> "LEAVE"/"ENTER"
+
+		//only want to keep last update for each agent
+		for (
+			iter = updates["updates"].beginMap();
+			iter != updates["updates"].endMap();
+			++iter)
+		{
+			mPendingAgentListUpdates[session_id.asString()]["updates"][iter->first] =
+				iter->second;
+		}
+	}
+}
+
+void LLIMMgr::clearPendingAgentListUpdates(const LLUUID& session_id)
+{
+	if ( mPendingAgentListUpdates.has(session_id.asString()) )
+	{
+		mPendingAgentListUpdates.erase(session_id.asString());
+	}
+}
+
+void LLIMMgr::notifyObserverSessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
+{
+	for (session_observers_list_t::iterator it = mSessionObservers.begin(); it != mSessionObservers.end(); it++)
+	{
+		(*it)->sessionAdded(session_id, name, other_participant_id);
+	}
+}
+
+void LLIMMgr::notifyObserverSessionRemoved(const LLUUID& session_id)
+{
+	for (session_observers_list_t::iterator it = mSessionObservers.begin(); it != mSessionObservers.end(); it++)
+	{
+		(*it)->sessionRemoved(session_id);
+	}
+}
+
+void LLIMMgr::notifyObserverSessionIDUpdated( const LLUUID& old_session_id, const LLUUID& new_session_id )
+{
+	for (session_observers_list_t::iterator it = mSessionObservers.begin(); it != mSessionObservers.end(); it++)
+	{
+		(*it)->sessionIDUpdated(old_session_id, new_session_id);
+	}
+
+}
+
+void LLIMMgr::addSessionObserver(LLIMSessionObserver *observer)
+{
+	mSessionObservers.push_back(observer);
+}
+
+void LLIMMgr::removeSessionObserver(LLIMSessionObserver *observer)
+{
+	mSessionObservers.remove(observer);
+}
+
+bool LLIMMgr::startCall(const LLUUID& session_id)
+{
+	LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(session_id);
+	if (!voice_channel) return false;
+	
+	voice_channel->activate();
+	return true;
+}
+
+bool LLIMMgr::endCall(const LLUUID& session_id)
+{
+	LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(session_id);
+	if (!voice_channel) return false;
+
+	voice_channel->deactivate();
+	return true;
+}
+
+// create a floater and update internal representation for
+// consistency. Returns the pointer, caller (the class instance since
+// it is a private method) is not responsible for deleting the
+// pointer.  Add the floater to this but do not select it.
+LLFloaterIMPanel* LLIMMgr::createFloater(
+	const LLUUID& session_id,
+	const LLUUID& other_participant_id,
+	const std::string& session_label,
+	EInstantMessage dialog,
+	BOOL user_initiated,
+	const LLDynamicArray<LLUUID>& ids)
+{
+	if (session_id.isNull())
+	{
+		llwarns << "Creating LLFloaterIMPanel with null session ID" << llendl;
+	}
+
+	llinfos << "LLIMMgr::createFloater: from " << other_participant_id 
+			<< " in session " << session_id << llendl;
+	LLFloaterIMPanel* floater = new LLFloaterIMPanel(session_label,
+													 session_id,
+													 other_participant_id,
+													 ids,
+													 dialog);
+	LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END;
+	LLFloaterChatterBox::getInstance()->addFloater(floater, FALSE, i_pt);
+	mFloaters.insert(floater->getHandle());
+	return floater;
+}
+
+void LLIMMgr::noteOfflineUsers(
+	const LLUUID& session_id,
+	LLFloaterIMPanel* floater,
+	const LLDynamicArray<LLUUID>& ids)
+{
+	S32 count = ids.count();
+	if(count == 0)
+	{
+		const std::string& only_user = LLTrans::getString("only_user_message");
+		if (floater)
+		{
+			floater->addHistoryLine(only_user, LLUIColorTable::instance().getColor("SystemChatColor"));
+		}
+		LLIMModel::getInstance()->addMessage(session_id, SYSTEM_FROM, LLUUID::null, only_user);
+	}
+	else
+	{
+		const LLRelationship* info = NULL;
+		LLAvatarTracker& at = LLAvatarTracker::instance();
+		LLIMModel& im_model = LLIMModel::instance();
+		for(S32 i = 0; i < count; ++i)
+		{
+			info = at.getBuddyInfo(ids.get(i));
+			std::string first, last;
+			if(info && !info->isOnline()
+			   && gCacheName->getName(ids.get(i), first, last))
+			{
+				LLUIString offline = LLTrans::getString("offline_message");
+				offline.setArg("[FIRST]", first);
+				offline.setArg("[LAST]", last);
+				im_model.proccessOnlineOfflineNotification(session_id, offline);
+			}
+		}
+	}
+}
+
+void LLIMMgr::noteMutedUsers(const LLUUID& session_id, LLFloaterIMPanel* floater,
+								  const LLDynamicArray<LLUUID>& ids)
+{
+	// Don't do this if we don't have a mute list.
+	LLMuteList *ml = LLMuteList::getInstance();
+	if( !ml )
+	{
+		return;
+	}
+
+	S32 count = ids.count();
+	if(count > 0)
+	{
+		LLIMModel* im_model = LLIMModel::getInstance();
+		
+		for(S32 i = 0; i < count; ++i)
+		{
+			if( ml->isMuted(ids.get(i)) )
+			{
+				LLUIString muted = LLTrans::getString("muted_message");
+
+				//*TODO remove this "floater" thing when Communicate Floater's gone
+				floater->addHistoryLine(muted);
+
+				im_model->addMessage(session_id, SYSTEM_FROM, LLUUID::null, muted);
+				break;
+			}
+		}
+	}
+}
+
+void LLIMMgr::processIMTypingStart(const LLIMInfo* im_info)
+{
+	processIMTypingCore(im_info, TRUE);
+}
+
+void LLIMMgr::processIMTypingStop(const LLIMInfo* im_info)
+{
+	processIMTypingCore(im_info, FALSE);
+}
+
+void LLIMMgr::processIMTypingCore(const LLIMInfo* im_info, BOOL typing)
+{
+	LLUUID session_id = computeSessionID(im_info->mIMType, im_info->mFromID);
+	LLFloaterIMPanel* floater = findFloaterBySession(session_id);
+	if (floater)
+	{
+		floater->processIMTyping(im_info, typing);
+	}
+
+	LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+	if ( im_floater )
+	{
+		im_floater->processIMTyping(im_info, typing);
+	}
+}
+
+class LLViewerChatterBoxSessionStartReply : public LLHTTPNode
+{
+public:
+	virtual void describe(Description& desc) const
+	{
+		desc.shortInfo("Used for receiving a reply to a request to initialize an ChatterBox session");
+		desc.postAPI();
+		desc.input(
+			"{\"client_session_id\": UUID, \"session_id\": UUID, \"success\" boolean, \"reason\": string");
+		desc.source(__FILE__, __LINE__);
+	}
+
+	virtual void post(ResponsePtr response,
+					  const LLSD& context,
+					  const LLSD& input) const
+	{
+		LLSD body;
+		LLUUID temp_session_id;
+		LLUUID session_id;
+		bool success;
+
+		body = input["body"];
+		success = body["success"].asBoolean();
+		temp_session_id = body["temp_session_id"].asUUID();
+
+		if ( success )
+		{
+			session_id = body["session_id"].asUUID();
+
+			LLIMModel::getInstance()->processSessionInitializedReply(temp_session_id, session_id);
+
+			LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
+			if (speaker_mgr)
+			{
+				speaker_mgr->setSpeakers(body);
+				speaker_mgr->updateSpeakers(gIMMgr->getPendingAgentListUpdates(session_id));
+			}
+
+			LLFloaterIMPanel* floaterp = gIMMgr->findFloaterBySession(session_id);
+			if (floaterp)
+			{
+				if ( body.has("session_info") )
+				{
+					floaterp->processSessionUpdate(body["session_info"]);
+				}
+			}
+
+			LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+			if ( im_floater )
+			{
+				if ( body.has("session_info") )
+				{
+					im_floater->processSessionUpdate(body["session_info"]);
+				}
+			}
+
+			gIMMgr->clearPendingAgentListUpdates(session_id);
+		}
+		else
+		{
+			//throw an error dialog and close the temp session's floater
+			gIMMgr->showSessionStartError(body["error"].asString(), temp_session_id);
+		}
+
+		gIMMgr->clearPendingAgentListUpdates(session_id);
+	}
+};
+
+class LLViewerChatterBoxSessionEventReply : public LLHTTPNode
+{
+public:
+	virtual void describe(Description& desc) const
+	{
+		desc.shortInfo("Used for receiving a reply to a ChatterBox session event");
+		desc.postAPI();
+		desc.input(
+			"{\"event\": string, \"reason\": string, \"success\": boolean, \"session_id\": UUID");
+		desc.source(__FILE__, __LINE__);
+	}
+
+	virtual void post(ResponsePtr response,
+					  const LLSD& context,
+					  const LLSD& input) const
+	{
+		LLUUID session_id;
+		bool success;
+
+		LLSD body = input["body"];
+		success = body["success"].asBoolean();
+		session_id = body["session_id"].asUUID();
+
+		if ( !success )
+		{
+			//throw an error dialog
+			gIMMgr->showSessionEventError(
+				body["event"].asString(),
+				body["error"].asString(),
+				session_id);
+		}
+	}
+};
+
+class LLViewerForceCloseChatterBoxSession: public LLHTTPNode
+{
+public:
+	virtual void post(ResponsePtr response,
+					  const LLSD& context,
+					  const LLSD& input) const
+	{
+		LLUUID session_id;
+		std::string reason;
+
+		session_id = input["body"]["session_id"].asUUID();
+		reason = input["body"]["reason"].asString();
+
+		gIMMgr->showSessionForceClose(reason, session_id);
+	}
+};
+
+class LLViewerChatterBoxSessionAgentListUpdates : public LLHTTPNode
+{
+public:
+	virtual void post(
+		ResponsePtr responder,
+		const LLSD& context,
+		const LLSD& input) const
+	{
+		const LLUUID& session_id = input["body"]["session_id"].asUUID();
+		gIMMgr->processAgentListUpdates(session_id, input["body"]);
+	}
+};
+
+class LLViewerChatterBoxSessionUpdate : public LLHTTPNode
+{
+public:
+	virtual void post(
+		ResponsePtr responder,
+		const LLSD& context,
+		const LLSD& input) const
+	{
+		LLUUID session_id = input["body"]["session_id"].asUUID();
+		LLFloaterIMPanel* floaterp = gIMMgr->findFloaterBySession(session_id);
+		if (floaterp)
+		{
+			floaterp->processSessionUpdate(input["body"]["info"]);
+		}
+		LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+		if ( im_floater )
+		{
+			im_floater->processSessionUpdate(input["body"]["info"]);
+		}
+	}
+};
+
+
+class LLViewerChatterBoxInvitation : public LLHTTPNode
+{
+public:
+
+	virtual void post(
+		ResponsePtr response,
+		const LLSD& context,
+		const LLSD& input) const
+	{
+		//for backwards compatiblity reasons...we need to still
+		//check for 'text' or 'voice' invitations...bleh
+		if ( input["body"].has("instantmessage") )
+		{
+			LLSD message_params =
+				input["body"]["instantmessage"]["message_params"];
+
+			//do something here to have the IM invite behave
+			//just like a normal IM
+			//this is just replicated code from process_improved_im
+			//and should really go in it's own function -jwolk
+			if (gNoRender)
+			{
+				return;
+			}
+			LLChat chat;
+
+			std::string message = message_params["message"].asString();
+			std::string name = message_params["from_name"].asString();
+			LLUUID from_id = message_params["from_id"].asUUID();
+			LLUUID session_id = message_params["id"].asUUID();
+			std::vector<U8> bin_bucket = message_params["data"]["binary_bucket"].asBinary();
+			U8 offline = (U8)message_params["offline"].asInteger();
+			
+			time_t timestamp =
+				(time_t) message_params["timestamp"].asInteger();
+
+			BOOL is_busy = gAgent.getBusy();
+			BOOL is_muted = LLMuteList::getInstance()->isMuted(
+				from_id,
+				name,
+				LLMute::flagTextChat);
+
+			BOOL is_linden = LLMuteList::getInstance()->isLinden(name);
+			std::string separator_string(": ");
+			
+			chat.mMuted = is_muted && !is_linden;
+			chat.mFromID = from_id;
+			chat.mFromName = name;
+
+			if (!is_linden && (is_busy || is_muted))
+			{
+				return;
+			}
+
+			// standard message, not from system
+			std::string saved;
+			if(offline == IM_OFFLINE)
+			{
+				saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());
+			}
+			std::string buffer = saved + message;
+
+			BOOL is_this_agent = FALSE;
+			if(from_id == gAgentID)
+			{
+				is_this_agent = TRUE;
+			}
+			gIMMgr->addMessage(
+				session_id,
+				from_id,
+				name,
+				buffer,
+				std::string((char*)&bin_bucket[0]),
+				IM_SESSION_INVITE,
+				message_params["parent_estate_id"].asInteger(),
+				message_params["region_id"].asUUID(),
+				ll_vector3_from_sd(message_params["position"]),
+				true);
+
+			chat.mText = std::string("IM: ") + name + separator_string + saved + message;
+			LLFloaterChat::addChat(chat, TRUE, is_this_agent);
+
+			//K now we want to accept the invitation
+			std::string url = gAgent.getRegion()->getCapability(
+				"ChatSessionRequest");
+
+			if ( url != "" )
+			{
+				LLSD data;
+				data["method"] = "accept invitation";
+				data["session-id"] = session_id;
+				LLHTTPClient::post(
+					url,
+					data,
+					new LLViewerChatterBoxInvitationAcceptResponder(
+						session_id,
+						LLIMMgr::INVITATION_TYPE_INSTANT_MESSAGE));
+			}
+		} //end if invitation has instant message
+		else if ( input["body"].has("voice") )
+		{
+			if (gNoRender)
+			{
+				return;
+			}
+			
+			if(!LLVoiceClient::voiceEnabled())
+			{
+				// Don't display voice invites unless the user has voice enabled.
+				return;
+			}
+
+			gIMMgr->inviteToSession(
+				input["body"]["session_id"].asUUID(), 
+				input["body"]["session_name"].asString(), 
+				input["body"]["from_id"].asUUID(),
+				input["body"]["from_name"].asString(),
+				IM_SESSION_INVITE,
+				LLIMMgr::INVITATION_TYPE_VOICE);
+		}
+		else if ( input["body"].has("immediate") )
+		{
+			gIMMgr->inviteToSession(
+				input["body"]["session_id"].asUUID(), 
+				input["body"]["session_name"].asString(), 
+				input["body"]["from_id"].asUUID(),
+				input["body"]["from_name"].asString(),
+				IM_SESSION_INVITE,
+				LLIMMgr::INVITATION_TYPE_IMMEDIATE);
+		}
+	}
+};
+
+LLHTTPRegistration<LLViewerChatterBoxSessionStartReply>
+   gHTTPRegistrationMessageChatterboxsessionstartreply(
+	   "/message/ChatterBoxSessionStartReply");
+
+LLHTTPRegistration<LLViewerChatterBoxSessionEventReply>
+   gHTTPRegistrationMessageChatterboxsessioneventreply(
+	   "/message/ChatterBoxSessionEventReply");
+
+LLHTTPRegistration<LLViewerForceCloseChatterBoxSession>
+    gHTTPRegistrationMessageForceclosechatterboxsession(
+		"/message/ForceCloseChatterBoxSession");
+
+LLHTTPRegistration<LLViewerChatterBoxSessionAgentListUpdates>
+    gHTTPRegistrationMessageChatterboxsessionagentlistupdates(
+	    "/message/ChatterBoxSessionAgentListUpdates");
+
+LLHTTPRegistration<LLViewerChatterBoxSessionUpdate>
+    gHTTPRegistrationMessageChatterBoxSessionUpdate(
+	    "/message/ChatterBoxSessionUpdate");
+
+LLHTTPRegistration<LLViewerChatterBoxInvitation>
+    gHTTPRegistrationMessageChatterBoxInvitation(
+		"/message/ChatterBoxInvitation");
+
diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp
index fa1dbe06034..9ce21753020 100644
--- a/indra/newview/llmanip.cpp
+++ b/indra/newview/llmanip.cpp
@@ -265,8 +265,8 @@ BOOL LLManip::getMousePointOnPlaneGlobal(LLVector3d& point, S32 x, S32 y, LLVect
 	if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
 	{
 		BOOL result = FALSE;
-		F32 mouse_x = ((F32)x / gViewerWindow->getWindowWidthScaled() - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgent.mHUDCurZoom;
-		F32 mouse_y = ((F32)y / gViewerWindow->getWindowHeightScaled() - 0.5f) / gAgent.mHUDCurZoom;
+		F32 mouse_x = ((F32)x / gViewerWindow->getWorldViewWidthScaled() - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgent.mHUDCurZoom;
+		F32 mouse_y = ((F32)y / gViewerWindow->getWorldViewHeightScaled() - 0.5f) / gAgent.mHUDCurZoom;
 
 		LLVector3 origin_agent = gAgent.getPosAgentFromGlobal(origin);
 		LLVector3 mouse_pos = LLVector3(0.f, -mouse_x, mouse_y);
diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp
index bcaebb6bbb9..8535d52015a 100644
--- a/indra/newview/llmaniprotate.cpp
+++ b/indra/newview/llmaniprotate.cpp
@@ -1107,8 +1107,11 @@ BOOL LLManipRotate::updateVisiblity()
 		mCenterToProfilePlaneMag = mRadiusMeters * mRadiusMeters / mCenterToCamMag;
 		mCenterToProfilePlane = -mCenterToProfilePlaneMag * mCenterToCamNorm;
 
-		mCenterScreen.set((S32)((0.5f - mRotationCenter.mdV[VY]) / gAgent.mHUDCurZoom * gViewerWindow->getWorldViewWidthRaw()),
-							(S32)((mRotationCenter.mdV[VZ] + 0.5f) / gAgent.mHUDCurZoom * gViewerWindow->getWorldViewHeightRaw()));
+		// x axis range is (-aspect * 0.5f, +aspect * 0.5)
+		// y axis range is (-0.5, 0.5)
+		// so use getWorldViewHeightRaw as scale factor when converting to pixel coordinates
+		mCenterScreen.set((S32)((0.5f - center.mV[VY]) / gAgent.mHUDCurZoom * gViewerWindow->getWorldViewHeightScaled()),
+							(S32)((center.mV[VZ] + 0.5f) / gAgent.mHUDCurZoom * gViewerWindow->getWorldViewHeightScaled()));
 		visible = TRUE;
 	}
 	else
@@ -1624,8 +1627,8 @@ void LLManipRotate::mouseToRay( S32 x, S32 y, LLVector3* ray_pt, LLVector3* ray_
 {
 	if (LLSelectMgr::getInstance()->getSelection()->getSelectType() == SELECT_TYPE_HUD)
 	{
-		F32 mouse_x = (((F32)x / gViewerWindow->getWorldViewWidthRaw()) - 0.5f) / gAgent.mHUDCurZoom;
-		F32 mouse_y = ((((F32)y) / gViewerWindow->getWorldViewHeightRaw()) - 0.5f) / gAgent.mHUDCurZoom;
+		F32 mouse_x = (((F32)x / gViewerWindow->getWorldViewRectScaled().getWidth()) - 0.5f) / gAgent.mHUDCurZoom;
+		F32 mouse_y = ((((F32)y) / gViewerWindow->getWorldViewRectScaled().getHeight()) - 0.5f) / gAgent.mHUDCurZoom;
 
 		*ray_pt = LLVector3(-1.f, -mouse_x, mouse_y);
 		*ray_dir = LLVector3(1.f, 0.f, 0.f);
@@ -1699,7 +1702,7 @@ void LLManipRotate::highlightManipulators( S32 x, S32 y )
 	F32 dist_y = mouse_dir_y.normVec();
 	F32 dist_z = mouse_dir_z.normVec();
 
-	F32 distance_threshold = (MAX_MANIP_SELECT_DISTANCE * mRadiusMeters) / gViewerWindow->getWorldViewHeightRaw();
+	F32 distance_threshold = (MAX_MANIP_SELECT_DISTANCE * mRadiusMeters) / gViewerWindow->getWorldViewHeightScaled();
 
 	if (llabs(dist_x - mRadiusMeters) * llmax(0.05f, proj_rot_x_axis) < distance_threshold)
 	{
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index 8f29f908e5c..c79adb85e55 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -101,17 +101,17 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
 		setCaretColor( (unsigned int)color.mV[0], (unsigned int)color.mV[1], (unsigned int)color.mV[2] );
 	}
 
-	setIgnoreUIScale(p.ignore_ui_scale());
+	setIgnoreUIScale(p.ignore_ui_scale);
 	
-	setHomePageUrl(p.start_url());
+	setHomePageUrl(p.start_url);
 	
-	setBorderVisible(p.border_visible());
+	setBorderVisible(p.border_visible);
 	
-	mHideLoading = p.hide_loading();
+	mHideLoading = p.hide_loading;
 	
-	setDecoupleTextureSize(p.decouple_texture_size());
+	setDecoupleTextureSize(p.decouple_texture_size);
 	
-	setTextureSize(p.texture_width(), p.texture_height());
+	setTextureSize(p.texture_width, p.texture_height);
 
 	if(!getDecoupleTextureSize())
 	{
@@ -723,13 +723,13 @@ void LLMediaCtrl::draw()
 				{
 					// max width, adjusted height
 					width = r.getWidth();
-					height = llmin(llmax(S32(width / media_aspect), 0), r.getHeight());
+					height = llmin(llmax(llround(width / media_aspect), 0), r.getHeight());
 				}
 				else
 				{
 					// max height, adjusted width
 					height = r.getHeight();
-					width = llmin(llmax(S32(height * media_aspect), 0), r.getWidth());
+					width = llmin(llmax(llround(height * media_aspect), 0), r.getWidth());
 				}
 			}
 			else
@@ -747,6 +747,14 @@ void LLMediaCtrl::draw()
 		x_offset = (r.getWidth() - width) / 2;
 		y_offset = (r.getHeight() - height) / 2;		
 
+		if(mIgnoreUIScale)
+		{
+			x_offset = llround((F32)x_offset * LLUI::sGLScaleFactor.mV[VX]);
+			y_offset = llround((F32)y_offset * LLUI::sGLScaleFactor.mV[VY]);
+			width = llround((F32)width * LLUI::sGLScaleFactor.mV[VX]);
+			height = llround((F32)height * LLUI::sGLScaleFactor.mV[VY]);
+		}
+
 		// draw the browser
 		gGL.setSceneBlendType(LLRender::BT_REPLACE);
 		gGL.begin( LLRender::QUADS );
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 85db69174d9..0c01fa821ea 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -201,7 +201,7 @@ void LLNearbyChat::setRect	(const LLRect &rect)
 
 void LLNearbyChat::getAllowedRect(LLRect& rect)
 {
-	rect = gViewerWindow->getWorldViewRectRaw();
+	rect = gViewerWindow->getWorldViewRectScaled();
 }
 
 
diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp
index 1f68c76bfc3..5c11bc7310a 100644
--- a/indra/newview/llnotificationalerthandler.cpp
+++ b/indra/newview/llnotificationalerthandler.cpp
@@ -66,7 +66,7 @@ LLAlertHandler::~LLAlertHandler()
 //--------------------------------------------------------------------------
 void LLAlertHandler::initChannel()
 {
-	S32 channel_right_bound = gViewerWindow->getWorldViewRectRaw().getWidth() / 2;
+	S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().getWidth() / 2;
 	mChannel->init(channel_right_bound, channel_right_bound);
 }
 
diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp
index fc6fb25644a..5a2b98c8c7d 100644
--- a/indra/newview/llnotificationgrouphandler.cpp
+++ b/indra/newview/llnotificationgrouphandler.cpp
@@ -57,7 +57,7 @@ LLGroupHandler::~LLGroupHandler()
 //--------------------------------------------------------------------------
 void LLGroupHandler::initChannel()
 {
-	S32 channel_right_bound = gViewerWindow->getWorldViewRectRaw().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
+	S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
 	S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
 	mChannel->init(channel_right_bound - channel_width, channel_right_bound);
 }
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index 94e733913d4..598d0217039 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -65,7 +65,7 @@ LLOfferHandler::~LLOfferHandler()
 //--------------------------------------------------------------------------
 void LLOfferHandler::initChannel()
 {
-	S32 channel_right_bound = gViewerWindow->getWorldViewRectRaw().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
+	S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
 	S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
 	mChannel->init(channel_right_bound - channel_width, channel_right_bound);
 }
diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp
index 70b86e8b976..4be98201d11 100644
--- a/indra/newview/llnotificationscripthandler.cpp
+++ b/indra/newview/llnotificationscripthandler.cpp
@@ -64,7 +64,7 @@ LLScriptHandler::~LLScriptHandler()
 //--------------------------------------------------------------------------
 void LLScriptHandler::initChannel()
 {
-	S32 channel_right_bound = gViewerWindow->getWorldViewRectRaw().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
+	S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
 	S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
 	mChannel->init(channel_right_bound - channel_width, channel_right_bound);
 }
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index 60a27d51544..b962fa21840 100644
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -60,7 +60,7 @@ LLTipHandler::~LLTipHandler()
 //--------------------------------------------------------------------------
 void LLTipHandler::initChannel()
 {
-	S32 channel_right_bound = gViewerWindow->getWorldViewRectRaw().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
+	S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
 	S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
 	mChannel->init(channel_right_bound - channel_width, channel_right_bound);
 }
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index 81eb133b07f..d1cf4a08103 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -103,8 +103,8 @@ void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect ne
 
 void LLScreenChannelBase::init(S32 channel_left, S32 channel_right)
 {
-	S32 channel_top = gViewerWindow->getWorldViewRectRaw().getHeight();
-	S32 channel_bottom = gViewerWindow->getWorldViewRectRaw().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");
+	S32 channel_top = gViewerWindow->getWorldViewRectScaled().getHeight();
+	S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");
 	setRect(LLRect(channel_left, channel_top, channel_right, channel_bottom));
 	setVisible(TRUE);
 }
@@ -710,7 +710,7 @@ void LLScreenChannel::updateShowToastsState()
 	// for Message Well floater showed in a docked state - adjust channel's height
 	if(dynamic_cast<LLSysWellWindow*>(floater))
 	{
-		S32 channel_bottom = gViewerWindow->getWorldViewRectRaw().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");;
+		S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");;
 		LLRect this_rect = getRect();
 		if(floater->getVisible() && floater->isDocked())
 		{
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index 2fb6550107a..a6b34593123 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -238,7 +238,7 @@ void LLSysWellWindow::initChannel()
 //---------------------------------------------------------------------------------
 void LLSysWellWindow::getAllowedRect(LLRect& rect)
 {
-	rect = gViewerWindow->getWorldViewRectRaw();
+	rect = gViewerWindow->getWorldViewRectScaled();
 }
 
 //---------------------------------------------------------------------------------
diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp
index e2ccc05e30f..2320ae57df3 100644
--- a/indra/newview/lltoolfocus.cpp
+++ b/indra/newview/lltoolfocus.cpp
@@ -365,7 +365,7 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask)
 			// Orbit tool
 			if (hasMouseCapture())
 			{
-				const F32 RADIANS_PER_PIXEL = 360.f * DEG_TO_RAD / gViewerWindow->getWorldViewWidthRaw();
+				const F32 RADIANS_PER_PIXEL = 360.f * DEG_TO_RAD / gViewerWindow->getWorldViewWidthScaled();
 
 				if (dx != 0)
 				{
@@ -393,7 +393,7 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask)
 				F32 dist = (F32) camera_to_focus.normVec();
 
 				// Fudge factor for pan
-				F32 meters_per_pixel = 3.f * dist / gViewerWindow->getWorldViewWidthRaw();
+				F32 meters_per_pixel = 3.f * dist / gViewerWindow->getWorldViewWidthScaled();
 
 				if (dx != 0)
 				{
@@ -415,7 +415,7 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask)
 			if (hasMouseCapture())
 			{
 
-				const F32 RADIANS_PER_PIXEL = 360.f * DEG_TO_RAD / gViewerWindow->getWorldViewWidthRaw();
+				const F32 RADIANS_PER_PIXEL = 360.f * DEG_TO_RAD / gViewerWindow->getWorldViewWidthScaled();
 
 				if (dx != 0)
 				{
diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp
index 44fb6e92715..26dbe6a4890 100644
--- a/indra/newview/lltoolgrab.cpp
+++ b/indra/newview/lltoolgrab.cpp
@@ -510,8 +510,8 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
 	const F32 RADIANS_PER_PIXEL_X = 0.01f;
 	const F32 RADIANS_PER_PIXEL_Y = 0.01f;
 
-	S32 dx = x - (gViewerWindow->getWorldViewWidthRaw() / 2);
-	S32 dy = y - (gViewerWindow->getWorldViewHeightRaw() / 2);
+	S32 dx = x - (gViewerWindow->getWorldViewWidthScaled() / 2);
+	S32 dy = y - (gViewerWindow->getWorldViewHeightScaled() / 2);
 
 	if (dx != 0 || dy != 0)
 	{
@@ -631,10 +631,10 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
 			// Handle auto-rotation at screen edge.
 			LLVector3 grab_pos_agent = gAgent.getPosAgentFromGlobal( grab_point_global );
 
-			LLCoordGL grab_center_gl( gViewerWindow->getWorldViewWidthRaw() / 2, gViewerWindow->getWorldViewHeightRaw() / 2);
+			LLCoordGL grab_center_gl( gViewerWindow->getWorldViewWidthScaled() / 2, gViewerWindow->getWorldViewHeightScaled() / 2);
 			LLViewerCamera::getInstance()->projectPosAgentToScreen(grab_pos_agent, grab_center_gl);
 
-			const S32 ROTATE_H_MARGIN = gViewerWindow->getWorldViewWidthRaw() / 20;
+			const S32 ROTATE_H_MARGIN = gViewerWindow->getWorldViewWidthScaled() / 20;
 			const F32 ROTATE_ANGLE_PER_SECOND = 30.f * DEG_TO_RAD;
 			const F32 rotate_angle = ROTATE_ANGLE_PER_SECOND / gFPSClamped;
 			// ...build mode moves camera about focus point
@@ -649,7 +649,7 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
 					gAgent.cameraOrbitAround(rotate_angle);
 				}
 			}
-			else if (grab_center_gl.mX > gViewerWindow->getWorldViewWidthRaw() - ROTATE_H_MARGIN)
+			else if (grab_center_gl.mX > gViewerWindow->getWorldViewWidthScaled() - ROTATE_H_MARGIN)
 			{
 				if (gAgent.getFocusOnAvatar())
 				{
@@ -662,7 +662,7 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
 			}
 
 			// Don't move above top of screen or below bottom
-			if ((grab_center_gl.mY < gViewerWindow->getWorldViewHeightRaw() - 6)
+			if ((grab_center_gl.mY < gViewerWindow->getWorldViewHeightScaled() - 6)
 				&& (grab_center_gl.mY > 24))
 			{
 				// Transmit update to simulator
@@ -893,7 +893,7 @@ void LLToolGrab::handleHoverInactive(S32 x, S32 y, MASK mask)
 				gAgent.yaw(rotate_angle);
 				//gAgent.setControlFlags(AGENT_CONTROL_YAW_POS);
 			}
-			else if (x == (gViewerWindow->getWorldViewWidthRaw() - 1) )
+			else if (x == (gViewerWindow->getWorldViewWidthScaled() - 1) )
 			{
 				gAgent.yaw(-rotate_angle);
 				//gAgent.setControlFlags(AGENT_CONTROL_YAW_NEG);
diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp
index 5566fea89f2..f3c64088c9b 100644
--- a/indra/newview/llviewercamera.cpp
+++ b/indra/newview/llviewercamera.cpp
@@ -485,7 +485,7 @@ BOOL LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord
 		y /= gViewerWindow->getDisplayScale().mV[VY];
 
 		// should now have the x,y coords of grab_point in screen space
-		LLRect world_view_rect = gViewerWindow->getWorldViewRectScaled();
+		LLRect world_rect = gViewerWindow->getWorldViewRectScaled();
 
 		// convert to pixel coordinates
 		S32 int_x = lltrunc(x);
@@ -495,14 +495,14 @@ BOOL LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord
 
 		if (clamp)
 		{
-			if (int_x < world_view_rect.mLeft)
+			if (int_x < world_rect.mLeft)
 			{
-				out_point.mX = world_view_rect.mLeft;
+				out_point.mX = world_rect.mLeft;
 				valid = FALSE;
 			}
-			else if (int_x > world_view_rect.mRight)
+			else if (int_x > world_rect.mRight)
 			{
-				out_point.mX = world_view_rect.mRight;
+				out_point.mX = world_rect.mRight;
 				valid = FALSE;
 			}
 			else
@@ -510,14 +510,14 @@ BOOL LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord
 				out_point.mX = int_x;
 			}
 
-			if (int_y < world_view_rect.mBottom)
+			if (int_y < world_rect.mBottom)
 			{
-				out_point.mY = world_view_rect.mBottom;
+				out_point.mY = world_rect.mBottom;
 				valid = FALSE;
 			}
-			else if (int_y > world_view_rect.mTop)
+			else if (int_y > world_rect.mTop)
 			{
-				out_point.mY = world_view_rect.mTop;
+				out_point.mY = world_rect.mTop;
 				valid = FALSE;
 			}
 			else
@@ -531,19 +531,19 @@ BOOL LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord
 			out_point.mX = int_x;
 			out_point.mY = int_y;
 
-			if (int_x < world_view_rect.mLeft)
+			if (int_x < world_rect.mLeft)
 			{
 				valid = FALSE;
 			}
-			else if (int_x > world_view_rect.mRight)
+			else if (int_x > world_rect.mRight)
 			{
 				valid = FALSE;
 			}
-			if (int_y < world_view_rect.mBottom)
+			if (int_y < world_rect.mBottom)
 			{
 				valid = FALSE;
 			}
-			else if (int_y > world_view_rect.mTop)
+			else if (int_y > world_rect.mTop)
 			{
 				valid = FALSE;
 			}
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 1054223dcf1..79520b2d8ee 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -2277,7 +2277,7 @@ void LLViewerWindow::handleScrollWheel(S32 clicks)
 
 	// Zoom the camera in and out behavior
 
-	if(top_ctrl == 0 && mWorldViewRectRaw.pointInRect(mCurrentMousePoint.mX, mCurrentMousePoint.mY) )
+	if(top_ctrl == 0 && getWorldViewRectScaled().pointInRect(mCurrentMousePoint.mX, mCurrentMousePoint.mY) )
 		gAgent.handleScrollWheel(clicks);
 
 	return;
@@ -2285,8 +2285,8 @@ void LLViewerWindow::handleScrollWheel(S32 clicks)
 
 void LLViewerWindow::moveCursorToCenter()
 {
-	S32 x = mWorldViewRectRaw.getWidth() / 2;
-	S32 y = mWorldViewRectRaw.getHeight() / 2;
+	S32 x = getWorldViewWidthScaled() / 2;
+	S32 y = getWorldViewHeightScaled() / 2;
 	
 	//on a forced move, all deltas get zeroed out to prevent jumping
 	mCurrentMousePoint.set(x,y);
@@ -2857,6 +2857,11 @@ void LLViewerWindow::updateWorldViewRect(bool use_full_window)
 		// clamp to at least a 1x1 rect so we don't try to allocate zero width gl buffers
 		new_world_rect.mTop = llmax(new_world_rect.mTop, new_world_rect.mBottom + 1);
 		new_world_rect.mRight = llmax(new_world_rect.mRight, new_world_rect.mLeft + 1);
+
+		new_world_rect.mLeft = llround((F32)new_world_rect.mLeft * mDisplayScale.mV[VX]);
+		new_world_rect.mRight = llround((F32)new_world_rect.mRight * mDisplayScale.mV[VX]);
+		new_world_rect.mBottom = llround((F32)new_world_rect.mBottom * mDisplayScale.mV[VY]);
+		new_world_rect.mTop = llround((F32)new_world_rect.mTop * mDisplayScale.mV[VY]);
 	}
 
 	if (mWorldViewRectRaw != new_world_rect)
@@ -2868,6 +2873,12 @@ void LLViewerWindow::updateWorldViewRect(bool use_full_window)
 		gResizeScreenTexture = TRUE;
 		LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRectRaw.getHeight() );
 		LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() );
+
+		mWorldViewRectScaled = mWorldViewRectRaw;
+		mWorldViewRectScaled.mLeft = llround((F32)mWorldViewRectScaled.mLeft / mDisplayScale.mV[VX]);
+		mWorldViewRectScaled.mRight = llround((F32)mWorldViewRectScaled.mRight / mDisplayScale.mV[VX]);
+		mWorldViewRectScaled.mBottom = llround((F32)mWorldViewRectScaled.mBottom / mDisplayScale.mV[VY]);
+		mWorldViewRectScaled.mTop = llround((F32)mWorldViewRectScaled.mTop / mDisplayScale.mV[VY]);
 	}
 }
 
@@ -3139,10 +3150,10 @@ void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback
 	{
 		mPickScreenRegion.setCenterAndSize(x, y_from_bot, PICK_DIAMETER, PICK_DIAMETER);
 
-		if (mPickScreenRegion.mLeft < mWorldViewRectRaw.mLeft) mPickScreenRegion.translate(mWorldViewRectRaw.mLeft - mPickScreenRegion.mLeft, 0);
-		if (mPickScreenRegion.mBottom < mWorldViewRectRaw.mBottom) mPickScreenRegion.translate(0, mWorldViewRectRaw.mBottom - mPickScreenRegion.mBottom);
-		if (mPickScreenRegion.mRight > mWorldViewRectRaw.mRight ) mPickScreenRegion.translate(mWorldViewRectRaw.mRight - mPickScreenRegion.mRight, 0);
-		if (mPickScreenRegion.mTop > mWorldViewRectRaw.mTop ) mPickScreenRegion.translate(0, mWorldViewRectRaw.mTop - mPickScreenRegion.mTop);
+		if (mPickScreenRegion.mLeft < mWorldViewRectScaled.mLeft) mPickScreenRegion.translate(mWorldViewRectScaled.mLeft - mPickScreenRegion.mLeft, 0);
+		if (mPickScreenRegion.mBottom < mWorldViewRectScaled.mBottom) mPickScreenRegion.translate(0, mWorldViewRectScaled.mBottom - mPickScreenRegion.mBottom);
+		if (mPickScreenRegion.mRight > mWorldViewRectScaled.mRight ) mPickScreenRegion.translate(mWorldViewRectScaled.mRight - mPickScreenRegion.mRight, 0);
+		if (mPickScreenRegion.mTop > mWorldViewRectScaled.mTop ) mPickScreenRegion.translate(0, mWorldViewRectScaled.mTop - mPickScreenRegion.mTop);
 	}
 
 	// set frame buffer region for picking results
@@ -3348,11 +3359,11 @@ LLVector3 LLViewerWindow::mouseDirectionGlobal(const S32 x, const S32 y) const
 	F32			fov = LLViewerCamera::getInstance()->getView();
 
 	// find world view center in scaled ui coordinates
-	F32			center_x = (F32)getWorldViewRectRaw().getCenterX() / mDisplayScale.mV[VX];
-	F32			center_y = (F32)getWorldViewRectRaw().getCenterY() / mDisplayScale.mV[VY];
+	F32			center_x = getWorldViewRectScaled().getCenterX();
+	F32			center_y = getWorldViewRectScaled().getCenterY();
 
 	// calculate pixel distance to screen
-	F32			distance = ((F32)getWorldViewHeightRaw() / (mDisplayScale.mV[VY] * 2.f)) / (tan(fov / 2.f));
+	F32			distance = ((F32)getWorldViewHeightScaled() * 0.5f) / (tan(fov / 2.f));
 
 	// calculate click point relative to middle of screen
 	F32			click_x = x - center_x;
@@ -3371,11 +3382,11 @@ LLVector3 LLViewerWindow::mouseDirectionGlobal(const S32 x, const S32 y) const
 LLVector3 LLViewerWindow::mousePointHUD(const S32 x, const S32 y) const
 {
 	// find screen resolution
-	S32			height = llround((F32)getWorldViewHeightRaw() / mDisplayScale.mV[VY]);
+	S32			height = getWorldViewHeightScaled();
 
 	// find world view center
-	F32			center_x = (F32)getWorldViewRectRaw().getCenterX() / mDisplayScale.mV[VX];
-	F32			center_y = (F32)getWorldViewRectRaw().getCenterY() / mDisplayScale.mV[VY];
+	F32			center_x = getWorldViewRectScaled().getCenterX();
+	F32			center_y = getWorldViewRectScaled().getCenterY();
 
 	// remap with uniform scale (1/height) so that top is -0.5, bottom is +0.5
 	F32 hud_x = -((F32)x - center_x)  / height;
@@ -3393,12 +3404,12 @@ LLVector3 LLViewerWindow::mouseDirectionCamera(const S32 x, const S32 y) const
 	F32			fov_width = fov_height * LLViewerCamera::getInstance()->getAspect();
 
 	// find screen resolution
-	S32			height = llround((F32)getWorldViewHeightRaw() / mDisplayScale.mV[VY]);
-	S32			width = llround((F32)getWorldViewWidthRaw() / mDisplayScale.mV[VX]);
+	S32			height = getWorldViewHeightScaled();
+	S32			width = getWorldViewWidthScaled();
 
 	// find world view center
-	F32			center_x = (F32)getWorldViewRectRaw().getCenterX() / mDisplayScale.mV[VX];
-	F32			center_y = (F32)getWorldViewRectRaw().getCenterY() / mDisplayScale.mV[VY];
+	F32			center_x = getWorldViewRectScaled().getCenterX();
+	F32			center_y = getWorldViewRectScaled().getCenterY();
 
 	// calculate click point relative to middle of screen
 	F32			click_x = (((F32)x - center_x) / (F32)width) * fov_width * -1.f;
@@ -4165,14 +4176,20 @@ LLRootView*	LLViewerWindow::getRootView() const
 
 LLRect LLViewerWindow::getWorldViewRectScaled() const
 {
-	LLRect world_view_rect = mWorldViewRectRaw;
-	world_view_rect.mLeft = llround((F32)world_view_rect.mLeft / mDisplayScale.mV[VX]);
-	world_view_rect.mRight = llround((F32)world_view_rect.mRight / mDisplayScale.mV[VX]);
-	world_view_rect.mBottom = llround((F32)world_view_rect.mBottom / mDisplayScale.mV[VY]);
-	world_view_rect.mTop = llround((F32)world_view_rect.mTop / mDisplayScale.mV[VY]);
-	return world_view_rect;
+	return mWorldViewRectScaled;
+}
+
+S32 LLViewerWindow::getWorldViewHeightScaled() const
+{
+	return mWorldViewRectScaled.getHeight();
 }
 
+S32 LLViewerWindow::getWorldViewWidthScaled() const
+{
+	return mWorldViewRectScaled.getWidth();
+}
+
+
 S32 LLViewerWindow::getWorldViewHeightRaw() const
 {
 	return mWorldViewRectRaw.getHeight(); 
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index ce71ef6173d..517993182be 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -212,6 +212,8 @@ class LLViewerWindow : public LLWindowCallbacks
 
 	// 3D world area in scaled pixels (via UI scale), use for most UI computations
 	LLRect			getWorldViewRectScaled() const;
+	S32				getWorldViewHeightScaled() const;
+	S32				getWorldViewWidthScaled() const;
 
 	// 3D world area, in raw unscaled pixels
 	LLRect			getWorldViewRectRaw() const		{ return mWorldViewRectRaw; }
@@ -415,6 +417,7 @@ class LLViewerWindow : public LLWindowCallbacks
 	LLRect			mWindowRectRaw;				// whole window, including UI
 	LLRect			mWindowRectScaled;			// whole window, scaled by UI size
 	LLRect			mWorldViewRectRaw;			// area of screen for 3D world
+	LLRect			mWorldViewRectScaled;		// area of screen for 3D world scaled by UI size
 	LLRootView*		mRootView;					// a view of size mWindowRectRaw, containing all child views
 	LLVector2		mDisplayScale;
 
-- 
GitLab


From 6e7d131e5800d921ec9bcf7b51f619256367fa55 Mon Sep 17 00:00:00 2001
From: brad kittenbrink <brad@lindenlab.com>
Date: Mon, 16 Nov 2009 19:06:44 -0500
Subject: [PATCH 343/557] Fix for EXT-2529,Windows error: "application
 configuration is incorrect." Fixed by implementing DEV-41250 and integrating
 merov's DEV-31329 "curl crashers" work into viewer-2-0.

---
 install.xml | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/install.xml b/install.xml
index ff9fa805003..de5bdc4b377 100644
--- a/install.xml
+++ b/install.xml
@@ -132,9 +132,9 @@
           <key>windows</key>
           <map>
             <key>md5sum</key>
-            <string>70b51d0cc93c305026e4e2778cde6d19</string>
+            <string>f5cf8d121b26f2e7944f7e63cdbff04d</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.6.0-windows-20090722.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.6.0-windows-20091105.tar.bz2</uri>
           </map>
         </map>
       </map>
@@ -254,9 +254,9 @@
           <key>windows</key>
           <map>
             <key>md5sum</key>
-            <string>8dc4e818c2d6fbde76e9a5e34f4ffa72</string>
+            <string>53e5ab7affff7121a5af2f82b4d58b54</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.19.6-windows-20090917b.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.19.6-windows-20091016.tar.bz2</uri>
           </map>
         </map>
       </map>
-- 
GitLab


From 32fd8fa0874abc39bbe0f16f8eb5723bd83afb41 Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Mon, 16 Nov 2009 16:18:59 -0800
Subject: [PATCH 344/557] EXT-2110 - Help -> Abuse Report produces noticeable
 3-10 second hang Only happens with small windows because of some code that
 does font resizing on high res. Changed the scale factor threshold to cover
 vast majority of cases.

---
 indra/newview/llviewerwindow.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 90a79698f6f..bb572260504 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -3944,7 +3944,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
 		return FALSE ;
 	}
 
-	BOOL high_res = scale_factor > 1.f;
+	BOOL high_res = scale_factor >= 2.f; // Font scaling is slow, only do so if rez is much higher
 	if (high_res)
 	{
 		send_agent_pause();
-- 
GitLab


From d8e1af97361a81dd571ccb64b859ae1e5157339e Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Mon, 16 Nov 2009 16:48:58 -0800
Subject: [PATCH 345/557] Increasing texture cache version to force cache clear
 of possibly corrupted texture caches from previous 2.0 versions. Enabling
 Admin menu in God Mode independent of Advanced menu.

---
 indra/newview/lltexturecache.cpp | 2 +-
 indra/newview/llviewermenu.cpp   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index c33c652935a..845e71378a7 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -917,7 +917,7 @@ BOOL LLTextureCache::isInLocal(const LLUUID& id)
 
 //static
 const S32 MAX_REASONABLE_FILE_SIZE = 512*1024*1024; // 512 MB
-F32 LLTextureCache::sHeaderCacheVersion = 1.3f;
+F32 LLTextureCache::sHeaderCacheVersion = 1.4f;
 U32 LLTextureCache::sCacheMaxEntries = MAX_REASONABLE_FILE_SIZE / TEXTURE_CACHE_ENTRY_SIZE;
 S64 LLTextureCache::sCacheMaxTexturesSize = 0; // no limit
 const char* entries_filename = "texture.entries";
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 68a9aaef757..6a6aa1061dc 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -5189,7 +5189,7 @@ void show_debug_menus()
 		gMenuBarView->setItemEnabled("Develop", qamode);
 
 		// Server ('Admin') menu hidden when not in godmode.
-		const bool show_server_menu = debug && (gAgent.getGodLevel() > GOD_NOT || gAgent.getAdminOverride());
+		const bool show_server_menu = (gAgent.getGodLevel() > GOD_NOT || (debug && gAgent.getAdminOverride()));
 		gMenuBarView->setItemVisible("Admin", show_server_menu);
 		gMenuBarView->setItemEnabled("Admin", show_server_menu);
 	}
-- 
GitLab


From d504efe3018bd0ce616e67c30b0bb31f5637973a Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Mon, 16 Nov 2009 16:52:43 -0800
Subject: [PATCH 346/557] Made nearby media list sort on distance from avatar
 instead of priority.

When the MediaPerformanceManagerDebug debug setting is enabled, the list will sort by priority the way it used to.
---
 indra/newview/llviewermedia.cpp | 62 ++++++++++++++++++++++-----------
 indra/newview/llviewermedia.h   |  2 ++
 2 files changed, 44 insertions(+), 20 deletions(-)

diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 70490d3a6ee..4663e9c8e60 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -32,6 +32,7 @@
 
 #include "llviewerprecompiledheaders.h"
 
+#include "llagent.h"
 #include "llviewermedia.h"
 #include "llviewermediafocus.h"
 #include "llmimetypes.h"
@@ -571,6 +572,11 @@ bool LLViewerMedia::priorityComparitor(const LLViewerMediaImpl* i1, const LLView
 		// Playable items sort above ones that wouldn't play even if they got high enough priority
 		return false;
 	}
+	else if(i1->getInterest() == i2->getInterest())
+	{
+		// Generally this will mean both objects have zero interest.  In this case, sort on distance.
+		return (i1->getProximityDistance() < i2->getProximityDistance());
+	}
 	else
 	{
 		// The object with the larger interest value should be earlier in the list, so we reverse the sense of the comparison here.
@@ -578,6 +584,11 @@ bool LLViewerMedia::priorityComparitor(const LLViewerMediaImpl* i1, const LLView
 	}
 }
 
+static bool proximity_comparitor(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2)
+{
+	return (i1->getProximityDistance() < i2->getProximityDistance());
+}
+
 //////////////////////////////////////////////////////////////////////////////////////////
 // static
 void LLViewerMedia::updateMedia()
@@ -603,12 +614,9 @@ void LLViewerMedia::updateMedia()
 	int impl_count_total = 0;
 	int impl_count_interest_low = 0;
 	int impl_count_interest_normal = 0;
-	int i = 0;
-
-#if 0	
-	LL_DEBUGS("PluginPriority") << "Sorted impls:" << llendl;
-#endif
-
+	
+	std::vector<LLViewerMediaImpl*> proximity_order;
+	
 	U32 max_instances = gSavedSettings.getU32("PluginInstancesTotal");
 	U32 max_normal = gSavedSettings.getU32("PluginInstancesNormal");
 	U32 max_low = gSavedSettings.getU32("PluginInstancesLow");
@@ -714,23 +722,27 @@ void LLViewerMedia::updateMedia()
 		}
 		else
 		{
-			// Other impls just get the same ordering as the priority list (for now).
-			pimpl->mProximity = i;
+			proximity_order.push_back(pimpl);
 		}
 
-#if 0		
-		LL_DEBUGS("PluginPriority") << "    " << pimpl 
-			<< ", setting priority to " << new_priority
-			<< (pimpl->hasFocus()?", HAS FOCUS":"") 
-			<< (pimpl->getUsedInUI()?", is UI":"") 
-			<< ", cpu " << pimpl->getCPUUsage() 
-			<< ", interest " << pimpl->getInterest() 
-			<< ", media url " << pimpl->getMediaURL() << llendl;
-#endif
-
 		total_cpu += pimpl->getCPUUsage();
-		
-		i++;
+	}
+	
+	if(gSavedSettings.getBOOL("MediaPerformanceManagerDebug"))
+	{
+		// Give impls the same ordering as the priority list
+		// they're already in the right order for this.
+	}
+	else
+	{
+		// Use a distance-based sort for proximity values.  
+		std::stable_sort(proximity_order.begin(), proximity_order.end(), proximity_comparitor);
+	}
+
+	// Transfer the proximity order to the proximity fields in the objects.
+	for(int i = 0; i < proximity_order.size(); i++)
+	{
+		proximity_order[i]->mProximity = i;
 	}
 	
 	LL_DEBUGS("PluginPriority") << "Total reported CPU usage is " << total_cpu << llendl;
@@ -782,6 +794,7 @@ LLViewerMediaImpl::LLViewerMediaImpl(	  const LLUUID& texture_id,
 	mIsDisabled(false),
 	mIsParcelMedia(false),
 	mProximity(-1),
+	mProximityDistance(0.0f),
 	mMimeTypeProbe(NULL),
 	mIsUpdated(false)
 { 
@@ -2109,6 +2122,15 @@ void LLViewerMediaImpl::calculateInterest()
 		mInterest = 0.0f;
 	}
 	
+	// Calculate distance from the avatar, for use in the proximity calculation.
+	mProximityDistance = 0.0f;
+	if(!mObjectList.empty())
+	{
+		// Just use the first object in the list.  We could go through the list and find the closest object, but this should work well enough.
+		LLVector3d global_delta = gAgent.getPositionGlobal() - (*mObjectList.begin())->getPositionGlobal();
+		mProximityDistance = global_delta.magVecSquared();  // use distance-squared because it's cheaper and sorts the same.
+	}
+	
 	if(mNeedsMuteCheck)
 	{
 		// Check all objects this instance is associated with, and those objects' owners, against the mute list
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index a06079786e9..f4afce6c4c9 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -270,6 +270,7 @@ class LLViewerMediaImpl
 	F64 getInterest() const { return mInterest; };
 	F64 getApproximateTextureInterest();
 	S32 getProximity() const { return mProximity; };
+	F64 getProximityDistance() const { return mProximityDistance; };
 	
 	// Mark this object as being used in a UI panel instead of on a prim
 	// This will be used as part of the interest sorting algorithm.
@@ -339,6 +340,7 @@ class LLViewerMediaImpl
 	bool mIsDisabled;
 	bool mIsParcelMedia;
 	S32 mProximity;
+	F64 mProximityDistance;
 	LLMimeDiscoveryResponder *mMimeTypeProbe;
 	
 private:
-- 
GitLab


From 9849abc2132d2016c7a4409163ab8df26b2f1403 Mon Sep 17 00:00:00 2001
From: Erica <erica@lindenlab.com>
Date: Mon, 16 Nov 2009 17:25:28 -0800
Subject: [PATCH 347/557] EXT-2537 Update IM message well arrows with actual
 art, style chiclets to spec

---
 .../default/xui/en/panel_instant_message.xml  | 55 +++++++++----------
 1 file changed, 27 insertions(+), 28 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_instant_message.xml b/indra/newview/skins/default/xui/en/panel_instant_message.xml
index be568661193..1e570bf207c 100644
--- a/indra/newview/skins/default/xui/en/panel_instant_message.xml
+++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  background_visible="true"
- bg_alpha_color="0.3 0.3 0.3 0"
  height="175"
  label="im_panel"
  layout="topleft"
@@ -18,7 +17,7 @@
      bevel_style="in"
      bg_alpha_color="black"
      follows="top"
-     height="20"
+     height="24"
      label="im_header"
      layout="topleft"
      left="5"
@@ -27,52 +26,53 @@
      width="295">
         <avatar_icon
          follows="right"
-         height="20"
-         image_name="icon_avatar_online.tga"
+         height="18"
+         image_name="Generic_Person"
          layout="topleft"
-         left="0"
+         left="3"
          mouse_opaque="true"
          name="avatar_icon"
-         top="0"
-         width="20" />
-        <icon
+         top="3"
+         width="18" />
+        <!--<icon
          follows="right"
          height="20"
-         image_name="icon_top_pick.tga"
+         image_name=""
          layout="topleft"
-         left="0"
+         left="3"
          mouse_opaque="true"
          name="sys_msg_icon"
          top="0"
-         width="20" />
+         width="20" />-->
         <text
          follows="left|right"
-         font="SansSerifBold"
-         height="20"
+         font.style="BOLD"
+         height="12"
          layout="topleft"
          left_pad="5"
          name="user_name"
          text_color="white"
-         top="5"
-         value="Darth Vader"
-         width="295" />
+         top="8"
+         use_ellipses="true"
+         value="Erica Vader"
+         width="212" />
 	 <!-- TIME STAMP -->
         <text
+        font="SansSerifSmall"
          follows="right"
-         font="SansSerif"
-         height="20"
+         height="13"
          layout="topleft"
 	 halign="right"
-         left="245"
+         right="-5"
          name="time_box"
-         text_color="white"
-         top="5"
+         top="8"
          value="23:30"
          width="50" />
     </panel>
     <text
-     follows="left|top|bottom|right"
-     height="86"
+        font="SansSerifSmall"
+     follows="all"
+     height="97"
      layout="topleft"
      left="10"
      name="message"
@@ -85,12 +85,11 @@
      max_length="350" />
     <button
      follows="bottom"
-     font="SansSerifBold"
-     height="25"
+     height="23"
      label="Reply"
      layout="topleft"
-     left="97"
+     left="100"
      name="reply"
-     top="137"
-     width="110" />
+     top="144"
+     width="100" />
 </panel>
-- 
GitLab


From a33a53cacd0e497e759e88850fa087136712d252 Mon Sep 17 00:00:00 2001
From: Erica <erica@lindenlab.com>
Date: Mon, 16 Nov 2009 17:33:30 -0800
Subject: [PATCH 348/557] IM Control layout

---
 .../default/xui/en/panel_im_control_panel.xml | 51 +++++++------------
 1 file changed, 19 insertions(+), 32 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
index e81532ec3eb..44305f7dea3 100644
--- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
@@ -3,64 +3,56 @@
  border="false"
  height="350"
  name="panel_im_control_panel"
- width="131">
-
+ width="110">
     <avatar_icon
      follows="left|top"
-     height="125"
-     left_delta="3"
+     height="100"
+     left_delta="5"
      name="avatar_icon"
-     top="-10"
-     width="125"/>
-
+     top="-5"
+     width="100"/>
     <text
      follows="top|left|right"
-     font="SansSerifBig"
+     font="SansSerifLarge"
      height="16"
      layout="topleft"
      name="avatar_name"
      use_ellipses="true"
      value="Unknown"
-     width="125" />
-
+     width="100" />
     <button
      follows="left|bottom"
      height="20"
-     label="View Profile"
+     label="Profile"
      name="view_profile_btn"
-     width="125"/>
-
+     width="100" />
     <button
      follows="left|bottom"
      height="20"
      label="Add Friend"
      name="add_friend_btn"
-     width="125"/>
-
+     width="100" />
     <button
      follows="left|bottom"
      height="20"
      label="Teleport"
      name="teleport_btn"
-     width="125"/>
-
+     width="100" />
     <button
      follows="left|bottom"
      height="20"
      label="Share"
      name="share_btn"
-     width="125"/>
-
+     width="100" />
     <button
      follows="left|bottom"
      height="20"
      label="Pay"
      name="pay_btn"
-     width="125"/>
-
+     width="100" />
     <panel
      background_visible="true"
-     bg_alpha_color="0.2 0.2 0.2 1"
+     bg_alpha_color="DkGray2"
      border="false"
      bottom="1"
      follows="left|bottom"
@@ -69,24 +61,21 @@
      left_pad="0"
      name="panel_call_buttons"
      top_pad="0"
-     width="131">
-
+     width="110">
         <button
          bottom="10"
          height="20"
          label="Call"
-         left_delta="3"
+         left_delta="5"
          name="call_btn"
-         width="125"/>
-
+         width="100" />
         <button
          bottom="40"
          height="20"
          label="Leave Call"
          name="end_call_btn"
          visible="false"
-         width="125"/>
-
+         width="100" />
         <button
          enabled="false"
          bottom="10"
@@ -94,8 +83,6 @@
          label="Open Voice Controls"
          name="voice_ctrls_btn"
          visible="false"
-         width="125"/>
-
+         width="100" />
     </panel>
-
 </panel>
-- 
GitLab


From 6b71a9f651798d0391dfe861c5fa86a5ac32c75b Mon Sep 17 00:00:00 2001
From: Erica <erica@lindenlab.com>
Date: Mon, 16 Nov 2009 17:40:16 -0800
Subject: [PATCH 349/557] Chat Header layout

---
 .../default/xui/en/panel_chat_header.xml      | 60 +++++++++----------
 1 file changed, 30 insertions(+), 30 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml
index 64519b25715..ff7afeb3996 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml
@@ -1,44 +1,44 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
- background_visible="true"
- bevel_style="in"
- bg_alpha_color="black"
- follows="left|top|right"
- height="20"
+      background_visible="true"
+     bevel_style="in"
+     bg_alpha_color="black"
+     follows="top"
+     height="24"
  label="im_header"
  layout="topleft"
  name="im_header" >
-    <avatar_icon
-     follows="left"
-     height="16"
-     image_name="icon_avatar_online.tga"
-     layout="topleft"
-     left="2"
-     mouse_opaque="true"
-     name="avatar_icon"
-     top="2"
-     width="16" />
+             <avatar_icon
+         follows="left"
+         height="18"
+         image_name="Generic_Person"
+         layout="topleft"
+         left="3"
+         mouse_opaque="true"
+         name="avatar_icon"
+         top="3"
+         width="18" />
     <text
      follows="left|right"
-     font="SansSerifBigBold"
-     height="20"
-     layout="topleft"
-     left_pad="6"
+      font.style="BOLD"
+         height="12"
+         layout="topleft"
+         left_pad="5"
      right="-50"
      name="user_name"
      text_color="white"
-     top="3"
-     value="Darth Vader"
-     use_ellipses="true" />
+         top="8"
+         use_ellipses="true"
+         value="Erica Vader" />
     <text
-     follows="right"
-     font="SansSerifBig"
-     height="20"
-     layout="topleft"
+            font="SansSerifSmall"
+         follows="right"
+         height="13"
+         layout="topleft"
+         left_pad="5"
      name="time_box"
      right="0"
-     text_color="white"
-     top="3"
-     value="23:30"
-     width="50" />
+     top="8"
+         value="23:30"
+         width="50" />
 </panel>
-- 
GitLab


From 516b2fe7cdf23947600a0983ad80f9a44534cfe2 Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Mon, 16 Nov 2009 17:41:31 -0800
Subject: [PATCH 350/557] EXT-525 - World Maps landmarks drop-down does not
 find the location

---
 indra/newview/skins/default/xui/en/floater_world_map.xml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml
index 387ffbd5b30..c60cc163c88 100644
--- a/indra/newview/skins/default/xui/en/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_world_map.xml
@@ -340,6 +340,8 @@
          label="Landmarks"
          name="item1"
          value="None" />
+		<combo_box.commit_callback
+		function="WMap.Landmark"/>
     </combo_box>
     <icon
      color="0.5 0 0 1"
-- 
GitLab


From dd4a4409cd074e5b6747a3bc7dcbfebac4e6ba9f Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Mon, 16 Nov 2009 17:46:43 -0800
Subject: [PATCH 351/557] Eliminated redundant selection callback for
 LLComboBox (mSelectionCallback).

---
 indra/llui/llcombobox.cpp            | 7 -------
 indra/llui/llcombobox.h              | 4 +---
 indra/newview/llfloateruipreview.cpp | 4 ++--
 indra/newview/llnavigationbar.cpp    | 2 +-
 indra/newview/llpanelplaces.cpp      | 2 +-
 indra/newview/llsearchcombobox.cpp   | 2 +-
 6 files changed, 6 insertions(+), 15 deletions(-)

diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp
index 36e309d639e..b84aa269d2a 100644
--- a/indra/llui/llcombobox.cpp
+++ b/indra/llui/llcombobox.cpp
@@ -102,7 +102,6 @@ LLComboBox::LLComboBox(const LLComboBox::Params& p)
 	mMaxChars(p.max_chars),
 	mPrearrangeCallback(p.prearrange_callback()),
 	mTextEntryCallback(p.text_entry_callback()),
-	mSelectionCallback(p.selection_callback()),
 	mListPosition(p.list_position),
 	mLastSelectedIndex(-1)
 {
@@ -706,12 +705,6 @@ void LLComboBox::onItemSelected(const LLSD& data)
 
 	// commit does the reverse, asserting the value in the list
 	onCommit();
-
-	// call the callback if it exists
-	if(mSelectionCallback)
-	{
-		mSelectionCallback(this, data);
-	}
 }
 
 BOOL LLComboBox::handleToolTip(S32 x, S32 y, MASK mask)
diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h
index 6285ca5170b..1aafbf93d34 100644
--- a/indra/llui/llcombobox.h
+++ b/indra/llui/llcombobox.h
@@ -82,8 +82,7 @@ class LLComboBox
 											allow_new_values;
 		Optional<S32>						max_chars;
 		Optional<commit_callback_t> 		prearrange_callback,
-											text_entry_callback,
-											selection_callback;
+											text_entry_callback;
 
 		Optional<EPreferredPosition, PreferredPositionValues>	list_position;
 		
@@ -200,7 +199,6 @@ class LLComboBox
 
 	void			setPrearrangeCallback( commit_callback_t cb ) { mPrearrangeCallback = cb; }
 	void			setTextEntryCallback( commit_callback_t cb ) { mTextEntryCallback = cb; }
-	void			setSelectionCallback( commit_callback_t cb ) { mSelectionCallback = cb; }
 
 	void			setButtonVisible(BOOL visible);
 
diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index 3613ac803ef..a1c6704657d 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -431,9 +431,9 @@ BOOL LLFloaterUIPreview::postBuild()
 
 	// get pointers to buttons and link to callbacks
 	mLanguageSelection = main_panel_tmp->getChild<LLComboBox>("language_select_combo");
-	mLanguageSelection->setSelectionCallback(boost::bind(&LLFloaterUIPreview::onLanguageComboSelect, this, mLanguageSelection));
+	mLanguageSelection->setCommitCallback(boost::bind(&LLFloaterUIPreview::onLanguageComboSelect, this, mLanguageSelection));
 	mLanguageSelection_2 = main_panel_tmp->getChild<LLComboBox>("language_select_combo_2");
-	mLanguageSelection_2->setSelectionCallback(boost::bind(&LLFloaterUIPreview::onLanguageComboSelect, this, mLanguageSelection));
+	mLanguageSelection_2->setCommitCallback(boost::bind(&LLFloaterUIPreview::onLanguageComboSelect, this, mLanguageSelection));
 	LLPanel* editor_panel_tmp = main_panel_tmp->getChild<LLPanel>("editor_panel");
 	mDisplayFloaterBtn = main_panel_tmp->getChild<LLButton>("display_floater");
 	mDisplayFloaterBtn->setClickedCallback(boost::bind(&LLFloaterUIPreview::onClickDisplayFloater, this, PRIMARY_FLOATER));
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 794d73a5ade..0c2782fd8a0 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -217,7 +217,7 @@ BOOL LLNavigationBar::postBuild()
 
 	mBtnHome->setClickedCallback(boost::bind(&LLNavigationBar::onHomeButtonClicked, this));
 
-	mCmbLocation->setSelectionCallback(boost::bind(&LLNavigationBar::onLocationSelection, this));
+	mCmbLocation->setCommitCallback(boost::bind(&LLNavigationBar::onLocationSelection, this));
 	
 	mSearchComboBox->setCommitCallback(boost::bind(&LLNavigationBar::onSearchCommit, this));
 
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index eb10d97b371..19a8ab58c06 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -223,7 +223,7 @@ BOOL LLPanelPlaces::postBuild()
 	notes_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this));
 
 	LLComboBox* folder_combo = mLandmarkInfo->getChild<LLComboBox>("folder_combo");
-	folder_combo->setSelectionCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this));
+	folder_combo->setCommitCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this));
 
 	return TRUE;
 }
diff --git a/indra/newview/llsearchcombobox.cpp b/indra/newview/llsearchcombobox.cpp
index f95671685b3..93a70b6471a 100644
--- a/indra/newview/llsearchcombobox.cpp
+++ b/indra/newview/llsearchcombobox.cpp
@@ -82,7 +82,7 @@ LLSearchComboBox::LLSearchComboBox(const Params&p)
 	setButtonVisible(p.dropdown_button_visible);
 	mTextEntry->setCommitCallback(boost::bind(&LLComboBox::onTextCommit, this, _2));
 	mTextEntry->setKeystrokeCallback(boost::bind(&LLComboBox::onTextEntry, this, _1), NULL);
-	setSelectionCallback(boost::bind(&LLSearchComboBox::onSelectionCommit, this));
+	setCommitCallback(boost::bind(&LLSearchComboBox::onSelectionCommit, this));
 	setPrearrangeCallback(boost::bind(&LLSearchComboBox::onSearchPrearrange, this, _2));
 	mSearchButton->setCommitCallback(boost::bind(&LLSearchComboBox::onTextCommit, this, _2));
 }
-- 
GitLab


From 27a555e443c98ce1a41ef21e6111bdfe903894e8 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Mon, 16 Nov 2009 17:53:18 -0800
Subject: [PATCH 352/557] Hopefully the final fix for DEV-42800 (white flash at
 login).

Reinstated the hide_loading parameter to LLMediaCtrl, and made it cause LLMediaCtrl::draw() to early-exit between creating the LLViewerMediaImpl and receiving the initial MEDIA_EVENT_NAVIGATE_COMPLETE.
---
 indra/newview/llmediactrl.cpp                 | 22 +++++++++++++------
 indra/newview/llmediactrl.h                   |  1 +
 .../skins/default/xui/en/panel_login.xml      |  1 +
 3 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index 8f29f908e5c..90c009887da 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -92,6 +92,7 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
 	mStretchToFill( true ),
 	mMaintainAspectRatio ( true ),
 	mHideLoading (false),
+	mHidingInitialLoad (false),
 	mDecoupleTextureSize ( false ),
 	mTextureWidth ( 1024 ),
 	mTextureHeight ( 1024 )
@@ -616,6 +617,11 @@ bool LLMediaCtrl::ensureMediaSourceExists()
 			mMediaSource->setHomeURL(mHomePageUrl);
 			mMediaSource->setVisible( getVisible() );
 			mMediaSource->addObserver( this );
+
+			if(mHideLoading)
+			{
+				mHidingInitialLoad = true;
+			}
 		}
 		else
 		{
@@ -685,7 +691,13 @@ void LLMediaCtrl::draw()
 	{
 		setFrequentUpdates( false );
 	};
-
+	
+	if(mHidingInitialLoad)
+	{
+		// If we're hiding loading, don't draw at all.
+		return;
+	}
+	
 	// alpha off for this
 	LLGLSUIDefault gls_ui;
 	LLGLDisable gls_alphaTest( GL_ALPHA_TEST );
@@ -865,19 +877,15 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
 		case MEDIA_EVENT_NAVIGATE_BEGIN:
 		{
 			LL_DEBUGS("Media") <<  "Media event:  MEDIA_EVENT_NAVIGATE_BEGIN, url is " << self->getNavigateURI() << LL_ENDL;
-			if(mMediaSource && mHideLoading)
-			{
-				mMediaSource->suspendUpdates(true);
-			}
 		};
 		break;
 		
 		case MEDIA_EVENT_NAVIGATE_COMPLETE:
 		{
 			LL_DEBUGS("Media") <<  "Media event:  MEDIA_EVENT_NAVIGATE_COMPLETE, result string is: " << self->getNavigateResultString() << LL_ENDL;
-			if(mMediaSource && mHideLoading)
+			if(mHidingInitialLoad)
 			{
-				mMediaSource->suspendUpdates(false);
+				mHidingInitialLoad = false;
 			}
 		};
 		break;
diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h
index 76ddc61ebf2..f07513a3fdb 100644
--- a/indra/newview/llmediactrl.h
+++ b/indra/newview/llmediactrl.h
@@ -188,6 +188,7 @@ class LLMediaCtrl :
 		bool mStretchToFill;
 		bool mMaintainAspectRatio;
 		bool mHideLoading;
+		bool mHidingInitialLoad;
 		bool mDecoupleTextureSize;
 		S32 mTextureWidth;
 		S32 mTextureHeight;
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index cb5ec153875..a9a02e8fc71 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -27,6 +27,7 @@
      border_visible="false"
      bottom="600"
      follows="all"
+	 hide_loading="true"
      left="0"
      name="login_html"
      start_url=""
-- 
GitLab


From e0eee4324e9399bccf0d7f013dfc9f1e42f2cd57 Mon Sep 17 00:00:00 2001
From: Erica <erica@lindenlab.com>
Date: Mon, 16 Nov 2009 17:53:48 -0800
Subject: [PATCH 353/557] Chat Item layout

---
 .../skins/default/xui/en/panel_chat_item.xml  | 81 +++++++++++++------
 1 file changed, 56 insertions(+), 25 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_chat_item.xml b/indra/newview/skins/default/xui/en/panel_chat_item.xml
index 05b04bbf8ea..9e071072f28 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_item.xml
@@ -1,38 +1,69 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <!-- All our XML is utf-8 encoded. -->
-
 <panel
   name="instant_message"
   width="300"
   height="180"
-  background_opaque="true"
-  background_visible="false"
-  follows="left|top|right|bottom"
-  bg_alpha_color="0.3 0.3 0.3 0">
-	<panel width="250" height="30" background_visible="true" background_opaque="false" bg_alpha_color="0.0 0.0 0.0 1.0" name="msg_caption">
-  		<avatar_icon
-      		top="25" left="10" width="20" height="20" follows="left|top"
-      		color="1 1 1 1" enabled="true" name="avatar_icon"
-		  />
+  follows="all">
+	<panel
+	width="250"
+	height="24"
+	background_visible="true"
+	background_opaque="false"
+	bg_alpha_color="Black"
+	name="msg_caption">
+             <avatar_icon
+         follows="left"
+         height="18"
+         image_name="Generic_Person"
+         layout="topleft"
+         left="3"
+         mouse_opaque="true"
+         name="avatar_icon"
+         top="3"
+         width="18" />
     	<text
-        	width="130" top="25" left="40" height="20" follows="left|right|top"
-        	font="SansSerifBigBold" text_color="white" word_wrap="false" use_ellipses="true"
-        	mouse_opaque="true" name="sender_name" >
+                font.style="BOLD"
+                height="12"
+         layout="topleft"
+	 left_pad="5"
+	 top="7"
+		text_color="white"
+		word_wrap="false"
+		use_ellipses="true"
+        	mouse_opaque="true"
+		name="sender_name"
+        	width="175">
 	      Jerry Knight
     	</text>
-    	<icon top="22" left="170" width="15" height="15" follows="top|right"
-      		image_name="icn_voice-pvtfocus.tga" visible="false" name="msg_inspector"/>
-    	<icon top="22" left="190" width="10" height="10" follows="top|right"
-      		image_name="speaking_indicator.tga"	name="msg_icon"/>
-    	<text width="35" top="22" left="205" height="20" follows="right|top"
-        		text_color="white" word_wrap="true" mouse_opaque="true" name="msg_time" >
-      		10:32
-		</text>
+   <!-- 	<icon top="22" left="170" width="15" height="15" follows="top|right"
+      		image_name="icn_voice-pvtfocus.tga" visible="false" name="msg_inspector" />-->
+    	<!--<icon top="22" left="190" width="10" height="10" follows="top|right"
+      		image_name="speaking_indicator.tga"	name="msg_icon"/>-->
+	 <text
+            font="SansSerifSmall"
+         follows="right|top"
+	 halign="right"
+         height="13"
+         layout="topleft"
+         right="-5"
+	 left="205"
+	 mouse_opaque="true"
+      name="msg_time"
+        top="8"
+         value="23:30"
+         width="50"
+	 word_wrap="true" />
 	</panel>
 	<text_chat
-      top="-35" left="10" right="-10" height="120" follows="left|right|bottom"
-      font="SansSerifSmall" text_color="white" word_wrap="true"
-      mouse_opaque="true" name="msg_text" >    
+      top="-35"
+      left="10"
+      right="-10"
+      height="120"
+      follows="left|right|bottom"
+      text_color="white"
+      word_wrap="true"
+      mouse_opaque="true"
+      name="msg_text">
 	</text_chat>
 </panel>
-
-- 
GitLab


From 16fa3a40e30e453a0feadf7fe053ba6442057dc9 Mon Sep 17 00:00:00 2001
From: callum <none@none>
Date: Mon, 16 Nov 2009 18:41:53 -0800
Subject: [PATCH 354/557] Fix for usual signed/unsigned int error from Mac
 developed changes..

---
 indra/newview/llviewermedia.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 4663e9c8e60..3a7c54479b3 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -740,7 +740,7 @@ void LLViewerMedia::updateMedia()
 	}
 
 	// Transfer the proximity order to the proximity fields in the objects.
-	for(int i = 0; i < proximity_order.size(); i++)
+	for(int i = 0; i < (int)proximity_order.size(); i++)
 	{
 		proximity_order[i]->mProximity = i;
 	}
-- 
GitLab


From 18eab4a02675195c6498ca7b0982e62f0ddf9e60 Mon Sep 17 00:00:00 2001
From: callum <none@none>
Date: Mon, 16 Nov 2009 18:42:35 -0800
Subject: [PATCH 355/557] Merge with tip

---
 .../quicktime/media_plugin_quicktime.cpp       | 16 +++++++++++-----
 .../llplugintest/llmediaplugintest.cpp         | 18 ++++++++++++------
 2 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
index dac05095317..182fab69d0c 100644
--- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
+++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
@@ -552,7 +552,7 @@ class MediaPluginQuickTime : public MediaPluginBase
 		processState();
 
 		// see if title arrived and if so, update member variable with contents
-		checkTitle();
+		//checkTitle();
 		
 		// QT call to see if we are at the end - can't do with controller
 		if ( IsMovieDone( mMovieHandle ) )
@@ -718,18 +718,24 @@ class MediaPluginQuickTime : public MediaPluginBase
 		// find the size of the title
 		ByteCount size;
 		result = QTMetaDataGetItemValue( media_data_ref, item, NULL, 0, &size );
-		if ( noErr != result || size <= 0 ) 
+		if ( noErr != result || size <= 0 /*|| size > 1024 /* FIXME: arbitrary limit */ ) 
 			return false;
 
 		// allocate some space and grab it
-		UInt8* item_data = new UInt8( size );
-		memset( item_data, 0, size * sizeof( UInt8* ) );
+		UInt8* item_data = new UInt8( size + 1 );
+		memset( item_data, 0, ( size + 1 ) * sizeof( UInt8* ) );
 		result = QTMetaDataGetItemValue( media_data_ref, item, item_data, size, NULL );
 		if ( noErr != result ) 
+		{
+			delete [] item_data;
 			return false;
+		};
 
 		// save it
-		mMovieTitle = std::string( (char* )item_data );
+		if ( strlen( (char*)item_data ) )
+			mMovieTitle = std::string( (char* )item_data );
+		else
+			mMovieTitle = "";
 
 		// clean up
 		delete [] item_data;
diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp
index d987915bb8b..ee27ad77df8 100644
--- a/indra/test_apps/llplugintest/llmediaplugintest.cpp
+++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp
@@ -223,13 +223,16 @@ LLMediaPluginTest::LLMediaPluginTest( int app_window, int window_width, int wind
 	resetView();
 
 	// initial media panel
+	//const int num_initial_panels = 1;
+	//for( int i = 0; i < num_initial_panels; ++i )
+	//{
+	//	//addMediaPanel( mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second );
+	//	addMediaPanel( mHomeWebUrl );
+	//};
+
+addMediaPanel( "http://chemicaljump.com/wp-content/uploads/2009/10/lth34/Proxy-8000.mp3" );
+addMediaPanel( "http://movies.apple.com/movies/sony_pictures/zombieland/zombieland-inttlr_h.320.mov" );
 
-	const int num_initial_panels = 1;
-	for( int i = 0; i < num_initial_panels; ++i )
-	{
-		//addMediaPanel( mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second );
-		addMediaPanel( mHomeWebUrl );
-	};
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -1460,6 +1463,9 @@ std::string LLMediaPluginTest::mimeTypeFromUrl( std::string& url )
 	if ( url.find( ".txt" ) != std::string::npos )	// Apple Text descriptors
 		mime_type = "video/quicktime";
 	else
+	if ( url.find( ".mp3" ) != std::string::npos )	// Apple Text descriptors
+		mime_type = "video/quicktime";
+	else
 	if ( url.find( "example://" ) != std::string::npos )	// Example plugin
 		mime_type = "example/example";
 
-- 
GitLab


From 76d7ecf6ba6dab2d20422f96880e351a02612d01 Mon Sep 17 00:00:00 2001
From: richard <none@none>
Date: Mon, 16 Nov 2009 19:14:59 -0800
Subject: [PATCH 356/557] fix for llfasttimer not appearing with tall windows

reviewed by Palmer
---
 indra/newview/lldebugview.cpp   | 4 ++--
 indra/newview/llviewermedia.cpp | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp
index 20dc4440c24..169a963d0d1 100644
--- a/indra/newview/lldebugview.cpp
+++ b/indra/newview/lldebugview.cpp
@@ -79,7 +79,7 @@ void LLDebugView::init()
 
 	r.set(150 - 25, rect.getHeight() - 50, rect.getWidth()/2 - 25, rect.getHeight() - 450);
 
-	r.set(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f), 
+	r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f), 
   									 (S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f));
 	mFastTimerView = new LLFastTimerView(r);
 	mFastTimerView->setFollowsTop();
@@ -87,7 +87,7 @@ void LLDebugView::init()
 	mFastTimerView->setVisible(FALSE);			// start invisible
 	addChild(mFastTimerView);
 
-	r.set(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f), 
+	r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f), 
 									 (S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f));
 	LLMemoryView::Params mp;
 	mp.name("memory");
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 4663e9c8e60..dda7d35f7db 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -740,7 +740,7 @@ void LLViewerMedia::updateMedia()
 	}
 
 	// Transfer the proximity order to the proximity fields in the objects.
-	for(int i = 0; i < proximity_order.size(); i++)
+	for(int i = 0; i < (S32)proximity_order.size(); i++)
 	{
 		proximity_order[i]->mProximity = i;
 	}
-- 
GitLab


From ac9963ade2d8a70408f021581e44691285241bd1 Mon Sep 17 00:00:00 2001
From: callum <none@none>
Date: Mon, 16 Nov 2009 19:22:45 -0800
Subject: [PATCH 357/557] Fix for - DEV-42713 (Playing MP3s crash the QuickTime
 plugin) Note: This was fixed earlier in checkTitle() bosy and checked in by
 mistake. This checkin re-enables the title grabbing code.

---
 indra/media_plugins/quicktime/media_plugin_quicktime.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
index 182fab69d0c..7148edda5c0 100644
--- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
+++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
@@ -552,7 +552,7 @@ class MediaPluginQuickTime : public MediaPluginBase
 		processState();
 
 		// see if title arrived and if so, update member variable with contents
-		//checkTitle();
+		checkTitle();
 		
 		// QT call to see if we are at the end - can't do with controller
 		if ( IsMovieDone( mMovieHandle ) )
-- 
GitLab


From cab4c5c604f88ec8322e1c8bd89a526aaa2b255a Mon Sep 17 00:00:00 2001
From: Erica <erica@lindenlab.com>
Date: Mon, 16 Nov 2009 19:45:39 -0800
Subject: [PATCH 358/557] Chat Item layout

---
 .../default/xui/en/floater_nearby_chat.xml    | 15 ++-
 .../xui/en/panel_adhoc_control_panel.xml      | 23 ++---
 .../skins/default/xui/en/panel_avatar_tag.xml | 95 +++++++++----------
 .../default/xui/en/panel_chat_header.xml      |  6 +-
 4 files changed, 64 insertions(+), 75 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
index 7f58ea132ea..4f2d74b4177 100644
--- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater
  legacy_header_height="18"
- can_minimize="true"
+ can_minimize="false"
  can_tear_off="false"
  can_resize="false"
  can_drag_on_left="false"
@@ -11,7 +11,6 @@
  height="300"
  layout="topleft"
  name="nearby_chat"
- help_topic="nearby_chat"
  save_rect="true"
  title="NEARBY CHAT"
  save_dock_state="true"
@@ -19,19 +18,17 @@
  single_instance="true"
  width="320">
             <chat_history
-             allow_html="true" 
+             allow_html="true"
              bg_readonly_color="ChatHistoryBgColor"
              bg_writeable_color="ChatHistoryBgColor"
              follows="all"
-			 left="1"
+	    left="1"
              top="20"
-             font="SansSerif"
              layout="topleft"
-			 height="280"
+	    height="280"
              name="chat_history"
-             parse_highlights="true" 
+             parse_highlights="true"
              text_color="ChatHistoryTextColor"
              text_readonly_color="ChatHistoryTextColor"
-             width="320"/>
-
+             width="320" />
 </floater>
diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
index 0246e21d254..a283cff5b37 100644
--- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
@@ -4,10 +4,9 @@
  height="215"
  name="panel_im_control_panel"
  width="180">
-
     <avatar_list
      color="DkGray2"
-     follows="left|top|right|bottom"
+     follows="all"
      height="130"
      ignore_online_status="true"
      layout="topleft"
@@ -18,11 +17,10 @@
      show_profile_btn="false"
      show_speaking_indicator="false"
      top="10"
-     width="180"/>
-
+     width="180" />
     <panel
      background_visible="true"
-     bg_alpha_color="0.2 0.2 0.2 1"
+     bg_alpha_color="DkGray2"
      border="false"
      bottom="1"
      follows="left|bottom"
@@ -32,32 +30,27 @@
      name="panel_call_buttons"
      top_pad="0"
      width="180">
-
         <button
          bottom="10"
          height="20"
          label="Call"
-         left_delta="28"
+         left_delta="40"
          name="call_btn"
-         width="125"/>
-
+         width="100" />
         <button
          bottom="40"
          height="20"
          label="Leave Call"
          name="end_call_btn"
          visible="false"
-         width="125"/>
-
+         width="100" />
         <button
          enabled="false"
          bottom="10"
          height="20"
-         label="Open Voice Controls"
+         label="Voice Controls"
          name="voice_ctrls_btn"
          visible="false"
-         width="125"/>
-
+         width="100" />
     </panel>
-
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_avatar_tag.xml b/indra/newview/skins/default/xui/en/panel_avatar_tag.xml
index 16c8660781e..b779b08a63c 100644
--- a/indra/newview/skins/default/xui/en/panel_avatar_tag.xml
+++ b/indra/newview/skins/default/xui/en/panel_avatar_tag.xml
@@ -4,66 +4,63 @@
  top="10"
  width="250"
  height="100"
- background_opaque="false"
- background_visible="true"
- follows="left|top|bottom|right"
- bg_alpha_color="0.3 0.3 0.3 1.0">
-	<panel 
-     width="250" 
-     height="30" 
-     background_visible="true" 
-     background_opaque="false" 
+ follows="all">
+  <panel
+     width="240"
+     height="24"
+     left="5"
+     background_visible="true"
+     background_opaque="false"
      follows="left|top|right"
-     bg_alpha_color="0.0 0.0 0.0 1.0" 
+     top="-5"
+     bg_alpha_color="black"
      name="msg_caption">
-  		<avatar_icon
-         top="-7" 
-         left="10" 
-         width="20" 
-         height="20" 
+  	<avatar_icon
+         top="-3"
+         left="3"
+         width="18"
+         image_name="Generic_Person"
+         height="18"
          follows="left|top"
-         color="1 1 1 1" 
-         enabled="true" 
-         name="avatar_tag_icon"/>
+         enabled="true"
+         name="avatar_tag_icon" />
     	<text
-         width="160" 
-         top="-10" 
-         left="40" 
-         height="20" 
+         width="160"
+         top="-8"
+         left="30"
+         height="20"
          follows="left|right|top"
-         font="SansSerifBigBold" 
-         text_color="white" 
+	 font.style="BOLD"
+         text_color="white"
          word_wrap="true"
-         mouse_opaque="true" 
-         name="sender_tag_name" >
+         mouse_opaque="true"
+         name="sender_tag_name">
 	      Angela Tester
     	</text>
-    	<text 
-         width="30" 
-         top="-12" 
-         left="210" 
-         height="20" 
-         follows="right|top"
-         text_color="white" 
-         word_wrap="true" 
-         mouse_opaque="true" 
-         name="tag_time" >
-      		07:52
-		</text>
+	<text
+        font="SansSerifSmall"
+         follows="right"
+         height="13"
+         layout="topleft"
+	 halign="right"
+         right="-5"
+         name="tag_time"
+         top="8"
+         value="23:30"
+         width="50" />
 	</panel>
-	<text_editor
-     top="65" 
-     left="10" 
-     right="-10" 
-     height="100" 
-     follows="left|top|bottom|right"
-     font="SansSerifSmall" 
+ <text_editor
+ bg_readonly_color="DkGray"
+     font="SansSerifSmall"
+     top="65"
+     left="5"
+     right="-5"
+     height="100"
+     follows="all"
      read_only="true"
-     bg_readonly_color="0 0 0 0"
      word_wrap="true"
-     mouse_opaque="true" 
-     name="msg_text" >
+     mouse_opaque="true"
+     name="msg_text">
      The quick brown fox jumps over the lazy dog.
     </text_editor>
 </panel>
-
diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml
index ff7afeb3996..323ee957e73 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml
@@ -7,7 +7,8 @@
      height="24"
  label="im_header"
  layout="topleft"
- name="im_header" >
+ name="im_header"
+ width="300">
              <avatar_icon
          follows="left"
          height="18"
@@ -33,11 +34,12 @@
     <text
             font="SansSerifSmall"
          follows="right"
+         halign="right"
          height="13"
          layout="topleft"
          left_pad="5"
      name="time_box"
-     right="0"
+     right="-10"
      top="8"
          value="23:30"
          width="50" />
-- 
GitLab


From f693e70c240e1c3800158db5e245f3554598bdf2 Mon Sep 17 00:00:00 2001
From: callum <none@none>
Date: Mon, 16 Nov 2009 19:47:35 -0800
Subject: [PATCH 359/557] Restore a minor change to the media test mule that
 was checked in by mistake

---
 .../llplugintest/llmediaplugintest.cpp         | 18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)

diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp
index ee27ad77df8..27cb52a507f 100644
--- a/indra/test_apps/llplugintest/llmediaplugintest.cpp
+++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp
@@ -197,7 +197,7 @@ LLMediaPluginTest::LLMediaPluginTest( int app_window, int window_width, int wind
 	{
 		LLError::initForApplication(".");
 		LLError::setDefaultLevel(LLError::LEVEL_INFO);
-//		LLError::setTagLevel("Plugin", LLError::LEVEL_DEBUG);
+		//LLError::setTagLevel("Plugin", LLError::LEVEL_DEBUG);
 	}
 
 	// lots of randomness in this app
@@ -223,16 +223,12 @@ LLMediaPluginTest::LLMediaPluginTest( int app_window, int window_width, int wind
 	resetView();
 
 	// initial media panel
-	//const int num_initial_panels = 1;
-	//for( int i = 0; i < num_initial_panels; ++i )
-	//{
-	//	//addMediaPanel( mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second );
-	//	addMediaPanel( mHomeWebUrl );
-	//};
-
-addMediaPanel( "http://chemicaljump.com/wp-content/uploads/2009/10/lth34/Proxy-8000.mp3" );
-addMediaPanel( "http://movies.apple.com/movies/sony_pictures/zombieland/zombieland-inttlr_h.320.mov" );
-
+	const int num_initial_panels = 1;
+	for( int i = 0; i < num_initial_panels; ++i )
+	{
+		//addMediaPanel( mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second );
+		addMediaPanel( mHomeWebUrl );
+	};
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-- 
GitLab


From 18980efe16e19ab0562267e10ec55bed55b581fb Mon Sep 17 00:00:00 2001
From: callum <none@none>
Date: Mon, 16 Nov 2009 19:49:45 -0800
Subject: [PATCH 360/557] Fix up line endings issues.

---
 .../quicktime/media_plugin_quicktime.cpp           | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
index 7148edda5c0..f4add536eb4 100644
--- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
+++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
@@ -531,13 +531,13 @@ class MediaPluginQuickTime : public MediaPluginBase
 		// this wasn't required in 1.xx viewer but we have to manually 
 		// work the Windows message pump now
 		#if defined( LL_WINDOWS )
-		MSG msg;
-		while ( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) 
-		{
-			GetMessage( &msg, NULL, 0, 0 );
-			TranslateMessage( &msg );
-			DispatchMessage( &msg );
-		};
+		MSG msg;
+		while ( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) 
+		{
+			GetMessage( &msg, NULL, 0, 0 );
+			TranslateMessage( &msg );
+			DispatchMessage( &msg );
+		};
 		#endif
 
 		MCIdle( mMovieController );
-- 
GitLab


From 6820f18ec50ba13c20cad773b8bc6744420ea72f Mon Sep 17 00:00:00 2001
From: Erica <erica@lindenlab.com>
Date: Mon, 16 Nov 2009 20:23:01 -0800
Subject: [PATCH 361/557] EXT-2537 Update IM message well arrows with actual
 art, style chiclets to spec, EXT-2536 Remove old art from scrollbar headers,
 clean up layout

---
 .../default/xui/en/floater_im_session.xml     | 65 +++++++++----------
 .../skins/default/xui/en/panel_chat_item.xml  | 12 ++--
 .../default/xui/en/panel_im_control_panel.xml | 22 +++----
 .../xui/en/widgets/scroll_column_header.xml   | 14 ++--
 4 files changed, 56 insertions(+), 57 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index 452d28d4eab..9e2dbc881ff 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -2,66 +2,63 @@
 <floater
  legacy_header_height="18"
  background_visible="true"
- follows="left|top|right|bottom"
- height="369"
+ follows="all"
+ height="350"
  layout="topleft"
  left="0"
  name="panel_im"
- help_topic="panel_im"
  top="0"
  can_dock="true"
- can_minimize="true"
- visible="true" 
- width="520"
+ can_minimize="false"
+ visible="true"
+ width="320"
  can_resize="true"
- min_width="350"
- min_height="369">
-  <layout_stack follows="left|top|right|bottom"
-                height="354"
-                width="520"
+ min_width="300"
+ min_height="350">
+  <layout_stack follows="all"
+                height="350"
+                width="300"
                 layout="topleft"
                 orientation="horizontal"
                 name="im_panels"
-                top="16"
-                left="2">
+                top="20"
+                left="0">
     <layout_panel
       name="panel_im_control_panel"
       layout="topleft"
       top_delta="-3"
-      height="354"
+      height="350"
       follows="left"
       label="IM Control Panel"
       auto_resize="false"
       user_resize="false" />
-    <layout_panel height="354"
-                  width="355"
-                  left_delta="146" 
+    <layout_panel height="350"
+                  width=""
+                  left_delta="110"
                   top="0"
                   user_resize="false">
-      <button height="12"
-      		  follows="left|top"
-              top="8" 
-              label="&lt;&lt;"
+      <button height="20"
+      	      follows="left|top"
+              top="0"
+              image_overlay="TabIcon_Open_Off"
               layout="topleft"
-              width="35"
+              width="25"
               name="slide_left_btn" />
-      <button height="12"
-      		  follows="left|top"
-              top="8"
-              label="&gt;&gt;"
-              layout="topleft"
-              width="35"
+      <button height="20"
+      	      follows="left|top"
+              top="0"
+              image_overlay="TabIcon_Close_Off"
+              width="25"
               name="slide_right_btn" />
       <chat_history
        length="1"
-       follows="left|top|right|bottom"
-       font="SansSerif"
-       height="300"
+       follows="all"
+       height="275"
        layout="topleft"
        name="chat_history"
        parse_highlights="true"
-       allow_html="true" 
-       width="350">
+       allow_html="true"
+       width="160">
       </chat_history>
       <line_editor
        follows="left|right"
@@ -69,7 +66,7 @@
        label="To"
        layout="topleft"
        name="chat_editor"
-       width="345">
+       width="160">
       </line_editor>
     </layout_panel>
   </layout_stack>
diff --git a/indra/newview/skins/default/xui/en/panel_chat_item.xml b/indra/newview/skins/default/xui/en/panel_chat_item.xml
index 9e071072f28..01917052d18 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_item.xml
@@ -6,11 +6,12 @@
   height="180"
   follows="all">
 	<panel
-	width="250"
+	width="290"
 	height="24"
 	background_visible="true"
 	background_opaque="false"
 	bg_alpha_color="Black"
+	left="5"
 	name="msg_caption">
              <avatar_icon
          follows="left"
@@ -25,9 +26,9 @@
     	<text
                 font.style="BOLD"
                 height="12"
-         layout="topleft"
-	 left_pad="5"
-	 top="7"
+	    layout="topleft"
+	    left_pad="5"
+	    top="7"
 		text_color="white"
 		word_wrap="false"
 		use_ellipses="true"
@@ -46,7 +47,7 @@
 	 halign="right"
          height="13"
          layout="topleft"
-         right="-5"
+         right="-10"
 	 left="205"
 	 mouse_opaque="true"
       name="msg_time"
@@ -65,5 +66,6 @@
       word_wrap="true"
       mouse_opaque="true"
       name="msg_text">
+      To be or not to be, that is the question. Tis a far far better thing I do than I have ever done. Tis a far far better place I go, than I have ever been.
 	</text_chat>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
index 44305f7dea3..9573904c93e 100644
--- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  border="false"
- height="350"
+ height="300"
  name="panel_im_control_panel"
  width="110">
     <avatar_icon
@@ -14,38 +14,38 @@
     <text
      follows="top|left|right"
      font="SansSerifLarge"
-     height="16"
+     height="22"
      layout="topleft"
      name="avatar_name"
      use_ellipses="true"
      value="Unknown"
      width="100" />
     <button
-     follows="left|bottom"
+     follows="left|top"
      height="20"
      label="Profile"
      name="view_profile_btn"
      width="100" />
     <button
-     follows="left|bottom"
+     follows="left|top"
      height="20"
      label="Add Friend"
      name="add_friend_btn"
      width="100" />
     <button
-     follows="left|bottom"
+     follows="left|top"
      height="20"
      label="Teleport"
      name="teleport_btn"
      width="100" />
     <button
-     follows="left|bottom"
+     follows="left|top"
      height="20"
      label="Share"
      name="share_btn"
      width="100" />
     <button
-     follows="left|bottom"
+     follows="left|top"
      height="20"
      label="Pay"
      name="pay_btn"
@@ -54,13 +54,11 @@
      background_visible="true"
      bg_alpha_color="DkGray2"
      border="false"
-     bottom="1"
-     follows="left|bottom"
+     follows="left|top"
      height="70"
      left="0"
      left_pad="0"
      name="panel_call_buttons"
-     top_pad="0"
      width="110">
         <button
          bottom="10"
@@ -70,7 +68,7 @@
          name="call_btn"
          width="100" />
         <button
-         bottom="40"
+         bottom="35"
          height="20"
          label="Leave Call"
          name="end_call_btn"
@@ -80,7 +78,7 @@
          enabled="false"
          bottom="10"
          height="20"
-         label="Open Voice Controls"
+         label="Voice Controls"
          name="voice_ctrls_btn"
          visible="false"
          width="100" />
diff --git a/indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml b/indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml
index 0794b49a0c6..f936a1e208a 100644
--- a/indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml
+++ b/indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml
@@ -1,9 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<scroll_column_header image_unselected="square_btn_32x128.tga"
-                      image_selected="square_btn_selected_32x128.tga"
-                      image_disabled="square_btn_32x128.tga"
-                      image_disabled_selected="square_btn_selected_32x128.tga"
-                      image_overlay="combobox_arrow.tga"
+<scroll_column_header
+		    image_unselected="SegmentedBtn_Middle_Selected"
+                      image_selected="SegmentedBtn_Middle_Selected"
+		      image_pressed="SegmentedBtn_Middle_Selected_Press"
+                      image_disabled="SegmentedBtn_Middle_Disabled"
+                      image_disabled_selected="SegmentedBtn_Middle_Selected_Disabled"
+                      image_overlay="DisclosureArrow_Opened_Off"
                       image_overlay_alignment="right"
                       halign="left"
-                      scale_image="true"/>
+                      scale_image="true" />
-- 
GitLab


From ed0516e0a9ddabf6acd932e5303883a611d0cf71 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Mon, 16 Nov 2009 21:00:59 -0800
Subject: [PATCH 362/557] Change tooltip text to DkGray2, more readable.

---
 indra/newview/skins/default/colors.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index 028a5844c63..6564ec9ab03 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -663,7 +663,7 @@
      value="0.812 0.753 0.451 1" />
     <color
      name="ToolTipTextColor"
-     value="0.749 0.749 0.749 1" />
+     reference="DkGray2" />
     <color
      name="UserChatColor"
      reference="LtGray" />
-- 
GitLab


From a97941369ddde6a548e91576655d5f52942d085e Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Mon, 16 Nov 2009 21:39:23 -0800
Subject: [PATCH 363/557] EXT-1546 Don't show inspector (i) icon in empty
 groups list. Apparently some name lists have placeholder items at the top, so
 don't show the inspector icon unless there is a valid UUID.

---
 indra/newview/llnamelistctrl.cpp | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 9439717fb85..7e6145f578f 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -143,11 +143,14 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)
 	BOOL handled = FALSE;
 	S32 column_index = getColumnIndexFromOffset(x);
 	LLScrollListItem* hit_item = hitItem(x, y);
-	if (hit_item)
+	if (hit_item
+		&& column_index == mNameColumnIndex)
 	{
-		if (column_index == mNameColumnIndex)
+		// ...this is the column with the avatar name
+		LLUUID avatar_id = hit_item->getValue().asUUID();
+		if (avatar_id.notNull())
 		{
-			// ...this is the column with the avatar name
+			// ...valid avatar id
 			LLScrollListCell* hit_cell = hit_item->getColumn(column_index);
 			if (hit_cell)
 			{
@@ -160,7 +163,6 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)
 				// Spawn at right side of cell
 				LLCoordGL pos( sticky_rect.mRight - 16, sticky_rect.mTop );
 				LLPointer<LLUIImage> icon = LLUI::getUIImage("Info_Small");
-				LLUUID avatar_id = hit_item->getValue().asUUID();
 
 				LLToolTip::Params params;
 				params.background_visible( false );
-- 
GitLab


From ccc72757ef23fa7ffba066e5bdaf05e3f8a95cca Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Mon, 16 Nov 2009 22:25:40 -0800
Subject: [PATCH 364/557] Fix comment-in-comment that was breaking Mac build.

---
 indra/media_plugins/quicktime/media_plugin_quicktime.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
index f4add536eb4..236f79978de 100644
--- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
+++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
@@ -718,7 +718,7 @@ class MediaPluginQuickTime : public MediaPluginBase
 		// find the size of the title
 		ByteCount size;
 		result = QTMetaDataGetItemValue( media_data_ref, item, NULL, 0, &size );
-		if ( noErr != result || size <= 0 /*|| size > 1024 /* FIXME: arbitrary limit */ ) 
+		if ( noErr != result || size <= 0 /*|| size > 1024  FIXME: arbitrary limit */ ) 
 			return false;
 
 		// allocate some space and grab it
-- 
GitLab


From 028a8af51946cac42e9b3d1a0ecd1b79b36d0383 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Mon, 16 Nov 2009 23:33:12 -0800
Subject: [PATCH 365/557] Allow UI tooltips and "ambient inspector" tips to
 have different text colors

---
 indra/llui/lltooltip.cpp                                 | 3 ++-
 indra/llui/lltooltip.h                                   | 1 +
 indra/newview/skins/default/colors.xml                   | 3 +++
 indra/newview/skins/default/xui/en/widgets/inspector.xml | 1 +
 indra/newview/skins/default/xui/en/widgets/tool_tip.xml  | 1 +
 5 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
index bb851778114..959313a5b66 100644
--- a/indra/llui/lltooltip.cpp
+++ b/indra/llui/lltooltip.cpp
@@ -163,6 +163,7 @@ LLToolTip::Params::Params()
 	visible_time_far("visible_time_far", LLUI::sSettingGroups["config"]->getF32( "ToolTipVisibleTimeFar" )),
 	sticky_rect("sticky_rect"),
 	image("image"),
+	text_color("text_color"),
 	time_based_media("time_based_media", false),
 	web_based_media("web_based_media", false),
 	media_playing("media_playing", false)
@@ -186,7 +187,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
 	params.h_pad = 0;
 	params.v_pad = 0;
 	params.mouse_opaque = false;
-	params.text_color = LLUIColorTable::instance().getColor( "ToolTipTextColor" );
+	params.text_color = p.text_color;
 	params.bg_visible = false;
 	params.font = p.font;
 	params.use_ellipses = true;
diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h
index 8c8fdf0a4c9..7978b6a583a 100644
--- a/indra/llui/lltooltip.h
+++ b/indra/llui/lltooltip.h
@@ -88,6 +88,7 @@ class LLToolTip : public LLPanel
 		Optional<LLRect>			sticky_rect;
 		Optional<const LLFontGL*>	font;
 		Optional<LLUIImage*>		image;
+		Optional<LLUIColor>			text_color;
 		Optional<bool>				time_based_media,
 									web_based_media,
 									media_playing;
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index 6564ec9ab03..eb8ec00bb95 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -664,6 +664,9 @@
     <color
      name="ToolTipTextColor"
      reference="DkGray2" />
+    <color
+     name="InspectorTipTextColor"
+     reference="LtGray" />
     <color
      name="UserChatColor"
      reference="LtGray" />
diff --git a/indra/newview/skins/default/xui/en/widgets/inspector.xml b/indra/newview/skins/default/xui/en/widgets/inspector.xml
index f631ef3957c..8ec206023e5 100644
--- a/indra/newview/skins/default/xui/en/widgets/inspector.xml
+++ b/indra/newview/skins/default/xui/en/widgets/inspector.xml
@@ -6,4 +6,5 @@
           bg_opaque_image="none"
           background_opaque="true"
           bg_alpha_image="none"
+		  text_color="InspectorTipTextColor"
  />
diff --git a/indra/newview/skins/default/xui/en/widgets/tool_tip.xml b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml
index c209c26c923..a19201f7c33 100644
--- a/indra/newview/skins/default/xui/en/widgets/tool_tip.xml
+++ b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml
@@ -8,4 +8,5 @@
           bg_opaque_image="Tooltip"
           background_opaque="true"
           background_visible="true"
+		  text_color="ToolTipTextColor"
  />
-- 
GitLab


From 0098bf40ea73078e2164ae55a8fa2f9049d0d4e9 Mon Sep 17 00:00:00 2001
From: angela <angela@lindenlab.com>
Date: Tue, 17 Nov 2009 16:33:49 +0800
Subject: [PATCH 366/557] undo the changes for LLStyle params; add sizeFromFont
 in LLFontGL ; use font.style, font.name and font.size params for font
 creating

---
 indra/llrender/llfontgl.cpp                |  7 ++++++
 indra/llrender/llfontgl.h                  |  1 +
 indra/llui/llstyle.cpp                     | 29 ++--------------------
 indra/llui/llstyle.h                       |  5 ----
 indra/llui/lltextbase.cpp                  | 14 +++++++----
 indra/newview/llchathistory.cpp            | 14 ++++++-----
 indra/newview/llchatitemscontainerctrl.cpp | 14 +++++++----
 indra/newview/llexpandabletextbox.cpp      |  5 ++--
 indra/newview/llimfloater.cpp              | 27 ++++++++++++--------
 indra/newview/llnearbychat.cpp             | 22 +++++++++-------
 indra/newview/lltoastimpanel.cpp           | 10 ++++++--
 11 files changed, 76 insertions(+), 72 deletions(-)

diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp
index 793a526c260..9ba0cfc6b8a 100644
--- a/indra/llrender/llfontgl.cpp
+++ b/indra/llrender/llfontgl.cpp
@@ -754,6 +754,13 @@ std::string LLFontGL::nameFromFont(const LLFontGL* fontp)
 	return fontp->mFontDescriptor.getName();
 }
 
+
+// static
+std::string LLFontGL::sizeFromFont(const LLFontGL* fontp)
+{
+	return fontp->mFontDescriptor.getSize();
+}
+
 // static
 std::string LLFontGL::nameFromHAlign(LLFontGL::HAlign align)
 {
diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h
index 5f2c86c6c12..bb7d8524e7f 100644
--- a/indra/llrender/llfontgl.h
+++ b/indra/llrender/llfontgl.h
@@ -146,6 +146,7 @@ class LLFontGL
 	static U8 getStyleFromString(const std::string &style);
 
 	static std::string nameFromFont(const LLFontGL* fontp);
+	static std::string sizeFromFont(const LLFontGL* fontp);
 
 	static std::string nameFromHAlign(LLFontGL::HAlign align);
 	static LLFontGL::HAlign hAlignFromName(const std::string& name);
diff --git a/indra/llui/llstyle.cpp b/indra/llui/llstyle.cpp
index 92c0b7c1b46..71511f69a41 100644
--- a/indra/llui/llstyle.cpp
+++ b/indra/llui/llstyle.cpp
@@ -44,10 +44,7 @@ LLStyle::Params::Params()
 	color("color", LLColor4::black),
 	font("font", LLFontGL::getFontMonospace()),
 	image("image"),
-	link_href("href"),
-	italic("italic", false ),
-	bold("bold", false),
-    underline("bold", false)
+	link_href("href")
 {}
 
 
@@ -58,10 +55,7 @@ LLStyle::LLStyle(const LLStyle::Params& p)
 	mFont(p.font()),
 	mLink(p.link_href),
 	mDropShadow(p.drop_shadow),
-	mImagep(p.image()),
-	mItalic(p.italic()),
-	mBold(p.bold),
-	mUnderline(p.underline)
+	mImagep(p.image())
 {}
 
 void LLStyle::setFont(const LLFontGL* font)
@@ -75,25 +69,6 @@ const LLFontGL* LLStyle::getFont() const
 	return mFont;
 }
 
-const S32 LLStyle::getFontStyle() const
-{
-	S32 ret = 0;
-	if (mBold)
-	{
-		ret |= LLFontGL::BOLD;
-	}
-	if (mItalic)
-	{
-		ret |= LLFontGL::ITALIC;
-	}
-	if (mUnderline)
-	{
-		ret |= LLFontGL::UNDERLINE;
-	}
-	return ret;
-}
-
-
 void LLStyle::setLinkHREF(const std::string& href)
 {
 	mLink = href;
diff --git a/indra/llui/llstyle.h b/indra/llui/llstyle.h
index cc72011903c..ee9ca730e94 100644
--- a/indra/llui/llstyle.h
+++ b/indra/llui/llstyle.h
@@ -51,17 +51,12 @@ class LLStyle : public LLRefCount
 		Optional<const LLFontGL*>		font;
 		Optional<LLUIImage*>			image;
 		Optional<std::string>			link_href;
-		Optional<bool>					italic;
-		Optional<bool>					bold;
-		Optional<bool>					underline;
 		Params();
 	};
 	LLStyle(const Params& p = Params());
 public:
 	const LLColor4& getColor() const { return mColor; }
 	void setColor(const LLColor4 &color) { mColor = color; }
-	
-	const S32 getFontStyle() const;
 
 	const LLColor4& getReadOnlyColor() const { return mReadOnlyColor; }
 
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index d7697ac7cc7..a06b7e237bf 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1506,8 +1506,12 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c
 			LLStyle::Params link_params = style_params;
 			link_params.color = match.getColor();
 			// apply font name from requested style_params
-			std::string font_name = LLFontGL::nameFromFont(style_params.font());			
-			link_params.underline = true;
+			std::string font_name = LLFontGL::nameFromFont(style_params.font());
+			std::string font_size = LLFontGL::sizeFromFont(style_params.font());
+			link_params.font.name(font_name);
+			link_params.font.size(font_name);
+			link_params.font.style("UNDERLINE");
+			
 			link_params.link_href = match.getUrl();
 
 			// output the text before the Url
@@ -2250,7 +2254,7 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
 					rect.mLeft, rect.mTop, 
 					color, 
 					LLFontGL::LEFT, LLFontGL::TOP, 
-					mStyle->getFontStyle(), 
+					0, 
 					mStyle->getShadowType(), 
 					length, rect.getWidth(), 
 					&right_x, 
@@ -2269,7 +2273,7 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
 					rect.mLeft, rect.mTop,
 					LLColor4( 1.f - color.mV[0], 1.f - color.mV[1], 1.f - color.mV[2], 1.f ),
 					LLFontGL::LEFT, LLFontGL::TOP, 
-					mStyle->getFontStyle(), 
+					0, 
 					LLFontGL::NO_SHADOW, 
 					length, rect.mRight, 
 					&right_x, 
@@ -2286,7 +2290,7 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
 					rect.mLeft, rect.mTop, 
 					color, 
 					LLFontGL::LEFT, LLFontGL::TOP, 
-					mStyle->getFontStyle(), 
+					0, 
 					mStyle->getShadowType(), 
 					length, rect.mRight, 
 					&right_x, 
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index bec8eb26665..f9c4a23f127 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -361,15 +361,17 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat, const LLStyle::Param
 	
 	LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
 	LLViewerChat::getChatColor(chat,txt_color);
-	LLFontGL* fontp = LLViewerChat::getChatFont();
-	
+	LLFontGL* fontp = LLViewerChat::getChatFont();	
+	std::string font_name = LLFontGL::nameFromFont(fontp);
+	std::string font_size = LLFontGL::sizeFromFont(fontp);	
 	LLStyle::Params style_params;
 	style_params.color(txt_color);
 	style_params.readonly_color(txt_color);
-	style_params.font(fontp);
-	style_params.italic = input_append_params.italic;
-	style_params.underline = input_append_params.underline;
-	style_params.bold = input_append_params.bold;
+	style_params.font.name(font_name);
+	style_params.font.size(font_size);	
+	style_params.font.style(input_append_params.font.style);
+	
+
 	
 	if (mLastFromName == chat.mFromName)
 	{
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 1cc6b2beefc..b1dee46d2ef 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -160,10 +160,14 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
 	
 	LLStyle::Params style_params;
 	style_params.color(mTextColor);
-	style_params.font(mFont);
-	
-	std::string str_sender;
+//	style_params.font(mFont);
+	std::string font_name = LLFontGL::nameFromFont(mFont);
+	std::string font_style_size = LLFontGL::sizeFromFont(mFont);
+	style_params.font.name(font_name);
+	style_params.font.size(font_style_size);
 
+	std::string str_sender;
+	
 	if(gAgentID != mFromID)
 		str_sender = mFromName;
 	else
@@ -180,12 +184,12 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
 	{
 		if (mFromName.size() > 0)
 		{
-			style_params.italic= true;
+			style_params.font.style = "ITALIC";
 			
 			msg_text->setText(mFromName, style_params);
 		}
 		mText = mText.substr(3);
-		style_params.underline = true;
+		style_params.font.style = "UNDERLINE";
 		msg_text->addText(mText,style_params);
 	}
 	else 
diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index 27df6be7307..bd6936f05c6 100644
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -80,7 +80,7 @@ class LLExpanderSegment : public LLTextSegment
 									draw_rect.mRight, draw_rect.mTop, 
 									mStyle->getColor(), 
 									LLFontGL::RIGHT, LLFontGL::TOP, 
-									mStyle->getFontStyle(), 
+									0, 
 									mStyle->getShadowType(), 
 									end - start, draw_rect.getWidth(), 
 									&right_x, 
@@ -164,7 +164,8 @@ void LLExpandableTextBox::LLTextBoxEx::showExpandText()
 		S32 last_line = visible_lines.second - 1;
 
 		LLStyle::Params expander_style = getDefaultStyle();
-		expander_style.underline = true;
+		expander_style.font.name(LLFontGL::nameFromFont(expander_style.font));
+		expander_style.font.style = "UNDERLINE";
 		expander_style.color = LLUIColorTable::instance().getColor("HTMLLinkColor");
 		LLExpanderSegment* expanderp = new LLExpanderSegment(new LLStyle(expander_style), getLineStart(last_line), getLength() + 1, mExpanderLabel, *this);
 		insertSegment(expanderp);
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index dff27ee032f..2c6543d6ca9 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -476,27 +476,32 @@ void LLIMFloater::updateMessages()
 			chat.mFromID = from_id;
 			chat.mFromName = from;
 			chat.mText = message;
-
-			LLStyle::Params append_style_params;
+			
 			//Handle IRC styled /me messages.
 			std::string prefix = message.substr(0, 4);
 			if (prefix == "/me " || prefix == "/me'")
 			{
-				if (from.size() > 0)
-				{
-					append_style_params.italic= true;
-					chat.mText = from + " ";
-					mChatHistory->appendWidgetMessage(chat, append_style_params);
-				}
-				message = message.substr(3);
 				
 				LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
 				LLViewerChat::getChatColor(chat,txt_color);
 				LLFontGL* fontp = LLViewerChat::getChatFont();
+				std::string font_name = LLFontGL::nameFromFont(fontp);
+				std::string font_size = LLFontGL::sizeFromFont(fontp);
+				LLStyle::Params append_style_params;
 				append_style_params.color(txt_color);
 				append_style_params.readonly_color(txt_color);
-				append_style_params.font(fontp);
-				append_style_params.underline = true;
+				append_style_params.font.name(font_name);
+				append_style_params.font.size(font_size);
+				
+				if (from.size() > 0)
+				{
+					append_style_params.font.style = "ITALIC";
+					chat.mText = from + " ";
+					mChatHistory->appendWidgetMessage(chat, append_style_params);
+				}
+				
+				message = message.substr(3);
+				append_style_params.font.style = "UNDERLINE";
 				mChatHistory->appendText(message, FALSE, append_style_params);
 			}
 			else
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 3af94485645..cae5c52378b 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -157,25 +157,29 @@ void	LLNearbyChat::addMessage(const LLChat& chat)
 	{
 		std::string message = chat.mText;
 		std::string prefix = message.substr(0, 4);
+		
 		if (chat.mChatStyle == CHAT_STYLE_IRC)
 		{
+			LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
+			LLViewerChat::getChatColor(chat,txt_color);
+			LLFontGL* fontp = LLViewerChat::getChatFont();
+			std::string font_name = LLFontGL::nameFromFont(fontp);
+			std::string font_size = LLFontGL::sizeFromFont(fontp);
 			LLStyle::Params append_style_params;
+			append_style_params.color(txt_color);
+			append_style_params.readonly_color(txt_color);
+			append_style_params.font.name(font_name);
+			append_style_params.font.size(font_size);
 			if (chat.mFromName.size() > 0)
 			{
-				append_style_params.italic= true;
+				append_style_params.font.style = "ITALIC";
 				LLChat add_chat=chat;
 				add_chat.mText = chat.mFromName + " ";
 				mChatHistory->appendWidgetMessage(add_chat, append_style_params);
 			}
-			message = message.substr(3);
 			
-			LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
-			LLViewerChat::getChatColor(chat,txt_color);
-			LLFontGL* fontp = LLViewerChat::getChatFont();
-			append_style_params.color(txt_color);
-			append_style_params.readonly_color(txt_color);
-			append_style_params.font(fontp);
-			append_style_params.underline = true;
+			message = message.substr(3);
+			append_style_params.font.style = "UNDERLINE";
 			mChatHistory->appendText(message, FALSE, append_style_params);
 		}
 		else
diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp
index 3acab85bf75..d2cc6d07260 100644
--- a/indra/newview/lltoastimpanel.cpp
+++ b/indra/newview/lltoastimpanel.cpp
@@ -51,14 +51,20 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) :	LLToastPanel(p.notif
 	mReplyBtn = getChild<LLButton>("reply");	
 
 	LLStyle::Params style_params;
+	style_params.font.name(LLFontGL::nameFromFont(style_params.font));
+	style_params.font.size(LLFontGL::sizeFromFont(style_params.font));
+	style_params.font.style = "UNDERLINE";
+	
 	//Handle IRC styled /me messages.
 	std::string prefix = p.message.substr(0, 4);
 	if (prefix == "/me " || prefix == "/me'")
 	{
 		mMessage->clear();
-		style_params.italic = true;
+		
+		style_params.font.style ="ITALIC";
 		mMessage->appendText(p.from + " ", FALSE, style_params);
-		style_params.underline = true;
+
+		style_params.font.style = "UNDERLINE";
 		mMessage->appendText(p.message.substr(3), FALSE, style_params);
 	}
 	else
-- 
GitLab


From 3df42196e3ead1419d456a715081d37b454b5bc1 Mon Sep 17 00:00:00 2001
From: Dmitry Oleshko <doleshko@productengine.com>
Date: Tue, 17 Nov 2009 11:46:25 +0200
Subject: [PATCH 367/557] fixed normal bug (EXT-2505) Implement ellipsis for
 attachments in Group Notices

adjusted width of the "Attachment" field and added "ellipses" attribute

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_group_notify.xml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/panel_group_notify.xml b/indra/newview/skins/default/xui/en/panel_group_notify.xml
index 984a799b41a..e699a77581d 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notify.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notify.xml
@@ -104,7 +104,8 @@
      name="attachment"
      text_color="GroupNotifyTextColor"
      value="Attachment"
-     width="280" />
+     use_ellipses="true"
+     width="250" />
     <button
      bottom="130"
      follows="bottom"
-- 
GitLab


From 812d18515ddefd11fe8c5fc7f655280a231670f5 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Tue, 17 Nov 2009 13:03:08 +0200
Subject: [PATCH 368/557] Completed major sub-task EXT-991 (Update bottom bar
 behavior on resize)  - added possibility to shrink/extend buttons (gestures,
 move, view) while resizing  - I had to add LLLayoutStack::getPanelMinSize
 interface to validate width of Layout panels with these buttons

--HG--
branch : product-engine
---
 indra/llui/lllayoutstack.cpp                  |  13 ++
 indra/llui/lllayoutstack.h                    |   8 ++
 indra/newview/llbottomtray.cpp                | 131 +++++++++++++++++-
 indra/newview/llbottomtray.h                  |  22 ++-
 .../skins/default/xui/en/panel_bottomtray.xml |  14 +-
 5 files changed, 178 insertions(+), 10 deletions(-)

diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index 14a6ddb7e0e..1fb618adeee 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -413,6 +413,19 @@ void LLLayoutStack::updatePanelAutoResize(const std::string& panel_name, BOOL au
 	}
 }
 
+bool LLLayoutStack::getPanelMinSize(const std::string& panel_name, S32* min_widthp, S32* min_heightp)
+{
+	LayoutPanel* panel = findEmbeddedPanelByName(panel_name);
+
+	if (panel)
+	{
+		if (min_widthp) *min_widthp = panel->mMinWidth;
+		if (min_heightp) *min_heightp = panel->mMinHeight;
+	}
+
+	return NULL != panel;
+}
+
 static LLFastTimer::DeclareTimer FTM_UPDATE_LAYOUT("Update LayoutStacks");
 void LLLayoutStack::updateLayout(BOOL force_resize)
 {
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index 9cbcb285dca..abd5436018d 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -82,6 +82,14 @@ class LLLayoutStack : public LLView, public LLInstanceTracker<LLLayoutStack>
 
 	void updatePanelAutoResize(const std::string& panel_name, BOOL auto_resize);
 	
+	/**
+	 * Gets minimal width and/or height of the specified by name panel.
+	 *
+	 * If it is necessary to get only the one dimension pass NULL for another one.
+	 * @returns true if specified by panel_name internal panel exists, false otherwise.
+	 */
+	bool getPanelMinSize(const std::string& panel_name, S32* min_widthp, S32* min_heightp);
+	
 	void updateLayout(BOOL force_resize = FALSE);
 	static void updateClass();
 
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 958dbf226a8..3c34aa4fa48 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -317,6 +317,10 @@ BOOL LLBottomTray::postBuild()
 	// Registering Chat Bar to receive Voice client status change notifications.
 	gVoiceClient->addObserver(this);
 
+	mObjectDefaultWidthMap[RS_BUTTON_GESTURES] = mGesturePanel->getRect().getWidth();
+	mObjectDefaultWidthMap[RS_BUTTON_MOVEMENT] = mMovementPanel->getRect().getWidth();
+	mObjectDefaultWidthMap[RS_BUTTON_CAMERA]   = mCamPanel->getRect().getWidth();
+
 	return TRUE;
 }
 
@@ -402,7 +406,6 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
 		}
 	}
 
-	lldebugs << "There is no enough width to reshape all children: " << extra_shrink_width << llendl;
 	if (should_be_reshaped)
 	{
 		lldebugs << "Reshape all children with width: " << width << llendl;
@@ -473,7 +476,12 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width)
 	S32 buttons_freed_width = 0;
 	if (still_should_be_processed)
 	{
-		processHideButton(RS_BUTTON_SNAPSHOT, &delta_width, &buttons_freed_width);
+		processShrinkButtons(&delta_width);
+
+		if (delta_width < 0)
+		{
+			processHideButton(RS_BUTTON_SNAPSHOT, &delta_width, &buttons_freed_width);
+		}
 
 		if (delta_width < 0)
 		{
@@ -493,7 +501,7 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width)
 		if (delta_width < 0)
 		{
 			extra_shrink_width = -delta_width;
-			lldebugs << "There is no enough room for bottom tray, resizing still should be processed: " 
+			llwarns << "There is no enough width to reshape all children: " 
 				<< extra_shrink_width << llendl;
 		}
 
@@ -551,7 +559,7 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
 		processShowButton(RS_BUTTON_SNAPSHOT, &available_width, &buttons_required_width);
 	}
 
-	// if we have to show some buttons but whidth increasing is not enough...
+	// if we have to show some buttons but width increasing is not enough...
 	if (buttons_required_width > 0 && delta_width < buttons_required_width)
 	{
 		// ... let's shrink nearby chat & chiclet panels
@@ -587,6 +595,8 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
 	// shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels
 	delta_width -= buttons_required_width;
 
+	processExtendButtons(&delta_width);
+
 	// how many space can nearby chatbar take?
 	S32 chatbar_panel_width_ = mNearbyChatBar->getRect().getWidth();
 	if (delta_width > 0 && chatbar_panel_width_ < chatbar_panel_max_width)
@@ -656,6 +666,119 @@ void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* re
 	}
 }
 
+void LLBottomTray::processShrinkButtons(S32* required_width)
+{
+	processShrinkButton(RS_BUTTON_CAMERA, required_width);
+
+	if (*required_width < 0)
+	{
+		processShrinkButton(RS_BUTTON_MOVEMENT, required_width);
+	}
+	if (*required_width < 0)
+	{
+		processShrinkButton(RS_BUTTON_GESTURES, required_width);
+	}
+}
+
+void LLBottomTray::processShrinkButton(EResizeState processed_object_type, /*const std::string& panel_name, */S32* required_width)
+{
+	LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
+	if (NULL == panel)
+	{
+		lldebugs << "There is no object to process for type: " << processed_object_type << llendl;
+		return;
+	}
+
+	if (panel->getVisible())
+	{
+		S32 panel_width = panel->getRect().getWidth();
+		S32 panel_min_width = 0;
+		std::string panel_name = panel->getName();
+		bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width, NULL);
+		S32 possible_shrink_width = panel_width - panel_min_width;
+
+		if (!success)
+		{
+			lldebugs << "Panel was not found to get its min width: " << panel_name << llendl;
+		}
+		// we have some space to free by shrinking the button
+		else if (possible_shrink_width > 0)
+		{
+			// let calculate real width to shrink
+
+			// 1. apply all possible width
+			*required_width += possible_shrink_width;
+
+			// 2. it it is too much... 
+			if (*required_width > 0)
+			{
+				// reduce applied shrunk width to the excessive value.
+				possible_shrink_width -= *required_width;
+				*required_width = 0;
+			}
+			panel->reshape(panel_width - possible_shrink_width, panel->getRect().getHeight());
+
+			lldebugs << "Shrunk panel: " << panel_name
+				<< ", shrunk width: " << possible_shrink_width
+				<< ", rest width to process: " << *required_width
+				<< llendl;
+		}
+	}
+}
+
+
+void LLBottomTray::processExtendButtons(S32* available_width)
+{
+	processExtendButton(RS_BUTTON_GESTURES, available_width);
+
+	if (*available_width > 0)
+	{
+		processExtendButton(RS_BUTTON_CAMERA, available_width);
+	}
+	if (*available_width > 0)
+	{
+		processExtendButton(RS_BUTTON_MOVEMENT, available_width);
+	}
+}
+
+void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32* available_width)
+{
+	LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
+	if (NULL == panel)
+	{
+		lldebugs << "There is no object to process for type: " << processed_object_type << llendl;
+		return;
+	}
+
+	if (!panel->getVisible()) return;
+
+	S32 panel_max_width = mObjectDefaultWidthMap[processed_object_type];
+	S32 panel_width = panel->getRect().getWidth();
+	S32 possible_extend_width = panel_max_width - panel_width;
+
+	if (possible_extend_width > 0)
+	{
+		// let calculate real width to extend
+
+		// 1. apply all possible width
+		*available_width -= possible_extend_width;
+
+		// 2. it it is too much... 
+		if (*available_width < 0)
+		{
+			// reduce applied extended width to the excessive value.
+			possible_extend_width += *available_width;
+			*available_width = 0;
+		}
+		panel->reshape(panel_width + possible_extend_width, panel->getRect().getHeight());
+
+		lldebugs << "Extending panel: " << panel->getName()
+			<< ", extended width: " << possible_extend_width
+			<< ", rest width to process: " << *available_width
+			<< llendl;
+	}
+}
+
 bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const
 {
 	bool can_be_shown = mResizeState & processed_object_type;
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 8989816bfec..97bcc23403a 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -98,7 +98,6 @@ class LLBottomTray
 		, RS_BUTTON_MOVEMENT	= 0x0010
 		, RS_BUTTON_GESTURES	= 0x0020
 		, RS_BUTTON_SPEAK		= 0x0040
-		, RS_RESIZABLE_BUTTONS			= /*RS_BUTTON_SNAPSHOT | */RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES
 	}EResizeState;
 
 	S32 processWidthDecreased(S32 delta_width);
@@ -107,6 +106,24 @@ class LLBottomTray
 	bool processShowButton(EResizeState shown_object_type, S32* available_width, S32* buttons_required_width);
 	void processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width);
 
+	/**
+	 * Shrinks shown buttons to reduce total taken space.
+	 *
+	 * @param - required_width - width which buttons can use to be shrunk. It is a negative value.
+	 * It is increased on the value processed by buttons.
+	 */
+	void processShrinkButtons(S32* required_width);
+	void processShrinkButton(EResizeState processed_object_type, S32* required_width);
+
+	/**
+	 * Extends shown buttons to increase total taken space.
+	 *
+	 * @param - available_width - width which buttons can use to be extended. It is a positive value.
+	 * It is decreased on the value processed by buttons.
+	 */
+	void processExtendButtons(S32* available_width);
+	void processExtendButton(EResizeState processed_object_type, S32* available_width);
+
 	/**
 	 * Determines if specified by type object can be shown. It should be hidden by shrink before.
 	 *
@@ -140,6 +157,9 @@ class LLBottomTray
 	typedef std::map<EResizeState, LLPanel*> state_object_map_t;
 	state_object_map_t mStateProcessedObjectMap;
 
+	typedef std::map<EResizeState, S32> state_object_width_map_t;
+	state_object_width_map_t mObjectDefaultWidthMap;
+
 protected:
 
 	LLBottomTray(const LLSD& key = LLSD());
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index a902f505824..d2933c0c0ea 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -94,7 +94,7 @@
          min_height="28"
          width="82"
          top_delta="0"
-         min_width="82"
+         min_width="52"
          name="gesture_panel"
          user_resize="false">
          <gesture_combo_box
@@ -105,9 +105,13 @@
           name="Gesture"
           left="0"
           top="3"
-         use_ellipses="true"
           width="82"
-          tool_tip="Shows/hides gestures"/>
+          tool_tip="Shows/hides gestures">
+             <gesture_combo_box.drop_down_button
+              font="SansSerifSmall"
+              pad_right="10" 
+              use_ellipses="true" />
+         </gesture_combo_box>
         </layout_panel>
 		 <icon
          auto_resize="false"
@@ -131,7 +135,7 @@
          name="movement_panel"
          user_resize="false"
          width="80"
-         min_width="80">
+         min_width="49">
             <button
              follows="left|right"
              height="23"
@@ -167,7 +171,7 @@
          height="28"
          layout="topleft"
          min_height="28"
-         min_width="80"
+         min_width="49"
          name="cam_panel"
          user_resize="false"
          width="80">
-- 
GitLab


From 93f8da6906dfd9c2bd34ffe82537e5f1b3c06f93 Mon Sep 17 00:00:00 2001
From: Dmitry Oleshko <doleshko@productengine.com>
Date: Tue, 17 Nov 2009 13:23:39 +0200
Subject: [PATCH 369/557] fixed normal bug (EXT-2543) Notification toasts
 overlap bottom tray

adjusted control's height in order to remove a negative BOTTOM value

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/main_view.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
index 9e35c95d45a..14a4949df7f 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -10,7 +10,7 @@
   <layout_stack border_size="0"
                 follows="all"
                 mouse_opaque="false"
-                height="772"
+                height="768"
                 name="menu_stack"
                 orientation="vertical"
                 top="0">
-- 
GitLab


From e1aaaa34e45daca5a39a040865938cb3e2404f3e Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Tue, 17 Nov 2009 13:40:09 +0200
Subject: [PATCH 370/557] Minor style changes for EXT-1014 (Unable to move
 undocked camera controls bar) fix.

--HG--
branch : product-engine
---
 indra/newview/lljoystickbutton.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp
index 0acc67ff5a8..2cc5c8335d3 100644
--- a/indra/newview/lljoystickbutton.cpp
+++ b/indra/newview/lljoystickbutton.cpp
@@ -136,13 +136,13 @@ void LLJoystick::updateSlop()
 
 bool LLJoystick::pointInCircle(S32 x, S32 y) const 
 { 
-	if(this->getLocalRect().mTop!=this->getLocalRect().mRight)
+	if(this->getLocalRect().getHeight() != this->getLocalRect().getWidth())
 	{
 		llwarns << "Joystick shape is not square"<<llendl;
-		return TRUE;
+		return true;
 	}
 	//center is x and y coordinates of center of joystick circle, and also its radius
-	int center = this->getLocalRect().mTop/2;
+	int center = this->getLocalRect().getHeight()/2;
 	bool in_circle = (x - center) * (x - center) + (y - center) * (y - center) <= center * center;
 	return in_circle;
 }
-- 
GitLab


From 1804fce466ff242e63f995bc47178e1514c5a59d Mon Sep 17 00:00:00 2001
From: Yuri Chebotarev <ychebotarev@productengine.com>
Date: Tue, 17 Nov 2009 13:52:16 +0200
Subject: [PATCH 371/557] fix4 normal task EXT-2521 Remove timestamp and fake
 voice indicator from nearby chat toasts

--HG--
branch : product-engine
---
 indra/newview/llchatitemscontainerctrl.cpp             |  3 ---
 indra/newview/skins/default/xui/en/panel_chat_item.xml | 10 ++--------
 2 files changed, 2 insertions(+), 11 deletions(-)

diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index d2e3247250b..244c7b17942 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -171,9 +171,6 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
 
 	caption->getChild<LLTextBox>("sender_name", false)->setText(str_sender , style_params);
 	
-	caption->getChild<LLTextBox>("msg_time", false)->setText(appendTime() , style_params );
-
-
 	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
 	msg_text->setText(mText, style_params);
 
diff --git a/indra/newview/skins/default/xui/en/panel_chat_item.xml b/indra/newview/skins/default/xui/en/panel_chat_item.xml
index 05b04bbf8ea..d8a0c877fdf 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_item.xml
@@ -15,19 +15,13 @@
       		color="1 1 1 1" enabled="true" name="avatar_icon"
 		  />
     	<text
-        	width="130" top="25" left="40" height="20" follows="left|right|top"
+        	width="150" top="25" left="40" height="20" follows="left|right|top"
         	font="SansSerifBigBold" text_color="white" word_wrap="false" use_ellipses="true"
         	mouse_opaque="true" name="sender_name" >
 	      Jerry Knight
     	</text>
-    	<icon top="22" left="170" width="15" height="15" follows="top|right"
+    	<icon top="22" left="215" width="15" height="15" follows="top|right"
       		image_name="icn_voice-pvtfocus.tga" visible="false" name="msg_inspector"/>
-    	<icon top="22" left="190" width="10" height="10" follows="top|right"
-      		image_name="speaking_indicator.tga"	name="msg_icon"/>
-    	<text width="35" top="22" left="205" height="20" follows="right|top"
-        		text_color="white" word_wrap="true" mouse_opaque="true" name="msg_time" >
-      		10:32
-		</text>
 	</panel>
 	<text_chat
       top="-35" left="10" right="-10" height="120" follows="left|right|bottom"
-- 
GitLab


From acd1743a9627681c5ae015e81facaebbb0438456 Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Tue, 17 Nov 2009 13:58:06 +0200
Subject: [PATCH 372/557] Fixed minor bug EXT-1230 ('Block object by name' btn
 doesn't have a tool-tip).

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml
index 5c8a8ee2081..3842c2a8db8 100644
--- a/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml
@@ -61,6 +61,7 @@
      layout="topleft"
      left_delta="0"
      name="Block object by name..."
+     tool_tip="Pick an object to block by name"
      top_pad="4"
      width="210" >
         <button.commit_callback
-- 
GitLab


From 4c623cb7bb952ed034ce0457fef29c535ca8807e Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Tue, 17 Nov 2009 14:02:52 +0200
Subject: [PATCH 373/557] completed major task EXT-2516 Remove the close button
 from IM window title

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/floater_im_session.xml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index 452d28d4eab..70d708f0e73 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -9,6 +9,7 @@
  name="panel_im"
  help_topic="panel_im"
  top="0"
+ can_close="false"
  can_dock="true"
  can_minimize="true"
  visible="true" 
-- 
GitLab


From d43e33400a2ef9d89ed6d13067055b5b1edbde78 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Tue, 17 Nov 2009 14:33:07 +0200
Subject: [PATCH 374/557] implemented EXT-2515 "Docked floaters should be
 resizeable";

--HG--
branch : product-engine
---
 indra/llui/lldockablefloater.cpp                      | 10 ++++++++++
 indra/llui/lldockablefloater.h                        |  1 +
 indra/llui/lldockcontrol.cpp                          |  5 +++++
 indra/llui/lldockcontrol.h                            |  1 +
 indra/newview/llimfloater.cpp                         |  2 --
 indra/newview/llnearbychat.cpp                        | 11 +----------
 indra/newview/llnearbychat.h                          |  2 --
 indra/newview/llsyswellwindow.cpp                     |  4 +++-
 .../skins/default/xui/en/floater_nearby_chat.xml      |  2 +-
 .../newview/skins/default/xui/en/floater_sys_well.xml |  2 +-
 10 files changed, 23 insertions(+), 17 deletions(-)

diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp
index c3dd4ae647d..9be3d49023c 100644
--- a/indra/llui/lldockablefloater.cpp
+++ b/indra/llui/lldockablefloater.cpp
@@ -217,6 +217,16 @@ void LLDockableFloater::draw()
 	LLFloater::draw();
 }
 
+void LLDockableFloater::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+	if (isDocked())
+	{
+		setDocked(false);
+	}
+
+	LLFloater::reshape(width, height, called_from_parent);
+}
+
 void LLDockableFloater::setDockControl(LLDockControl* dockControl)
 {
 	mDockControl.reset(dockControl);
diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h
index 46491d8a29e..e5f94dca91e 100644
--- a/indra/llui/lldockablefloater.h
+++ b/indra/llui/lldockablefloater.h
@@ -65,6 +65,7 @@ class LLDockableFloater : public LLFloater
 	/* virtula */BOOL postBuild();
 	/* virtual */void setDocked(bool docked, bool pop_on_undock = true);
 	/* virtual */void draw();
+	/* virtual */void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
 
 	/**
 	 *  If descendant class overrides setVisible() then it must still invoke its
diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp
index 045505af5b6..456a2925a3e 100644
--- a/indra/llui/lldockcontrol.cpp
+++ b/indra/llui/lldockcontrol.cpp
@@ -266,6 +266,11 @@ void LLDockControl::off()
 	mEnabled = false;
 }
 
+void LLDockControl::forceRecalculatePosition()
+{
+	mRecalculateDocablePosition = true;
+}
+
 void LLDockControl::drawToungue()
 {
 	if (mEnabled)
diff --git a/indra/llui/lldockcontrol.h b/indra/llui/lldockcontrol.h
index eaedb4c3076..30a45bedc74 100644
--- a/indra/llui/lldockcontrol.h
+++ b/indra/llui/lldockcontrol.h
@@ -63,6 +63,7 @@ class LLDockControl
 public:
 	void on();
 	void off();
+	void forceRecalculatePosition();
 	void setDock(LLView* dockWidget);
 	LLView* getDock()
 	{
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index e3121fbc7a5..b56e858086e 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -367,8 +367,6 @@ void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
 	LLNotificationsUI::LLScreenChannel* channel = dynamic_cast<LLNotificationsUI::LLScreenChannel*>
 		(LLNotificationsUI::LLChannelManager::getInstance()->
 											findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
-
-	setCanResize(!docked);
 	
 	LLTransientDockableFloater::setDocked(docked, pop_on_undock);
 
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 029019a8dca..6cac5385b62 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -89,8 +89,6 @@ BOOL LLNearbyChat::postBuild()
 
 	mChatHistory = getChild<LLChatHistory>("chat_history");
 
-	setCanResize(true);
-
 	if(!LLDockableFloater::postBuild())
 		return false;
 
@@ -98,7 +96,7 @@ BOOL LLNearbyChat::postBuild()
 	{
 		setDockControl(new LLDockControl(
 			LLBottomTray::getInstance()->getNearbyChatBar(), this,
-			getDockTongue(), LLDockControl::LEFT, boost::bind(&LLNearbyChat::getAllowedRect, this, _1)));
+			getDockTongue(), LLDockControl::TOP, boost::bind(&LLNearbyChat::getAllowedRect, this, _1)));
 	}
 
 	return true;
@@ -187,13 +185,6 @@ void	LLNearbyChat::onOpen(const LLSD& key )
 	}
 }
 
-void	LLNearbyChat::setDocked			(bool docked, bool pop_on_undock)
-{
-	LLDockableFloater::setDocked(docked, pop_on_undock);
-
-	setCanResize(!docked);
-}
-
 void LLNearbyChat::setRect	(const LLRect &rect)
 {
 	LLDockableFloater::setRect(rect);
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
index 1f4e57cf89e..2f72d657205 100644
--- a/indra/newview/llnearbychat.h
+++ b/indra/newview/llnearbychat.h
@@ -51,8 +51,6 @@ class LLNearbyChat: public LLDockableFloater
 	void	onNearbyChatContextMenuItemClicked(const LLSD& userdata);
 	bool	onNearbyChatCheckContextMenuItem(const LLSD& userdata);
 
-	void	setDocked			(bool docked, bool pop_on_undock = true);
-
 	/*virtual*/ void	onOpen	(const LLSD& key);
 
 	virtual void setRect		(const LLRect &rect);
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index eada3879456..04ecf769d55 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -332,7 +332,9 @@ void LLSysWellWindow::reshapeWindow()
 		new_window_height = MAX_WINDOW_HEIGHT;
 	}
 	S32 newY = curRect.mTop + new_window_height - curRect.getHeight();
-	curRect.setLeftTopAndSize(curRect.mLeft, newY, MIN_WINDOW_WIDTH, new_window_height);
+	S32 newWidth = curRect.getWidth() < MIN_WINDOW_WIDTH ? MIN_WINDOW_WIDTH
+			: curRect.getWidth();
+	curRect.setLeftTopAndSize(curRect.mLeft, newY, newWidth, new_window_height);
 	reshape(curRect.getWidth(), curRect.getHeight(), TRUE);
 	setRect(curRect);
 
diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
index 7f58ea132ea..84e549f7738 100644
--- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
@@ -3,7 +3,7 @@
  legacy_header_height="18"
  can_minimize="true"
  can_tear_off="false"
- can_resize="false"
+ can_resize="true"
  can_drag_on_left="false"
  can_close="false"
  can_dock="true"
diff --git a/indra/newview/skins/default/xui/en/floater_sys_well.xml b/indra/newview/skins/default/xui/en/floater_sys_well.xml
index e1f07a49e78..be6d63716c5 100644
--- a/indra/newview/skins/default/xui/en/floater_sys_well.xml
+++ b/indra/newview/skins/default/xui/en/floater_sys_well.xml
@@ -15,7 +15,7 @@
  height="23"
  can_minimize="true"
  can_tear_off="false"
- can_resize="false"
+ can_resize="true"
  can_drag_on_left="false"
  can_close="false"
  can_dock="true"
-- 
GitLab


From 53be27e742b642c1642c3289e3e11b300a14d360 Mon Sep 17 00:00:00 2001
From: Yuri Chebotarev <ychebotarev@productengine.com>
Date: Tue, 17 Nov 2009 14:40:02 +0200
Subject: [PATCH 375/557] fox4 low task EXT-2480  Open Blocked List panel when
 blocking an object from nearby chat console

--HG--
branch : product-engine
---
 indra/newview/llchathistory.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 028bb7a3848..99161757752 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -46,6 +46,8 @@
 #include "llfloaterreg.h"
 #include "llmutelist.h"
 
+#include "llsidetray.h"//for blocked objects panel
+
 static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history");
 
 std::string formatCurrentTime()
@@ -92,6 +94,8 @@ class LLChatHistoryHeader: public LLPanel
 		else if (level == "block")
 		{
 			LLMuteList::getInstance()->add(LLMute(getAvatarId(), mFrom, LLMute::OBJECT));
+
+			LLSideTray::getInstance()->showPanel("panel_block_list_sidetray", LLSD().insert("blocked_to_select", getAvatarId()));
 		}
 	}
 
-- 
GitLab


From 0336752a5eb0b4847812ca372f788d4ba7751a52 Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Tue, 17 Nov 2009 16:07:01 +0200
Subject: [PATCH 376/557] Implemented normal task EXT-1551-[BSI] Add scrollbar
 to group notice notification

--HG--
branch : product-engine
---
 indra/newview/lltoastgroupnotifypanel.cpp     | 38 ++++++-------
 .../default/xui/en/panel_group_notify.xml     | 57 +++++++------------
 2 files changed, 40 insertions(+), 55 deletions(-)

diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp
index f82573f46cd..d1bdcb13543 100644
--- a/indra/newview/lltoastgroupnotifypanel.cpp
+++ b/indra/newview/lltoastgroupnotifypanel.cpp
@@ -40,7 +40,7 @@
 #include "lliconctrl.h"
 #include "llinventoryfunctions.h"
 #include "llnotify.h"
-#include "lltextbox.h"
+#include "llviewertexteditor.h"
 
 #include "lluiconstants.h"
 #include "llui.h"
@@ -54,7 +54,7 @@
 #include "llfloaterinventory.h"
 #include "llinventorytype.h"
 
-const S32 LLToastGroupNotifyPanel::DEFAULT_MESSAGE_MAX_LINE_COUNT	= 4;
+const S32 LLToastGroupNotifyPanel::DEFAULT_MESSAGE_MAX_LINE_COUNT	= 7;
 
 LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification)
 :	LLToastPanel(notification),
@@ -84,11 +84,6 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification
 	//message body
 	const std::string& message = payload["message"].asString();
 
-
-	LLTextBox* pSubjectText = getChild<LLTextBox>("subject");
-	pSubjectText->setValue(subject);
-
-	LLTextBox* pDateTimeText = getChild<LLTextBox>("datetime");
 	std::string timeStr = "["+LLTrans::getString("UTCTimeWeek")+"],["
 							+LLTrans::getString("UTCTimeDay")+"] ["
 							+LLTrans::getString("UTCTimeMth")+"] ["
@@ -102,20 +97,23 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification
 	LLSD substitution;
 	substitution["datetime"] = (S32) notice_date.secondsSinceEpoch();
 	LLStringUtil::format(timeStr, substitution);
-	pDateTimeText->setValue(timeStr);
 
-	LLTextBox* pMessageText = getChild<LLTextBox>("message");
-
-	//If message is empty let it be invisible and not take place at the panel
-	if(message.size() != 0)
-	{
-		pMessageText->setVisible(TRUE);
-		pMessageText->setValue(message);
-	}
-	else
-	{
-		pMessageText->setVisible(FALSE);
-	}
+	LLViewerTextEditor* pMessageText = getChild<LLViewerTextEditor>("message");
+	pMessageText->clear();
+
+	LLStyle::Params style;
+	LLFontGL* subject_font = LLFontGL::getFontByName(getString("subject_font"));
+	if (subject_font) 
+		style.font = subject_font;
+	pMessageText->appendText(subject, FALSE, style);
+
+	LLFontGL* date_font = LLFontGL::getFontByName(getString("date_font"));
+	if (date_font)
+		style.font = date_font;
+	pMessageText->appendText(timeStr + "\n", TRUE, style);
+	
+	style.font = pMessageText->getDefaultFont();
+	pMessageText->appendText(message, TRUE, style);
 
 	//attachment
 	BOOL hasInventory = payload["inventory_offer"].isDefined();
diff --git a/indra/newview/skins/default/xui/en/panel_group_notify.xml b/indra/newview/skins/default/xui/en/panel_group_notify.xml
index e699a77581d..d22d58329c4 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notify.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notify.xml
@@ -3,7 +3,7 @@
  background_visible="true"
  bevel_style="in"
  bg_alpha_color="0 0 0 0"
- height="135"
+ height="90"
  label="instant_message"
  layout="topleft"
  left="0"
@@ -12,7 +12,13 @@
  width="305">
     <string
      name="message_max_lines_count"
-     value="4" />
+     value="7" />
+    <string
+     name="subject_font"
+     value="SANSSERIF_BIG" />
+    <string
+     name="date_font"
+     value="SANSSERIF" />
     <panel
      background_visible="true"
      bevel_style="in"
@@ -47,46 +53,27 @@
          value="Sender Name / Group Name"
          width="230" />
     </panel>
-    <text
-     follows="top"
-     font="SansSerifBig"
-     height="20"
-     layout="topleft"
-     left="25"
-     name="subject"
-     text_color="GroupNotifyTextColor"
-     top="40"
-     use_ellipses="true"
-     value="subject"
-     width="270"
-     wrap="true" />
-    <text
-     follows="top"
-     font="SansSerif"
-     height="20"
-     layout="topleft"
-     left="25"
-     name="datetime"
-     text_color="GroupNotifyTextColor"
-     top="80"
-     use_ellipses="true"
-     value="datetime"
-     width="270"
-     wrap="true" />
-    <text
+    <text_editor
+     allow_html="true"
+     enabled="true"
      follows="left|top|bottom|right"
      height="0"
      layout="topleft"
      left="25"
+     max_length="2147483647"
      name="message"
+     parse_highlights="true"
+     read_only="true"
      text_color="GroupNotifyTextColor"
-     top="100"
+     top="40"
+     type="string"
      use_ellipses="true"
      value="message"
-     width="270"
-     wrap="true" />
+     width="270" 
+	 word_wrap="true" >
+    </text_editor>
     <icon
-     bottom="122"
+     bottom="60"
      follows="left|bottom|right"
      height="15"
      layout="topleft"
@@ -95,7 +82,7 @@
      name="attachment_icon"
      width="15" />
     <text
-     bottom="122"
+     bottom="60"
      follows="left|bottom|right"
      font="SansSerif"
      height="15"
@@ -107,7 +94,7 @@
      use_ellipses="true"
      width="250" />
     <button
-     bottom="130"
+     bottom="85"
      follows="bottom"
      height="20"
      label="OK"
-- 
GitLab


From 0422eadf2ad4db0308a034a2b6426e19898451c4 Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Tue, 17 Nov 2009 16:28:47 +0200
Subject: [PATCH 377/557] implemented major EXT-2523 The minimize button should
 hide undocked IM windows, not minimize them

--HG--
branch : product-engine
---
 indra/newview/llimfloater.cpp | 9 +++++++++
 indra/newview/llimfloater.h   | 2 +-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index b56e858086e..00ecbb8a9d3 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -377,6 +377,15 @@ void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
 	}
 }
 
+void LLIMFloater::setMinimized(BOOL minimize)
+{
+	if(minimize && !isDocked())
+	{
+		setVisible(FALSE);
+	}
+	LLDockableFloater::setMinimized(minimize);
+}
+
 void LLIMFloater::setVisible(BOOL visible)
 {
 	LLNotificationsUI::LLScreenChannel* channel = dynamic_cast<LLNotificationsUI::LLScreenChannel*>
diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h
index 065441b1889..5b77d15fcbc 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llimfloater.h
@@ -63,7 +63,7 @@ class LLIMFloater : public LLTransientDockableFloater
 	// LLFloater overrides
 	/*virtual*/ void onClose(bool app_quitting);
 	/*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
-	// override LLFloater's minimization according to EXT-1216
+	/*virtual*/ void setMinimized(BOOL minimize);
 
 	// Make IM conversion visible and update the message history
 	static LLIMFloater* show(const LLUUID& session_id);
-- 
GitLab


From 4f35650f0427f6d6db10da0058d2850c30f98904 Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Tue, 17 Nov 2009 17:23:07 +0200
Subject: [PATCH 378/557] Fixed critical bug EXT-2469 "Viewer crashes in the
 Floater Call". - Re-factored Floater Call initialization and destruction
 logic. - Removing voice channel participants observer when call ends.

--HG--
branch : product-engine
---
 indra/newview/llvoicechannel.cpp | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index ae32ec7d117..21054dacd0b 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -33,6 +33,7 @@
 #include "llviewerprecompiledheaders.h"
 
 #include "llagent.h"
+#include "llfloatercall.h"
 #include "llfloaterreg.h"
 #include "llimview.h"
 #include "llnotifications.h"
@@ -408,9 +409,14 @@ void LLVoiceChannel::doSetState(const EState& new_state)
 
 void LLVoiceChannel::toggleCallWindowIfNeeded(EState state)
 {
+	LLFloaterCall* floater = dynamic_cast<LLFloaterCall*>(LLFloaterReg::getInstance("voice_call", mSessionID));
+	if (!floater)
+		return;
+
 	if (state == STATE_CONNECTED)
 	{
-		LLFloaterReg::showInstance("voice_call", mSessionID);
+		floater->init(mSessionID);
+		floater->openFloater(mSessionID);
 	}
 	// By checking that current state is CONNECTED we make sure that the call window
 	// has been shown, hence there's something to hide. This helps when user presses
@@ -418,7 +424,8 @@ void LLVoiceChannel::toggleCallWindowIfNeeded(EState state)
 	// *TODO: move this check to LLFloaterCall?
 	else if (state == STATE_HUNG_UP && mState == STATE_CONNECTED)
 	{
-		LLFloaterReg::hideInstance("voice_call", mSessionID);
+		floater->reset();
+		floater->closeFloater();
 	}
 }
 
-- 
GitLab


From 9c823a1d40392dc00bdfb1f09220a5065d764f40 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Tue, 17 Nov 2009 10:33:47 -0500
Subject: [PATCH 379/557] Deferring work to idle time to avoid recursive
 notifyObservers calls - added wrapper class to defer an arbitrary boost::bind
 or other callable

--HG--
branch : avatar-pipeline
---
 indra/newview/llagentwearables.cpp  | 18 ++++++----------
 indra/newview/llappearancemgr.cpp   | 18 ++++++++++++++--
 indra/newview/llappearancemgr.h     | 33 +++++++++++++++++++++++++++++
 indra/newview/llinventorybridge.cpp | 12 +++++++++++
 4 files changed, 68 insertions(+), 13 deletions(-)

diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 17e7eea2f12..a171f75b175 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -62,7 +62,7 @@ class LLInitialWearablesFetch : public LLInventoryFetchDescendentsObserver
 {
 public:
 	LLInitialWearablesFetch() {}
-	~LLInitialWearablesFetch() {}
+	~LLInitialWearablesFetch();
 	virtual void done();
 
 	struct InitialWearableData
@@ -84,7 +84,6 @@ class LLInitialWearablesFetch : public LLInventoryFetchDescendentsObserver
 protected:
 	void processWearablesMessage();
 	void processContents();
-	static void onIdle(void *userdata);
 };
 
 LLAgentWearables gAgentWearables;
@@ -2013,6 +2012,11 @@ void LLAgentWearables::updateServer()
 // to avoid gInventory.notifyObservers recursion.
 //--------------------------------------------------------------------
 
+LLInitialWearablesFetch::~LLInitialWearablesFetch()
+{
+	llinfos << "~LLInitialWearablesFetch" << llendl;
+}
+
 // virtual
 void LLInitialWearablesFetch::done()
 {
@@ -2020,15 +2024,7 @@ void LLInitialWearablesFetch::done()
 	// gInventory.notifyObservers.  The results will be handled in the next
 	// idle tick instead.
 	gInventory.removeObserver(this);
-	gIdleCallbacks.addFunction(onIdle, this);
-}
-
-// static
-void LLInitialWearablesFetch::onIdle(void *data)
-{
-	gIdleCallbacks.deleteFunction(onIdle, data);
-	LLInitialWearablesFetch *self = reinterpret_cast<LLInitialWearablesFetch*>(data);
-	self->processContents();
+	doOnIdle(boost::bind(&LLInitialWearablesFetch::processContents,this));
 }
 
 void LLInitialWearablesFetch::processContents()
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 80ac9e4085b..a23d21f84bc 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -95,8 +95,9 @@ class LLOutfitObserver : public LLInventoryFetchObserver
 		mCopyItems(copy_items),
 		mAppend(append)
 	{}
-	~LLOutfitObserver() {}
-	virtual void done(); //public
+	~LLOutfitObserver();
+	virtual void done();
+	void doWearCategory();
 
 protected:
 	LLUUID mCatID;
@@ -104,7 +105,19 @@ class LLOutfitObserver : public LLInventoryFetchObserver
 	bool mAppend;
 };
 
+LLOutfitObserver::~LLOutfitObserver()
+{
+	llinfos << "~LLOutfitObserver" << llendl;
+}
+
+// BAP is LLOutfitObserver getting deleted here?
 void LLOutfitObserver::done()
+{
+	gInventory.removeObserver(this);
+	doOnIdle(boost::bind(&LLOutfitObserver::doWearCategory,this));
+}
+
+void LLOutfitObserver::doWearCategory()
 {
 	// We now have an outfit ready to be copied to agent inventory. Do
 	// it, and wear that outfit normally.
@@ -175,6 +188,7 @@ void LLOutfitObserver::done()
 		// Wear the inventory category.
 		LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);
 	}
+	delete this;
 }
 
 class LLOutfitFetch : public LLInventoryFetchDescendentsObserver
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 88d3320d1fa..f39fbd7b1a9 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -36,6 +36,7 @@
 #include "llsingleton.h"
 #include "llinventorymodel.h"
 #include "llviewerinventory.h"
+#include "llcallbacklist.h"
 
 class LLWearable;
 struct LLWearableHoldingPattern;
@@ -111,4 +112,36 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 
 #define SUPPORT_ENSEMBLES 0
 
+// Shim class and template function to allow arbitrary boost::bind
+// expressions to be run as one-time idle callbacks.
+template <typename T>
+class OnIdleCallback
+{
+public:
+	OnIdleCallback(T callable):
+		mCallable(callable)
+	{
+	}
+	static void onIdle(void *data)
+	{
+		gIdleCallbacks.deleteFunction(onIdle, data);
+		OnIdleCallback<T>* self = reinterpret_cast<OnIdleCallback<T>*>(data);
+		self->call();
+		delete self;
+	}
+	void call()
+	{
+		mCallable();
+	}
+private:
+	T mCallable;
+};
+
+template <typename T>
+void doOnIdle(T callable)
+{
+	OnIdleCallback<T>* cb_functor = new OnIdleCallback<T>(callable);
+	gIdleCallbacks.addFunction(&OnIdleCallback<T>::onIdle,cb_functor);
+}
+
 #endif
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index d7be09efa9a..f406547620f 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -1682,6 +1682,17 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
 			// if target is an outfit or current outfit folder we use link
 			if (move_is_into_current_outfit || move_is_into_outfit)
 			{
+				if (inv_cat->getPreferredType() == LLFolderType::FT_NONE)
+				{
+					if (move_is_into_current_outfit)
+					{
+						// traverse category and add all contents to currently worn.
+						BOOL append = true;
+						LLAppearanceManager::instance().wearInventoryCategory(inv_cat, false, append);
+					}
+				}
+				else
+				{
 #if SUPPORT_ENSEMBLES
 				// BAP - should skip if dup.
 				if (move_is_into_current_outfit)
@@ -1700,6 +1711,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
 						cb);
 				}
 #endif
+				}
 			}
 			else
 			{
-- 
GitLab


From 32dccaf3d89b40b711d69088a3e390119c7efc7f Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Tue, 17 Nov 2009 10:36:11 -0500
Subject: [PATCH 380/557] Sidepanel Appearance refactoring.  Work in progress.

1. Changed sidepanel names to have "sidepanel" (e.g. panel_appearance -> sidepanel_appearance)
2. Changed some "Looks" names to "Outfits"
3. Changed LLPanelLooks to LLPanelOutfitsInventory (to match other inventory panel naming)
4. Took out tab from sidepanel_appearance.

--HG--
branch : avatar-pipeline
---
 indra/newview/CMakeLists.txt                  |  10 +-
 indra/newview/llappearancemgr.cpp             |   6 +-
 indra/newview/llinventoryfilter.cpp           |  17 +-
 indra/newview/llinventorypanel.cpp            |  35 +-
 indra/newview/llinventorypanel.h              |   4 +
 indra/newview/llpanelmaininventory.cpp        |   2 +-
 indra/newview/llpaneloutfitsinventory.cpp     | 245 ++++++++++++
 indra/newview/llpaneloutfitsinventory.h       |  76 ++++
 indra/newview/llsidepanelappearance.cpp       | 373 ++++++++++++++++++
 indra/newview/llsidepanelappearance.h         | 102 +++++
 .../default/xui/en/floater_inventory.xml      |   2 +-
 .../xui/en/panel_outfits_inventory.xml        |  81 ++++
 .../skins/default/xui/en/panel_side_tray.xml  |   6 +-
 .../default/xui/en/sidepanel_appearance.xml   | 104 +++++
 14 files changed, 1026 insertions(+), 37 deletions(-)
 create mode 100644 indra/newview/llpaneloutfitsinventory.cpp
 create mode 100644 indra/newview/llpaneloutfitsinventory.h
 create mode 100644 indra/newview/llsidepanelappearance.cpp
 create mode 100644 indra/newview/llsidepanelappearance.h
 create mode 100644 indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
 create mode 100644 indra/newview/skins/default/xui/en/sidepanel_appearance.xml

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 4adef84cd39..e7458529bee 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -297,8 +297,6 @@ set(viewer_SOURCE_FILES
     llnotify.cpp
     lloutputmonitorctrl.cpp
     lloverlaybar.cpp
-    llpanelappearance.cpp
-    llpanelappearancetab.cpp
     llpanelavatar.cpp
     llpanelavatarrow.cpp
     llpanelavatartag.cpp
@@ -322,7 +320,6 @@ set(viewer_SOURCE_FILES
     llpanellandmedia.cpp
     llpanellogin.cpp
     llpanellookinfo.cpp
-    llpanellooks.cpp
     llpanelmaininventory.cpp
     llpanelmediasettingsgeneral.cpp
     llpanelmediasettingspermissions.cpp
@@ -330,6 +327,7 @@ set(viewer_SOURCE_FILES
     llpanelmeprofile.cpp
     llpanelobject.cpp
     llpanelobjectinventory.cpp
+    llpaneloutfitsinventory.cpp
     llpanelpeople.cpp
     llpanelpeoplemenus.cpp
     llpanelpermissions.cpp
@@ -370,6 +368,7 @@ set(viewer_SOURCE_FILES
     llsearchcombobox.cpp
     llsearchhistory.cpp
     llselectmgr.cpp
+    llsidepanelappearance.cpp
     llsidepanelinventory.cpp
     llsidepanelinventorysubpanel.cpp
     llsidepaneliteminfo.cpp
@@ -792,8 +791,6 @@ set(viewer_HEADER_FILES
     llnotify.h
     lloutputmonitorctrl.h
     lloverlaybar.h
-    llpanelappearance.h
-    llpanelappearancetab.h
     llpanelavatar.h
     llpanelavatarrow.h
     llpanelavatartag.h
@@ -817,7 +814,6 @@ set(viewer_HEADER_FILES
     llpanellandmedia.h
     llpanellogin.h
     llpanellookinfo.h
-    llpanellooks.h
     llpanelmaininventory.h
     llpanelmediasettingsgeneral.h
     llpanelmediasettingspermissions.h
@@ -825,6 +821,7 @@ set(viewer_HEADER_FILES
     llpanelmeprofile.h
     llpanelobject.h
     llpanelobjectinventory.h
+    llpaneloutfitsinventory.h
     llpanelpeople.h
     llpanelpeoplemenus.h
     llpanelpermissions.h
@@ -867,6 +864,7 @@ set(viewer_HEADER_FILES
     llsearchcombobox.h
     llsearchhistory.h
     llselectmgr.h
+    llsidepanelappearance.h
     llsidepanelinventory.h
     llsidepanelinventorysubpanel.h
     llsidepaneliteminfo.h
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 80ac9e4085b..554f270c028 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -40,7 +40,7 @@
 #include "llinventorybridge.h"
 #include "llinventoryobserver.h"
 #include "llnotifications.h"
-#include "llpanelappearance.h"
+#include "llsidepanelappearance.h"
 #include "llsidetray.h"
 #include "llvoavatar.h"
 #include "llvoavatarself.h"
@@ -530,10 +530,10 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
 							LLAssetType::AT_LINK_FOLDER, link_waiter);
 
 		// Update the current outfit name of the appearance sidepanel.
-		LLPanelAppearance* panel_appearance = dynamic_cast<LLPanelAppearance *>(LLSideTray::getInstance()->getPanel("panel_appearance"));
+		LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance *>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
 		if (panel_appearance)
 		{
-			panel_appearance->refreshCurrentLookName(catp->getName());
+			panel_appearance->refreshCurrentOutfitName(catp->getName());
 		}
 	}
 							  
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index 3e4b3327db5..085c96c93dd 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -100,17 +100,18 @@ BOOL LLInventoryFilter::check(LLFolderViewItem* item)
 	bool passed_type = false;
 	if (mFilterOps.mFilterForCategories)
 	{
-		if (listener->getInventoryType() == LLInventoryType::IT_CATEGORY)
+		// Pass if this item is a category of the filter type, or
+		// if its parent is a category of the filter type.
+		LLUUID uuid = listener->getUUID();
+		if (listener->getInventoryType() != LLInventoryType::IT_CATEGORY)
 		{
-			LLViewerInventoryCategory *cat = gInventory.getCategory(listener->getUUID());
-			if (cat)
-			{
-				passed_type |= ((1LL << cat->getPreferredType() & mFilterOps.mFilterTypes) != U64(0));
-			}
+			const LLInventoryObject *obj = gInventory.getObject(uuid);
+			uuid = obj->getParentUUID();
 		}
-		else
+		LLViewerInventoryCategory *cat = gInventory.getCategory(uuid);
+		if (cat)
 		{
-			passed_type = TRUE;
+			passed_type |= ((1LL << cat->getPreferredType() & mFilterOps.mFilterTypes) != U64(0));
 		}
 	}
 	else
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 7b7090d10d9..450ce92412f 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -145,23 +145,10 @@ BOOL LLInventoryPanel::postBuild()
 	mInventoryObserver = new LLInventoryPanelObserver(this);
 	mInventory->addObserver(mInventoryObserver);
 
-	// determine the root folder, if any, so inventory contents show just the children
-	// of that folder (i.e. not including the folder itself).
-	const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString);
-
-	if ("LIBRARY" == mStartFolderString)
-	{
-		mStartFolderID = gInventory.getLibraryRootFolderID();
-	}
-	else
-	{
-		mStartFolderID = (preferred_type != LLFolderType::FT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null);
-	}
-
 	// build view of inventory if we need default full hierarchy and inventory ready, otherwise wait for modelChanged() callback
 	if (mBuildDefaultHierarchy && mInventory->isInventoryUsable() && !mHasInventoryConnection)
 	{
-		rebuildViewsFor(mStartFolderID);
+		rebuildViews();
 		mHasInventoryConnection = true;
 		defaultOpenInventory();
 	}
@@ -268,7 +255,7 @@ void LLInventoryPanel::modelChanged(U32 mask)
 	// inventory just initialized, do complete build
 	if ((mask & LLInventoryObserver::ADD) && gInventory.getChangedIDs().empty() && !mHasInventoryConnection)
 	{
-		rebuildViewsFor(mStartFolderID);
+		rebuildViews();
 		mHasInventoryConnection = true;
 		defaultOpenInventory();
 		return;
@@ -388,6 +375,24 @@ void LLInventoryPanel::modelChanged(U32 mask)
 }
 
 
+void LLInventoryPanel::rebuildViews()
+{
+	// Determine the root folder and rebuild the views starting
+	// at that folder.
+	const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString);
+
+	if ("LIBRARY" == mStartFolderString)
+	{
+		mStartFolderID = gInventory.getLibraryRootFolderID();
+	}
+	else
+	{
+		mStartFolderID = (preferred_type != LLFolderType::FT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null);
+	}
+	
+	rebuildViewsFor(mStartFolderID);
+}
+
 void LLInventoryPanel::rebuildViewsFor(const LLUUID& id)
 {
 	LLFolderViewItem* old_view = NULL;
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index e398c441059..0ccee337c94 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -162,6 +162,10 @@ class LLInventoryPanel : public LLPanel
 	void unSelectAll()	{ mFolders->setSelection(NULL, FALSE, FALSE); }
 	
 protected:
+	// Destroys the old views, and regenerates them based on the
+	// start folder ID.
+	void rebuildViews();
+
 	// Given the id and the parent, build all of the folder views.
 	void rebuildViewsFor(const LLUUID& id);
 	virtual void buildNewViews(const LLUUID& id); // made virtual to support derived classes. EXT-719
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index e3b2ab77aaa..6c7d434eeb4 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -49,7 +49,7 @@
 #include "llviewermenu.h"
 #include "llviewertexturelist.h"
 
-static LLRegisterPanelClassWrapper<LLPanelMainInventory> t_inventory("panel_main_inventory"); // Seraph is this redundant with constructor?
+static LLRegisterPanelClassWrapper<LLPanelMainInventory> t_inventory("panel_main_inventory");
 
 void on_file_loaded_for_save(BOOL success, 
 							 LLViewerFetchedTexture *src_vi,
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
new file mode 100644
index 00000000000..2964bbe792f
--- /dev/null
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -0,0 +1,245 @@
+/**
+ * @file llpaneloutfitsinventory.cpp
+ * @brief Outfits inventory panel
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpaneloutfitsinventory.h"
+
+#include "llagent.h"
+#include "llbutton.h"
+#include "llfloaterreg.h"
+#include "lllandmark.h"
+
+#include "llfloaterworldmap.h"
+#include "llfloaterinventory.h"
+#include "llfoldervieweventlistener.h"
+#include "llinventoryfunctions.h"
+#include "llinventorypanel.h"
+#include "llsidetray.h"
+#include "lltabcontainer.h"
+#include "llagentwearables.h"
+#include "llviewerjointattachment.h"
+#include "llviewerfoldertype.h"
+#include "llvoavatarself.h"
+
+static LLRegisterPanelClassWrapper<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory");
+
+LLPanelOutfitsInventory::LLPanelOutfitsInventory() :
+	mInventoryPanel(NULL),
+	mActionBtn(NULL),
+	mWearBtn(NULL),
+	mEditBtn(NULL)
+{
+	mSavedFolderState = new LLSaveFolderState();
+	mSavedFolderState->setApply(FALSE);
+
+	// LLUICtrlFactory::getInstance()->buildPanel(this, "panel_outfits_inventory.xml");
+}
+
+LLPanelOutfitsInventory::~LLPanelOutfitsInventory()
+{
+	delete mSavedFolderState;
+}
+
+// virtual
+BOOL LLPanelOutfitsInventory::postBuild()
+{
+	mInventoryPanel = getChild<LLInventoryPanel>("outfits_list");
+	mInventoryPanel->setFilterTypes(1LL << LLFolderType::FT_OUTFIT, TRUE);
+	mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+	mInventoryPanel->openDefaultFolderForType(LLFolderType::FT_MY_OUTFITS);
+	mInventoryPanel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onSelectionChange, this, _1, _2));
+	
+	LLFolderView* root_folder = getRootFolder();
+	root_folder->setReshapeCallback(boost::bind(&LLPanelOutfitsInventory::onSelectionChange, this, _1, _2));
+	
+	mWearBtn = getChild<LLButton>("wear_btn");
+	mEditBtn = getChild<LLButton>("edit_btn");
+	mActionBtn = getChild<LLButton>("action_btn");
+	
+	return TRUE;
+}
+
+// virtual
+void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)
+{
+	if (string == "")
+	{
+		mInventoryPanel->setFilterSubString(LLStringUtil::null);
+
+		// re-open folders that were initially open
+		mSavedFolderState->setApply(TRUE);
+		getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+		LLOpenFoldersWithSelection opener;
+		getRootFolder()->applyFunctorRecursively(opener);
+		getRootFolder()->scrollToShowSelection();
+	}
+
+	gInventory.startBackgroundFetch();
+
+	if (mInventoryPanel->getFilterSubString().empty() && string.empty())
+	{
+		// current filter and new filter empty, do nothing
+		return;
+	}
+
+	// save current folder open state if no filter currently applied
+	if (getRootFolder()->getFilterSubString().empty())
+	{
+		mSavedFolderState->setApply(FALSE);
+		getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+	}
+
+	// set new filter string
+	mInventoryPanel->setFilterSubString(string);
+}
+
+void LLPanelOutfitsInventory::onWear()
+{
+	LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem();
+	if (!current_item)
+		return;
+
+	LLFolderViewEventListener* listenerp = current_item->getListener();
+	if (getIsCorrectType(listenerp))
+	{
+		listenerp->performAction(NULL, NULL,"replaceoutfit");
+	}
+}
+
+void LLPanelOutfitsInventory::onEdit()
+{
+}
+
+void LLPanelOutfitsInventory::onNew()
+{
+	const std::string& outfit_name = LLViewerFolderType::lookupNewCategoryName(LLFolderType::FT_OUTFIT);
+	LLUUID outfit_folder = gAgentWearables.makeNewOutfitLinks(outfit_name);
+	getRootFolder()->setSelectionByID(outfit_folder, TRUE);
+	getRootFolder()->setNeedsAutoRename(TRUE);
+}
+
+void LLPanelOutfitsInventory::updateVerbs()
+{
+	BOOL enabled = FALSE;
+
+	LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem();
+	if (current_item)
+	{
+		LLFolderViewEventListener* listenerp = current_item->getListener();
+		if (getIsCorrectType(listenerp))
+		{
+			enabled = TRUE;
+		}
+	}
+
+	if (mWearBtn)
+	{
+		mWearBtn->setEnabled(enabled);
+	}
+	// mEditBtn->setEnabled(enabled);
+}
+
+void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
+{
+	LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem();
+	if (!current_item)
+		return;
+	
+	/*
+	  LLFolderViewEventListener* listenerp = current_item->getListener();
+	  if (getIsCorrectType(listenerp))
+	  {
+	  S32 bottom = 0;
+	  LLFolderViewItem* folder = current_item->getParentFolder();
+
+	  while ( folder->getParentFolder() != NULL )
+	  {
+	  bottom += folder->getRect().mBottom;
+	  folder = folder->getParentFolder();
+	  }
+
+	  LLRect rect = current_item->getRect();
+	  LLRect btn_rect(
+	  rect.mRight - mActionBtn->getRect().getWidth(),
+	  bottom + rect.mTop,
+	  rect.mRight,
+	  bottom + rect.mBottom);
+
+	  mActionBtn->setRect(btn_rect);
+
+	  if (!mActionBtn->getVisible())
+	  mActionBtn->setVisible(TRUE);
+	  }
+	  else
+	  {
+	  if (mActionBtn->getVisible())
+	  mActionBtn->setVisible(FALSE);
+	  } 
+	*/
+
+	updateVerbs();
+}
+
+void LLPanelOutfitsInventory::onSelectorButtonClicked()
+{
+	/*
+	  LLFolderViewItem* cur_item = getRootFolder()->getCurSelectedItem();
+
+	  LLFolderViewEventListener* listenerp = cur_item->getListener();
+	  if (getIsCorrectType(listenerp))
+	  {
+	  LLSD key;
+	  key["type"] = "look";
+	  key["id"] = listenerp->getUUID();
+
+	  LLSideTray::getInstance()->showPanel("sidepanel_appearance", key);
+	  } 
+	*/
+}
+
+bool LLPanelOutfitsInventory::getIsCorrectType(const LLFolderViewEventListener *listenerp) const
+{
+	if (listenerp->getInventoryType() == LLInventoryType::IT_CATEGORY)
+	{
+		LLViewerInventoryCategory *cat = gInventory.getCategory(listenerp->getUUID());
+		if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT)
+		{
+			return true;
+		}
+	}
+	return false;
+}
+
+LLFolderView *LLPanelOutfitsInventory::getRootFolder()
+{
+	return mInventoryPanel->getRootFolder();
+}
diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h
new file mode 100644
index 00000000000..3f837d3635d
--- /dev/null
+++ b/indra/newview/llpaneloutfitsinventory.h
@@ -0,0 +1,76 @@
+/**
+ * @file llpaneloutfitsinventory.h
+ * @brief Outfits inventory panel
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELOUTFITSINVENTORY_H
+#define LL_LLPANELOUTFITSINVENTORY_H
+
+#include "llpanel.h"
+#include "llinventoryobserver.h"
+
+class LLFolderView;
+class LLFolderViewItem;
+class LLFolderViewEventListener;
+class LLInventoryPanel;
+class LLSaveFolderState;
+class LLButton;
+
+class LLPanelOutfitsInventory : public LLPanel
+{
+public:
+	LLPanelOutfitsInventory();
+	virtual ~LLPanelOutfitsInventory();
+
+	/*virtual*/ BOOL postBuild();
+	
+	void onSearchEdit(const std::string& string);
+	void onWear();
+	void onEdit();
+	void onNew();
+	void updateVerbs();
+
+	void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+	void onSelectorButtonClicked();
+
+	LLFolderView* getRootFolder();
+
+private:
+	bool getIsCorrectType(const LLFolderViewEventListener *listenerp) const;
+	LLInventoryPanel*			mInventoryPanel;
+	LLSaveFolderState*			mSavedFolderState;
+
+	LLButton*					mActionBtn;
+	LLButton*					mWearBtn;
+	LLButton*					mEditBtn;
+
+};
+
+#endif //LL_LLPANELOUTFITSINVENTORY_H
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
new file mode 100644
index 00000000000..d92e404c2c6
--- /dev/null
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -0,0 +1,373 @@
+/**
+ * @file llsidepanelappearance.cpp
+ * @brief Side Bar "Appearance" panel
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llsidepanelappearance.h"
+
+#include "llagent.h"
+#include "llagentwearables.h"
+#include "llfiltereditor.h"
+#include "llfloaterreg.h"
+#include "llfloaterworldmap.h"
+#include "llpaneleditwearable.h"
+#include "llpaneloutfitsinventory.h"
+#include "lltextbox.h"
+#include "lluictrlfactory.h"
+#include "llviewerregion.h"
+#include "llvoavatarself.h"
+#include "llwearable.h"
+
+static LLRegisterPanelClassWrapper<LLSidepanelAppearance> t_appearance("sidepanel_appearance");
+
+class LLCurrentlyWornFetchObserver : public LLInventoryFetchObserver
+{
+public:
+	LLCurrentlyWornFetchObserver(LLSidepanelAppearance *panel) :
+		mPanel(panel)
+	{}
+	~LLCurrentlyWornFetchObserver() {}
+	virtual void done()
+	{
+		mPanel->inventoryFetched();
+		gInventory.removeObserver(this);
+	}
+private:
+	LLSidepanelAppearance *mPanel;
+};
+
+LLSidepanelAppearance::LLSidepanelAppearance() :
+	LLPanel(),
+	mFilterSubString(LLStringUtil::null),
+	mFilterEditor(NULL),
+	mLookInfo(NULL),
+	mCurrLookPanel(NULL)
+{
+	//LLUICtrlFactory::getInstance()->buildPanel(this, "panel_appearance.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
+	mFetchWorn = new LLCurrentlyWornFetchObserver(this);
+}
+
+LLSidepanelAppearance::~LLSidepanelAppearance()
+{
+}
+
+// virtual
+BOOL LLSidepanelAppearance::postBuild()
+{
+	mEditAppearanceBtn = getChild<LLButton>("editappearance_btn");
+	mEditAppearanceBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditAppearanceButtonClicked, this));
+
+	mWearBtn = getChild<LLButton>("wear_btn");
+	mWearBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onWearButtonClicked, this));
+
+	mEditBtn = getChild<LLButton>("edit_btn");
+	mEditBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditButtonClicked, this));
+
+	mNewLookBtn = getChild<LLButton>("newlook_btn");
+	mNewLookBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onNewOutfitButtonClicked, this));
+	mNewLookBtn->setEnabled(false);
+
+	mOverflowBtn = getChild<LLButton>("overflow_btn");
+
+	mFilterEditor = getChild<LLFilterEditor>("Filter");
+	if (mFilterEditor)
+	{
+		mFilterEditor->setCommitCallback(boost::bind(&LLSidepanelAppearance::onFilterEdit, this, _2));
+	}
+
+	mPanelOutfitsInventory = dynamic_cast<LLPanelOutfitsInventory *>(getChild<LLPanel>("panel_outfits_inventory"));
+
+	mLookInfo = dynamic_cast<LLPanelLookInfo*>(getChild<LLPanel>("panel_look_info"));
+	if (mLookInfo)
+	{
+		LLButton* back_btn = mLookInfo->getChild<LLButton>("back_btn");
+		if (back_btn)
+		{
+			back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onBackButtonClicked, this));
+		}
+
+		// *TODO: Assign the action to an appropriate event.
+		// mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::toggleMediaPanel, this));
+	}
+
+	mEditWearable = dynamic_cast<LLPanelEditWearable*>(getChild<LLPanel>("panel_edit_wearable"));
+	if (mEditWearable)
+	{
+		LLButton* edit_wearable_back_btn = mEditWearable->getChild<LLButton>("back_btn");
+		if (edit_wearable_back_btn)
+		{
+			edit_wearable_back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditWearBackClicked, this));
+		}
+	}
+
+	mCurrentLookName = getChild<LLTextBox>("currentlook_name");
+	
+	mCurrLookPanel = getChild<LLPanel>("panel_currentlook");
+
+	return TRUE;
+}
+
+// virtual
+void LLSidepanelAppearance::onOpen(const LLSD& key)
+{
+	fetchInventory();
+	refreshCurrentOutfitName();
+
+	if(key.size() == 0)
+		return;
+
+	toggleLookInfoPanel(TRUE);
+	updateVerbs();
+	
+	mLookInfoType = key["type"].asString();
+
+	if (mLookInfoType == "look")
+	{
+		LLInventoryCategory *pLook = gInventory.getCategory(key["id"].asUUID());
+		if (pLook)
+			mLookInfo->displayLookInfo(pLook);
+	}
+}
+
+void LLSidepanelAppearance::onFilterEdit(const std::string& search_string)
+{
+	if (mFilterSubString != search_string)
+	{
+		mFilterSubString = search_string;
+
+		// Searches are case-insensitive
+		LLStringUtil::toUpper(mFilterSubString);
+		LLStringUtil::trimHead(mFilterSubString);
+
+		mPanelOutfitsInventory->onSearchEdit(mFilterSubString);
+	}
+}
+
+void LLSidepanelAppearance::onWearButtonClicked()
+{
+	if (mLookInfo->getVisible())
+	{
+	}
+	else
+	{
+		mPanelOutfitsInventory->onWear();
+	}
+}
+
+void LLSidepanelAppearance::onEditAppearanceButtonClicked()
+{
+	if (gAgentWearables.areWearablesLoaded())
+	{
+		gAgent.changeCameraToCustomizeAvatar();
+	}
+}
+
+void LLSidepanelAppearance::onEditButtonClicked()
+{
+	toggleLookInfoPanel(FALSE);
+	toggleWearableEditPanel(TRUE, NULL);
+	/*if (mLookInfo->getVisible())
+	  {
+	  }
+	  else
+	  {
+	  mPanelOutfitsInventory->onEdit();
+	  }*/
+}
+
+void LLSidepanelAppearance::onNewOutfitButtonClicked()
+{
+	if (mLookInfo->getVisible())
+	{
+	}
+	else
+	{
+		mPanelOutfitsInventory->onNew();
+	}
+}
+
+
+void LLSidepanelAppearance::onBackButtonClicked()
+{
+	toggleLookInfoPanel(FALSE);
+}
+
+void LLSidepanelAppearance::onEditWearBackClicked()
+{
+	mEditWearable->saveChanges();
+	toggleWearableEditPanel(FALSE, NULL);
+	toggleLookInfoPanel(TRUE);
+}
+
+void LLSidepanelAppearance::toggleLookInfoPanel(BOOL visible)
+{
+	if (!mLookInfo)
+		return;
+
+	mLookInfo->setVisible(visible);
+	mPanelOutfitsInventory->setVisible(!visible);
+	mFilterEditor->setVisible(!visible);
+	mWearBtn->setVisible(!visible);
+	mEditBtn->setVisible(!visible);
+	mNewLookBtn->setVisible(!visible);
+	mOverflowBtn->setVisible(!visible);
+	mCurrLookPanel->setVisible(!visible);
+}
+
+void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *wearable)
+{
+	if (!wearable)
+	{
+		wearable = gAgentWearables.getWearable(WT_SHAPE, 0);
+	}
+	if (!mEditWearable || !wearable)
+	{
+		return;
+	}
+
+	mEditWearable->setVisible(visible);
+	mFilterEditor->setVisible(!visible);
+	mPanelOutfitsInventory->setVisible(!visible);
+}
+
+void LLSidepanelAppearance::updateVerbs()
+{
+	bool is_look_info_visible = mLookInfo->getVisible();
+	mOverflowBtn->setEnabled(false);
+
+	if (is_look_info_visible)
+	{
+	}
+	else
+	{
+		mPanelOutfitsInventory->updateVerbs();
+	}
+}
+
+void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string name)
+{
+	if (name == "")
+	{
+		const LLUUID current_outfit_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
+		LLInventoryModel::cat_array_t cat_array;
+		LLInventoryModel::item_array_t item_array;
+		// Can't search on AT_OUTFIT since links to categories return AT_CATEGORY for type since they don't
+		// return preferred type.
+		LLIsType is_category( LLAssetType::AT_CATEGORY ); 
+		gInventory.collectDescendentsIf(current_outfit_cat,
+										cat_array,
+										item_array,
+										false,
+										is_category,
+										false);
+		for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin();
+			 iter != item_array.end();
+			 iter++)
+		{
+			const LLViewerInventoryItem *item = (*iter);
+			const LLViewerInventoryCategory *cat = item->getLinkedCategory();
+			if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT)
+			{
+				mCurrentLookName->setText(cat->getName());
+				return;
+			}
+		}
+		mCurrentLookName->setText(std::string(""));
+	}
+	else
+	{
+		mCurrentLookName->setText(name);
+	}
+}
+
+//static
+void LLSidepanelAppearance::editWearable(LLWearable *wearable, void *data)
+{
+	LLSidepanelAppearance *panel = (LLSidepanelAppearance*) data;
+	panel->toggleLookInfoPanel(FALSE);
+	panel->toggleWearableEditPanel(TRUE, wearable);
+}
+
+// Fetch currently worn items and only enable the New Look button after everything's been
+// fetched.  Alternatively, we could stuff this logic into llagentwearables::makeNewOutfitLinks.
+void LLSidepanelAppearance::fetchInventory()
+{
+
+	mNewLookBtn->setEnabled(false);
+	LLInventoryFetchObserver::item_ref_t ids;
+	LLUUID item_id;
+	for(S32 type = (S32)WT_SHAPE; type < (S32)WT_COUNT; ++type)
+	{
+		// MULTI_WEARABLE:
+		item_id = gAgentWearables.getWearableItemID((EWearableType)type,0);
+		if(item_id.notNull())
+		{
+			ids.push_back(item_id);
+		}
+	}
+
+	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
+	if( avatar )
+	{
+		for (LLVOAvatar::attachment_map_t::const_iterator iter = avatar->mAttachmentPoints.begin(); 
+			 iter != avatar->mAttachmentPoints.end(); ++iter)
+		{
+			LLViewerJointAttachment* attachment = iter->second;
+			if (!attachment) continue;
+			for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
+				 attachment_iter != attachment->mAttachedObjects.end();
+				 ++attachment_iter)
+			{
+				LLViewerObject* attached_object = (*attachment_iter);
+				if (!attached_object) continue;
+				const LLUUID& item_id = attached_object->getItemID();
+				if (item_id.isNull()) continue;
+				ids.push_back(item_id);
+			}
+		}
+	}
+
+	mFetchWorn->fetchItems(ids);
+	// If no items to be fetched, done will never be triggered.
+	// TODO: Change LLInventoryFetchObserver::fetchItems to trigger done() on this condition.
+	if (mFetchWorn->isEverythingComplete())
+	{
+		mFetchWorn->done();
+	}
+	else
+	{
+		gInventory.addObserver(mFetchWorn);
+	}
+}
+
+void LLSidepanelAppearance::inventoryFetched()
+{
+	mNewLookBtn->setEnabled(true);
+}
diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h
new file mode 100644
index 00000000000..7be6d2d432d
--- /dev/null
+++ b/indra/newview/llsidepanelappearance.h
@@ -0,0 +1,102 @@
+/** 
+ * @file llsidepanelappearance.h
+ * @brief Side Bar "Appearance" panel
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLSIDEPANELAPPEARANCE_H
+#define LL_LLSIDEPANELAPPEARANCE_H
+
+#include "llpanel.h"
+#include "llinventoryobserver.h"
+
+#include "llinventory.h"
+#include "llpanellookinfo.h"
+
+class LLFilterEditor;
+class LLCurrentlyWornFetchObserver;
+class LLPanelEditWearable;
+class LLWearable;
+class LLPanelOutfitsInventory;
+
+class LLSidepanelAppearance : public LLPanel
+{
+public:
+	LLSidepanelAppearance();
+	virtual ~LLSidepanelAppearance();
+
+	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void onOpen(const LLSD& key);
+
+	void refreshCurrentOutfitName(const std::string name = "");
+
+	static void editWearable(LLWearable *wearable, void *data);
+
+	void fetchInventory();
+	void inventoryFetched();
+private:
+	void onFilterEdit(const std::string& search_string);
+
+	void onEditAppearanceButtonClicked();
+	void onWearButtonClicked();
+	void onEditButtonClicked();
+	void onNewOutfitButtonClicked();
+	void onBackButtonClicked();
+	void onEditWearBackClicked();
+	void toggleLookInfoPanel(BOOL visible);
+	void toggleWearableEditPanel(BOOL visible, LLWearable* wearable);
+
+	void updateVerbs();
+
+	LLFilterEditor*			mFilterEditor;
+	LLPanelOutfitsInventory* mPanelOutfitsInventory;
+	LLPanelLookInfo*		mLookInfo;
+	LLPanelEditWearable*	mEditWearable;
+
+	LLButton*					mEditAppearanceBtn;
+	LLButton*					mWearBtn;
+	LLButton*					mEditBtn;
+	LLButton*					mNewLookBtn;
+	LLButton*					mOverflowBtn;
+	LLPanel*					mCurrLookPanel;
+
+	LLTextBox*					mCurrentLookName;
+
+	// Used to make sure the user's inventory is in memory.
+	LLCurrentlyWornFetchObserver* mFetchWorn;
+
+	// Search string for filtering landmarks and teleport
+	// history locations
+	std::string					mFilterSubString;
+
+	// Information type currently shown in Look Information panel
+	std::string					mLookInfoType;
+
+};
+
+#endif //LL_LLSIDEPANELAPPEARANCE_H
diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml
index b48c962413f..7cfcac8a9af 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory.xml
@@ -30,7 +30,7 @@
      name="Fetched">
         Fetched
     </floater.string>
-<panel
+    <panel
      bottom="560"
 	 class="panel_main_inventory"
 	 filename="panel_main_inventory.xml"
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
new file mode 100644
index 00000000000..f511ec0d6fb
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="Outfits" 
+	  bottom="0" 
+	  height="326" 
+	  left="0" 
+	  width="310"
+	  border="true"
+	  follows="left|top|right|bottom">
+	 <inventory_panel 
+	 	 allow_multi_select="true" 
+		 border="true" 
+		 bottom="0"
+	     follows="left|top|right|bottom" 
+		 height="326" 
+		 left="0" 
+		 mouse_opaque="true"
+	     name="outfits_list"
+		 width="310"
+		 start_folder="My Outfits"/>
+	<button bottom="0"
+		 halign="center"
+		 height="16"
+		 label=">"
+		 enabled="false"
+	     mouse_opaque="false"
+		 name="selector"
+		 width="20"
+		 left="0"
+		 visible="false"
+	     follows="right|bottom"
+		 tool_tip="View outfit properties"/>
+    <panel
+     background_visible="true"
+     bevel_style="none"
+     bottom="0"
+     follows="left|right|bottom"
+     height="30"
+     layout="bottomleft"
+     left="0"
+	 visible="true"
+     name="bottom_panel"
+     width="310">
+        <button
+         follows="bottom|left"
+         tool_tip="Show additional options"
+         height="18"
+         image_disabled="OptionsMenu_Disabled"
+         image_selected="OptionsMenu_Press"
+         image_unselected="OptionsMenu_Off"
+         layout="topleft"
+         left="10"
+         name="options_gear_btn"
+         picture_style="true"
+         top="6"
+         width="18" />
+        <button
+         follows="bottom|left"
+         height="18"
+         image_selected="AddItem_Press"
+         image_unselected="AddItem_Off"
+         image_disabled="AddItem_Disabled"
+         layout="topleft"
+         left_pad="5"
+         name="add_btn"
+         picture_style="true"
+         tool_tip="Add new item"
+         width="18" />
+        <dnd_button
+         follows="bottom|right"
+         height="18"
+         image_selected="TrashItem_Press"
+         image_unselected="TrashItem_Off"
+         layout="topleft"
+         right="-5"
+         name="trash_btn"
+         picture_style="true"
+         tool_tip="Remove selected item"
+         top="6"
+         width="18" />
+    </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml
index a419a02d756..d02354a6473 100644
--- a/indra/newview/skins/default/xui/en/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml
@@ -120,9 +120,9 @@
     background_visible="true"
   >
       <panel
-        class="panel_appearance"
-        name="panel_appearance"
-        filename="panel_appearance.xml"
+        class="sidepanel_appearance"
+        name="sidepanel_appearance"
+        filename="sidepanel_appearance.xml"
         label="Edit Appearance"
         font="SansSerifBold"
       />
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
new file mode 100644
index 00000000000..d87211d4327
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+	  background_visible="true"
+	  follows="all"
+	  height="400"
+	  label="Appearance"
+	  layout="topleft"
+	  min_height="350"
+	  min_width="240"
+	  name="appearance panel"
+	  width="333">
+     <string
+		 name="looks_tab_title"
+		 value="Looks" />
+     <panel
+		 left="5" width="320" height="55"
+		 background_visible="true"
+		 background_opaque="false"
+		 bg_alpha_color="0.2 0.2 0.2 1.0"
+		 name="panel_currentlook"
+		 follows="left|top|right">
+		<text
+			 top="-5" width="200" left="5" height="10" follows="left|right|top"
+        	 font="SansSerif" text_color="LtGray" word_wrap="true"
+        	 mouse_opaque="false" name="currentlook_title">
+					Current Look
+    	</text>
+  		<text
+			 top="-30" left="8" height="10" follows="left|right|top"
+      		 font="SansSerifBold" text_color="white" word_wrap="true"
+      		 mouse_opaque="false" name="currentlook_name" >
+					MyLook
+  		</text>
+  	    <button
+  	     	 follows="left|right|top"
+  	     	 font="SansSerif"
+  	     	 top="28" right="-105" width="60" height="20"
+  	     	 layout="topleft"
+  		 	 label="Edit"
+  	     	 name="editappearance_btn"/>
+	</panel>
+
+    <filter_editor
+  	     follows="left|top|right"
+  	     font="SansSerif"
+  	     label="Filter"
+  	     layout="topleft"
+  	     left="15" 
+		 width="313"
+		 height="20"
+  	     name="Filter" />
+    <panel
+   	     class="panel_outfits_inventory"
+   	     filename="panel_outfits_inventory.xml"
+ 	     name="panel_outfits_inventory"
+  	     follows="all"
+  	     height="271"
+  	     halign="center"
+  	     layout="topleft"
+  	     left="10"
+  	     top_pad="19"
+  	     width="313" />
+    <button
+  	     follows="bottom|left"
+  	     font="SansSerifSmallBold"
+  	     height="25"
+  	     label="Wear"
+  	     layout="topleft"
+  	     left="10"
+  	     name="wear_btn"
+     	 top_pad="0"
+       	 width="80" />
+    <button
+    	 follows="bottom|left"
+  	     font="SansSerifSmallBold"
+  	     height="25"
+  	     label="New Look"
+  	     layout="topleft"
+  	     left_pad="0"
+  	     name="newlook_btn"
+  	     top_delta="0"
+   	     width="90" />
+
+	<panel
+       	 class="panel_look_info"
+       	 filename="panel_look_info.xml"
+       	 follows="all"
+       	 layout="topleft"
+       	 left="0"
+       	 name="panel_look_info"
+       	 top="-200"
+       	 visible="false" />
+
+	<panel
+	   	 class="panel_edit_wearable"
+	   	 filename="panel_edit_wearable.xml"
+	   	 follows="all"
+	   	 layout="topleft"
+	   	 left="0"
+	   	 name="panel_edit_wearable"
+	   	 top="-200"
+	   	 visible="false"
+	   	 width="333" />
+</panel>
-- 
GitLab


From 65efbae9af42661e8ccb814c3d7595c9d5bf2752 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Tue, 17 Nov 2009 16:23:59 +0000
Subject: [PATCH 381/557] magickal newline to unbreak linux.

---
 indra/newview/llviewerchat.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp
index ccf9ce90561..8de87eb6026 100644
--- a/indra/newview/llviewerchat.cpp
+++ b/indra/newview/llviewerchat.cpp
@@ -217,4 +217,5 @@ void LLViewerChat::formatChatMsg(const LLChat& chat, std::string& formated_msg)
 		formated_msg = tmpmsg;
 	}
 
-}
\ No newline at end of file
+}
+
-- 
GitLab


From a66aa0fd9a7aa20484521bf9b3809297e31466b0 Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Tue, 17 Nov 2009 18:42:51 +0200
Subject: [PATCH 382/557] fixed major EXT-2551 Nearby Chat undocs after
 minimizing and opening (being docked before)

--HG--
branch : product-engine
---
 indra/llui/lldockablefloater.cpp | 13 +------------
 indra/newview/llimfloater.cpp    |  9 ---------
 indra/newview/llimfloater.h      |  1 -
 indra/newview/llnearbychat.cpp   |  9 ---------
 indra/newview/llnearbychat.h     |  1 -
 5 files changed, 1 insertion(+), 32 deletions(-)

diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp
index 9be3d49023c..9a2f2ab4d31 100644
--- a/indra/llui/lldockablefloater.cpp
+++ b/indra/llui/lldockablefloater.cpp
@@ -136,21 +136,10 @@ void LLDockableFloater::setVisible(BOOL visible)
 
 void LLDockableFloater::setMinimized(BOOL minimize)
 {
-	if(minimize && isDocked())
+	if(minimize)
 	{
 		setVisible(FALSE);
 	}
-
-	if (minimize)
-	{
-		setCanDock(false);
-	}
-	else if (!minimize && mDockControl.get() != NULL && mDockControl.get()->isDockVisible())
-	{
-		setCanDock(true);
-	}
-
-	LLFloater::setMinimized(minimize);
 }
 
 LLView * LLDockableFloater::getDockWidget()
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 890f587467f..c2c83191e00 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -377,15 +377,6 @@ void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
 	}
 }
 
-void LLIMFloater::setMinimized(BOOL minimize)
-{
-	if(minimize && !isDocked())
-	{
-		setVisible(FALSE);
-	}
-	LLDockableFloater::setMinimized(minimize);
-}
-
 void LLIMFloater::setVisible(BOOL visible)
 {
 	LLNotificationsUI::LLScreenChannel* channel = dynamic_cast<LLNotificationsUI::LLScreenChannel*>
diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h
index 5b77d15fcbc..e2d500d821e 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llimfloater.h
@@ -63,7 +63,6 @@ class LLIMFloater : public LLTransientDockableFloater
 	// LLFloater overrides
 	/*virtual*/ void onClose(bool app_quitting);
 	/*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
-	/*virtual*/ void setMinimized(BOOL minimize);
 
 	// Make IM conversion visible and update the message history
 	static LLIMFloater* show(const LLUUID& session_id);
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index f1cd8e558f4..16a47890c3b 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -224,12 +224,3 @@ void LLNearbyChat::getAllowedRect(LLRect& rect)
 {
 	rect = gViewerWindow->getWorldViewRectRaw();
 }
-void LLNearbyChat::setMinimized	(BOOL minimize)
-{
-	if(minimize && !isDocked())
-	{
-		setVisible(FALSE);
-	}
-	LLDockableFloater::setMinimized(minimize);
-}
-
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
index 2f72d657205..561c2d36776 100644
--- a/indra/newview/llnearbychat.h
+++ b/indra/newview/llnearbychat.h
@@ -54,7 +54,6 @@ class LLNearbyChat: public LLDockableFloater
 	/*virtual*/ void	onOpen	(const LLSD& key);
 
 	virtual void setRect		(const LLRect &rect);
-	virtual void setMinimized	(BOOL minimize);
 
 private:
 	virtual void    applySavedVariables();
-- 
GitLab


From ac325092cd653f0229111e1e548b82055e8a77c8 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Tue, 17 Nov 2009 16:46:52 +0000
Subject: [PATCH 383/557] Rebuild linux llqtwebkit/qt with -fno-stack-protector
 for better runtime compatibility. I hope.

---
 install.xml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/install.xml b/install.xml
index de5bdc4b377..1df8fd09f4b 100644
--- a/install.xml
+++ b/install.xml
@@ -955,9 +955,9 @@ anguage Infrstructure (CLI) international standard</string>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>0d8aab394b4dc00aae44b4ada50c2d9f</string>
+            <string>ffede2775355676096b1085cbb9d0da7</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-20091027.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-20091117.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
-- 
GitLab


From ddee62b833480afdf730737bea6c97437daca74e Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Tue, 17 Nov 2009 09:28:23 -0800
Subject: [PATCH 384/557] Nudge parabuild

---
 indra/newview/skins/default/xui/en/floater_aaa.xml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml
index d0d0cc64c55..e4ab533bc59 100644
--- a/indra/newview/skins/default/xui/en/floater_aaa.xml
+++ b/indra/newview/skins/default/xui/en/floater_aaa.xml
@@ -5,5 +5,6 @@
  name="floater_aaa"
  can_resize="true" 
  width="1024">
+ <string name="Nudge Parabuild">1</string>
   <panel filename="main_view.xml" follows="all" width="1024" height="768" top="0"/>
 </floater>
-- 
GitLab


From 53beee9e0837865163ff700df4b8d452135da9eb Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Tue, 17 Nov 2009 13:00:26 -0500
Subject: [PATCH 385/557] EXT-2569 : Separate out LLPanelOutfitsInventory so
 it's more modular versus being coupled with LLSidepanelAppearance EXT-2561 :
 Add standard bottom panel (gear menu, add button, trash icon)

Added gear menu and standardized the code. (someday, will create a subclass to share the functionality across panels)
Make LLPanelOutfitsInventory more modular, e.g. it no longer knows about the Wear/Edit buttons.

--HG--
branch : avatar-pipeline
---
 indra/newview/llpanelmaininventory.cpp    |  46 ++--
 indra/newview/llpanelmaininventory.h      |  29 +--
 indra/newview/llpaneloutfitsinventory.cpp | 262 +++++++++++++++-------
 indra/newview/llpaneloutfitsinventory.h   |  36 ++-
 indra/newview/llsidepanelappearance.cpp   |  19 +-
 indra/newview/llsidepanelappearance.h     |   4 +-
 6 files changed, 264 insertions(+), 132 deletions(-)

diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 6c7d434eeb4..9f723169e12 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -197,28 +197,6 @@ BOOL LLPanelMainInventory::postBuild()
 	return TRUE;
 }
 
-void LLPanelMainInventory::initListCommandsHandlers()
-{
-	mListCommands = getChild<LLPanel>("bottom_panel");
-
-	mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this));
-	mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this));
-	mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
-
-	LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");
-	trash_btn->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this
-			,	_4 // BOOL drop
-			,	_5 // EDragAndDropType cargo_type
-			,	_7 // EAcceptance* accept
-			));
-
-	mCommitCallbackRegistrar.add("Inventory.GearDefault.Custom.Action", boost::bind(&LLPanelMainInventory::onCustomAction, this, _2));
-	mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2));
-	mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-	mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-	
-}
-
 // Destroys the object
 LLPanelMainInventory::~LLPanelMainInventory( void )
 {
@@ -863,9 +841,30 @@ void LLFloaterInventoryFinder::selectNoTypes(void* user_data)
 	self->childSetValue("check_snapshot", FALSE);
 }
 
+//////////////////////////////////////////////////////////////////////////////////
+// List Commands                                                                //
 
+void LLPanelMainInventory::initListCommandsHandlers()
+{
+	mListCommands = getChild<LLPanel>("bottom_panel");
 
+	mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this));
+	mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this));
+	mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
 
+	LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");
+	trash_btn->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this
+			,	_4 // BOOL drop
+			,	_5 // EDragAndDropType cargo_type
+			,	_7 // EAcceptance* accept
+			));
+
+	mCommitCallbackRegistrar.add("Inventory.GearDefault.Custom.Action", boost::bind(&LLPanelMainInventory::onCustomAction, this, _2));
+	mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2));
+	mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+	mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+	
+}
 
 void LLPanelMainInventory::updateListCommands()
 {
@@ -1018,3 +1017,6 @@ bool LLPanelMainInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType
 	}
 	return true;
 }
+
+// List Commands                                                              //
+////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index fbc0f09c506..627be215779 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -111,7 +111,20 @@ class LLPanelMainInventory : public LLPanel, LLInventoryObserver
 	void resetFilters();
 	void setSortBy(const LLSD& userdata);
 	
-	// List Commands Handlers
+private:
+	LLFloaterInventoryFinder* getFinder();
+
+	LLFilterEditor*				mFilterEditor;
+	LLTabContainer*				mFilterTabs;
+	LLHandle<LLFloater>			mFinderHandle;
+	LLInventoryPanel*			mActivePanel;
+	LLSaveFolderState*			mSavedFolderState;
+	std::string					mFilterText;
+
+
+	//////////////////////////////////////////////////////////////////////////////////
+	// List Commands                                                                //
+protected:
 	void initListCommandsHandlers();
 	void updateListCommands();
 	void onGearButtonClick();
@@ -122,22 +135,12 @@ class LLPanelMainInventory : public LLPanel, LLInventoryObserver
 	BOOL isActionEnabled(const LLSD& command_name);
 	void onCustomAction(const LLSD& command_name);
 	bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept);
-
-
 private:
-	LLFloaterInventoryFinder* getFinder();
-
-	LLFilterEditor*				mFilterEditor;
-	LLTabContainer*				mFilterTabs;
-	LLHandle<LLFloater>			mFinderHandle;
-	LLInventoryPanel*			mActivePanel;
-	LLSaveFolderState*			mSavedFolderState;
-
 	LLPanel*					mListCommands;
 	LLMenuGL*					mMenuGearDefault;
 	LLMenuGL*					mMenuAdd;
-
-	std::string					mFilterText;
+	// List Commands                                                              //
+	////////////////////////////////////////////////////////////////////////////////
 };
 
 #endif // LL_LLPANELMAININVENTORY_H
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index 2964bbe792f..5ad9bf056e0 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -34,34 +34,36 @@
 #include "llpaneloutfitsinventory.h"
 
 #include "llagent.h"
+#include "llagentwearables.h"
+
 #include "llbutton.h"
 #include "llfloaterreg.h"
-#include "lllandmark.h"
-
 #include "llfloaterworldmap.h"
 #include "llfloaterinventory.h"
 #include "llfoldervieweventlistener.h"
 #include "llinventoryfunctions.h"
 #include "llinventorypanel.h"
+#include "lllandmark.h"
+#include "llsidepanelappearance.h"
 #include "llsidetray.h"
 #include "lltabcontainer.h"
-#include "llagentwearables.h"
-#include "llviewerjointattachment.h"
 #include "llviewerfoldertype.h"
+#include "llviewerjointattachment.h"
 #include "llvoavatarself.h"
 
+// List Commands
+#include "lldndbutton.h"
+#include "llmenugl.h"
+#include "llviewermenu.h"
+
 static LLRegisterPanelClassWrapper<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory");
 
 LLPanelOutfitsInventory::LLPanelOutfitsInventory() :
 	mInventoryPanel(NULL),
-	mActionBtn(NULL),
-	mWearBtn(NULL),
-	mEditBtn(NULL)
+	mParent(NULL)
 {
 	mSavedFolderState = new LLSaveFolderState();
 	mSavedFolderState->setApply(FALSE);
-
-	// LLUICtrlFactory::getInstance()->buildPanel(this, "panel_outfits_inventory.xml");
 }
 
 LLPanelOutfitsInventory::~LLPanelOutfitsInventory()
@@ -78,16 +80,23 @@ BOOL LLPanelOutfitsInventory::postBuild()
 	mInventoryPanel->openDefaultFolderForType(LLFolderType::FT_MY_OUTFITS);
 	mInventoryPanel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onSelectionChange, this, _1, _2));
 	
-	LLFolderView* root_folder = getRootFolder();
-	root_folder->setReshapeCallback(boost::bind(&LLPanelOutfitsInventory::onSelectionChange, this, _1, _2));
-	
-	mWearBtn = getChild<LLButton>("wear_btn");
-	mEditBtn = getChild<LLButton>("edit_btn");
-	mActionBtn = getChild<LLButton>("action_btn");
-	
+	initListCommandsHandlers();
 	return TRUE;
 }
 
+void LLPanelOutfitsInventory::updateParent()
+{
+	if (mParent)
+	{
+		mParent->updateVerbs();
+	}
+}
+
+void LLPanelOutfitsInventory::setParent(LLSidepanelAppearance* parent)
+{
+	mParent = parent;
+}
+
 // virtual
 void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)
 {
@@ -124,12 +133,8 @@ void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)
 
 void LLPanelOutfitsInventory::onWear()
 {
-	LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem();
-	if (!current_item)
-		return;
-
-	LLFolderViewEventListener* listenerp = current_item->getListener();
-	if (getIsCorrectType(listenerp))
+	LLFolderViewEventListener* listenerp = getCorrectListenerForAction();
+	if (listenerp)
 	{
 		listenerp->performAction(NULL, NULL,"replaceoutfit");
 	}
@@ -147,66 +152,9 @@ void LLPanelOutfitsInventory::onNew()
 	getRootFolder()->setNeedsAutoRename(TRUE);
 }
 
-void LLPanelOutfitsInventory::updateVerbs()
-{
-	BOOL enabled = FALSE;
-
-	LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem();
-	if (current_item)
-	{
-		LLFolderViewEventListener* listenerp = current_item->getListener();
-		if (getIsCorrectType(listenerp))
-		{
-			enabled = TRUE;
-		}
-	}
-
-	if (mWearBtn)
-	{
-		mWearBtn->setEnabled(enabled);
-	}
-	// mEditBtn->setEnabled(enabled);
-}
-
 void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
 {
-	LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem();
-	if (!current_item)
-		return;
-	
-	/*
-	  LLFolderViewEventListener* listenerp = current_item->getListener();
-	  if (getIsCorrectType(listenerp))
-	  {
-	  S32 bottom = 0;
-	  LLFolderViewItem* folder = current_item->getParentFolder();
-
-	  while ( folder->getParentFolder() != NULL )
-	  {
-	  bottom += folder->getRect().mBottom;
-	  folder = folder->getParentFolder();
-	  }
-
-	  LLRect rect = current_item->getRect();
-	  LLRect btn_rect(
-	  rect.mRight - mActionBtn->getRect().getWidth(),
-	  bottom + rect.mTop,
-	  rect.mRight,
-	  bottom + rect.mBottom);
-
-	  mActionBtn->setRect(btn_rect);
-
-	  if (!mActionBtn->getVisible())
-	  mActionBtn->setVisible(TRUE);
-	  }
-	  else
-	  {
-	  if (mActionBtn->getVisible())
-	  mActionBtn->setVisible(FALSE);
-	  } 
-	*/
-
-	updateVerbs();
+	updateParent();
 }
 
 void LLPanelOutfitsInventory::onSelectorButtonClicked()
@@ -226,6 +174,20 @@ void LLPanelOutfitsInventory::onSelectorButtonClicked()
 	*/
 }
 
+LLFolderViewEventListener *LLPanelOutfitsInventory::getCorrectListenerForAction()
+{
+	LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem();
+	if (!current_item)
+		return NULL;
+
+	LLFolderViewEventListener* listenerp = current_item->getListener();
+	if (getIsCorrectType(listenerp))
+	{
+		return listenerp;
+	}
+	return NULL;
+}
+
 bool LLPanelOutfitsInventory::getIsCorrectType(const LLFolderViewEventListener *listenerp) const
 {
 	if (listenerp->getInventoryType() == LLInventoryType::IT_CATEGORY)
@@ -243,3 +205,143 @@ LLFolderView *LLPanelOutfitsInventory::getRootFolder()
 {
 	return mInventoryPanel->getRootFolder();
 }
+
+//////////////////////////////////////////////////////////////////////////////////
+// List Commands                                                                //
+
+void LLPanelOutfitsInventory::initListCommandsHandlers()
+{
+	mListCommands = getChild<LLPanel>("bottom_panel");
+
+	mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::onGearButtonClick, this));
+	mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this));
+	mListCommands->childSetAction("add_btn", boost::bind(&LLPanelOutfitsInventory::onAddButtonClick, this));
+
+	LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");
+	trash_btn->setDragAndDropHandler(boost::bind(&LLPanelOutfitsInventory::handleDragAndDropToTrash, this
+			,	_4 // BOOL drop
+			,	_5 // EDragAndDropType cargo_type
+			,	_7 // EAcceptance* accept
+			));
+
+	mCommitCallbackRegistrar.add("panel_outfits_inventory_gear_default.Custom.Action", boost::bind(&LLPanelOutfitsInventory::onCustomAction, this, _2));
+	mEnableCallbackRegistrar.add("panel_outfits_inventory_gear_default.Enable", boost::bind(&LLPanelOutfitsInventory::isActionEnabled, this, _2));
+	mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("panel_outfits_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+}
+
+void LLPanelOutfitsInventory::updateListCommands()
+{
+	bool trash_enabled = isActionEnabled("delete");
+
+	mListCommands->childSetEnabled("trash_btn", trash_enabled);
+}
+
+void LLPanelOutfitsInventory::onGearButtonClick()
+{
+	showActionMenu(mMenuGearDefault,"options_gear_btn");
+}
+
+void LLPanelOutfitsInventory::onAddButtonClick()
+{
+	onNew();
+}
+
+void LLPanelOutfitsInventory::showActionMenu(LLMenuGL* menu, std::string spawning_view_name)
+{
+	if (menu)
+	{
+		menu->buildDrawLabels();
+		menu->updateParent(LLMenuGL::sMenuContainer);
+		LLView* spawning_view = getChild<LLView> (spawning_view_name);
+		S32 menu_x, menu_y;
+		//show menu in co-ordinates of panel
+		spawning_view->localPointToOtherView(0, spawning_view->getRect().getHeight(), &menu_x, &menu_y, this);
+		menu_y += menu->getRect().getHeight();
+		LLMenuGL::showPopup(this, menu, menu_x, menu_y);
+	}
+}
+
+void LLPanelOutfitsInventory::onTrashButtonClick()
+{
+	onClipboardAction("delete");
+}
+
+void LLPanelOutfitsInventory::onClipboardAction(const LLSD& userdata)
+{
+	std::string command_name = userdata.asString();
+	getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name);
+}
+
+void LLPanelOutfitsInventory::onCustomAction(const LLSD& userdata)
+{
+	if (!isActionEnabled(userdata))
+		return;
+
+	const std::string command_name = userdata.asString();
+	if (command_name == "new")
+	{
+		onNew();
+	}
+	if (command_name == "edit")
+	{
+		onEdit();
+	}
+	if (command_name == "wear")
+	{
+		onWear();
+	}
+	if (command_name == "delete")
+	{
+		onClipboardAction("delete");
+	}
+}
+
+BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
+{
+	const std::string command_name = userdata.asString();
+	if (command_name == "delete")
+	{
+		BOOL can_delete = FALSE;
+		LLFolderView *folder = getActivePanel()->getRootFolder();
+		if (folder)
+		{
+			can_delete = TRUE;
+			std::set<LLUUID> selection_set;
+			folder->getSelectionList(selection_set);
+			for (std::set<LLUUID>::iterator iter = selection_set.begin();
+				 iter != selection_set.end();
+				 ++iter)
+			{
+				const LLUUID &item_id = (*iter);
+				LLFolderViewItem *item = folder->getItemByID(item_id);
+				can_delete &= item->getListener()->isItemRemovable();
+			}
+			return can_delete;
+		}
+		return FALSE;
+	}
+	if (command_name == "edit" || 
+		command_name == "wear")
+	{
+		return (getCorrectListenerForAction() != NULL);
+	}
+	return TRUE;
+}
+
+bool LLPanelOutfitsInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept)
+{
+	*accept = ACCEPT_NO;
+
+	const bool is_enabled = isActionEnabled("delete");
+	if (is_enabled) *accept = ACCEPT_YES_MULTI;
+
+	if (is_enabled && drop)
+	{
+		onClipboardAction("delete");
+	}
+	return true;
+}
+
+// List Commands                                                              //
+////////////////////////////////////////////////////////////////////////////////
+
diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h
index 3f837d3635d..4d903a389bc 100644
--- a/indra/newview/llpaneloutfitsinventory.h
+++ b/indra/newview/llpaneloutfitsinventory.h
@@ -42,6 +42,8 @@ class LLFolderViewEventListener;
 class LLInventoryPanel;
 class LLSaveFolderState;
 class LLButton;
+class LLMenuGL;
+class LLSidepanelAppearance;
 
 class LLPanelOutfitsInventory : public LLPanel
 {
@@ -55,22 +57,46 @@ class LLPanelOutfitsInventory : public LLPanel
 	void onWear();
 	void onEdit();
 	void onNew();
-	void updateVerbs();
 
 	void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
 	void onSelectorButtonClicked();
 
+	LLInventoryPanel* getActivePanel() { return mInventoryPanel; }
+
+	// If a compatible listener type is selected, then return a pointer to that.
+	// Otherwise, return NULL.
+	LLFolderViewEventListener* getCorrectListenerForAction();
+	void setParent(LLSidepanelAppearance *parent);
+protected:
+	void updateParent();
+	bool getIsCorrectType(const LLFolderViewEventListener *listenerp) const;
 	LLFolderView* getRootFolder();
 
 private:
-	bool getIsCorrectType(const LLFolderViewEventListener *listenerp) const;
+	LLSidepanelAppearance*      mParent;
 	LLInventoryPanel*			mInventoryPanel;
 	LLSaveFolderState*			mSavedFolderState;
 
-	LLButton*					mActionBtn;
-	LLButton*					mWearBtn;
-	LLButton*					mEditBtn;
 
+	//////////////////////////////////////////////////////////////////////////////////
+	// List Commands                                                                //
+protected:
+	void initListCommandsHandlers();
+	void updateListCommands();
+	void onGearButtonClick();
+	void onAddButtonClick();
+	void showActionMenu(LLMenuGL* menu, std::string spawning_view_name);
+	void onTrashButtonClick();
+	void onClipboardAction(const LLSD& userdata);
+	BOOL isActionEnabled(const LLSD& command_name);
+	void onCustomAction(const LLSD& command_name);
+	bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept);
+private:
+	LLPanel*					mListCommands;
+	LLMenuGL*					mMenuGearDefault;
+	LLMenuGL*					mMenuAdd;
+	//                                                                            //
+	////////////////////////////////////////////////////////////////////////////////
 };
 
 #endif //LL_LLPANELOUTFITSINVENTORY_H
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index d92e404c2c6..aeab3e28761 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -103,6 +103,7 @@ BOOL LLSidepanelAppearance::postBuild()
 	}
 
 	mPanelOutfitsInventory = dynamic_cast<LLPanelOutfitsInventory *>(getChild<LLPanel>("panel_outfits_inventory"));
+	mPanelOutfitsInventory->setParent(this);
 
 	mLookInfo = dynamic_cast<LLPanelLookInfo*>(getChild<LLPanel>("panel_look_info"));
 	if (mLookInfo)
@@ -172,10 +173,7 @@ void LLSidepanelAppearance::onFilterEdit(const std::string& search_string)
 
 void LLSidepanelAppearance::onWearButtonClicked()
 {
-	if (mLookInfo->getVisible())
-	{
-	}
-	else
+	if (!mLookInfo->getVisible())
 	{
 		mPanelOutfitsInventory->onWear();
 	}
@@ -204,10 +202,7 @@ void LLSidepanelAppearance::onEditButtonClicked()
 
 void LLSidepanelAppearance::onNewOutfitButtonClicked()
 {
-	if (mLookInfo->getVisible())
-	{
-	}
-	else
+	if (!mLookInfo->getVisible())
 	{
 		mPanelOutfitsInventory->onNew();
 	}
@@ -262,12 +257,16 @@ void LLSidepanelAppearance::updateVerbs()
 	bool is_look_info_visible = mLookInfo->getVisible();
 	mOverflowBtn->setEnabled(false);
 
-	if (is_look_info_visible)
+	if (!is_look_info_visible)
 	{
+		const bool is_correct_type = (mPanelOutfitsInventory->getCorrectListenerForAction() != NULL);
+		mEditBtn->setEnabled(is_correct_type);
+		mWearBtn->setEnabled(is_correct_type);
 	}
 	else
 	{
-		mPanelOutfitsInventory->updateVerbs();
+		mEditBtn->setEnabled(FALSE);
+		mWearBtn->setEnabled(FALSE);
 	}
 }
 
diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h
index 7be6d2d432d..496a1fef728 100644
--- a/indra/newview/llsidepanelappearance.h
+++ b/indra/newview/llsidepanelappearance.h
@@ -59,6 +59,8 @@ class LLSidepanelAppearance : public LLPanel
 
 	void fetchInventory();
 	void inventoryFetched();
+	void updateVerbs();
+
 private:
 	void onFilterEdit(const std::string& search_string);
 
@@ -71,8 +73,6 @@ class LLSidepanelAppearance : public LLPanel
 	void toggleLookInfoPanel(BOOL visible);
 	void toggleWearableEditPanel(BOOL visible, LLWearable* wearable);
 
-	void updateVerbs();
-
 	LLFilterEditor*			mFilterEditor;
 	LLPanelOutfitsInventory* mPanelOutfitsInventory;
 	LLPanelLookInfo*		mLookInfo;
-- 
GitLab


From a2041387b1c39328aaf0d5037ca039a971a6d79c Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Tue, 17 Nov 2009 10:02:01 -0800
Subject: [PATCH 386/557] Fix broken URL highlighting in local chat, broken in
 5068 : ce08ac445035.  Typo, not reviewed.

---
 indra/llui/lltextbase.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index a06b7e237bf..caaf47240fb 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1509,7 +1509,7 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c
 			std::string font_name = LLFontGL::nameFromFont(style_params.font());
 			std::string font_size = LLFontGL::sizeFromFont(style_params.font());
 			link_params.font.name(font_name);
-			link_params.font.size(font_name);
+			link_params.font.size(font_size);
 			link_params.font.style("UNDERLINE");
 			
 			link_params.link_href = match.getUrl();
-- 
GitLab


From 580b2331f5feba6b7ac95c23dddc81cc6743dccf Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Tue, 17 Nov 2009 13:06:30 -0500
Subject: [PATCH 387/557] Added gear menu for outfits panel.

--HG--
branch : avatar-pipeline
---
 .../panel_outfits_inventory_gear_default.xml  | 42 +++++++++++++++++++
 1 file changed, 42 insertions(+)
 create mode 100644 indra/newview/skins/default/xui/en/panel_outfits_inventory_gear_default.xml

diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory_gear_default.xml
new file mode 100644
index 00000000000..c8c79f87615
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory_gear_default.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu
+ bottom="806"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="menu_gear_default"
+ visible="false">
+    <menu_item_call
+     label="New Outfit"
+     layout="topleft"
+     name="new">
+        <on_click
+         function="panel_outfits_inventory_gear_default.Custom.Action"
+         parameter="new" />
+        <on_enable
+		 function="panel_outfits_inventory_gear_default.Enable"
+		 parameter="new" />
+    </menu_item_call>
+    <menu_item_call
+     label="Wear Outfit"
+     layout="topleft"
+     name="wear">
+        <on_click
+         function="panel_outfits_inventory_gear_default.Custom.Action"
+         parameter="wear" />
+        <on_enable
+		 function="panel_outfits_inventory_gear_default.Enable"
+		 parameter="wear" />
+    </menu_item_call>
+    <menu_item_call
+     label="Delete Outfit"
+     layout="topleft"
+     name="delete">
+        <on_click
+         function="panel_outfits_inventory_gear_default.Custom.Action"
+         parameter="delete" />
+        <on_enable
+		 function="panel_outfits_inventory_gear_default.Enable"
+		 parameter="delete" />
+    </menu_item_call>
+</menu>
-- 
GitLab


From aea6aa0c2b878a812e2fc4f4ca56c48099543f82 Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Tue, 17 Nov 2009 20:09:39 +0200
Subject: [PATCH 388/557] Fixed minor bug EXT-2507 (Implement some text for
 empty Picks tab in avatar's Profile ).

--HG--
branch : product-engine
---
 indra/newview/llpanelpicks.cpp                     |  2 ++
 indra/newview/skins/default/xui/en/panel_picks.xml | 13 ++++++++++++-
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 04b4226f82f..10b90b08d76 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -230,6 +230,8 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
 			updateButtons();
 		}
 	}
+	if(!mPicksList->size() && !mClassifiedsList->size())
+		childSetVisible("empty_picks_panel_text", true);
 }
 
 LLPickItem* LLPanelPicks::getSelectedPickItem()
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index 9cfbed432ae..962dad33633 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -14,7 +14,18 @@
  <string
   name="no_classifieds"
   value="No Classifieds" />
-     
+ <text
+  type="string"
+  follows="all"
+  height="535"
+  layout="topleft"
+  left="6"
+  name="empty_picks_panel_text"
+  top="10"
+  visible="false" 
+  width="313">
+   There are no any picks/classifieds here
+ </text>
  <accordion
   follows="all"
   height="465"
-- 
GitLab


From 66979d26bb5c93bbf2470f5c0a4d5e794fdd64f6 Mon Sep 17 00:00:00 2001
From: Ramzi Linden <ramzi@lindenlab.com>
Date: Wed, 18 Nov 2009 02:15:38 +0800
Subject: [PATCH 389/557] L10N: linguistic improvements to some tooltips in
 floater_tools.xml

---
 indra/newview/skins/default/xui/en/floater_tools.xml | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index b2f46bc4339..bfbfe7de7ca 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -269,6 +269,7 @@
    halign="left"
    left="13"
    name="RenderingCost"
+   tool_tip="Shows the rendering cost calculated for this object"
    top_pad="9"
    type="string"
    width="100">
@@ -306,6 +307,7 @@
      layout="topleft"
      follows="left|top"
      name="combobox grid mode"
+     tool_tip="Choose the type of grid ruler for positioning the object"
      width="108">
         <combo_box.item
          label="World grid"
@@ -329,7 +331,7 @@
      image_unselected="ForwardArrow_Off"
      layout="topleft"
      name="Options..."
-     tool_tip="Grid options"
+     tool_tip="See more grid options"
      top_delta="0"
      right="-10"
      width="18"
@@ -786,7 +788,7 @@
             </panel.string>
             <panel.string
              name="text modify warning">
-                This object has linked parts
+                You must select entire object to set permissions
             </panel.string>
             <panel.string
              name="Cost Default">
@@ -1074,7 +1076,7 @@ even though the user gets a free copy.
              follows="left|top|right"
              layout="topleft"
              name="perm_modify"
-             width="250">
+             width="264">
                 You can modify this object
             </text>
             <text
-- 
GitLab


From 7edbb53b91ecf590632bac2f28aadda8a02a8a13 Mon Sep 17 00:00:00 2001
From: Ramzi Linden <ramzi@lindenlab.com>
Date: Wed, 18 Nov 2009 02:33:08 +0800
Subject: [PATCH 390/557] L10N: use consistent wording in strings.xml for
 Away/NotAway and Busy/NotBusy

---
 indra/newview/skins/default/xui/en/strings.xml | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 761c17cfd28..a5272d18839 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -1747,10 +1747,10 @@ Clears (deletes) the media and all params from the given face.
   </string>
 
   <!-- Avatar busy/away mode -->
-	<string name="AvatarSetNotAway">Set Not Away</string>
-	<string name="AvatarSetAway">Set Away</string>
-	<string name="AvatarSetNotBusy">Set Not Busy</string>
-	<string name="AvatarSetBusy">Set Busy</string>
+	<string name="AvatarSetNotAway">Not Away</string>
+	<string name="AvatarSetAway">Away</string>
+	<string name="AvatarSetNotBusy">Not Busy</string>
+	<string name="AvatarSetBusy">Busy</string>
 	
 	<!-- Wearable Types -->
 	<string name="shape">Shape</string>
-- 
GitLab


From 4a2ed8f6f7885454f66ea5bfc014ce0b78234f76 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Tue, 17 Nov 2009 10:34:41 -0800
Subject: [PATCH 391/557] Removed unused legacy pie menu sounds to speed up
 startup and save memory.

---
 indra/newview/app_settings/settings.xml | 110 ------------------------
 indra/newview/llvieweraudio.cpp         |  10 ---
 2 files changed, 120 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 94a2ca16f43..74ae8db0c7a 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -9645,116 +9645,6 @@
       <key>Value</key>
       <string>00000000-0000-0000-0000-000000000000</string>
     </map>
-    <key>UISndPieMenuAppear</key>
-    <map>
-      <key>Comment</key>
-      <string>Sound file for opening pie menu (uuid for sound asset)</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>String</string>
-      <key>Value</key>
-      <string>8eaed61f-92ff-6485-de83-4dcc938a478e</string>
-    </map>
-    <key>UISndPieMenuHide</key>
-    <map>
-      <key>Comment</key>
-      <string>Sound file for closing pie menu (uuid for sound asset)</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>String</string>
-      <key>Value</key>
-      <string>00000000-0000-0000-0000-000000000000</string>
-    </map>
-    <key>UISndPieMenuSliceHighlight0</key>
-    <map>
-      <key>Comment</key>
-      <string>Sound file for selecting pie menu item 0 (uuid for sound asset)</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>String</string>
-      <key>Value</key>
-      <string>d9f73cf8-17b4-6f7a-1565-7951226c305d</string>
-    </map>
-    <key>UISndPieMenuSliceHighlight1</key>
-    <map>
-      <key>Comment</key>
-      <string>Sound file for selecting pie menu item 1 (uuid for sound asset)</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>String</string>
-      <key>Value</key>
-      <string>f6ba9816-dcaf-f755-7b67-51b31b6233e5</string>
-    </map>
-    <key>UISndPieMenuSliceHighlight2</key>
-    <map>
-      <key>Comment</key>
-      <string>Sound file for selecting pie menu item 2 (uuid for sound asset)</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>String</string>
-      <key>Value</key>
-      <string>7aff2265-d05b-8b72-63c7-dbf96dc2f21f</string>
-    </map>
-    <key>UISndPieMenuSliceHighlight3</key>
-    <map>
-      <key>Comment</key>
-      <string>Sound file for selecting pie menu item 3 (uuid for sound asset)</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>String</string>
-      <key>Value</key>
-      <string>09b2184e-8601-44e2-afbb-ce37434b8ba1</string>
-    </map>
-    <key>UISndPieMenuSliceHighlight4</key>
-    <map>
-      <key>Comment</key>
-      <string>Sound file for selecting pie menu item 4 (uuid for sound asset)</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>String</string>
-      <key>Value</key>
-      <string>bbe4c7fc-7044-b05e-7b89-36924a67593c</string>
-    </map>
-    <key>UISndPieMenuSliceHighlight5</key>
-    <map>
-      <key>Comment</key>
-      <string>Sound file for selecting pie menu item 5 (uuid for sound asset)</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>String</string>
-      <key>Value</key>
-      <string>d166039b-b4f5-c2ec-4911-c85c727b016c</string>
-    </map>
-    <key>UISndPieMenuSliceHighlight6</key>
-    <map>
-      <key>Comment</key>
-      <string>Sound file for selecting pie menu item 6 (uuid for sound asset)</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>String</string>
-      <key>Value</key>
-      <string>242af82b-43c2-9a3b-e108-3b0c7e384981</string>
-    </map>
-    <key>UISndPieMenuSliceHighlight7</key>
-    <map>
-      <key>Comment</key>
-      <string>Sound file for selecting pie menu item 7 (uuid for sound asset)</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>String</string>
-      <key>Value</key>
-      <string>c1f334fb-a5be-8fe7-22b3-29631c21cf0b</string>
-    </map>
     <key>UISndSnapshot</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index 49506db1738..7bdcb07c006 100644
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -86,16 +86,6 @@ void init_audio()
 		gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectDelete")));
 		gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezIn")));
 		gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezOut")));
-		gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuAppear")));
-		gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuHide")));
-		gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight0")));
-		gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight1")));
-		gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight2")));
-		gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight3")));
-		gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight4")));
-		gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight5")));
-		gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight6")));
-		gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight7")));
 		gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndSnapshot")));
 		//gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartAutopilot")));
 		//gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartFollowpilot")));
-- 
GitLab


From 72022279535dd0ff0938e2dbbf44b6dfd6560af3 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Tue, 17 Nov 2009 13:43:12 -0500
Subject: [PATCH 392/557] Removed function that was only used for debugging. 
 Defer object suicide until end of the method

--HG--
branch : avatar-pipeline
---
 indra/newview/llappearancemgr.cpp | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index a23d21f84bc..09efda6aca4 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -95,7 +95,7 @@ class LLOutfitObserver : public LLInventoryFetchObserver
 		mCopyItems(copy_items),
 		mAppend(append)
 	{}
-	~LLOutfitObserver();
+	~LLOutfitObserver() {}
 	virtual void done();
 	void doWearCategory();
 
@@ -105,12 +105,6 @@ class LLOutfitObserver : public LLInventoryFetchObserver
 	bool mAppend;
 };
 
-LLOutfitObserver::~LLOutfitObserver()
-{
-	llinfos << "~LLOutfitObserver" << llendl;
-}
-
-// BAP is LLOutfitObserver getting deleted here?
 void LLOutfitObserver::done()
 {
 	gInventory.removeObserver(this);
@@ -236,7 +230,6 @@ void LLOutfitFetch::done()
 	// loop.
 	//dec_busy_count();
 	gInventory.removeObserver(this);
-	delete this;
 
 	// increment busy count and either tell the inventory to check &
 	// call done, or add this object to the inventory for observation.
@@ -255,6 +248,7 @@ void LLOutfitFetch::done()
 		// will call done for us when everything is here.
 		gInventory.addObserver(outfit_observer);
 	}
+	delete this;
 }
 
 class LLUpdateAppearanceOnDestroy: public LLInventoryCallback
-- 
GitLab


From 5d446cdf52f984e1260afc68c54ea4bf219494d3 Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Tue, 17 Nov 2009 20:43:40 +0200
Subject: [PATCH 393/557] Fixed low bug EXT-2501(Hidden Gesture button appears
 after viewer restart)

--HG--
branch : product-engine
---
 indra/newview/llbottomtray.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 3c34aa4fa48..7985ccc2a1d 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -237,7 +237,7 @@ void LLBottomTray::setVisible(BOOL visible)
 			LLView* viewp = *child_it;
 			std::string name = viewp->getName();
 			
-			if ("chat_bar" == name || "movement_panel" == name || "cam_panel" == name || "snapshot_panel" == name)
+			if ("chat_bar" == name || "movement_panel" == name || "cam_panel" == name || "snapshot_panel" == name || "gesture_panel" == name)
 				continue;
 			else 
 			{
-- 
GitLab


From d6bbc652def68b5b8b67ef4049a1250aefdde7cb Mon Sep 17 00:00:00 2001
From: Ramzi Linden <ramzi@lindenlab.com>
Date: Wed, 18 Nov 2009 02:53:44 +0800
Subject: [PATCH 394/557] L10N: fix a typo in a localized label

---
 indra/newview/skins/default/xui/en/panel_preferences_sound.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index d454b9e5c8d..8ef2cdfc37f 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -350,7 +350,7 @@
      border="false"
      follows="top|left"
      height="145"
-     label="DeviceSettings"
+     label="Device Settings"
      layout="topleft"
      left="0"
      name="device_settings_panel"
-- 
GitLab


From a4cc162ca8a83b9f0fa2936f1678c8b71c44a008 Mon Sep 17 00:00:00 2001
From: Andrew Polunin <apolunin@productengine.com>
Date: Tue, 17 Nov 2009 21:26:12 +0200
Subject: [PATCH 395/557] - fixed normal bug EXT-2401 Corrupted Place Profile
 panel is opened after canceling of Pick creation from teleport history panel
 - fixed normal bug EXT-2470 Corrupted Place Profile panel is opened after
 canceling of Pick creation from My Landmarks tab

(NOTE: the same code fixes both)

--HG--
branch : product-engine
---
 indra/newview/llpanelplaces.cpp | 16 ----------------
 1 file changed, 16 deletions(-)

diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index eb10d97b371..84232f20d1a 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -80,7 +80,6 @@ static const std::string TELEPORT_HISTORY_INFO_TYPE	= "teleport_history";
 // Helper functions
 static bool is_agent_in_selected_parcel(LLParcel* parcel);
 static void onSLURLBuilt(std::string& slurl);
-static void setAllChildrenVisible(LLView* view, BOOL visible);
 
 //Observer classes
 class LLPlacesParcelObserver : public LLParcelObserver
@@ -700,8 +699,6 @@ void LLPanelPlaces::onBackButtonClicked()
 
 void LLPanelPlaces::togglePickPanel(BOOL visible)
 {
-	setAllChildrenVisible(this, !visible);
-
 	if (mPickPanel)
 		mPickPanel->setVisible(visible);
 }
@@ -911,16 +908,3 @@ static void onSLURLBuilt(std::string& slurl)
 
 	LLNotifications::instance().add("CopySLURL", args);
 }
-
-static void setAllChildrenVisible(LLView* view, BOOL visible)
-{
-	const LLView::child_list_t* children = view->getChildList();
-	for (LLView::child_list_const_iter_t child_it = children->begin(); child_it != children->end(); ++child_it)
-	{
-		LLView* child = *child_it;
-		if (child->getParent() == view)
-		{
-			child->setVisible(visible);
-		}
-	}
-}
-- 
GitLab


From 91b89383a8e3b3aa5cacf5b8c70b7f195dc84fcf Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Tue, 17 Nov 2009 12:02:44 -0800
Subject: [PATCH 396/557] Only use avatar motion to compute wind noise, makes
 world less desolate on login and when standing still. Reviewed with Kelly

---
 indra/newview/llvieweraudio.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index 7bdcb07c006..e7f904023a6 100644
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -221,9 +221,9 @@ void audio_update_wind(bool force_update)
 			}
 		}
 		// this line rotates the wind vector to be listener (agent) relative
-		// unfortunately we have to pre-translate to undo the translation that
-		// occurs in the transform call
-		gRelativeWindVec = gAgent.getFrameAgent().rotateToLocal(gWindVec - gAgent.getVelocity());
+		// Only use the agent's motion to compute wind noise, otherwise the world
+		// feels desolate on login when you are standing still.
+		gRelativeWindVec = gAgent.getFrameAgent().rotateToLocal( -gAgent.getVelocity() );
 
 		// don't use the setter setMaxWindGain() because we don't
 		// want to screw up the fade-in on startup by setting actual source gain
-- 
GitLab


From 6d6ee6af54cb1c1e1a73ae5697b5d9865e9dac42 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Tue, 17 Nov 2009 12:03:57 -0800
Subject: [PATCH 397/557] EXT-2226 Add "Rotate Mini Map" toggle to mini-map
 context menu Reviewed with Kelly

---
 indra/newview/llfloatermap.cpp                |  4 ++--
 indra/newview/llnetmap.cpp                    | 12 +++++-----
 indra/newview/llnetmap.h                      |  3 ---
 .../skins/default/xui/en/menu_mini_map.xml    | 22 +++++++++----------
 4 files changed, 20 insertions(+), 21 deletions(-)

diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp
index 3fe711a1664..d18f127f851 100644
--- a/indra/newview/llfloatermap.cpp
+++ b/indra/newview/llfloatermap.cpp
@@ -83,7 +83,6 @@ BOOL LLFloaterMap::postBuild()
 {
 	mMap = getChild<LLNetMap>("Net Map");
 	mMap->setScale(gSavedSettings.getF32("MiniMapScale"));
-	mMap->setRotateMap(gSavedSettings.getBOOL( "MiniMapRotate" ));
 	mMap->setToolTipMsg(getString("ToolTipMsg"));	
 	sendChildToBack(mMap);
 	
@@ -178,7 +177,8 @@ void LLFloaterMap::draw()
 {
 	F32 rotation = 0;
 
-	if( mMap->getRotateMap() )
+	static LLUICachedControl<bool> rotate_map("MiniMapRotate", true);
+	if( rotate_map )
 	{
 		// rotate subsequent draws to agent rotation
 		rotation = atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] );
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index 6145588df28..234fe13217f 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -92,7 +92,6 @@ LLNetMap::LLNetMap (const Params & p)
 	mObjectImagep(),
 	mClosestAgentToCursor(),
 	mClosestAgentAtLastRightClick(),
-	mRotateMap(FALSE),
 	mToolTipMsg()
 {
 	mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS);
@@ -175,7 +174,8 @@ void LLNetMap::draw()
 
 		gGL.translatef( (F32) center_sw_left, (F32) center_sw_bottom, 0.f);
 
-		if( mRotateMap )
+		static LLUICachedControl<bool> rotate_map("MiniMapRotate", true);
+		if( rotate_map )
 		{
 			// rotate subsequent draws to agent rotation
 			rotation = atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] );
@@ -408,7 +408,7 @@ void LLNetMap::draw()
 
 		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 
-		if( mRotateMap )
+		if( rotate_map )
 		{
 			gGL.color4fv((map_frustum_color()).mV);
 
@@ -454,7 +454,8 @@ LLVector3 LLNetMap::globalPosToView( const LLVector3d& global_pos )
 	pos_local.mV[VY] *= mPixelsPerMeter;
 	// leave Z component in meters
 
-	if( mRotateMap )
+	static LLUICachedControl<bool> rotate_map("MiniMapRotate", true);
+	if( rotate_map )
 	{
 		F32 radians = atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] );
 		LLQuaternion rot(radians, LLVector3(0.f, 0.f, 1.f));
@@ -502,7 +503,8 @@ LLVector3d LLNetMap::viewPosToGlobal( S32 x, S32 y )
 
 	F32 radians = - atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] );
 
-	if( mRotateMap )
+	static LLUICachedControl<bool> rotate_map("MiniMapRotate", true);
+	if( rotate_map )
 	{
 		LLQuaternion rot(radians, LLVector3(0.f, 0.f, 1.f));
 		pos_local.rotVec( rot );
diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h
index 7088ab3e70c..3d7f3233acb 100644
--- a/indra/newview/llnetmap.h
+++ b/indra/newview/llnetmap.h
@@ -80,9 +80,7 @@ class LLNetMap : public LLUICtrl
 	/*virtual*/ void	reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
 	
 	void			setScale( F32 scale );
-	void			setRotateMap( BOOL b ) { mRotateMap = b; }
 	void			setToolTipMsg(const std::string& msg) { mToolTipMsg = msg; }
-	BOOL			getRotateMap( ) { return mRotateMap; }
 	void			renderScaledPointGlobal( const LLVector3d& pos, const LLColor4U &color, F32 radius );
 	
 private:
@@ -122,7 +120,6 @@ class LLNetMap : public LLUICtrl
 	LLUUID			mClosestAgentToCursor;
 	LLUUID			mClosestAgentAtLastRightClick;
 
-	BOOL			mRotateMap;
 	std::string		mToolTipMsg;
 };
 
diff --git a/indra/newview/skins/default/xui/en/menu_mini_map.xml b/indra/newview/skins/default/xui/en/menu_mini_map.xml
index 5cbbd71bfeb..8d0edf018d4 100644
--- a/indra/newview/skins/default/xui/en/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/en/menu_mini_map.xml
@@ -10,7 +10,6 @@
  width="128">
     <menu_item_call
      label="Zoom Close"
-     layout="topleft"
      name="Zoom Close">
         <menu_item_call.on_click
          function="Minimap.Zoom"
@@ -18,7 +17,6 @@
     </menu_item_call>
     <menu_item_call
      label="Zoom Medium"
-     layout="topleft"
      name="Zoom Medium">
         <menu_item_call.on_click
          function="Minimap.Zoom"
@@ -26,29 +24,31 @@
     </menu_item_call>
     <menu_item_call
      label="Zoom Far"
-     layout="topleft"
      name="Zoom Far">
         <menu_item_call.on_click
          function="Minimap.Zoom"
          parameter="far" />
     </menu_item_call>
-    <menu_item_separator
-     layout="topleft"
-     name="Tracking Separator" />
+    <menu_item_check
+       label="Rotate Map"
+       name="Rotate Map">
+          <menu_item_check.on_check
+             control="MiniMapRotate" />
+          <menu_item_check.on_click
+             function="ToggleControl"
+             parameter="MiniMapRotate" />
+    </menu_item_check>
+    <menu_item_separator />
     <menu_item_call
      label="Stop Tracking"
-     layout="topleft"
      name="Stop Tracking">
         <menu_item_call.on_click
          function="Minimap.Tracker"
          parameter="task_properties" />
     </menu_item_call>
-    <menu_item_separator
-     layout="topleft"
-     name="Tracking Separator" />
+    <menu_item_separator />
     <menu_item_call
      label="World Map"
-     layout="topleft"
      name="World Map">
         <menu_item_call.on_click
          function="ShowFloater"
-- 
GitLab


From c76ab6c4b7384e34a4f32f2fa820b46f6373cdc3 Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Tue, 17 Nov 2009 22:17:34 +0200
Subject: [PATCH 398/557] Fixed normal bug EXT-2108 (Home panel isn't resized).

--HG--
branch : product-engine
---
 .../xui/en/panel_sidetray_home_tab.xml        | 20 +++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
index 566fc95230b..98390758629 100644
--- a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
+++ b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
@@ -7,6 +7,24 @@
  layout="topleft"
  name="home_tab"
  width="333">
+  <scroll_container
+   color="DkGray"
+   follows="all"
+   layout="topleft"
+   left="0"
+   name="profile_scroll"
+   opaque="true"
+   height="560"
+   width="333"
+   top="0">
+  <panel
+   background_visible="true"
+   height="560"
+   layout="topleft"
+   name="profile_scroll_panel"
+   top="0"
+   left="0"
+   width="311">
     <panel
      background_visible="true"
      bg_alpha_color="DkGray2"
@@ -242,4 +260,6 @@
             Browse your inventory.
         </text>
     </panel>
+  </panel>
+  </scroll_container>
 </panel>
-- 
GitLab


From 04c92ee97d0da923159eac3619aa892c9832aeee Mon Sep 17 00:00:00 2001
From: Lis Pardi <lis@lindenlab.com>
Date: Tue, 17 Nov 2009 15:34:54 -0500
Subject: [PATCH 399/557] ext-2473 Zoom has two + buttons and no -

---
 indra/newview/skins/default/textures/textures.xml | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 8af65b25e98..1e47701e350 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -106,7 +106,6 @@
   <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
   <texture name="DropDown_Selected" file_name="widgets/DropDown_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
   <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
-  <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
 
   <texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" />
 
@@ -231,6 +230,10 @@
   <texture name="Microphone_Mute" file_name="icons/Microphone_Mute.png" preload="false" />
   <texture name="Microphone_On" file_name="icons/Microphone_On.png" preload="false" />
 
+  <texture name="MinusItem_Disabled" file_name="icons/MinusItem_Disabled.png" preload="false" />
+  <texture name="MinusItem_Off" file_name="icons/MinusItem_Off.png" preload="false" />
+  <texture name="MinusItem_Press" file_name="icons/MinusItem_Press.png" preload="false" />
+
   <texture name="menu_separator" file_name="navbar/FileMenu_Divider.png" scale.left="4" scale.top="166" scale.right="0" scale.bottom="0" />
 
   <texture name="Move_Fly_Disabled" file_name="bottomtray/Move_Fly_Disabled.png" preload="false" />
-- 
GitLab


From 6e15f2fd6fbc49f85ea0168d2cedae5b0f395af1 Mon Sep 17 00:00:00 2001
From: Lis Pardi <lis@lindenlab.com>
Date: Tue, 17 Nov 2009 15:36:33 -0500
Subject: [PATCH 400/557] ext-2473 zoom has two + buttons and no -

---
 indra/newview/skins/default/xui/en/floater_camera.xml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index f553184c19a..69f9f6a2f87 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -87,9 +87,9 @@
            <button
               follows="top|left"
               height="18"
-              image_disabled="AddItem_Disabled"
-              image_selected="AddItem_Press"
-              image_unselected="AddItem_Off"
+              image_disabled="MinusItem_Disabled"
+              image_selected="MinusItem_Press"
+              image_unselected="MinusItem_Off"
               layout="topleft"
               name="zoom_minus_btn"
               top_pad="0"
-- 
GitLab


From 6474dbd46920fe704625a44cc2b8c56bfdca4990 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Tue, 17 Nov 2009 16:07:29 -0500
Subject: [PATCH 401/557] For DEV-34652: OUTFITS (Operations) : Wear folders
 via drag and drop - handle untyped folder dragged to outfit

--HG--
branch : avatar-pipeline
---
 indra/newview/llappearancemgr.cpp   | 2 +-
 indra/newview/llappearancemgr.h     | 8 +++++---
 indra/newview/llinventorybridge.cpp | 8 ++++++++
 3 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 09efda6aca4..48f11a7cf5d 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -465,7 +465,7 @@ void LLAppearanceManager::filterWearableItems(
 // Create links to all listed items.
 void LLAppearanceManager::linkAll(const LLUUID& category,
 								  LLInventoryModel::item_array_t& items,
-											   LLPointer<LLInventoryCallback> cb)
+								  LLPointer<LLInventoryCallback> cb)
 {
 	for (S32 i=0; i<items.count(); i++)
 	{
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index f39fbd7b1a9..12ffa336b45 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -82,6 +82,11 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 	void setAttachmentInvLinkEnable(bool val);
 	void linkRegisteredAttachments();
 
+	// utility function for bulk linking.
+	void linkAll(const LLUUID& category,
+				 LLInventoryModel::item_array_t& items,
+				 LLPointer<LLInventoryCallback> cb);
+
 protected:
 	LLAppearanceManager();
 	~LLAppearanceManager();
@@ -89,9 +94,6 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 private:
 
 	void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type);
-	void linkAll(const LLUUID& category,
-						LLInventoryModel::item_array_t& items,
-						LLPointer<LLInventoryCallback> cb);
 	
 	void getDescendentsOfAssetType(const LLUUID& category, 
 										  LLInventoryModel::item_array_t& items,
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index aa38b19c5e9..8b7a84a3d33 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -1680,6 +1680,14 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
 						BOOL append = true;
 						LLAppearanceManager::instance().wearInventoryCategory(inv_cat, false, append);
 					}
+					else
+					{
+						// Recursively create links in target outfit.
+						LLInventoryModel::cat_array_t cats;
+						LLInventoryModel::item_array_t items;
+						gInventory.collectDescendents(inv_cat->getUUID(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
+						LLAppearanceManager::instance().linkAll(mUUID,items,NULL);
+					}
 				}
 				else
 				{
-- 
GitLab


From 8c99b37ac0480addcf14cb8643cba85bebe822ad Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Tue, 17 Nov 2009 16:22:12 -0500
Subject: [PATCH 402/557] EXT-2535 wearables saved in 2.0 don't load in 1.23

Incrementing wearable version number was a bad thing here - we want to
keep all wearables reporting as version 22 until we make a breaking change.
Reverted the version number and put in a hack to force any version 24 wearables
to be re-saved as version 22. The hack can be removed before release, as it
should only affect internal testers.

Code reviewed by Seraph

--HG--
branch : avatar-pipeline
---
 indra/newview/character/avatar_lad.xml |  2 +-
 indra/newview/llwearable.cpp           | 20 +++++++++++++++++++-
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index 10c197d09eb..d7182dfaab2 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
 <linden_avatar
- version="1.0" wearable_definition_version="24"> 
+ version="1.0" wearable_definition_version="22"> 
   <!-- The wearable_definition_version is checked during asset upload. -->
   <!-- If you increment it, check indra/lib/python/indra/assetutil.py.  -->
   <skeleton
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index e37dffd5269..2849cfa20ed 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -225,7 +225,13 @@ BOOL LLWearable::importFile( LLFILE* file )
 		return FALSE;
 	}
 
-	if( mDefinitionVersion > LLWearable::sCurrentDefinitionVersion )
+
+	// Temoprary hack to allow wearables with definition version 24 to still load.
+	// This should only affect lindens and NDA'd testers who have saved wearables in 2.0
+	// the extra check for version == 24 can be removed before release, once internal testers
+	// have loaded these wearables again. See hack pt 2 at bottom of function to ensure that
+	// these wearables get re-saved with version definition 22.
+	if( mDefinitionVersion > LLWearable::sCurrentDefinitionVersion && mDefinitionVersion != 24 )
 	{
 		llwarns << "Wearable asset has newer version (" << mDefinitionVersion << ") than XML (" << LLWearable::sCurrentDefinitionVersion << ")" << llendl;
 		return FALSE;
@@ -414,6 +420,18 @@ BOOL LLWearable::importFile( LLFILE* file )
 	// copy all saved param values to working params
 	revertValues();
 
+	// Hack pt 2. If the wearable we just loaded has definition version 24,
+	// then force a re-save of this wearable after slamming the version number to 22.
+	// This number was incorrectly incremented for internal builds before release, and
+	// this fix will ensure that the affected wearables are re-saved with the right version number.
+	// the versions themselves are compatible. This code can be removed before release.
+	if( mDefinitionVersion == 24 )
+	{
+		mDefinitionVersion = 22;
+		U32 index = gAgentWearables.getWearableIndex(this);
+		gAgentWearables.saveWearable(mType,index,TRUE);
+	}
+
 	return TRUE;
 }
 
-- 
GitLab


From 630bb056413133d0e6ea58d00e148119d4fc5e3f Mon Sep 17 00:00:00 2001
From: Lis Pardi <lis@lindenlab.com>
Date: Tue, 17 Nov 2009 16:28:04 -0500
Subject: [PATCH 403/557] ext-2473 Zoom has two + buttons and no -

---
 .../default/textures/icons/MinusItem_Disabled.png | Bin 0 -> 173 bytes
 .../default/textures/icons/MinusItem_Off.png      | Bin 0 -> 178 bytes
 .../default/textures/icons/MinusItem_Press.png    | Bin 0 -> 172 bytes
 3 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 indra/newview/skins/default/textures/icons/MinusItem_Disabled.png
 create mode 100644 indra/newview/skins/default/textures/icons/MinusItem_Off.png
 create mode 100644 indra/newview/skins/default/textures/icons/MinusItem_Press.png

diff --git a/indra/newview/skins/default/textures/icons/MinusItem_Disabled.png b/indra/newview/skins/default/textures/icons/MinusItem_Disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..75bd73cef1a3a49574463ab5aab0f705ce02228a
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}oCO|{#S9GG
z!XV7ZFl&wkP%y~T#WBR<bn>77|LvJg8HAaq9(Z8f!8%((Sy?&G_r{^A3%dXP|9{@W
zr{%)6Y#tsSE|xt%8#J1MV)_ON8;^D9DootVJo&hq*$!cq#~I6(&Ua+!@RHG7@ymk|
PXgY(ZtDnm{r-UW|%WgO2

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/MinusItem_Off.png b/indra/newview/skins/default/textures/icons/MinusItem_Off.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f285f35462906c83fd74f5177f995f5ba7fda2c
GIT binary patch
literal 178
zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}oCO|{#S9GG
z!XV7ZFl&wkP%zxn#WBR<bn>77|LvJg8HAaqGQ8zYN=ZpcNJ&w-rQnv6=yHM~r;4NM
z?f?J(d5*YnTs_1w{kjy#i)@GQYRY`+_tg_7DBa!LCg^<Q2wVB7G?~VkWe0ee7_5G%
V@h;_l-VU^a!PC{xWt~$(697L#H<ADV

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icons/MinusItem_Press.png b/indra/newview/skins/default/textures/icons/MinusItem_Press.png
new file mode 100644
index 0000000000000000000000000000000000000000..50f65765d5f705920468233ed5bd85e683600cff
GIT binary patch
literal 172
zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}oCO|{#S9GG
z!XV7ZFl&wkP%zNb#WBR<^wY_XTn7v|Sms`8fBt-Sb=HOEgAU&{EOx9`I;r&~V&b`G
z2Ifl&dwP@_t_w#^PMO&{C3VYYv!;C;Z`Ev;+!FoU=lRul`*P}jY{^}~>A6)^;2V2e
Q6VPx5Pgg&ebxsLQ0ACY4KmY&$

literal 0
HcmV?d00001

-- 
GitLab


From 315276a309d887b583c117b5bcb998016aed5977 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Tue, 17 Nov 2009 17:30:27 -0500
Subject: [PATCH 404/557] Trivial .xml change to remove no-longer-used xui
 panel argument ("hide_top_panel").

---
 indra/newview/skins/default/xui/en/floater_inventory.xml | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml
index b48c962413f..dca1692e4a2 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory.xml
@@ -30,13 +30,12 @@
      name="Fetched">
         Fetched
     </floater.string>
-<panel
+    <panel
      bottom="560"
 	 class="panel_main_inventory"
 	 filename="panel_main_inventory.xml"
 	 follows="all"
 	 layout="topleft"
-	 hide_top_panel="true"
 	 left="0"
 	 label="Inventory Panel"
 	 name="Inventory Panel"
-- 
GitLab


From 889456e8924738936a9ee51a55d54d29ddd88bee Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Tue, 17 Nov 2009 17:32:20 -0500
Subject: [PATCH 405/557] Server compile fix.

Changed FT_CATEGORY -> FT_ROOT_INVENTORY
Removed AT_ROOT_CATEGORY

This parallels llasset cleanup work done on viewer-side for removing the unused AT_ROOT_CATEGORY type, and for making it more clear that a folder of type FT_CATEGORY (now FT_ROOT_INVENTORY) is your "My Inventory" folder.
---
 indra/newview/llinventorymodel.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 38a417f1a28..84588fbe8ca 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -1199,7 +1199,7 @@ void LLInventoryModel::mock(const LLUUID& root_id)
 		root_id,
 		LLUUID::null,
 		LLAssetType::AT_CATEGORY,
-		LLFolderType::lookupNewCategoryName(LLFolderType::FT_ROOT_CATEGORY),
+		LLFolderType::lookupNewCategoryName(LLFolderType::FT_ROOT_INVENTORY),
 		gAgent.getID());
 	addCategory(cat);
 	gInventory.buildParentChildMap();
-- 
GitLab


From 34a267fddf8c7cd95b82af1eef9eb5cc21bf0571 Mon Sep 17 00:00:00 2001
From: Lis Pardi <lis@lindenlab.com>
Date: Tue, 17 Nov 2009 17:58:48 -0500
Subject: [PATCH 406/557] ext-2557 Buttons should not be bolded. Changed lots
 of SansSerifBold and SansSerifSmallBold to SansSerif and SansSerifSmall

---
 .../skins/default/xui/en/floater_land_holdings.xml   |  4 ++--
 indra/newview/skins/default/xui/en/panel_picks.xml   |  8 ++++----
 .../skins/default/xui/en/sidepanel_inventory.xml     | 10 +++++-----
 .../skins/default/xui/en/sidepanel_item_info.xml     |  6 +++---
 .../skins/default/xui/en/sidepanel_task_info.xml     | 12 ++++++------
 5 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_land_holdings.xml b/indra/newview/skins/default/xui/en/floater_land_holdings.xml
index 2c04a946131..e3751f2bd99 100644
--- a/indra/newview/skins/default/xui/en/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/en/floater_land_holdings.xml
@@ -42,7 +42,7 @@
     </scroll_list>
     <button
      height="23"
-     font="SansSerifBold"
+     font="SansSerif"
      label="Teleport"
      label_selected="Teleport"
      layout="topleft"
@@ -53,7 +53,7 @@
      width="80" />
     <button
      height="23"
-     font="SansSerifBold"
+     font="SansSerif"
      label="Map"
      label_selected="Map"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index 9cfbed432ae..79cda98cc6b 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -120,7 +120,7 @@
        <button
          enabled="false"
          follows="bottom|left"
-         font="SansSerifSmallBold"
+         font="SansSerifSmall"
          height="25"
          label="Info"
          layout="topleft"
@@ -132,7 +132,7 @@
         <button
          enabled="false"
          follows="bottom|left"
-         font="SansSerifSmallBold"
+         font="SansSerifSmall"
          height="25"
          label="Teleport"
          layout="topleft"
@@ -144,7 +144,7 @@
         <button
          enabled="false"
          follows="bottom|left"
-         font="SansSerifSmallBold"
+         font="SansSerifSmall"
          height="25"
          label="Map"
          layout="topleft"
@@ -156,7 +156,7 @@
         <button
          enabled="false"
          follows="bottom|right"
-         font="SansSerifSmallBold"
+         font="SansSerifSmall"
          height="25"
          label="â–¼"
          layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
index cbcc3f10ad2..377d34cdcc0 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -41,7 +41,7 @@
 			<button
 				 enabled="true"
 				 follows="bottom|left"
-				 font="SansSerifSmallBold"
+				 font="SansSerifSmall"
 				 height="25"
 				 label="Info"
 				 layout="topleft"
@@ -52,7 +52,7 @@
 			<button
 				 enabled="true"
 				 follows="bottom|left"
-				 font="SansSerifSmallBold"
+				 font="SansSerifSmall"
 				 height="25"
 				 label="Share"
 				 layout="topleft"
@@ -63,7 +63,7 @@
 			<button
 				 enabled="false"
 				 follows="bottom|left"
-				 font="SansSerifSmallBold"
+				 font="SansSerifSmall"
 				 height="25"
 				 label="Wear"
 				 layout="topleft"
@@ -74,7 +74,7 @@
 			<button
 				 enabled="false"
 				 follows="bottom|left"
-				 font="SansSerifSmallBold"
+				 font="SansSerifSmall"
 				 height="25"
 				 label="Play"
 				 layout="topleft"
@@ -85,7 +85,7 @@
 			<button
 				 enabled="false"
 				 follows="bottom|left"
-				 font="SansSerifSmallBold"
+				 font="SansSerifSmall"
 				 height="25"
 				 label="Teleport"
 				 layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index 39cd75074e5..0c605650fc9 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -479,7 +479,7 @@
 		 width="313">
 	    <button
 		     follows="bottom|left"
-		     font="SansSerifSmallBold"
+		     font="SansSerifSmall"
 		     height="25"
 		     label="Edit"
 		     layout="topleft"
@@ -489,7 +489,7 @@
 		     width="50" />
 	    <button
 		     follows="bottom|right"
-		     font="SansSerifSmallBold"
+		     font="SansSerifSmall"
 		     height="25"
 		     label="Cancel"
 		     layout="topleft"
@@ -499,7 +499,7 @@
 		     width="70" />
 	    <button
 		     follows="bottom|right"
-		     font="SansSerifSmallBold"
+		     font="SansSerifSmall"
 		     height="25"
 		     label="Save"
 		     layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
index 8eb22541126..7647be78306 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
@@ -485,7 +485,7 @@
 		 width="313">
 	    <button
 		     follows="bottom|left"
-		     font="SansSerifSmallBold"
+		     font="SansSerifSmall"
 		     height="25"
 		     label="Edit"
 		     layout="topleft"
@@ -495,7 +495,7 @@
 		     width="50" />
 	    <button
 		     follows="bottom|left"
-		     font="SansSerifSmallBold"
+		     font="SansSerifSmall"
 		     height="25"
 		     label="Open"
 		     layout="topleft"
@@ -505,7 +505,7 @@
 		     width="60" />
 	    <button
 		     follows="bottom|left"
-		     font="SansSerifSmallBold"
+		     font="SansSerifSmall"
 		     height="25"
 		     label="Pay"
 		     layout="topleft"
@@ -515,7 +515,7 @@
 		     width="50" />
 	    <button
 		     follows="bottom|left"
-		     font="SansSerifSmallBold"
+		     font="SansSerifSmall"
 		     height="25"
 		     label="Buy"
 		     layout="topleft"
@@ -525,7 +525,7 @@
 		     width="60" />
 	    <button
 		     follows="bottom|right"
-		     font="SansSerifSmallBold"
+		     font="SansSerifSmall"
 		     height="25"
 		     label="Cancel"
 		     layout="topleft"
@@ -535,7 +535,7 @@
 		     width="70" />
 	    <button
 		     follows="bottom|right"
-		     font="SansSerifSmallBold"
+		     font="SansSerifSmall"
 		     height="25"
 		     label="Save"
 		     layout="topleft"
-- 
GitLab


From 9a30cde27b0b93eb5024b1dd558d1da282fee2fd Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Tue, 17 Nov 2009 18:55:01 -0500
Subject: [PATCH 407/557] EXT-2580 : Regression: Links are no longer PERM_NONE

For some reason, we started using the baseobj's permissions instead of the link's permissions at some point.  Reverting it back to using the link's permissions.
---
 indra/newview/llviewerinventory.cpp | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 1d62ead8437..089535dfab4 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -1215,11 +1215,6 @@ void LLViewerInventoryItem::rename(const std::string& n)
 
 const LLPermissions& LLViewerInventoryItem::getPermissions() const
 {
-	if (const LLViewerInventoryItem *linked_item = getLinkedItem())
-	{
-		return linked_item->getPermissions();
-	}
-
 	// Use the actual permissions of the symlink, not its parent.
 	return LLInventoryItem::getPermissions();	
 }
-- 
GitLab


From e6caf96b0a60dbbc75958ea4a74529601c51541f Mon Sep 17 00:00:00 2001
From: "Eric M. Tulla (BigPapi)" <tulla@lindenlab.com>
Date: Tue, 17 Nov 2009 19:03:30 -0500
Subject: [PATCH 408/557] post viewer2 merge compile fix (minor)

--HG--
branch : avatar-pipeline
---
 indra/newview/llsidepanelappearance.cpp | 9 +--------
 1 file changed, 1 insertion(+), 8 deletions(-)

diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index c30997fbdc3..aeab3e28761 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -234,16 +234,9 @@ void LLSidepanelAppearance::toggleLookInfoPanel(BOOL visible)
 	mNewLookBtn->setVisible(!visible);
 	mOverflowBtn->setVisible(!visible);
 	mCurrLookPanel->setVisible(!visible);
-
-	if (visible)
-	{
-		LLRect rect = getRect();
-		LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom);
-		mLookInfo->reshape(new_rect.getWidth(),new_rect.getHeight());
-	}
 }
 
-void LLPanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *wearable)
+void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *wearable)
 {
 	if (!wearable)
 	{
-- 
GitLab


From 15cbc0abd89d97ab06ed8f0c2a4bb2245e75535c Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Tue, 17 Nov 2009 16:07:48 -0800
Subject: [PATCH 409/557] EXT-2403 Object name, description now forced to be
 ASCII characters only Also fixes EXT-172, EXT-2399.  Semantics now are:
 Object name, object desc, parcel name, region name, inventory item name all
 are ASCII only. Parcel desc allows arbitrary Unicode chars. Group names force
 ASCII only. Reviewed with Leyla

---
 indra/llui/lllineeditor.cpp                   | 27 ++++++++++++++-----
 indra/llui/lllineeditor.h                     |  4 +--
 indra/newview/llfloatergodtools.cpp           |  2 +-
 indra/newview/llfloaterland.cpp               |  7 ++---
 indra/newview/llfloaternamedesc.cpp           |  4 +--
 indra/newview/llfloaterproperties.cpp         |  4 +--
 indra/newview/llfolderview.cpp                |  2 +-
 indra/newview/llpanelgroupgeneral.cpp         |  1 +
 indra/newview/llpanellogin.cpp                |  4 +--
 indra/newview/llpanelpermissions.cpp          |  4 +--
 indra/newview/llpreviewanim.cpp               |  2 +-
 indra/newview/llpreviewgesture.cpp            |  2 +-
 indra/newview/llpreviewnotecard.cpp           |  2 +-
 indra/newview/llpreviewscript.cpp             |  2 +-
 indra/newview/llpreviewsound.cpp              |  2 +-
 indra/newview/llpreviewtexture.cpp            |  2 +-
 indra/newview/llsidepaneliteminfo.cpp         |  4 +--
 indra/newview/llsidepaneltaskinfo.cpp         |  4 +--
 .../xui/en/floater_test_line_editor.xml       | 13 ++++++++-
 .../skins/default/xui/en/floater_tools.xml    |  8 ------
 20 files changed, 59 insertions(+), 41 deletions(-)

diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index 75905d09274..c2f91ff7e01 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -84,8 +84,8 @@ void LLLineEditor::PrevalidateNamedFuncs::declareValues()
 	declare("non_negative_s32", LLLineEditor::prevalidateNonNegativeS32);
 	declare("alpha_num", LLLineEditor::prevalidateAlphaNum);
 	declare("alpha_num_space", LLLineEditor::prevalidateAlphaNumSpace);
-	declare("printable_not_pipe", LLLineEditor::prevalidatePrintableNotPipe);
-	declare("printable_no_space", LLLineEditor::prevalidatePrintableNoSpace);
+	declare("ascii_printable_no_pipe", LLLineEditor::prevalidateASCIIPrintableNoPipe);
+	declare("ascii_printable_no_space", LLLineEditor::prevalidateASCIIPrintableNoSpace);
 }
 
 LLLineEditor::Params::Params()
@@ -2186,20 +2186,28 @@ BOOL LLLineEditor::prevalidateAlphaNumSpace(const LLWString &str)
 	return rv;
 }
 
+// Used for most names of things stored on the server, due to old file-formats
+// that used the pipe (|) for multiline text storage.  Examples include
+// inventory item names, parcel names, object names, etc.
 // static
-BOOL LLLineEditor::prevalidatePrintableNotPipe(const LLWString &str)
+BOOL LLLineEditor::prevalidateASCIIPrintableNoPipe(const LLWString &str)
 {
 	BOOL rv = TRUE;
 	S32 len = str.length();
 	if(len == 0) return rv;
 	while(len--)
 	{
-		if('|' == str[len])
+		llwchar wc = str[len];
+		if (wc < 0x20
+			|| wc > 0x7f
+			|| wc == '|')
 		{
 			rv = FALSE;
 			break;
 		}
-		if(!((' ' == str[len]) || LLStringOps::isAlnum((char)str[len]) || LLStringOps::isPunct((char)str[len])))
+		if(!(wc == ' '
+			 || LLStringOps::isAlnum((char)wc)
+			 || LLStringOps::isPunct((char)wc) ) )
 		{
 			rv = FALSE;
 			break;
@@ -2209,15 +2217,19 @@ BOOL LLLineEditor::prevalidatePrintableNotPipe(const LLWString &str)
 }
 
 
+// Used for avatar names
 // static
-BOOL LLLineEditor::prevalidatePrintableNoSpace(const LLWString &str)
+BOOL LLLineEditor::prevalidateASCIIPrintableNoSpace(const LLWString &str)
 {
 	BOOL rv = TRUE;
 	S32 len = str.length();
 	if(len == 0) return rv;
 	while(len--)
 	{
-		if(LLStringOps::isSpace(str[len]))
+		llwchar wc = str[len];
+		if (wc < 0x20
+			|| wc > 0x7f
+			|| LLStringOps::isSpace(wc))
 		{
 			rv = FALSE;
 			break;
@@ -2232,6 +2244,7 @@ BOOL LLLineEditor::prevalidatePrintableNoSpace(const LLWString &str)
 	return rv;
 }
 
+
 // static
 BOOL LLLineEditor::prevalidateASCII(const LLWString &str)
 {
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index d3daa941cfe..4474963b1af 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -235,8 +235,8 @@ class LLLineEditor
 	static BOOL		prevalidateNonNegativeS32(const LLWString &str);
 	static BOOL		prevalidateAlphaNum(const LLWString &str );
 	static BOOL		prevalidateAlphaNumSpace(const LLWString &str );
-	static BOOL		prevalidatePrintableNotPipe(const LLWString &str); 
-	static BOOL		prevalidatePrintableNoSpace(const LLWString &str);
+	static BOOL		prevalidateASCIIPrintableNoPipe(const LLWString &str); 
+	static BOOL		prevalidateASCIIPrintableNoSpace(const LLWString &str);
 	static BOOL		prevalidateASCII(const LLWString &str);
 
 	static BOOL		postvalidateFloat(const std::string &str);
diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp
index 886f5ec9249..cd3432190b7 100644
--- a/indra/newview/llfloatergodtools.cpp
+++ b/indra/newview/llfloatergodtools.cpp
@@ -415,7 +415,7 @@ LLPanelRegionTools::LLPanelRegionTools()
 BOOL LLPanelRegionTools::postBuild()
 {
 	getChild<LLLineEditor>("region name")->setKeystrokeCallback(onChangeSimName, this);
-	childSetPrevalidate("region name", &LLLineEditor::prevalidatePrintableNotPipe);
+	childSetPrevalidate("region name", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
 	childSetPrevalidate("estate", &LLLineEditor::prevalidatePositiveS32);
 	childSetPrevalidate("parentestate", &LLLineEditor::prevalidatePositiveS32);
 	childDisable("parentestate");
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 015a947d917..22d6098d5bc 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -347,13 +347,14 @@ BOOL LLPanelLandGeneral::postBuild()
 {
 	mEditName = getChild<LLLineEditor>("Name");
 	mEditName->setCommitCallback(onCommitAny, this);	
-	childSetPrevalidate("Name", LLLineEditor::prevalidatePrintableNotPipe);
+	childSetPrevalidate("Name", LLLineEditor::prevalidateASCIIPrintableNoPipe);
 
 	mEditDesc = getChild<LLTextEditor>("Description");
 	mEditDesc->setCommitOnFocusLost(TRUE);
 	mEditDesc->setCommitCallback(onCommitAny, this);	
-	childSetPrevalidate("Description", LLLineEditor::prevalidatePrintableNotPipe);
-
+	// No prevalidate function - historically the prevalidate function was broken,
+	// allowing residents to put in characters like U+2661 WHITE HEART SUIT, so
+	// preserve that ability.
 	
 	mTextSalePending = getChild<LLTextBox>("SalePending");
 	mTextOwnerLabel = getChild<LLTextBox>("Owner:");
diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp
index b7296518d46..810761e034d 100644
--- a/indra/newview/llfloaternamedesc.cpp
+++ b/indra/newview/llfloaternamedesc.cpp
@@ -111,7 +111,7 @@ BOOL LLFloaterNameDesc::postBuild()
 	if (NameEditor)
 	{
 		NameEditor->setMaxTextLength(DB_INV_ITEM_NAME_STR_LEN);
-		NameEditor->setPrevalidate(&LLLineEditor::prevalidatePrintableNotPipe);
+		NameEditor->setPrevalidate(&LLLineEditor::prevalidateASCIIPrintableNoPipe);
 	}
 
 	y -= llfloor(PREVIEW_LINE_HEIGHT * 1.2f);
@@ -123,7 +123,7 @@ BOOL LLFloaterNameDesc::postBuild()
 	if (DescEditor)
 	{
 		DescEditor->setMaxTextLength(DB_INV_ITEM_DESC_STR_LEN);
-		DescEditor->setPrevalidate(&LLLineEditor::prevalidatePrintableNotPipe);
+		DescEditor->setPrevalidate(&LLLineEditor::prevalidateASCIIPrintableNoPipe);
 	}
 
 	y -= llfloor(PREVIEW_LINE_HEIGHT * 1.2f);
diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp
index e0d4a59d9d6..ff9002787ce 100644
--- a/indra/newview/llfloaterproperties.cpp
+++ b/indra/newview/llfloaterproperties.cpp
@@ -130,9 +130,9 @@ BOOL LLFloaterProperties::postBuild()
 {
 	// build the UI
 	// item name & description
-	childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidatePrintableNotPipe);
+	childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
 	getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitName,this));
-	childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidatePrintableNotPipe);
+	childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
 	getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLFloaterProperties:: onCommitDescription, this));
 	// Creator information
 	getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLFloaterProperties::onClickCreator,this));
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 4192c6a5862..955bc64e05d 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -220,7 +220,7 @@ LLFolderView::LLFolderView(const Params& p)
 	params.font(getLabelFontForStyle(LLFontGL::NORMAL));
 	params.max_length_bytes(DB_INV_ITEM_NAME_STR_LEN);
 	params.commit_callback.function(boost::bind(&LLFolderView::commitRename, this, _2));
-	params.prevalidate_callback(&LLLineEditor::prevalidatePrintableNotPipe);
+	params.prevalidate_callback(&LLLineEditor::prevalidateASCIIPrintableNoPipe);
 	params.commit_on_focus_lost(true);
 	params.visible(false);
 	mRenamer = LLUICtrlFactory::create<LLLineEditor> (params);
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index 1c2875bf467..a1d54367c98 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -213,6 +213,7 @@ void LLPanelGroupGeneral::setupCtrls(LLPanel* panel_group)
 	}
 	mFounderName = panel_group->getChild<LLNameBox>("founder_name");
 	mGroupNameEditor = panel_group->getChild<LLLineEditor>("group_name_editor");
+	mGroupNameEditor->setPrevalidate( LLLineEditor::prevalidateASCII );
 }
 
 // static
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index b3e14eb2fb8..78f3469f0e7 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -210,8 +210,8 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
 	}
 
 #if !USE_VIEWER_AUTH
-	childSetPrevalidate("first_name_edit", LLLineEditor::prevalidatePrintableNoSpace);
-	childSetPrevalidate("last_name_edit", LLLineEditor::prevalidatePrintableNoSpace);
+	childSetPrevalidate("first_name_edit", LLLineEditor::prevalidateASCIIPrintableNoSpace);
+	childSetPrevalidate("last_name_edit", LLLineEditor::prevalidateASCIIPrintableNoSpace);
 
 	childSetCommitCallback("password_edit", mungePassword, this);
 	getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this);
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 1051326e72e..0dc010e2e74 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -80,9 +80,9 @@ LLPanelPermissions::LLPanelPermissions() :
 BOOL LLPanelPermissions::postBuild()
 {
 	childSetCommitCallback("Object Name",LLPanelPermissions::onCommitName,this);
-	childSetPrevalidate("Object Name",LLLineEditor::prevalidatePrintableNotPipe);
+	childSetPrevalidate("Object Name",LLLineEditor::prevalidateASCIIPrintableNoPipe);
 	childSetCommitCallback("Object Description",LLPanelPermissions::onCommitDesc,this);
-	childSetPrevalidate("Object Description",LLLineEditor::prevalidatePrintableNotPipe);
+	childSetPrevalidate("Object Description",LLLineEditor::prevalidateASCIIPrintableNoPipe);
 
 	
 	getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLPanelPermissions::onClickGroup,this));
diff --git a/indra/newview/llpreviewanim.cpp b/indra/newview/llpreviewanim.cpp
index 604faf8eb4b..92bd4dc62b1 100644
--- a/indra/newview/llpreviewanim.cpp
+++ b/indra/newview/llpreviewanim.cpp
@@ -79,7 +79,7 @@ BOOL LLPreviewAnim::postBuild()
 	childSetAction("Anim audition btn",auditionAnim, this);
 
 	childSetCommitCallback("desc", LLPreview::onText, this);
-	childSetPrevalidate("desc", &LLLineEditor::prevalidatePrintableNotPipe);
+	childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
 	
 	return LLPreview::postBuild();
 }
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index 7b3a20d1020..49a2a3723d2 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -493,7 +493,7 @@ BOOL LLPreviewGesture::postBuild()
 	{
 		childSetCommitCallback("desc", LLPreview::onText, this);
 		childSetText("desc", item->getDescription());
-		childSetPrevalidate("desc", &LLLineEditor::prevalidatePrintableNotPipe);
+		childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
 	}
 
 	return LLPreview::postBuild();
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index ab9cfbf8506..ce81077d802 100644
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -96,7 +96,7 @@ BOOL LLPreviewNotecard::postBuild()
 	childSetCommitCallback("desc", LLPreview::onText, this);
 	if (item)
 		childSetText("desc", item->getDescription());
-	childSetPrevalidate("desc", &LLLineEditor::prevalidatePrintableNotPipe);
+	childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
 
 	return LLPreview::postBuild();
 }
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 2382befcfa7..4e4711f8fbd 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -956,7 +956,7 @@ BOOL LLPreviewLSL::postBuild()
 
 	childSetCommitCallback("desc", LLPreview::onText, this);
 	childSetText("desc", item->getDescription());
-	childSetPrevalidate("desc", &LLLineEditor::prevalidatePrintableNotPipe);
+	childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
 
 	return LLPreview::postBuild();
 }
diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp
index 7659c50ed31..d7fd252fb67 100644
--- a/indra/newview/llpreviewsound.cpp
+++ b/indra/newview/llpreviewsound.cpp
@@ -75,7 +75,7 @@ BOOL	LLPreviewSound::postBuild()
 	button->setSoundFlags(LLView::SILENT);
 
 	childSetCommitCallback("desc", LLPreview::onText, this);
-	childSetPrevalidate("desc", &LLLineEditor::prevalidatePrintableNotPipe);	
+	childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);	
 
 	return LLPreview::postBuild();
 }
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 13d02b7dec0..41cf402d6f4 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -152,7 +152,7 @@ BOOL LLPreviewTexture::postBuild()
 		{
 			childSetCommitCallback("desc", LLPreview::onText, this);
 			childSetText("desc", item->getDescription());
-			childSetPrevalidate("desc", &LLLineEditor::prevalidatePrintableNotPipe);
+			childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
 		}
 	}
 	
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index a3efea7b7e2..ff6e2d7363c 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -111,9 +111,9 @@ BOOL LLSidepanelItemInfo::postBuild()
 
 	// build the UI
 	// item name & description
-	childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidatePrintableNotPipe);
+	childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
 	//getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this));
-	childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidatePrintableNotPipe);
+	childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
 	//getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this));
 
 	// Creator information
diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp
index 01c832d7d56..4396cce5451 100644
--- a/indra/newview/llsidepaneltaskinfo.cpp
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -100,8 +100,8 @@ BOOL LLSidepanelTaskInfo::postBuild()
 	mBuyBtn = getChild<LLButton>("buy_btn");
 	mBuyBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onBuyButtonClicked, this));
 
-	childSetPrevalidate("Object Name",LLLineEditor::prevalidatePrintableNotPipe);
-	childSetPrevalidate("Object Description",LLLineEditor::prevalidatePrintableNotPipe);
+	childSetPrevalidate("Object Name",LLLineEditor::prevalidateASCIIPrintableNoPipe);
+	childSetPrevalidate("Object Description",LLLineEditor::prevalidateASCIIPrintableNoPipe);
 
 //	getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLSidepanelTaskInfo::onClickGroup,this));
 //	childSetAction("button deed",LLSidepanelTaskInfo::onClickDeedToGroup,this);
diff --git a/indra/newview/skins/default/xui/en/floater_test_line_editor.xml b/indra/newview/skins/default/xui/en/floater_test_line_editor.xml
index e017d404c61..0531b52e5a0 100644
--- a/indra/newview/skins/default/xui/en/floater_test_line_editor.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_line_editor.xml
@@ -18,7 +18,18 @@
     Enabled line editor
   </line_editor>
   <line_editor
-    enabled="false"
+   height="20"
+   layout="topleft"
+   left_delta="0"
+   name="ascii_line_editor"
+   prevalidate_callback="ascii"
+   tool_tip="ascii line editor"
+   top_pad="10" 
+   width="200">
+    ASCII only line editor
+  </line_editor>
+  <line_editor
+   enabled="false"
    height="20"
    layout="topleft"
    left_delta="0"
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index b2f46bc4339..944b4cda98e 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -809,11 +809,8 @@
                 Mixed Sale
             </panel.string>
             <text
-             type="string"
-             length="1"
              follows="left|top"
              height="10"
-             layout="topleft"
              left="10"
              name="Name:"
              top="0"
@@ -823,7 +820,6 @@
             <line_editor
              follows="left|top|right"
              height="19"
-             layout="topleft"
              left_pad="0"
              max_length="63"
              name="Object Name"
@@ -831,11 +827,8 @@
              top_delta="0"
              width="170" />
             <text
-             type="string"
-             length="1"
              follows="left|top"
              height="10"
-             layout="topleft"
              left="10"
              name="Description:"
              top_pad="3"
@@ -845,7 +838,6 @@
             <line_editor
              follows="left|top|right"
              height="19"
-             layout="topleft"
              left_pad="0"
              max_length="127"
              name="Object Description"
-- 
GitLab


From 2f4744ae0f88ec4d6162ac7e09d660d0d71196b9 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Tue, 17 Nov 2009 19:37:56 -0500
Subject: [PATCH 410/557] Removed false positive "notification triggered for
 item..." warning.

---
 indra/newview/llinventorypanel.cpp | 8 --------
 1 file changed, 8 deletions(-)

diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 3a8b8bdf9ea..1d09815525a 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -348,14 +348,6 @@ void LLInventoryPanel::modelChanged(U32 mask)
 							view_item->destroyView();
 						}
 					}
-					else
-					{
-						// Hmm, we got an ADD/REMOVE/STRUCTURE notification for this item but there's nothing to be done to it.
-						llwarns << "Notification triggered for item that isn't changing.  "
-								<< "Operation: ( mask: " << mask << " panel name: " << mStartFolderString << " ) "
-								<< "Item: [ Name:" << model_item->getName() << " UUID: " << *id_it << " ]" << llendl;
-						
-					}
 				}
 
 				// This item has been removed from memory, but its associated UI element still exists.
-- 
GitLab


From ceee6c3e5ecfdcb8c310b613e3edb7b094289adf Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Tue, 17 Nov 2009 19:40:43 -0500
Subject: [PATCH 411/557] Header file cleanup.

Removed unnecessary headers from llinventorybridge.cpp.
---
 indra/newview/llinventorybridge.cpp | 64 +++++++----------------------
 1 file changed, 14 insertions(+), 50 deletions(-)

diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index d18f9affe3c..2afe48bc8af 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -31,73 +31,37 @@
  */
 
 #include "llviewerprecompiledheaders.h"
-
-#include <utility> // for std::pair<>
-
-#include "llfloaterinventory.h"
 #include "llinventorybridge.h"
 
-#include "message.h"
-
 #include "llagent.h"
 #include "llagentwearables.h"
-#include "llcallingcard.h"
-#include "llcheckboxctrl.h"		// for radio buttons
-#include "llfloaterreg.h"
-#include "llradiogroup.h"
-#include "llspinctrl.h"
-#include "lltextbox.h"
-#include "llui.h"
-
-#include "llviewercontrol.h"
-#include "llfirstuse.h"
-#include "llfoldertype.h"
-#include "llfloaterchat.h"
+#include "llappearancemgr.h"
+#include "llavataractions.h"
 #include "llfloatercustomize.h"
-#include "llfloaterproperties.h"
+#include "llfloaterinventory.h"
+#include "llfloateropenobject.h"
+#include "llfloaterreg.h"
 #include "llfloaterworldmap.h"
-#include "llfocusmgr.h"
-#include "llfolderview.h"
 #include "llfriendcard.h"
-#include "llavataractions.h"
 #include "llgesturemgr.h"
-#include "lliconctrl.h"
+#include "llimfloater.h"
+#include "llimview.h"
+#include "llinventoryclipboard.h"
 #include "llinventoryfunctions.h"
 #include "llinventorymodel.h"
 #include "llinventorypanel.h"
-#include "llinventoryclipboard.h"
-#include "lllineeditor.h"
-#include "llmenugl.h"
 #include "llpreviewanim.h"
 #include "llpreviewgesture.h"
-#include "llpreviewnotecard.h"
-#include "llpreviewscript.h"
-#include "llpreviewsound.h"
 #include "llpreviewtexture.h"
-#include "llresmgr.h"
-#include "llscrollcontainer.h"
-#include "llimview.h"
-#include "lltooldraganddrop.h"
-#include "llviewerfoldertype.h"
-#include "llviewertexturelist.h"
-#include "llviewerinventory.h"
-#include "llviewerobjectlist.h"
-#include "llviewerwindow.h"
-#include "llvoavatar.h"
-#include "llwearable.h"
-#include "llwearablelist.h"
-#include "llviewerassettype.h"
-#include "llviewermessage.h"
-#include "llviewerregion.h"
-#include "llvoavatarself.h"
-#include "lltabcontainer.h"
-#include "lluictrlfactory.h"
 #include "llselectmgr.h"
 #include "llsidetray.h"
-#include "llfloateropenobject.h"
 #include "lltrans.h"
-#include "llappearancemgr.h"
-#include "llimfloater.h"
+#include "llviewerassettype.h"
+#include "llviewermessage.h"
+#include "llviewerobjectlist.h"
+#include "llviewerwindow.h"
+#include "llvoavatarself.h"
+#include "llwearablelist.h"
 
 using namespace LLOldEvents;
 
-- 
GitLab


From a34c89df8724cc625b7e1383c12df43fc627d772 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Tue, 17 Nov 2009 20:13:31 -0500
Subject: [PATCH 412/557] EXT-1916 : Landmarks are not sorted in the Favorites
 Bar accordion

Sorting was fixed when LLFolderViewFolder was added back into the inventory panels.  This checkin additionally allows sorting in the landmarks inventory panel.
---
 indra/llcommon/llfoldertype.cpp     |  3 +++
 indra/newview/llinventorybridge.cpp | 10 ++++++----
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/indra/llcommon/llfoldertype.cpp b/indra/llcommon/llfoldertype.cpp
index 079e670b1ab..a5dd342be2f 100644
--- a/indra/llcommon/llfoldertype.cpp
+++ b/indra/llcommon/llfoldertype.cpp
@@ -120,6 +120,8 @@ const std::string &LLFolderType::lookup(LLFolderType::EType folder_type)
 // you can't change certain properties such as their type.
 bool LLFolderType::lookupIsProtectedType(EType folder_type)
 {
+	return FALSE;
+	/*
 	const LLFolderDictionary *dict = LLFolderDictionary::getInstance();
 	const FolderEntry *entry = dict->lookup(folder_type);
 	if (entry)
@@ -127,6 +129,7 @@ bool LLFolderType::lookupIsProtectedType(EType folder_type)
 		return entry->mIsProtected;
 	}
 	return true;
+	*/
 }
 
 // static
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 2afe48bc8af..93da313f274 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -2852,9 +2852,11 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
 		}
 
 		const LLUUID& favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
-
+		const LLUUID& landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
+		const BOOL folder_allows_reorder = ((mUUID == landmarks_id) || (mUUID == favorites_id));
+	   
 		// we can move item inside a folder only if this folder is Favorites. See EXT-719
-		accept = is_movable && ((mUUID != inv_item->getParentUUID()) || (mUUID == favorites_id));
+		accept = is_movable && ((mUUID != inv_item->getParentUUID()) || folder_allows_reorder);
 		if(accept && drop)
 		{
 			if (inv_item->getType() == LLAssetType::AT_GESTURE
@@ -2877,12 +2879,12 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
 			}
 
 			// if dragging from/into favorites folder only reorder items
-			if ((mUUID == inv_item->getParentUUID()) && (favorites_id == mUUID))
+			if ((mUUID == inv_item->getParentUUID()) && folder_allows_reorder)
 			{
 				LLInventoryModel::cat_array_t cats;
 				LLInventoryModel::item_array_t items;
 				LLIsType is_type(LLAssetType::AT_LANDMARK);
-				model->collectDescendentsIf(favorites_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type);
+				model->collectDescendentsIf(mUUID, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type);
 
 				LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
 				LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL;
-- 
GitLab


From 70d73152a6c38a2fb174a065b39b7d1625ad0326 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Tue, 17 Nov 2009 21:00:37 -0500
Subject: [PATCH 413/557] Revert accidental checkin that disabled protected
 folder types.

---
 indra/llcommon/llfoldertype.cpp | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/indra/llcommon/llfoldertype.cpp b/indra/llcommon/llfoldertype.cpp
index a5dd342be2f..079e670b1ab 100644
--- a/indra/llcommon/llfoldertype.cpp
+++ b/indra/llcommon/llfoldertype.cpp
@@ -120,8 +120,6 @@ const std::string &LLFolderType::lookup(LLFolderType::EType folder_type)
 // you can't change certain properties such as their type.
 bool LLFolderType::lookupIsProtectedType(EType folder_type)
 {
-	return FALSE;
-	/*
 	const LLFolderDictionary *dict = LLFolderDictionary::getInstance();
 	const FolderEntry *entry = dict->lookup(folder_type);
 	if (entry)
@@ -129,7 +127,6 @@ bool LLFolderType::lookupIsProtectedType(EType folder_type)
 		return entry->mIsProtected;
 	}
 	return true;
-	*/
 }
 
 // static
-- 
GitLab


From 78bb530dab950639db239ec752ab842a91d58aed Mon Sep 17 00:00:00 2001
From: CG Linden <cg@lindenlab.com>
Date: Tue, 17 Nov 2009 18:20:33 -0800
Subject: [PATCH 414/557] Fix llkdu.dll inclusion problem llkdu.dll was
 referenced via "configuration", but sharedlibs prefix already included
 "configuration"

---
 indra/newview/viewer_manifest.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 7e5c30a9789..f2597c8bbbd 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -241,7 +241,7 @@ def construct(self):
             
             # Get kdu dll, continue if missing.
             try:
-                self.path('%s/llkdu.dll' % self.args['configuration'], dst='llkdu.dll')
+                self.path('llkdu.dll', dst='llkdu.dll')
             except RuntimeError:
                 print "Skipping llkdu.dll"
 
-- 
GitLab


From 2d82332479b3a8d8bdd869c14bdef03226e0b74f Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Tue, 17 Nov 2009 21:23:53 -0500
Subject: [PATCH 415/557] Fix for avp->hg incorrect merge.

---
 indra/newview/llfolderviewitem.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index bf74c5c936a..7323c421da5 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -1253,6 +1253,10 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
 			// filter self only on first pass through
 			LLFolderViewItem::filter( filter );
 		}
+		if (mDontShowInHierarchy)
+		{
+			setOpen();
+		}
 	}
 
 	if (getRoot()->getDebugFilters())
-- 
GitLab


From 215b95eb64ebea58d6f2bda5f90e307836aca093 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Wed, 18 Nov 2009 11:35:11 +0200
Subject: [PATCH 416/557] related to EXT-2515 "Docked floaters should be
 resizeable" avoid undock floater when resize initiated not by user

--HG--
branch : product-engine
---
 indra/llui/lldockablefloater.cpp | 10 ----------
 indra/llui/lldockablefloater.h   |  1 -
 indra/llui/llresizehandle.cpp    |  6 ++++++
 3 files changed, 6 insertions(+), 11 deletions(-)

diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp
index 9a2f2ab4d31..9c69e4f2b66 100644
--- a/indra/llui/lldockablefloater.cpp
+++ b/indra/llui/lldockablefloater.cpp
@@ -206,16 +206,6 @@ void LLDockableFloater::draw()
 	LLFloater::draw();
 }
 
-void LLDockableFloater::reshape(S32 width, S32 height, BOOL called_from_parent)
-{
-	if (isDocked())
-	{
-		setDocked(false);
-	}
-
-	LLFloater::reshape(width, height, called_from_parent);
-}
-
 void LLDockableFloater::setDockControl(LLDockControl* dockControl)
 {
 	mDockControl.reset(dockControl);
diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h
index e5f94dca91e..46491d8a29e 100644
--- a/indra/llui/lldockablefloater.h
+++ b/indra/llui/lldockablefloater.h
@@ -65,7 +65,6 @@ class LLDockableFloater : public LLFloater
 	/* virtula */BOOL postBuild();
 	/* virtual */void setDocked(bool docked, bool pop_on_undock = true);
 	/* virtual */void draw();
-	/* virtual */void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
 
 	/**
 	 *  If descendant class overrides setVisible() then it must still invoke its
diff --git a/indra/llui/llresizehandle.cpp b/indra/llui/llresizehandle.cpp
index 7449c339a0d..6239a8f7214 100644
--- a/indra/llui/llresizehandle.cpp
+++ b/indra/llui/llresizehandle.cpp
@@ -135,6 +135,12 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask)
 		LLView* resizing_view = getParent();
 		if( resizing_view )
 		{
+			// undock floater when user resize it
+			if (((LLFloater*)getParent())->isDocked())
+			{
+				((LLFloater*)getParent())->setDocked(false, false);
+			}
+
 			// Resize the parent
 			LLRect orig_rect = resizing_view->getRect();
 			LLRect scaled_rect = orig_rect;
-- 
GitLab


From c22a90669c78bd206593d112d44e9c6cbc1503fb Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Wed, 18 Nov 2009 13:04:17 +0200
Subject: [PATCH 417/557] Work on normal sub-task EXT-2553 (Change Sys well
 icon & Counter according to ALTERNATE design)  - implemented counter next to
 the left from an envelope icon.  - button now has fixed width for 3 digits.

--HG--
branch : product-engine
---
 indra/newview/llchiclet.cpp                   | 26 +++++++------------
 indra/newview/llchiclet.h                     | 11 ++++----
 .../skins/default/xui/en/panel_bottomtray.xml | 17 ++++++------
 3 files changed, 23 insertions(+), 31 deletions(-)

diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 4078fac4ecb..caf6917d90e 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -81,27 +81,17 @@ LLNotificationChiclet::Params::Params()
 	button.tab_stop(FALSE);
 	button.label(LLStringUtil::null);
 
-	unread_notifications.name("unread");
-	unread_notifications.font(LLFontGL::getFontSansSerif());
-	unread_notifications.text_color=(LLColor4::white);
-	unread_notifications.font_halign(LLFontGL::HCENTER);
-	unread_notifications.mouse_opaque(FALSE);
 }
 
 LLNotificationChiclet::LLNotificationChiclet(const Params& p)
 : LLChiclet(p)
 , mButton(NULL)
-, mCounterCtrl(NULL)
+, mCounter(0)
 {
 	LLButton::Params button_params = p.button;
-	button_params.rect(p.rect());
 	mButton = LLUICtrlFactory::create<LLButton>(button_params);
 	addChild(mButton);
 
- 	LLChicletNotificationCounterCtrl::Params unread_params = p.unread_notifications;
-	mCounterCtrl = LLUICtrlFactory::create<LLChicletNotificationCounterCtrl>(unread_params);
-	addChild(mCounterCtrl);
-
 	// connect counter handlers to the signals
 	connectCounterUpdatersToSignal("notify");
 	connectCounterUpdatersToSignal("groupnotify");
@@ -126,13 +116,15 @@ void LLNotificationChiclet::connectCounterUpdatersToSignal(std::string notificat
 
 void LLNotificationChiclet::setCounter(S32 counter)
 {
-	mCounterCtrl->setCounter(counter);
-}
+	std::string s_count;
+	if(counter != 0)
+	{
+		s_count = llformat("%d", counter);
+	}
 
-void LLNotificationChiclet::setShowCounter(bool show)
-{
-	LLChiclet::setShowCounter(show);
-	mCounterCtrl->setVisible(getShowCounter());
+	mButton->setLabel(s_count);
+
+	mCounter = counter;
 }
 
 boost::signals2::connection LLNotificationChiclet::setClickCallback(
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index eab4a282f52..bb5dc1e5500 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -638,13 +638,14 @@ class LLNotificationChiclet : public LLChiclet
 
 	/*virtual*/ void setCounter(S32 counter);
 
-	/*virtual*/S32 getCounter() { return mCounterCtrl->getCounter(); }
-
-	/*virtual*/ void setShowCounter(bool show);
+	// *TODO: mantipov: seems getCounter is not necessary for LLNotificationChiclet
+	// but inherited interface requires it to implement. 
+	// Probably it can be safe removed.
+	/*virtual*/S32 getCounter() { return mCounter; }
 
 	boost::signals2::connection setClickCallback(const commit_callback_t& cb);
 
-	/*virtual*/ ~ LLNotificationChiclet();
+	/*virtual*/ ~LLNotificationChiclet();
 
 	// methods for updating a number of unread System notifications
 	void incUreadSystemNotifications() { setCounter(++mUreadSystemNotifications); }
@@ -662,7 +663,7 @@ class LLNotificationChiclet : public LLChiclet
 
 protected:
 	LLButton* mButton;
-	LLChicletNotificationCounterCtrl* mCounterCtrl;
+	S32 mCounter;
 };
 
 /*
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index d2933c0c0ea..00711a29e01 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -299,8 +299,8 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
          min_height="28"
          top="0"
          name="sys_well_panel"
-         width="34"
-         min_width="34"
+         width="54"
+         min_width="54"
          user_resize="false">
             <chiclet_notification
              follows="right"
@@ -309,22 +309,21 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
              left="0"
              name="sys_well"
              top="4"
-             width="34">
+             width="54">
               <button
               auto_resize="true"
                halign="right"
                height="23"
                follows="right"
                flash_color="EmphasisColor"
+               left="0"
                name="Unread"
                image_overlay="Notices_Unread"
-               width="20"
+               image_overlay_alignment="right" 
+               pad_right="6"
+               pad_left="6"
+               width="54"
                />
-               <unread_notifications
-               width="34"
-               height="20"
-               left="0"
-               top="19" />
 	    </chiclet_notification>
         </layout_panel>
        <icon
-- 
GitLab


From 764afa899ee3a4b2f1fa1f32c13a918c2caad9a9 Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Wed, 18 Nov 2009 14:25:58 +0200
Subject: [PATCH 418/557] Fixed major bug EXT-2608 (Crash: Sometimes
 LLNavigationBar is trying to access deleted LLSearchHistory singleton when
 exiting from viewer).

--HG--
branch : product-engine
---
 indra/newview/llnavigationbar.cpp |  1 -
 indra/newview/llsearchhistory.h   | 11 ++++++++++-
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 794d73a5ade..a770fe15fb2 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -186,7 +186,6 @@ LLNavigationBar::LLNavigationBar()
 LLNavigationBar::~LLNavigationBar()
 {
 	mTeleportFinishConnection.disconnect();
-	LLSearchHistory::getInstance()->save();
 }
 
 BOOL LLNavigationBar::postBuild()
diff --git a/indra/newview/llsearchhistory.h b/indra/newview/llsearchhistory.h
index 253ef21e9e1..eb6efdb86f2 100644
--- a/indra/newview/llsearchhistory.h
+++ b/indra/newview/llsearchhistory.h
@@ -34,12 +34,15 @@
 #define LL_LLSEARCHHISTORY_H
 
 #include "llsingleton.h"
+#include "llui.h"
+
 /**
  * Search history container able to save and load history from file.
  * History is stored in chronological order, most recent at the beginning.
  */
-class LLSearchHistory : public LLSingleton<LLSearchHistory>
+class LLSearchHistory : public LLSingleton<LLSearchHistory>, private LLDestroyClass<LLSearchHistory>
 {
+	friend class LLDestroyClass<LLSearchHistory>;
 public:
 
 	// Forward declaration
@@ -130,6 +133,12 @@ class LLSearchHistory : public LLSingleton<LLSearchHistory>
 
 private:
 
+	// Implementation of LLDestroyClass<LLSearchHistory>
+	static void destroyClass()
+	{
+		LLSearchHistory::getInstance()->save();
+	}
+
 	search_history_list_t mSearchHistory;
 };
 
-- 
GitLab


From 753e482b3fd37dd53f9c50f509647cf6c6eaefec Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Wed, 18 Nov 2009 14:51:09 +0200
Subject: [PATCH 419/557] No ticket. Remove unnecessary including of
 "llchiclet.h" in a header file.

--HG--
branch : product-engine
---
 indra/newview/llimview.cpp      | 3 ++-
 indra/newview/llsyswellwindow.h | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index dc32291714b..dd78bb631fd 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -49,6 +49,7 @@
 #include "llbottomtray.h"
 #include "llcallingcard.h"
 #include "llchat.h"
+#include "llchiclet.h"
 #include "llresmgr.h"
 #include "llfloaterchat.h"
 #include "llfloaterchatterbox.h"
@@ -1194,7 +1195,7 @@ BOOL LLIncomingCallDialog::postBuild()
 
 	// check to see if this is an Avaline call
 	LLUUID session_id = mPayload["session_id"].asUUID();
-	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
+	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
 	childSetVisible("Start IM", is_avatar); // no IM for avaline
 
 	LLUICtrl* caller_name_widget = getChild<LLUICtrl>("caller name");
diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h
index cbc5f7358f0..3e4cdbdcbec 100644
--- a/indra/newview/llsyswellwindow.h
+++ b/indra/newview/llsyswellwindow.h
@@ -39,12 +39,13 @@
 #include "llbutton.h"
 #include "llscreenchannel.h"
 #include "llscrollcontainer.h"
-#include "llchiclet.h"
 #include "llimview.h"
 
 #include "boost/shared_ptr.hpp"
 
 class LLFlatListView;
+class LLChiclet;
+class LLIMChiclet;
 
 class LLSysWellWindow : public LLDockableFloater, LLIMSessionObserver
 {
-- 
GitLab


From a35fbddb910fa0dd068622c3dc64af1b27ca19b7 Mon Sep 17 00:00:00 2001
From: angela <angela@lindenlab.com>
Date: Wed, 18 Nov 2009 20:52:53 +0800
Subject: [PATCH 420/557] EXT-2094

---
 indra/llcommon/llclickaction.h                       |  6 ++++--
 indra/lscript/lscript_compile/indra.l                |  1 +
 indra/newview/app_settings/keywords.ini              |  1 +
 indra/newview/lltoolpie.cpp                          | 12 ++++++++++++
 indra/newview/skins/default/xui/en/floater_tools.xml |  4 ++++
 5 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/indra/llcommon/llclickaction.h b/indra/llcommon/llclickaction.h
index 80487245757..29c4df8df24 100644
--- a/indra/llcommon/llclickaction.h
+++ b/indra/llcommon/llclickaction.h
@@ -40,7 +40,9 @@ const U8 CLICK_ACTION_SIT = 1;
 const U8 CLICK_ACTION_BUY = 2;
 const U8 CLICK_ACTION_PAY = 3;
 const U8 CLICK_ACTION_OPEN = 4;
-const U8 CLICK_ACTION_PLAY = 5;
-const U8 CLICK_ACTION_OPEN_MEDIA = 6;
+const U8 CLICK_ACTION_ZOOM = 5;
+const U8 CLICK_ACTION_PLAY = 6;
+const U8 CLICK_ACTION_OPEN_MEDIA = 7;
+
 
 #endif
diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l
index 8c891b3e8ff..e650c71beab 100644
--- a/indra/lscript/lscript_compile/indra.l
+++ b/indra/lscript/lscript_compile/indra.l
@@ -611,6 +611,7 @@ extern "C" { int yyerror(const char *fmt, ...); }
 "CLICK_ACTION_BUY"        { count(); yylval.ival = CLICK_ACTION_BUY; return(INTEGER_CONSTANT); }
 "CLICK_ACTION_PAY"        { count(); yylval.ival = CLICK_ACTION_PAY; return(INTEGER_CONSTANT); }
 "CLICK_ACTION_OPEN"       { count(); yylval.ival = CLICK_ACTION_OPEN; return(INTEGER_CONSTANT); }
+"CLICK_ACTION_ZOOM"       { count(); yylval.ival = CLICK_ACTION_ZOOM; return(INTEGER_CONSTANT); }
 "CLICK_ACTION_PLAY"       { count(); yylval.ival = CLICK_ACTION_PLAY; return(INTEGER_CONSTANT); }
 "CLICK_ACTION_OPEN_MEDIA" { count(); yylval.ival = CLICK_ACTION_OPEN_MEDIA; return(INTEGER_CONSTANT); }
 
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index 5f6fd6e4a73..71ea12bacde 100644
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -508,6 +508,7 @@ CLICK_ACTION_SIT        Used with llSetClickAction to set sit as the default act
 CLICK_ACTION_BUY        Used with llSetClickAction to set buy as the default action when object is clicked
 CLICK_ACTION_PAY        Used with llSetClickAction to set pay as the default action when object is clicked
 CLICK_ACTION_OPEN       Used with llSetClickAction to set open as the default action when object is clicked
+CLICK_ACTION_ZOOM       Used with llSetClickAction to set zoom in as the default action when object is clicked
 CLICK_ACTION_PLAY       Used with llSetClickAction to set play as the default action when object is clicked
 CLICK_ACTION_OPEN_MEDIA Used with llSetClickAction to set open-media as the default action when object is clicked
 
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 9c8fca35528..d0350507ed2 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -209,6 +209,7 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
 			// touch behavior down below...
 			break;
 		case CLICK_ACTION_SIT:
+
 			if ((gAgent.getAvatarObject() != NULL) && (!gAgent.getAvatarObject()->isSitting())) // agent not already sitting
 			{
 				handle_object_sit_or_stand();
@@ -253,6 +254,11 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
 				}
 			}
 			return TRUE;
+		case CLICK_ACTION_ZOOM:
+				gAgent.setFocusOnAvatar(FALSE, FALSE);	
+				gAgent.setFocusGlobal(mPick);
+				gAgent.setCameraZoomFraction(0.9);
+				return TRUE;		
 		case CLICK_ACTION_PLAY:
 			handle_click_action_play();
 			return TRUE;
@@ -413,6 +419,9 @@ ECursorType cursor_from_object(LLViewerObject* object)
 			cursor = UI_CURSOR_HAND;
 		}
 		break;
+	case CLICK_ACTION_ZOOM:
+			cursor = UI_CURSOR_TOOLZOOMIN;
+			break;			
 	case CLICK_ACTION_PLAY:
 	case CLICK_ACTION_OPEN_MEDIA: 
 		cursor = cursor_from_parcel_media(click_action);
@@ -551,6 +560,9 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
 		case CLICK_ACTION_BUY:
 		case CLICK_ACTION_PAY:
 		case CLICK_ACTION_OPEN:
+		case CLICK_ACTION_ZOOM:
+		case CLICK_ACTION_PLAY:
+		case CLICK_ACTION_OPEN_MEDIA:
 			// Because these actions open UI dialogs, we won't change
 			// the cursor again until the next hover and GL pick over
 			// the world.  Keep the cursor an arrow, assuming that 
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 944b4cda98e..59964ef39fb 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -983,6 +983,10 @@
                  label="Open"
                  name="Open"
                  value="Open" />
+				 <combo_box.item
+                 label="Zoom"
+                 name="Zoom"
+                 value="Zoom" />
             </combo_box>
             <check_box
              height="16"
-- 
GitLab


From 2345e40fa5b33faccf330508d848805cf7dca1dc Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Wed, 18 Nov 2009 15:54:40 +0200
Subject: [PATCH 421/557] Fixed minor bug EXT-2545 (TP History: focused item
 highlight overlaps next item in list).

--HG--
branch : product-engine
---
 .../skins/default/xui/en/panel_teleport_history_item.xml      | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
index 4ab6175805a..3384852f272 100644
--- a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
@@ -18,7 +18,7 @@
      visible="false"
      width="380" />
     <icon
-     height="24"
+     height="20"
      follows="top|right|left"
      image_name="ListItem_Select"
      layout="topleft"
@@ -55,7 +55,7 @@
      left_pad="5"
      right="-3"
      name="profile_btn"
-     top_delta="-2"
+     top="1"
      visible="false"
      width="20" />
 </panel>
-- 
GitLab


From fce52249abdba7a865f03c88692a45e8ff972763 Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Wed, 18 Nov 2009 16:04:41 +0200
Subject: [PATCH 422/557] Particial fix for normal bug EXT-2410- Accepting an
 Offered Notecard Should Open the Side Bar Inventory Tab. Added select command
 while opening inventory sidetray panel

--HG--
branch : product-engine
---
 indra/newview/llsidepanelinventory.cpp | 11 ++++++++---
 indra/newview/llsidepanelinventory.h   |  1 +
 indra/newview/llviewermessage.cpp      |  5 +++++
 3 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index 6aa5c53194f..58962b67d66 100644
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -46,7 +46,8 @@ static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_
 
 LLSidepanelInventory::LLSidepanelInventory()
 	:	LLPanel(),
-		mItemPanel(NULL)
+		mItemPanel(NULL),
+		mPanelMainInventory(NULL)
 {
 
 	//LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
@@ -80,8 +81,8 @@ BOOL LLSidepanelInventory::postBuild()
 		mOverflowBtn = mInventoryPanel->getChild<LLButton>("overflow_btn");
 		mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this));
 		
-		LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
-		panel_main_inventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2));
+		mPanelMainInventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
+		mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2));
 	}
 
 	// UI elements from item panel
@@ -127,6 +128,10 @@ void LLSidepanelInventory::onOpen(const LLSD& key)
 			mTaskPanel->setObjectSelection(LLSelectMgr::getInstance()->getSelection());
 		showTaskInfoPanel();
 	}
+	if (key.has("select"))
+	{
+		mPanelMainInventory->getPanel()->setSelection(key["select"].asUUID(), TAKE_FOCUS_NO);
+	}
 }
 
 void LLSidepanelInventory::onInfoButtonClicked()
diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h
index 681af7fafab..9eba77b5c3f 100644
--- a/indra/newview/llsidepanelinventory.h
+++ b/indra/newview/llsidepanelinventory.h
@@ -68,6 +68,7 @@ class LLSidepanelInventory : public LLPanel
 	LLPanel*					mInventoryPanel; // Main inventory view
 	LLSidepanelItemInfo*		mItemPanel; // Individual item view
 	LLSidepanelTaskInfo*		mTaskPanel; // Individual in-world object view
+	LLPanelMainInventory*		mPanelMainInventory;
 
 protected:
 	void 						onInfoButtonClicked();
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index ef6a621323b..11b2f07f1bd 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -939,6 +939,11 @@ void open_offer(const std::vector<LLUUID>& items, const std::string& from_name)
 		   !from_name.empty())
 		{
 			view = LLFloaterInventory::showAgentInventory();
+			//TODO:this should be moved to the end of method after all the checks,
+			//but first decide what to do with active inventory if any (EK)
+			LLSD key;
+			key["select"] = item->getUUID();
+			LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
 		}
 		else
 		{
-- 
GitLab


From 0688ae8c51d1c6d79ed30bb10ad049fd5ce790ef Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Wed, 18 Nov 2009 17:10:51 +0200
Subject: [PATCH 423/557] No ticket. Remove unnecessary including of
 "llbottomtray.h"

--HG--
branch : product-engine
---
 indra/newview/llchannelmanager.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp
index 3443d8b593a..aa584b3ae82 100644
--- a/indra/newview/llchannelmanager.cpp
+++ b/indra/newview/llchannelmanager.cpp
@@ -37,7 +37,6 @@
 #include "llappviewer.h"
 #include "llviewercontrol.h"
 #include "llimview.h"
-#include "llbottomtray.h"
 #include "llviewerwindow.h"
 #include "llrootview.h"
 #include "llsyswellwindow.h"
-- 
GitLab


From b3cb61a26a0e4c7bfc3c18fd2705325a795684b8 Mon Sep 17 00:00:00 2001
From: Eugene Kondrashev <ekondrashev@productengine.com>
Date: Wed, 18 Nov 2009 17:57:47 +0200
Subject: [PATCH 424/557] Fixed major bug EXT-2532-IM timestamp is when message
 is viewed, not when it was sent and received. Time str from the arriving
 message used now instead of constructing it dynamicly.

--HG--
branch : product-engine
---
 indra/llcommon/llchat.h         |  2 ++
 indra/newview/llchathistory.cpp | 19 ++-----------------
 indra/newview/llimfloater.cpp   |  1 +
 3 files changed, 5 insertions(+), 17 deletions(-)

diff --git a/indra/llcommon/llchat.h b/indra/llcommon/llchat.h
index acd0da61a4b..5af79910068 100644
--- a/indra/llcommon/llchat.h
+++ b/indra/llcommon/llchat.h
@@ -84,6 +84,7 @@ class LLChat
 		mAudible(CHAT_AUDIBLE_FULLY),
 		mMuted(FALSE),
 		mTime(0.0),
+		mTimeStr(),
 		mPosAgent(),
 		mURL(),
 		mChatStyle(CHAT_STYLE_NORMAL)
@@ -97,6 +98,7 @@ class LLChat
 	EChatAudible	mAudible;
 	BOOL			mMuted;		// pass muted chat to maintain list of chatters
 	F64				mTime;		// viewer only, seconds from viewer start
+	std::string		mTimeStr;
 	LLVector3		mPosAgent;
 	std::string		mURL;
 	EChatStyle		mChatStyle;
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index cd5c5edac0c..4ce3b50ed58 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -50,21 +50,6 @@
 
 static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history");
 
-std::string formatCurrentTime()
-{
-	time_t utc_time;
-	utc_time = time_corrected();
-	std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
-		+LLTrans::getString("TimeMin")+"]";
-
-	LLSD substitution;
-
-	substitution["datetime"] = (S32) utc_time;
-	LLStringUtil::format (timeStr, substitution);
-
-	return timeStr;
-}
-
 class LLChatHistoryHeader: public LLPanel
 {
 public:
@@ -219,7 +204,7 @@ class LLChatHistoryHeader: public LLPanel
 
 		
 		LLTextBox* timeBox = getChild<LLTextBox>("time_box");
-		timeBox->setValue(formatCurrentTime());
+		timeBox->setValue(chat.mTimeStr);
 
 		LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
 
@@ -352,7 +337,7 @@ LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style
 void LLChatHistory::appendWidgetMessage(const LLChat& chat, const LLStyle::Params& input_append_params)
 {
 	LLView* view = NULL;
-	std::string view_text = "\n[" + formatCurrentTime() + "] ";
+	std::string view_text = "\n[" + chat.mTimeStr + "] ";
 	if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM)
 		view_text += chat.mFromName + ": ";
 
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index c2c83191e00..bfac35d866f 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -474,6 +474,7 @@ void LLIMFloater::updateMessages()
 			chat.mFromID = from_id;
 			chat.mFromName = from;
 			chat.mText = message;
+			chat.mTimeStr = time;
 			
 			//Handle IRC styled /me messages.
 			std::string prefix = message.substr(0, 4);
-- 
GitLab


From 40041fc2af7d711f8b0adfc2a6b6fdb07c708c37 Mon Sep 17 00:00:00 2001
From: Vadim Savchuk <vsavchuk@productengine.com>
Date: Wed, 18 Nov 2009 18:03:48 +0200
Subject: [PATCH 425/557] Fixed normal priority bug EXT-2606 (Stand/Stop Flying
 btn disappear if movement floater looses focus).

--HG--
branch : product-engine
---
 indra/newview/llmoveview.cpp | 40 ++++++++++++++++++++++--------------
 indra/newview/llmoveview.h   |  3 ++-
 2 files changed, 27 insertions(+), 16 deletions(-)

diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp
index 0ee883e221a..93db3370531 100644
--- a/indra/newview/llmoveview.cpp
+++ b/indra/newview/llmoveview.cpp
@@ -83,11 +83,6 @@ LLFloaterMove::LLFloaterMove(const LLSD& key)
 {
 }
 
-LLFloaterMove::~LLFloaterMove()
-{
-	LLPanelStandStopFlying::getInstance()->reparent(NULL);
-}
-
 // virtual
 BOOL LLFloaterMove::postBuild()
 {
@@ -161,6 +156,31 @@ void LLFloaterMove::setEnabled(BOOL enabled)
 	showModeButtons(enabled);
 }
 
+// *NOTE: we assume that setVisible() is called on floater close.
+// virtual
+void LLFloaterMove::setVisible(BOOL visible)
+{
+	// Ignore excessive calls of this method (from LLTransientFloaterMgr?).
+	if (getVisible() == visible)
+		return;
+
+	if (visible)
+	{
+		// Attach the Stand/Stop Flying panel.
+		LLPanelStandStopFlying* ssf_panel = LLPanelStandStopFlying::getInstance();
+		ssf_panel->reparent(this);
+		const LLRect& mode_actions_rect = mModeActionsPanel->getRect();
+		ssf_panel->setOrigin(mode_actions_rect.mLeft, mode_actions_rect.mBottom);
+	}
+	else
+	{
+		// Detach the Stand/Stop Flying panel.
+		LLPanelStandStopFlying::getInstance()->reparent(NULL);
+	}
+
+	LLTransientDockableFloater::setVisible(visible);
+}
+
 // static 
 F32 LLFloaterMove::getYawRate( F32 time )
 {
@@ -429,16 +449,6 @@ void LLFloaterMove::showModeButtons(BOOL bShow)
 	if (NULL == mModeActionsPanel || mModeActionsPanel->getVisible() == bShow)
 		return;
 	mModeActionsPanel->setVisible(bShow);
-
-	if (bShow)
-		LLPanelStandStopFlying::getInstance()->reparent(NULL);
-	else
-	{
-		LLPanelStandStopFlying* ssf_panel = LLPanelStandStopFlying::getInstance();
-		ssf_panel->reparent(this);
-		const LLRect& mode_actions_rect = mModeActionsPanel->getRect();
-		ssf_panel->setOrigin(mode_actions_rect.mLeft, mode_actions_rect.mBottom);
-	}
 }
 
 //static
diff --git a/indra/newview/llmoveview.h b/indra/newview/llmoveview.h
index 2664fe6e401..06463f02af2 100644
--- a/indra/newview/llmoveview.h
+++ b/indra/newview/llmoveview.h
@@ -51,11 +51,12 @@ class LLFloaterMove
 
 private:
 	LLFloaterMove(const LLSD& key);
-	~LLFloaterMove();
+	~LLFloaterMove() {}
 public:
 
 	/*virtual*/	BOOL	postBuild();
 	/*virtual*/ void	setEnabled(BOOL enabled);
+	/*virtual*/ void	setVisible(BOOL visible);
 	static F32	getYawRate(F32 time);
 	static void setFlyingMode(BOOL fly);
 	void setFlyingModeImpl(BOOL fly);
-- 
GitLab


From 4dc294e6dc6a88201ccb2dce76eab25ca936e062 Mon Sep 17 00:00:00 2001
From: Dmitry Oleshko <doleshko@productengine.com>
Date: Wed, 18 Nov 2009 18:36:10 +0200
Subject: [PATCH 426/557] fixed low bug  (EXT-2552) Building of notification
 toast's panel produces a creation of dummy icon

removed commented code from XML file
removed from toast notify panel Icon member and a corresponding code

--HG--
branch : product-engine
---
 indra/newview/lltoastnotifypanel.cpp          | 22 -------------------
 indra/newview/lltoastnotifypanel.h            |  1 -
 .../default/xui/en/panel_notification.xml     | 11 ----------
 3 files changed, 34 deletions(-)

diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index 48b68e4292f..699424ef361 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -48,7 +48,6 @@ const LLFontGL* LLToastNotifyPanel::sFontSmall = NULL;
 LLToastNotifyPanel::LLToastNotifyPanel(LLNotificationPtr& notification) : 
 LLToastPanel(notification),
 mTextBox(NULL),
-mIcon(NULL),
 mInfoPanel(NULL),
 mControlPanel(NULL),
 mNumOptions(0),
@@ -58,7 +57,6 @@ mAddedDefaultBtn(false)
 	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_notification.xml");
 	mInfoPanel = getChild<LLPanel>("info_panel");
 	mControlPanel = getChild<LLPanel>("control_panel");
-	mIcon = getChild<LLIconCtrl>("info_icon");
 
 	// customize panel's attributes
 	// is it intended for displaying a tip
@@ -94,26 +92,6 @@ mAddedDefaultBtn(false)
 	// preliminary adjust panel's layout
 	mIsTip ? adjustPanelForTipNotice() : adjustPanelForScriptNotice(form);
 
-	// choose a right icon
-	if (mIsTip)
-	{
-		// use the tip notification icon
-		mIcon->setValue("notify_tip_icon.tga");
-		LLRect icon_rect = mIcon->getRect();
-		icon_rect.setLeftTopAndSize(icon_rect.mLeft, getRect().getHeight() - VPAD, icon_rect.getWidth(), icon_rect.getHeight());
-		mIcon->setRect(icon_rect);
-	}
-	else if (mIsCaution)
-	{
-		// use the caution notification icon
-		mIcon->setValue("notify_caution_icon.tga");
-	}
-	else
-	{
-		// use the default notification icon
-		mIcon->setValue("notify_box_icon.tga");
-	}
-
 	// adjust text options according to the notification type
 	// add a caution textbox at the top of a caution notification
 	if (mIsCaution && !mIsTip)
diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h
index 66534edcdf8..eea70705ec1 100644
--- a/indra/newview/lltoastnotifypanel.h
+++ b/indra/newview/lltoastnotifypanel.h
@@ -73,7 +73,6 @@ class LLToastNotifyPanel: public LLToastPanel
 
 	// panel elements
 	LLTextBase*		mTextBox;
-	LLIconCtrl*		mIcon;
 	LLPanel*		mInfoPanel;		// a panel, that contains an information
 	LLPanel*		mControlPanel;	// a panel, that contains buttons (if present)
 
diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml
index 462188ee24a..df37f9973ce 100644
--- a/indra/newview/skins/default/xui/en/panel_notification.xml
+++ b/indra/newview/skins/default/xui/en/panel_notification.xml
@@ -90,15 +90,4 @@
     name="control_panel"
     top_pad="0">
   </panel>
-  <!--
-  <icon
-    follows="left|top"
-    height="32"
-    image_name="notify_tip_icon.tga"
-    layout="topleft"
-    left="8"
-    mouse_opaque="false"
-    name="info_icon"
-    top="20"
-    width="32" />  -->
 </panel>
-- 
GitLab


From 30a2cf81e5fb7ac0a21c35e599c8b80e2b3a35e1 Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Wed, 18 Nov 2009 18:59:12 +0200
Subject: [PATCH 427/557] implemented normal task EXT-2519 Share button in IM
 should put 'Drag items from inventory here' in IM window

--HG--
branch : product-engine
---
 indra/newview/llpanelimcontrolpanel.cpp        | 6 ++++++
 indra/newview/llpanelimcontrolpanel.h          | 1 +
 indra/newview/skins/default/xui/en/strings.xml | 3 +++
 3 files changed, 10 insertions(+)

diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index 00502341fcf..5e23662a0bd 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -44,6 +44,7 @@
 #include "llimview.h"
 #include "llvoicechannel.h"
 #include "llsidetray.h"
+#include "lltrans.h"
 
 void LLPanelChatControlPanel::onCallButtonClicked()
 {
@@ -161,6 +162,11 @@ void LLPanelIMControlPanel::onShareButtonClicked()
 {
 	LLSD key;
 	LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
+
+	if (gIMMgr->hasSession(getSessionId()))
+	{
+		LLIMModel::getInstance()->addMessage(getSessionId(), SYSTEM_FROM, LLUUID::null, LLTrans::getString("share_alert"), false);
+	}
 }
 
 void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index 923c5acbd21..7bfc432ef2f 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -58,6 +58,7 @@ class LLPanelChatControlPanel : public LLPanel
 	virtual void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);
 
 	virtual void setSessionId(const LLUUID& session_id);
+	const LLUUID& getSessionId() { return mSessionId; }
 
 private:
 	LLUUID mSessionId;
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index a5272d18839..e76763d7ebc 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2868,6 +2868,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
   <string name="inventory_item_offered-im">
     Inventory item offered
   </string>
+  <string name="share_alert">
+    Drag items from inventory here
+  </string>
 
   <string name="only_user_message">
     You are the only user in this session.
-- 
GitLab


From 49ce27aa68ffb221f5be8118bffd5c98bbdb214d Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Wed, 18 Nov 2009 09:19:02 -0800
Subject: [PATCH 428/557] Fix merge conflict with button fonts, use
 SansSerifSmall (not bold)

---
 indra/newview/skins/default/xui/en/sidepanel_appearance.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index 89cf9e006c0..041297a542f 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -72,7 +72,7 @@
        	 width="80" />
     <button
     	 follows="bottom|left"
-     font="SansSerifSmallBold"
+     font="SansSerifSmall"
   	     height="25"
   	     label="New Outfit"
   	     layout="topleft"
-- 
GitLab


From a27706ad2e42718ad107e25fe7c29f1c0513fabc Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Wed, 18 Nov 2009 19:49:49 +0200
Subject: [PATCH 429/557] Fixed normal bug EXT-2461 "Edit Landmark panel isn't
 resized": - Added vertical scroll appearing for Place Profile and Landmark
 info panels. - Added horizontal reshaping to avoid redundant horizontal
 scroll.

--HG--
branch : product-engine
---
 indra/newview/llpanelplaceinfo.cpp            | 33 ++++++++++++++++++-
 indra/newview/llpanelplaceinfo.h              |  6 ++++
 .../default/xui/en/panel_landmark_info.xml    |  6 ++--
 .../default/xui/en/panel_place_profile.xml    |  6 ++--
 4 files changed, 44 insertions(+), 7 deletions(-)

diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp
index 963d39de8aa..6ba3790fe22 100644
--- a/indra/newview/llpanelplaceinfo.cpp
+++ b/indra/newview/llpanelplaceinfo.cpp
@@ -57,7 +57,11 @@ LLPanelPlaceInfo::LLPanelPlaceInfo()
 :	LLPanel(),
 	mParcelID(),
 	mRequestedID(),
-	mPosRegion()
+	mPosRegion(),
+	mScrollingPanelMinHeight(0),
+	mScrollingPanelWidth(0),
+	mScrollingPanel(NULL),
+	mScrollContainer(NULL)
 {}
 
 //virtual
@@ -83,6 +87,12 @@ BOOL LLPanelPlaceInfo::postBuild()
 	mMaturityRatingIcon = getChild<LLIconCtrl>("maturity_icon");
 	mMaturityRatingText = getChild<LLTextBox>("maturity_value");
 
+	mScrollingPanel = getChild<LLPanel>("scrolling_panel");
+	mScrollContainer = getChild<LLScrollContainer>("place_scroll");
+
+	mScrollingPanelMinHeight = mScrollContainer->getScrolledViewRect().getHeight();
+	mScrollingPanelWidth = mScrollingPanel->getRect().getWidth();
+
 	return TRUE;
 }
 
@@ -230,6 +240,27 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)
 	}
 }
 
+// virtual
+void LLPanelPlaceInfo::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+	LLPanel::reshape(width, height, called_from_parent);
+
+	if (!mScrollContainer || !mScrollingPanel)
+		return;
+
+	static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+
+	S32 scroll_height = mScrollContainer->getRect().getHeight();
+	if (mScrollingPanelMinHeight >= scroll_height)
+	{
+		mScrollingPanel->reshape(mScrollingPanelWidth, mScrollingPanelMinHeight);
+	}
+	else
+	{
+		mScrollingPanel->reshape(mScrollingPanelWidth + scrollbar_size, scroll_height);
+	}
+}
+
 // virtual
 void LLPanelPlaceInfo::handleVisibilityChange(BOOL new_visibility)
 {
diff --git a/indra/newview/llpanelplaceinfo.h b/indra/newview/llpanelplaceinfo.h
index 133933a880d..b9bf92b534c 100644
--- a/indra/newview/llpanelplaceinfo.h
+++ b/indra/newview/llpanelplaceinfo.h
@@ -45,6 +45,7 @@ class LLIconCtrl;
 class LLInventoryItem;
 class LLPanelPickEdit;
 class LLParcel;
+class LLScrollContainer;
 class LLTextBox;
 class LLTextureCtrl;
 class LLViewerRegion;
@@ -92,6 +93,7 @@ class LLPanelPlaceInfo : public LLPanel, LLRemoteParcelInfoObserver
 
 	/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
 
+	/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
 	/*virtual*/ void handleVisibilityChange (BOOL new_visibility);
 
 	// Create a pick for the location specified
@@ -110,8 +112,12 @@ class LLPanelPlaceInfo : public LLPanel, LLRemoteParcelInfoObserver
 	LLUUID					mRequestedID;
 	LLVector3				mPosRegion;
 	std::string				mCurrentTitle;
+	S32						mScrollingPanelMinHeight;
+	S32						mScrollingPanelWidth;
 	INFO_TYPE 				mInfoType;
 
+	LLScrollContainer*		mScrollContainer;
+	LLPanel*				mScrollingPanel;
 	LLTextBox*				mTitle;
 	LLTextureCtrl*			mSnapshotCtrl;
 	LLTextBox*				mRegionName;
diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
index b01ddbf75aa..a219e30b8bc 100644
--- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
@@ -87,8 +87,8 @@
      width="313">
         <panel
          bg_alpha_color="DkGray2"
-         follows="all"
-         height="533"
+         follows="left|top|right"
+         height="610"
          layout="topleft"
          left="0"
          min_height="300"
@@ -145,7 +145,7 @@
              top_pad="10"
              width="18" />
             <text
-             follows="right|top"
+             follows="left|top|right"
              height="16"
              layout="topleft"
              left_pad="8"
diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml
index e6084202d7c..9ab5c6b4f74 100644
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -172,7 +172,7 @@
      width="313">
         <panel
          bg_alpha_color="DkGray2"
-         follows="all"
+         follows="left|top|right"
          height="533"
          layout="topleft"
          left="0"
@@ -192,7 +192,7 @@
             <layout_stack
              border_size="0"
              clip="false"
-             follows="all"
+             follows="left|top|right"
              height="50"
              layout="topleft"
              mouse_opaque="false"
@@ -305,7 +305,7 @@
              top_delta="0"
              width="18" />
             <text
-             follows="right|top"
+             follows="left|top|right"
              height="16"
              layout="topleft"
              left_pad="8"
-- 
GitLab


From 5d7391458116cd3f43c7073edcd2c8b5dcf8e0c3 Mon Sep 17 00:00:00 2001
From: Lis Pardi <lis@lindenlab.com>
Date: Wed, 18 Nov 2009 13:02:08 -0500
Subject: [PATCH 430/557] ext-2629 Arrange order of satus bar to match spec

---
 .../skins/default/xui/en/panel_status_bar.xml | 30 ++++++++++---------
 1 file changed, 16 insertions(+), 14 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 8fc78c67019..b1afe76500d 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -48,38 +48,40 @@
      image_unselected="BuyArrow_Off"
      image_pressed="BuyArrow_Press"
      height="16"
-     left="-245"
+     left="-200"
      name="buycurrency"
-     pad_right="22px"
+     pad_right="20px"
      tool_tip="My Balance: Click to buy more L$"
      top="1"
-     width="117" />
-    <button
-     follows="right|bottom"
-     height="16"
-     image_selected="parcel_drk_VoiceNo"
-     image_unselected="parcel_drk_Voice"
-     is_toggle="true"
-     left_pad="15"
-     top="1"
-     name="volume_btn"
-     width="16" />
+     width="90" />
     <text
      type="string"
      length="1"
+     font="SansSerifSmall"
      text_readonly_color="TimeTextColor"
      follows="right|bottom"
      halign="right"
      height="16"
      top="5"
      layout="topleft"
-     left_pad="7"
+     left_pad="-5"
      name="TimeText"
      text_color="TimeTextColor"
      tool_tip="Current time (Pacific)"
      width="80">
         12:00 AM
     </text>
+    <button
+     follows="right|bottom"
+     height="16"
+     image_selected="parcel_drk_VoiceNo"
+     image_unselected="parcel_drk_Voice"
+     is_toggle="true"
+     left_pad="5"
+     top="1"
+     name="volume_btn"
+     tool_tip="Global Volume Control"
+     width="16" />
     <text
      enabled="true"
      follows="right|bottom"
-- 
GitLab


From b314f9062d78c225f9f17e760fc8ea32f85d4a3d Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Wed, 18 Nov 2009 10:03:40 -0800
Subject: [PATCH 431/557] Nudge parabuild

---
 indra/newview/skins/default/xui/en/floater_aaa.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml
index e4ab533bc59..4bbd5618827 100644
--- a/indra/newview/skins/default/xui/en/floater_aaa.xml
+++ b/indra/newview/skins/default/xui/en/floater_aaa.xml
@@ -5,6 +5,6 @@
  name="floater_aaa"
  can_resize="true" 
  width="1024">
- <string name="Nudge Parabuild">1</string>
+ <string name="Nudge Parabuild">2</string>
   <panel filename="main_view.xml" follows="all" width="1024" height="768" top="0"/>
 </floater>
-- 
GitLab


From d09de2402306c65622c16eba36f698ef9aa3294a Mon Sep 17 00:00:00 2001
From: Lis Pardi <lis@lindenlab.com>
Date: Wed, 18 Nov 2009 13:15:27 -0500
Subject: [PATCH 432/557] ext-2633 Default Upload Permissions floater all
 messed up

---
 .../default/xui/en/floater_perm_prefs.xml     | 30 +++++++++----------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_perm_prefs.xml b/indra/newview/skins/default/xui/en/floater_perm_prefs.xml
index 6faab84159d..4909b8988f9 100644
--- a/indra/newview/skins/default/xui/en/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/en/floater_perm_prefs.xml
@@ -22,10 +22,10 @@
          height="16"
          label="Share with group"
          layout="topleft"
-         left_delta="-250"
+         left="10"
          name="share_with_group"
-         top_delta="2"
-         width="106" />
+         top="5"
+         width="150" />
         <check_box
          control_name="EveryoneCopy"
          height="16"
@@ -33,8 +33,8 @@
          layout="topleft"
          left_delta="0"
          name="everyone_copy"
-         top_pad="16"
-         width="130" />
+         top_pad="5"
+         width="150" />
         <text
          type="string"
          length="1"
@@ -43,8 +43,8 @@
          layout="topleft"
          left_delta="0"
          name="NextOwnerLabel"
-         top_pad="16"
-         width="88">
+         top_pad="5"
+         width="150">
             Next owner can:
         </text>
         <check_box
@@ -54,17 +54,17 @@
          layout="topleft"
          left_delta="0"
          name="next_owner_modify"
-         top_pad="14"
-         width="78" />
+         top_pad="5"
+         width="150" />
         <check_box
          control_name="NextOwnerCopy"
          height="16"
          label="Copy"
          layout="topleft"
-         left_delta="78"
+         left_delta="0"
          name="next_owner_copy"
-         top_delta="0"
-         width="88" >
+         top_pad="5"
+         width="150" >
 		    <check_box.commit_callback
 			function="Perms.Copy" />
 		</check_box>
@@ -76,10 +76,10 @@
          initial_value="true"
          label="Resell/Give away"
          layout="topleft"
-         left_delta="88"
+         left_delta="0"
          name="next_owner_transfer"
-         top_delta="0"
-         width="106" />
+         top_pad="5"
+         width="150" />
     </panel>
     <button
      height="20"
-- 
GitLab


From 1875d5e37ba1591ba9b75014a7618f38427f0d2f Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Wed, 18 Nov 2009 14:48:05 -0500
Subject: [PATCH 433/557] EXT-2539 confirm we're not sending local texture IDs
 in appearance msg

created a throwaway function to temporarily set local texture IDs in the avatar
object to IMG_DEFAULT_AVATAR immediately before sending the TE message, and
restore the IDs when we're done. Will implement a more elegant solution for 2.1.
This is the least risky implementation, though it isn't elegant.

Code reviewed by Seraph
---
 indra/newview/llagent.cpp        |  2 +-
 indra/newview/llvoavatar.cpp     |  2 +-
 indra/newview/llvoavatar.h       |  2 +-
 indra/newview/llvoavatarself.cpp | 43 ++++++++++++++++++++++++++++++++
 indra/newview/llvoavatarself.h   |  1 +
 5 files changed, 47 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 7a540a45c4c..fb2ecb3bede 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -6326,7 +6326,7 @@ void LLAgent::sendAgentSetAppearance()
 			msg->addU8Fast(_PREHASH_TextureIndex, (U8)texture_index);
 		}
 		msg->nextBlockFast(_PREHASH_ObjectData);
-		mAvatarObject->packTEMessage( gMessageSystem );
+		mAvatarObject->sendAppearanceMessage( gMessageSystem );
 	}
 	else
 	{
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index b6c1ee2f117..75e35e52214 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -6267,7 +6267,7 @@ LLColor4 LLVOAvatar::getDummyColor()
 	return DUMMY_COLOR;
 }
 
-void LLVOAvatar::dumpAvatarTEs( const std::string& context )
+void LLVOAvatar::dumpAvatarTEs( const std::string& context ) const
 {	
 	/* const char* te_name[] = {
 			"TEX_HEAD_BODYPAINT   ",
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 2fd1a506a90..4b3e850e7ac 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -889,7 +889,7 @@ class LLVOAvatar :
 	static void			dumpArchetypeXML(void*);
 	static void			dumpBakedStatus();
 	const std::string 	getBakedStatusForPrintout() const;
-	void				dumpAvatarTEs(const std::string& context);
+	void				dumpAvatarTEs(const std::string& context) const;
 
 	static F32 			sUnbakedTime; // Total seconds with >=1 unbaked avatars
 	static F32 			sUnbakedUpdateTime; // Last time stats were updated (to prevent multiple updates per frame) 
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 711e9f90fcc..d9c5e932a26 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -2074,6 +2074,49 @@ void LLVOAvatarSelf::setInvisible(BOOL newvalue)
 	}
 }
 
+// HACK: this will null out the avatar's local texture IDs before the TE message is sent
+//       to ensure local texture IDs are not sent to other clients in the area.
+//       this is a short-term solution. The long term solution will be to not set the texture
+//       IDs in the avatar object, and keep them only in the wearable.
+//       This will involve further refactoring that is too risky for the initial release of 2.0.
+bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const
+{
+	LLUUID texture_id[TEX_NUM_INDICES];
+	// pack away current TEs to make sure we don't send them out
+	for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
+		 iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
+		 ++iter)
+	{
+		const ETextureIndex index = iter->first;
+		const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
+		if (!texture_dict->mIsBakedTexture)
+		{
+			LLTextureEntry* entry = getTE((U8) index);
+			texture_id[index] = entry->getID();
+			entry->setID(IMG_DEFAULT_AVATAR);
+		}
+	}
+
+	bool success = packTEMessage(mesgsys);
+
+	// unpack TEs to make sure we don't re-trigger a bake
+	for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
+		 iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
+		 ++iter)
+	{
+		const ETextureIndex index = iter->first;
+		const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
+		if (!texture_dict->mIsBakedTexture)
+		{
+			LLTextureEntry* entry = getTE((U8) index);
+			entry->setID(texture_id[index]);
+		}
+	}
+
+	return success;
+}
+
+
 //------------------------------------------------------------------------
 // needsRenderBeam()
 //------------------------------------------------------------------------
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index 6702f030feb..a1cad82effa 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -310,6 +310,7 @@ class LLVOAvatarSelf :
 public:
 	static void		onChangeSelfInvisible(BOOL newvalue);
 	void			setInvisible(BOOL newvalue);
+	bool			sendAppearanceMessage(LLMessageSystem *mesgsys) const;
 
 /**                    Appearance
  **                                                                            **
-- 
GitLab


From 5dea0791f7087f2ce2bbe2bdce49d62f1a6f1f92 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 18 Nov 2009 14:51:14 -0500
Subject: [PATCH 434/557] EXT-2581 : Old items still display as "(worn)" even
 after I change outfits

Added gInventory.notifyObservers to idle callbacks so it gets triggered without explicit notifyObservers synchronization.
Added more state tracking for attachments, wearables, and links of those types, so that they're marked as changed properly.
---
 indra/newview/llagentwearables.cpp  | 23 +++++--------
 indra/newview/llappearancemgr.cpp   | 51 ++++++++++++++---------------
 indra/newview/llappearancemgr.h     | 19 ++++++-----
 indra/newview/llappviewer.cpp       |  1 +
 indra/newview/llinventorybridge.cpp | 35 ++------------------
 indra/newview/llinventorybridge.h   |  2 --
 indra/newview/llinventorymodel.cpp  | 17 +++++++---
 indra/newview/llinventorymodel.h    |  5 +--
 indra/newview/llwearable.cpp        |  7 ++++
 indra/newview/llwearable.h          |  2 ++
 10 files changed, 70 insertions(+), 92 deletions(-)

diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 6b2033fc6f9..538dcb6f3df 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -653,11 +653,13 @@ LLWearable* LLAgentWearables::getWearable(const EWearableType type, U32 index)
 
 void LLAgentWearables::setWearable(const EWearableType type, U32 index, LLWearable *wearable)
 {
-	if (!getWearable(type,index))
+	LLWearable *old_wearable = getWearable(type,index);
+	if (!old_wearable)
 	{
 		pushWearable(type,wearable);
 		return;
 	}
+	
 	wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(type);
 	if (wearable_iter == mWearableDatas.end())
 	{
@@ -672,6 +674,7 @@ void LLAgentWearables::setWearable(const EWearableType type, U32 index, LLWearab
 	else
 	{
 		wearable_vec[index] = wearable;
+		old_wearable->setLabelUpdated();
 		mAvatarObject->wearableUpdated(wearable->getType());
 	}
 }
@@ -688,6 +691,7 @@ U32 LLAgentWearables::pushWearable(const EWearableType type, LLWearable *wearabl
 	{
 		mWearableDatas[type].push_back(wearable);
 		mAvatarObject->wearableUpdated(wearable->getType());
+		wearable->setLabelUpdated();
 		return mWearableDatas[type].size()-1;
 	}
 	return MAX_WEARABLES_PER_TYPE;
@@ -717,6 +721,7 @@ void LLAgentWearables::popWearable(const EWearableType type, U32 index)
 	{
 		mWearableDatas[type].erase(mWearableDatas[type].begin() + index);
 		mAvatarObject->wearableUpdated(wearable->getType());
+		wearable->setLabelUpdated();
 	}
 }
 
@@ -1412,14 +1417,10 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem
 		for (S32 i=max_entry; i>=0; i--)
 		{
 			LLWearable* old_wearable = getWearable(type,i);
-			const LLUUID &item_id = getWearableItemID(type,i);
-			popWearable(type,i);
-			gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
-			LLAppearanceManager::instance().removeItemLinks(item_id,false);
-
 			//queryWearableCache(); // moved below
 			if (old_wearable)
 			{
+				popWearable(old_wearable);
 				old_wearable->removeFromAvatar(TRUE);
 			}
 		}
@@ -1428,16 +1429,11 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem
 	else
 	{
 		LLWearable* old_wearable = getWearable(type, index);
-
-		const LLUUID &item_id = getWearableItemID(type,index);
-		popWearable(type, index);
-		gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
-		LLAppearanceManager::instance().removeItemLinks(item_id,false);
-
 		//queryWearableCache(); // moved below
 
 		if (old_wearable)
 		{
+			popWearable(old_wearable);
 			old_wearable->removeFromAvatar(TRUE);
 		}
 	}
@@ -1499,7 +1495,6 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
 				continue;
 			}
 
-			gInventory.addChangedMask(LLInventoryObserver::LABEL, old_item_id);
 			// Assumes existing wearables are not dirty.
 			if (old_wearable->isDirty())
 			{
@@ -1508,9 +1503,9 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
 			}
 		}
 
-		setWearable(type,0,new_wearable);
 		if (new_wearable)
 			new_wearable->setItemID(new_item->getUUID());
+		setWearable(type,0,new_wearable);
 	}
 
 	std::vector<LLWearable*> wearables_being_removed;
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 60c6061e966..d6265a85f63 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -579,7 +579,6 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder,
 	if(wearables.count() > 0)
 	{
 		gAgentWearables.setWearableOutfit(items, wearables, !append);
-		gInventory.notifyObservers();
 	}
 
 	delete holder;
@@ -819,15 +818,23 @@ bool areMatchingWearables(const LLViewerInventoryItem *a, const LLViewerInventor
 			(a->getWearableType() == b->getWearableType()));
 }
 
-void LLAppearanceManager::addItemLink( LLInventoryItem* item, bool do_update )
+void LLAppearanceManager::addCOFItemLink(const LLUUID &item_id, bool do_update )
 {
-	LLViewerInventoryItem *vitem = dynamic_cast<LLViewerInventoryItem*>(item);
+	const LLInventoryItem *item = gInventory.getItem(item_id);
+	addCOFItemLink(item);
+}
+
+void LLAppearanceManager::addCOFItemLink(const LLInventoryItem *item, bool do_update )
+{		
+	const LLViewerInventoryItem *vitem = dynamic_cast<const LLViewerInventoryItem*>(item);
 	if (!vitem)
 	{
 		llwarns << "not an llviewerinventoryitem, failed" << llendl;
 		return;
 	}
-		
+
+	gInventory.addChangedMask(LLInventoryObserver::LABEL, vitem->getLinkedUUID());
+
 	LLInventoryModel::cat_array_t cat_array;
 	LLInventoryModel::item_array_t item_array;
 	gInventory.collectDescendents(LLAppearanceManager::getCOF(),
@@ -839,7 +846,7 @@ void LLAppearanceManager::addItemLink( LLInventoryItem* item, bool do_update )
 	{
 		// Are these links to the same object?
 		const LLViewerInventoryItem* inv_item = item_array.get(i).get();
-		if (inv_item->getLinkedUUID() == item->getLinkedUUID())
+		if (inv_item->getLinkedUUID() == vitem->getLinkedUUID())
 		{
 			linked_already = true;
 		}
@@ -850,7 +857,6 @@ void LLAppearanceManager::addItemLink( LLInventoryItem* item, bool do_update )
 		{
 			gAgentWearables.removeWearable(inv_item->getWearableType(),true,0);
 			gInventory.purgeObject(inv_item->getUUID());
-			gInventory.notifyObservers();
 		}
 	}
 	if (linked_already)
@@ -886,8 +892,10 @@ void LLAppearanceManager::addEnsembleLink( LLInventoryCategory* cat, bool do_upd
 #endif
 }
 
-void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update)
+void LLAppearanceManager::removeCOFItemLinks(const LLUUID& item_id, bool do_update)
 {
+	gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
+
 	LLInventoryModel::cat_array_t cat_array;
 	LLInventoryModel::item_array_t item_array;
 	gInventory.collectDescendents(LLAppearanceManager::getCOF(),
@@ -899,7 +907,8 @@ void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update)
 		const LLInventoryItem* item = item_array.get(i).get();
 		if (item->getLinkedUUID() == item_id)
 		{
-			gInventory.purgeObject(item_array.get(i)->getUUID());
+			const LLUUID& item_id = item_array.get(i)->getUUID();
+			gInventory.purgeObject(item_id);
 		}
 	}
 	if (do_update)
@@ -978,18 +987,13 @@ void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg)
 void LLAppearanceManager::registerAttachment(const LLUUID& item_id)
 {
        mRegisteredAttachments.insert(item_id);
+	   gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
        //dumpAttachmentSet(mRegisteredAttachments,"after register:");
 
 	   if (mAttachmentInvLinkEnabled)
 	   {
-		   LLViewerInventoryItem *item = gInventory.getItem(item_id);
-		   if (item)
-		   {
-			   //LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Adding attachment link:");
-			   LLAppearanceManager::addItemLink(item,false);  // Add COF link for item.
-			   gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
-			   gInventory.notifyObservers();
-		   }
+		   //LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Adding attachment link:");
+		   LLAppearanceManager::addCOFItemLink(item_id, false);  // Add COF link for item.
 	   }
 	   else
 	   {
@@ -1000,15 +1004,14 @@ void LLAppearanceManager::registerAttachment(const LLUUID& item_id)
 void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id)
 {
        mRegisteredAttachments.erase(item_id);
+	   gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
+
        //dumpAttachmentSet(mRegisteredAttachments,"after unregister:");
 
 	   if (mAttachmentInvLinkEnabled)
 	   {
 		   //LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:");
-		   LLAppearanceManager::removeItemLinks(item_id, false);
-		   // BAP - needs to change for label to track link.
-		   gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
-		   gInventory.notifyObservers();
+		   LLAppearanceManager::removeCOFItemLinks(item_id, false);
 	   }
 	   else
 	   {
@@ -1023,13 +1026,7 @@ void LLAppearanceManager::linkRegisteredAttachments()
 		 ++it)
 	{
 		LLUUID item_id = *it;
-		LLViewerInventoryItem *item = gInventory.getItem(item_id);
-		if (item)
-		{
-			addItemLink(item, false);
-			gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
-			gInventory.notifyObservers();
-		}
+		addCOFItemLink(item_id, false);
 	}
 	mRegisteredAttachments.clear();
 }
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 12ffa336b45..5daa6d067b6 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -54,12 +54,6 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 	void wearOutfitByName(const std::string& name);
 	void changeOutfit(bool proceed, const LLUUID& category, bool append);
 
-	// Add COF link to individual item.
-	void addItemLink(LLInventoryItem* item, bool do_update = true);
-
-	// Add COF link to ensemble folder.
-	void addEnsembleLink(LLInventoryCategory* item, bool do_update = true);
-
 	// Copy all items in a category.
 	void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
 							 LLPointer<LLInventoryCallback> cb);
@@ -67,9 +61,6 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 	// Find the Current Outfit folder.
 	LLUUID getCOF();
 
-	// Remove COF entries
-	void removeItemLinks(const LLUUID& item_id, bool do_update = true);
-
 	void updateAgentWearables(LLWearableHoldingPattern* holder, bool append);
 
 	// For debugging - could be moved elsewhere.
@@ -87,6 +78,16 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 				 LLInventoryModel::item_array_t& items,
 				 LLPointer<LLInventoryCallback> cb);
 
+	// Add COF link to individual item.
+	void addCOFItemLink(const LLUUID& item_id, bool do_update = true);
+	void addCOFItemLink(const LLInventoryItem *item, bool do_update = true);
+
+	// Remove COF entries
+	void removeCOFItemLinks(const LLUUID& item_id, bool do_update = true);
+
+	// Add COF link to ensemble folder.
+	void addEnsembleLink(LLInventoryCategory* item, bool do_update = true);
+
 protected:
 	LLAppearanceManager();
 	~LLAppearanceManager();
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index f82d1780895..3d7b3244585 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -3534,6 +3534,7 @@ void LLAppViewer::idle()
 		gEventNotifier.update();
 		
 		gIdleCallbacks.callFunctions();
+		gInventory.notifyObservers();
 	}
 	
 	if (gDisconnected)
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index fbef237779c..384d2ae671a 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -183,37 +183,6 @@ BOOL LLInvFVBridge::isItemRemovable()
 	return FALSE;
 }
 
-// Sends an update to all link items that point to the base item.
-void LLInvFVBridge::renameLinkedItems(const LLUUID &item_id, const std::string& new_name)
-{
-	LLInventoryModel* model = getInventoryModel();
-	if(!model) return;
-
-	LLInventoryItem* itemp = model->getItem(mUUID);
-	if (!itemp) return;
-
-	if (itemp->getIsLinkType())
-	{
-		return;
-	}
-
-	LLInventoryModel::item_array_t item_array = model->collectLinkedItems(item_id);
-	for (LLInventoryModel::item_array_t::iterator iter = item_array.begin();
-		 iter != item_array.end();
-		 iter++)
-	{
-		LLViewerInventoryItem *linked_item = (*iter);
-		if (linked_item->getUUID() == item_id) continue;
-
-		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(linked_item);
-		new_item->rename(new_name);
-		new_item->updateServer(FALSE);
-		model->updateItem(new_item);
-		// model->addChangedMask(LLInventoryObserver::LABEL, linked_item->getUUID());
-	}
-	model->notifyObservers();
-}
-
 // Can be moved to another folder
 BOOL LLInvFVBridge::isItemMovable() const
 {
@@ -2924,7 +2893,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
 				// BAP - should skip if dup.
 				if (move_is_into_current_outfit)
 				{
-					LLAppearanceManager::instance().addItemLink(inv_item);
+					LLAppearanceManager::instance().addCOFItemLink(inv_item);
 				}
 				else
 				{
@@ -4171,7 +4140,7 @@ void wear_inventory_item_on_avatar( LLInventoryItem* item )
 		lldebugs << "wear_inventory_item_on_avatar( " << item->getName()
 				 << " )" << llendl;
 
-		LLAppearanceManager::instance().addItemLink(item);
+		LLAppearanceManager::instance().addCOFItemLink(item);
 	}
 }
 
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 56cb0f93ed9..49e64ebdded 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -204,8 +204,6 @@ class LLInvFVBridge : public LLFolderViewEventListener
 									 const LLUUID& new_parent,
 									 BOOL restamp);
 	void removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch);
-	void renameLinkedItems(const LLUUID &item_id, const std::string& new_name);
-
 protected:
 	LLHandle<LLPanel> mInventoryPanel;
 	const LLUUID mUUID;	// item id
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 84588fbe8ca..fbaab385fed 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -509,7 +509,7 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,
 	}
 }
 
-void LLInventoryModel::updateLinkedItems(const LLUUID& object_id)
+void LLInventoryModel::addChangedMaskForLinks(const LLUUID& object_id, U32 mask)
 {
 	const LLInventoryObject *obj = getObject(object_id);
 	if (!obj || obj->getIsLinkType())
@@ -532,7 +532,7 @@ void LLInventoryModel::updateLinkedItems(const LLUUID& object_id)
 		 cat_iter++)
 	{
 		LLViewerInventoryCategory *linked_cat = (*cat_iter);
-		addChangedMask(LLInventoryObserver::LABEL, linked_cat->getUUID());
+		addChangedMask(mask, linked_cat->getUUID());
 	};
 
 	for (LLInventoryModel::item_array_t::iterator iter = item_array.begin();
@@ -540,9 +540,8 @@ void LLInventoryModel::updateLinkedItems(const LLUUID& object_id)
 		 iter++)
 	{
 		LLViewerInventoryItem *linked_item = (*iter);
-		addChangedMask(LLInventoryObserver::LABEL, linked_item->getUUID());
+		addChangedMask(mask, linked_item->getUUID());
 	};
-	notifyObservers();
 }
 
 const LLUUID& LLInventoryModel::getLinkedItemID(const LLUUID& object_id) const
@@ -1133,6 +1132,14 @@ void LLInventoryModel::notifyObservers(const std::string service_name)
 		llwarns << "Call was made to notifyObservers within notifyObservers!" << llendl;
 		return;
 	}
+
+	if ((mModifyMask == LLInventoryObserver::NONE) && (service_name == ""))
+	{
+		mModifyMask = LLInventoryObserver::NONE;
+		mChangedItemIDs.clear();
+		return;
+	}
+
 	mIsNotifyObservers = TRUE;
 	for (observer_list_t::iterator iter = mObservers.begin();
 		 iter != mObservers.end(); )
@@ -1180,7 +1187,7 @@ void LLInventoryModel::addChangedMask(U32 mask, const LLUUID& referent)
 	// not sure what else might need to be accounted for this.
 	if (mModifyMask & LLInventoryObserver::LABEL)
 	{
-		updateLinkedItems(referent);
+		addChangedMaskForLinks(referent, LLInventoryObserver::LABEL);
 	}
 }
 
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index aa4ffb392fd..da12dbdf7fd 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -167,8 +167,6 @@ class LLInventoryModel
 	// Assumes item_id is itself not a linked item.
 	item_array_t collectLinkedItems(const LLUUID& item_id,
 									const LLUUID& start_folder_id = LLUUID::null);
-	// Updates all linked items pointing to this id.
-	void updateLinkedItems(const LLUUID& object_id);
 
 	// Get the inventoryID that this item points to, else just return item_id
 	const LLUUID& getLinkedItemID(const LLUUID& object_id) const;
@@ -440,6 +438,9 @@ class LLInventoryModel
 	
 	bool messageUpdateCore(LLMessageSystem* msg, bool do_accounting);
 
+	// Updates all linked items pointing to this id.
+	void addChangedMaskForLinks(const LLUUID& object_id, U32 mask);
+
 protected:
 	cat_array_t* getUnlockedCatArray(const LLUUID& id);
 	item_array_t* getUnlockedItemArray(const LLUUID& id);
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index 2849cfa20ed..ced0b648966 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -38,6 +38,7 @@
 #include "lllocaltextureobject.h"
 #include "llviewertexturelist.h"
 #include "llinventorymodel.h"
+#include "llinventoryobserver.h"
 #include "llviewerregion.h"
 #include "llvoavatar.h"
 #include "llvoavatarself.h"
@@ -1098,6 +1099,12 @@ void LLWearable::destroyTextures()
 	mSavedTEMap.clear();
 }
 
+
+void LLWearable::setLabelUpdated() const
+{ 
+	gInventory.addChangedMask(LLInventoryObserver::LABEL, getItemID());
+}
+
 struct LLWearableSaveData
 {
 	EWearableType mType;
diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h
index fd19a864062..0863adb7f56 100644
--- a/indra/newview/llwearable.h
+++ b/indra/newview/llwearable.h
@@ -128,6 +128,8 @@ class LLWearable
 
 	BOOL				isOnTop() const;
 
+	// Something happened that requires the wearable's label to be updated (e.g. worn/unworn).
+	void				setLabelUpdated() const;
 
 private:
 	typedef std::map<S32, LLLocalTextureObject*> te_map_t;
-- 
GitLab


From 6b81dfb1398461f008ee7d590e9a14762859e916 Mon Sep 17 00:00:00 2001
From: Palmer <palmer@lindenlab.com>
Date: Wed, 18 Nov 2009 11:59:09 -0800
Subject: [PATCH 435/557] Allow USE_GOOGLE_PERFTOOLS to be set to on.  For
 memory manager

Reviewed by Bao
---
 indra/cmake/GooglePerfTools.cmake | 7 +++----
 indra/llcommon/CMakeLists.txt     | 2 ++
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/indra/cmake/GooglePerfTools.cmake b/indra/cmake/GooglePerfTools.cmake
index 355ecb58f09..946fc6b375e 100644
--- a/indra/cmake/GooglePerfTools.cmake
+++ b/indra/cmake/GooglePerfTools.cmake
@@ -23,12 +23,11 @@ else (STANDALONE)
 endif (STANDALONE)
 
 if (GOOGLE_PERFTOOLS_FOUND)
-  set(USE_GOOGLE_PERFTOOLS ON CACHE BOOL "Build with Google PerfTools support.")
+  # XXX Disable temporarily, until we have compilation issues on 64-bit
+  # Etch sorted.
+  set(USE_GOOGLE_PERFTOOLS OFF CACHE BOOL "Build with Google PerfTools support.")
 endif (GOOGLE_PERFTOOLS_FOUND)
 
-# XXX Disable temporarily, until we have compilation issues on 64-bit
-# Etch sorted.
-set(USE_GOOGLE_PERFTOOLS OFF)
 if (WINDOWS)
     # *TODO -reenable this once we get server usage sorted out
     #set(USE_GOOGLE_PERFTOOLS ON)
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index e41c75846b3..416303342a5 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -9,6 +9,7 @@ include(Linking)
 include(Boost)
 include(Pth)
 include(LLSharedLibs)
+include(GooglePerfTools)
 include(Copy3rdPartyLibs)
 
 include_directories(
@@ -259,6 +260,7 @@ target_link_libraries(
     ${BOOST_PROGRAM_OPTIONS_LIBRARY}
     ${BOOST_REGEX_LIBRARY}
     ${PTH_LIBRARIES}
+    ${GOOGLE_PERFTOOLS_LIBRARIES}
     )
 
 add_dependencies(llcommon stage_third_party_libs)
-- 
GitLab


From 4a38c90adbb13a21e25ac195e45aabf67d42adc8 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 18 Nov 2009 17:03:17 -0500
Subject: [PATCH 436/557] EXT-2641 : Linked gestures aren't showing up as being
 worn (and possibly more serious problems with linked gestures)

Gestures now properly handle link indirection.
---
 indra/newview/llgesturemgr.cpp      | 64 +++++++++++++++++++++--------
 indra/newview/llinventorybridge.cpp |  7 ++++
 2 files changed, 54 insertions(+), 17 deletions(-)

diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 8e774dc199b..d85ac477e19 100644
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -60,6 +60,9 @@
 // Longest time, in seconds, to wait for all animations to stop playing
 const F32 MAX_WAIT_ANIM_SECS = 30.f;
 
+// If this gesture is a link, get the base gesture that this link points to,
+// otherwise just return this id.
+static const LLUUID& get_linked_uuid(const LLUUID& item_id);
 
 // Lightweight constructor.
 // init() does the heavy lifting.
@@ -213,6 +216,8 @@ void LLGestureManager::activateGestureWithAsset(const LLUUID& item_id,
 												BOOL inform_server,
 												BOOL deactivate_similar)
 {
+	const LLUUID& base_item_id = get_linked_uuid(item_id);
+
 	if( !gAssetStorage )
 	{
 		llwarns << "LLGestureManager::activateGestureWithAsset without valid gAssetStorage" << llendl;
@@ -233,13 +238,13 @@ void LLGestureManager::activateGestureWithAsset(const LLUUID& item_id,
 
 	// For now, put NULL into the item map.  We'll build a gesture
 	// class object when the asset data arrives.
-	mActive[item_id] = NULL;
+	mActive[base_item_id] = NULL;
 
 	// Copy the UUID
 	if (asset_id.notNull())
 	{
 		LLLoadInfo* info = new LLLoadInfo;
-		info->mItemID = item_id;
+		info->mItemID = base_item_id;
 		info->mInformServer = inform_server;
 		info->mDeactivateSimilar = deactivate_similar;
 
@@ -259,7 +264,8 @@ void LLGestureManager::activateGestureWithAsset(const LLUUID& item_id,
 
 void LLGestureManager::deactivateGesture(const LLUUID& item_id)
 {
-	item_map_t::iterator it = mActive.find(item_id);
+	const LLUUID& base_item_id = get_linked_uuid(item_id);
+	item_map_t::iterator it = mActive.find(base_item_id);
 	if (it == mActive.end())
 	{
 		llwarns << "deactivateGesture for inactive gesture " << item_id << llendl;
@@ -279,7 +285,7 @@ void LLGestureManager::deactivateGesture(const LLUUID& item_id)
 	}
 
 	mActive.erase(it);
-	gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
+	gInventory.addChangedMask(LLInventoryObserver::LABEL, base_item_id);
 
 	// Inform the database of this change
 	LLMessageSystem* msg = gMessageSystem;
@@ -301,6 +307,7 @@ void LLGestureManager::deactivateGesture(const LLUUID& item_id)
 
 void LLGestureManager::deactivateSimilarGestures(LLMultiGesture* in, const LLUUID& in_item_id)
 {
+	const LLUUID& base_in_item_id = get_linked_uuid(in_item_id);
 	std::vector<LLUUID> gest_item_ids;
 
 	// Deactivate all gestures that match
@@ -312,7 +319,7 @@ void LLGestureManager::deactivateSimilarGestures(LLMultiGesture* in, const LLUUI
 
 		// Don't deactivate the gesture we are looking for duplicates of
 		// (for replaceGesture)
-		if (!gest || item_id == in_item_id) 
+		if (!gest || item_id == base_in_item_id) 
 		{
 			// legal, can have null pointers in list
 			++it;
@@ -387,14 +394,17 @@ void LLGestureManager::deactivateSimilarGestures(LLMultiGesture* in, const LLUUI
 
 BOOL LLGestureManager::isGestureActive(const LLUUID& item_id)
 {
-	item_map_t::iterator it = mActive.find(item_id);
+	const LLUUID& base_item_id = get_linked_uuid(item_id);
+	item_map_t::iterator it = mActive.find(base_item_id);
 	return (it != mActive.end());
 }
 
 
 BOOL LLGestureManager::isGesturePlaying(const LLUUID& item_id)
 {
-	item_map_t::iterator it = mActive.find(item_id);
+	const LLUUID& base_item_id = get_linked_uuid(item_id);
+
+	item_map_t::iterator it = mActive.find(base_item_id);
 	if (it == mActive.end()) return FALSE;
 
 	LLMultiGesture* gesture = (*it).second;
@@ -405,19 +415,21 @@ BOOL LLGestureManager::isGesturePlaying(const LLUUID& item_id)
 
 void LLGestureManager::replaceGesture(const LLUUID& item_id, LLMultiGesture* new_gesture, const LLUUID& asset_id)
 {
-	item_map_t::iterator it = mActive.find(item_id);
+	const LLUUID& base_item_id = get_linked_uuid(item_id);
+
+	item_map_t::iterator it = mActive.find(base_item_id);
 	if (it == mActive.end())
 	{
-		llwarns << "replaceGesture for inactive gesture " << item_id << llendl;
+		llwarns << "replaceGesture for inactive gesture " << base_item_id << llendl;
 		return;
 	}
 
 	LLMultiGesture* old_gesture = (*it).second;
 	stopGesture(old_gesture);
 
-	mActive.erase(item_id);
+	mActive.erase(base_item_id);
 
-	mActive[item_id] = new_gesture;
+	mActive[base_item_id] = new_gesture;
 
 	delete old_gesture;
 	old_gesture = NULL;
@@ -428,7 +440,7 @@ void LLGestureManager::replaceGesture(const LLUUID& item_id, LLMultiGesture* new
 		mDeactivateSimilarNames.clear();
 
 		LLLoadInfo* info = new LLLoadInfo;
-		info->mItemID = item_id;
+		info->mItemID = base_item_id;
 		info->mInformServer = TRUE;
 		info->mDeactivateSimilar = FALSE;
 
@@ -445,16 +457,18 @@ void LLGestureManager::replaceGesture(const LLUUID& item_id, LLMultiGesture* new
 
 void LLGestureManager::replaceGesture(const LLUUID& item_id, const LLUUID& new_asset_id)
 {
-	item_map_t::iterator it = LLGestureManager::instance().mActive.find(item_id);
+	const LLUUID& base_item_id = get_linked_uuid(item_id);
+
+	item_map_t::iterator it = LLGestureManager::instance().mActive.find(base_item_id);
 	if (it == mActive.end())
 	{
-		llwarns << "replaceGesture for inactive gesture " << item_id << llendl;
+		llwarns << "replaceGesture for inactive gesture " << base_item_id << llendl;
 		return;
 	}
 
 	// mActive owns this gesture pointer, so clean up memory.
 	LLMultiGesture* gesture = (*it).second;
-	LLGestureManager::instance().replaceGesture(item_id, gesture, new_asset_id);
+	LLGestureManager::instance().replaceGesture(base_item_id, gesture, new_asset_id);
 }
 
 void LLGestureManager::playGesture(LLMultiGesture* gesture)
@@ -478,7 +492,9 @@ void LLGestureManager::playGesture(LLMultiGesture* gesture)
 // Convenience function that looks up the item_id for you.
 void LLGestureManager::playGesture(const LLUUID& item_id)
 {
-	item_map_t::iterator it = mActive.find(item_id);
+	const LLUUID& base_item_id = get_linked_uuid(item_id);
+
+	item_map_t::iterator it = mActive.find(base_item_id);
 	if (it == mActive.end()) return;
 
 	LLMultiGesture* gesture = (*it).second;
@@ -1074,7 +1090,9 @@ void LLGestureManager::stopGesture(LLMultiGesture* gesture)
 
 void LLGestureManager::stopGesture(const LLUUID& item_id)
 {
-	item_map_t::iterator it = mActive.find(item_id);
+	const LLUUID& base_item_id = get_linked_uuid(item_id);
+
+	item_map_t::iterator it = mActive.find(base_item_id);
 	if (it == mActive.end()) return;
 
 	LLMultiGesture* gesture = (*it).second;
@@ -1171,3 +1189,15 @@ void LLGestureManager::done()
 	}
 	notifyObservers();
 }
+
+// static
+const LLUUID& get_linked_uuid(const LLUUID &item_id)
+{
+	LLViewerInventoryItem* item = gInventory.getItem(item_id);
+	if (item && item->getIsLinkType())
+	{
+		return item->getLinkedUUID();
+	}
+	return item_id;
+}
+
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 384d2ae671a..173f2634aa2 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -3658,6 +3658,11 @@ void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 	}
 	else
 	{
+		LLInventoryItem* item = getItem();
+		if (item && item->getIsLinkType())
+		{
+			items.push_back(std::string("Find Original"));
+		}
 		items.push_back(std::string("Open"));
 		items.push_back(std::string("Properties"));
 
@@ -3883,6 +3888,7 @@ std::string LLObjectBridge::getLabelSuffix() const
 	{
 		std::string attachment_point_name = avatar->getAttachedPointName(mUUID);
 
+		// e.g. "(worn on ...)" / "(attached to ...)"
 		LLStringUtil::format_map_t args;
 		args["[ATTACHMENT_POINT]"] =  attachment_point_name.c_str();
 		return LLItemBridge::getLabelSuffix() + LLTrans::getString("WornOnAttachmentPoint", args);
@@ -4297,6 +4303,7 @@ std::string LLWearableBridge::getLabelSuffix() const
 {
 	if( gAgentWearables.isWearingItem( mUUID ) )
 	{
+		// e.g. "(worn)" 
 		return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn");
 	}
 	else
-- 
GitLab


From efb512dc65c43ea73e7b4da3e2c45d276043842e Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Wed, 18 Nov 2009 14:07:35 -0800
Subject: [PATCH 437/557] EXT-2644 - Add "Close Session" option to chicklet
 context menus

---
 indra/newview/llavataractions.cpp                 | 13 +++++++++++++
 indra/newview/llavataractions.h                   |  5 +++++
 indra/newview/llchiclet.cpp                       | 10 +++++++++-
 indra/newview/llfloatergroups.cpp                 |  2 +-
 indra/newview/llgroupactions.cpp                  | 15 ++++++++++++++-
 indra/newview/llgroupactions.h                    |  7 ++++++-
 indra/newview/llpanelpeople.cpp                   |  2 +-
 .../skins/default/xui/en/menu_imchiclet_group.xml |  8 ++++++++
 .../skins/default/xui/en/menu_imchiclet_p2p.xml   |  8 ++++++++
 9 files changed, 65 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index ee4a9df15fa..0844cca7662 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -189,6 +189,19 @@ void LLAvatarActions::startIM(const LLUUID& id)
 	make_ui_sound("UISndStartIM");
 }
 
+// static
+void LLAvatarActions::endIM(const LLUUID& id)
+{
+	if (id.isNull())
+		return;
+	
+	LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL, id);
+	if (session_id != LLUUID::null)
+	{
+		gIMMgr->leaveSession(session_id);
+	}
+}
+
 // static
 void LLAvatarActions::startCall(const LLUUID& id)
 {
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index 66ea6880dbf..d9dab95a770 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -73,6 +73,11 @@ class LLAvatarActions
 	 */
 	static void startIM(const LLUUID& id);
 
+	/**
+	 * End instant messaging session.
+	 */
+	static void endIM(const LLUUID& id);
+
 	/**
 	 * Start an avatar-to-avatar voice call with another user
 	 */
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 4078fac4ecb..5375c3ea493 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -482,6 +482,10 @@ void LLIMP2PChiclet::onMenuItemClicked(const LLSD& user_data)
 	{
 		LLAvatarActions::requestFriendshipDialog(other_participant_id);
 	}
+	else if("close" == level)
+	{
+		LLAvatarActions::endIM(other_participant_id);
+	}
 }
 
 //////////////////////////////////////////////////////////////////////////
@@ -776,12 +780,16 @@ void LLIMGroupChiclet::onMenuItemClicked(const LLSD& user_data)
 
 	if("group chat" == level)
 	{
-		LLGroupActions::startChat(group_id);
+		LLGroupActions::startIM(group_id);
 	}
 	else if("info" == level)
 	{
 		LLGroupActions::show(group_id);
 	}
+	else if("close" == level)
+	{
+		LLGroupActions::endIM(group_id);
+	}
 }
 
 
diff --git a/indra/newview/llfloatergroups.cpp b/indra/newview/llfloatergroups.cpp
index 45af515a869..7cb925bc0b0 100644
--- a/indra/newview/llfloatergroups.cpp
+++ b/indra/newview/llfloatergroups.cpp
@@ -327,7 +327,7 @@ void LLPanelGroups::startIM()
 
 	if (group_list && (group_id = group_list->getCurrentID()).notNull())
 	{
-		LLGroupActions::startChat(group_id);
+		LLGroupActions::startIM(group_id);
 	}
 }
 
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index e60bde9fd89..f4e1951c7b2 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -272,7 +272,7 @@ void LLGroupActions::closeGroup(const LLUUID& group_id)
 
 
 // static
-void LLGroupActions::startChat(const LLUUID& group_id)
+void LLGroupActions::startIM(const LLUUID& group_id)
 {
 	if (group_id.isNull())
 		return;
@@ -298,6 +298,19 @@ void LLGroupActions::startChat(const LLUUID& group_id)
 	}
 }
 
+// static
+void LLGroupActions::endIM(const LLUUID& group_id)
+{
+	if (group_id.isNull())
+		return;
+	
+	LLUUID session_id = gIMMgr->computeSessionID(IM_SESSION_GROUP_START, group_id);
+	if (session_id != LLUUID::null)
+	{
+		gIMMgr->leaveSession(session_id);
+	}
+}
+
 // static
 bool LLGroupActions::isInGroup(const LLUUID& group_id)
 {
diff --git a/indra/newview/llgroupactions.h b/indra/newview/llgroupactions.h
index 74c84d15617..9750b3e3cb7 100644
--- a/indra/newview/llgroupactions.h
+++ b/indra/newview/llgroupactions.h
@@ -88,7 +88,12 @@ class LLGroupActions
 	/**
 	 * Start group instant messaging session.
 	 */
-	static void startChat(const LLUUID& group_id);
+	static void startIM(const LLUUID& group_id);
+
+	/**
+	 * End group instant messaging session.
+	 */
+	static void endIM(const LLUUID& group_id);
 
 	/// Returns if the current user is a member of the group
 	static bool isInGroup(const LLUUID& group_id);
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 709525d4e26..4dc88725573 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -1017,7 +1017,7 @@ void LLPanelPeople::onChatButtonClicked()
 {
 	LLUUID group_id = getCurrentItemID();
 	if (group_id.notNull())
-		LLGroupActions::startChat(group_id);
+		LLGroupActions::startIM(group_id);
 }
 
 void LLPanelPeople::onImButtonClicked()
diff --git a/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml
index 542e319792b..dfe4605b7ac 100644
--- a/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml
+++ b/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml
@@ -24,4 +24,12 @@
          function="IMChicletMenu.Action"
          parameter="info" />
     </menu_item_call>
+    <menu_item_call
+     label="Close Session"
+     layout="topleft"
+     name="Close Session">
+        <menu_item_call.on_click
+         function="IMChicletMenu.Action"
+         parameter="close" />
+    </menu_item_call>
 </menu>
diff --git a/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml
index c205868429e..4cabcb90317 100644
--- a/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml
+++ b/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml
@@ -32,4 +32,12 @@
          function="IMChicletMenu.Action"
          parameter="add" />
     </menu_item_call>
+    <menu_item_call
+     label="Close Session"
+     layout="topleft"
+     name="Close Session">
+        <menu_item_call.on_click
+         function="IMChicletMenu.Action"
+         parameter="close" />
+    </menu_item_call>
 </menu>
-- 
GitLab


From 51d5005fa371b77588c37b5edf127a756f9750fd Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Wed, 18 Nov 2009 17:07:37 -0500
Subject: [PATCH 438/557] Make failure to load lleventhost.dll when requested a
 fatal error. This addresses a failure mode Mani encountered when
 lleventhost.dll wasn't built. testlangs.py couldn't talk to the
 newly-launched viewer -- but thinking that was because it had crashed, it
 went ahead and launched a whole bunch more. This fix avoids the possibility
 of rogue viewer processes on an unattended test machine.

---
 indra/newview/llappviewer.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index f82d1780895..445ff5f08e6 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -4185,7 +4185,7 @@ void LLAppViewer::loadEventHostModule(S32 listen_port)
 
 	if(dso_path == "")
 	{
-		llwarns << "QAModeEventHost requested but module \"" << dso_name << "\" not found!" << llendl;
+		llerrs << "QAModeEventHost requested but module \"" << dso_name << "\" not found!" << llendl;
 		return;
 	}
 
@@ -4213,7 +4213,7 @@ void LLAppViewer::loadEventHostModule(S32 listen_port)
 
 	if(status != 0)
 	{
-		llwarns << "problem loading eventhost plugin, status: " << status << llendl;
+		llerrs << "problem loading eventhost plugin, status: " << status << llendl;
 	}
 
 	mPlugins.insert(eventhost_dso_handle);
-- 
GitLab


From a46794bcff15b70ab4e5e04ce12d118579b72245 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Wed, 18 Nov 2009 14:27:58 -0800
Subject: [PATCH 439/557] EXT-2579 Fix memory leak/bloat due to /me IRC-style
 emotes. Pending review with Richard/Leyla

---
 indra/newview/llchatitemscontainerctrl.cpp | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 997aed4277c..56b7520bd5e 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -188,7 +188,17 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
 		}
 		mText = mText.substr(3);
 		style_params.font.style = "UNDERLINE";
+#define INFINITE_REFLOW_BUG 0
+#if INFINITE_REFLOW_BUG
+		// This causes LLTextBase::reflow() to infinite loop until the viewer
+		// runs out of memory, throws a bad_alloc exception from std::vector
+		// in mLineInfoList, and the main loop catches it and continues.
+		// It appears to be caused by addText() adding a line separator in the
+		// middle of a line.  See EXT-2579, EXT-1949
 		msg_text->addText(mText,style_params);
+#else
+		msg_text->appendText(mText, FALSE, style_params);
+#endif
 	}
 	else 
 	{
-- 
GitLab


From 203490e2a0915c5ce59ccacba420388327f9143b Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Wed, 18 Nov 2009 14:29:01 -0800
Subject: [PATCH 440/557] Change /me emote formatting to pure italics, not
 underlined. Review pending with Richard/Leyla

---
 indra/newview/llchatitemscontainerctrl.cpp | 2 +-
 indra/newview/llimfloater.cpp              | 4 ++--
 indra/newview/llnearbychat.cpp             | 2 +-
 indra/newview/lltoastimpanel.cpp           | 2 +-
 4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 56b7520bd5e..8a6935b71bf 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -187,7 +187,7 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
 			msg_text->setText(mFromName, style_params);
 		}
 		mText = mText.substr(3);
-		style_params.font.style = "UNDERLINE";
+		style_params.font.style = "ITALIC";
 #define INFINITE_REFLOW_BUG 0
 #if INFINITE_REFLOW_BUG
 		// This causes LLTextBase::reflow() to infinite loop until the viewer
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index c2c83191e00..120935883ad 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -494,12 +494,12 @@ void LLIMFloater::updateMessages()
 				if (from.size() > 0)
 				{
 					append_style_params.font.style = "ITALIC";
-					chat.mText = from + " ";
+					chat.mText = from;
 					mChatHistory->appendWidgetMessage(chat, append_style_params);
 				}
 				
 				message = message.substr(3);
-				append_style_params.font.style = "UNDERLINE";
+				append_style_params.font.style = "ITALIC";
 				mChatHistory->appendText(message, FALSE, append_style_params);
 			}
 			else
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 16a47890c3b..1f984e3af87 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -177,7 +177,7 @@ void	LLNearbyChat::addMessage(const LLChat& chat)
 			}
 			
 			message = message.substr(3);
-			append_style_params.font.style = "UNDERLINE";
+			append_style_params.font.style = "ITALIC";
 			mChatHistory->appendText(message, FALSE, append_style_params);
 		}
 		else
diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp
index d2cc6d07260..9040bdb41ab 100644
--- a/indra/newview/lltoastimpanel.cpp
+++ b/indra/newview/lltoastimpanel.cpp
@@ -64,7 +64,7 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) :	LLToastPanel(p.notif
 		style_params.font.style ="ITALIC";
 		mMessage->appendText(p.from + " ", FALSE, style_params);
 
-		style_params.font.style = "UNDERLINE";
+		style_params.font.style = "ITALIC";
 		mMessage->appendText(p.message.substr(3), FALSE, style_params);
 	}
 	else
-- 
GitLab


From 2878328bb777ee6ffea252675cc2f5cfd64aed1f Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Wed, 18 Nov 2009 14:39:51 -0800
Subject: [PATCH 441/557] Renamed "close" to "end" in chiclet context menus
 Removed "open" in chiclet context menus Removed some deprecate "..." Removed
 ^M from menu_viewer.xml

---
 indra/newview/llchiclet.cpp                   |    4 +-
 .../default/xui/en/menu_imchiclet_group.xml   |   18 +-
 .../default/xui/en/menu_imchiclet_p2p.xml     |   20 +-
 .../skins/default/xui/en/menu_viewer.xml      | 7396 ++++++++---------
 4 files changed, 3719 insertions(+), 3719 deletions(-)

diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index ad9fd4badc9..9845664c749 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -474,7 +474,7 @@ void LLIMP2PChiclet::onMenuItemClicked(const LLSD& user_data)
 	{
 		LLAvatarActions::requestFriendshipDialog(other_participant_id);
 	}
-	else if("close" == level)
+	else if("end" == level)
 	{
 		LLAvatarActions::endIM(other_participant_id);
 	}
@@ -778,7 +778,7 @@ void LLIMGroupChiclet::onMenuItemClicked(const LLSD& user_data)
 	{
 		LLGroupActions::show(group_id);
 	}
-	else if("close" == level)
+	else if("end" == level)
 	{
 		LLGroupActions::endIM(group_id);
 	}
diff --git a/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml
index dfe4605b7ac..8cbe62cfb01 100644
--- a/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml
+++ b/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml
@@ -9,27 +9,27 @@
  visible="false"
  width="128">
     <menu_item_call
-     label="Chat..."
+     label="Group Info"
      layout="topleft"
-     name="Chat">
+     name="Show Profile">
         <menu_item_call.on_click
          function="IMChicletMenu.Action"
-         parameter="group chat" />
+         parameter="info" />
     </menu_item_call>
     <menu_item_call
-     label="Info..."
+     label="Show Session"
      layout="topleft"
-     name="Show Profile">
+     name="Chat">
         <menu_item_call.on_click
          function="IMChicletMenu.Action"
-         parameter="info" />
+         parameter="group chat" />
     </menu_item_call>
     <menu_item_call
-     label="Close Session"
+     label="End Session"
      layout="topleft"
-     name="Close Session">
+     name="End Session">
         <menu_item_call.on_click
          function="IMChicletMenu.Action"
-         parameter="close" />
+         parameter="end" />
     </menu_item_call>
 </menu>
diff --git a/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml
index 4cabcb90317..6891aaca32a 100644
--- a/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml
+++ b/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml
@@ -9,7 +9,7 @@
  visible="false"
  width="128">
     <menu_item_call
-     label="Show Profile..."
+     label="Show Profile"
      layout="topleft"
      name="Show Profile">
         <menu_item_call.on_click
@@ -17,27 +17,27 @@
          parameter="profile" />
     </menu_item_call>
     <menu_item_call
-     label="Send IM..."
+     label="Add Friend"
      layout="topleft"
-     name="Send IM">
+     name="Add Friend">
         <menu_item_call.on_click
          function="IMChicletMenu.Action"
-         parameter="im" />
+         parameter="add" />
     </menu_item_call>
     <menu_item_call
-     label="Add Friend..."
+     label="Show Session"
      layout="topleft"
-     name="Add Friend">
+     name="Send IM">
         <menu_item_call.on_click
          function="IMChicletMenu.Action"
-         parameter="add" />
+         parameter="im" />
     </menu_item_call>
     <menu_item_call
-     label="Close Session"
+     label="End Session"
      layout="topleft"
-     name="Close Session">
+     name="End Session">
         <menu_item_call.on_click
          function="IMChicletMenu.Action"
-         parameter="close" />
+         parameter="end" />
     </menu_item_call>
 </menu>
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 181994a1bdc..ccf6b08ed79 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -1,3698 +1,3698 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu_bar
- bg_visible="false"
- follows="left|top|right"
- layout="topleft"
- name="Main Menu">
-    <menu
-     label="Me"
-     layout="topleft"
-     name="Me"
-     tear_off="true">
-        <menu_item_call
-         label="Preferences"
-         layout="topleft"
-         name="Preferences"
-         shortcut="control|P">
-            <menu_item_call.on_click
-             function="Floater.Show"
-             parameter="preferences" />
-        </menu_item_call>
-         <menu_item_call
-             label="My Dashboard"
-             layout="topleft"
-             name="Manage My Account">
-                <menu_item_call.on_click
-                 function="PromptShowURL"
-                 name="ManageMyAccount_url"
-                 parameter="WebLaunchJoinNow,http://secondlife.com/account/" />
-      </menu_item_call>
-        <menu_item_call
-         label="Buy L$"
-         layout="topleft"
-         name="Buy and Sell L$">
-            <menu_item_call.on_click
-             function="ShowFloater"
-             parameter="buy currency" />
-        </menu_item_call>
-        <menu_item_separator
-         layout="topleft" />
-        <menu_item_call
-         label="My Profile"
-         layout="topleft"
-         name="Profile">
-            <menu_item_call.on_click
-             function="ShowAgentProfile"
-             parameter="agent" />
-        </menu_item_call>
-        <menu_item_call
-         label="My Appearance"
-         layout="topleft"
-         name="Appearance">
-            <menu_item_call.on_click
-             function="ShowFloater"
-             parameter="appearance" />
-            <menu_item_call.on_enable
-             function="Edit.EnableCustomizeAvatar" />
-        </menu_item_call>
-        <menu_item_check
-         label="My Inventory"
-         layout="topleft"
-         name="Inventory"
-         shortcut="control|I">
-            <menu_item_check.on_check
-             function="Floater.Visible"
-             parameter="inventory" />
-            <menu_item_check.on_click
-             function="Floater.Toggle"
-             parameter="inventory" />
-        </menu_item_check>
-        <menu_item_call
-         label="My Gestures"
-         layout="topleft"
-         name="Gestures"
-         shortcut="control|G">
-            <menu_item_call.on_click
-             function="ShowFloater"
-             parameter="gestures" />
-        </menu_item_call>
-        <menu
-         label="My Status"
-         layout="topleft"
-         name="Status"
-         tear_off="true">
-            <menu_item_call
-             label="Away"
-             layout="topleft"
-             name="Set Away">
-                <menu_item_call.on_click
-                 function="World.SetAway" />
-            </menu_item_call>
-            <menu_item_separator
-             layout="topleft"/>
-            <menu_item_call
-             label="Busy"
-             layout="topleft"
-             name="Set Busy">
-                <menu_item_call.on_click
-                 function="World.SetBusy"/>
-            </menu_item_call>
-        </menu>
-        <menu_item_call
-         label="Request Admin Status"
-         layout="topleft"
-         name="Request Admin Options"
-         shortcut="control|alt|G"
-		 visible="false">
-            <menu_item_call.on_click
-             function="Advanced.RequestAdminStatus" />
-        </menu_item_call>
-        <menu_item_call
-         label="Leave Admin Status"
-         layout="topleft"
-         name="Leave Admin Options"
-         shortcut="control|alt|shift|G"
-		 visible="false">
-            <menu_item_call.on_click
-             function="Advanced.LeaveAdminStatus" />
-        </menu_item_call>
-        <menu_item_separator
-         layout="topleft" />
-        <menu_item_call
-         label="Quit [APP_NAME]"
-         layout="topleft"
-         name="Quit"
-         shortcut="control|Q">
-            <menu_item_call.on_click
-             function="File.Quit" />
-        </menu_item_call>
-    </menu>
-    <menu
-     label="Communicate"
-     layout="topleft"
-     name="Communicate"
-     tear_off="true">
-        <menu_item_call
-         label="My Friends"
-         layout="topleft"
-         name="My Friends"
-         shortcut="control|shift|F">
-            <menu_item_call.on_click
-             function="SideTray.PanelPeopleTab"
-             parameter="friends_panel" />
-            </menu_item_call>
-        <menu_item_call
-         label="My Groups"
-         layout="topleft"
-         name="My Groups">
-            <menu_item_call.on_click
-             function="SideTray.PanelPeopleTab"
-             parameter="groups_panel" />
-        </menu_item_call>
-        <menu_item_separator
-         layout="topleft" />
-        <!--menu_item_call
-         label="Chat"
-         layout="topleft"
-         name="Chat">
-            <menu_item_call.on_click
-             function="World.Chat" />
-        </menu_item_call-->
-        <menu_item_check
-         label="Nearby Chat"
-         layout="topleft"
-         name="Nearby Chat"
-         shortcut="control|H">
-            <menu_item_check.on_check
-             function="Floater.Visible"
-             parameter="nearby_chat" />
-            <menu_item_check.on_click
-             function="Floater.Toggle"
-             parameter="nearby_chat" />
-        </menu_item_check>
-        <menu_item_call
-         label="Nearby People"
-         layout="topleft"
-         name="Active Speakers"
-         shortcut="control|shift|A">
-            <menu_item_call.on_click
-             function="SideTray.PanelPeopleTab"
-             parameter="nearby_panel" />
-            </menu_item_call>
-        <menu_item_check
-         label="Nearby Media"
-         layout="topleft"
-         name="Nearby Media"
-         shortcut="control|alt|N">
-            <menu_item_check.on_check
-             function="Floater.Visible"
-             parameter="nearby_media" />
-            <menu_item_check.on_click
-             function="Floater.Toggle"
-             parameter="nearby_media" />
-        </menu_item_check>
-        <!--menu_item_check
-         label="Block List"
-         layout="topleft"
-         name="Mute List">
-            <menu_item_check.on_check
-             function="Floater.Visible"
-             parameter="mute" />
-            <menu_item_check.on_click
-             function="Floater.Toggle"
-             parameter="mute" />
-        </menu_item_check-->
-        <menu_item_separator
-         layout="topleft" />
-        <menu_item_check
-         label="(Legacy) Communicate"
-         layout="topleft"
-         name="Instant Message"
-         shortcut="control|T">
-            <menu_item_check.on_check
-             function="Floater.Visible"
-             parameter="communicate" />
-            <menu_item_check.on_click
-             function="Floater.Toggle"
-             parameter="communicate" />
-        </menu_item_check>
-        <menu_item_call
-         label="(Temp) Media Remote Ctrl"
-         layout="topleft"
-         name="Preferences"
-         shortcut="control|alt|M">
-            <menu_item_call.on_click
-             function="Floater.Toggle"
-             parameter="media_remote_ctrl" />
-        </menu_item_call>
-    </menu>
-    <menu
-     label="World"
-     layout="topleft"
-     name="World"
-     tear_off="true">
-         <menu_item_check
-         label="Move"
-         layout="topleft"
-         name="Movement Controls">
-            <menu_item_check.on_check
-             function="Floater.Visible"
-             parameter="moveview" />
-            <menu_item_check.on_click
-             function="Floater.Toggle"
-             parameter="moveview" />
-        </menu_item_check>
-        <menu_item_check
-         label="View"
-         layout="topleft"
-         name="Camera Controls">
-            <menu_item_check.on_check
-             function="Floater.Visible"
-             parameter="camera" />
-            <menu_item_check.on_click
-             function="Floater.Toggle"
-             parameter="camera" />
-        </menu_item_check>
-        <menu_item_separator
-         layout="topleft" />
-        <menu_item_call
-         label="About Land"
-         layout="topleft"
-         name="About Land">
-            <menu_item_call.on_click
-             function="Floater.Show"
-             parameter="about_land" />
-        </menu_item_call>
-        <menu_item_call
-         label="Region/Estate"
-         layout="topleft"
-         name="Region/Estate">
-            <menu_item_call.on_click
-             function="Floater.Show"
-             parameter="region_info" />
-        </menu_item_call>
-        <menu_item_call
-             label="Buy Land"
-             layout="topleft"
-             name="Buy Land">
-                <menu_item_call.on_click
-                 function="ShowFloater"
-                 parameter="buy land" />
-                <menu_item_call.on_enable
-                 function="World.EnableBuyLand" />
-            </menu_item_call>
-        <menu_item_call
-             label="My Land"
-             layout="topleft"
-             name="My Land">
-                <menu_item_call.on_click
-                 function="ShowFloater"
-                 parameter="land_holdings" />
-        </menu_item_call>
-        <menu
-           create_jump_keys="true"
-           label="Show"
-           layout="topleft"
-           name="Land"
-           tear_off="true">
-          <menu_item_check
-             label="Ban Lines"
-             layout="topleft"
-             name="Ban Lines">
-            <menu_item_check.on_check
-               control="ShowBanLines" />
-            <menu_item_check.on_click
-               function="ToggleControl"
-               parameter="ShowBanLines" />
-          </menu_item_check>
-           <menu_item_check
-                 label="Beacons"
-                 layout="topleft"
-                 name="beacons"
-                 shortcut="control|alt|shift|N">
-                    <menu_item_check.on_check
-                     function="Floater.Visible"
-                     parameter="beacons" />
-                    <menu_item_check.on_click
-                     function="Floater.Toggle"
-                     parameter="beacons" />
-                </menu_item_check>
-          <menu_item_check
-             label="Property Lines"
-             layout="topleft"
-             name="Property Lines"
-             shortcut="control|alt|shift|P">
-            <menu_item_check.on_check
-               control="ShowPropertyLines" />
-            <menu_item_check.on_click
-               function="ToggleControl"
-               parameter="ShowPropertyLines" />
-          </menu_item_check>
-          <menu_item_check
-             label="Land Owners"
-             layout="topleft"
-             name="Land Owners">
-            <menu_item_check.on_check
-               control="ShowParcelOwners" />
-            <menu_item_check.on_click
-               function="ToggleControl"
-               parameter="ShowParcelOwners" />
-          </menu_item_check>
-        </menu>
-        <menu_item_separator
-         layout="topleft" />
-        <menu
-         label="Landmarks"
-         layout="topleft"
-         name="Landmarks"
-         tear_off="true">
-            <menu_item_call
-             label="Create Landmark Here"
-             layout="topleft"
-             name="Create Landmark Here">
-                <menu_item_call.on_click
-                 function="World.CreateLandmark" />
-                <menu_item_call.on_enable
-                 function="World.EnableCreateLandmark" />
-            </menu_item_call>
-            <menu_item_call
-             label="Set Home to Here"
-             layout="topleft"
-             name="Set Home to Here">
-                <menu_item_call.on_click
-                 function="World.SetHomeLocation" />
-                <menu_item_call.on_enable
-                 function="World.EnableSetHomeLocation" />
-            </menu_item_call>
-            <menu_item_call
-             label="Teleport Home"
-             layout="topleft"
-             name="Teleport Home"
-             shortcut="control|shift|H">
-                <menu_item_call.on_click
-                 function="World.TeleportHome" />
-                <menu_item_call.on_enable
-                 function="World.EnableTeleportHome" />
-            </menu_item_call>
-        </menu>
-      <menu_item_check
-         label="Mini-Map"
-         layout="topleft"
-         name="Mini-Map"
-         shortcut="control|shift|M">
-            <menu_item_check.on_check
-             function="Floater.Visible"
-             parameter="mini_map" />
-            <menu_item_check.on_click
-             function="Floater.Toggle"
-             parameter="mini_map" />
-        </menu_item_check>
-         <menu_item_check
-         label="World Map"
-         layout="topleft"
-         name="World Map"
-         shortcut="control|M"
-         use_mac_ctrl="true">
-            <menu_item_check.on_check
-             function="Floater.Visible"
-             parameter="world_map" />
-            <menu_item_check.on_click
-             function="Floater.Toggle"
-             parameter="world_map" />
-        </menu_item_check>
-    <!--    <menu_item_check
-         label="Show Navigation Bar"
-         layout="topleft"
-         name="ShowNavbarNavigationPanel">
-           <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="ShowNavbarNavigationPanel" />
-             <menu_item_check.on_check
-             function="CheckControl"
-             parameter="ShowNavbarNavigationPanel" />
-        </menu_item_check>
-       <menu_item_check
-         label="Show Favorites Bar"
-         layout="topleft"
-         name="ShowNavbarFavoritesPanel">
-           <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="ShowNavbarFavoritesPanel" />
-             <menu_item_check.on_check
-             function="CheckControl"
-             parameter="ShowNavbarFavoritesPanel" />
-        </menu_item_check>
-        <menu_item_separator
-         layout="topleft" />-->
-        <menu_item_call
-         label="Snapshot"
-         layout="topleft"
-         name="Take Snapshot"
-         shortcut="control|shift|S">
-            <menu_item_call.on_click
-             function="Floater.Show"
-             parameter="snapshot" />
-        </menu_item_call>
-    <menu
-         create_jump_keys="true"
-         label="Sun"
-         layout="topleft"
-         name="Environment Settings"
-         tear_off="true">
-            <menu_item_call
-             label="Sunrise"
-             layout="topleft"
-             name="Sunrise">
-                <menu_item_call.on_click
-                 function="World.EnvSettings"
-                 parameter="sunrise" />
-            </menu_item_call>
-            <menu_item_call
-             label="Midday"
-             layout="topleft"
-             name="Noon"
-             shortcut="control|shift|Y">
-                <menu_item_call.on_click
-                 function="World.EnvSettings"
-                 parameter="noon" />
-            </menu_item_call>
-            <menu_item_call
-             label="Sunset"
-             layout="topleft"
-             name="Sunset"
-             shortcut="control|shift|N">
-                <menu_item_call.on_click
-                 function="World.EnvSettings"
-                 parameter="sunset" />
-            </menu_item_call>
-            <menu_item_call
-             label="Midnight"
-             layout="topleft"
-             name="Midnight">
-                <menu_item_call.on_click
-                 function="World.EnvSettings"
-                 parameter="midnight" />
-            </menu_item_call>
-            <menu_item_call
-             label="Use the Estate Time"
-             layout="topleft"
-             name="Revert to Region Default">
-                <menu_item_call.on_click
-                 function="World.EnvSettings"
-                 parameter="default" />
-            </menu_item_call>
-            <menu_item_separator
-             layout="topleft" />
-            <menu_item_call
-             label="Environment Editor"
-             layout="topleft"
-             name="Environment Editor">
-                <menu_item_call.on_click
-                 function="World.EnvSettings"
-                 parameter="editor" />
-            </menu_item_call>
-        </menu>
-    </menu>
-    <menu
-     create_jump_keys="true"
-     label="Build"
-     layout="topleft"
-     name="BuildTools"
-     tear_off="true"
-     visible="true">
-       <menu_item_check
-         label="Build"
-         layout="topleft"
-         name="Show Build Tools"
-         shortcut="control|B">
-            <menu_item_check.on_check
-             function="Build.Active" />
-            <menu_item_check.on_click
-             function="Build.Toggle" />
-            <menu_item_check.on_enable
-             function="Build.Enabled" />
-       </menu_item_check>
-       <menu
-          create_jump_keys="true"
-          label="Select Build Tool"
-          layout="topleft"
-          name="Select Tool"
-          tear_off="true">
-         <menu_item_call
-			label="Focus Tool"
-			layout="topleft"
-			name="Focus"
-			shortcut="control|1">
-           <menu_item_call.on_click
-              function="Tools.SelectTool"
-              parameter="focus" />
-         </menu_item_call>
-         <menu_item_call
-			label="Move Tool"
-			layout="topleft"
-			name="Move"
-			shortcut="control|2">
-           <menu_item_call.on_click
-              function="Tools.SelectTool"
-              parameter="move" />
-         </menu_item_call>
-         <menu_item_call
-			label="Edit Tool"
-			layout="topleft"
-			name="Edit"
-			shortcut="control|3">
-           <menu_item_call.on_click
-              function="Tools.SelectTool"
-              parameter="edit" />
-         </menu_item_call>
-         <menu_item_call
-			label="Create Tool"
-			layout="topleft"
-			name="Create"
-			shortcut="control|4">
-           <menu_item_call.on_click
-              function="Tools.SelectTool"
-              parameter="create" />
-         </menu_item_call>
-         <menu_item_call
-			label="Land Tool"
-			layout="topleft"
-			name="Land"
-			shortcut="control|5">
-           <menu_item_call.on_click
-              function="Tools.SelectTool"
-              parameter="land" />
-         </menu_item_call>
-	   </menu>
-        <menu
-         create_jump_keys="true"
-         label="Edit"
-         layout="topleft"
-         name="Edit"
-         tear_off="true">
-            <menu_item_call
-             label="Undo"
-             layout="topleft"
-             name="Undo"
-             shortcut="control|Z">
-                <menu_item_call.on_click
-                 function="Edit.Undo" />
-                <menu_item_call.on_enable
-                 function="Edit.EnableUndo" />
-            </menu_item_call>
-            <menu_item_call
-             label="Redo"
-             layout="topleft"
-             name="Redo"
-             shortcut="control|Y">
-                <menu_item_call.on_click
-                 function="Edit.Redo" />
-                <menu_item_call.on_enable
-                 function="Edit.EnableRedo" />
-            </menu_item_call>
-            <menu_item_separator
-             layout="topleft" />
-            <menu_item_call
-             label="Cut"
-             layout="topleft"
-             name="Cut"
-             shortcut="control|X">
-                <menu_item_call.on_click
-                 function="Edit.Cut" />
-                <menu_item_call.on_enable
-                 function="Edit.EnableCut" />
-            </menu_item_call>
-            <menu_item_call
-             label="Copy"
-             layout="topleft"
-             name="Copy"
-             shortcut="control|C">
-                <menu_item_call.on_click
-                 function="Edit.Copy" />
-                <menu_item_call.on_enable
-                 function="Edit.EnableCopy" />
-            </menu_item_call>
-            <menu_item_call
-             label="Paste"
-             layout="topleft"
-             name="Paste"
-             shortcut="control|V">
-                <menu_item_call.on_click
-                 function="Edit.Paste" />
-                <menu_item_call.on_enable
-                 function="Edit.EnablePaste" />
-            </menu_item_call>
-            <menu_item_call
-             label="Delete"
-             layout="topleft"
-             name="Delete"
-             shortcut="Del">
-                <menu_item_call.on_click
-                 function="Edit.Delete" />
-                <menu_item_call.on_enable
-                 function="Edit.EnableDelete" />
-            </menu_item_call>
-            <menu_item_call
-             label="Duplicate"
-             layout="topleft"
-             name="Duplicate"
-             shortcut="control|D">
-                <menu_item_call.on_click
-                 function="Edit.Duplicate" />
-                <menu_item_call.on_enable
-                 function="Edit.EnableDuplicate" />
-            </menu_item_call>
-            <menu_item_separator
-             layout="topleft" />
-            <menu_item_call
-             label="Select All"
-             layout="topleft"
-             name="Select All"
-             shortcut="control|A">
-                <menu_item_call.on_click
-                 function="Edit.SelectAll" />
-                <menu_item_call.on_enable
-                 function="Edit.EnableSelectAll" />
-            </menu_item_call>
-            <menu_item_call
-             label="Deselect"
-             layout="topleft"
-             name="Deselect"
-             shortcut="control|E">
-                <menu_item_call.on_click
-                 function="Edit.Deselect" />
-                <menu_item_call.on_enable
-                 function="Edit.EnableDeselect" />
-            </menu_item_call>
-        </menu>
-        <menu_item_separator
-           layout="topleft" />
-        <menu_item_call
-           label="Link"
-           layout="topleft"
-           name="Link"
-           shortcut="control|L">
-          <menu_item_call.on_click
-             function="Tools.Link" />
-          <menu_item_call.on_enable
-             function="Tools.EnableLink" />
-        </menu_item_call>
-        <menu_item_call
-           label="Unlink"
-           layout="topleft"
-           name="Unlink"
-           shortcut="control|shift|L">
-          <menu_item_call.on_click
-             function="Tools.Unlink" />
-          <menu_item_call.on_enable
-             function="Tools.EnableUnlink" />
-        </menu_item_call>
-        <menu_item_separator
-           layout="topleft" />
-        <menu_item_call
-           label="Focus on Selection"
-           layout="topleft"
-           name="Focus on Selection"
-           shortcut="H">
-          <menu_item_call.on_click
-             function="Tools.LookAtSelection"
-             parameter="focus" />
-          <menu_item_call.on_enable
-             function="Tools.SomethingSelectedNoHUD" />
-        </menu_item_call>
-        <menu_item_call
-           label="Zoom to Selection"
-           layout="topleft"
-           name="Zoom to Selection"
-           shortcut="shift|H">
-          <menu_item_call.on_click
-             function="Tools.LookAtSelection"
-             parameter="zoom" />
-          <menu_item_call.on_enable
-             function="Tools.SomethingSelectedNoHUD" />
-        </menu_item_call>
-        <menu_item_separator
-           layout="topleft" />
-        <menu
-         create_jump_keys="true"
-         label="Object"
-         layout="topleft"
-         name="Object"
-         tear_off="true">
-          <menu_item_call
-			 label="Buy"
-			 layout="topleft"
-			 name="Menu Object Take"
-			 visible="true">
-			<menu_item_call.on_click
-               function="Tools.BuyOrTake" />
-			<menu_item_call.on_enable
-               function="Tools.EnableBuyOrTake"
-               name="EnableBuyOrTake"
-               parameter="Buy,Take" />
-          </menu_item_call>
-          <menu_item_call
-			 label="Take Copy"
-			 layout="topleft"
-			 name="Take Copy">
-			<menu_item_call.on_click
-               function="Tools.TakeCopy" />
-			<menu_item_call.on_enable
-               function="Tools.EnableTakeCopy" />
-          </menu_item_call>
-          <menu_item_call
-			 label="Save Back to My Inventory"
-			 layout="topleft"
-			 name="Save Object Back to My Inventory">
-			<menu_item_call.on_click
-               function="Tools.SaveToInventory" />
-			<menu_item_call.on_enable
-               function="Tools.EnableSaveToInventory" />
-          </menu_item_call>
-          <menu_item_call
-			 label="Save Back to Object Contents"
-			 layout="topleft"
-			 name="Save Object Back to Object Contents">
-			<menu_item_call.on_click
-               function="Tools.SaveToObjectInventory" />
-			<menu_item_call.on_enable
-               function="Tools.EnableSaveToObjectInventory" />
-          </menu_item_call>
-		</menu>
-        <menu
-           create_jump_keys="true"
-           label="Scripts"
-           layout="topleft"
-           name="Scripts"
-           tear_off="true">
-          <menu_item_call
-             label="Recompile Scripts (Mono)"
-             layout="topleft"
-             name="Mono">
-            <menu_item_call.on_click
-               function="Tools.SelectedScriptAction"
-               parameter="compile mono" />
-            <menu_item_call.on_enable
-               function="EditableSelectedMono" />
-          </menu_item_call>
-          <menu_item_call
-             label="Recompile Scripts (LSL)"
-             layout="topleft"
-             name="LSL">
-            <menu_item_call.on_click
-               function="Tools.SelectedScriptAction"
-               parameter="compile lsl" />
-            <menu_item_call.on_enable
-               function="EditableSelected" />
-          </menu_item_call>
-          <menu_item_call
-             label="Reset Scripts"
-             layout="topleft"
-             name="Reset Scripts">
-            <menu_item_call.on_click
-               function="Tools.SelectedScriptAction"
-               parameter="reset" />
-            <menu_item_call.on_enable
-               function="EditableSelected" />
-          </menu_item_call>
-          <menu_item_call
-             label="Set Scripts to Running"
-             layout="topleft"
-             name="Set Scripts to Running">
-            <menu_item_call.on_click
-               function="Tools.SelectedScriptAction"
-               parameter="start" />
-            <menu_item_call.on_enable
-               function="EditableSelected" />
-          </menu_item_call>
-          <menu_item_call
-             label="Set Scripts to Not Running"
-             layout="topleft"
-             name="Set Scripts to Not Running">
-            <menu_item_call.on_click
-               function="Tools.SelectedScriptAction"
-               parameter="stop" />
-            <menu_item_call.on_enable
-               function="EditableSelected" />
-          </menu_item_call>
-        </menu>
-        <menu_item_separator
-           layout="topleft" />
-        <menu
-         create_jump_keys="true"
-         label="Options"
-         layout="topleft"
-         name="Options"
-         tear_off="true">
-            <menu_item_check
-             label="Edit Linked Parts"
-             layout="topleft"
-             name="Edit Linked Parts">
-                <menu_item_check.on_check
-                 control="EditLinkedParts" />
-                <menu_item_check.on_click
-                 function="Tools.EditLinkedParts"
-                 parameter="EditLinkedParts" />
-                <menu_item_check.on_enable
-                 function="Tools.EnableToolNotPie" />
-            </menu_item_check>
-            <menu_item_call
-             label="Set Default Upload Permissions"
-             layout="topleft"
-             name="perm prefs">
-                <menu_item_call.on_click
-                 function="Floater.Toggle"
-                 parameter="perm_prefs" />
-            </menu_item_call>
-			<menu_item_check
-			   label="Show Advanced Permissions"
-			   layout="topleft"
-			   name="DebugPermissions">
-			  <menu_item_check.on_check
-				 function="CheckControl"
-				 parameter="DebugPermissions" />
-			  <menu_item_check.on_click
-				 function="ToggleControl"
-				 parameter="DebugPermissions" />
-			</menu_item_check>
-            <!--menu_item_call
-             label="Show Script Warning/Error Window"
-             layout="topleft"
-             name="Show Script Warning/Error Window">
-                <menu_item_call.on_click
-                 function="ShowFloater"
-                 parameter="script errors" />
-            </menu_item_call-->
-            <menu_item_separator
-             layout="topleft" />
-            <menu
-             create_jump_keys="true"
-             label="Selection"
-             layout="topleft"
-             name="Selection"
-             tear_off="true">
-                <menu_item_check
-                 label="Select Only My Objects"
-                 layout="topleft"
-                 name="Select Only My Objects">
-                    <menu_item_check.on_check
-                     control="SelectOwnedOnly" />
-                    <menu_item_check.on_click
-                     function="Tools.SelectOnlyMyObjects"
-                     parameter="agents" />
-                </menu_item_check>
-                <menu_item_check
-                 label="Select Only Movable Objects"
-                 layout="topleft"
-                 name="Select Only Movable Objects">
-                    <menu_item_check.on_check
-                     control="SelectMovableOnly" />
-                    <menu_item_check.on_click
-                     function="Tools.SelectOnlyMovableObjects"
-                     parameter="movable" />
-                </menu_item_check>
-                <menu_item_check
-                 label="Select By Surrounding"
-                 layout="topleft"
-                 name="Select By Surrounding">
-                    <menu_item_check.on_check
-                     control="RectangleSelectInclusive" />
-                    <menu_item_check.on_click
-                     function="Tools.SelectBySurrounding" />
-                </menu_item_check>
-            </menu>
-            <menu
-             create_jump_keys="true"
-             label="Show"
-             layout="topleft"
-             name="Show"
-             tear_off="true">
-                <menu_item_check
-                 label="Show Hidden Selection"
-                 layout="topleft"
-                 name="Show Hidden Selection">
-                    <menu_item_check.on_check
-                     control="RenderHiddenSelections" />
-                    <menu_item_check.on_click
-                     function="Tools.ShowHiddenSelection" />
-                </menu_item_check>
-                <menu_item_check
-                 label="Show Light Radius for Selection"
-                 layout="topleft"
-                 name="Show Light Radius for Selection">
-                    <menu_item_check.on_check
-                     control="RenderLightRadius" />
-                    <menu_item_check.on_click
-                     function="Tools.ShowSelectionLightRadius" />
-                </menu_item_check>
-                <menu_item_check
-                 label="Show Selection Beam"
-                 layout="topleft"
-                 name="Show Selection Beam">
-                    <menu_item_check.on_check
-                     control="ShowSelectionBeam" />
-                    <menu_item_check.on_click
-                     function="ToggleControl"
-                     parameter="ShowSelectionBeam" />
-                </menu_item_check>
-            </menu>
-            <menu
-             create_jump_keys="true"
-             label="Grid"
-             layout="topleft"
-             name="Grid"
-             tear_off="true">
-                <menu_item_check
-                 label="Snap to Grid"
-                 layout="topleft"
-                 name="Snap to Grid"
-                 shortcut="G">
-                    <menu_item_check.on_check
-                     control="SnapEnabled" />
-                    <menu_item_check.on_click
-                     function="ToggleControl"
-                     parameter="SnapEnabled" />
-                    <menu_item_check.on_enable
-                     function="Tools.EnableToolNotPie" />
-                </menu_item_check>
-                <menu_item_call
-                 label="Snap Object XY to Grid"
-                 layout="topleft"
-                 name="Snap Object XY to Grid"
-                 shortcut="shift|X">
-                    <menu_item_call.on_click
-                     function="Tools.SnapObjectXY" />
-                    <menu_item_call.on_enable
-                     function="Tools.EnableToolNotPie" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Use Selection for Grid"
-                 layout="topleft"
-                 name="Use Selection for Grid"
-                 shortcut="shift|G">
-                    <menu_item_call.on_click
-                     function="Tools.UseSelectionForGrid" />
-                    <menu_item_call.on_enable
-                     function="SomethingSelected" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Grid Options"
-                 layout="topleft"
-                 name="Grid Options"
-                 shortcut="control|shift|B">
-                    <menu_item_call.on_click
-                     function="Floater.Show"
-                     parameter="build_options" />
-                    <menu_item_call.on_enable
-                     function="Tools.EnableToolNotPie" />
-                </menu_item_call>
-            </menu>
-        </menu>
-        <menu
-         create_jump_keys="true"
-         label="Select Linked Parts"
-         layout="topleft"
-         name="Select Linked Parts"
-         tear_off="true">
-            <menu_item_call
-             label="Select Next Part"
-             layout="topleft"
-             name="Select Next Part"
-	     shortcut="control|.">
-                <menu_item_call.on_click
-                 function="Tools.SelectNextPart"
-                 parameter="next" />
-                <menu_item_call.on_enable
-                 function="Tools.EnableSelectNextPart" />
-            </menu_item_call>
-            <menu_item_call
-             label="Select Previous Part"
-             layout="topleft"
-             name="Select Previous Part"
-	     shortcut="control|,">
-                <menu_item_call.on_click
-                 function="Tools.SelectNextPart"
-                 parameter="previous" />
-                <menu_item_call.on_enable
-                 function="Tools.EnableSelectNextPart" />
-            </menu_item_call>
-            <menu_item_call
-             label="Include Next Part"
-             layout="topleft"
-             name="Include Next Part"
-	     shortcut="control|shift|.">
-                <menu_item_call.on_click
-                 function="Tools.SelectNextPart"
-                 parameter="includenext" />
-                <menu_item_call.on_enable
-                 function="Tools.EnableSelectNextPart" />
-            </menu_item_call>
-            <menu_item_call
-             label="Include Previous Part"
-             layout="topleft"
-             name="Include Previous Part"
-	     shortcut="control|shift|,">
-                <menu_item_call.on_click
-                 function="Tools.SelectNextPart"
-                 parameter="includeprevious" />
-                <menu_item_call.on_enable
-                 function="Tools.EnableSelectNextPart" />
-            </menu_item_call>
-        </menu>
-    </menu>
-    <menu
-     label="Help"
-     layout="topleft"
-     name="Help"
-     tear_off="true">
-        <menu_item_call
-         label="[SECOND_LIFE] Help"
-         layout="topleft"
-         name="Second Life Help"
-         shortcut="F1">
-            <menu_item_call.on_click
-             function="ShowFloater"
-             parameter="help f1" />
-        </menu_item_call>
-        <menu_item_call
-         label="Tutorial"
-         layout="topleft"
-         name="Tutorial">
-            <menu_item_call.on_click
-             function="Floater.Show"
-             parameter="hud" />
-        </menu_item_call>
-        <menu_item_separator
-             layout="topleft" />
-        <menu_item_call
-             label="Report Abuse"
-             layout="topleft"
-             name="Report Abuse">
-                <menu_item_call.on_click
-                 function="ShowFloater"
-                 parameter="complaint reporter" />
-            </menu_item_call>
-        <menu_item_separator
-             layout="topleft" />
-        <menu_item_call
-         label="About [APP_NAME]"
-         layout="topleft"
-         name="About Second Life">
-            <menu_item_call.on_click
-             function="Floater.Show"
-             parameter="sl_about" />
-        </menu_item_call>
-    </menu>
-    <menu
-     label="Advanced"
-     layout="topleft"
-     name="Advanced"
-     tear_off="true"
-     visible="false">
-        <menu_item_check
-         label="Set Away After 30 Minutes"
-         layout="topleft"
-         name="Go Away/AFK When Idle">
-            <menu_item_check.on_check
-             function="CheckControl"
-             parameter="AllowIdleAFK" />
-            <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="AllowIdleAFK" />
-        </menu_item_check>
-        <menu_item_call
-         label="Stop Animating Me"
-         layout="topleft"
-         name="Stop Animating My Avatar">
-            <menu_item_call.on_click
-             function="Tools.StopAllAnimations" />
-        </menu_item_call>
-        <menu_item_call
-         label="Rebake Textures"
-         layout="topleft"
-         name="Rebake Texture"
-         shortcut="control|alt|R">
-            <menu_item_call.on_click
-             function="Advanced.RebakeTextures" />
-        </menu_item_call>
-        <menu_item_call
-           label="Set UI Size to Default"
-           layout="topleft"
-           name="Set UI Size to Default">
-          <menu_item_call.on_click
-             function="View.DefaultUISize" />
-        </menu_item_call>
-        <menu_item_separator/>
-        <menu_item_check
-         label="Limit Select Distance"
-         layout="topleft"
-         name="Limit Select Distance">
-            <menu_item_check.on_check
-             function="CheckControl"
-             parameter="LimitSelectDistance" />
-            <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="LimitSelectDistance" />
-        </menu_item_check>
-        <menu_item_check
-         label="Disable Camera Constraints"
-         layout="topleft"
-         name="Disable Camera Distance">
-            <menu_item_check.on_check
-             function="CheckControl"
-             parameter="DisableCameraConstraints" />
-            <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="DisableCameraConstraints" />
-        </menu_item_check>
-        <menu_item_separator
-         layout="topleft" />
-        <menu_item_check
-         label="High-res Snapshot"
-         layout="topleft"
-         name="HighResSnapshot">
-            <menu_item_check.on_check
-             function="CheckControl"
-             parameter="HighResSnapshot" />
-            <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="HighResSnapshot" />
-        </menu_item_check>
-        <menu_item_check
-         label="Quiet Snapshots to Disk"
-         layout="topleft"
-         name="QuietSnapshotsToDisk">
-            <menu_item_check.on_check
-             function="CheckControl"
-             parameter="QuietSnapshotsToDisk" />
-            <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="QuietSnapshotsToDisk" />
-        </menu_item_check>
-        <menu_item_check
-         label="Compress Snapshots to Disk"
-         layout="topleft"
-         name="CompressSnapshotsToDisk">
-            <menu_item_check.on_check
-             function="CheckControl"
-             parameter="CompressSnapshotsToDisk" />
-            <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="CompressSnapshotsToDisk" />
-        </menu_item_check>
-        <menu_item_call
-         label="Save Texture As"
-         layout="topleft"
-         name="Save Texture As">
-            <menu_item_call.on_click
-             function="File.SaveTexture" />
-            <menu_item_call.on_enable
-             function="File.EnableSaveAs" />
-        </menu_item_call>
-        <menu_item_separator
-         layout="topleft" />
-        <menu
-         create_jump_keys="true"
-         label="Performance Tools"
-         layout="topleft"
-         name="Performance Tools"
-         tear_off="true">
-            <menu_item_call
-             label="Lag Meter"
-             layout="topleft"
-             name="Lag Meter">
-                <menu_item_call.on_click
-                 function="Floater.Show"
-                 parameter="lagmeter" />
-            </menu_item_call>
-            <menu_item_check
-             label="Statistics Bar"
-             layout="topleft"
-             name="Statistics Bar"
-             shortcut="control|shift|1">
-                <menu_item_check.on_check
-                 function="Floater.Visible"
-                 parameter="stats" />
-                <menu_item_check.on_click
-                 function="Floater.Toggle"
-                 parameter="stats" />
-            </menu_item_check>
-      <menu_item_check
-        label="Show Avatar Rendering Cost"
-        layout="topleft"
-        name="Avatar Rendering Cost">
-           <menu_item_check.on_check
-            function="Advanced.CheckInfoDisplay"
-            parameter="shame" />
-           <menu_item_check.on_click
-            function="Advanced.ToggleInfoDisplay"
-            parameter="shame" />
-       </menu_item_check>
-        </menu>
-        <menu
-         create_jump_keys="true"
-         label="Highlighting and Visibility"
-         layout="topleft"
-         name="Highlighting and Visibility"
-         tear_off="true">
-         <menu_item_check
-                 label="Cheesy Beacon"
-                 layout="topleft"
-                 name="Cheesy Beacon">
-                    <menu_item_check.on_check
-                     function="CheckControl"
-                     parameter="CheesyBeacon" />
-                    <menu_item_check.on_click
-                     function="ToggleControl"
-                     parameter="CheesyBeacon" />
-                </menu_item_check>
-            <menu_item_check
-             label="Hide Particles"
-             layout="topleft"
-             name="Hide Particles"
-             shortcut="control|alt|shift|=">
-                <menu_item_check.on_check
-                 function="View.CheckRenderType"
-                 parameter="hideparticles" />
-                <menu_item_check.on_click
-                 function="View.ToggleRenderType"
-                 parameter="hideparticles" />
-            </menu_item_check>
-            <menu_item_check
-             label="Hide Selected"
-             layout="topleft"
-             name="Hide Selected">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="HideSelectedObjects" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="HideSelectedObjects" />
-            </menu_item_check>
-            <menu_item_check
-             label="Highlight Transparent"
-             layout="topleft"
-             name="Highlight Transparent"
-             shortcut="control|alt|T">
-                <menu_item_check.on_check
-                 function="View.CheckHighlightTransparent" />
-                <menu_item_check.on_click
-                 function="View.HighlightTransparent" />
-            </menu_item_check>
-            <menu_item_check
-             label="Show HUD Attachments"
-             layout="topleft"
-             name="Show HUD Attachments"
-             shortcut="alt|shift|H">
-                <menu_item_check.on_check
-                 function="View.CheckHUDAttachments" />
-                <menu_item_check.on_click
-                 function="View.ShowHUDAttachments" />
-            </menu_item_check>
-            <menu_item_check
-             label="Show Mouselook Crosshairs"
-             layout="topleft"
-             name="ShowCrosshairs">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="ShowCrosshairs" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="ShowCrosshairs" />
-            </menu_item_check>
-  <!-- <menu
-         create_jump_keys="true"
-         label="Hover Tips"
-         layout="topleft"
-         name="Hover Tips"
-         tear_off="true">
-            <menu_item_check
-             label="Show Tips"
-             layout="topleft"
-             name="Show Tips"
-             shortcut="control|shift|T">
-                <menu_item_check.on_check
-                 function="View.CheckShowHoverTips" />
-                <menu_item_check.on_click
-                 function="View.ShowHoverTips" />
-            </menu_item_check>
-            <menu_item_separator
-             layout="topleft" />-->
-            <menu_item_check
-             label="Show Land Tooltips"
-             layout="topleft"
-             name="Land Tips">
-                <menu_item_check.on_check
-                 control="ShowLandHoverTip" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="ShowLandHoverTip" />
-                <menu_item_check.on_enable
-                 function="View.CheckShowHoverTips" />
-            </menu_item_check>
- <!--           <menu_item_check
-             label="Show Tips On All Objects"
-             layout="topleft"
-             name="Tips On All Objects">
-                <menu_item_check.on_check
-                 control="ShowAllObjectHoverTip" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="ShowAllObjectHoverTip" />
-                <menu_item_check.on_enable
-                 function="View.CheckShowHoverTips" />
-            </menu_item_check>
-        </menu>-->
-
-        </menu>
-
-        <menu
-         create_jump_keys="true"
-         label="Rendering Types"
-         layout="topleft"
-         name="Rendering Types"
-         tear_off="true">
-            <menu_item_check
-             label="Simple"
-             layout="topleft"
-             name="Simple"
-             shortcut="control|alt|shift|1">
-                <menu_item_check.on_check
-                 function="Advanced.CheckRenderType"
-                 parameter="simple" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleRenderType"
-                 parameter="simple" />
-            </menu_item_check>
-            <menu_item_check
-             label="Alpha"
-             layout="topleft"
-             name="Alpha"
-             shortcut="control|alt|shift|2">
-                <menu_item_check.on_check
-                 function="Advanced.CheckRenderType"
-                 parameter="alpha" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleRenderType"
-                 parameter="alpha" />
-            </menu_item_check>
-            <menu_item_check
-             label="Tree"
-             layout="topleft"
-             name="Tree"
-             shortcut="control|alt|shift|3">
-                <menu_item_check.on_check
-                 function="Advanced.CheckRenderType"
-                 parameter="tree" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleRenderType"
-                 parameter="tree" />
-            </menu_item_check>
-            <menu_item_check
-             label="Avatars"
-             layout="topleft"
-             name="Character"
-             shortcut="control|alt|shift|4">
-                <menu_item_check.on_check
-                 function="Advanced.CheckRenderType"
-                 parameter="character" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleRenderType"
-                 parameter="character" />
-            </menu_item_check>
-            <menu_item_check
-             label="SurfacePath"
-             layout="topleft"
-             name="SurfacePath"
-             shortcut="control|alt|shift|5">
-                <menu_item_check.on_check
-                 function="Advanced.CheckRenderType"
-                 parameter="surfacePath" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleRenderType"
-                 parameter="surfacePath" />
-            </menu_item_check>
-            <menu_item_check
-             label="Sky"
-             layout="topleft"
-             name="Sky"
-             shortcut="control|alt|shift|6">
-                <menu_item_check.on_check
-                 function="Advanced.CheckRenderType"
-                 parameter="sky" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleRenderType"
-                 parameter="sky" />
-            </menu_item_check>
-            <menu_item_check
-             label="Water"
-             layout="topleft"
-             name="Water"
-             shortcut="control|alt|shift|7">
-                <menu_item_check.on_check
-                 function="Advanced.CheckRenderType"
-                 parameter="water" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleRenderType"
-                 parameter="water" />
-            </menu_item_check>
-            <menu_item_check
-             label="Ground"
-             layout="topleft"
-             name="Ground"
-             shortcut="control|alt|shift|8">
-                <menu_item_check.on_check
-                 function="Advanced.CheckRenderType"
-                 parameter="ground" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleRenderType"
-                 parameter="ground" />
-            </menu_item_check>
-            <menu_item_check
-             label="Volume"
-             layout="topleft"
-             name="Volume"
-             shortcut="control|alt|shift|9">
-                <menu_item_check.on_check
-                 function="Advanced.CheckRenderType"
-                 parameter="volume" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleRenderType"
-                 parameter="volume" />
-            </menu_item_check>
-            <menu_item_check
-             label="Grass"
-             layout="topleft"
-             name="Grass"
-             shortcut="control|alt|shift|0">
-                <menu_item_check.on_check
-                 function="Advanced.CheckRenderType"
-                 parameter="grass" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleRenderType"
-                 parameter="grass" />
-            </menu_item_check>
-            <menu_item_check
-             label="Clouds"
-             layout="topleft"
-             name="Clouds"
-             shortcut="control|alt|shift|-">
-                <menu_item_check.on_check
-                 function="Advanced.CheckRenderType"
-                 parameter="clouds" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleRenderType"
-                 parameter="clouds" />
-            </menu_item_check>
-            <menu_item_check
-             label="Particles"
-             layout="topleft"
-             name="Particles"
-             shortcut="control|alt|shift|=">
-                <menu_item_check.on_check
-                 function="Advanced.CheckRenderType"
-                 parameter="particles" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleRenderType"
-                 parameter="particles" />
-            </menu_item_check>
-            <menu_item_check
-             label="Bump"
-             layout="topleft"
-             name="Bump"
-             shortcut="control|alt|shift|\">
-                <menu_item_check.on_check
-                 function="Advanced.CheckRenderType"
-                 parameter="bump" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleRenderType"
-                 parameter="bump" />
-            </menu_item_check>
-        </menu>
-        <menu
-         create_jump_keys="true"
-         label="Rendering Features"
-         layout="topleft"
-         name="Rendering Features"
-         tear_off="true">
-            <menu_item_check
-             label="UI"
-             layout="topleft"
-             name="UI"
-             shortcut="control|alt|F1">
-                <menu_item_check.on_check
-                 function="Advanced.CheckFeature"
-                 parameter="ui" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleFeature"
-                 parameter="ui" />
-            </menu_item_check>
-            <menu_item_check
-             label="Selected"
-             layout="topleft"
-             name="Selected"
-             shortcut="control|alt|F2">
-                <menu_item_check.on_check
-                 function="Advanced.CheckFeature"
-                 parameter="selected" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleFeature"
-                 parameter="selected" />
-            </menu_item_check>
-            <menu_item_check
-             label="Highlighted"
-             layout="topleft"
-             name="Highlighted"
-             shortcut="control|alt|F3">
-                <menu_item_check.on_check
-                 function="Advanced.CheckFeature"
-                 parameter="highlighted" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleFeature"
-                 parameter="highlighted" />
-            </menu_item_check>
-            <menu_item_check
-             label="Dynamic Textures"
-             layout="topleft"
-             name="Dynamic Textures"
-             shortcut="control|alt|F4">
-                <menu_item_check.on_check
-                 function="Advanced.CheckFeature"
-                 parameter="dynamic textures" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleFeature"
-                 parameter="dynamic textures" />
-            </menu_item_check>
-            <menu_item_check
-             label="Foot Shadows"
-             layout="topleft"
-             name="Foot Shadows"
-             shortcut="control|alt|F5">
-                <menu_item_check.on_check
-                 function="Advanced.CheckFeature"
-                 parameter="foot shadows" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleFeature"
-                 parameter="foot shadows" />
-            </menu_item_check>
-            <menu_item_check
-             label="Fog"
-             layout="topleft"
-             name="Fog"
-             shortcut="control|alt|F6">
-                <menu_item_check.on_check
-                 function="Advanced.CheckFeature"
-                 parameter="fog" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleFeature"
-                 parameter="fog" />
-            </menu_item_check>
-            <menu_item_check
-             label="Test FRInfo"
-             layout="topleft"
-             name="Test FRInfo"
-             shortcut="control|alt|F8">
-                <menu_item_check.on_check
-                 function="Advanced.CheckFeature"
-                 parameter="fr info" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleFeature"
-                 parameter="fr info" />
-            </menu_item_check>
-            <menu_item_check
-             label="Flexible Objects"
-             layout="topleft"
-             name="Flexible Objects"
-             shortcut="control|alt|F9">
-                <menu_item_check.on_check
-                 function="Advanced.CheckFeature"
-                 parameter="flexible" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleFeature"
-                 parameter="flexible" />
-            </menu_item_check>
-        </menu>
-        <menu_item_check
-         label="Run Multiple Threads"
-         layout="topleft"
-         name="Run Multiple Threads">
-            <menu_item_check.on_check
-             function="CheckControl"
-             parameter="RunMultipleThreads" />
-            <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="RunMultipleThreads" />
-        </menu_item_check>
-        <menu_item_call
-         label="Clear Group Cache"
-         layout="topleft"
-         name="ClearGroupCache">
-            <menu_item_call.on_click
-             function="Advanced.ClearGroupCache"
-             parameter="ClearGroupCache" />
-        </menu_item_call>
-        <menu_item_check
-         label="Mouse Smoothing"
-         layout="topleft"
-         name="Mouse Smoothing">
-            <menu_item_check.on_check
-             function="CheckControl"
-             parameter="MouseSmooth" />
-            <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="MouseSmooth" />
-        </menu_item_check>
-        <menu_item_separator
-         layout="topleft" />
-        <menu
-         label="Shortcuts"
-         layout="topleft"
-         name="Shortcuts"
-         tear_off="true"
-         visible="false">
-            <menu_item_check
-               label="Search"
-               layout="topleft"
-               name="Search"
-               shortcut="control|F">
-            <menu_item_check.on_check
-             function="Floater.Visible"
-             parameter="search" />
-            <menu_item_check.on_click
-             function="Floater.Toggle"
-             parameter="search" />
-            </menu_item_check>
-            <menu_item_call
-             enabled="false"
-             label="Release Keys"
-             layout="topleft"
-             name="Release Keys">
-                <menu_item_call.on_click
-                 function="Tools.ReleaseKeys"
-                 parameter="" />
-                <menu_item_call.on_enable
-                 function="Tools.EnableReleaseKeys"
-                 parameter="" />
-            </menu_item_call>
-            <menu_item_call
-             label="Set UI Size to Default"
-             layout="topleft"
-             name="Set UI Size to Default">
-                <menu_item_call.on_click
-                 function="View.DefaultUISize" />
-            </menu_item_call>
-            <menu_item_separator
-             layout="topleft" />
-            <menu_item_check
-             label="Always Run"
-             layout="topleft"
-             name="Always Run"
-             shortcut="control|R">
-                <menu_item_check.on_check
-                 function="World.CheckAlwaysRun" />
-                <menu_item_check.on_click
-                 function="World.AlwaysRun" />
-            </menu_item_check>
-            <menu_item_check
-             label="Fly"
-             layout="topleft"
-             name="Fly"
-             shortcut="Home">
-                <menu_item_check.on_click
-                 function="Agent.toggleFlying" />
-                <menu_item_check.on_enable
-                 function="Agent.enableFlying" />
-            </menu_item_check>
-            <menu_item_separator
-             layout="topleft" />
-            <menu_item_call
-             label="Close Window"
-             layout="topleft"
-             name="Close Window"
-             shortcut="control|W">
-                <menu_item_call.on_click
-                 function="File.CloseWindow" />
-                <menu_item_call.on_enable
-                 function="File.EnableCloseWindow" />
-            </menu_item_call>
-            <menu_item_call
-             label="Close All Windows"
-             layout="topleft"
-             name="Close All Windows"
-             shortcut="control|shift|W">
-                <menu_item_call.on_click
-                 function="File.CloseAllWindows" />
-                <menu_item_call.on_enable
-                 function="File.EnableCloseAllWindows" />
-            </menu_item_call>
-            <menu_item_separator
-             layout="topleft" />
-            <menu_item_call
-             label="Snapshot to Disk"
-             layout="topleft"
-             name="Snapshot to Disk"
-             shortcut="control|`"
-             use_mac_ctrl="true">
-                <menu_item_call.on_click
-                 function="File.TakeSnapshotToDisk" />
-            </menu_item_call>
-            <menu_item_separator
-             layout="topleft" />
-            <menu_item_call
-             label="Mouselook"
-             layout="topleft"
-             name="Mouselook"
-             shortcut="M">
-                <menu_item_call.on_click
-                 function="View.Mouselook" />
-                <menu_item_call.on_enable
-                 function="View.EnableMouselook" />
-            </menu_item_call>
-            <menu_item_check
-             label="Joystick Flycam"
-             layout="topleft"
-             name="Joystick Flycam"
-             shortcut="alt|shift|F">
-                <menu_item_check.on_check
-                 function="View.CheckJoystickFlycam" />
-                <menu_item_check.on_click
-                 function="View.JoystickFlycam" />
-                <menu_item_check.on_enable
-                 function="View.EnableJoystickFlycam" />
-            </menu_item_check>
-            <menu_item_call
-             label="Reset View"
-             layout="topleft"
-             name="Reset View"
-             shortcut="Esc">
-                <menu_item_call.on_click
-                 function="View.ResetView" />
-            </menu_item_call>
-            <menu_item_call
-             label="Look at Last Chatter"
-             layout="topleft"
-             name="Look at Last Chatter"
-             shortcut="control|\">
-                <menu_item_call.on_click
-                 function="View.LookAtLastChatter" />
-                <menu_item_call.on_enable
-                 function="View.EnableLastChatter" />
-            </menu_item_call>
-            <menu_item_separator
-             layout="topleft" />
-            <menu
-             create_jump_keys="true"
-             label="Select Build Tool"
-             layout="topleft"
-             name="Select Tool"
-             tear_off="true">
-                <menu_item_call
-                 label="Focus Tool"
-                 layout="topleft"
-                 name="Focus"
-                 shortcut="control|1">
-                    <menu_item_call.on_click
-                     function="Tools.SelectTool"
-                     parameter="focus" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Move Tool"
-                 layout="topleft"
-                 name="Move"
-                 shortcut="control|2">
-                    <menu_item_call.on_click
-                     function="Tools.SelectTool"
-                     parameter="move" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Edit Tool"
-                 layout="topleft"
-                 name="Edit"
-                 shortcut="control|3">
-                    <menu_item_call.on_click
-                     function="Tools.SelectTool"
-                     parameter="edit" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Create Tool"
-                 layout="topleft"
-                 name="Create"
-                 shortcut="control|4">
-                    <menu_item_call.on_click
-                     function="Tools.SelectTool"
-                     parameter="create" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Land Tool"
-                 layout="topleft"
-                 name="Land"
-                 shortcut="control|5">
-                    <menu_item_call.on_click
-                     function="Tools.SelectTool"
-                     parameter="land" />
-                </menu_item_call>
-            </menu>
-            <menu_item_separator
-             layout="topleft" />
-            <menu_item_call
-             label="Zoom In"
-             layout="topleft"
-             name="Zoom In"
-             shortcut="control|0">
-                <menu_item_call.on_click
-                 function="View.ZoomIn" />
-            </menu_item_call>
-            <menu_item_call
-             label="Zoom Default"
-             layout="topleft"
-             name="Zoom Default"
-             shortcut="control|9">
-                <menu_item_call.on_click
-                 function="View.ZoomDefault" />
-            </menu_item_call>
-            <menu_item_call
-             label="Zoom Out"
-             layout="topleft"
-             name="Zoom Out"
-             shortcut="control|8">
-                <menu_item_call.on_click
-                 function="View.ZoomOut" />
-            </menu_item_call>
-            <menu_item_separator
-             layout="topleft" />
-            <menu_item_call
-             label="Toggle Fullscreen"
-             layout="topleft"
-             name="Toggle Fullscreen"
-             >
-               <!-- Note: shortcut="alt|Enter" was deleted from the preceding node-->
-                <menu_item_call.on_click
-                 function="View.Fullscreen" />
-            </menu_item_call>
-        </menu>
-        <menu_item_separator
-         layout="topleft" />
-        <menu_item_call
-         label="Show Debug Settings"
-         layout="topleft"
-         name="Debug Settings">
-            <menu_item_call.on_click
-             function="Advanced.ShowDebugSettings"
-             parameter="all" />
-        </menu_item_call>
-     <menu_item_check
-         label="Show Develop Menu"
-         layout="topleft"
-         name="Debug Mode"
-         shortcut="control|alt|Q">
-            <menu_item_check.on_check
-             function="CheckControl"
-             parameter="QAMode" />
-            <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="QAMode" />
-        </menu_item_check>
-    </menu>
-    <menu
-     create_jump_keys="true"
-     label="Develop"
-     layout="topleft"
-     name="Develop"
-     tear_off="true"
-     visible="false">
-        <menu
-         create_jump_keys="true"
-         label="Consoles"
-         layout="topleft"
-         name="Consoles"
-         tear_off="true">
-            <menu_item_check
-             label="Texture Console"
-             layout="topleft"
-             name="Texture Console"
-             shortcut="control|shift|3"
-             use_mac_ctrl="true">
-                <menu_item_check.on_check
-                 function="Advanced.CheckConsole"
-                 parameter="texture" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleConsole"
-                 parameter="texture" />
-            </menu_item_check>
-            <menu_item_check
-             label="Debug Console"
-             layout="topleft"
-             name="Debug Console"
-             shortcut="control|shift|4"
-             use_mac_ctrl="true">
-                <menu_item_check.on_check
-                 function="Advanced.CheckConsole"
-                 parameter="debug" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleConsole"
-                 parameter="debug" />
-            </menu_item_check>
-            <menu_item_call
-             label="Notifications Console"
-             layout="topleft"
-             name="Notifications"
-             shortcut="control|shift|5">
-              <menu_item_call.on_click
-               function="Floater.Toggle"
-               parameter="notifications_console" />
-            </menu_item_call>
-            <menu_item_check
-               label="Texture Size Console"
-               layout="topleft"
-               name="Texture Size"
-               shortcut="control|shift|6">
-              <menu_item_check.on_check
-               function="Advanced.CheckConsole"
-               parameter="texture size" />
-              <menu_item_check.on_click
-               function="Advanced.ToggleConsole"
-               parameter="texture size" />
-            </menu_item_check>
-            <menu_item_check
-               label="Texture Category Console"
-               layout="topleft"
-               name="Texture Category"
-               shortcut="control|shift|7">
-              <menu_item_check.on_check
-               function="Advanced.CheckConsole"
-               parameter="texture category" />
-              <menu_item_check.on_click
-               function="Advanced.ToggleConsole"
-               parameter="texture category" />
-            </menu_item_check>
-            <menu_item_check
-             label="Fast Timers"
-             layout="topleft"
-             name="Fast Timers"
-             shortcut="control|shift|9"
-             use_mac_ctrl="true">
-                <menu_item_check.on_check
-                 function="Advanced.CheckConsole"
-                 parameter="fast timers" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleConsole"
-                 parameter="fast timers" />
-            </menu_item_check>
-            <menu_item_check
-             label="Memory"
-             layout="topleft"
-             name="Memory"
-             shortcut="control|shift|0"
-             use_mac_ctrl="true">
-                <menu_item_check.on_check
-                 function="Advanced.CheckConsole"
-                 parameter="memory view" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleConsole"
-                 parameter="memory view" />
-            </menu_item_check>
-            <menu_item_separator
-             layout="topleft" />
-            <menu_item_call
-             label="Region Info to Debug Console"
-             layout="topleft"
-             name="Region Info to Debug Console">
-                <menu_item_call.on_click
-                 function="Advanced.DumpInfoToConsole"
-                 parameter="region" />
-            </menu_item_call>
-            <menu_item_call
-             label="Group Info to Debug Console"
-             layout="topleft"
-             name="Group Info to Debug Console">
-                <menu_item_call.on_click
-                 function="Advanced.DumpInfoToConsole"
-                 parameter="group" />
-            </menu_item_call>
-            <menu_item_call
-             label="Capabilities Info to Debug Console"
-             layout="topleft"
-             name="Capabilities Info to Debug Console">
-                <menu_item_call.on_click
-                 function="Advanced.DumpInfoToConsole"
-                 parameter="capabilities" />
-            </menu_item_call>
-            <menu_item_separator
-         layout="topleft" />
-            <menu_item_check
-             label="Camera"
-             layout="topleft"
-             name="Camera">
-                <menu_item_check.on_check
-                 function="Advanced.CheckHUDInfo"
-                 parameter="camera" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleHUDInfo"
-                 parameter="camera" />
-            </menu_item_check>
-            <menu_item_check
-             label="Wind"
-             layout="topleft"
-             name="Wind">
-                <menu_item_check.on_check
-                 function="Advanced.CheckHUDInfo"
-                 parameter="wind" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleHUDInfo"
-                 parameter="wind" />
-            </menu_item_check>
-            <menu_item_check
-             label="FOV"
-             layout="topleft"
-             name="FOV">
-                <menu_item_check.on_check
-                 function="Advanced.CheckHUDInfo"
-                 parameter="fov" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleHUDInfo"
-                 parameter="fov" />
-            </menu_item_check>
-        </menu>
-        <menu
-         create_jump_keys="true"
-         label="Show Info"
-         layout="topleft"
-         name="Display Info"
-         tear_off="true">
-            <menu_item_check
-             label="Show Time"
-             layout="topleft"
-             name="Show Time">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="DebugShowTime" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="DebugShowTime" />
-            </menu_item_check>
-            <menu_item_check
-             label="Show Render Info"
-             layout="topleft"
-             name="Show Render Info">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="DebugShowRenderInfo" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="DebugShowRenderInfo" />
-            </menu_item_check>
-            <menu_item_check
-             label="Show Matrices"
-             layout="topleft"
-             name="Show Matrices">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="DebugShowRenderMatrices" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="DebugShowRenderMatrices" />
-            </menu_item_check>
-            <menu_item_check
-             label="Show Color Under Cursor"
-             layout="topleft"
-             name="Show Color Under Cursor">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="DebugShowColor" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="DebugShowColor" />
-            </menu_item_check>
-            <menu_item_separator
-             layout="topleft" />
-            <menu_item_check
-             label="Show Updates to Objects"
-             layout="topleft"
-             name="Show Updates"
-             shortcut="control|alt|shift|U">
-                <menu_item_check.on_check
-                 function="Advanced.CheckShowObjectUpdates"
-                 parameter="ObjectUpdates" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleShowObjectUpdates" />
-            </menu_item_check>
-        </menu>
-        <menu_item_separator
-         layout="topleft" />
-        <menu
-         create_jump_keys="true"
-         label="Force an Error"
-         layout="topleft"
-         name="Force Errors"
-         tear_off="true">
-            <menu_item_call
-             label="Force Breakpoint"
-             layout="topleft"
-             name="Force Breakpoint"
-             shortcut="control|alt|shift|B">
-                <menu_item_call.on_click
-                 function="Advanced.ForceErrorBreakpoint" />
-            </menu_item_call>
-            <menu_item_call
-             label="Force LLError And Crash"
-             layout="topleft"
-             name="Force LLError And Crash">
-                <menu_item_call.on_click
-                 function="Advanced.ForceErrorLlerror" />
-            </menu_item_call>
-            <menu_item_call
-             label="Force Bad Memory Access"
-             layout="topleft"
-             name="Force Bad Memory Access">
-                <menu_item_call.on_click
-                 function="Advanced.ForceErrorBadMemoryAccess" />
-            </menu_item_call>
-            <menu_item_call
-             label="Force Infinite Loop"
-             layout="topleft"
-             name="Force Infinite Loop">
-                <menu_item_call.on_click
-                 function="Advanced.ForceErrorInfiniteLoop" />
-            </menu_item_call>
-            <menu_item_call
-             label="Force Driver Crash"
-             layout="topleft"
-             name="Force Driver Carsh">
-                <menu_item_call.on_click
-                 function="Advanced.ForceErrorDriverCrash" />
-            </menu_item_call>
-            <menu_item_call
-             label="Force Software Exception"
-             layout="topleft"
-             name="Force Software Exception">
-                <menu_item_call.on_click
-                 function="Advanced.ForceErrorSoftwareException" />
-            </menu_item_call>
-            <menu_item_call
-             label="Force Disconnect Viewer"
-             layout="topleft"
-             name="Force Disconnect Viewer">
-                <menu_item_call.on_click
-                 function="Advanced.ForceErrorDisconnectViewer" />
-            </menu_item_call>
-            <menu_item_call
-             label="Simulate a Memory Leak..."
-             layout="topleft"
-             name="Memory Leaking Simulation">
-               <menu_item_call.on_click
-                function="Floater.Show"
-                parameter="mem_leaking" />
-               </menu_item_call>
-        </menu>
-        <menu
-         create_jump_keys="true"
-         label="Render Tests"
-         layout="topleft"
-         name="Render Tests"
-         tear_off="true">
-            <menu_item_check
-             label="Camera Offset"
-             layout="topleft"
-             name="Camera Offset">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="CameraOffset" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="CameraOffset" />
-            </menu_item_check>
-            <menu_item_check
-             label="Randomize Framerate"
-             layout="topleft"
-             name="Randomize Framerate">
-                <menu_item_check.on_check
-                 function="Advanced.CheckRandomizeFramerate"
-                 parameter="Randomize Framerate" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleRandomizeFramerate" />
-            </menu_item_check>
-            <menu_item_check
-             label="Periodic Slow Frame"
-             layout="topleft"
-             name="Periodic Slow Frame">
-                <menu_item_check.on_check
-                 function="Advanced.CheckPeriodicSlowFrame"
-                 parameter="points" />
-                <menu_item_check.on_click
-                 function="Advanced.TogglePeriodicSlowFrame"
-                 parameter="points" />
-            </menu_item_check>
-            <menu_item_check
-             label="Frame Test"
-             layout="topleft"
-             name="Frame Test">
-                <menu_item_check.on_check
-                 function="Advanced.CheckFrameTest"
-                 parameter="Frame Test" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleFrameTest" />
-            </menu_item_check>
-        </menu>
-      <menu
-        create_jump_keys="true"
-        label="Render Metadata"
-        layout="topleft"
-        name="Render Metadata"
-        tear_off="true">
-        <menu_item_check
-         label="Bounding Boxes"
-         layout="topleft"
-         name="Bounding Boxes">
-        <menu_item_check.on_check
-         function="Advanced.CheckInfoDisplay"
-         parameter="bboxes" />
-        <menu_item_check.on_click
-         function="Advanced.ToggleInfoDisplay"
-         parameter="bboxes" />
-        </menu_item_check>
-        <menu_item_check
-         label="Octree"
-         layout="topleft"
-         name="Octree">
-          <menu_item_check.on_check
-           function="Advanced.CheckInfoDisplay"
-           parameter="octree" />
-          <menu_item_check.on_click
-           function="Advanced.ToggleInfoDisplay"
-           parameter="octree" />
-        </menu_item_check>
-        <menu_item_check
-         label="Shadow Frusta"
-         layout="topleft"
-         name="Shadow Frusta">
-          <menu_item_check.on_check
-           function="Advanced.CheckInfoDisplay"
-           parameter="shadow frusta" />
-          <menu_item_check.on_click
-           function="Advanced.ToggleInfoDisplay"
-           parameter="shadow frusta" />
-        </menu_item_check>
-        <menu_item_check
-         label="Occlusion"
-         layout="topleft"
-         name="Occlusion">
-          <menu_item_check.on_check
-           function="Advanced.CheckInfoDisplay"
-           parameter="occlusion" />
-          <menu_item_check.on_click
-           function="Advanced.ToggleInfoDisplay"
-           parameter="occlusion" />
-        </menu_item_check>
-        <menu_item_check
-         label="Render Batches"
-         layout="topleft"
-         name="Render Batches">
-          <menu_item_check.on_check
-           function="Advanced.CheckInfoDisplay"
-           parameter="render batches" />
-          <menu_item_check.on_click
-           function="Advanced.ToggleInfoDisplay"
-           parameter="render batches" />
-        </menu_item_check>
-        <menu_item_check
-         label="Texture Anim"
-         layout="topleft"
-         name="Texture Anim">
-          <menu_item_check.on_check
-           function="Advanced.CheckInfoDisplay"
-           parameter="texture anim" />
-          <menu_item_check.on_click
-           function="Advanced.ToggleInfoDisplay"
-           parameter="texture anim" />
-        </menu_item_check>
-        <menu_item_check
-         label="Texture Priority"
-         layout="topleft"
-         name="Texture Priority">
-          <menu_item_check.on_check
-           function="Advanced.CheckInfoDisplay"
-           parameter="texture priority" />
-          <menu_item_check.on_click
-           function="Advanced.ToggleInfoDisplay"
-           parameter="texture priority" />
-        </menu_item_check>
-        <menu_item_check
-         label="Texture Area"
-         layout="topleft"
-         name="Texture Area">
-          <menu_item_check.on_check
-           function="Advanced.CheckInfoDisplay"
-           parameter="texture area" />
-          <menu_item_check.on_click
-           function="Advanced.ToggleInfoDisplay"
-           parameter="texture area" />
-        </menu_item_check>
-        <menu_item_check
-         label="Face Area"
-         layout="topleft"
-         name="Face Area">
-          <menu_item_check.on_check
-           function="Advanced.CheckInfoDisplay"
-           parameter="face area" />
-          <menu_item_check.on_click
-           function="Advanced.ToggleInfoDisplay"
-           parameter="face area" />
-        </menu_item_check>
-        <menu_item_check
-         label="Lights"
-         layout="topleft"
-         name="Lights">
-          <menu_item_check.on_check
-           function="Advanced.CheckInfoDisplay"
-           parameter="lights" />
-          <menu_item_check.on_click
-           function="Advanced.ToggleInfoDisplay"
-           parameter="lights" />
-        </menu_item_check>
-        <menu_item_check
-         label="Collision Skeleton"
-         layout="topleft"
-         name="Collision Skeleton">
-          <menu_item_check.on_check
-           function="Advanced.CheckInfoDisplay"
-           parameter="collision skeleton" />
-          <menu_item_check.on_click
-           function="Advanced.ToggleInfoDisplay"
-           parameter="collision skeleton" />
-        </menu_item_check>
-        <menu_item_check
-         label="Raycast"
-         layout="topleft"
-         name="Raycast">
-          <menu_item_check.on_check
-           function="Advanced.CheckInfoDisplay"
-           parameter="raycast" />
-          <menu_item_check.on_click
-           function="Advanced.ToggleInfoDisplay"
-           parameter="raycast" />
-        </menu_item_check>
-      </menu>
-        <menu
-         create_jump_keys="true"
-         label="Rendering"
-         layout="topleft"
-         name="Rendering"
-         tear_off="true">
-            <menu_item_check
-             label="Axes"
-             name="Axes">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="ShowAxes" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="ShowAxes" />
-            </menu_item_check>
-            <menu_item_check
-             label="Tangent Basis"
-             name="Tangent Basis">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="ShowTangentBasis" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="ShowTangentBasis" />
-            </menu_item_check>
-            <menu_item_call
-             label="Selected Texture Info Basis"
-             name="Selected Texture Info Basis"
-             shortcut="control|alt|shift|T">
-                <menu_item_call.on_click
-                 function="Advanced.SelectedTextureInfo" />
-            </menu_item_call>
-            <menu_item_check
-             label="Wireframe"
-             name="Wireframe"
-             shortcut="control|shift|R">
-                <menu_item_check.on_check
-                 function="Advanced.CheckWireframe"
-                 parameter="Wireframe" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleWireframe" />
-            </menu_item_check>
-            <menu_item_check
-             label="Object-Object Occlusion"
-             name="Object-Object Occlusion"
-             shortcut="control|shift|O">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="UseOcclusion" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="UseOcclusion" />
-                <menu_item_check.on_enable
-                 function="Advanced.EnableObjectObjectOcclusion" />
-            </menu_item_check>
-          <menu_item_check
-             label="Framebuffer Objects"
-             name="Framebuffer Objects">
-            <menu_item_check.on_check
-             function="CheckControl"
-             parameter="RenderUseFBO" />
-            <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="RenderUseFBO" />
-            <menu_item_check.on_enable
-                 function="Advanced.EnableRenderFBO" />
-           </menu_item_check>
-          <menu_item_check
-                       label="Deferred Rendering"
-                       name="Deferred Rendering">
-            <menu_item_check.on_check
-             function="CheckControl"
-             parameter="RenderDeferred" />
-            <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="RenderDeferred" />
-            <menu_item_check.on_enable
-                 function="Advanced.EnableRenderDeferred" />
-          </menu_item_check>
-          <menu_item_check
-                   label="Global Illumintation"
-                   name="Global Illumination">
-            <menu_item_check.on_check
-             function="CheckControl"
-             parameter="RenderDeferredGI" />
-            <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="RenderDeferredGI" />
-            <menu_item_check.on_enable
-                 function="Advanced.EnableRenderDeferredGI" />
-          </menu_item_check>
-          <menu_item_separator />
-          <menu_item_check
-             label="Debug GL"
-             name="Debug GL">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="RenderDebugGL" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="RenderDebugGL" />
-            </menu_item_check>
-            <menu_item_check
-             label="Debug Pipeline"
-             name="Debug Pipeline">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="RenderDebugGL" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="RenderDebugGL" />
-            </menu_item_check>
-            <menu_item_check
-             label="Fast Alpha"
-             name="Fast Alpha">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="RenderDebugGL" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="RenderDebugGL" />
-            </menu_item_check>
-            <menu_item_check
-             label="Animation Textures"
-             name="Animation Textures">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="RenderDebugGL" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="RenderDebugGL" />
-            </menu_item_check>
-            <menu_item_check
-             label="Disable Textures"
-             name="Disable Textures">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="TextureDisable" />
-                <menu_item_check.on_click
-                 function="ToggleControl" 
-                 parameter="TextureDisable" />
-            </menu_item_check>
-            <menu_item_check
-              label="Full Res Textures"
-             layout="topleft"
-             name="Rull Res Textures">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="TextureLoadFullRes" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="TextureLoadFullRes" />
-            </menu_item_check>
-            <menu_item_check
-               label="Audit Textures"
-               layout="topleft"
-               name="Audit Textures">
-              <menu_item_check.on_check
-               function="CheckControl"
-               parameter="AuditTexture" />
-              <menu_item_check.on_click
-               function="ToggleControl"
-               parameter="AuditTexture" />
-            </menu_item_check>
-            <menu_item_check
-             label="Texture Atlas"
-             name="Texture Atlas">
-              <menu_item_check.on_check
-               function="CheckControl"
-               parameter="EnableTextureAtlas" />
-              <menu_item_check.on_click
-               function="ToggleControl"
-               parameter="EnableTextureAtlas" />
-            </menu_item_check>
-              <menu_item_check
-             label="Render Attached Lights"
-             name="Render Attached Lights">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="RenderAttachedLights" />
-                <menu_item_check.on_click
-                 function="Advanced.HandleAttchedLightParticles"
-                 parameter="RenderAttachedLights" />
-            </menu_item_check>
-            <menu_item_check
-             label="Render Attached Particles"
-             name="Render Attached Particles">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="RenderAttachedParticles" />
-                <menu_item_check.on_click
-                 function="Advanced.HandleAttchedLightParticles"
-                 parameter="RenderAttachedParticles" />
-            </menu_item_check>
-            <menu_item_check
-             label="Hover Glow Objects"
-             name="Hover Glow Objects">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="RenderHoverGlowEnable" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="RenderHoverGlowEnable" />
-            </menu_item_check>
-        </menu>
-
-        <menu
-         create_jump_keys="true"
-         label="Network"
-         layout="topleft"
-         name="Network"
-         tear_off="true">
-            <menu_item_check
-             label="Pause Agent"
-             layout="topleft"
-             name="AgentPause">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="AgentPause" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="AgentPause" />
-            </menu_item_check>
-            <menu_item_separator
-             layout="topleft" />
-            <menu_item_call
-             label="Enable Message Log"
-             layout="topleft"
-             name="Enable Message Log">
-                <menu_item_call.on_click
-                 function="Advanced.EnableMessageLog" />
-            </menu_item_call>
-            <menu_item_call
-             label="Disable Message Log"
-             layout="topleft"
-             name="Disable Message Log">
-                <menu_item_call.on_click
-                 function="Advanced.DisableMessageLog" />
-            </menu_item_call>
-            <menu_item_separator
-             layout="topleft" />
-            <menu_item_check
-             label="Velocity Interpolate Objects"
-             layout="topleft"
-             name="Velocity Interpolate Objects">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="VelocityInterpolate" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="VelocityInterpolate" />
-            </menu_item_check>
-            <menu_item_check
-             label="Ping Interpolate Object Positions"
-             layout="topleft"
-             name="Ping Interpolate Object Positions">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="PingInterpolate" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="PingInterpolate" />
-            </menu_item_check>
-            <menu_item_separator
-             layout="topleft" />
-            <menu_item_call
-             label="Drop a Packet"
-             layout="topleft"
-             name="Drop a Packet"
-             shortcut="control|alt|L">
-                <menu_item_call.on_click
-                 function="Advanced.DropPacket" />
-            </menu_item_call>
-        </menu>
-        <menu_item_call
-         label="Dump Scripted Camera"
-         layout="topleft"
-         name="Dump Scripted Camera">
-            <menu_item_call.on_click
-             function="Advanced.DumpScriptedCamera" />
-        </menu_item_call>
-        <menu_item_call
-             label="Bumps, Pushes &amp; Hits"
-             layout="topleft"
-             name="Bumps, Pushes &amp;amp; Hits">
-                <menu_item_call.on_click
-                 function="Floater.Show"
-                 parameter="bumps" />
-            </menu_item_call>
-
-        <menu
-         create_jump_keys="true"
-         label="Recorder"
-         layout="topleft"
-         name="Recorder"
-         tear_off="true">
-            <menu_item_call
-             label="Start Playback"
-             layout="topleft"
-             name="Start Playback">
-                <menu_item_call.on_click
-                 function="Advanced.AgentPilot"
-                 parameter="start playback" />
-            </menu_item_call>
-            <menu_item_call
-             label="Stop Playback"
-             layout="topleft"
-             name="Stop Playback">
-                <menu_item_call.on_click
-                 function="Advanced.AgentPilot"
-                 parameter="stop playback" />
-            </menu_item_call>
-            <menu_item_check
-             label="Loop Playback"
-             layout="topleft"
-             name="Loop Playback">
-                <menu_item_check.on_check
-                 function="Advanced.CheckAgentPilotLoop"
-                 parameter="loopPlayback" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleAgentPilotLoop" />
-            </menu_item_check>
-            <menu_item_call
-             label="Start Record"
-             layout="topleft"
-             name="Start Record">
-                <menu_item_call.on_click
-                 function="Advanced.AgentPilot"
-                 parameter="start record" />
-            </menu_item_call>
-            <menu_item_call
-             label="Stop Record"
-             layout="topleft"
-             name="Stop Record">
-                <menu_item_call.on_click
-                 function="Advanced.AgentPilot"
-                 parameter="stop record" />
-            </menu_item_call>
-        </menu>
-
-        <menu
-         create_jump_keys="true"
-         label="World"
-         layout="topleft"
-         name="World"
-         tear_off="true">
-            <menu_item_check
-             label="Sim Sun Override"
-             layout="topleft"
-             name="Sim Sun Override">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="SkyOverrideSimSunPosition" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="SkyOverrideSimSunPosition" />
-            </menu_item_check>
-            <menu_item_check
-             label="Cheesy Beacon"
-             layout="topleft"
-             name="Cheesy Beacon">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="CheesyBeacon" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="CheesyBeacon" />
-            </menu_item_check>
-            <menu_item_check
-             label="Fixed Weather"
-             layout="topleft"
-             name="Fixed Weather">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="FixedWeather" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="FixedWeather" />
-            </menu_item_check>
-            <menu_item_call
-             label="Dump Region Object Cache"
-             layout="topleft"
-             name="Dump Region Object Cache">
-                <menu_item_call.on_click
-                 function="Advanced.DumpRegionObjectCache" />
-            </menu_item_call>
-        </menu>
-        <menu
-         create_jump_keys="true"
-         label="UI"
-         layout="topleft"
-         name="UI"
-         tear_off="true">
-         <!--   <menu_item_check
-             label="New Bottom Bar"
-             layout="topleft"
-             name="New Bottom Bar">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="BottomPanelNew" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="BottomPanelNew" />
-            </menu_item_check>-->
-            <menu_item_call
-             label="Web Browser Test"
-             layout="topleft"
-             name="Web Browser Test">
-                <menu_item_call.on_click
-                 function="Advanced.WebBrowserTest"
-                 parameter="http://secondlife.com/app/search/slurls.html"/>
-            </menu_item_call>
-            <menu_item_call
-             label="Dump SelectMgr"
-             layout="topleft"
-             name="Dump SelectMgr">
-                <menu_item_call.on_click
-                 function="Advanced.DumpSelectMgr" />
-            </menu_item_call>
-            <menu_item_call
-             label="Dump Inventory"
-             layout="topleft"
-             name="Dump Inventory">
-                <menu_item_call.on_click
-                 function="Advanced.DumpInventory" />
-            </menu_item_call>
-            <menu_item_call
-             label="Dump Timers"
-             name="Dump Timers">
-                <menu_item_call.on_click
-                 function="Advanced.DumpTimers" />
-            </menu_item_call>
-            <menu_item_call
-             label="Dump Focus Holder"
-             layout="topleft"
-             name="Dump Focus Holder"
-             shortcut="control|alt|F">
-                <menu_item_call.on_click
-                 function="Advanced.DumpFocusHolder" />
-            </menu_item_call>
-            <menu_item_call
-             label="Print Selected Object Info"
-             layout="topleft"
-             name="Print Selected Object Info"
-             shortcut="control|shift|P">
-                <menu_item_call.on_click
-                 function="Advanced.PrintSelectedObjectInfo" />
-            </menu_item_call>
-            <menu_item_call
-             label="Print Agent Info"
-             layout="topleft"
-             name="Print Agent Info"
-             shortcut="shift|P">
-                <menu_item_call.on_click
-                 function="Advanced.PrintAgentInfo" />
-            </menu_item_call>
-            <menu_item_call
-             label="Memory Stats"
-             layout="topleft"
-             name="Memory Stats"
-             shortcut="control|alt|shift|M">
-                <menu_item_call.on_click
-                 function="Advanced.PrintTextureMemoryStats" />
-            </menu_item_call>
-            <menu_item_check
-             label="Double-ClickAuto-Pilot"
-             layout="topleft"
-             name="Double-ClickAuto-Pilot">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="DoubleClickAutoPilot" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="DoubleClickAutoPilot" />
-            </menu_item_check>
-
-            <menu_item_separator />
-            <menu_item_check
-             label="Debug SelectMgr"
-             layout="topleft"
-             name="Debug SelectMgr">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="DebugSelectMgr" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="DebugSelectMgr" />
-            </menu_item_check>
-            <menu_item_check
-             label="Debug Clicks"
-             layout="topleft"
-             name="Debug Clicks">
-                <menu_item_check.on_check
-                 function="Advanced.CheckDebugClicks"
-                 parameter="DebugClicks" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleDebugClicks"
-                 parameter="DebugClicks" />
-            </menu_item_check>
-            <menu_item_check
-             label="Debug Views"
-             layout="topleft"
-             name="Debug Views">
-                <menu_item_check.on_check
-                 function="Advanced.CheckDebugViews" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleDebugViews" />
-            </menu_item_check>
-            <menu_item_check
-             label="Debug Name Tooltips"
-             layout="topleft"
-             name="Debug Name Tooltips">
-                <menu_item_check.on_check
-                 function="Advanced.CheckXUINameTooltips"
-                 parameter="XUINameTooltips" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleXUINameTooltips" />
-            </menu_item_check>
-            <menu_item_check
-             label="Debug Mouse Events"
-             layout="topleft"
-             name="Debug Mouse Events">
-                <menu_item_check.on_check
-                 function="Advanced.CheckDebugMouseEvents"
-                 parameter="MouseEvents" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleDebugMouseEvents" />
-            </menu_item_check>
-            <menu_item_check
-             label="Debug Keys"
-             layout="topleft"
-             name="Debug Keys">
-                <menu_item_check.on_check
-                 function="Advanced.CheckDebugKeys"
-                 parameter="DebugKeys" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleDebugKeys" />
-            </menu_item_check>
-            <menu_item_check
-             label="Debug WindowProc"
-             layout="topleft"
-             name="Debug WindowProc">
-                <menu_item_check.on_check
-                 function="Advanced.CheckDebugWindowProc"
-                 parameter="DebugWindowProc" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleDebugWindowProc"
-                 parameter="DebugWindowProc" />
-            </menu_item_check>
-        </menu>
-        <menu
-         create_jump_keys="true"
-         label="XUI"
-         name="XUI"
-         tear_off="true">
-            <menu_item_call
-               label="Reload Color Settings"
-               layout="topleft"
-               name="Reload Color Settings">
-              <menu_item_call.on_click
-               function="Advanced.ReloadColorSettings" />
-            </menu_item_call>
-            <menu_item_call
-             label="Show Font Test"
-             layout="topleft"
-             name="Show Font Test">
-                <menu_item_call.on_click
-                 function="Floater.Show"
-                 parameter="font_test" />
-            </menu_item_call>
-            <menu_item_call
-             label="Load from XML..."
-             layout="topleft"
-             name="Load from XML">
-                <menu_item_call.on_click
-                 function="Advanced.LoadUIFromXML" />
-            </menu_item_call>
-            <menu_item_call
-             label="Save to XML..."
-             layout="topleft"
-             name="Save to XML">
-                <menu_item_call.on_click
-                 function="Advanced.SaveUIToXML" />
-            </menu_item_call>
-            <menu_item_check
-             label="Show XUI Names"
-             layout="topleft"
-             name="Show XUI Names">
-                <menu_item_check.on_check
-                 function="Advanced.CheckXUINames"
-                 parameter="showUIname" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleXUINames" />
-            </menu_item_check>
-          <menu_item_call
-           label="Send Test IMs"
-           layout="topleft"
-           name="Send Test IMs">
-            <menu_item_call.on_click
-             function="Advanced.SendTestIMs" />
-          </menu_item_call>
-          <menu_item_call
-           label="Test Inspectors"
-           name="Test Inspectors"
-           shortcut="control|shift|I">
-            <menu_item_call.on_click
-             function="Floater.Show"
-             parameter="test_inspectors" />
-          </menu_item_call>
-        </menu>
-        <menu
-         create_jump_keys="true"
-         label="Avatar"
-         layout="topleft"
-         name="Character"
-         tear_off="true">
-            <menu
-             create_jump_keys="true"
-             label="Grab Baked Texture"
-             layout="topleft"
-             name="Grab Baked Texture"
-             tear_off="true">
-                <menu_item_call
-                 label="Iris"
-                 layout="topleft"
-                 name="Iris">
-                    <menu_item_call.on_click
-                     function="Advanced.GrabBakedTexture"
-                     parameter="iris" />
-                    <menu_item_call.on_enable
-                     function="Advanced.EnableGrabBakedTexture"
-					 parameter="iris" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Head"
-                 layout="topleft"
-                 name="Head">
-                    <menu_item_call.on_click
-                     function="Advanced.GrabBakedTexture"
-                     parameter="head" />
-                    <menu_item_call.on_enable
-                     function="Advanced.EnableGrabBakedTexture"
-					 parameter="head" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Upper Body"
-                 layout="topleft"
-                 name="Upper Body">
-                    <menu_item_call.on_click
-                     function="Advanced.GrabBakedTexture"
-                     parameter="upper" />
-                    <menu_item_call.on_enable
-                     function="Advanced.EnableGrabBakedTexture"
-					 parameter="upper" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Lower Body"
-                 layout="topleft"
-                 name="Lower Body">
-                    <menu_item_call.on_click
-                     function="Advanced.GrabBakedTexture"
-                     parameter="lower" />
-                    <menu_item_call.on_enable
-                     function="Advanced.EnableGrabBakedTexture"
-					 parameter="lower" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Skirt"
-                 layout="topleft"
-                 name="Skirt">
-                    <menu_item_call.on_click
-                     function="Advanced.GrabBakedTexture"
-                     parameter="skirt" />
-                    <menu_item_call.on_enable
-                     function="Advanced.EnableGrabBakedTexture"
-					 parameter="skirt" />
-                </menu_item_call>
-            </menu>
-            <menu
-             create_jump_keys="true"
-             label="Character Tests"
-             layout="topleft"
-             name="Character Tests"
-             tear_off="true">
-                <menu_item_call
-                 label="Appearance To XML"
-                 layout="topleft"
-                 name="Appearance To XML">
-                    <menu_item_call.on_click
-                     function="Advanced.AppearanceToXML" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Toggle Character Geometry"
-                 layout="topleft"
-                 name="Toggle Character Geometry">
-                    <menu_item_call.on_click
-                     function="Advanced.ToggleCharacterGeometry" />
-                    <menu_item_call.on_enable
-                     function="IsGodCustomerService" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Test Male"
-                 layout="topleft"
-                 name="Test Male">
-                    <menu_item_call.on_click
-                     function="Advanced.TestMale" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Test Female"
-                 layout="topleft"
-                 name="Test Female">
-                    <menu_item_call.on_click
-                     function="Advanced.TestFemale" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Toggle PG"
-                 layout="topleft"
-                 name="Toggle PG">
-                    <menu_item_call.on_click
-                     function="Advanced.TogglePG" />
-                </menu_item_call>
-                <menu_item_check
-                 label="Allow Select Avatar"
-                 layout="topleft"
-                 name="Allow Select Avatar">
-                    <menu_item_check.on_check
-                     function="CheckControl"
-                     parameter="AllowSelectAvatar" />
-                    <menu_item_check.on_click
-                     function="ToggleControl"
-                     parameter="AllowSelectAvatar" />
-                </menu_item_check>
-            </menu>
-            <menu_item_call
-             label="Force Params to Default"
-             layout="topleft"
-             name="Force Params to Default">
-                <menu_item_call.on_click
-                 function="Advanced.ForceParamsToDefault" />
-            </menu_item_call>
-            <menu_item_check
-             label="Animation Info"
-             layout="topleft"
-             name="Animation Info">
-                <menu_item_check.on_check
-                 function="Advanced.CheckAnimationInfo"
-                 parameter="AnimationInfo" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleAnimationInfo"
-                 parameter="" />
-            </menu_item_check>
-            <menu_item_check
-             label="Slow Motion Animations"
-             layout="topleft"
-             name="Slow Motion Animations">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="SlowMotionAnimation" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="SlowMotionAnimation" />
-            </menu_item_check>
-            <menu_item_check
-             label="Show Look At"
-             layout="topleft"
-             name="Show Look At">
-                <menu_item_check.on_check
-                 function="Advanced.CheckShowLookAt"
-                 parameter="ShowLookAt" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleShowLookAt" />
-            </menu_item_check>
-            <menu_item_check
-             label="Show Point At"
-             layout="topleft"
-             name="Show Point At">
-                <menu_item_check.on_check
-                 function="Advanced.CheckShowPointAt"
-                 parameter="ShowPointAt" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleShowPointAt" />
-            </menu_item_check>
-            <menu_item_check
-             label="Debug Joint Updates"
-             layout="topleft"
-             name="Debug Joint Updates">
-                <menu_item_check.on_check
-                 function="Advanced.CheckDebugJointUpdates"
-                 parameter="DebugJointUpdates" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleDebugJointUpdates" />
-            </menu_item_check>
-            <menu_item_check
-             label="Disable LOD"
-             layout="topleft"
-             name="Disable LOD">
-                <menu_item_check.on_check
-                 function="Advanced.CheckDisableLOD"
-                 parameter="DisableLOD" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleDisableLOD" />
-            </menu_item_check>
-            <menu_item_check
-             label="Debug Character Vis"
-             layout="topleft"
-             name="Debug Character Vis">
-                <menu_item_check.on_check
-                 function="Advanced.CheckDebugCharacterVis"
-                 parameter="DebugCharacterVis" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleDebugCharacterVis" />
-            </menu_item_check>
-            <menu_item_check
-             label="Show Collision Skeleton"
-             layout="topleft"
-             name="Show Collision Skeleton">
-                <menu_item_check.on_check
-                 function="Advanced.CheckInfoDisplay"
-                 parameter="collision skeleton" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleInfoDisplay"
-                 parameter="collision skeleton" />
-            </menu_item_check>
-            <menu_item_check
-             label="Display Agent Target"
-             layout="topleft"
-             name="Display Agent Target">
-                <menu_item_check.on_check
-                 function="Advanced.CheckInfoDisplay"
-                 parameter="agent target" />
-                <menu_item_check.on_click
-                 function="Advanced.ToggleInfoDisplay"
-                 parameter="agent target" />
-            </menu_item_check>
-<!-- Appears not to exist anymore
-            <menu_item_check
-             label="Debug Rotation"
-             layout="topleft"
-             name="Debug Rotation">
-                <menu_item_check.on_check
-                 function="CheckControl"
-                 parameter="DebugAvatarRotation" />
-                <menu_item_check.on_click
-                 function="ToggleControl"
-                 parameter="DebugAvatarRotation" />
-            </menu_item_check> -->
--->
-            <menu_item_call
-             label="Dump Attachments"
-             layout="topleft"
-             name="Dump Attachments">
-                <menu_item_call.on_click
-                 function="Advanced.DumpAttachments" />
-            </menu_item_call>
-            <menu_item_call
-             label="Debug Avatar Textures"
-             layout="topleft"
-             name="Debug Avatar Textures"
-             shortcut="control|alt|shift|A">
-                <menu_item_call.on_click
-                 function="Advanced.DebugAvatarTextures" />
-            </menu_item_call>
-            <menu_item_call
-             label="Dump Local Textures"
-             layout="topleft"
-             name="Dump Local Textures"
-             shortcut="alt|shift|M">
-                <menu_item_call.on_click
-                 function="Advanced.DumpAvatarLocalTextures" />
-            </menu_item_call>
-        </menu>
-        <menu_item_separator
-         layout="topleft" />
-        <menu_item_call
-         label="Compress Images"
-         layout="topleft"
-         name="Compress Images">
-            <menu_item_call.on_click
-             function="Advanced.CompressImage" />
-        </menu_item_call>
-        <menu_item_check
-         label="Output Debug Minidump"
-         layout="topleft"
-         name="Output Debug Minidump">
-            <menu_item_check.on_check
-             function="CheckControl"
-             parameter="SaveMinidump" />
-            <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="SaveMinidump" />
-        </menu_item_check>
-        <menu_item_check
-         label="Console Window on next Run"
-         layout="topleft"
-         name="Console Window">
-            <menu_item_check.on_check
-             function="CheckControl"
-             parameter="ShowConsoleWindow" />
-            <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="ShowConsoleWindow" />
-        </menu_item_check>
-        <menu_item_separator
-         layout="topleft" />
-        <menu_item_check
-         label="Show Admin Menu"
-         layout="topleft"
-         name="View Admin Options">
-            <menu_item_check.on_check
-             function="Advanced.CheckViewAdminOptions"
-             parameter="ViewAdminOptions" />
-            <menu_item_check.on_click
-             function="Advanced.ToggleViewAdminOptions" />
-        </menu_item_check>
-        <menu_item_call
-         label="Request Admin Status"
-         layout="topleft"
-         name="Request Admin Options"
-         shortcut="control|alt|G">
-            <menu_item_call.on_click
-             function="Advanced.RequestAdminStatus" />
-        </menu_item_call>
-        <menu_item_call
-         label="Leave Admin Status"
-         layout="topleft"
-         name="Leave Admin Options"
-         shortcut="control|alt|shift|G">
-            <menu_item_call.on_click
-             function="Advanced.LeaveAdminStatus" />
-        </menu_item_call>
-    </menu>
-    <menu
-     create_jump_keys="true"
-     label="Admin"
-     layout="topleft"
-     name="Admin"
-     tear_off="true"
-     visible="false">
-        <menu
-         create_jump_keys="true"
-         label="Object"
-         layout="topleft"
-         tear_off="true">
-            <menu_item_call
-             label="Take Copy"
-             layout="topleft"
-             name="Take Copy"
-             shortcut="control|alt|shift|O">
-                <menu_item_call.on_click
-                 function="Admin.ForceTakeCopy" />
-                <menu_item_call.on_enable
-                 function="IsGodCustomerService" />
-            </menu_item_call>
-            <menu_item_call
-             label="Force Owner To Me"
-             layout="topleft"
-             name="Force Owner To Me">
-                <menu_item_call.on_click
-                 function="Admin.HandleObjectOwnerSelf" />
-                <menu_item_call.on_enable
-                 function="IsGodCustomerService" />
-            </menu_item_call>
-            <menu_item_call
-             label="Force Owner Permissive"
-             layout="topleft"
-             name="Force Owner Permissive">
-                <menu_item_call.on_click
-                 function="Admin.HandleObjectOwnerPermissive" />
-                <menu_item_call.on_enable
-                 function="IsGodCustomerService" />
-            </menu_item_call>
-            <menu_item_call
-             label="Delete"
-             layout="topleft"
-             name="Delete"
-             shortcut="control|alt|shift|Del">
-                <menu_item_call.on_click
-                 function="Admin.HandleForceDelete" />
-                <menu_item_call.on_enable
-                 function="IsGodCustomerService" />
-            </menu_item_call>
-            <menu_item_call
-             label="Lock"
-             layout="topleft"
-             name="Lock"
-             shortcut="control|alt|shift|L">
-                <menu_item_call.on_click
-                 function="Admin.HandleObjectLock" />
-                <menu_item_call.on_enable
-                 function="IsGodCustomerService" />
-            </menu_item_call>
-            <menu_item_call
-             label="Get Assets IDs"
-             layout="topleft"
-             name="Get Assets IDs"
-             shortcut="control|alt|shift|I">
-                <menu_item_call.on_click
-                 function="Admin.HandleObjectAssetIDs" />
-                <menu_item_call.on_enable
-                 function="IsGodCustomerService" />
-            </menu_item_call>
-        </menu>
-        <menu
-         create_jump_keys="true"
-         label="Parcel"
-         layout="topleft"
-         name="Parcel"
-         tear_off="true">
-            <menu_item_call
-             label="Owner To Me"
-             layout="topleft"
-             name="Owner To Me">
-                <menu_item_call.on_click
-                 function="Admin.HandleForceParcelOwnerToMe" />
-                <menu_item_call.on_enable
-                 function="IsGodCustomerService" />
-            </menu_item_call>
-            <menu_item_call
-             label="Set to Linden Content"
-             layout="topleft"
-             name="Set to Linden Content"
-             shortcut="control|alt|shift|C">
-                <menu_item_call.on_click
-                 function="Admin.HandleForceParcelToContent" />
-                <menu_item_call.on_enable
-                 function="IsGodCustomerService" />
-            </menu_item_call>
-            <menu_item_call
-             label="Claim Public Land"
-             layout="topleft"
-             name="Claim Public Land">
-                <menu_item_call.on_click
-                 function="Admin.HandleClaimPublicLand" />
-                <menu_item_call.on_enable
-                 function="IsGodCustomerService" />
-            </menu_item_call>
-        </menu>
-        <menu
-         create_jump_keys="true"
-         label="Region"
-         layout="topleft"
-         name="Region"
-         tear_off="true">
-            <menu_item_call
-             label="Dump Temp Asset Data"
-             layout="topleft"
-             name="Dump Temp Asset Data">
-                <menu_item_call.on_click
-                 function="Admin.HandleRegionDumpTempAssetData" />
-                <menu_item_call.on_enable
-                 function="IsGodCustomerService" />
-            </menu_item_call>
-            <menu_item_call
-             label="Save Region State"
-             layout="topleft"
-             name="Save Region State">
-                <menu_item_call.on_click
-                 function="Admin.OnSaveState" />
-                <menu_item_call.on_enable
-                 function="IsGodCustomerService" />
-            </menu_item_call>
-        </menu>
-        <menu_item_call
-         label="God Tools"
-         layout="topleft"
-         name="God Tools">
-            <menu_item_call.on_click
-             function="Floater.Show"
-             parameter="god_tools" />
-            <menu_item_call.on_enable
-             function="IsGodCustomerService" />
-        </menu_item_call>
-    </menu>
-    <menu
-     create_jump_keys="true"
-     label="Admin"
-     layout="topleft"
-     name="Deprecated"
-     tear_off="true"
-     visible="false">
-        <menu
-         create_jump_keys="true"
-         label="Attach Object"
-         layout="topleft"
-         mouse_opaque="false"
-         name="Attach Object"
-         tear_off="true" />
-        <menu
-         create_jump_keys="true"
-         label="Detach Object"
-         layout="topleft"
-         mouse_opaque="false"
-         name="Detach Object"
-         tear_off="true" />
-        <menu
-         create_jump_keys="true"
-         label="Take Off Clothing"
-         layout="topleft"
-         mouse_opaque="false"
-         name="Take Off Clothing"
-         tear_off="true">
-            <menu_item_call
-             label="Shirt"
-             layout="topleft"
-             name="Shirt">
-                <menu_item_call.on_click
-                 function="Edit.TakeOff"
-                 parameter="shirt" />
-                <menu_item_call.on_enable
-                 function="Edit.EnableTakeOff"
-                 parameter="shirt" />
-            </menu_item_call>
-            <menu_item_call
-             label="Pants"
-             layout="topleft"
-             name="Pants">
-                <menu_item_call.on_click
-                 function="Edit.TakeOff"
-                 parameter="pants" />
-                <menu_item_call.on_enable
-                 function="Edit.EnableTakeOff"
-                 parameter="pants" />
-            </menu_item_call>
-            <menu_item_call
-             label="Shoes"
-             layout="topleft"
-             name="Shoes">
-                <menu_item_call.on_click
-                 function="Edit.TakeOff"
-                 parameter="shoes" />
-                <menu_item_call.on_enable
-                 function="Edit.EnableTakeOff"
-                 parameter="shoes" />
-            </menu_item_call>
-            <menu_item_call
-             label="Socks"
-             layout="topleft"
-             name="Socks">
-                <menu_item_call.on_click
-                 function="Edit.TakeOff"
-                 parameter="socks" />
-                <menu_item_call.on_enable
-                 function="Edit.EnableTakeOff"
-                 parameter="socks" />
-            </menu_item_call>
-            <menu_item_call
-             label="Jacket"
-             layout="topleft"
-             name="Jacket">
-                <menu_item_call.on_click
-                 function="Edit.TakeOff"
-                 parameter="jacket" />
-                <menu_item_call.on_enable
-                 function="Edit.EnableTakeOff"
-                 parameter="jacket" />
-            </menu_item_call>
-            <menu_item_call
-             label="Gloves"
-             layout="topleft"
-             name="Gloves">
-                <menu_item_call.on_click
-                 function="Edit.TakeOff"
-                 parameter="gloves" />
-                <menu_item_call.on_enable
-                 function="Edit.EnableTakeOff"
-                 parameter="gloves" />
-            </menu_item_call>
-            <menu_item_call
-             label="Undershirt"
-             layout="topleft"
-             name="Menu Undershirt">
-                <menu_item_call.on_click
-                 function="Edit.TakeOff"
-                 parameter="undershirt" />
-                <menu_item_call.on_enable
-                 function="Edit.EnableTakeOff"
-                 parameter="undershirt" />
-            </menu_item_call>
-            <menu_item_call
-             label="Underpants"
-             layout="topleft"
-             name="Menu Underpants">
-                <menu_item_call.on_click
-                 function="Edit.TakeOff"
-                 parameter="underpants" />
-                <menu_item_call.on_enable
-                 function="Edit.EnableTakeOff"
-                 parameter="underpants" />
-            </menu_item_call>
-            <menu_item_call
-             label="Skirt"
-             layout="topleft"
-             name="Skirt">
-                <menu_item_call.on_click
-                 function="Edit.TakeOff"
-                 parameter="skirt" />
-                <menu_item_call.on_enable
-                 function="Edit.EnableTakeOff"
-                 parameter="skirt" />
-            </menu_item_call>
-            <menu_item_call
-             label="Alpha"
-             layout="topleft"
-             name="Alpha">
-                <menu_item_call.on_click
-                 function="Edit.TakeOff"
-                 parameter="alpha" />
-                <menu_item_call.on_enable
-                 function="Edit.EnableTakeOff"
-                 parameter="alpha" />
-            </menu_item_call>
-            <menu_item_call
-             label="Tattoo"
-             layout="topleft"
-             name="Tattoo">
-                <menu_item_call.on_click
-                 function="Edit.TakeOff"
-                 parameter="tattoo" />
-                <menu_item_call.on_enable
-                 function="Edit.EnableTakeOff"
-                 parameter="tattoo" />
-            </menu_item_call>
-            <menu_item_call
-             label="All Clothes"
-             layout="topleft"
-             name="All Clothes">
-                <menu_item_call.on_click
-                 function="Edit.TakeOff"
-                 parameter="all" />
-            </menu_item_call>
-        </menu>
-        <menu_item_check
-         label="Show Toolbar"
-         layout="topleft"
-         name="Show Toolbar">
-            <menu_item_check.on_check
-             function="FloaterVisible"
-             parameter="toolbar" />
-            <menu_item_check.on_click
-             function="ShowFloater"
-             parameter="toolbar" />
-        </menu_item_check>
-        <menu
-         create_jump_keys="true"
-         label="Help"
-         layout="topleft"
-         name="Help"
-         tear_off="true">
-            <menu_item_call
-             label="Official Linden Blog"
-             layout="topleft"
-             name="Official Linden Blog">
-                <menu_item_call.on_click
-                 function="PromptShowURL"
-                 name="OfficialLindenBlog_url"
-                 parameter="WebLaunchSupportWiki,http://blog.secondlife.com/" />
-            </menu_item_call>
-            <menu_item_call
-             label="Scripting Portal"
-             layout="topleft"
-             name="Scripting Portal">
-                <menu_item_call.on_click
-                 function="PromptShowURL"
-                 name="ScriptingPortal_url"
-                 parameter="WebLaunchLSLWiki,http://wiki.secondlife.com/wiki/LSL_Portal" />
-            </menu_item_call>
-            <menu
-             create_jump_keys="true"
-             label="Bug Reporting"
-             layout="topleft"
-             name="Bug Reporting"
-             tear_off="true">
-                <menu_item_call
-                 label="Public Issue Tracker"
-                 layout="topleft"
-                 name="Public Issue Tracker">
-                    <menu_item_call.on_click
-                     function="PromptShowURL"
-                     name="PublicIssueTracker_url"
-                     parameter="WebLaunchPublicIssue,http://jira.secondlife.com" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Public Issue Tracker Help"
-                 layout="topleft"
-                 name="Publc Issue Tracker Help">
-                    <menu_item_call.on_click
-                     function="PromptShowURL"
-                     name="PublicIssueTrackerHelp_url"
-                     parameter="WebLaunchPublicIssueHelp,http://wiki.secondlife.com/wiki/Issue_tracker" />
-                </menu_item_call>
-                <menu_item_separator
-                 layout="topleft" />
-                <menu_item_call
-                 label="Bug Reporting 101"
-                 layout="topleft"
-                 name="Bug Reporing 101">
-                    <menu_item_call.on_click
-                     function="PromptShowURL"
-                     name="BugReporting101_url"
-                     parameter="WebLaunchBugReport101,http://wiki.secondlife.com/wiki/Bug_Reporting_101" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Security Issues"
-                 layout="topleft"
-                 name="Security Issues">
-                    <menu_item_call.on_click
-                     function="PromptShowURL"
-                     name="SecurityIssues_url"
-                     parameter="WebLaunchSecurityIssues,http://wiki.secondlife.com/wiki/Security_issues" />
-                </menu_item_call>
-                <menu_item_call
-                 label="QA Wiki"
-                 layout="topleft"
-                 name="QA Wiki">
-                    <menu_item_call.on_click
-                     function="PromptShowURL"
-                     name="QAWiki_url"
-                     parameter="WebLaunchQAWiki,http://wiki.secondlife.com/wiki/QA_Portal" />
-                </menu_item_call>
-            </menu>
-        </menu>
-    </menu>
-</menu_bar>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu_bar
+ bg_visible="false"
+ follows="left|top|right"
+ layout="topleft"
+ name="Main Menu">
+    <menu
+     label="Me"
+     layout="topleft"
+     name="Me"
+     tear_off="true">
+        <menu_item_call
+         label="Preferences"
+         layout="topleft"
+         name="Preferences"
+         shortcut="control|P">
+            <menu_item_call.on_click
+             function="Floater.Show"
+             parameter="preferences" />
+        </menu_item_call>
+         <menu_item_call
+             label="My Dashboard"
+             layout="topleft"
+             name="Manage My Account">
+                <menu_item_call.on_click
+                 function="PromptShowURL"
+                 name="ManageMyAccount_url"
+                 parameter="WebLaunchJoinNow,http://secondlife.com/account/" />
+      </menu_item_call>
+        <menu_item_call
+         label="Buy L$"
+         layout="topleft"
+         name="Buy and Sell L$">
+            <menu_item_call.on_click
+             function="ShowFloater"
+             parameter="buy currency" />
+        </menu_item_call>
+        <menu_item_separator
+         layout="topleft" />
+        <menu_item_call
+         label="My Profile"
+         layout="topleft"
+         name="Profile">
+            <menu_item_call.on_click
+             function="ShowAgentProfile"
+             parameter="agent" />
+        </menu_item_call>
+        <menu_item_call
+         label="My Appearance"
+         layout="topleft"
+         name="Appearance">
+            <menu_item_call.on_click
+             function="ShowFloater"
+             parameter="appearance" />
+            <menu_item_call.on_enable
+             function="Edit.EnableCustomizeAvatar" />
+        </menu_item_call>
+        <menu_item_check
+         label="My Inventory"
+         layout="topleft"
+         name="Inventory"
+         shortcut="control|I">
+            <menu_item_check.on_check
+             function="Floater.Visible"
+             parameter="inventory" />
+            <menu_item_check.on_click
+             function="Floater.Toggle"
+             parameter="inventory" />
+        </menu_item_check>
+        <menu_item_call
+         label="My Gestures"
+         layout="topleft"
+         name="Gestures"
+         shortcut="control|G">
+            <menu_item_call.on_click
+             function="ShowFloater"
+             parameter="gestures" />
+        </menu_item_call>
+        <menu
+         label="My Status"
+         layout="topleft"
+         name="Status"
+         tear_off="true">
+            <menu_item_call
+             label="Away"
+             layout="topleft"
+             name="Set Away">
+                <menu_item_call.on_click
+                 function="World.SetAway" />
+            </menu_item_call>
+            <menu_item_separator
+             layout="topleft"/>
+            <menu_item_call
+             label="Busy"
+             layout="topleft"
+             name="Set Busy">
+                <menu_item_call.on_click
+                 function="World.SetBusy"/>
+            </menu_item_call>
+        </menu>
+        <menu_item_call
+         label="Request Admin Status"
+         layout="topleft"
+         name="Request Admin Options"
+         shortcut="control|alt|G"
+		 visible="false">
+            <menu_item_call.on_click
+             function="Advanced.RequestAdminStatus" />
+        </menu_item_call>
+        <menu_item_call
+         label="Leave Admin Status"
+         layout="topleft"
+         name="Leave Admin Options"
+         shortcut="control|alt|shift|G"
+		 visible="false">
+            <menu_item_call.on_click
+             function="Advanced.LeaveAdminStatus" />
+        </menu_item_call>
+        <menu_item_separator
+         layout="topleft" />
+        <menu_item_call
+         label="Quit [APP_NAME]"
+         layout="topleft"
+         name="Quit"
+         shortcut="control|Q">
+            <menu_item_call.on_click
+             function="File.Quit" />
+        </menu_item_call>
+    </menu>
+    <menu
+     label="Communicate"
+     layout="topleft"
+     name="Communicate"
+     tear_off="true">
+        <menu_item_call
+         label="My Friends"
+         layout="topleft"
+         name="My Friends"
+         shortcut="control|shift|F">
+            <menu_item_call.on_click
+             function="SideTray.PanelPeopleTab"
+             parameter="friends_panel" />
+            </menu_item_call>
+        <menu_item_call
+         label="My Groups"
+         layout="topleft"
+         name="My Groups">
+            <menu_item_call.on_click
+             function="SideTray.PanelPeopleTab"
+             parameter="groups_panel" />
+        </menu_item_call>
+        <menu_item_separator
+         layout="topleft" />
+        <!--menu_item_call
+         label="Chat"
+         layout="topleft"
+         name="Chat">
+            <menu_item_call.on_click
+             function="World.Chat" />
+        </menu_item_call-->
+        <menu_item_check
+         label="Nearby Chat"
+         layout="topleft"
+         name="Nearby Chat"
+         shortcut="control|H">
+            <menu_item_check.on_check
+             function="Floater.Visible"
+             parameter="nearby_chat" />
+            <menu_item_check.on_click
+             function="Floater.Toggle"
+             parameter="nearby_chat" />
+        </menu_item_check>
+        <menu_item_call
+         label="Nearby People"
+         layout="topleft"
+         name="Active Speakers"
+         shortcut="control|shift|A">
+            <menu_item_call.on_click
+             function="SideTray.PanelPeopleTab"
+             parameter="nearby_panel" />
+            </menu_item_call>
+        <menu_item_check
+         label="Nearby Media"
+         layout="topleft"
+         name="Nearby Media"
+         shortcut="control|alt|N">
+            <menu_item_check.on_check
+             function="Floater.Visible"
+             parameter="nearby_media" />
+            <menu_item_check.on_click
+             function="Floater.Toggle"
+             parameter="nearby_media" />
+        </menu_item_check>
+        <!--menu_item_check
+         label="Block List"
+         layout="topleft"
+         name="Mute List">
+            <menu_item_check.on_check
+             function="Floater.Visible"
+             parameter="mute" />
+            <menu_item_check.on_click
+             function="Floater.Toggle"
+             parameter="mute" />
+        </menu_item_check-->
+        <menu_item_separator
+         layout="topleft" />
+        <menu_item_check
+         label="(Legacy) Communicate"
+         layout="topleft"
+         name="Instant Message"
+         shortcut="control|T">
+            <menu_item_check.on_check
+             function="Floater.Visible"
+             parameter="communicate" />
+            <menu_item_check.on_click
+             function="Floater.Toggle"
+             parameter="communicate" />
+        </menu_item_check>
+        <menu_item_call
+         label="(Temp) Media Remote Ctrl"
+         layout="topleft"
+         name="Preferences"
+         shortcut="control|alt|M">
+            <menu_item_call.on_click
+             function="Floater.Toggle"
+             parameter="media_remote_ctrl" />
+        </menu_item_call>
+    </menu>
+    <menu
+     label="World"
+     layout="topleft"
+     name="World"
+     tear_off="true">
+         <menu_item_check
+         label="Move"
+         layout="topleft"
+         name="Movement Controls">
+            <menu_item_check.on_check
+             function="Floater.Visible"
+             parameter="moveview" />
+            <menu_item_check.on_click
+             function="Floater.Toggle"
+             parameter="moveview" />
+        </menu_item_check>
+        <menu_item_check
+         label="View"
+         layout="topleft"
+         name="Camera Controls">
+            <menu_item_check.on_check
+             function="Floater.Visible"
+             parameter="camera" />
+            <menu_item_check.on_click
+             function="Floater.Toggle"
+             parameter="camera" />
+        </menu_item_check>
+        <menu_item_separator
+         layout="topleft" />
+        <menu_item_call
+         label="About Land"
+         layout="topleft"
+         name="About Land">
+            <menu_item_call.on_click
+             function="Floater.Show"
+             parameter="about_land" />
+        </menu_item_call>
+        <menu_item_call
+         label="Region/Estate"
+         layout="topleft"
+         name="Region/Estate">
+            <menu_item_call.on_click
+             function="Floater.Show"
+             parameter="region_info" />
+        </menu_item_call>
+        <menu_item_call
+             label="Buy Land"
+             layout="topleft"
+             name="Buy Land">
+                <menu_item_call.on_click
+                 function="ShowFloater"
+                 parameter="buy land" />
+                <menu_item_call.on_enable
+                 function="World.EnableBuyLand" />
+            </menu_item_call>
+        <menu_item_call
+             label="My Land"
+             layout="topleft"
+             name="My Land">
+                <menu_item_call.on_click
+                 function="ShowFloater"
+                 parameter="land_holdings" />
+        </menu_item_call>
+        <menu
+           create_jump_keys="true"
+           label="Show"
+           layout="topleft"
+           name="Land"
+           tear_off="true">
+          <menu_item_check
+             label="Ban Lines"
+             layout="topleft"
+             name="Ban Lines">
+            <menu_item_check.on_check
+               control="ShowBanLines" />
+            <menu_item_check.on_click
+               function="ToggleControl"
+               parameter="ShowBanLines" />
+          </menu_item_check>
+           <menu_item_check
+                 label="Beacons"
+                 layout="topleft"
+                 name="beacons"
+                 shortcut="control|alt|shift|N">
+                    <menu_item_check.on_check
+                     function="Floater.Visible"
+                     parameter="beacons" />
+                    <menu_item_check.on_click
+                     function="Floater.Toggle"
+                     parameter="beacons" />
+                </menu_item_check>
+          <menu_item_check
+             label="Property Lines"
+             layout="topleft"
+             name="Property Lines"
+             shortcut="control|alt|shift|P">
+            <menu_item_check.on_check
+               control="ShowPropertyLines" />
+            <menu_item_check.on_click
+               function="ToggleControl"
+               parameter="ShowPropertyLines" />
+          </menu_item_check>
+          <menu_item_check
+             label="Land Owners"
+             layout="topleft"
+             name="Land Owners">
+            <menu_item_check.on_check
+               control="ShowParcelOwners" />
+            <menu_item_check.on_click
+               function="ToggleControl"
+               parameter="ShowParcelOwners" />
+          </menu_item_check>
+        </menu>
+        <menu_item_separator
+         layout="topleft" />
+        <menu
+         label="Landmarks"
+         layout="topleft"
+         name="Landmarks"
+         tear_off="true">
+            <menu_item_call
+             label="Create Landmark Here"
+             layout="topleft"
+             name="Create Landmark Here">
+                <menu_item_call.on_click
+                 function="World.CreateLandmark" />
+                <menu_item_call.on_enable
+                 function="World.EnableCreateLandmark" />
+            </menu_item_call>
+            <menu_item_call
+             label="Set Home to Here"
+             layout="topleft"
+             name="Set Home to Here">
+                <menu_item_call.on_click
+                 function="World.SetHomeLocation" />
+                <menu_item_call.on_enable
+                 function="World.EnableSetHomeLocation" />
+            </menu_item_call>
+            <menu_item_call
+             label="Teleport Home"
+             layout="topleft"
+             name="Teleport Home"
+             shortcut="control|shift|H">
+                <menu_item_call.on_click
+                 function="World.TeleportHome" />
+                <menu_item_call.on_enable
+                 function="World.EnableTeleportHome" />
+            </menu_item_call>
+        </menu>
+      <menu_item_check
+         label="Mini-Map"
+         layout="topleft"
+         name="Mini-Map"
+         shortcut="control|shift|M">
+            <menu_item_check.on_check
+             function="Floater.Visible"
+             parameter="mini_map" />
+            <menu_item_check.on_click
+             function="Floater.Toggle"
+             parameter="mini_map" />
+        </menu_item_check>
+         <menu_item_check
+         label="World Map"
+         layout="topleft"
+         name="World Map"
+         shortcut="control|M"
+         use_mac_ctrl="true">
+            <menu_item_check.on_check
+             function="Floater.Visible"
+             parameter="world_map" />
+            <menu_item_check.on_click
+             function="Floater.Toggle"
+             parameter="world_map" />
+        </menu_item_check>
+    <!--    <menu_item_check
+         label="Show Navigation Bar"
+         layout="topleft"
+         name="ShowNavbarNavigationPanel">
+           <menu_item_check.on_click
+             function="ToggleControl"
+             parameter="ShowNavbarNavigationPanel" />
+             <menu_item_check.on_check
+             function="CheckControl"
+             parameter="ShowNavbarNavigationPanel" />
+        </menu_item_check>
+       <menu_item_check
+         label="Show Favorites Bar"
+         layout="topleft"
+         name="ShowNavbarFavoritesPanel">
+           <menu_item_check.on_click
+             function="ToggleControl"
+             parameter="ShowNavbarFavoritesPanel" />
+             <menu_item_check.on_check
+             function="CheckControl"
+             parameter="ShowNavbarFavoritesPanel" />
+        </menu_item_check>
+        <menu_item_separator
+         layout="topleft" />-->
+        <menu_item_call
+         label="Snapshot"
+         layout="topleft"
+         name="Take Snapshot"
+         shortcut="control|shift|S">
+            <menu_item_call.on_click
+             function="Floater.Show"
+             parameter="snapshot" />
+        </menu_item_call>
+    <menu
+         create_jump_keys="true"
+         label="Sun"
+         layout="topleft"
+         name="Environment Settings"
+         tear_off="true">
+            <menu_item_call
+             label="Sunrise"
+             layout="topleft"
+             name="Sunrise">
+                <menu_item_call.on_click
+                 function="World.EnvSettings"
+                 parameter="sunrise" />
+            </menu_item_call>
+            <menu_item_call
+             label="Midday"
+             layout="topleft"
+             name="Noon"
+             shortcut="control|shift|Y">
+                <menu_item_call.on_click
+                 function="World.EnvSettings"
+                 parameter="noon" />
+            </menu_item_call>
+            <menu_item_call
+             label="Sunset"
+             layout="topleft"
+             name="Sunset"
+             shortcut="control|shift|N">
+                <menu_item_call.on_click
+                 function="World.EnvSettings"
+                 parameter="sunset" />
+            </menu_item_call>
+            <menu_item_call
+             label="Midnight"
+             layout="topleft"
+             name="Midnight">
+                <menu_item_call.on_click
+                 function="World.EnvSettings"
+                 parameter="midnight" />
+            </menu_item_call>
+            <menu_item_call
+             label="Use the Estate Time"
+             layout="topleft"
+             name="Revert to Region Default">
+                <menu_item_call.on_click
+                 function="World.EnvSettings"
+                 parameter="default" />
+            </menu_item_call>
+            <menu_item_separator
+             layout="topleft" />
+            <menu_item_call
+             label="Environment Editor"
+             layout="topleft"
+             name="Environment Editor">
+                <menu_item_call.on_click
+                 function="World.EnvSettings"
+                 parameter="editor" />
+            </menu_item_call>
+        </menu>
+    </menu>
+    <menu
+     create_jump_keys="true"
+     label="Build"
+     layout="topleft"
+     name="BuildTools"
+     tear_off="true"
+     visible="true">
+       <menu_item_check
+         label="Build"
+         layout="topleft"
+         name="Show Build Tools"
+         shortcut="control|B">
+            <menu_item_check.on_check
+             function="Build.Active" />
+            <menu_item_check.on_click
+             function="Build.Toggle" />
+            <menu_item_check.on_enable
+             function="Build.Enabled" />
+       </menu_item_check>
+       <menu
+          create_jump_keys="true"
+          label="Select Build Tool"
+          layout="topleft"
+          name="Select Tool"
+          tear_off="true">
+         <menu_item_call
+			label="Focus Tool"
+			layout="topleft"
+			name="Focus"
+			shortcut="control|1">
+           <menu_item_call.on_click
+              function="Tools.SelectTool"
+              parameter="focus" />
+         </menu_item_call>
+         <menu_item_call
+			label="Move Tool"
+			layout="topleft"
+			name="Move"
+			shortcut="control|2">
+           <menu_item_call.on_click
+              function="Tools.SelectTool"
+              parameter="move" />
+         </menu_item_call>
+         <menu_item_call
+			label="Edit Tool"
+			layout="topleft"
+			name="Edit"
+			shortcut="control|3">
+           <menu_item_call.on_click
+              function="Tools.SelectTool"
+              parameter="edit" />
+         </menu_item_call>
+         <menu_item_call
+			label="Create Tool"
+			layout="topleft"
+			name="Create"
+			shortcut="control|4">
+           <menu_item_call.on_click
+              function="Tools.SelectTool"
+              parameter="create" />
+         </menu_item_call>
+         <menu_item_call
+			label="Land Tool"
+			layout="topleft"
+			name="Land"
+			shortcut="control|5">
+           <menu_item_call.on_click
+              function="Tools.SelectTool"
+              parameter="land" />
+         </menu_item_call>
+	   </menu>
+        <menu
+         create_jump_keys="true"
+         label="Edit"
+         layout="topleft"
+         name="Edit"
+         tear_off="true">
+            <menu_item_call
+             label="Undo"
+             layout="topleft"
+             name="Undo"
+             shortcut="control|Z">
+                <menu_item_call.on_click
+                 function="Edit.Undo" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableUndo" />
+            </menu_item_call>
+            <menu_item_call
+             label="Redo"
+             layout="topleft"
+             name="Redo"
+             shortcut="control|Y">
+                <menu_item_call.on_click
+                 function="Edit.Redo" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableRedo" />
+            </menu_item_call>
+            <menu_item_separator
+             layout="topleft" />
+            <menu_item_call
+             label="Cut"
+             layout="topleft"
+             name="Cut"
+             shortcut="control|X">
+                <menu_item_call.on_click
+                 function="Edit.Cut" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableCut" />
+            </menu_item_call>
+            <menu_item_call
+             label="Copy"
+             layout="topleft"
+             name="Copy"
+             shortcut="control|C">
+                <menu_item_call.on_click
+                 function="Edit.Copy" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableCopy" />
+            </menu_item_call>
+            <menu_item_call
+             label="Paste"
+             layout="topleft"
+             name="Paste"
+             shortcut="control|V">
+                <menu_item_call.on_click
+                 function="Edit.Paste" />
+                <menu_item_call.on_enable
+                 function="Edit.EnablePaste" />
+            </menu_item_call>
+            <menu_item_call
+             label="Delete"
+             layout="topleft"
+             name="Delete"
+             shortcut="Del">
+                <menu_item_call.on_click
+                 function="Edit.Delete" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableDelete" />
+            </menu_item_call>
+            <menu_item_call
+             label="Duplicate"
+             layout="topleft"
+             name="Duplicate"
+             shortcut="control|D">
+                <menu_item_call.on_click
+                 function="Edit.Duplicate" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableDuplicate" />
+            </menu_item_call>
+            <menu_item_separator
+             layout="topleft" />
+            <menu_item_call
+             label="Select All"
+             layout="topleft"
+             name="Select All"
+             shortcut="control|A">
+                <menu_item_call.on_click
+                 function="Edit.SelectAll" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableSelectAll" />
+            </menu_item_call>
+            <menu_item_call
+             label="Deselect"
+             layout="topleft"
+             name="Deselect"
+             shortcut="control|E">
+                <menu_item_call.on_click
+                 function="Edit.Deselect" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableDeselect" />
+            </menu_item_call>
+        </menu>
+        <menu_item_separator
+           layout="topleft" />
+        <menu_item_call
+           label="Link"
+           layout="topleft"
+           name="Link"
+           shortcut="control|L">
+          <menu_item_call.on_click
+             function="Tools.Link" />
+          <menu_item_call.on_enable
+             function="Tools.EnableLink" />
+        </menu_item_call>
+        <menu_item_call
+           label="Unlink"
+           layout="topleft"
+           name="Unlink"
+           shortcut="control|shift|L">
+          <menu_item_call.on_click
+             function="Tools.Unlink" />
+          <menu_item_call.on_enable
+             function="Tools.EnableUnlink" />
+        </menu_item_call>
+        <menu_item_separator
+           layout="topleft" />
+        <menu_item_call
+           label="Focus on Selection"
+           layout="topleft"
+           name="Focus on Selection"
+           shortcut="H">
+          <menu_item_call.on_click
+             function="Tools.LookAtSelection"
+             parameter="focus" />
+          <menu_item_call.on_enable
+             function="Tools.SomethingSelectedNoHUD" />
+        </menu_item_call>
+        <menu_item_call
+           label="Zoom to Selection"
+           layout="topleft"
+           name="Zoom to Selection"
+           shortcut="shift|H">
+          <menu_item_call.on_click
+             function="Tools.LookAtSelection"
+             parameter="zoom" />
+          <menu_item_call.on_enable
+             function="Tools.SomethingSelectedNoHUD" />
+        </menu_item_call>
+        <menu_item_separator
+           layout="topleft" />
+        <menu
+         create_jump_keys="true"
+         label="Object"
+         layout="topleft"
+         name="Object"
+         tear_off="true">
+          <menu_item_call
+			 label="Buy"
+			 layout="topleft"
+			 name="Menu Object Take"
+			 visible="true">
+			<menu_item_call.on_click
+               function="Tools.BuyOrTake" />
+			<menu_item_call.on_enable
+               function="Tools.EnableBuyOrTake"
+               name="EnableBuyOrTake"
+               parameter="Buy,Take" />
+          </menu_item_call>
+          <menu_item_call
+			 label="Take Copy"
+			 layout="topleft"
+			 name="Take Copy">
+			<menu_item_call.on_click
+               function="Tools.TakeCopy" />
+			<menu_item_call.on_enable
+               function="Tools.EnableTakeCopy" />
+          </menu_item_call>
+          <menu_item_call
+			 label="Save Back to My Inventory"
+			 layout="topleft"
+			 name="Save Object Back to My Inventory">
+			<menu_item_call.on_click
+               function="Tools.SaveToInventory" />
+			<menu_item_call.on_enable
+               function="Tools.EnableSaveToInventory" />
+          </menu_item_call>
+          <menu_item_call
+			 label="Save Back to Object Contents"
+			 layout="topleft"
+			 name="Save Object Back to Object Contents">
+			<menu_item_call.on_click
+               function="Tools.SaveToObjectInventory" />
+			<menu_item_call.on_enable
+               function="Tools.EnableSaveToObjectInventory" />
+          </menu_item_call>
+		</menu>
+        <menu
+           create_jump_keys="true"
+           label="Scripts"
+           layout="topleft"
+           name="Scripts"
+           tear_off="true">
+          <menu_item_call
+             label="Recompile Scripts (Mono)"
+             layout="topleft"
+             name="Mono">
+            <menu_item_call.on_click
+               function="Tools.SelectedScriptAction"
+               parameter="compile mono" />
+            <menu_item_call.on_enable
+               function="EditableSelectedMono" />
+          </menu_item_call>
+          <menu_item_call
+             label="Recompile Scripts (LSL)"
+             layout="topleft"
+             name="LSL">
+            <menu_item_call.on_click
+               function="Tools.SelectedScriptAction"
+               parameter="compile lsl" />
+            <menu_item_call.on_enable
+               function="EditableSelected" />
+          </menu_item_call>
+          <menu_item_call
+             label="Reset Scripts"
+             layout="topleft"
+             name="Reset Scripts">
+            <menu_item_call.on_click
+               function="Tools.SelectedScriptAction"
+               parameter="reset" />
+            <menu_item_call.on_enable
+               function="EditableSelected" />
+          </menu_item_call>
+          <menu_item_call
+             label="Set Scripts to Running"
+             layout="topleft"
+             name="Set Scripts to Running">
+            <menu_item_call.on_click
+               function="Tools.SelectedScriptAction"
+               parameter="start" />
+            <menu_item_call.on_enable
+               function="EditableSelected" />
+          </menu_item_call>
+          <menu_item_call
+             label="Set Scripts to Not Running"
+             layout="topleft"
+             name="Set Scripts to Not Running">
+            <menu_item_call.on_click
+               function="Tools.SelectedScriptAction"
+               parameter="stop" />
+            <menu_item_call.on_enable
+               function="EditableSelected" />
+          </menu_item_call>
+        </menu>
+        <menu_item_separator
+           layout="topleft" />
+        <menu
+         create_jump_keys="true"
+         label="Options"
+         layout="topleft"
+         name="Options"
+         tear_off="true">
+            <menu_item_check
+             label="Edit Linked Parts"
+             layout="topleft"
+             name="Edit Linked Parts">
+                <menu_item_check.on_check
+                 control="EditLinkedParts" />
+                <menu_item_check.on_click
+                 function="Tools.EditLinkedParts"
+                 parameter="EditLinkedParts" />
+                <menu_item_check.on_enable
+                 function="Tools.EnableToolNotPie" />
+            </menu_item_check>
+            <menu_item_call
+             label="Set Default Upload Permissions"
+             layout="topleft"
+             name="perm prefs">
+                <menu_item_call.on_click
+                 function="Floater.Toggle"
+                 parameter="perm_prefs" />
+            </menu_item_call>
+			<menu_item_check
+			   label="Show Advanced Permissions"
+			   layout="topleft"
+			   name="DebugPermissions">
+			  <menu_item_check.on_check
+				 function="CheckControl"
+				 parameter="DebugPermissions" />
+			  <menu_item_check.on_click
+				 function="ToggleControl"
+				 parameter="DebugPermissions" />
+			</menu_item_check>
+            <!--menu_item_call
+             label="Show Script Warning/Error Window"
+             layout="topleft"
+             name="Show Script Warning/Error Window">
+                <menu_item_call.on_click
+                 function="ShowFloater"
+                 parameter="script errors" />
+            </menu_item_call-->
+            <menu_item_separator
+             layout="topleft" />
+            <menu
+             create_jump_keys="true"
+             label="Selection"
+             layout="topleft"
+             name="Selection"
+             tear_off="true">
+                <menu_item_check
+                 label="Select Only My Objects"
+                 layout="topleft"
+                 name="Select Only My Objects">
+                    <menu_item_check.on_check
+                     control="SelectOwnedOnly" />
+                    <menu_item_check.on_click
+                     function="Tools.SelectOnlyMyObjects"
+                     parameter="agents" />
+                </menu_item_check>
+                <menu_item_check
+                 label="Select Only Movable Objects"
+                 layout="topleft"
+                 name="Select Only Movable Objects">
+                    <menu_item_check.on_check
+                     control="SelectMovableOnly" />
+                    <menu_item_check.on_click
+                     function="Tools.SelectOnlyMovableObjects"
+                     parameter="movable" />
+                </menu_item_check>
+                <menu_item_check
+                 label="Select By Surrounding"
+                 layout="topleft"
+                 name="Select By Surrounding">
+                    <menu_item_check.on_check
+                     control="RectangleSelectInclusive" />
+                    <menu_item_check.on_click
+                     function="Tools.SelectBySurrounding" />
+                </menu_item_check>
+            </menu>
+            <menu
+             create_jump_keys="true"
+             label="Show"
+             layout="topleft"
+             name="Show"
+             tear_off="true">
+                <menu_item_check
+                 label="Show Hidden Selection"
+                 layout="topleft"
+                 name="Show Hidden Selection">
+                    <menu_item_check.on_check
+                     control="RenderHiddenSelections" />
+                    <menu_item_check.on_click
+                     function="Tools.ShowHiddenSelection" />
+                </menu_item_check>
+                <menu_item_check
+                 label="Show Light Radius for Selection"
+                 layout="topleft"
+                 name="Show Light Radius for Selection">
+                    <menu_item_check.on_check
+                     control="RenderLightRadius" />
+                    <menu_item_check.on_click
+                     function="Tools.ShowSelectionLightRadius" />
+                </menu_item_check>
+                <menu_item_check
+                 label="Show Selection Beam"
+                 layout="topleft"
+                 name="Show Selection Beam">
+                    <menu_item_check.on_check
+                     control="ShowSelectionBeam" />
+                    <menu_item_check.on_click
+                     function="ToggleControl"
+                     parameter="ShowSelectionBeam" />
+                </menu_item_check>
+            </menu>
+            <menu
+             create_jump_keys="true"
+             label="Grid"
+             layout="topleft"
+             name="Grid"
+             tear_off="true">
+                <menu_item_check
+                 label="Snap to Grid"
+                 layout="topleft"
+                 name="Snap to Grid"
+                 shortcut="G">
+                    <menu_item_check.on_check
+                     control="SnapEnabled" />
+                    <menu_item_check.on_click
+                     function="ToggleControl"
+                     parameter="SnapEnabled" />
+                    <menu_item_check.on_enable
+                     function="Tools.EnableToolNotPie" />
+                </menu_item_check>
+                <menu_item_call
+                 label="Snap Object XY to Grid"
+                 layout="topleft"
+                 name="Snap Object XY to Grid"
+                 shortcut="shift|X">
+                    <menu_item_call.on_click
+                     function="Tools.SnapObjectXY" />
+                    <menu_item_call.on_enable
+                     function="Tools.EnableToolNotPie" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Use Selection for Grid"
+                 layout="topleft"
+                 name="Use Selection for Grid"
+                 shortcut="shift|G">
+                    <menu_item_call.on_click
+                     function="Tools.UseSelectionForGrid" />
+                    <menu_item_call.on_enable
+                     function="SomethingSelected" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Grid Options"
+                 layout="topleft"
+                 name="Grid Options"
+                 shortcut="control|shift|B">
+                    <menu_item_call.on_click
+                     function="Floater.Show"
+                     parameter="build_options" />
+                    <menu_item_call.on_enable
+                     function="Tools.EnableToolNotPie" />
+                </menu_item_call>
+            </menu>
+        </menu>
+        <menu
+         create_jump_keys="true"
+         label="Select Linked Parts"
+         layout="topleft"
+         name="Select Linked Parts"
+         tear_off="true">
+            <menu_item_call
+             label="Select Next Part"
+             layout="topleft"
+             name="Select Next Part"
+	     shortcut="control|.">
+                <menu_item_call.on_click
+                 function="Tools.SelectNextPart"
+                 parameter="next" />
+                <menu_item_call.on_enable
+                 function="Tools.EnableSelectNextPart" />
+            </menu_item_call>
+            <menu_item_call
+             label="Select Previous Part"
+             layout="topleft"
+             name="Select Previous Part"
+	     shortcut="control|,">
+                <menu_item_call.on_click
+                 function="Tools.SelectNextPart"
+                 parameter="previous" />
+                <menu_item_call.on_enable
+                 function="Tools.EnableSelectNextPart" />
+            </menu_item_call>
+            <menu_item_call
+             label="Include Next Part"
+             layout="topleft"
+             name="Include Next Part"
+	     shortcut="control|shift|.">
+                <menu_item_call.on_click
+                 function="Tools.SelectNextPart"
+                 parameter="includenext" />
+                <menu_item_call.on_enable
+                 function="Tools.EnableSelectNextPart" />
+            </menu_item_call>
+            <menu_item_call
+             label="Include Previous Part"
+             layout="topleft"
+             name="Include Previous Part"
+	     shortcut="control|shift|,">
+                <menu_item_call.on_click
+                 function="Tools.SelectNextPart"
+                 parameter="includeprevious" />
+                <menu_item_call.on_enable
+                 function="Tools.EnableSelectNextPart" />
+            </menu_item_call>
+        </menu>
+    </menu>
+    <menu
+     label="Help"
+     layout="topleft"
+     name="Help"
+     tear_off="true">
+        <menu_item_call
+         label="[SECOND_LIFE] Help"
+         layout="topleft"
+         name="Second Life Help"
+         shortcut="F1">
+            <menu_item_call.on_click
+             function="ShowFloater"
+             parameter="help f1" />
+        </menu_item_call>
+        <menu_item_call
+         label="Tutorial"
+         layout="topleft"
+         name="Tutorial">
+            <menu_item_call.on_click
+             function="Floater.Show"
+             parameter="hud" />
+        </menu_item_call>
+        <menu_item_separator
+             layout="topleft" />
+        <menu_item_call
+             label="Report Abuse"
+             layout="topleft"
+             name="Report Abuse">
+                <menu_item_call.on_click
+                 function="ShowFloater"
+                 parameter="complaint reporter" />
+            </menu_item_call>
+        <menu_item_separator
+             layout="topleft" />
+        <menu_item_call
+         label="About [APP_NAME]"
+         layout="topleft"
+         name="About Second Life">
+            <menu_item_call.on_click
+             function="Floater.Show"
+             parameter="sl_about" />
+        </menu_item_call>
+    </menu>
+    <menu
+     label="Advanced"
+     layout="topleft"
+     name="Advanced"
+     tear_off="true"
+     visible="false">
+        <menu_item_check
+         label="Set Away After 30 Minutes"
+         layout="topleft"
+         name="Go Away/AFK When Idle">
+            <menu_item_check.on_check
+             function="CheckControl"
+             parameter="AllowIdleAFK" />
+            <menu_item_check.on_click
+             function="ToggleControl"
+             parameter="AllowIdleAFK" />
+        </menu_item_check>
+        <menu_item_call
+         label="Stop Animating Me"
+         layout="topleft"
+         name="Stop Animating My Avatar">
+            <menu_item_call.on_click
+             function="Tools.StopAllAnimations" />
+        </menu_item_call>
+        <menu_item_call
+         label="Rebake Textures"
+         layout="topleft"
+         name="Rebake Texture"
+         shortcut="control|alt|R">
+            <menu_item_call.on_click
+             function="Advanced.RebakeTextures" />
+        </menu_item_call>
+        <menu_item_call
+           label="Set UI Size to Default"
+           layout="topleft"
+           name="Set UI Size to Default">
+          <menu_item_call.on_click
+             function="View.DefaultUISize" />
+        </menu_item_call>
+        <menu_item_separator/>
+        <menu_item_check
+         label="Limit Select Distance"
+         layout="topleft"
+         name="Limit Select Distance">
+            <menu_item_check.on_check
+             function="CheckControl"
+             parameter="LimitSelectDistance" />
+            <menu_item_check.on_click
+             function="ToggleControl"
+             parameter="LimitSelectDistance" />
+        </menu_item_check>
+        <menu_item_check
+         label="Disable Camera Constraints"
+         layout="topleft"
+         name="Disable Camera Distance">
+            <menu_item_check.on_check
+             function="CheckControl"
+             parameter="DisableCameraConstraints" />
+            <menu_item_check.on_click
+             function="ToggleControl"
+             parameter="DisableCameraConstraints" />
+        </menu_item_check>
+        <menu_item_separator
+         layout="topleft" />
+        <menu_item_check
+         label="High-res Snapshot"
+         layout="topleft"
+         name="HighResSnapshot">
+            <menu_item_check.on_check
+             function="CheckControl"
+             parameter="HighResSnapshot" />
+            <menu_item_check.on_click
+             function="ToggleControl"
+             parameter="HighResSnapshot" />
+        </menu_item_check>
+        <menu_item_check
+         label="Quiet Snapshots to Disk"
+         layout="topleft"
+         name="QuietSnapshotsToDisk">
+            <menu_item_check.on_check
+             function="CheckControl"
+             parameter="QuietSnapshotsToDisk" />
+            <menu_item_check.on_click
+             function="ToggleControl"
+             parameter="QuietSnapshotsToDisk" />
+        </menu_item_check>
+        <menu_item_check
+         label="Compress Snapshots to Disk"
+         layout="topleft"
+         name="CompressSnapshotsToDisk">
+            <menu_item_check.on_check
+             function="CheckControl"
+             parameter="CompressSnapshotsToDisk" />
+            <menu_item_check.on_click
+             function="ToggleControl"
+             parameter="CompressSnapshotsToDisk" />
+        </menu_item_check>
+        <menu_item_call
+         label="Save Texture As"
+         layout="topleft"
+         name="Save Texture As">
+            <menu_item_call.on_click
+             function="File.SaveTexture" />
+            <menu_item_call.on_enable
+             function="File.EnableSaveAs" />
+        </menu_item_call>
+        <menu_item_separator
+         layout="topleft" />
+        <menu
+         create_jump_keys="true"
+         label="Performance Tools"
+         layout="topleft"
+         name="Performance Tools"
+         tear_off="true">
+            <menu_item_call
+             label="Lag Meter"
+             layout="topleft"
+             name="Lag Meter">
+                <menu_item_call.on_click
+                 function="Floater.Show"
+                 parameter="lagmeter" />
+            </menu_item_call>
+            <menu_item_check
+             label="Statistics Bar"
+             layout="topleft"
+             name="Statistics Bar"
+             shortcut="control|shift|1">
+                <menu_item_check.on_check
+                 function="Floater.Visible"
+                 parameter="stats" />
+                <menu_item_check.on_click
+                 function="Floater.Toggle"
+                 parameter="stats" />
+            </menu_item_check>
+      <menu_item_check
+        label="Show Avatar Rendering Cost"
+        layout="topleft"
+        name="Avatar Rendering Cost">
+           <menu_item_check.on_check
+            function="Advanced.CheckInfoDisplay"
+            parameter="shame" />
+           <menu_item_check.on_click
+            function="Advanced.ToggleInfoDisplay"
+            parameter="shame" />
+       </menu_item_check>
+        </menu>
+        <menu
+         create_jump_keys="true"
+         label="Highlighting and Visibility"
+         layout="topleft"
+         name="Highlighting and Visibility"
+         tear_off="true">
+         <menu_item_check
+                 label="Cheesy Beacon"
+                 layout="topleft"
+                 name="Cheesy Beacon">
+                    <menu_item_check.on_check
+                     function="CheckControl"
+                     parameter="CheesyBeacon" />
+                    <menu_item_check.on_click
+                     function="ToggleControl"
+                     parameter="CheesyBeacon" />
+                </menu_item_check>
+            <menu_item_check
+             label="Hide Particles"
+             layout="topleft"
+             name="Hide Particles"
+             shortcut="control|alt|shift|=">
+                <menu_item_check.on_check
+                 function="View.CheckRenderType"
+                 parameter="hideparticles" />
+                <menu_item_check.on_click
+                 function="View.ToggleRenderType"
+                 parameter="hideparticles" />
+            </menu_item_check>
+            <menu_item_check
+             label="Hide Selected"
+             layout="topleft"
+             name="Hide Selected">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="HideSelectedObjects" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="HideSelectedObjects" />
+            </menu_item_check>
+            <menu_item_check
+             label="Highlight Transparent"
+             layout="topleft"
+             name="Highlight Transparent"
+             shortcut="control|alt|T">
+                <menu_item_check.on_check
+                 function="View.CheckHighlightTransparent" />
+                <menu_item_check.on_click
+                 function="View.HighlightTransparent" />
+            </menu_item_check>
+            <menu_item_check
+             label="Show HUD Attachments"
+             layout="topleft"
+             name="Show HUD Attachments"
+             shortcut="alt|shift|H">
+                <menu_item_check.on_check
+                 function="View.CheckHUDAttachments" />
+                <menu_item_check.on_click
+                 function="View.ShowHUDAttachments" />
+            </menu_item_check>
+            <menu_item_check
+             label="Show Mouselook Crosshairs"
+             layout="topleft"
+             name="ShowCrosshairs">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="ShowCrosshairs" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="ShowCrosshairs" />
+            </menu_item_check>
+  <!-- <menu
+         create_jump_keys="true"
+         label="Hover Tips"
+         layout="topleft"
+         name="Hover Tips"
+         tear_off="true">
+            <menu_item_check
+             label="Show Tips"
+             layout="topleft"
+             name="Show Tips"
+             shortcut="control|shift|T">
+                <menu_item_check.on_check
+                 function="View.CheckShowHoverTips" />
+                <menu_item_check.on_click
+                 function="View.ShowHoverTips" />
+            </menu_item_check>
+            <menu_item_separator
+             layout="topleft" />-->
+            <menu_item_check
+             label="Show Land Tooltips"
+             layout="topleft"
+             name="Land Tips">
+                <menu_item_check.on_check
+                 control="ShowLandHoverTip" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="ShowLandHoverTip" />
+                <menu_item_check.on_enable
+                 function="View.CheckShowHoverTips" />
+            </menu_item_check>
+ <!--           <menu_item_check
+             label="Show Tips On All Objects"
+             layout="topleft"
+             name="Tips On All Objects">
+                <menu_item_check.on_check
+                 control="ShowAllObjectHoverTip" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="ShowAllObjectHoverTip" />
+                <menu_item_check.on_enable
+                 function="View.CheckShowHoverTips" />
+            </menu_item_check>
+        </menu>-->
+
+        </menu>
+
+        <menu
+         create_jump_keys="true"
+         label="Rendering Types"
+         layout="topleft"
+         name="Rendering Types"
+         tear_off="true">
+            <menu_item_check
+             label="Simple"
+             layout="topleft"
+             name="Simple"
+             shortcut="control|alt|shift|1">
+                <menu_item_check.on_check
+                 function="Advanced.CheckRenderType"
+                 parameter="simple" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleRenderType"
+                 parameter="simple" />
+            </menu_item_check>
+            <menu_item_check
+             label="Alpha"
+             layout="topleft"
+             name="Alpha"
+             shortcut="control|alt|shift|2">
+                <menu_item_check.on_check
+                 function="Advanced.CheckRenderType"
+                 parameter="alpha" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleRenderType"
+                 parameter="alpha" />
+            </menu_item_check>
+            <menu_item_check
+             label="Tree"
+             layout="topleft"
+             name="Tree"
+             shortcut="control|alt|shift|3">
+                <menu_item_check.on_check
+                 function="Advanced.CheckRenderType"
+                 parameter="tree" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleRenderType"
+                 parameter="tree" />
+            </menu_item_check>
+            <menu_item_check
+             label="Avatars"
+             layout="topleft"
+             name="Character"
+             shortcut="control|alt|shift|4">
+                <menu_item_check.on_check
+                 function="Advanced.CheckRenderType"
+                 parameter="character" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleRenderType"
+                 parameter="character" />
+            </menu_item_check>
+            <menu_item_check
+             label="SurfacePath"
+             layout="topleft"
+             name="SurfacePath"
+             shortcut="control|alt|shift|5">
+                <menu_item_check.on_check
+                 function="Advanced.CheckRenderType"
+                 parameter="surfacePath" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleRenderType"
+                 parameter="surfacePath" />
+            </menu_item_check>
+            <menu_item_check
+             label="Sky"
+             layout="topleft"
+             name="Sky"
+             shortcut="control|alt|shift|6">
+                <menu_item_check.on_check
+                 function="Advanced.CheckRenderType"
+                 parameter="sky" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleRenderType"
+                 parameter="sky" />
+            </menu_item_check>
+            <menu_item_check
+             label="Water"
+             layout="topleft"
+             name="Water"
+             shortcut="control|alt|shift|7">
+                <menu_item_check.on_check
+                 function="Advanced.CheckRenderType"
+                 parameter="water" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleRenderType"
+                 parameter="water" />
+            </menu_item_check>
+            <menu_item_check
+             label="Ground"
+             layout="topleft"
+             name="Ground"
+             shortcut="control|alt|shift|8">
+                <menu_item_check.on_check
+                 function="Advanced.CheckRenderType"
+                 parameter="ground" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleRenderType"
+                 parameter="ground" />
+            </menu_item_check>
+            <menu_item_check
+             label="Volume"
+             layout="topleft"
+             name="Volume"
+             shortcut="control|alt|shift|9">
+                <menu_item_check.on_check
+                 function="Advanced.CheckRenderType"
+                 parameter="volume" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleRenderType"
+                 parameter="volume" />
+            </menu_item_check>
+            <menu_item_check
+             label="Grass"
+             layout="topleft"
+             name="Grass"
+             shortcut="control|alt|shift|0">
+                <menu_item_check.on_check
+                 function="Advanced.CheckRenderType"
+                 parameter="grass" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleRenderType"
+                 parameter="grass" />
+            </menu_item_check>
+            <menu_item_check
+             label="Clouds"
+             layout="topleft"
+             name="Clouds"
+             shortcut="control|alt|shift|-">
+                <menu_item_check.on_check
+                 function="Advanced.CheckRenderType"
+                 parameter="clouds" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleRenderType"
+                 parameter="clouds" />
+            </menu_item_check>
+            <menu_item_check
+             label="Particles"
+             layout="topleft"
+             name="Particles"
+             shortcut="control|alt|shift|=">
+                <menu_item_check.on_check
+                 function="Advanced.CheckRenderType"
+                 parameter="particles" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleRenderType"
+                 parameter="particles" />
+            </menu_item_check>
+            <menu_item_check
+             label="Bump"
+             layout="topleft"
+             name="Bump"
+             shortcut="control|alt|shift|\">
+                <menu_item_check.on_check
+                 function="Advanced.CheckRenderType"
+                 parameter="bump" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleRenderType"
+                 parameter="bump" />
+            </menu_item_check>
+        </menu>
+        <menu
+         create_jump_keys="true"
+         label="Rendering Features"
+         layout="topleft"
+         name="Rendering Features"
+         tear_off="true">
+            <menu_item_check
+             label="UI"
+             layout="topleft"
+             name="UI"
+             shortcut="control|alt|F1">
+                <menu_item_check.on_check
+                 function="Advanced.CheckFeature"
+                 parameter="ui" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleFeature"
+                 parameter="ui" />
+            </menu_item_check>
+            <menu_item_check
+             label="Selected"
+             layout="topleft"
+             name="Selected"
+             shortcut="control|alt|F2">
+                <menu_item_check.on_check
+                 function="Advanced.CheckFeature"
+                 parameter="selected" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleFeature"
+                 parameter="selected" />
+            </menu_item_check>
+            <menu_item_check
+             label="Highlighted"
+             layout="topleft"
+             name="Highlighted"
+             shortcut="control|alt|F3">
+                <menu_item_check.on_check
+                 function="Advanced.CheckFeature"
+                 parameter="highlighted" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleFeature"
+                 parameter="highlighted" />
+            </menu_item_check>
+            <menu_item_check
+             label="Dynamic Textures"
+             layout="topleft"
+             name="Dynamic Textures"
+             shortcut="control|alt|F4">
+                <menu_item_check.on_check
+                 function="Advanced.CheckFeature"
+                 parameter="dynamic textures" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleFeature"
+                 parameter="dynamic textures" />
+            </menu_item_check>
+            <menu_item_check
+             label="Foot Shadows"
+             layout="topleft"
+             name="Foot Shadows"
+             shortcut="control|alt|F5">
+                <menu_item_check.on_check
+                 function="Advanced.CheckFeature"
+                 parameter="foot shadows" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleFeature"
+                 parameter="foot shadows" />
+            </menu_item_check>
+            <menu_item_check
+             label="Fog"
+             layout="topleft"
+             name="Fog"
+             shortcut="control|alt|F6">
+                <menu_item_check.on_check
+                 function="Advanced.CheckFeature"
+                 parameter="fog" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleFeature"
+                 parameter="fog" />
+            </menu_item_check>
+            <menu_item_check
+             label="Test FRInfo"
+             layout="topleft"
+             name="Test FRInfo"
+             shortcut="control|alt|F8">
+                <menu_item_check.on_check
+                 function="Advanced.CheckFeature"
+                 parameter="fr info" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleFeature"
+                 parameter="fr info" />
+            </menu_item_check>
+            <menu_item_check
+             label="Flexible Objects"
+             layout="topleft"
+             name="Flexible Objects"
+             shortcut="control|alt|F9">
+                <menu_item_check.on_check
+                 function="Advanced.CheckFeature"
+                 parameter="flexible" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleFeature"
+                 parameter="flexible" />
+            </menu_item_check>
+        </menu>
+        <menu_item_check
+         label="Run Multiple Threads"
+         layout="topleft"
+         name="Run Multiple Threads">
+            <menu_item_check.on_check
+             function="CheckControl"
+             parameter="RunMultipleThreads" />
+            <menu_item_check.on_click
+             function="ToggleControl"
+             parameter="RunMultipleThreads" />
+        </menu_item_check>
+        <menu_item_call
+         label="Clear Group Cache"
+         layout="topleft"
+         name="ClearGroupCache">
+            <menu_item_call.on_click
+             function="Advanced.ClearGroupCache"
+             parameter="ClearGroupCache" />
+        </menu_item_call>
+        <menu_item_check
+         label="Mouse Smoothing"
+         layout="topleft"
+         name="Mouse Smoothing">
+            <menu_item_check.on_check
+             function="CheckControl"
+             parameter="MouseSmooth" />
+            <menu_item_check.on_click
+             function="ToggleControl"
+             parameter="MouseSmooth" />
+        </menu_item_check>
+        <menu_item_separator
+         layout="topleft" />
+        <menu
+         label="Shortcuts"
+         layout="topleft"
+         name="Shortcuts"
+         tear_off="true"
+         visible="false">
+            <menu_item_check
+               label="Search"
+               layout="topleft"
+               name="Search"
+               shortcut="control|F">
+            <menu_item_check.on_check
+             function="Floater.Visible"
+             parameter="search" />
+            <menu_item_check.on_click
+             function="Floater.Toggle"
+             parameter="search" />
+            </menu_item_check>
+            <menu_item_call
+             enabled="false"
+             label="Release Keys"
+             layout="topleft"
+             name="Release Keys">
+                <menu_item_call.on_click
+                 function="Tools.ReleaseKeys"
+                 parameter="" />
+                <menu_item_call.on_enable
+                 function="Tools.EnableReleaseKeys"
+                 parameter="" />
+            </menu_item_call>
+            <menu_item_call
+             label="Set UI Size to Default"
+             layout="topleft"
+             name="Set UI Size to Default">
+                <menu_item_call.on_click
+                 function="View.DefaultUISize" />
+            </menu_item_call>
+            <menu_item_separator
+             layout="topleft" />
+            <menu_item_check
+             label="Always Run"
+             layout="topleft"
+             name="Always Run"
+             shortcut="control|R">
+                <menu_item_check.on_check
+                 function="World.CheckAlwaysRun" />
+                <menu_item_check.on_click
+                 function="World.AlwaysRun" />
+            </menu_item_check>
+            <menu_item_check
+             label="Fly"
+             layout="topleft"
+             name="Fly"
+             shortcut="Home">
+                <menu_item_check.on_click
+                 function="Agent.toggleFlying" />
+                <menu_item_check.on_enable
+                 function="Agent.enableFlying" />
+            </menu_item_check>
+            <menu_item_separator
+             layout="topleft" />
+            <menu_item_call
+             label="Close Window"
+             layout="topleft"
+             name="Close Window"
+             shortcut="control|W">
+                <menu_item_call.on_click
+                 function="File.CloseWindow" />
+                <menu_item_call.on_enable
+                 function="File.EnableCloseWindow" />
+            </menu_item_call>
+            <menu_item_call
+             label="Close All Windows"
+             layout="topleft"
+             name="Close All Windows"
+             shortcut="control|shift|W">
+                <menu_item_call.on_click
+                 function="File.CloseAllWindows" />
+                <menu_item_call.on_enable
+                 function="File.EnableCloseAllWindows" />
+            </menu_item_call>
+            <menu_item_separator
+             layout="topleft" />
+            <menu_item_call
+             label="Snapshot to Disk"
+             layout="topleft"
+             name="Snapshot to Disk"
+             shortcut="control|`"
+             use_mac_ctrl="true">
+                <menu_item_call.on_click
+                 function="File.TakeSnapshotToDisk" />
+            </menu_item_call>
+            <menu_item_separator
+             layout="topleft" />
+            <menu_item_call
+             label="Mouselook"
+             layout="topleft"
+             name="Mouselook"
+             shortcut="M">
+                <menu_item_call.on_click
+                 function="View.Mouselook" />
+                <menu_item_call.on_enable
+                 function="View.EnableMouselook" />
+            </menu_item_call>
+            <menu_item_check
+             label="Joystick Flycam"
+             layout="topleft"
+             name="Joystick Flycam"
+             shortcut="alt|shift|F">
+                <menu_item_check.on_check
+                 function="View.CheckJoystickFlycam" />
+                <menu_item_check.on_click
+                 function="View.JoystickFlycam" />
+                <menu_item_check.on_enable
+                 function="View.EnableJoystickFlycam" />
+            </menu_item_check>
+            <menu_item_call
+             label="Reset View"
+             layout="topleft"
+             name="Reset View"
+             shortcut="Esc">
+                <menu_item_call.on_click
+                 function="View.ResetView" />
+            </menu_item_call>
+            <menu_item_call
+             label="Look at Last Chatter"
+             layout="topleft"
+             name="Look at Last Chatter"
+             shortcut="control|\">
+                <menu_item_call.on_click
+                 function="View.LookAtLastChatter" />
+                <menu_item_call.on_enable
+                 function="View.EnableLastChatter" />
+            </menu_item_call>
+            <menu_item_separator
+             layout="topleft" />
+            <menu
+             create_jump_keys="true"
+             label="Select Build Tool"
+             layout="topleft"
+             name="Select Tool"
+             tear_off="true">
+                <menu_item_call
+                 label="Focus Tool"
+                 layout="topleft"
+                 name="Focus"
+                 shortcut="control|1">
+                    <menu_item_call.on_click
+                     function="Tools.SelectTool"
+                     parameter="focus" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Move Tool"
+                 layout="topleft"
+                 name="Move"
+                 shortcut="control|2">
+                    <menu_item_call.on_click
+                     function="Tools.SelectTool"
+                     parameter="move" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Edit Tool"
+                 layout="topleft"
+                 name="Edit"
+                 shortcut="control|3">
+                    <menu_item_call.on_click
+                     function="Tools.SelectTool"
+                     parameter="edit" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Create Tool"
+                 layout="topleft"
+                 name="Create"
+                 shortcut="control|4">
+                    <menu_item_call.on_click
+                     function="Tools.SelectTool"
+                     parameter="create" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Land Tool"
+                 layout="topleft"
+                 name="Land"
+                 shortcut="control|5">
+                    <menu_item_call.on_click
+                     function="Tools.SelectTool"
+                     parameter="land" />
+                </menu_item_call>
+            </menu>
+            <menu_item_separator
+             layout="topleft" />
+            <menu_item_call
+             label="Zoom In"
+             layout="topleft"
+             name="Zoom In"
+             shortcut="control|0">
+                <menu_item_call.on_click
+                 function="View.ZoomIn" />
+            </menu_item_call>
+            <menu_item_call
+             label="Zoom Default"
+             layout="topleft"
+             name="Zoom Default"
+             shortcut="control|9">
+                <menu_item_call.on_click
+                 function="View.ZoomDefault" />
+            </menu_item_call>
+            <menu_item_call
+             label="Zoom Out"
+             layout="topleft"
+             name="Zoom Out"
+             shortcut="control|8">
+                <menu_item_call.on_click
+                 function="View.ZoomOut" />
+            </menu_item_call>
+            <menu_item_separator
+             layout="topleft" />
+            <menu_item_call
+             label="Toggle Fullscreen"
+             layout="topleft"
+             name="Toggle Fullscreen"
+             >
+               <!-- Note: shortcut="alt|Enter" was deleted from the preceding node-->
+                <menu_item_call.on_click
+                 function="View.Fullscreen" />
+            </menu_item_call>
+        </menu>
+        <menu_item_separator
+         layout="topleft" />
+        <menu_item_call
+         label="Show Debug Settings"
+         layout="topleft"
+         name="Debug Settings">
+            <menu_item_call.on_click
+             function="Advanced.ShowDebugSettings"
+             parameter="all" />
+        </menu_item_call>
+     <menu_item_check
+         label="Show Develop Menu"
+         layout="topleft"
+         name="Debug Mode"
+         shortcut="control|alt|Q">
+            <menu_item_check.on_check
+             function="CheckControl"
+             parameter="QAMode" />
+            <menu_item_check.on_click
+             function="ToggleControl"
+             parameter="QAMode" />
+        </menu_item_check>
+    </menu>
+    <menu
+     create_jump_keys="true"
+     label="Develop"
+     layout="topleft"
+     name="Develop"
+     tear_off="true"
+     visible="false">
+        <menu
+         create_jump_keys="true"
+         label="Consoles"
+         layout="topleft"
+         name="Consoles"
+         tear_off="true">
+            <menu_item_check
+             label="Texture Console"
+             layout="topleft"
+             name="Texture Console"
+             shortcut="control|shift|3"
+             use_mac_ctrl="true">
+                <menu_item_check.on_check
+                 function="Advanced.CheckConsole"
+                 parameter="texture" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleConsole"
+                 parameter="texture" />
+            </menu_item_check>
+            <menu_item_check
+             label="Debug Console"
+             layout="topleft"
+             name="Debug Console"
+             shortcut="control|shift|4"
+             use_mac_ctrl="true">
+                <menu_item_check.on_check
+                 function="Advanced.CheckConsole"
+                 parameter="debug" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleConsole"
+                 parameter="debug" />
+            </menu_item_check>
+            <menu_item_call
+             label="Notifications Console"
+             layout="topleft"
+             name="Notifications"
+             shortcut="control|shift|5">
+              <menu_item_call.on_click
+               function="Floater.Toggle"
+               parameter="notifications_console" />
+            </menu_item_call>
+            <menu_item_check
+               label="Texture Size Console"
+               layout="topleft"
+               name="Texture Size"
+               shortcut="control|shift|6">
+              <menu_item_check.on_check
+               function="Advanced.CheckConsole"
+               parameter="texture size" />
+              <menu_item_check.on_click
+               function="Advanced.ToggleConsole"
+               parameter="texture size" />
+            </menu_item_check>
+            <menu_item_check
+               label="Texture Category Console"
+               layout="topleft"
+               name="Texture Category"
+               shortcut="control|shift|7">
+              <menu_item_check.on_check
+               function="Advanced.CheckConsole"
+               parameter="texture category" />
+              <menu_item_check.on_click
+               function="Advanced.ToggleConsole"
+               parameter="texture category" />
+            </menu_item_check>
+            <menu_item_check
+             label="Fast Timers"
+             layout="topleft"
+             name="Fast Timers"
+             shortcut="control|shift|9"
+             use_mac_ctrl="true">
+                <menu_item_check.on_check
+                 function="Advanced.CheckConsole"
+                 parameter="fast timers" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleConsole"
+                 parameter="fast timers" />
+            </menu_item_check>
+            <menu_item_check
+             label="Memory"
+             layout="topleft"
+             name="Memory"
+             shortcut="control|shift|0"
+             use_mac_ctrl="true">
+                <menu_item_check.on_check
+                 function="Advanced.CheckConsole"
+                 parameter="memory view" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleConsole"
+                 parameter="memory view" />
+            </menu_item_check>
+            <menu_item_separator
+             layout="topleft" />
+            <menu_item_call
+             label="Region Info to Debug Console"
+             layout="topleft"
+             name="Region Info to Debug Console">
+                <menu_item_call.on_click
+                 function="Advanced.DumpInfoToConsole"
+                 parameter="region" />
+            </menu_item_call>
+            <menu_item_call
+             label="Group Info to Debug Console"
+             layout="topleft"
+             name="Group Info to Debug Console">
+                <menu_item_call.on_click
+                 function="Advanced.DumpInfoToConsole"
+                 parameter="group" />
+            </menu_item_call>
+            <menu_item_call
+             label="Capabilities Info to Debug Console"
+             layout="topleft"
+             name="Capabilities Info to Debug Console">
+                <menu_item_call.on_click
+                 function="Advanced.DumpInfoToConsole"
+                 parameter="capabilities" />
+            </menu_item_call>
+            <menu_item_separator
+         layout="topleft" />
+            <menu_item_check
+             label="Camera"
+             layout="topleft"
+             name="Camera">
+                <menu_item_check.on_check
+                 function="Advanced.CheckHUDInfo"
+                 parameter="camera" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleHUDInfo"
+                 parameter="camera" />
+            </menu_item_check>
+            <menu_item_check
+             label="Wind"
+             layout="topleft"
+             name="Wind">
+                <menu_item_check.on_check
+                 function="Advanced.CheckHUDInfo"
+                 parameter="wind" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleHUDInfo"
+                 parameter="wind" />
+            </menu_item_check>
+            <menu_item_check
+             label="FOV"
+             layout="topleft"
+             name="FOV">
+                <menu_item_check.on_check
+                 function="Advanced.CheckHUDInfo"
+                 parameter="fov" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleHUDInfo"
+                 parameter="fov" />
+            </menu_item_check>
+        </menu>
+        <menu
+         create_jump_keys="true"
+         label="Show Info"
+         layout="topleft"
+         name="Display Info"
+         tear_off="true">
+            <menu_item_check
+             label="Show Time"
+             layout="topleft"
+             name="Show Time">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="DebugShowTime" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="DebugShowTime" />
+            </menu_item_check>
+            <menu_item_check
+             label="Show Render Info"
+             layout="topleft"
+             name="Show Render Info">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="DebugShowRenderInfo" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="DebugShowRenderInfo" />
+            </menu_item_check>
+            <menu_item_check
+             label="Show Matrices"
+             layout="topleft"
+             name="Show Matrices">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="DebugShowRenderMatrices" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="DebugShowRenderMatrices" />
+            </menu_item_check>
+            <menu_item_check
+             label="Show Color Under Cursor"
+             layout="topleft"
+             name="Show Color Under Cursor">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="DebugShowColor" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="DebugShowColor" />
+            </menu_item_check>
+            <menu_item_separator
+             layout="topleft" />
+            <menu_item_check
+             label="Show Updates to Objects"
+             layout="topleft"
+             name="Show Updates"
+             shortcut="control|alt|shift|U">
+                <menu_item_check.on_check
+                 function="Advanced.CheckShowObjectUpdates"
+                 parameter="ObjectUpdates" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleShowObjectUpdates" />
+            </menu_item_check>
+        </menu>
+        <menu_item_separator
+         layout="topleft" />
+        <menu
+         create_jump_keys="true"
+         label="Force an Error"
+         layout="topleft"
+         name="Force Errors"
+         tear_off="true">
+            <menu_item_call
+             label="Force Breakpoint"
+             layout="topleft"
+             name="Force Breakpoint"
+             shortcut="control|alt|shift|B">
+                <menu_item_call.on_click
+                 function="Advanced.ForceErrorBreakpoint" />
+            </menu_item_call>
+            <menu_item_call
+             label="Force LLError And Crash"
+             layout="topleft"
+             name="Force LLError And Crash">
+                <menu_item_call.on_click
+                 function="Advanced.ForceErrorLlerror" />
+            </menu_item_call>
+            <menu_item_call
+             label="Force Bad Memory Access"
+             layout="topleft"
+             name="Force Bad Memory Access">
+                <menu_item_call.on_click
+                 function="Advanced.ForceErrorBadMemoryAccess" />
+            </menu_item_call>
+            <menu_item_call
+             label="Force Infinite Loop"
+             layout="topleft"
+             name="Force Infinite Loop">
+                <menu_item_call.on_click
+                 function="Advanced.ForceErrorInfiniteLoop" />
+            </menu_item_call>
+            <menu_item_call
+             label="Force Driver Crash"
+             layout="topleft"
+             name="Force Driver Carsh">
+                <menu_item_call.on_click
+                 function="Advanced.ForceErrorDriverCrash" />
+            </menu_item_call>
+            <menu_item_call
+             label="Force Software Exception"
+             layout="topleft"
+             name="Force Software Exception">
+                <menu_item_call.on_click
+                 function="Advanced.ForceErrorSoftwareException" />
+            </menu_item_call>
+            <menu_item_call
+             label="Force Disconnect Viewer"
+             layout="topleft"
+             name="Force Disconnect Viewer">
+                <menu_item_call.on_click
+                 function="Advanced.ForceErrorDisconnectViewer" />
+            </menu_item_call>
+            <menu_item_call
+             label="Simulate a Memory Leak"
+             layout="topleft"
+             name="Memory Leaking Simulation">
+               <menu_item_call.on_click
+                function="Floater.Show"
+                parameter="mem_leaking" />
+               </menu_item_call>
+        </menu>
+        <menu
+         create_jump_keys="true"
+         label="Render Tests"
+         layout="topleft"
+         name="Render Tests"
+         tear_off="true">
+            <menu_item_check
+             label="Camera Offset"
+             layout="topleft"
+             name="Camera Offset">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="CameraOffset" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="CameraOffset" />
+            </menu_item_check>
+            <menu_item_check
+             label="Randomize Framerate"
+             layout="topleft"
+             name="Randomize Framerate">
+                <menu_item_check.on_check
+                 function="Advanced.CheckRandomizeFramerate"
+                 parameter="Randomize Framerate" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleRandomizeFramerate" />
+            </menu_item_check>
+            <menu_item_check
+             label="Periodic Slow Frame"
+             layout="topleft"
+             name="Periodic Slow Frame">
+                <menu_item_check.on_check
+                 function="Advanced.CheckPeriodicSlowFrame"
+                 parameter="points" />
+                <menu_item_check.on_click
+                 function="Advanced.TogglePeriodicSlowFrame"
+                 parameter="points" />
+            </menu_item_check>
+            <menu_item_check
+             label="Frame Test"
+             layout="topleft"
+             name="Frame Test">
+                <menu_item_check.on_check
+                 function="Advanced.CheckFrameTest"
+                 parameter="Frame Test" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleFrameTest" />
+            </menu_item_check>
+        </menu>
+      <menu
+        create_jump_keys="true"
+        label="Render Metadata"
+        layout="topleft"
+        name="Render Metadata"
+        tear_off="true">
+        <menu_item_check
+         label="Bounding Boxes"
+         layout="topleft"
+         name="Bounding Boxes">
+        <menu_item_check.on_check
+         function="Advanced.CheckInfoDisplay"
+         parameter="bboxes" />
+        <menu_item_check.on_click
+         function="Advanced.ToggleInfoDisplay"
+         parameter="bboxes" />
+        </menu_item_check>
+        <menu_item_check
+         label="Octree"
+         layout="topleft"
+         name="Octree">
+          <menu_item_check.on_check
+           function="Advanced.CheckInfoDisplay"
+           parameter="octree" />
+          <menu_item_check.on_click
+           function="Advanced.ToggleInfoDisplay"
+           parameter="octree" />
+        </menu_item_check>
+        <menu_item_check
+         label="Shadow Frusta"
+         layout="topleft"
+         name="Shadow Frusta">
+          <menu_item_check.on_check
+           function="Advanced.CheckInfoDisplay"
+           parameter="shadow frusta" />
+          <menu_item_check.on_click
+           function="Advanced.ToggleInfoDisplay"
+           parameter="shadow frusta" />
+        </menu_item_check>
+        <menu_item_check
+         label="Occlusion"
+         layout="topleft"
+         name="Occlusion">
+          <menu_item_check.on_check
+           function="Advanced.CheckInfoDisplay"
+           parameter="occlusion" />
+          <menu_item_check.on_click
+           function="Advanced.ToggleInfoDisplay"
+           parameter="occlusion" />
+        </menu_item_check>
+        <menu_item_check
+         label="Render Batches"
+         layout="topleft"
+         name="Render Batches">
+          <menu_item_check.on_check
+           function="Advanced.CheckInfoDisplay"
+           parameter="render batches" />
+          <menu_item_check.on_click
+           function="Advanced.ToggleInfoDisplay"
+           parameter="render batches" />
+        </menu_item_check>
+        <menu_item_check
+         label="Texture Anim"
+         layout="topleft"
+         name="Texture Anim">
+          <menu_item_check.on_check
+           function="Advanced.CheckInfoDisplay"
+           parameter="texture anim" />
+          <menu_item_check.on_click
+           function="Advanced.ToggleInfoDisplay"
+           parameter="texture anim" />
+        </menu_item_check>
+        <menu_item_check
+         label="Texture Priority"
+         layout="topleft"
+         name="Texture Priority">
+          <menu_item_check.on_check
+           function="Advanced.CheckInfoDisplay"
+           parameter="texture priority" />
+          <menu_item_check.on_click
+           function="Advanced.ToggleInfoDisplay"
+           parameter="texture priority" />
+        </menu_item_check>
+        <menu_item_check
+         label="Texture Area"
+         layout="topleft"
+         name="Texture Area">
+          <menu_item_check.on_check
+           function="Advanced.CheckInfoDisplay"
+           parameter="texture area" />
+          <menu_item_check.on_click
+           function="Advanced.ToggleInfoDisplay"
+           parameter="texture area" />
+        </menu_item_check>
+        <menu_item_check
+         label="Face Area"
+         layout="topleft"
+         name="Face Area">
+          <menu_item_check.on_check
+           function="Advanced.CheckInfoDisplay"
+           parameter="face area" />
+          <menu_item_check.on_click
+           function="Advanced.ToggleInfoDisplay"
+           parameter="face area" />
+        </menu_item_check>
+        <menu_item_check
+         label="Lights"
+         layout="topleft"
+         name="Lights">
+          <menu_item_check.on_check
+           function="Advanced.CheckInfoDisplay"
+           parameter="lights" />
+          <menu_item_check.on_click
+           function="Advanced.ToggleInfoDisplay"
+           parameter="lights" />
+        </menu_item_check>
+        <menu_item_check
+         label="Collision Skeleton"
+         layout="topleft"
+         name="Collision Skeleton">
+          <menu_item_check.on_check
+           function="Advanced.CheckInfoDisplay"
+           parameter="collision skeleton" />
+          <menu_item_check.on_click
+           function="Advanced.ToggleInfoDisplay"
+           parameter="collision skeleton" />
+        </menu_item_check>
+        <menu_item_check
+         label="Raycast"
+         layout="topleft"
+         name="Raycast">
+          <menu_item_check.on_check
+           function="Advanced.CheckInfoDisplay"
+           parameter="raycast" />
+          <menu_item_check.on_click
+           function="Advanced.ToggleInfoDisplay"
+           parameter="raycast" />
+        </menu_item_check>
+      </menu>
+        <menu
+         create_jump_keys="true"
+         label="Rendering"
+         layout="topleft"
+         name="Rendering"
+         tear_off="true">
+            <menu_item_check
+             label="Axes"
+             name="Axes">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="ShowAxes" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="ShowAxes" />
+            </menu_item_check>
+            <menu_item_check
+             label="Tangent Basis"
+             name="Tangent Basis">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="ShowTangentBasis" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="ShowTangentBasis" />
+            </menu_item_check>
+            <menu_item_call
+             label="Selected Texture Info Basis"
+             name="Selected Texture Info Basis"
+             shortcut="control|alt|shift|T">
+                <menu_item_call.on_click
+                 function="Advanced.SelectedTextureInfo" />
+            </menu_item_call>
+            <menu_item_check
+             label="Wireframe"
+             name="Wireframe"
+             shortcut="control|shift|R">
+                <menu_item_check.on_check
+                 function="Advanced.CheckWireframe"
+                 parameter="Wireframe" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleWireframe" />
+            </menu_item_check>
+            <menu_item_check
+             label="Object-Object Occlusion"
+             name="Object-Object Occlusion"
+             shortcut="control|shift|O">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="UseOcclusion" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="UseOcclusion" />
+                <menu_item_check.on_enable
+                 function="Advanced.EnableObjectObjectOcclusion" />
+            </menu_item_check>
+          <menu_item_check
+             label="Framebuffer Objects"
+             name="Framebuffer Objects">
+            <menu_item_check.on_check
+             function="CheckControl"
+             parameter="RenderUseFBO" />
+            <menu_item_check.on_click
+             function="ToggleControl"
+             parameter="RenderUseFBO" />
+            <menu_item_check.on_enable
+                 function="Advanced.EnableRenderFBO" />
+           </menu_item_check>
+          <menu_item_check
+                       label="Deferred Rendering"
+                       name="Deferred Rendering">
+            <menu_item_check.on_check
+             function="CheckControl"
+             parameter="RenderDeferred" />
+            <menu_item_check.on_click
+             function="ToggleControl"
+             parameter="RenderDeferred" />
+            <menu_item_check.on_enable
+                 function="Advanced.EnableRenderDeferred" />
+          </menu_item_check>
+          <menu_item_check
+                   label="Global Illumintation"
+                   name="Global Illumination">
+            <menu_item_check.on_check
+             function="CheckControl"
+             parameter="RenderDeferredGI" />
+            <menu_item_check.on_click
+             function="ToggleControl"
+             parameter="RenderDeferredGI" />
+            <menu_item_check.on_enable
+                 function="Advanced.EnableRenderDeferredGI" />
+          </menu_item_check>
+          <menu_item_separator />
+          <menu_item_check
+             label="Debug GL"
+             name="Debug GL">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="RenderDebugGL" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="RenderDebugGL" />
+            </menu_item_check>
+            <menu_item_check
+             label="Debug Pipeline"
+             name="Debug Pipeline">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="RenderDebugGL" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="RenderDebugGL" />
+            </menu_item_check>
+            <menu_item_check
+             label="Fast Alpha"
+             name="Fast Alpha">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="RenderDebugGL" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="RenderDebugGL" />
+            </menu_item_check>
+            <menu_item_check
+             label="Animation Textures"
+             name="Animation Textures">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="RenderDebugGL" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="RenderDebugGL" />
+            </menu_item_check>
+            <menu_item_check
+             label="Disable Textures"
+             name="Disable Textures">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="TextureDisable" />
+                <menu_item_check.on_click
+                 function="ToggleControl" 
+                 parameter="TextureDisable" />
+            </menu_item_check>
+            <menu_item_check
+              label="Full Res Textures"
+             layout="topleft"
+             name="Rull Res Textures">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="TextureLoadFullRes" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="TextureLoadFullRes" />
+            </menu_item_check>
+            <menu_item_check
+               label="Audit Textures"
+               layout="topleft"
+               name="Audit Textures">
+              <menu_item_check.on_check
+               function="CheckControl"
+               parameter="AuditTexture" />
+              <menu_item_check.on_click
+               function="ToggleControl"
+               parameter="AuditTexture" />
+            </menu_item_check>
+            <menu_item_check
+             label="Texture Atlas"
+             name="Texture Atlas">
+              <menu_item_check.on_check
+               function="CheckControl"
+               parameter="EnableTextureAtlas" />
+              <menu_item_check.on_click
+               function="ToggleControl"
+               parameter="EnableTextureAtlas" />
+            </menu_item_check>
+              <menu_item_check
+             label="Render Attached Lights"
+             name="Render Attached Lights">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="RenderAttachedLights" />
+                <menu_item_check.on_click
+                 function="Advanced.HandleAttchedLightParticles"
+                 parameter="RenderAttachedLights" />
+            </menu_item_check>
+            <menu_item_check
+             label="Render Attached Particles"
+             name="Render Attached Particles">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="RenderAttachedParticles" />
+                <menu_item_check.on_click
+                 function="Advanced.HandleAttchedLightParticles"
+                 parameter="RenderAttachedParticles" />
+            </menu_item_check>
+            <menu_item_check
+             label="Hover Glow Objects"
+             name="Hover Glow Objects">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="RenderHoverGlowEnable" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="RenderHoverGlowEnable" />
+            </menu_item_check>
+        </menu>
+
+        <menu
+         create_jump_keys="true"
+         label="Network"
+         layout="topleft"
+         name="Network"
+         tear_off="true">
+            <menu_item_check
+             label="Pause Agent"
+             layout="topleft"
+             name="AgentPause">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="AgentPause" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="AgentPause" />
+            </menu_item_check>
+            <menu_item_separator
+             layout="topleft" />
+            <menu_item_call
+             label="Enable Message Log"
+             layout="topleft"
+             name="Enable Message Log">
+                <menu_item_call.on_click
+                 function="Advanced.EnableMessageLog" />
+            </menu_item_call>
+            <menu_item_call
+             label="Disable Message Log"
+             layout="topleft"
+             name="Disable Message Log">
+                <menu_item_call.on_click
+                 function="Advanced.DisableMessageLog" />
+            </menu_item_call>
+            <menu_item_separator
+             layout="topleft" />
+            <menu_item_check
+             label="Velocity Interpolate Objects"
+             layout="topleft"
+             name="Velocity Interpolate Objects">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="VelocityInterpolate" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="VelocityInterpolate" />
+            </menu_item_check>
+            <menu_item_check
+             label="Ping Interpolate Object Positions"
+             layout="topleft"
+             name="Ping Interpolate Object Positions">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="PingInterpolate" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="PingInterpolate" />
+            </menu_item_check>
+            <menu_item_separator
+             layout="topleft" />
+            <menu_item_call
+             label="Drop a Packet"
+             layout="topleft"
+             name="Drop a Packet"
+             shortcut="control|alt|L">
+                <menu_item_call.on_click
+                 function="Advanced.DropPacket" />
+            </menu_item_call>
+        </menu>
+        <menu_item_call
+         label="Dump Scripted Camera"
+         layout="topleft"
+         name="Dump Scripted Camera">
+            <menu_item_call.on_click
+             function="Advanced.DumpScriptedCamera" />
+        </menu_item_call>
+        <menu_item_call
+             label="Bumps, Pushes &amp; Hits"
+             layout="topleft"
+             name="Bumps, Pushes &amp;amp; Hits">
+                <menu_item_call.on_click
+                 function="Floater.Show"
+                 parameter="bumps" />
+            </menu_item_call>
+
+        <menu
+         create_jump_keys="true"
+         label="Recorder"
+         layout="topleft"
+         name="Recorder"
+         tear_off="true">
+            <menu_item_call
+             label="Start Playback"
+             layout="topleft"
+             name="Start Playback">
+                <menu_item_call.on_click
+                 function="Advanced.AgentPilot"
+                 parameter="start playback" />
+            </menu_item_call>
+            <menu_item_call
+             label="Stop Playback"
+             layout="topleft"
+             name="Stop Playback">
+                <menu_item_call.on_click
+                 function="Advanced.AgentPilot"
+                 parameter="stop playback" />
+            </menu_item_call>
+            <menu_item_check
+             label="Loop Playback"
+             layout="topleft"
+             name="Loop Playback">
+                <menu_item_check.on_check
+                 function="Advanced.CheckAgentPilotLoop"
+                 parameter="loopPlayback" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleAgentPilotLoop" />
+            </menu_item_check>
+            <menu_item_call
+             label="Start Record"
+             layout="topleft"
+             name="Start Record">
+                <menu_item_call.on_click
+                 function="Advanced.AgentPilot"
+                 parameter="start record" />
+            </menu_item_call>
+            <menu_item_call
+             label="Stop Record"
+             layout="topleft"
+             name="Stop Record">
+                <menu_item_call.on_click
+                 function="Advanced.AgentPilot"
+                 parameter="stop record" />
+            </menu_item_call>
+        </menu>
+
+        <menu
+         create_jump_keys="true"
+         label="World"
+         layout="topleft"
+         name="World"
+         tear_off="true">
+            <menu_item_check
+             label="Sim Sun Override"
+             layout="topleft"
+             name="Sim Sun Override">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="SkyOverrideSimSunPosition" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="SkyOverrideSimSunPosition" />
+            </menu_item_check>
+            <menu_item_check
+             label="Cheesy Beacon"
+             layout="topleft"
+             name="Cheesy Beacon">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="CheesyBeacon" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="CheesyBeacon" />
+            </menu_item_check>
+            <menu_item_check
+             label="Fixed Weather"
+             layout="topleft"
+             name="Fixed Weather">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="FixedWeather" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="FixedWeather" />
+            </menu_item_check>
+            <menu_item_call
+             label="Dump Region Object Cache"
+             layout="topleft"
+             name="Dump Region Object Cache">
+                <menu_item_call.on_click
+                 function="Advanced.DumpRegionObjectCache" />
+            </menu_item_call>
+        </menu>
+        <menu
+         create_jump_keys="true"
+         label="UI"
+         layout="topleft"
+         name="UI"
+         tear_off="true">
+         <!--   <menu_item_check
+             label="New Bottom Bar"
+             layout="topleft"
+             name="New Bottom Bar">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="BottomPanelNew" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="BottomPanelNew" />
+            </menu_item_check>-->
+            <menu_item_call
+             label="Web Browser Test"
+             layout="topleft"
+             name="Web Browser Test">
+                <menu_item_call.on_click
+                 function="Advanced.WebBrowserTest"
+                 parameter="http://secondlife.com/app/search/slurls.html"/>
+            </menu_item_call>
+            <menu_item_call
+             label="Dump SelectMgr"
+             layout="topleft"
+             name="Dump SelectMgr">
+                <menu_item_call.on_click
+                 function="Advanced.DumpSelectMgr" />
+            </menu_item_call>
+            <menu_item_call
+             label="Dump Inventory"
+             layout="topleft"
+             name="Dump Inventory">
+                <menu_item_call.on_click
+                 function="Advanced.DumpInventory" />
+            </menu_item_call>
+            <menu_item_call
+             label="Dump Timers"
+             name="Dump Timers">
+                <menu_item_call.on_click
+                 function="Advanced.DumpTimers" />
+            </menu_item_call>
+            <menu_item_call
+             label="Dump Focus Holder"
+             layout="topleft"
+             name="Dump Focus Holder"
+             shortcut="control|alt|F">
+                <menu_item_call.on_click
+                 function="Advanced.DumpFocusHolder" />
+            </menu_item_call>
+            <menu_item_call
+             label="Print Selected Object Info"
+             layout="topleft"
+             name="Print Selected Object Info"
+             shortcut="control|shift|P">
+                <menu_item_call.on_click
+                 function="Advanced.PrintSelectedObjectInfo" />
+            </menu_item_call>
+            <menu_item_call
+             label="Print Agent Info"
+             layout="topleft"
+             name="Print Agent Info"
+             shortcut="shift|P">
+                <menu_item_call.on_click
+                 function="Advanced.PrintAgentInfo" />
+            </menu_item_call>
+            <menu_item_call
+             label="Memory Stats"
+             layout="topleft"
+             name="Memory Stats"
+             shortcut="control|alt|shift|M">
+                <menu_item_call.on_click
+                 function="Advanced.PrintTextureMemoryStats" />
+            </menu_item_call>
+            <menu_item_check
+             label="Double-ClickAuto-Pilot"
+             layout="topleft"
+             name="Double-ClickAuto-Pilot">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="DoubleClickAutoPilot" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="DoubleClickAutoPilot" />
+            </menu_item_check>
+
+            <menu_item_separator />
+            <menu_item_check
+             label="Debug SelectMgr"
+             layout="topleft"
+             name="Debug SelectMgr">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="DebugSelectMgr" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="DebugSelectMgr" />
+            </menu_item_check>
+            <menu_item_check
+             label="Debug Clicks"
+             layout="topleft"
+             name="Debug Clicks">
+                <menu_item_check.on_check
+                 function="Advanced.CheckDebugClicks"
+                 parameter="DebugClicks" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleDebugClicks"
+                 parameter="DebugClicks" />
+            </menu_item_check>
+            <menu_item_check
+             label="Debug Views"
+             layout="topleft"
+             name="Debug Views">
+                <menu_item_check.on_check
+                 function="Advanced.CheckDebugViews" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleDebugViews" />
+            </menu_item_check>
+            <menu_item_check
+             label="Debug Name Tooltips"
+             layout="topleft"
+             name="Debug Name Tooltips">
+                <menu_item_check.on_check
+                 function="Advanced.CheckXUINameTooltips"
+                 parameter="XUINameTooltips" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleXUINameTooltips" />
+            </menu_item_check>
+            <menu_item_check
+             label="Debug Mouse Events"
+             layout="topleft"
+             name="Debug Mouse Events">
+                <menu_item_check.on_check
+                 function="Advanced.CheckDebugMouseEvents"
+                 parameter="MouseEvents" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleDebugMouseEvents" />
+            </menu_item_check>
+            <menu_item_check
+             label="Debug Keys"
+             layout="topleft"
+             name="Debug Keys">
+                <menu_item_check.on_check
+                 function="Advanced.CheckDebugKeys"
+                 parameter="DebugKeys" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleDebugKeys" />
+            </menu_item_check>
+            <menu_item_check
+             label="Debug WindowProc"
+             layout="topleft"
+             name="Debug WindowProc">
+                <menu_item_check.on_check
+                 function="Advanced.CheckDebugWindowProc"
+                 parameter="DebugWindowProc" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleDebugWindowProc"
+                 parameter="DebugWindowProc" />
+            </menu_item_check>
+        </menu>
+        <menu
+         create_jump_keys="true"
+         label="XUI"
+         name="XUI"
+         tear_off="true">
+            <menu_item_call
+               label="Reload Color Settings"
+               layout="topleft"
+               name="Reload Color Settings">
+              <menu_item_call.on_click
+               function="Advanced.ReloadColorSettings" />
+            </menu_item_call>
+            <menu_item_call
+             label="Show Font Test"
+             layout="topleft"
+             name="Show Font Test">
+                <menu_item_call.on_click
+                 function="Floater.Show"
+                 parameter="font_test" />
+            </menu_item_call>
+            <menu_item_call
+             label="Load from XML"
+             layout="topleft"
+             name="Load from XML">
+                <menu_item_call.on_click
+                 function="Advanced.LoadUIFromXML" />
+            </menu_item_call>
+            <menu_item_call
+             label="Save to XML"
+             layout="topleft"
+             name="Save to XML">
+                <menu_item_call.on_click
+                 function="Advanced.SaveUIToXML" />
+            </menu_item_call>
+            <menu_item_check
+             label="Show XUI Names"
+             layout="topleft"
+             name="Show XUI Names">
+                <menu_item_check.on_check
+                 function="Advanced.CheckXUINames"
+                 parameter="showUIname" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleXUINames" />
+            </menu_item_check>
+          <menu_item_call
+           label="Send Test IMs"
+           layout="topleft"
+           name="Send Test IMs">
+            <menu_item_call.on_click
+             function="Advanced.SendTestIMs" />
+          </menu_item_call>
+          <menu_item_call
+           label="Test Inspectors"
+           name="Test Inspectors"
+           shortcut="control|shift|I">
+            <menu_item_call.on_click
+             function="Floater.Show"
+             parameter="test_inspectors" />
+          </menu_item_call>
+        </menu>
+        <menu
+         create_jump_keys="true"
+         label="Avatar"
+         layout="topleft"
+         name="Character"
+         tear_off="true">
+            <menu
+             create_jump_keys="true"
+             label="Grab Baked Texture"
+             layout="topleft"
+             name="Grab Baked Texture"
+             tear_off="true">
+                <menu_item_call
+                 label="Iris"
+                 layout="topleft"
+                 name="Iris">
+                    <menu_item_call.on_click
+                     function="Advanced.GrabBakedTexture"
+                     parameter="iris" />
+                    <menu_item_call.on_enable
+                     function="Advanced.EnableGrabBakedTexture"
+					 parameter="iris" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Head"
+                 layout="topleft"
+                 name="Head">
+                    <menu_item_call.on_click
+                     function="Advanced.GrabBakedTexture"
+                     parameter="head" />
+                    <menu_item_call.on_enable
+                     function="Advanced.EnableGrabBakedTexture"
+					 parameter="head" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Upper Body"
+                 layout="topleft"
+                 name="Upper Body">
+                    <menu_item_call.on_click
+                     function="Advanced.GrabBakedTexture"
+                     parameter="upper" />
+                    <menu_item_call.on_enable
+                     function="Advanced.EnableGrabBakedTexture"
+					 parameter="upper" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Lower Body"
+                 layout="topleft"
+                 name="Lower Body">
+                    <menu_item_call.on_click
+                     function="Advanced.GrabBakedTexture"
+                     parameter="lower" />
+                    <menu_item_call.on_enable
+                     function="Advanced.EnableGrabBakedTexture"
+					 parameter="lower" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Skirt"
+                 layout="topleft"
+                 name="Skirt">
+                    <menu_item_call.on_click
+                     function="Advanced.GrabBakedTexture"
+                     parameter="skirt" />
+                    <menu_item_call.on_enable
+                     function="Advanced.EnableGrabBakedTexture"
+					 parameter="skirt" />
+                </menu_item_call>
+            </menu>
+            <menu
+             create_jump_keys="true"
+             label="Character Tests"
+             layout="topleft"
+             name="Character Tests"
+             tear_off="true">
+                <menu_item_call
+                 label="Appearance To XML"
+                 layout="topleft"
+                 name="Appearance To XML">
+                    <menu_item_call.on_click
+                     function="Advanced.AppearanceToXML" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Toggle Character Geometry"
+                 layout="topleft"
+                 name="Toggle Character Geometry">
+                    <menu_item_call.on_click
+                     function="Advanced.ToggleCharacterGeometry" />
+                    <menu_item_call.on_enable
+                     function="IsGodCustomerService" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Test Male"
+                 layout="topleft"
+                 name="Test Male">
+                    <menu_item_call.on_click
+                     function="Advanced.TestMale" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Test Female"
+                 layout="topleft"
+                 name="Test Female">
+                    <menu_item_call.on_click
+                     function="Advanced.TestFemale" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Toggle PG"
+                 layout="topleft"
+                 name="Toggle PG">
+                    <menu_item_call.on_click
+                     function="Advanced.TogglePG" />
+                </menu_item_call>
+                <menu_item_check
+                 label="Allow Select Avatar"
+                 layout="topleft"
+                 name="Allow Select Avatar">
+                    <menu_item_check.on_check
+                     function="CheckControl"
+                     parameter="AllowSelectAvatar" />
+                    <menu_item_check.on_click
+                     function="ToggleControl"
+                     parameter="AllowSelectAvatar" />
+                </menu_item_check>
+            </menu>
+            <menu_item_call
+             label="Force Params to Default"
+             layout="topleft"
+             name="Force Params to Default">
+                <menu_item_call.on_click
+                 function="Advanced.ForceParamsToDefault" />
+            </menu_item_call>
+            <menu_item_check
+             label="Animation Info"
+             layout="topleft"
+             name="Animation Info">
+                <menu_item_check.on_check
+                 function="Advanced.CheckAnimationInfo"
+                 parameter="AnimationInfo" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleAnimationInfo"
+                 parameter="" />
+            </menu_item_check>
+            <menu_item_check
+             label="Slow Motion Animations"
+             layout="topleft"
+             name="Slow Motion Animations">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="SlowMotionAnimation" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="SlowMotionAnimation" />
+            </menu_item_check>
+            <menu_item_check
+             label="Show Look At"
+             layout="topleft"
+             name="Show Look At">
+                <menu_item_check.on_check
+                 function="Advanced.CheckShowLookAt"
+                 parameter="ShowLookAt" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleShowLookAt" />
+            </menu_item_check>
+            <menu_item_check
+             label="Show Point At"
+             layout="topleft"
+             name="Show Point At">
+                <menu_item_check.on_check
+                 function="Advanced.CheckShowPointAt"
+                 parameter="ShowPointAt" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleShowPointAt" />
+            </menu_item_check>
+            <menu_item_check
+             label="Debug Joint Updates"
+             layout="topleft"
+             name="Debug Joint Updates">
+                <menu_item_check.on_check
+                 function="Advanced.CheckDebugJointUpdates"
+                 parameter="DebugJointUpdates" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleDebugJointUpdates" />
+            </menu_item_check>
+            <menu_item_check
+             label="Disable LOD"
+             layout="topleft"
+             name="Disable LOD">
+                <menu_item_check.on_check
+                 function="Advanced.CheckDisableLOD"
+                 parameter="DisableLOD" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleDisableLOD" />
+            </menu_item_check>
+            <menu_item_check
+             label="Debug Character Vis"
+             layout="topleft"
+             name="Debug Character Vis">
+                <menu_item_check.on_check
+                 function="Advanced.CheckDebugCharacterVis"
+                 parameter="DebugCharacterVis" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleDebugCharacterVis" />
+            </menu_item_check>
+            <menu_item_check
+             label="Show Collision Skeleton"
+             layout="topleft"
+             name="Show Collision Skeleton">
+                <menu_item_check.on_check
+                 function="Advanced.CheckInfoDisplay"
+                 parameter="collision skeleton" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleInfoDisplay"
+                 parameter="collision skeleton" />
+            </menu_item_check>
+            <menu_item_check
+             label="Display Agent Target"
+             layout="topleft"
+             name="Display Agent Target">
+                <menu_item_check.on_check
+                 function="Advanced.CheckInfoDisplay"
+                 parameter="agent target" />
+                <menu_item_check.on_click
+                 function="Advanced.ToggleInfoDisplay"
+                 parameter="agent target" />
+            </menu_item_check>
+<!-- Appears not to exist anymore
+            <menu_item_check
+             label="Debug Rotation"
+             layout="topleft"
+             name="Debug Rotation">
+                <menu_item_check.on_check
+                 function="CheckControl"
+                 parameter="DebugAvatarRotation" />
+                <menu_item_check.on_click
+                 function="ToggleControl"
+                 parameter="DebugAvatarRotation" />
+            </menu_item_check> -->
+-->
+            <menu_item_call
+             label="Dump Attachments"
+             layout="topleft"
+             name="Dump Attachments">
+                <menu_item_call.on_click
+                 function="Advanced.DumpAttachments" />
+            </menu_item_call>
+            <menu_item_call
+             label="Debug Avatar Textures"
+             layout="topleft"
+             name="Debug Avatar Textures"
+             shortcut="control|alt|shift|A">
+                <menu_item_call.on_click
+                 function="Advanced.DebugAvatarTextures" />
+            </menu_item_call>
+            <menu_item_call
+             label="Dump Local Textures"
+             layout="topleft"
+             name="Dump Local Textures"
+             shortcut="alt|shift|M">
+                <menu_item_call.on_click
+                 function="Advanced.DumpAvatarLocalTextures" />
+            </menu_item_call>
+        </menu>
+        <menu_item_separator
+         layout="topleft" />
+        <menu_item_call
+         label="Compress Images"
+         layout="topleft"
+         name="Compress Images">
+            <menu_item_call.on_click
+             function="Advanced.CompressImage" />
+        </menu_item_call>
+        <menu_item_check
+         label="Output Debug Minidump"
+         layout="topleft"
+         name="Output Debug Minidump">
+            <menu_item_check.on_check
+             function="CheckControl"
+             parameter="SaveMinidump" />
+            <menu_item_check.on_click
+             function="ToggleControl"
+             parameter="SaveMinidump" />
+        </menu_item_check>
+        <menu_item_check
+         label="Console Window on next Run"
+         layout="topleft"
+         name="Console Window">
+            <menu_item_check.on_check
+             function="CheckControl"
+             parameter="ShowConsoleWindow" />
+            <menu_item_check.on_click
+             function="ToggleControl"
+             parameter="ShowConsoleWindow" />
+        </menu_item_check>
+        <menu_item_separator
+         layout="topleft" />
+        <menu_item_check
+         label="Show Admin Menu"
+         layout="topleft"
+         name="View Admin Options">
+            <menu_item_check.on_check
+             function="Advanced.CheckViewAdminOptions"
+             parameter="ViewAdminOptions" />
+            <menu_item_check.on_click
+             function="Advanced.ToggleViewAdminOptions" />
+        </menu_item_check>
+        <menu_item_call
+         label="Request Admin Status"
+         layout="topleft"
+         name="Request Admin Options"
+         shortcut="control|alt|G">
+            <menu_item_call.on_click
+             function="Advanced.RequestAdminStatus" />
+        </menu_item_call>
+        <menu_item_call
+         label="Leave Admin Status"
+         layout="topleft"
+         name="Leave Admin Options"
+         shortcut="control|alt|shift|G">
+            <menu_item_call.on_click
+             function="Advanced.LeaveAdminStatus" />
+        </menu_item_call>
+    </menu>
+    <menu
+     create_jump_keys="true"
+     label="Admin"
+     layout="topleft"
+     name="Admin"
+     tear_off="true"
+     visible="false">
+        <menu
+         create_jump_keys="true"
+         label="Object"
+         layout="topleft"
+         tear_off="true">
+            <menu_item_call
+             label="Take Copy"
+             layout="topleft"
+             name="Take Copy"
+             shortcut="control|alt|shift|O">
+                <menu_item_call.on_click
+                 function="Admin.ForceTakeCopy" />
+                <menu_item_call.on_enable
+                 function="IsGodCustomerService" />
+            </menu_item_call>
+            <menu_item_call
+             label="Force Owner To Me"
+             layout="topleft"
+             name="Force Owner To Me">
+                <menu_item_call.on_click
+                 function="Admin.HandleObjectOwnerSelf" />
+                <menu_item_call.on_enable
+                 function="IsGodCustomerService" />
+            </menu_item_call>
+            <menu_item_call
+             label="Force Owner Permissive"
+             layout="topleft"
+             name="Force Owner Permissive">
+                <menu_item_call.on_click
+                 function="Admin.HandleObjectOwnerPermissive" />
+                <menu_item_call.on_enable
+                 function="IsGodCustomerService" />
+            </menu_item_call>
+            <menu_item_call
+             label="Delete"
+             layout="topleft"
+             name="Delete"
+             shortcut="control|alt|shift|Del">
+                <menu_item_call.on_click
+                 function="Admin.HandleForceDelete" />
+                <menu_item_call.on_enable
+                 function="IsGodCustomerService" />
+            </menu_item_call>
+            <menu_item_call
+             label="Lock"
+             layout="topleft"
+             name="Lock"
+             shortcut="control|alt|shift|L">
+                <menu_item_call.on_click
+                 function="Admin.HandleObjectLock" />
+                <menu_item_call.on_enable
+                 function="IsGodCustomerService" />
+            </menu_item_call>
+            <menu_item_call
+             label="Get Assets IDs"
+             layout="topleft"
+             name="Get Assets IDs"
+             shortcut="control|alt|shift|I">
+                <menu_item_call.on_click
+                 function="Admin.HandleObjectAssetIDs" />
+                <menu_item_call.on_enable
+                 function="IsGodCustomerService" />
+            </menu_item_call>
+        </menu>
+        <menu
+         create_jump_keys="true"
+         label="Parcel"
+         layout="topleft"
+         name="Parcel"
+         tear_off="true">
+            <menu_item_call
+             label="Owner To Me"
+             layout="topleft"
+             name="Owner To Me">
+                <menu_item_call.on_click
+                 function="Admin.HandleForceParcelOwnerToMe" />
+                <menu_item_call.on_enable
+                 function="IsGodCustomerService" />
+            </menu_item_call>
+            <menu_item_call
+             label="Set to Linden Content"
+             layout="topleft"
+             name="Set to Linden Content"
+             shortcut="control|alt|shift|C">
+                <menu_item_call.on_click
+                 function="Admin.HandleForceParcelToContent" />
+                <menu_item_call.on_enable
+                 function="IsGodCustomerService" />
+            </menu_item_call>
+            <menu_item_call
+             label="Claim Public Land"
+             layout="topleft"
+             name="Claim Public Land">
+                <menu_item_call.on_click
+                 function="Admin.HandleClaimPublicLand" />
+                <menu_item_call.on_enable
+                 function="IsGodCustomerService" />
+            </menu_item_call>
+        </menu>
+        <menu
+         create_jump_keys="true"
+         label="Region"
+         layout="topleft"
+         name="Region"
+         tear_off="true">
+            <menu_item_call
+             label="Dump Temp Asset Data"
+             layout="topleft"
+             name="Dump Temp Asset Data">
+                <menu_item_call.on_click
+                 function="Admin.HandleRegionDumpTempAssetData" />
+                <menu_item_call.on_enable
+                 function="IsGodCustomerService" />
+            </menu_item_call>
+            <menu_item_call
+             label="Save Region State"
+             layout="topleft"
+             name="Save Region State">
+                <menu_item_call.on_click
+                 function="Admin.OnSaveState" />
+                <menu_item_call.on_enable
+                 function="IsGodCustomerService" />
+            </menu_item_call>
+        </menu>
+        <menu_item_call
+         label="God Tools"
+         layout="topleft"
+         name="God Tools">
+            <menu_item_call.on_click
+             function="Floater.Show"
+             parameter="god_tools" />
+            <menu_item_call.on_enable
+             function="IsGodCustomerService" />
+        </menu_item_call>
+    </menu>
+    <menu
+     create_jump_keys="true"
+     label="Admin"
+     layout="topleft"
+     name="Deprecated"
+     tear_off="true"
+     visible="false">
+        <menu
+         create_jump_keys="true"
+         label="Attach Object"
+         layout="topleft"
+         mouse_opaque="false"
+         name="Attach Object"
+         tear_off="true" />
+        <menu
+         create_jump_keys="true"
+         label="Detach Object"
+         layout="topleft"
+         mouse_opaque="false"
+         name="Detach Object"
+         tear_off="true" />
+        <menu
+         create_jump_keys="true"
+         label="Take Off Clothing"
+         layout="topleft"
+         mouse_opaque="false"
+         name="Take Off Clothing"
+         tear_off="true">
+            <menu_item_call
+             label="Shirt"
+             layout="topleft"
+             name="Shirt">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="shirt" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableTakeOff"
+                 parameter="shirt" />
+            </menu_item_call>
+            <menu_item_call
+             label="Pants"
+             layout="topleft"
+             name="Pants">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="pants" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableTakeOff"
+                 parameter="pants" />
+            </menu_item_call>
+            <menu_item_call
+             label="Shoes"
+             layout="topleft"
+             name="Shoes">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="shoes" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableTakeOff"
+                 parameter="shoes" />
+            </menu_item_call>
+            <menu_item_call
+             label="Socks"
+             layout="topleft"
+             name="Socks">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="socks" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableTakeOff"
+                 parameter="socks" />
+            </menu_item_call>
+            <menu_item_call
+             label="Jacket"
+             layout="topleft"
+             name="Jacket">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="jacket" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableTakeOff"
+                 parameter="jacket" />
+            </menu_item_call>
+            <menu_item_call
+             label="Gloves"
+             layout="topleft"
+             name="Gloves">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="gloves" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableTakeOff"
+                 parameter="gloves" />
+            </menu_item_call>
+            <menu_item_call
+             label="Undershirt"
+             layout="topleft"
+             name="Menu Undershirt">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="undershirt" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableTakeOff"
+                 parameter="undershirt" />
+            </menu_item_call>
+            <menu_item_call
+             label="Underpants"
+             layout="topleft"
+             name="Menu Underpants">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="underpants" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableTakeOff"
+                 parameter="underpants" />
+            </menu_item_call>
+            <menu_item_call
+             label="Skirt"
+             layout="topleft"
+             name="Skirt">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="skirt" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableTakeOff"
+                 parameter="skirt" />
+            </menu_item_call>
+            <menu_item_call
+             label="Alpha"
+             layout="topleft"
+             name="Alpha">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="alpha" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableTakeOff"
+                 parameter="alpha" />
+            </menu_item_call>
+            <menu_item_call
+             label="Tattoo"
+             layout="topleft"
+             name="Tattoo">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="tattoo" />
+                <menu_item_call.on_enable
+                 function="Edit.EnableTakeOff"
+                 parameter="tattoo" />
+            </menu_item_call>
+            <menu_item_call
+             label="All Clothes"
+             layout="topleft"
+             name="All Clothes">
+                <menu_item_call.on_click
+                 function="Edit.TakeOff"
+                 parameter="all" />
+            </menu_item_call>
+        </menu>
+        <menu_item_check
+         label="Show Toolbar"
+         layout="topleft"
+         name="Show Toolbar">
+            <menu_item_check.on_check
+             function="FloaterVisible"
+             parameter="toolbar" />
+            <menu_item_check.on_click
+             function="ShowFloater"
+             parameter="toolbar" />
+        </menu_item_check>
+        <menu
+         create_jump_keys="true"
+         label="Help"
+         layout="topleft"
+         name="Help"
+         tear_off="true">
+            <menu_item_call
+             label="Official Linden Blog"
+             layout="topleft"
+             name="Official Linden Blog">
+                <menu_item_call.on_click
+                 function="PromptShowURL"
+                 name="OfficialLindenBlog_url"
+                 parameter="WebLaunchSupportWiki,http://blog.secondlife.com/" />
+            </menu_item_call>
+            <menu_item_call
+             label="Scripting Portal"
+             layout="topleft"
+             name="Scripting Portal">
+                <menu_item_call.on_click
+                 function="PromptShowURL"
+                 name="ScriptingPortal_url"
+                 parameter="WebLaunchLSLWiki,http://wiki.secondlife.com/wiki/LSL_Portal" />
+            </menu_item_call>
+            <menu
+             create_jump_keys="true"
+             label="Bug Reporting"
+             layout="topleft"
+             name="Bug Reporting"
+             tear_off="true">
+                <menu_item_call
+                 label="Public Issue Tracker"
+                 layout="topleft"
+                 name="Public Issue Tracker">
+                    <menu_item_call.on_click
+                     function="PromptShowURL"
+                     name="PublicIssueTracker_url"
+                     parameter="WebLaunchPublicIssue,http://jira.secondlife.com" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Public Issue Tracker Help"
+                 layout="topleft"
+                 name="Publc Issue Tracker Help">
+                    <menu_item_call.on_click
+                     function="PromptShowURL"
+                     name="PublicIssueTrackerHelp_url"
+                     parameter="WebLaunchPublicIssueHelp,http://wiki.secondlife.com/wiki/Issue_tracker" />
+                </menu_item_call>
+                <menu_item_separator
+                 layout="topleft" />
+                <menu_item_call
+                 label="Bug Reporting 101"
+                 layout="topleft"
+                 name="Bug Reporing 101">
+                    <menu_item_call.on_click
+                     function="PromptShowURL"
+                     name="BugReporting101_url"
+                     parameter="WebLaunchBugReport101,http://wiki.secondlife.com/wiki/Bug_Reporting_101" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Security Issues"
+                 layout="topleft"
+                 name="Security Issues">
+                    <menu_item_call.on_click
+                     function="PromptShowURL"
+                     name="SecurityIssues_url"
+                     parameter="WebLaunchSecurityIssues,http://wiki.secondlife.com/wiki/Security_issues" />
+                </menu_item_call>
+                <menu_item_call
+                 label="QA Wiki"
+                 layout="topleft"
+                 name="QA Wiki">
+                    <menu_item_call.on_click
+                     function="PromptShowURL"
+                     name="QAWiki_url"
+                     parameter="WebLaunchQAWiki,http://wiki.secondlife.com/wiki/QA_Portal" />
+                </menu_item_call>
+            </menu>
+        </menu>
+    </menu>
+</menu_bar>
-- 
GitLab


From a05f63b98912a5b6e7f4f3fa4fec1e57dc987a23 Mon Sep 17 00:00:00 2001
From: Erica <erica@lindenlab.com>
Date: Wed, 18 Nov 2009 14:43:30 -0800
Subject: [PATCH 442/557]   EXT-2638 Add Close X to IM and Chat log windows

---
 .../default/xui/en/floater_im_session.xml     | 102 +++++++++---------
 .../default/xui/en/floater_nearby_chat.xml    |   2 +-
 .../default/xui/en/panel_chat_header.xml      |  12 +--
 .../default/xui/en/panel_im_control_panel.xml |  17 +--
 4 files changed, 69 insertions(+), 64 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index 4792a1a4760..e972cf39bf7 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -8,67 +8,71 @@
  left="0"
  name="panel_im"
  top="0"
- can_close="false"
+ can_close="true"
  can_dock="true"
- can_minimize="false"
+ can_minimize="true"
  visible="true"
- width="320"
+ width="350"
  can_resize="true"
  min_width="300"
  min_height="350">
-  <layout_stack follows="all"
-                height="350"
-                width="300"
-                layout="topleft"
-                orientation="horizontal"
-                name="im_panels"
-                top="20"
-                left="0">
+  <layout_stack
+  follows="all"
+  height="350"
+  width="300"
+  layout="topleft"
+  orientation="horizontal"
+  name="im_panels"
+  top="20"
+  left="0">
     <layout_panel
       name="panel_im_control_panel"
       layout="topleft"
-      top_delta="-3"
-      height="350"
       follows="left"
       label="IM Control Panel"
       auto_resize="false"
       user_resize="false" />
-    <layout_panel height="350"
-                  width=""
-                  left_delta="110"
-                  top="0"
-                  user_resize="false">
-      <button height="20"
-      	      follows="left|top"
-              top="0"
-              image_overlay="TabIcon_Open_Off"
-              layout="topleft"
-              width="25"
-              name="slide_left_btn" />
-      <button height="20"
-      	      follows="left|top"
-              top="0"
-              image_overlay="TabIcon_Close_Off"
-              width="25"
-              name="slide_right_btn" />
-      <chat_history
-       length="1"
-       follows="all"
-       height="275"
-       layout="topleft"
-       name="chat_history"
-       parse_highlights="true"
-       allow_html="true"
-       width="160">
-      </chat_history>
-      <line_editor
-       follows="left|right"
-       height="20"
-       label="To"
-       layout="topleft"
-       name="chat_editor"
-       width="160">
-      </line_editor>
+    <layout_panel
+       left="0"
+       top="0"
+       user_resize="false">
+        <button
+          height="20"
+          follows="left|top"
+          top="0"
+          left="2"
+          image_overlay="TabIcon_Open_Off"
+          layout="topleft"
+          width="25"
+          name="slide_left_btn" />
+         <button
+          height="20"
+          follows="left|top"
+          top="0"
+          left="2"
+          image_overlay="TabIcon_Close_Off"
+          width="25"
+          name="slide_right_btn" />
+        <chat_history
+         length="1"
+	 font="SansSerifSmall"
+         follows="left|right|top"
+         height="280"
+         name="chat_history"
+         parse_highlights="true"
+         allow_html="true"
+        left="1"
+         width="180">
+        </chat_history>
+        <line_editor
+         follows="left|right|top"
+	 font="SansSerifSmall"
+         height="20"
+         label="To"
+         name="chat_editor"
+         top_pad="1"
+         width="180">
+        </line_editor>
     </layout_panel>
   </layout_stack>
 </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
index 69b015a727e..d8534bfe0ba 100644
--- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
@@ -5,7 +5,7 @@
  can_tear_off="false"
  can_resize="true"
  can_drag_on_left="false"
- can_close="false"
+ can_close="true"
  can_dock="true"
  bevel_style="in"
  height="300"
diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml
index 323ee957e73..7a3eae35a92 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml
@@ -3,13 +3,13 @@
       background_visible="true"
      bevel_style="in"
      bg_alpha_color="black"
-     follows="top"
+     follows="top|left|right"
      height="24"
- label="im_header"
- layout="topleft"
- name="im_header"
- width="300">
-             <avatar_icon
+     label="im_header"
+     layout="topleft"
+     name="im_header"
+     width="300">
+            <avatar_icon
          follows="left"
          height="18"
          image_name="Generic_Person"
diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
index 9573904c93e..73d843e6dd4 100644
--- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
@@ -38,28 +38,29 @@
      label="Teleport"
      name="teleport_btn"
      width="100" />
-    <button
+  <!--  <button
      follows="left|top"
      height="20"
      label="Share"
      name="share_btn"
-     width="100" />
-    <button
+     width="100" />-->
+     <!--Removing pay button to save space - will update spec - verified by Erica/Steve -->
+ <!--   <button
      follows="left|top"
      height="20"
      label="Pay"
      name="pay_btn"
-     width="100" />
+     width="100" />-->
     <panel
      background_visible="true"
      bg_alpha_color="DkGray2"
      border="false"
-     follows="left|top"
+     top_pad="10"
+     follows="left|bottom"
      height="70"
-     left="0"
-     left_pad="0"
+     left="1"
      name="panel_call_buttons"
-     width="110">
+     width="109">
         <button
          bottom="10"
          height="20"
-- 
GitLab


From 061b8d3aa659ad27cf6a5ff0ac3597036bfd8cf5 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 18 Nov 2009 17:58:09 -0500
Subject: [PATCH 443/557] EXT-1916 : Places: Landmarks are not sorted in the
 Favorites Bar Accordion

---
 indra/newview/llfolderviewitem.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 7323c421da5..a1260d11569 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -2498,11 +2498,13 @@ bool LLInventorySort::operator()(const LLFolderViewItem* const& a, const LLFolde
 	{
 
 		static const LLUUID& favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
+		static const LLUUID& landmarks_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
 
 		LLUUID a_uuid = a->getParentFolder()->getListener()->getUUID();
 		LLUUID b_uuid = b->getParentFolder()->getListener()->getUUID();
 
-		if (a_uuid == favorites_folder_id && b_uuid == favorites_folder_id)
+		if ((a_uuid == favorites_folder_id && b_uuid == favorites_folder_id) ||
+			(a_uuid == landmarks_folder_id && b_uuid == landmarks_folder_id))
 		{
 			// *TODO: mantipov: probably it is better to add an appropriate method to LLFolderViewItem
 			// or to LLInvFVBridge
-- 
GitLab


From 699eac4ee37b31da78af2323ed15a47e6b386930 Mon Sep 17 00:00:00 2001
From: Bryan O'Sullivan <bos@lindenlab.com>
Date: Wed, 18 Nov 2009 17:52:03 -0800
Subject: [PATCH 444/557] Switch some files to Unix line endings

---
 indra/cmake/run_build_test.py                 |   222 +-
 indra/llcommon/llallocator.h                  |   126 +-
 indra/llcommon/llcoros.h                      |   298 +-
 indra/llcommon/llfasttimer.h                  |   634 +-
 indra/llcommon/llmemory.h                     |   130 +-
 indra/llcommon/llmemtype.h                    |   496 +-
 indra/llcommon/llpreprocessor.h               |   338 +-
 indra/llcommon/llstacktrace.cpp               |   284 +-
 indra/llcommon/llstacktrace.h                 |    88 +-
 indra/llcommon/llstring.h                     |  2600 ++--
 indra/llui/lltabcontainer.cpp                 |     2 +-
 .../quicktime/media_plugin_quicktime.cpp      |    14 +-
 .../app_settings/ignorable_dialogs.xml        |   582 +-
 indra/newview/llimview.cpp                    |  5112 ++++----
 indra/newview/llinventorybridge.cpp           | 10292 ++++++++--------
 indra/newview/llinventoryfunctions.h          |   272 +-
 indra/newview/llinventorypanel.cpp            |  1780 +--
 indra/newview/llpanelimcontrolpanel.cpp       |     2 +-
 indra/newview/llpanelmaininventory.cpp        |  2044 +--
 indra/newview/llpanelmaininventory.h          |   298 +-
 .../newview/llpanelmediasettingssecurity.cpp  |   690 +-
 indra/newview/llpanelobjectinventory.h        |   204 +-
 indra/newview/llsidepanelinventory.cpp        |   558 +-
 indra/newview/llsidepanelinventory.h          |   182 +-
 .../newview/llsidepanelinventorysubpanel.cpp  |   310 +-
 indra/newview/llsidepanelinventorysubpanel.h  |   164 +-
 indra/newview/llsidepaneliteminfo.cpp         |  1766 +--
 indra/newview/llsidepaneliteminfo.h           |   182 +-
 .../default/xui/da/panel_edit_profile.xml     |    90 +-
 .../skins/default/xui/de/floater_about.xml    |    80 +-
 .../default/xui/de/floater_about_land.xml     |   950 +-
 .../xui/de/floater_animation_preview.xml      |   368 +-
 .../default/xui/de/floater_avatar_picker.xml  |    86 +-
 .../skins/default/xui/de/floater_beacons.xml  |    42 +-
 .../default/xui/de/floater_build_options.xml  |    22 +-
 .../default/xui/de/floater_bulk_perms.xml     |   106 +-
 .../default/xui/de/floater_buy_object.xml     |    52 +-
 .../skins/default/xui/de/floater_camera.xml   |    46 +-
 .../default/xui/de/floater_color_picker.xml   |    64 +-
 .../default/xui/de/floater_god_tools.xml      |   204 +-
 .../xui/de/floater_hardware_settings.xml      |    56 +-
 .../default/xui/de/floater_image_preview.xml  |    64 +-
 .../de/floater_inventory_item_properties.xml  |   134 +-
 .../default/xui/de/floater_land_holdings.xml  |    80 +-
 .../default/xui/de/floater_live_lsleditor.xml |    30 +-
 .../skins/default/xui/de/floater_map.xml      |   108 +-
 .../default/xui/de/floater_media_browser.xml  |    60 +-
 .../default/xui/de/floater_mem_leaking.xml    |    36 +-
 .../skins/default/xui/de/floater_moveview.xml |    70 +-
 .../skins/default/xui/de/floater_pay.xml      |    38 +-
 .../default/xui/de/floater_pay_object.xml     |    58 +-
 .../xui/de/floater_preview_animation.xml      |    24 +-
 .../xui/de/floater_preview_classified.xml     |    12 +-
 .../default/xui/de/floater_preview_event.xml  |    12 +-
 .../xui/de/floater_preview_gesture_info.xml   |     4 +-
 .../xui/de/floater_preview_gesture_steps.xml  |     4 +-
 .../xui/de/floater_preview_notecard.xml       |    44 +-
 .../default/xui/de/floater_preview_sound.xml  |    22 +-
 .../xui/de/floater_preview_texture.xml        |    34 +-
 .../default/xui/de/floater_report_abuse.xml   |   208 +-
 .../xui/de/floater_script_debug_panel.xml     |     4 +-
 .../default/xui/de/floater_script_preview.xml |    18 +-
 .../default/xui/de/floater_script_queue.xml   |    38 +-
 .../default/xui/de/floater_sell_land.xml      |   134 +-
 .../default/xui/de/floater_settings_debug.xml |    26 +-
 .../skins/default/xui/de/floater_stats.xml    |   142 +-
 .../skins/default/xui/de/floater_tools.xml    |   960 +-
 .../skins/default/xui/de/inspect_avatar.xml   |    32 +-
 .../skins/default/xui/de/menu_avatar_icon.xml |    14 +-
 .../skins/default/xui/de/menu_favorites.xml   |    20 +-
 .../skins/default/xui/de/menu_group_plus.xml  |    10 +-
 .../skins/default/xui/de/menu_inventory.xml   |   152 +-
 .../skins/default/xui/de/menu_landmark.xml    |    12 +-
 .../skins/default/xui/de/menu_mini_map.xml    |    16 +-
 .../skins/default/xui/de/menu_navbar.xml      |    20 +-
 .../skins/default/xui/de/menu_picks.xml       |    16 +-
 .../skins/default/xui/de/menu_place.xml       |    14 +-
 .../skins/default/xui/de/menu_slurl.xml       |    12 +-
 .../skins/default/xui/de/menu_url_agent.xml   |    12 +-
 .../skins/default/xui/de/menu_url_group.xml   |    12 +-
 .../skins/default/xui/de/menu_url_http.xml    |    14 +-
 .../default/xui/de/menu_url_objectim.xml      |    14 +-
 .../skins/default/xui/de/menu_url_parcel.xml  |    10 +-
 .../skins/default/xui/de/menu_url_slurl.xml   |    12 +-
 .../default/xui/de/menu_url_teleport.xml      |    10 +-
 .../skins/default/xui/de/notifications.xml    |  5126 ++++----
 .../default/xui/de/panel_edit_profile.xml     |    76 +-
 .../default/xui/de/panel_group_invite.xml     |    58 +-
 .../default/xui/de/panel_group_land_money.xml |   340 +-
 .../default/xui/de/panel_group_notices.xml    |   294 +-
 .../default/xui/de/panel_group_roles.xml      |   236 +-
 .../default/xui/de/panel_im_control_panel.xml |    18 +-
 .../skins/default/xui/de/panel_login.xml      |    38 +-
 .../default/xui/de/panel_nearby_chat_bar.xml  |     8 +-
 .../skins/default/xui/de/panel_pick_info.xml  |    32 +-
 .../skins/default/xui/de/panel_picks.xml      |    18 +-
 .../default/xui/de/panel_preferences_chat.xml |    84 +-
 .../xui/de/panel_preferences_graphics1.xml    |   232 +-
 .../xui/de/panel_preferences_privacy.xml      |    40 +-
 .../xui/de/panel_preferences_setup.xml        |    92 +-
 .../skins/default/xui/de/panel_profile.xml    |    82 +-
 .../default/xui/de/panel_profile_view.xml     |    30 +-
 .../skins/default/xui/de/panel_script_ed.xml  |    86 +-
 .../xui/de/panel_stand_stop_flying.xml        |    12 +-
 .../skins/default/xui/de/panel_status_bar.xml |    44 +-
 .../skins/default/xui/de/panel_world_map.xml  |   114 +-
 .../newview/skins/default/xui/de/strings.xml  |  6298 +++++-----
 .../skins/default/xui/de/teleport_strings.xml |   156 +-
 .../xui/en/menu_inspect_avatar_gear.xml       |   210 +-
 .../default/xui/en/panel_group_notify.xml     |   210 +-
 .../default/xui/en/panel_main_inventory.xml   |   934 +-
 .../default/xui/en/sidepanel_inventory.xml    |   254 +-
 .../default/xui/en/sidepanel_item_info.xml    |  1022 +-
 .../default/xui/es/panel_edit_profile.xml     |    90 +-
 .../skins/default/xui/fr/floater_about.xml    |    80 +-
 .../default/xui/fr/floater_about_land.xml     |   960 +-
 .../xui/fr/floater_animation_preview.xml      |   372 +-
 .../default/xui/fr/floater_avatar_picker.xml  |    82 +-
 .../skins/default/xui/fr/floater_beacons.xml  |    42 +-
 .../default/xui/fr/floater_build_options.xml  |    22 +-
 .../default/xui/fr/floater_bulk_perms.xml     |   106 +-
 .../default/xui/fr/floater_buy_object.xml     |    52 +-
 .../skins/default/xui/fr/floater_camera.xml   |    46 +-
 .../default/xui/fr/floater_color_picker.xml   |    64 +-
 .../default/xui/fr/floater_god_tools.xml      |   212 +-
 .../xui/fr/floater_hardware_settings.xml      |    56 +-
 .../default/xui/fr/floater_image_preview.xml  |    64 +-
 .../fr/floater_inventory_item_properties.xml  |   134 +-
 .../default/xui/fr/floater_land_holdings.xml  |    80 +-
 .../default/xui/fr/floater_live_lsleditor.xml |    30 +-
 .../skins/default/xui/fr/floater_map.xml      |   108 +-
 .../default/xui/fr/floater_media_browser.xml  |    62 +-
 .../default/xui/fr/floater_mem_leaking.xml    |    36 +-
 .../skins/default/xui/fr/floater_moveview.xml |    70 +-
 .../skins/default/xui/fr/floater_pay.xml      |    40 +-
 .../default/xui/fr/floater_pay_object.xml     |    60 +-
 .../xui/fr/floater_preview_animation.xml      |    22 +-
 .../xui/fr/floater_preview_classified.xml     |    12 +-
 .../default/xui/fr/floater_preview_event.xml  |    12 +-
 .../xui/fr/floater_preview_gesture_info.xml   |     4 +-
 .../xui/fr/floater_preview_gesture_steps.xml  |     4 +-
 .../xui/fr/floater_preview_notecard.xml       |    44 +-
 .../default/xui/fr/floater_preview_sound.xml  |    22 +-
 .../xui/fr/floater_preview_texture.xml        |    34 +-
 .../default/xui/fr/floater_report_abuse.xml   |   208 +-
 .../xui/fr/floater_script_debug_panel.xml     |     4 +-
 .../default/xui/fr/floater_script_preview.xml |    18 +-
 .../default/xui/fr/floater_script_queue.xml   |    38 +-
 .../default/xui/fr/floater_sell_land.xml      |   132 +-
 .../default/xui/fr/floater_settings_debug.xml |    26 +-
 .../skins/default/xui/fr/floater_stats.xml    |   142 +-
 .../skins/default/xui/fr/floater_tools.xml    |   958 +-
 .../skins/default/xui/fr/inspect_avatar.xml   |    32 +-
 .../skins/default/xui/fr/menu_avatar_icon.xml |    14 +-
 .../skins/default/xui/fr/menu_favorites.xml   |    20 +-
 .../skins/default/xui/fr/menu_group_plus.xml  |    10 +-
 .../skins/default/xui/fr/menu_inventory.xml   |   152 +-
 .../skins/default/xui/fr/menu_landmark.xml    |    12 +-
 .../skins/default/xui/fr/menu_mini_map.xml    |    16 +-
 .../skins/default/xui/fr/menu_navbar.xml      |    20 +-
 .../skins/default/xui/fr/menu_picks.xml       |    16 +-
 .../skins/default/xui/fr/menu_place.xml       |    14 +-
 .../skins/default/xui/fr/menu_slurl.xml       |    12 +-
 .../skins/default/xui/fr/menu_url_agent.xml   |    12 +-
 .../skins/default/xui/fr/menu_url_group.xml   |    12 +-
 .../skins/default/xui/fr/menu_url_http.xml    |    14 +-
 .../default/xui/fr/menu_url_objectim.xml      |    14 +-
 .../skins/default/xui/fr/menu_url_parcel.xml  |    10 +-
 .../skins/default/xui/fr/menu_url_slurl.xml   |    12 +-
 .../default/xui/fr/menu_url_teleport.xml      |    10 +-
 .../skins/default/xui/fr/notifications.xml    |  5094 ++++----
 .../default/xui/fr/panel_edit_profile.xml     |    76 +-
 .../default/xui/fr/panel_group_invite.xml     |    58 +-
 .../default/xui/fr/panel_group_land_money.xml |   172 +-
 .../default/xui/fr/panel_group_list_item.xml  |     8 +-
 .../default/xui/fr/panel_group_notices.xml    |   134 +-
 .../default/xui/fr/panel_group_roles.xml      |   226 +-
 .../default/xui/fr/panel_im_control_panel.xml |    18 +-
 .../skins/default/xui/fr/panel_login.xml      |    38 +-
 .../default/xui/fr/panel_nearby_chat_bar.xml  |     8 +-
 .../skins/default/xui/fr/panel_picks.xml      |    18 +-
 .../default/xui/fr/panel_preferences_chat.xml |    84 +-
 .../xui/fr/panel_preferences_graphics1.xml    |   232 +-
 .../xui/fr/panel_preferences_privacy.xml      |    42 +-
 .../xui/fr/panel_preferences_setup.xml        |    92 +-
 .../xui/fr/panel_preferences_sound.xml        |    80 +-
 .../skins/default/xui/fr/panel_profile.xml    |    82 +-
 .../default/xui/fr/panel_profile_view.xml     |    30 +-
 .../skins/default/xui/fr/panel_script_ed.xml  |    86 +-
 .../xui/fr/panel_stand_stop_flying.xml        |    12 +-
 .../skins/default/xui/fr/panel_status_bar.xml |    44 +-
 .../skins/default/xui/fr/panel_world_map.xml  |   114 +-
 .../newview/skins/default/xui/fr/strings.xml  |  6298 +++++-----
 .../skins/default/xui/fr/teleport_strings.xml |   154 +-
 .../default/xui/it/panel_edit_profile.xml     |    90 +-
 .../skins/default/xui/ja/floater_about.xml    |    80 +-
 .../default/xui/ja/floater_about_land.xml     |   950 +-
 .../xui/ja/floater_animation_preview.xml      |   366 +-
 .../default/xui/ja/floater_avatar_picker.xml  |    80 +-
 .../skins/default/xui/ja/floater_beacons.xml  |    42 +-
 .../default/xui/ja/floater_build_options.xml  |    22 +-
 .../default/xui/ja/floater_bulk_perms.xml     |   106 +-
 .../default/xui/ja/floater_buy_object.xml     |    52 +-
 .../skins/default/xui/ja/floater_camera.xml   |    46 +-
 .../default/xui/ja/floater_color_picker.xml   |    62 +-
 .../default/xui/ja/floater_god_tools.xml      |   194 +-
 .../xui/ja/floater_hardware_settings.xml      |    56 +-
 .../default/xui/ja/floater_image_preview.xml  |    64 +-
 .../ja/floater_inventory_item_properties.xml  |   134 +-
 .../default/xui/ja/floater_land_holdings.xml  |    80 +-
 .../default/xui/ja/floater_live_lsleditor.xml |    30 +-
 .../skins/default/xui/ja/floater_map.xml      |   108 +-
 .../default/xui/ja/floater_media_browser.xml  |    60 +-
 .../default/xui/ja/floater_mem_leaking.xml    |    36 +-
 .../skins/default/xui/ja/floater_moveview.xml |    70 +-
 .../skins/default/xui/ja/floater_pay.xml      |    38 +-
 .../default/xui/ja/floater_pay_object.xml     |    58 +-
 .../xui/ja/floater_preview_animation.xml      |    22 +-
 .../xui/ja/floater_preview_classified.xml     |    12 +-
 .../default/xui/ja/floater_preview_event.xml  |    12 +-
 .../xui/ja/floater_preview_gesture_info.xml   |     4 +-
 .../xui/ja/floater_preview_gesture_steps.xml  |     4 +-
 .../xui/ja/floater_preview_notecard.xml       |    44 +-
 .../default/xui/ja/floater_preview_sound.xml  |    22 +-
 .../xui/ja/floater_preview_texture.xml        |    34 +-
 .../default/xui/ja/floater_report_abuse.xml   |   206 +-
 .../xui/ja/floater_script_debug_panel.xml     |     4 +-
 .../default/xui/ja/floater_script_preview.xml |    18 +-
 .../default/xui/ja/floater_script_queue.xml   |    38 +-
 .../default/xui/ja/floater_sell_land.xml      |   140 +-
 .../default/xui/ja/floater_settings_debug.xml |    26 +-
 .../skins/default/xui/ja/floater_stats.xml    |   142 +-
 .../skins/default/xui/ja/floater_tools.xml    |   954 +-
 .../skins/default/xui/ja/inspect_avatar.xml   |    32 +-
 .../skins/default/xui/ja/menu_avatar_icon.xml |    14 +-
 .../skins/default/xui/ja/menu_favorites.xml   |    20 +-
 .../skins/default/xui/ja/menu_group_plus.xml  |    10 +-
 .../skins/default/xui/ja/menu_inventory.xml   |   152 +-
 .../skins/default/xui/ja/menu_landmark.xml    |    12 +-
 .../skins/default/xui/ja/menu_mini_map.xml    |    16 +-
 .../skins/default/xui/ja/menu_navbar.xml      |    20 +-
 .../skins/default/xui/ja/menu_picks.xml       |    16 +-
 .../skins/default/xui/ja/menu_place.xml       |    14 +-
 .../skins/default/xui/ja/menu_slurl.xml       |    12 +-
 .../skins/default/xui/ja/menu_url_agent.xml   |    12 +-
 .../skins/default/xui/ja/menu_url_group.xml   |    12 +-
 .../skins/default/xui/ja/menu_url_http.xml    |    14 +-
 .../default/xui/ja/menu_url_objectim.xml      |    14 +-
 .../skins/default/xui/ja/menu_url_parcel.xml  |    10 +-
 .../skins/default/xui/ja/menu_url_slurl.xml   |    12 +-
 .../default/xui/ja/menu_url_teleport.xml      |    10 +-
 .../skins/default/xui/ja/notifications.xml    |  5370 ++++----
 .../default/xui/ja/panel_edit_profile.xml     |    76 +-
 .../default/xui/ja/panel_group_invite.xml     |    60 +-
 .../default/xui/ja/panel_group_land_money.xml |   170 +-
 .../default/xui/ja/panel_group_list_item.xml  |     8 +-
 .../default/xui/ja/panel_group_notices.xml    |   132 +-
 .../default/xui/ja/panel_group_roles.xml      |   236 +-
 .../default/xui/ja/panel_im_control_panel.xml |    18 +-
 .../skins/default/xui/ja/panel_login.xml      |    38 +-
 .../default/xui/ja/panel_nearby_chat_bar.xml  |     8 +-
 .../skins/default/xui/ja/panel_pick_info.xml  |    32 +-
 .../skins/default/xui/ja/panel_picks.xml      |    18 +-
 .../default/xui/ja/panel_preferences_chat.xml |    84 +-
 .../xui/ja/panel_preferences_graphics1.xml    |   232 +-
 .../xui/ja/panel_preferences_privacy.xml      |    40 +-
 .../xui/ja/panel_preferences_setup.xml        |    92 +-
 .../xui/ja/panel_preferences_sound.xml        |   144 +-
 .../skins/default/xui/ja/panel_profile.xml    |    82 +-
 .../default/xui/ja/panel_profile_view.xml     |    30 +-
 .../skins/default/xui/ja/panel_script_ed.xml  |    86 +-
 .../xui/ja/panel_stand_stop_flying.xml        |    12 +-
 .../skins/default/xui/ja/panel_status_bar.xml |    44 +-
 .../skins/default/xui/ja/panel_world_map.xml  |   114 +-
 .../newview/skins/default/xui/ja/strings.xml  |  6298 +++++-----
 .../skins/default/xui/ja/teleport_strings.xml |   158 +-
 .../default/xui/nl/panel_edit_profile.xml     |    90 +-
 .../default/xui/pl/panel_edit_profile.xml     |    90 +-
 .../default/xui/pt/panel_edit_profile.xml     |    90 +-
 279 files changed, 43828 insertions(+), 43828 deletions(-)

diff --git a/indra/cmake/run_build_test.py b/indra/cmake/run_build_test.py
index 17bce6f4344..fff78ecbe33 100644
--- a/indra/cmake/run_build_test.py
+++ b/indra/cmake/run_build_test.py
@@ -1,111 +1,111 @@
-#!/usr/bin/python
-"""\
-@file   run_build_test.py
-@author Nat Goodspeed
-@date   2009-09-03
-@brief  Helper script to allow CMake to run some command after setting
-        environment variables.
-
-CMake has commands to run an external program. But remember that each CMake
-command must be backed by multiple build-system implementations. Unfortunately
-it seems CMake can't promise that every target build system can set specified
-environment variables before running the external program of interest.
-
-This helper script is a workaround. It simply sets the requested environment
-variables and then executes the program specified on the rest of its command
-line.
-
-Example:
-
-python run_build_test.py -DFOO=bar myprog somearg otherarg
-
-sets environment variable FOO=bar, then runs:
-myprog somearg otherarg
-
-$LicenseInfo:firstyear=2009&license=internal$
-Copyright (c) 2009, Linden Research, Inc.
-$/LicenseInfo$
-"""
-
-import os
-import sys
-import subprocess
-
-def main(command, libpath=[], vars={}):
-    """Pass:
-    command is a sequence (e.g. a list) of strings. The first item in the list
-    must be the command name, the rest are its arguments.
-
-    libpath is a sequence of directory pathnames. These will be appended to
-    the platform-specific dynamic library search path environment variable.
-
-    vars is a dict of arbitrary (var, value) pairs to be added to the
-    environment before running 'command'.
-
-    This function runs the specified command, waits for it to terminate and
-    returns its return code. This will be negative if the command terminated
-    with a signal, else it will be the process's specified exit code.
-    """
-    # Handle platform-dependent libpath first.
-    if sys.platform == "win32":
-        lpvars = ["PATH"]
-    elif sys.platform == "darwin":
-        lpvars = ["LD_LIBRARY_PATH", "DYLD_LIBRARY_PATH"]
-    elif sys.platform.startswith("linux"):
-        lpvars = ["LD_LIBRARY_PATH"]
-    else:
-        # No idea what the right pathname might be! But only crump if this
-        # feature is requested.
-        if libpath:
-            raise NotImplemented("run_build_test: unknown platform %s" % sys.platform)
-        lpvars = []
-    for var in lpvars:
-        # Split the existing path. Bear in mind that the variable in question
-        # might not exist; instead of KeyError, just use an empty string.
-        dirs = os.environ.get(var, "").split(os.pathsep)
-        # Append the sequence in libpath
-##         print "%s += %r" % (var, libpath)
-        dirs.extend(libpath)
-        # Now rebuild the path string. This way we use a minimum of separators
-        # -- and we avoid adding a pointless separator when libpath is empty.
-        os.environ[var] = os.pathsep.join(dirs)
-    # Now handle arbitrary environment variables. The tricky part is ensuring
-    # that all the keys and values we try to pass are actually strings.
-##     if vars:
-##         print "Setting:"
-##         for key, value in vars.iteritems():
-##             print "%s=%s" % (key, value)
-    os.environ.update(dict([(str(key), str(value)) for key, value in vars.iteritems()]))
-    # Run the child process.
-##     print "Running: %s" % " ".join(command)
-    return subprocess.call(command)
-
-if __name__ == "__main__":
-    from optparse import OptionParser
-    parser = OptionParser(usage="usage: %prog [options] command args...")
-    # We want optparse support for the options we ourselves handle -- but we
-    # DO NOT want it looking at options for the executable we intend to run,
-    # rejecting them as invalid because we don't define them. So configure the
-    # parser to stop looking for options as soon as it sees the first
-    # positional argument (traditional Unix syntax).
-    parser.disable_interspersed_args()
-    parser.add_option("-D", "--define", dest="vars", default=[], action="append",
-                      metavar="VAR=value",
-                      help="Add VAR=value to the env variables defined")
-    parser.add_option("-l", "--libpath", dest="libpath", default=[], action="append",
-                      metavar="DIR",
-                      help="Add DIR to the platform-dependent DLL search path")
-    opts, args = parser.parse_args()
-    # What we have in opts.vars is a list of strings of the form "VAR=value"
-    # or possibly just "VAR". What we want is a dict. We can build that dict by
-    # constructing a list of ["VAR", "value"] pairs -- so split each
-    # "VAR=value" string on the '=' sign (but only once, in case we have
-    # "VAR=some=user=string"). To handle the case of just "VAR", append "" to
-    # the list returned by split(), then slice off anything after the pair we
-    # want.
-    rc = main(command=args, libpath=opts.libpath,
-              vars=dict([(pair.split('=', 1) + [""])[:2] for pair in opts.vars]))
-    if rc not in (None, 0):
-        print >>sys.stderr, "Failure running: %s" % " ".join(args)
-        print >>sys.stderr, "Error: %s" % rc
-    sys.exit((rc < 0) and 255 or rc)
+#!/usr/bin/python
+"""\
+@file   run_build_test.py
+@author Nat Goodspeed
+@date   2009-09-03
+@brief  Helper script to allow CMake to run some command after setting
+        environment variables.
+
+CMake has commands to run an external program. But remember that each CMake
+command must be backed by multiple build-system implementations. Unfortunately
+it seems CMake can't promise that every target build system can set specified
+environment variables before running the external program of interest.
+
+This helper script is a workaround. It simply sets the requested environment
+variables and then executes the program specified on the rest of its command
+line.
+
+Example:
+
+python run_build_test.py -DFOO=bar myprog somearg otherarg
+
+sets environment variable FOO=bar, then runs:
+myprog somearg otherarg
+
+$LicenseInfo:firstyear=2009&license=internal$
+Copyright (c) 2009, Linden Research, Inc.
+$/LicenseInfo$
+"""
+
+import os
+import sys
+import subprocess
+
+def main(command, libpath=[], vars={}):
+    """Pass:
+    command is a sequence (e.g. a list) of strings. The first item in the list
+    must be the command name, the rest are its arguments.
+
+    libpath is a sequence of directory pathnames. These will be appended to
+    the platform-specific dynamic library search path environment variable.
+
+    vars is a dict of arbitrary (var, value) pairs to be added to the
+    environment before running 'command'.
+
+    This function runs the specified command, waits for it to terminate and
+    returns its return code. This will be negative if the command terminated
+    with a signal, else it will be the process's specified exit code.
+    """
+    # Handle platform-dependent libpath first.
+    if sys.platform == "win32":
+        lpvars = ["PATH"]
+    elif sys.platform == "darwin":
+        lpvars = ["LD_LIBRARY_PATH", "DYLD_LIBRARY_PATH"]
+    elif sys.platform.startswith("linux"):
+        lpvars = ["LD_LIBRARY_PATH"]
+    else:
+        # No idea what the right pathname might be! But only crump if this
+        # feature is requested.
+        if libpath:
+            raise NotImplemented("run_build_test: unknown platform %s" % sys.platform)
+        lpvars = []
+    for var in lpvars:
+        # Split the existing path. Bear in mind that the variable in question
+        # might not exist; instead of KeyError, just use an empty string.
+        dirs = os.environ.get(var, "").split(os.pathsep)
+        # Append the sequence in libpath
+##         print "%s += %r" % (var, libpath)
+        dirs.extend(libpath)
+        # Now rebuild the path string. This way we use a minimum of separators
+        # -- and we avoid adding a pointless separator when libpath is empty.
+        os.environ[var] = os.pathsep.join(dirs)
+    # Now handle arbitrary environment variables. The tricky part is ensuring
+    # that all the keys and values we try to pass are actually strings.
+##     if vars:
+##         print "Setting:"
+##         for key, value in vars.iteritems():
+##             print "%s=%s" % (key, value)
+    os.environ.update(dict([(str(key), str(value)) for key, value in vars.iteritems()]))
+    # Run the child process.
+##     print "Running: %s" % " ".join(command)
+    return subprocess.call(command)
+
+if __name__ == "__main__":
+    from optparse import OptionParser
+    parser = OptionParser(usage="usage: %prog [options] command args...")
+    # We want optparse support for the options we ourselves handle -- but we
+    # DO NOT want it looking at options for the executable we intend to run,
+    # rejecting them as invalid because we don't define them. So configure the
+    # parser to stop looking for options as soon as it sees the first
+    # positional argument (traditional Unix syntax).
+    parser.disable_interspersed_args()
+    parser.add_option("-D", "--define", dest="vars", default=[], action="append",
+                      metavar="VAR=value",
+                      help="Add VAR=value to the env variables defined")
+    parser.add_option("-l", "--libpath", dest="libpath", default=[], action="append",
+                      metavar="DIR",
+                      help="Add DIR to the platform-dependent DLL search path")
+    opts, args = parser.parse_args()
+    # What we have in opts.vars is a list of strings of the form "VAR=value"
+    # or possibly just "VAR". What we want is a dict. We can build that dict by
+    # constructing a list of ["VAR", "value"] pairs -- so split each
+    # "VAR=value" string on the '=' sign (but only once, in case we have
+    # "VAR=some=user=string"). To handle the case of just "VAR", append "" to
+    # the list returned by split(), then slice off anything after the pair we
+    # want.
+    rc = main(command=args, libpath=opts.libpath,
+              vars=dict([(pair.split('=', 1) + [""])[:2] for pair in opts.vars]))
+    if rc not in (None, 0):
+        print >>sys.stderr, "Failure running: %s" % " ".join(args)
+        print >>sys.stderr, "Error: %s" % rc
+    sys.exit((rc < 0) and 255 or rc)
diff --git a/indra/llcommon/llallocator.h b/indra/llcommon/llallocator.h
index 0d6f18c5d47..50129b4526d 100644
--- a/indra/llcommon/llallocator.h
+++ b/indra/llcommon/llallocator.h
@@ -1,63 +1,63 @@
-/** 
- * @file llallocator.h
- * @brief Declaration of the LLAllocator class.
- *
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- * 
- * Copyright (c) 2009-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLALLOCATOR_H
-#define LL_LLALLOCATOR_H
-
-#include <string>
-
-#include "llmemtype.h"
-#include "llallocator_heap_profile.h"
-
-class LL_COMMON_API LLAllocator {
-    friend class LLMemoryView;
-    friend class LLMemType;
-
-private:
-	static void pushMemType(S32 type);
-	static S32 popMemType();
-
-public:
-    void setProfilingEnabled(bool should_enable);
-
-    static bool isProfiling();
-
-    LLAllocatorHeapProfile const & getProfile();
-
-private:
-    std::string getRawProfile();
-
-private:
-    LLAllocatorHeapProfile mProf;
-};
-
-#endif // LL_LLALLOCATOR_H
+/** 
+ * @file llallocator.h
+ * @brief Declaration of the LLAllocator class.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLALLOCATOR_H
+#define LL_LLALLOCATOR_H
+
+#include <string>
+
+#include "llmemtype.h"
+#include "llallocator_heap_profile.h"
+
+class LL_COMMON_API LLAllocator {
+    friend class LLMemoryView;
+    friend class LLMemType;
+
+private:
+	static void pushMemType(S32 type);
+	static S32 popMemType();
+
+public:
+    void setProfilingEnabled(bool should_enable);
+
+    static bool isProfiling();
+
+    LLAllocatorHeapProfile const & getProfile();
+
+private:
+    std::string getRawProfile();
+
+private:
+    LLAllocatorHeapProfile mProf;
+};
+
+#endif // LL_LLALLOCATOR_H
diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h
index 6c5fa5af6d6..141b0df43cf 100644
--- a/indra/llcommon/llcoros.h
+++ b/indra/llcommon/llcoros.h
@@ -1,149 +1,149 @@
-/**
- * @file   llcoros.h
- * @author Nat Goodspeed
- * @date   2009-06-02
- * @brief  Manage running boost::coroutine instances
- * 
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- * Copyright (c) 2009, Linden Research, Inc.
- * $/LicenseInfo$
- */
-
-#if ! defined(LL_LLCOROS_H)
-#define LL_LLCOROS_H
-
-#include <boost/coroutine/coroutine.hpp>
-#include "llsingleton.h"
-#include <boost/ptr_container/ptr_map.hpp>
-#include <string>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-#include <boost/preprocessor/iteration/local.hpp>
-#include <stdexcept>
-
-/**
- * Registry of named Boost.Coroutine instances
- *
- * The Boost.Coroutine library supports the general case of a coroutine
- * accepting arbitrary parameters and yielding multiple (sets of) results. For
- * such use cases, it's natural for the invoking code to retain the coroutine
- * instance: the consumer repeatedly calls into the coroutine, perhaps passing
- * new parameter values, prompting it to yield its next result.
- *
- * Our typical coroutine usage is different, though. For us, coroutines
- * provide an alternative to the @c Responder pattern. Our typical coroutine
- * has @c void return, invoked in fire-and-forget mode: the handler for some
- * user gesture launches the coroutine and promptly returns to the main loop.
- * The coroutine initiates some action that will take multiple frames (e.g. a
- * capability request), waits for its result, processes it and silently steals
- * away.
- *
- * This usage poses two (related) problems:
- *
- * # Who should own the coroutine instance? If it's simply local to the
- *   handler code that launches it, return from the handler will destroy the
- *   coroutine object, terminating the coroutine.
- * # Once the coroutine terminates, in whatever way, who's responsible for
- *   cleaning up the coroutine object?
- *
- * LLCoros is a Singleton collection of currently-active coroutine instances.
- * Each has a name. You ask LLCoros to launch a new coroutine with a suggested
- * name prefix; from your prefix it generates a distinct name, registers the
- * new coroutine and returns the actual name.
- *
- * The name can be used to kill off the coroutine prematurely, if needed. It
- * can also provide diagnostic info: we can look up the name of the
- * currently-running coroutine.
- *
- * Finally, the next frame ("mainloop" event) after the coroutine terminates,
- * LLCoros will notice its demise and destroy it.
- */
-class LL_COMMON_API LLCoros: public LLSingleton<LLCoros>
-{
-public:
-    /// Canonical boost::coroutines::coroutine signature we use
-    typedef boost::coroutines::coroutine<void()> coro;
-    /// Canonical 'self' type
-    typedef coro::self self;
-
-    /**
-     * Create and start running a new coroutine with specified name. The name
-     * string you pass is a suggestion; it will be tweaked for uniqueness. The
-     * actual name is returned to you.
-     *
-     * Usage looks like this, for (e.g.) two coroutine parameters:
-     * @code
-     * class MyClass
-     * {
-     * public:
-     *     ...
-     *     // Do NOT NOT NOT accept reference params other than 'self'!
-     *     // Pass by value only!
-     *     void myCoroutineMethod(LLCoros::self& self, std::string, LLSD);
-     *     ...
-     * };
-     * ...
-     * std::string name = LLCoros::instance().launch(
-     *    "mycoro", boost::bind(&MyClass::myCoroutineMethod, this, _1,
-     *                          "somestring", LLSD(17));
-     * @endcode
-     *
-     * Your function/method must accept LLCoros::self& as its first parameter.
-     * It can accept any other parameters you want -- but ONLY BY VALUE!
-     * Other reference parameters are a BAD IDEA! You Have Been Warned. See
-     * DEV-32777 comments for an explanation.
-     *
-     * Pass a callable that accepts the single LLCoros::self& parameter. It
-     * may work to pass a free function whose only parameter is 'self'; for
-     * all other cases use boost::bind(). Of course, for a non-static class
-     * method, the first parameter must be the class instance. Use the
-     * placeholder _1 for the 'self' parameter. Any other parameters should be
-     * passed via the bind() expression.
-     *
-     * launch() tweaks the suggested name so it won't collide with any
-     * existing coroutine instance, creates the coroutine instance, registers
-     * it with the tweaked name and runs it until its first wait. At that
-     * point it returns the tweaked name.
-     */
-    template <typename CALLABLE>
-    std::string launch(const std::string& prefix, const CALLABLE& callable)
-    {
-        return launchImpl(prefix, new coro(callable));
-    }
-
-    /**
-     * Abort a running coroutine by name. Normally, when a coroutine either
-     * runs to completion or terminates with an exception, LLCoros quietly
-     * cleans it up. This is for use only when you must explicitly interrupt
-     * one prematurely. Returns @c true if the specified name was found and
-     * still running at the time.
-     */
-    bool kill(const std::string& name);
-
-    /**
-     * From within a coroutine, pass its @c self object to look up the
-     * (tweaked) name string by which this coroutine is registered. Returns
-     * the empty string if not found (e.g. if the coroutine was launched by
-     * hand rather than using LLCoros::launch()).
-     */
-    template <typename COROUTINE_SELF>
-    std::string getName(const COROUTINE_SELF& self) const
-    {
-        return getNameByID(self.get_id());
-    }
-
-    /// getName() by self.get_id()
-    std::string getNameByID(const void* self_id) const;
-
-private:
-    friend class LLSingleton<LLCoros>;
-    LLCoros();
-    std::string launchImpl(const std::string& prefix, coro* newCoro);
-    std::string generateDistinctName(const std::string& prefix) const;
-    bool cleanup(const LLSD&);
-
-    typedef boost::ptr_map<std::string, coro> CoroMap;
-    CoroMap mCoros;
-};
-
-#endif /* ! defined(LL_LLCOROS_H) */
+/**
+ * @file   llcoros.h
+ * @author Nat Goodspeed
+ * @date   2009-06-02
+ * @brief  Manage running boost::coroutine instances
+ * 
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLCOROS_H)
+#define LL_LLCOROS_H
+
+#include <boost/coroutine/coroutine.hpp>
+#include "llsingleton.h"
+#include <boost/ptr_container/ptr_map.hpp>
+#include <string>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/iteration/local.hpp>
+#include <stdexcept>
+
+/**
+ * Registry of named Boost.Coroutine instances
+ *
+ * The Boost.Coroutine library supports the general case of a coroutine
+ * accepting arbitrary parameters and yielding multiple (sets of) results. For
+ * such use cases, it's natural for the invoking code to retain the coroutine
+ * instance: the consumer repeatedly calls into the coroutine, perhaps passing
+ * new parameter values, prompting it to yield its next result.
+ *
+ * Our typical coroutine usage is different, though. For us, coroutines
+ * provide an alternative to the @c Responder pattern. Our typical coroutine
+ * has @c void return, invoked in fire-and-forget mode: the handler for some
+ * user gesture launches the coroutine and promptly returns to the main loop.
+ * The coroutine initiates some action that will take multiple frames (e.g. a
+ * capability request), waits for its result, processes it and silently steals
+ * away.
+ *
+ * This usage poses two (related) problems:
+ *
+ * # Who should own the coroutine instance? If it's simply local to the
+ *   handler code that launches it, return from the handler will destroy the
+ *   coroutine object, terminating the coroutine.
+ * # Once the coroutine terminates, in whatever way, who's responsible for
+ *   cleaning up the coroutine object?
+ *
+ * LLCoros is a Singleton collection of currently-active coroutine instances.
+ * Each has a name. You ask LLCoros to launch a new coroutine with a suggested
+ * name prefix; from your prefix it generates a distinct name, registers the
+ * new coroutine and returns the actual name.
+ *
+ * The name can be used to kill off the coroutine prematurely, if needed. It
+ * can also provide diagnostic info: we can look up the name of the
+ * currently-running coroutine.
+ *
+ * Finally, the next frame ("mainloop" event) after the coroutine terminates,
+ * LLCoros will notice its demise and destroy it.
+ */
+class LL_COMMON_API LLCoros: public LLSingleton<LLCoros>
+{
+public:
+    /// Canonical boost::coroutines::coroutine signature we use
+    typedef boost::coroutines::coroutine<void()> coro;
+    /// Canonical 'self' type
+    typedef coro::self self;
+
+    /**
+     * Create and start running a new coroutine with specified name. The name
+     * string you pass is a suggestion; it will be tweaked for uniqueness. The
+     * actual name is returned to you.
+     *
+     * Usage looks like this, for (e.g.) two coroutine parameters:
+     * @code
+     * class MyClass
+     * {
+     * public:
+     *     ...
+     *     // Do NOT NOT NOT accept reference params other than 'self'!
+     *     // Pass by value only!
+     *     void myCoroutineMethod(LLCoros::self& self, std::string, LLSD);
+     *     ...
+     * };
+     * ...
+     * std::string name = LLCoros::instance().launch(
+     *    "mycoro", boost::bind(&MyClass::myCoroutineMethod, this, _1,
+     *                          "somestring", LLSD(17));
+     * @endcode
+     *
+     * Your function/method must accept LLCoros::self& as its first parameter.
+     * It can accept any other parameters you want -- but ONLY BY VALUE!
+     * Other reference parameters are a BAD IDEA! You Have Been Warned. See
+     * DEV-32777 comments for an explanation.
+     *
+     * Pass a callable that accepts the single LLCoros::self& parameter. It
+     * may work to pass a free function whose only parameter is 'self'; for
+     * all other cases use boost::bind(). Of course, for a non-static class
+     * method, the first parameter must be the class instance. Use the
+     * placeholder _1 for the 'self' parameter. Any other parameters should be
+     * passed via the bind() expression.
+     *
+     * launch() tweaks the suggested name so it won't collide with any
+     * existing coroutine instance, creates the coroutine instance, registers
+     * it with the tweaked name and runs it until its first wait. At that
+     * point it returns the tweaked name.
+     */
+    template <typename CALLABLE>
+    std::string launch(const std::string& prefix, const CALLABLE& callable)
+    {
+        return launchImpl(prefix, new coro(callable));
+    }
+
+    /**
+     * Abort a running coroutine by name. Normally, when a coroutine either
+     * runs to completion or terminates with an exception, LLCoros quietly
+     * cleans it up. This is for use only when you must explicitly interrupt
+     * one prematurely. Returns @c true if the specified name was found and
+     * still running at the time.
+     */
+    bool kill(const std::string& name);
+
+    /**
+     * From within a coroutine, pass its @c self object to look up the
+     * (tweaked) name string by which this coroutine is registered. Returns
+     * the empty string if not found (e.g. if the coroutine was launched by
+     * hand rather than using LLCoros::launch()).
+     */
+    template <typename COROUTINE_SELF>
+    std::string getName(const COROUTINE_SELF& self) const
+    {
+        return getNameByID(self.get_id());
+    }
+
+    /// getName() by self.get_id()
+    std::string getNameByID(const void* self_id) const;
+
+private:
+    friend class LLSingleton<LLCoros>;
+    LLCoros();
+    std::string launchImpl(const std::string& prefix, coro* newCoro);
+    std::string generateDistinctName(const std::string& prefix) const;
+    bool cleanup(const LLSD&);
+
+    typedef boost::ptr_map<std::string, coro> CoroMap;
+    CoroMap mCoros;
+};
+
+#endif /* ! defined(LL_LLCOROS_H) */
diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h
index 905d736d621..45b84ea3eaa 100644
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -1,317 +1,317 @@
-/** 
- * @file llfasttimer.h
- * @brief Declaration of a fast timer.
- *
- * $LicenseInfo:firstyear=2004&license=viewergpl$
- * 
- * Copyright (c) 2004-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_FASTTIMER_H
-#define LL_FASTTIMER_H
-
-#include "llinstancetracker.h"
-
-#define FAST_TIMER_ON 1
-
-#if LL_WINDOWS
-
-// shift off lower 8 bits for lower resolution but longer term timing
-// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
-inline U32 get_cpu_clock_count_32()
-{
-	U32 ret_val;
-	__asm 
-	{
-        _emit   0x0f
-        _emit   0x31
-		shr eax,8
-		shl edx,24
-		or eax, edx
-		mov dword ptr [ret_val], eax
-	}
-    return ret_val;
-}
-
-// return full timer value, still shifted by 8 bits
-inline U64 get_cpu_clock_count_64()
-{
-	U64 ret_val;
-	__asm 
-	{
-        _emit   0x0f
-        _emit   0x31
-		mov eax,eax
-		mov edx,edx
-		mov dword ptr [ret_val+4], edx
-		mov dword ptr [ret_val], eax
-	}
-    return ret_val >> 8;
-}
-
-#endif // LL_WINDOWS
-
-#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
-inline U32 get_cpu_clock_count_32()
-{																	
-	U64 x;															
-	__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));					
-	return (U32)x >> 8;													
-}
-
-inline U32 get_cpu_clock_count_64()
-{																	
-	U64 x;
-	__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
-	return x >> 8;
-}
-#endif
-
-#if ( LL_DARWIN && !(defined(__i386__) || defined(__amd64__))) || (LL_SOLARIS && defined(__sparc__))
-//
-// Mac PPC (deprecated) & Solaris SPARC implementation of CPU clock
-//
-// Just use gettimeofday implementation for now
-
-inline U32 get_cpu_clock_count_32()
-{
-	return (U32)get_clock_count();
-}
-
-inline U32 get_cpu_clock_count_64()
-{																	
-	return get_clock_count();
-}
-#endif
-
-class LLMutex;
-
-#include <queue>
-#include "llsd.h"
-
-
-class LL_COMMON_API LLFastTimer
-{
-public:
-	// stores a "named" timer instance to be reused via multiple LLFastTimer stack instances
-	class LL_COMMON_API NamedTimer 
-	:	public LLInstanceTracker<NamedTimer>
-	{
-		friend class DeclareTimer;
-	public:
-		~NamedTimer();
-
-		enum { HISTORY_NUM = 60 };
-
-		const std::string& getName() const { return mName; }
-		NamedTimer* getParent() const { return mParent; }
-		void setParent(NamedTimer* parent);
-		S32 getDepth();
-		std::string getToolTip(S32 history_index = -1);
-
-		typedef std::vector<NamedTimer*>::const_iterator child_const_iter;
-		child_const_iter beginChildren();
-		child_const_iter endChildren();
-		std::vector<NamedTimer*>& getChildren();
-
-		void setCollapsed(bool collapsed) { mCollapsed = collapsed; }
-		bool getCollapsed() const { return mCollapsed; }
-
-		U32 getCountAverage() const { return mCountAverage; }
-		U32 getCallAverage() const { return mCallAverage; }
-
-		U32 getHistoricalCount(S32 history_index = 0) const;
-		U32 getHistoricalCalls(S32 history_index = 0) const;
-
-		static NamedTimer& getRootNamedTimer();
-
-		struct FrameState
-		{
-			FrameState(NamedTimer* timerp);
-
-			U32 		mSelfTimeCounter;
-			U32 		mCalls;
-			FrameState*	mParent;		// info for caller timer
-			FrameState*	mLastCaller;	// used to bootstrap tree construction
-			NamedTimer*	mTimer;
-			U16			mActiveCount;	// number of timers with this ID active on stack
-			bool		mMoveUpTree;	// needs to be moved up the tree of timers at the end of frame
-		};
-
-		S32 getFrameStateIndex() const { return mFrameStateIndex; }
-
-		FrameState& getFrameState() const;
-
-
-	private: 
-		friend class LLFastTimer;
-		friend class NamedTimerFactory;
-
-		//
-		// methods
-		//
-		NamedTimer(const std::string& name);
-		// recursive call to gather total time from children
-		static void accumulateTimings();
-
-		// updates cumulative times and hierarchy, 
-		// can be called multiple times in a frame, at any point
-		static void processTimes();
-
-		static void buildHierarchy();
-		static void resetFrame();
-		static void reset();
-
-	
-		//
-		// members
-		//
-		S32			mFrameStateIndex;
-
-		std::string	mName;
-
-		U32 		mTotalTimeCounter;
-
-		U32 		mCountAverage;
-		U32			mCallAverage;
-
-		U32*		mCountHistory;
-		U32*		mCallHistory;
-
-		// tree structure
-		NamedTimer*					mParent;				// NamedTimer of caller(parent)
-		std::vector<NamedTimer*>	mChildren;
-		bool						mCollapsed;				// don't show children
-		bool						mNeedsSorting;			// sort children whenever child added
-
-	};
-
-	// used to statically declare a new named timer
-	class LL_COMMON_API DeclareTimer
-	:	public LLInstanceTracker<DeclareTimer>
-	{
-	public:
-		DeclareTimer(const std::string& name, bool open);
-		DeclareTimer(const std::string& name);
-
-		static void updateCachedPointers();
-
-		// convertable to NamedTimer::FrameState for convenient usage of LLFastTimer(declared_timer)
-		operator NamedTimer::FrameState&() { return *mFrameState; }
-	private:
-		NamedTimer&				mTimer;
-		NamedTimer::FrameState* mFrameState; 
-	};
-
-
-public:
-	static LLMutex* sLogLock;
-	static std::queue<LLSD> sLogQueue;
-	static BOOL sLog;
-	static BOOL sMetricLog;
-
-	typedef std::vector<NamedTimer::FrameState> info_list_t;
-	static info_list_t& getFrameStateList();
-
-	enum RootTimerMarker { ROOT };
-	LLFastTimer(RootTimerMarker);
-
-	LLFastTimer(NamedTimer::FrameState& timer)
-	:	mFrameState(&timer)
-	{
-#if FAST_TIMER_ON
-		NamedTimer::FrameState* frame_state = &timer;
-		U32 cur_time = get_cpu_clock_count_32();
-		mStartSelfTime = cur_time;
-		mStartTotalTime = cur_time;
-
-		frame_state->mActiveCount++;
-		frame_state->mCalls++;
-		// keep current parent as long as it is active when we are
-		frame_state->mMoveUpTree |= (frame_state->mParent->mActiveCount == 0);
-	
-		mLastTimer = sCurTimer;
-		sCurTimer = this;
-#endif
-	}
-
-	~LLFastTimer()
-	{
-#if FAST_TIMER_ON
-		NamedTimer::FrameState* frame_state = mFrameState;
-		U32 cur_time = get_cpu_clock_count_32();
-		frame_state->mSelfTimeCounter += cur_time - mStartSelfTime;
-
-		frame_state->mActiveCount--;
-		LLFastTimer* last_timer = mLastTimer;
-		sCurTimer = last_timer;
-
-		// store last caller to bootstrap tree creation
-		frame_state->mLastCaller = last_timer->mFrameState;
-
-		// we are only tracking self time, so subtract our total time delta from parents
-		U32 total_time = cur_time - mStartTotalTime;
-		last_timer->mStartSelfTime += total_time;
-#endif
-	}
-
-
-	// call this once a frame to reset timers
-	static void nextFrame();
-
-	// dumps current cumulative frame stats to log
-	// call nextFrame() to reset timers
-	static void dumpCurTimes(); 
-
-	// call this to reset timer hierarchy, averages, etc.
-	static void reset();
-
-	static U64 countsPerSecond();
-	static S32 getLastFrameIndex() { return sLastFrameIndex; }
-	static S32 getCurFrameIndex() { return sCurFrameIndex; }
-
-	static void writeLog(std::ostream& os);
-	static const NamedTimer* getTimerByName(const std::string& name);
-
-public:
-	static bool 		sPauseHistory;
-	static bool 		sResetHistory;
-	
-private:
-	typedef std::vector<LLFastTimer*> timer_stack_t;
-	static LLFastTimer*		sCurTimer;
-	static S32				sCurFrameIndex;
-	static S32				sLastFrameIndex;
-	static U64				sLastFrameTime;
-	static info_list_t*		sTimerInfos;
-
-	U32						mStartSelfTime;	// start time + time of all child timers
-	U32						mStartTotalTime;	// start time + time of all child timers
-	NamedTimer::FrameState*	mFrameState;
-	LLFastTimer*			mLastTimer;
-};
-
-#endif // LL_LLFASTTIMER_H
+/** 
+ * @file llfasttimer.h
+ * @brief Declaration of a fast timer.
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ * 
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_FASTTIMER_H
+#define LL_FASTTIMER_H
+
+#include "llinstancetracker.h"
+
+#define FAST_TIMER_ON 1
+
+#if LL_WINDOWS
+
+// shift off lower 8 bits for lower resolution but longer term timing
+// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
+inline U32 get_cpu_clock_count_32()
+{
+	U32 ret_val;
+	__asm 
+	{
+        _emit   0x0f
+        _emit   0x31
+		shr eax,8
+		shl edx,24
+		or eax, edx
+		mov dword ptr [ret_val], eax
+	}
+    return ret_val;
+}
+
+// return full timer value, still shifted by 8 bits
+inline U64 get_cpu_clock_count_64()
+{
+	U64 ret_val;
+	__asm 
+	{
+        _emit   0x0f
+        _emit   0x31
+		mov eax,eax
+		mov edx,edx
+		mov dword ptr [ret_val+4], edx
+		mov dword ptr [ret_val], eax
+	}
+    return ret_val >> 8;
+}
+
+#endif // LL_WINDOWS
+
+#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
+inline U32 get_cpu_clock_count_32()
+{																	
+	U64 x;															
+	__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));					
+	return (U32)x >> 8;													
+}
+
+inline U32 get_cpu_clock_count_64()
+{																	
+	U64 x;
+	__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
+	return x >> 8;
+}
+#endif
+
+#if ( LL_DARWIN && !(defined(__i386__) || defined(__amd64__))) || (LL_SOLARIS && defined(__sparc__))
+//
+// Mac PPC (deprecated) & Solaris SPARC implementation of CPU clock
+//
+// Just use gettimeofday implementation for now
+
+inline U32 get_cpu_clock_count_32()
+{
+	return (U32)get_clock_count();
+}
+
+inline U32 get_cpu_clock_count_64()
+{																	
+	return get_clock_count();
+}
+#endif
+
+class LLMutex;
+
+#include <queue>
+#include "llsd.h"
+
+
+class LL_COMMON_API LLFastTimer
+{
+public:
+	// stores a "named" timer instance to be reused via multiple LLFastTimer stack instances
+	class LL_COMMON_API NamedTimer 
+	:	public LLInstanceTracker<NamedTimer>
+	{
+		friend class DeclareTimer;
+	public:
+		~NamedTimer();
+
+		enum { HISTORY_NUM = 60 };
+
+		const std::string& getName() const { return mName; }
+		NamedTimer* getParent() const { return mParent; }
+		void setParent(NamedTimer* parent);
+		S32 getDepth();
+		std::string getToolTip(S32 history_index = -1);
+
+		typedef std::vector<NamedTimer*>::const_iterator child_const_iter;
+		child_const_iter beginChildren();
+		child_const_iter endChildren();
+		std::vector<NamedTimer*>& getChildren();
+
+		void setCollapsed(bool collapsed) { mCollapsed = collapsed; }
+		bool getCollapsed() const { return mCollapsed; }
+
+		U32 getCountAverage() const { return mCountAverage; }
+		U32 getCallAverage() const { return mCallAverage; }
+
+		U32 getHistoricalCount(S32 history_index = 0) const;
+		U32 getHistoricalCalls(S32 history_index = 0) const;
+
+		static NamedTimer& getRootNamedTimer();
+
+		struct FrameState
+		{
+			FrameState(NamedTimer* timerp);
+
+			U32 		mSelfTimeCounter;
+			U32 		mCalls;
+			FrameState*	mParent;		// info for caller timer
+			FrameState*	mLastCaller;	// used to bootstrap tree construction
+			NamedTimer*	mTimer;
+			U16			mActiveCount;	// number of timers with this ID active on stack
+			bool		mMoveUpTree;	// needs to be moved up the tree of timers at the end of frame
+		};
+
+		S32 getFrameStateIndex() const { return mFrameStateIndex; }
+
+		FrameState& getFrameState() const;
+
+
+	private: 
+		friend class LLFastTimer;
+		friend class NamedTimerFactory;
+
+		//
+		// methods
+		//
+		NamedTimer(const std::string& name);
+		// recursive call to gather total time from children
+		static void accumulateTimings();
+
+		// updates cumulative times and hierarchy, 
+		// can be called multiple times in a frame, at any point
+		static void processTimes();
+
+		static void buildHierarchy();
+		static void resetFrame();
+		static void reset();
+
+	
+		//
+		// members
+		//
+		S32			mFrameStateIndex;
+
+		std::string	mName;
+
+		U32 		mTotalTimeCounter;
+
+		U32 		mCountAverage;
+		U32			mCallAverage;
+
+		U32*		mCountHistory;
+		U32*		mCallHistory;
+
+		// tree structure
+		NamedTimer*					mParent;				// NamedTimer of caller(parent)
+		std::vector<NamedTimer*>	mChildren;
+		bool						mCollapsed;				// don't show children
+		bool						mNeedsSorting;			// sort children whenever child added
+
+	};
+
+	// used to statically declare a new named timer
+	class LL_COMMON_API DeclareTimer
+	:	public LLInstanceTracker<DeclareTimer>
+	{
+	public:
+		DeclareTimer(const std::string& name, bool open);
+		DeclareTimer(const std::string& name);
+
+		static void updateCachedPointers();
+
+		// convertable to NamedTimer::FrameState for convenient usage of LLFastTimer(declared_timer)
+		operator NamedTimer::FrameState&() { return *mFrameState; }
+	private:
+		NamedTimer&				mTimer;
+		NamedTimer::FrameState* mFrameState; 
+	};
+
+
+public:
+	static LLMutex* sLogLock;
+	static std::queue<LLSD> sLogQueue;
+	static BOOL sLog;
+	static BOOL sMetricLog;
+
+	typedef std::vector<NamedTimer::FrameState> info_list_t;
+	static info_list_t& getFrameStateList();
+
+	enum RootTimerMarker { ROOT };
+	LLFastTimer(RootTimerMarker);
+
+	LLFastTimer(NamedTimer::FrameState& timer)
+	:	mFrameState(&timer)
+	{
+#if FAST_TIMER_ON
+		NamedTimer::FrameState* frame_state = &timer;
+		U32 cur_time = get_cpu_clock_count_32();
+		mStartSelfTime = cur_time;
+		mStartTotalTime = cur_time;
+
+		frame_state->mActiveCount++;
+		frame_state->mCalls++;
+		// keep current parent as long as it is active when we are
+		frame_state->mMoveUpTree |= (frame_state->mParent->mActiveCount == 0);
+	
+		mLastTimer = sCurTimer;
+		sCurTimer = this;
+#endif
+	}
+
+	~LLFastTimer()
+	{
+#if FAST_TIMER_ON
+		NamedTimer::FrameState* frame_state = mFrameState;
+		U32 cur_time = get_cpu_clock_count_32();
+		frame_state->mSelfTimeCounter += cur_time - mStartSelfTime;
+
+		frame_state->mActiveCount--;
+		LLFastTimer* last_timer = mLastTimer;
+		sCurTimer = last_timer;
+
+		// store last caller to bootstrap tree creation
+		frame_state->mLastCaller = last_timer->mFrameState;
+
+		// we are only tracking self time, so subtract our total time delta from parents
+		U32 total_time = cur_time - mStartTotalTime;
+		last_timer->mStartSelfTime += total_time;
+#endif
+	}
+
+
+	// call this once a frame to reset timers
+	static void nextFrame();
+
+	// dumps current cumulative frame stats to log
+	// call nextFrame() to reset timers
+	static void dumpCurTimes(); 
+
+	// call this to reset timer hierarchy, averages, etc.
+	static void reset();
+
+	static U64 countsPerSecond();
+	static S32 getLastFrameIndex() { return sLastFrameIndex; }
+	static S32 getCurFrameIndex() { return sCurFrameIndex; }
+
+	static void writeLog(std::ostream& os);
+	static const NamedTimer* getTimerByName(const std::string& name);
+
+public:
+	static bool 		sPauseHistory;
+	static bool 		sResetHistory;
+	
+private:
+	typedef std::vector<LLFastTimer*> timer_stack_t;
+	static LLFastTimer*		sCurTimer;
+	static S32				sCurFrameIndex;
+	static S32				sLastFrameIndex;
+	static U64				sLastFrameTime;
+	static info_list_t*		sTimerInfos;
+
+	U32						mStartSelfTime;	// start time + time of all child timers
+	U32						mStartTotalTime;	// start time + time of all child timers
+	NamedTimer::FrameState*	mFrameState;
+	LLFastTimer*			mLastTimer;
+};
+
+#endif // LL_LLFASTTIMER_H
diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h
index 09f19532b7c..1c6f64dd8bc 100644
--- a/indra/llcommon/llmemory.h
+++ b/indra/llcommon/llmemory.h
@@ -1,65 +1,65 @@
-/** 
- * @file llmemory.h
- * @brief Memory allocation/deallocation header-stuff goes here.
- *
- * $LicenseInfo:firstyear=2002&license=viewergpl$
- * 
- * Copyright (c) 2002-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-#ifndef LLMEMORY_H
-#define LLMEMORY_H
-
-
-
-extern S32 gTotalDAlloc;
-extern S32 gTotalDAUse;
-extern S32 gDACount;
-
-extern void* ll_allocate (size_t size);
-extern void ll_release (void *p);
-
-class LL_COMMON_API LLMemory
-{
-public:
-	static void initClass();
-	static void cleanupClass();
-	static void freeReserve();
-	// Return the resident set size of the current process, in bytes.
-	// Return value is zero if not known.
-	static U64 getCurrentRSS();
-private:
-	static char* reserveMem;
-};
-
-// LLRefCount moved to llrefcount.h
-
-// LLPointer moved to llpointer.h
-
-// LLSafeHandle moved to llsafehandle.h
-
-// LLSingleton moved to llsingleton.h
-
-#endif
+/** 
+ * @file llmemory.h
+ * @brief Memory allocation/deallocation header-stuff goes here.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#ifndef LLMEMORY_H
+#define LLMEMORY_H
+
+
+
+extern S32 gTotalDAlloc;
+extern S32 gTotalDAUse;
+extern S32 gDACount;
+
+extern void* ll_allocate (size_t size);
+extern void ll_release (void *p);
+
+class LL_COMMON_API LLMemory
+{
+public:
+	static void initClass();
+	static void cleanupClass();
+	static void freeReserve();
+	// Return the resident set size of the current process, in bytes.
+	// Return value is zero if not known.
+	static U64 getCurrentRSS();
+private:
+	static char* reserveMem;
+};
+
+// LLRefCount moved to llrefcount.h
+
+// LLPointer moved to llpointer.h
+
+// LLSafeHandle moved to llsafehandle.h
+
+// LLSingleton moved to llsingleton.h
+
+#endif
diff --git a/indra/llcommon/llmemtype.h b/indra/llcommon/llmemtype.h
index 5952a3a7c5a..677fad3034d 100644
--- a/indra/llcommon/llmemtype.h
+++ b/indra/llcommon/llmemtype.h
@@ -1,248 +1,248 @@
-/** 
- * @file llmemtype.h
- * @brief Runtime memory usage debugging utilities.
- *
- * $LicenseInfo:firstyear=2005&license=viewergpl$
- * 
- * Copyright (c) 2005-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_MEMTYPE_H
-#define LL_MEMTYPE_H
-
-//----------------------------------------------------------------------------
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-
-#include "linden_common.h"
-//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-// WARNING: Never commit with MEM_TRACK_MEM == 1
-//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-#define MEM_TRACK_MEM (0 && LL_WINDOWS)
-
-#include <vector>
-
-#define MEM_TYPE_NEW(T)
-
-class LL_COMMON_API LLMemType
-{
-public:
-
-	// class we'll initialize all instances of as
-	// static members of MemType.  Then use
-	// to construct any new mem type.
-	class LL_COMMON_API DeclareMemType
-	{
-	public:
-		DeclareMemType(char const * st);
-		~DeclareMemType();
-	
-		S32 mID;
-		char const * mName;
-		
-		// array so we can map an index ID to Name
-		static std::vector<char const *> mNameList;
-	};
-
-	LLMemType(DeclareMemType& dt);
-	~LLMemType();
-
-	static char const * getNameFromID(S32 id);
-
-	static DeclareMemType MTYPE_INIT;
-	static DeclareMemType MTYPE_STARTUP;
-	static DeclareMemType MTYPE_MAIN;
-	static DeclareMemType MTYPE_FRAME;
-
-	static DeclareMemType MTYPE_GATHER_INPUT;
-	static DeclareMemType MTYPE_JOY_KEY;
-
-	static DeclareMemType MTYPE_IDLE;
-	static DeclareMemType MTYPE_IDLE_PUMP;
-	static DeclareMemType MTYPE_IDLE_NETWORK;
-	static DeclareMemType MTYPE_IDLE_UPDATE_REGIONS;
-	static DeclareMemType MTYPE_IDLE_UPDATE_VIEWER_REGION;
-	static DeclareMemType MTYPE_IDLE_UPDATE_SURFACE;
-	static DeclareMemType MTYPE_IDLE_UPDATE_PARCEL_OVERLAY;
-	static DeclareMemType MTYPE_IDLE_AUDIO;
-
-	static DeclareMemType MTYPE_CACHE_PROCESS_PENDING;
-	static DeclareMemType MTYPE_CACHE_PROCESS_PENDING_ASKS;
-	static DeclareMemType MTYPE_CACHE_PROCESS_PENDING_REPLIES;
-
-	static DeclareMemType MTYPE_MESSAGE_CHECK_ALL;
-	static DeclareMemType MTYPE_MESSAGE_PROCESS_ACKS;
-
-	static DeclareMemType MTYPE_RENDER;
-	static DeclareMemType MTYPE_SLEEP;
-
-	static DeclareMemType MTYPE_NETWORK;
-	static DeclareMemType MTYPE_PHYSICS;
-	static DeclareMemType MTYPE_INTERESTLIST;
-
-	static DeclareMemType MTYPE_IMAGEBASE;
-	static DeclareMemType MTYPE_IMAGERAW;
-	static DeclareMemType MTYPE_IMAGEFORMATTED;
-	
-	static DeclareMemType MTYPE_APPFMTIMAGE;
-	static DeclareMemType MTYPE_APPRAWIMAGE;
-	static DeclareMemType MTYPE_APPAUXRAWIMAGE;
-	
-	static DeclareMemType MTYPE_DRAWABLE;
-	
-	static DeclareMemType MTYPE_OBJECT;
-	static DeclareMemType MTYPE_OBJECT_PROCESS_UPDATE;
-	static DeclareMemType MTYPE_OBJECT_PROCESS_UPDATE_CORE;
-
-	static DeclareMemType MTYPE_DISPLAY;
-	static DeclareMemType MTYPE_DISPLAY_UPDATE;
-	static DeclareMemType MTYPE_DISPLAY_UPDATE_CAMERA;
-	static DeclareMemType MTYPE_DISPLAY_UPDATE_GEOM;
-	static DeclareMemType MTYPE_DISPLAY_SWAP;
-	static DeclareMemType MTYPE_DISPLAY_UPDATE_HUD;
-	static DeclareMemType MTYPE_DISPLAY_GEN_REFLECTION;
-	static DeclareMemType MTYPE_DISPLAY_IMAGE_UPDATE;
-	static DeclareMemType MTYPE_DISPLAY_STATE_SORT;
-	static DeclareMemType MTYPE_DISPLAY_SKY;
-	static DeclareMemType MTYPE_DISPLAY_RENDER_GEOM;
-	static DeclareMemType MTYPE_DISPLAY_RENDER_FLUSH;
-	static DeclareMemType MTYPE_DISPLAY_RENDER_UI;
-	static DeclareMemType MTYPE_DISPLAY_RENDER_ATTACHMENTS;
-
-	static DeclareMemType MTYPE_VERTEX_DATA;
-	static DeclareMemType MTYPE_VERTEX_CONSTRUCTOR;
-	static DeclareMemType MTYPE_VERTEX_DESTRUCTOR;
-	static DeclareMemType MTYPE_VERTEX_CREATE_VERTICES;
-	static DeclareMemType MTYPE_VERTEX_CREATE_INDICES;
-	static DeclareMemType MTYPE_VERTEX_DESTROY_BUFFER;	
-	static DeclareMemType MTYPE_VERTEX_DESTROY_INDICES;
-	static DeclareMemType MTYPE_VERTEX_UPDATE_VERTS;
-	static DeclareMemType MTYPE_VERTEX_UPDATE_INDICES;
-	static DeclareMemType MTYPE_VERTEX_ALLOCATE_BUFFER;
-	static DeclareMemType MTYPE_VERTEX_RESIZE_BUFFER;
-	static DeclareMemType MTYPE_VERTEX_MAP_BUFFER;
-	static DeclareMemType MTYPE_VERTEX_MAP_BUFFER_VERTICES;
-	static DeclareMemType MTYPE_VERTEX_MAP_BUFFER_INDICES;
-	static DeclareMemType MTYPE_VERTEX_UNMAP_BUFFER;
-	static DeclareMemType MTYPE_VERTEX_SET_STRIDE;
-	static DeclareMemType MTYPE_VERTEX_SET_BUFFER;
-	static DeclareMemType MTYPE_VERTEX_SETUP_VERTEX_BUFFER;
-	static DeclareMemType MTYPE_VERTEX_CLEANUP_CLASS;
-
-	static DeclareMemType MTYPE_SPACE_PARTITION;
-
-	static DeclareMemType MTYPE_PIPELINE;
-	static DeclareMemType MTYPE_PIPELINE_INIT;
-	static DeclareMemType MTYPE_PIPELINE_CREATE_BUFFERS;
-	static DeclareMemType MTYPE_PIPELINE_RESTORE_GL;
-	static DeclareMemType MTYPE_PIPELINE_UNLOAD_SHADERS;
-	static DeclareMemType MTYPE_PIPELINE_LIGHTING_DETAIL;
-	static DeclareMemType MTYPE_PIPELINE_GET_POOL_TYPE;
-	static DeclareMemType MTYPE_PIPELINE_ADD_POOL;
-	static DeclareMemType MTYPE_PIPELINE_ALLOCATE_DRAWABLE;
-	static DeclareMemType MTYPE_PIPELINE_ADD_OBJECT;
-	static DeclareMemType MTYPE_PIPELINE_CREATE_OBJECTS;
-	static DeclareMemType MTYPE_PIPELINE_UPDATE_MOVE;
-	static DeclareMemType MTYPE_PIPELINE_UPDATE_GEOM;
-	static DeclareMemType MTYPE_PIPELINE_MARK_VISIBLE;
-	static DeclareMemType MTYPE_PIPELINE_MARK_MOVED;
-	static DeclareMemType MTYPE_PIPELINE_MARK_SHIFT;
-	static DeclareMemType MTYPE_PIPELINE_SHIFT_OBJECTS;
-	static DeclareMemType MTYPE_PIPELINE_MARK_TEXTURED;
-	static DeclareMemType MTYPE_PIPELINE_MARK_REBUILD;
-	static DeclareMemType MTYPE_PIPELINE_UPDATE_CULL;
-	static DeclareMemType MTYPE_PIPELINE_STATE_SORT;
-	static DeclareMemType MTYPE_PIPELINE_POST_SORT;
-	
-	static DeclareMemType MTYPE_PIPELINE_RENDER_HUD_ELS;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_HL;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_DEFFERRED;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_POST_DEF;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_SHADOW;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_SELECT;
-	static DeclareMemType MTYPE_PIPELINE_REBUILD_POOLS;
-	static DeclareMemType MTYPE_PIPELINE_QUICK_LOOKUP;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_OBJECTS;
-	static DeclareMemType MTYPE_PIPELINE_GENERATE_IMPOSTOR;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_BLOOM;
-
-	static DeclareMemType MTYPE_UPKEEP_POOLS;
-
-	static DeclareMemType MTYPE_AVATAR;
-	static DeclareMemType MTYPE_AVATAR_MESH;
-	static DeclareMemType MTYPE_PARTICLES;
-	static DeclareMemType MTYPE_REGIONS;
-
-	static DeclareMemType MTYPE_INVENTORY;
-	static DeclareMemType MTYPE_INVENTORY_DRAW;
-	static DeclareMemType MTYPE_INVENTORY_BUILD_NEW_VIEWS;
-	static DeclareMemType MTYPE_INVENTORY_DO_FOLDER;
-	static DeclareMemType MTYPE_INVENTORY_POST_BUILD;
-	static DeclareMemType MTYPE_INVENTORY_FROM_XML;
-	static DeclareMemType MTYPE_INVENTORY_CREATE_NEW_ITEM;
-	static DeclareMemType MTYPE_INVENTORY_VIEW_INIT;
-	static DeclareMemType MTYPE_INVENTORY_VIEW_SHOW;
-	static DeclareMemType MTYPE_INVENTORY_VIEW_TOGGLE;
-
-	static DeclareMemType MTYPE_ANIMATION;
-	static DeclareMemType MTYPE_VOLUME;
-	static DeclareMemType MTYPE_PRIMITIVE;
-	
-	static DeclareMemType MTYPE_SCRIPT;
-	static DeclareMemType MTYPE_SCRIPT_RUN;
-	static DeclareMemType MTYPE_SCRIPT_BYTECODE;
-	
-	static DeclareMemType MTYPE_IO_PUMP;
-	static DeclareMemType MTYPE_IO_TCP;
-	static DeclareMemType MTYPE_IO_BUFFER;
-	static DeclareMemType MTYPE_IO_HTTP_SERVER;
-	static DeclareMemType MTYPE_IO_SD_SERVER;
-	static DeclareMemType MTYPE_IO_SD_CLIENT;
-	static DeclareMemType MTYPE_IO_URL_REQUEST;
-
-	static DeclareMemType MTYPE_DIRECTX_INIT;
-
-	static DeclareMemType MTYPE_TEMP1;
-	static DeclareMemType MTYPE_TEMP2;
-	static DeclareMemType MTYPE_TEMP3;
-	static DeclareMemType MTYPE_TEMP4;
-	static DeclareMemType MTYPE_TEMP5;
-	static DeclareMemType MTYPE_TEMP6;
-	static DeclareMemType MTYPE_TEMP7;
-	static DeclareMemType MTYPE_TEMP8;
-	static DeclareMemType MTYPE_TEMP9;
-
-	static DeclareMemType MTYPE_OTHER; // Special; used by display code
-
-	S32 mTypeIndex;
-};
-
-//----------------------------------------------------------------------------
-
-#endif
-
+/** 
+ * @file llmemtype.h
+ * @brief Runtime memory usage debugging utilities.
+ *
+ * $LicenseInfo:firstyear=2005&license=viewergpl$
+ * 
+ * Copyright (c) 2005-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_MEMTYPE_H
+#define LL_MEMTYPE_H
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+
+#include "linden_common.h"
+//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+// WARNING: Never commit with MEM_TRACK_MEM == 1
+//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+#define MEM_TRACK_MEM (0 && LL_WINDOWS)
+
+#include <vector>
+
+#define MEM_TYPE_NEW(T)
+
+class LL_COMMON_API LLMemType
+{
+public:
+
+	// class we'll initialize all instances of as
+	// static members of MemType.  Then use
+	// to construct any new mem type.
+	class LL_COMMON_API DeclareMemType
+	{
+	public:
+		DeclareMemType(char const * st);
+		~DeclareMemType();
+	
+		S32 mID;
+		char const * mName;
+		
+		// array so we can map an index ID to Name
+		static std::vector<char const *> mNameList;
+	};
+
+	LLMemType(DeclareMemType& dt);
+	~LLMemType();
+
+	static char const * getNameFromID(S32 id);
+
+	static DeclareMemType MTYPE_INIT;
+	static DeclareMemType MTYPE_STARTUP;
+	static DeclareMemType MTYPE_MAIN;
+	static DeclareMemType MTYPE_FRAME;
+
+	static DeclareMemType MTYPE_GATHER_INPUT;
+	static DeclareMemType MTYPE_JOY_KEY;
+
+	static DeclareMemType MTYPE_IDLE;
+	static DeclareMemType MTYPE_IDLE_PUMP;
+	static DeclareMemType MTYPE_IDLE_NETWORK;
+	static DeclareMemType MTYPE_IDLE_UPDATE_REGIONS;
+	static DeclareMemType MTYPE_IDLE_UPDATE_VIEWER_REGION;
+	static DeclareMemType MTYPE_IDLE_UPDATE_SURFACE;
+	static DeclareMemType MTYPE_IDLE_UPDATE_PARCEL_OVERLAY;
+	static DeclareMemType MTYPE_IDLE_AUDIO;
+
+	static DeclareMemType MTYPE_CACHE_PROCESS_PENDING;
+	static DeclareMemType MTYPE_CACHE_PROCESS_PENDING_ASKS;
+	static DeclareMemType MTYPE_CACHE_PROCESS_PENDING_REPLIES;
+
+	static DeclareMemType MTYPE_MESSAGE_CHECK_ALL;
+	static DeclareMemType MTYPE_MESSAGE_PROCESS_ACKS;
+
+	static DeclareMemType MTYPE_RENDER;
+	static DeclareMemType MTYPE_SLEEP;
+
+	static DeclareMemType MTYPE_NETWORK;
+	static DeclareMemType MTYPE_PHYSICS;
+	static DeclareMemType MTYPE_INTERESTLIST;
+
+	static DeclareMemType MTYPE_IMAGEBASE;
+	static DeclareMemType MTYPE_IMAGERAW;
+	static DeclareMemType MTYPE_IMAGEFORMATTED;
+	
+	static DeclareMemType MTYPE_APPFMTIMAGE;
+	static DeclareMemType MTYPE_APPRAWIMAGE;
+	static DeclareMemType MTYPE_APPAUXRAWIMAGE;
+	
+	static DeclareMemType MTYPE_DRAWABLE;
+	
+	static DeclareMemType MTYPE_OBJECT;
+	static DeclareMemType MTYPE_OBJECT_PROCESS_UPDATE;
+	static DeclareMemType MTYPE_OBJECT_PROCESS_UPDATE_CORE;
+
+	static DeclareMemType MTYPE_DISPLAY;
+	static DeclareMemType MTYPE_DISPLAY_UPDATE;
+	static DeclareMemType MTYPE_DISPLAY_UPDATE_CAMERA;
+	static DeclareMemType MTYPE_DISPLAY_UPDATE_GEOM;
+	static DeclareMemType MTYPE_DISPLAY_SWAP;
+	static DeclareMemType MTYPE_DISPLAY_UPDATE_HUD;
+	static DeclareMemType MTYPE_DISPLAY_GEN_REFLECTION;
+	static DeclareMemType MTYPE_DISPLAY_IMAGE_UPDATE;
+	static DeclareMemType MTYPE_DISPLAY_STATE_SORT;
+	static DeclareMemType MTYPE_DISPLAY_SKY;
+	static DeclareMemType MTYPE_DISPLAY_RENDER_GEOM;
+	static DeclareMemType MTYPE_DISPLAY_RENDER_FLUSH;
+	static DeclareMemType MTYPE_DISPLAY_RENDER_UI;
+	static DeclareMemType MTYPE_DISPLAY_RENDER_ATTACHMENTS;
+
+	static DeclareMemType MTYPE_VERTEX_DATA;
+	static DeclareMemType MTYPE_VERTEX_CONSTRUCTOR;
+	static DeclareMemType MTYPE_VERTEX_DESTRUCTOR;
+	static DeclareMemType MTYPE_VERTEX_CREATE_VERTICES;
+	static DeclareMemType MTYPE_VERTEX_CREATE_INDICES;
+	static DeclareMemType MTYPE_VERTEX_DESTROY_BUFFER;	
+	static DeclareMemType MTYPE_VERTEX_DESTROY_INDICES;
+	static DeclareMemType MTYPE_VERTEX_UPDATE_VERTS;
+	static DeclareMemType MTYPE_VERTEX_UPDATE_INDICES;
+	static DeclareMemType MTYPE_VERTEX_ALLOCATE_BUFFER;
+	static DeclareMemType MTYPE_VERTEX_RESIZE_BUFFER;
+	static DeclareMemType MTYPE_VERTEX_MAP_BUFFER;
+	static DeclareMemType MTYPE_VERTEX_MAP_BUFFER_VERTICES;
+	static DeclareMemType MTYPE_VERTEX_MAP_BUFFER_INDICES;
+	static DeclareMemType MTYPE_VERTEX_UNMAP_BUFFER;
+	static DeclareMemType MTYPE_VERTEX_SET_STRIDE;
+	static DeclareMemType MTYPE_VERTEX_SET_BUFFER;
+	static DeclareMemType MTYPE_VERTEX_SETUP_VERTEX_BUFFER;
+	static DeclareMemType MTYPE_VERTEX_CLEANUP_CLASS;
+
+	static DeclareMemType MTYPE_SPACE_PARTITION;
+
+	static DeclareMemType MTYPE_PIPELINE;
+	static DeclareMemType MTYPE_PIPELINE_INIT;
+	static DeclareMemType MTYPE_PIPELINE_CREATE_BUFFERS;
+	static DeclareMemType MTYPE_PIPELINE_RESTORE_GL;
+	static DeclareMemType MTYPE_PIPELINE_UNLOAD_SHADERS;
+	static DeclareMemType MTYPE_PIPELINE_LIGHTING_DETAIL;
+	static DeclareMemType MTYPE_PIPELINE_GET_POOL_TYPE;
+	static DeclareMemType MTYPE_PIPELINE_ADD_POOL;
+	static DeclareMemType MTYPE_PIPELINE_ALLOCATE_DRAWABLE;
+	static DeclareMemType MTYPE_PIPELINE_ADD_OBJECT;
+	static DeclareMemType MTYPE_PIPELINE_CREATE_OBJECTS;
+	static DeclareMemType MTYPE_PIPELINE_UPDATE_MOVE;
+	static DeclareMemType MTYPE_PIPELINE_UPDATE_GEOM;
+	static DeclareMemType MTYPE_PIPELINE_MARK_VISIBLE;
+	static DeclareMemType MTYPE_PIPELINE_MARK_MOVED;
+	static DeclareMemType MTYPE_PIPELINE_MARK_SHIFT;
+	static DeclareMemType MTYPE_PIPELINE_SHIFT_OBJECTS;
+	static DeclareMemType MTYPE_PIPELINE_MARK_TEXTURED;
+	static DeclareMemType MTYPE_PIPELINE_MARK_REBUILD;
+	static DeclareMemType MTYPE_PIPELINE_UPDATE_CULL;
+	static DeclareMemType MTYPE_PIPELINE_STATE_SORT;
+	static DeclareMemType MTYPE_PIPELINE_POST_SORT;
+	
+	static DeclareMemType MTYPE_PIPELINE_RENDER_HUD_ELS;
+	static DeclareMemType MTYPE_PIPELINE_RENDER_HL;
+	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM;
+	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_DEFFERRED;
+	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_POST_DEF;
+	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_SHADOW;
+	static DeclareMemType MTYPE_PIPELINE_RENDER_SELECT;
+	static DeclareMemType MTYPE_PIPELINE_REBUILD_POOLS;
+	static DeclareMemType MTYPE_PIPELINE_QUICK_LOOKUP;
+	static DeclareMemType MTYPE_PIPELINE_RENDER_OBJECTS;
+	static DeclareMemType MTYPE_PIPELINE_GENERATE_IMPOSTOR;
+	static DeclareMemType MTYPE_PIPELINE_RENDER_BLOOM;
+
+	static DeclareMemType MTYPE_UPKEEP_POOLS;
+
+	static DeclareMemType MTYPE_AVATAR;
+	static DeclareMemType MTYPE_AVATAR_MESH;
+	static DeclareMemType MTYPE_PARTICLES;
+	static DeclareMemType MTYPE_REGIONS;
+
+	static DeclareMemType MTYPE_INVENTORY;
+	static DeclareMemType MTYPE_INVENTORY_DRAW;
+	static DeclareMemType MTYPE_INVENTORY_BUILD_NEW_VIEWS;
+	static DeclareMemType MTYPE_INVENTORY_DO_FOLDER;
+	static DeclareMemType MTYPE_INVENTORY_POST_BUILD;
+	static DeclareMemType MTYPE_INVENTORY_FROM_XML;
+	static DeclareMemType MTYPE_INVENTORY_CREATE_NEW_ITEM;
+	static DeclareMemType MTYPE_INVENTORY_VIEW_INIT;
+	static DeclareMemType MTYPE_INVENTORY_VIEW_SHOW;
+	static DeclareMemType MTYPE_INVENTORY_VIEW_TOGGLE;
+
+	static DeclareMemType MTYPE_ANIMATION;
+	static DeclareMemType MTYPE_VOLUME;
+	static DeclareMemType MTYPE_PRIMITIVE;
+	
+	static DeclareMemType MTYPE_SCRIPT;
+	static DeclareMemType MTYPE_SCRIPT_RUN;
+	static DeclareMemType MTYPE_SCRIPT_BYTECODE;
+	
+	static DeclareMemType MTYPE_IO_PUMP;
+	static DeclareMemType MTYPE_IO_TCP;
+	static DeclareMemType MTYPE_IO_BUFFER;
+	static DeclareMemType MTYPE_IO_HTTP_SERVER;
+	static DeclareMemType MTYPE_IO_SD_SERVER;
+	static DeclareMemType MTYPE_IO_SD_CLIENT;
+	static DeclareMemType MTYPE_IO_URL_REQUEST;
+
+	static DeclareMemType MTYPE_DIRECTX_INIT;
+
+	static DeclareMemType MTYPE_TEMP1;
+	static DeclareMemType MTYPE_TEMP2;
+	static DeclareMemType MTYPE_TEMP3;
+	static DeclareMemType MTYPE_TEMP4;
+	static DeclareMemType MTYPE_TEMP5;
+	static DeclareMemType MTYPE_TEMP6;
+	static DeclareMemType MTYPE_TEMP7;
+	static DeclareMemType MTYPE_TEMP8;
+	static DeclareMemType MTYPE_TEMP9;
+
+	static DeclareMemType MTYPE_OTHER; // Special; used by display code
+
+	S32 mTypeIndex;
+};
+
+//----------------------------------------------------------------------------
+
+#endif
+
diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h
index dda9a95597a..bb3301df9ff 100644
--- a/indra/llcommon/llpreprocessor.h
+++ b/indra/llcommon/llpreprocessor.h
@@ -1,169 +1,169 @@
-/** 
- * @file llpreprocessor.h
- * @brief This file should be included in all Linden Lab files and
- * should only contain special preprocessor directives
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- * 
- * Copyright (c) 2001-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LLPREPROCESSOR_H
-#define LLPREPROCESSOR_H
-
-// Figure out endianness of platform
-#ifdef LL_LINUX
-#define __ENABLE_WSTRING
-#include <endian.h>
-#endif	//	LL_LINUX
-
-#if LL_SOLARIS
-#   ifdef  __sparc     // Since we're talking Solaris 10 and up, only 64 bit is supported.
-#      define LL_BIG_ENDIAN 1
-#      define LL_SOLARIS_ALIGNED_CPU 1     //  used to designate issues where SPARC alignment is addressed
-#      define LL_SOLARIS_NON_MESA_GL 1      //  The SPARC GL does not provide a MESA-based GL API
-#   endif
-#   include <sys/isa_defs.h> // ensure we know which end is up
-#endif // LL_SOLARIS
-
-#if (defined(LL_WINDOWS) || (defined(LL_LINUX) && (__BYTE_ORDER == __LITTLE_ENDIAN)) || (defined(LL_DARWIN) && defined(__LITTLE_ENDIAN__)) || (defined(LL_SOLARIS) && defined(__i386)))
-#define LL_LITTLE_ENDIAN 1
-#else
-#define LL_BIG_ENDIAN 1
-#endif
-
-// Per-compiler switches
-#ifdef __GNUC__
-#define LL_FORCE_INLINE inline __attribute__((always_inline))
-#else
-#define LL_FORCE_INLINE __forceinline
-#endif
-
-// Figure out differences between compilers
-#if defined(__GNUC__)
-	#define GCC_VERSION (__GNUC__ * 10000 \
-						+ __GNUC_MINOR__ * 100 \
-						+ __GNUC_PATCHLEVEL__)
-	#ifndef LL_GNUC
-		#define LL_GNUC 1
-	#endif
-#elif defined(__MSVC_VER__) || defined(_MSC_VER)
-	#ifndef LL_MSVC
-		#define LL_MSVC 1
-	#endif
-	#if _MSC_VER < 1400
-		#define LL_MSVC7 //Visual C++ 2003 or earlier
-	#endif
-#endif
-
-// Deal with minor differences on Unixy OSes.
-#if LL_DARWIN || LL_LINUX
-	// Different name, same functionality.
-	#define stricmp strcasecmp
-	#define strnicmp strncasecmp
-
-	// Not sure why this is different, but...
-	#ifndef MAX_PATH
-		#define MAX_PATH PATH_MAX
-	#endif	//	not MAX_PATH
-
-#endif
-
-
-// Static linking with apr on windows needs to be declared.
-#if LL_WINDOWS && !LL_COMMON_LINK_SHARED
-#ifndef APR_DECLARE_STATIC
-#define APR_DECLARE_STATIC // For APR on Windows
-#endif
-#ifndef APU_DECLARE_STATIC
-#define APU_DECLARE_STATIC // For APR util on Windows
-#endif
-#endif
-
-#if defined(LL_WINDOWS)
-#define BOOST_REGEX_NO_LIB 1
-#define CURL_STATICLIB 1
-#ifndef XML_STATIC
-#define XML_STATIC
-#endif
-#endif	//	LL_WINDOWS
-
-
-// Deal with VC6 problems
-#if LL_MSVC
-#pragma warning( 3	     : 4701 )	// "local variable used without being initialized"  Treat this as level 3, not level 4.
-#pragma warning( 3	     : 4702 )	// "unreachable code"  Treat this as level 3, not level 4.
-#pragma warning( 3	     : 4189 )	// "local variable initialized but not referenced"  Treat this as level 3, not level 4.
-//#pragma warning( 3	: 4018 )	// "signed/unsigned mismatch"  Treat this as level 3, not level 4.
-#pragma warning( 3      :  4263 )	// 'function' : member function does not override any base class virtual member function
-#pragma warning( 3      :  4264 )	// "'virtual_function' : no override available for virtual member function from base 'class'; function is hidden"
-#pragma warning( 3       : 4265 )	// "class has virtual functions, but destructor is not virtual"
-#pragma warning( 3      :  4266 )	// 'function' : no override available for virtual member function from base 'type'; function is hidden
-#pragma warning (disable : 4180)	// qualifier applied to function type has no meaning; ignored
-#pragma warning( disable : 4284 )	// silly MS warning deep inside their <map> include file
-#pragma warning( disable : 4503 )	// 'decorated name length exceeded, name was truncated'. Does not seem to affect compilation.
-#pragma warning( disable : 4800 )	// 'BOOL' : forcing value to bool 'true' or 'false' (performance warning)
-#pragma warning( disable : 4996 )	// warning: deprecated
-
-// level 4 warnings that we need to disable:
-#pragma warning (disable : 4100) // unreferenced formal parameter
-#pragma warning (disable : 4127) // conditional expression is constant (e.g. while(1) )
-#pragma warning (disable : 4244) // possible loss of data on conversions
-#pragma warning (disable : 4396) // the inline specifier cannot be used when a friend declaration refers to a specialization of a function template
-#pragma warning (disable : 4512) // assignment operator could not be generated
-#pragma warning (disable : 4706) // assignment within conditional (even if((x = y)) )
-
-#pragma warning (disable : 4251) // member needs to have dll-interface to be used by clients of class
-#pragma warning (disable : 4275) // non dll-interface class used as base for dll-interface class
-#endif	//	LL_MSVC
-
-#if LL_WINDOWS
-#define LL_DLLEXPORT __declspec(dllexport)
-#define LL_DLLIMPORT __declspec(dllimport)
-#elif LL_LINUX
-#define LL_DLLEXPORT __attribute__ ((visibility("default")))
-#define LL_DLLIMPORT
-#else
-#define LL_DLLEXPORT
-#define LL_DLLIMPORT
-#endif // LL_WINDOWS
-
-#if LL_COMMON_LINK_SHARED
-// CMake automagically defines llcommon_EXPORTS only when building llcommon
-// sources, and only when llcommon is a shared library (i.e. when
-// LL_COMMON_LINK_SHARED). We must still test LL_COMMON_LINK_SHARED because
-// otherwise we can't distinguish between (non-llcommon source) and (llcommon
-// not shared).
-# if defined(llcommon_EXPORTS)
-#   define LL_COMMON_API LL_DLLEXPORT
-# else //llcommon_EXPORTS
-#   define LL_COMMON_API LL_DLLIMPORT
-# endif //llcommon_EXPORTS
-#else // LL_COMMON_LINK_SHARED
-# define LL_COMMON_API
-#endif // LL_COMMON_LINK_SHARED
-
-#endif	//	not LL_LINDEN_PREPROCESSOR_H
+/** 
+ * @file llpreprocessor.h
+ * @brief This file should be included in all Linden Lab files and
+ * should only contain special preprocessor directives
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LLPREPROCESSOR_H
+#define LLPREPROCESSOR_H
+
+// Figure out endianness of platform
+#ifdef LL_LINUX
+#define __ENABLE_WSTRING
+#include <endian.h>
+#endif	//	LL_LINUX
+
+#if LL_SOLARIS
+#   ifdef  __sparc     // Since we're talking Solaris 10 and up, only 64 bit is supported.
+#      define LL_BIG_ENDIAN 1
+#      define LL_SOLARIS_ALIGNED_CPU 1     //  used to designate issues where SPARC alignment is addressed
+#      define LL_SOLARIS_NON_MESA_GL 1      //  The SPARC GL does not provide a MESA-based GL API
+#   endif
+#   include <sys/isa_defs.h> // ensure we know which end is up
+#endif // LL_SOLARIS
+
+#if (defined(LL_WINDOWS) || (defined(LL_LINUX) && (__BYTE_ORDER == __LITTLE_ENDIAN)) || (defined(LL_DARWIN) && defined(__LITTLE_ENDIAN__)) || (defined(LL_SOLARIS) && defined(__i386)))
+#define LL_LITTLE_ENDIAN 1
+#else
+#define LL_BIG_ENDIAN 1
+#endif
+
+// Per-compiler switches
+#ifdef __GNUC__
+#define LL_FORCE_INLINE inline __attribute__((always_inline))
+#else
+#define LL_FORCE_INLINE __forceinline
+#endif
+
+// Figure out differences between compilers
+#if defined(__GNUC__)
+	#define GCC_VERSION (__GNUC__ * 10000 \
+						+ __GNUC_MINOR__ * 100 \
+						+ __GNUC_PATCHLEVEL__)
+	#ifndef LL_GNUC
+		#define LL_GNUC 1
+	#endif
+#elif defined(__MSVC_VER__) || defined(_MSC_VER)
+	#ifndef LL_MSVC
+		#define LL_MSVC 1
+	#endif
+	#if _MSC_VER < 1400
+		#define LL_MSVC7 //Visual C++ 2003 or earlier
+	#endif
+#endif
+
+// Deal with minor differences on Unixy OSes.
+#if LL_DARWIN || LL_LINUX
+	// Different name, same functionality.
+	#define stricmp strcasecmp
+	#define strnicmp strncasecmp
+
+	// Not sure why this is different, but...
+	#ifndef MAX_PATH
+		#define MAX_PATH PATH_MAX
+	#endif	//	not MAX_PATH
+
+#endif
+
+
+// Static linking with apr on windows needs to be declared.
+#if LL_WINDOWS && !LL_COMMON_LINK_SHARED
+#ifndef APR_DECLARE_STATIC
+#define APR_DECLARE_STATIC // For APR on Windows
+#endif
+#ifndef APU_DECLARE_STATIC
+#define APU_DECLARE_STATIC // For APR util on Windows
+#endif
+#endif
+
+#if defined(LL_WINDOWS)
+#define BOOST_REGEX_NO_LIB 1
+#define CURL_STATICLIB 1
+#ifndef XML_STATIC
+#define XML_STATIC
+#endif
+#endif	//	LL_WINDOWS
+
+
+// Deal with VC6 problems
+#if LL_MSVC
+#pragma warning( 3	     : 4701 )	// "local variable used without being initialized"  Treat this as level 3, not level 4.
+#pragma warning( 3	     : 4702 )	// "unreachable code"  Treat this as level 3, not level 4.
+#pragma warning( 3	     : 4189 )	// "local variable initialized but not referenced"  Treat this as level 3, not level 4.
+//#pragma warning( 3	: 4018 )	// "signed/unsigned mismatch"  Treat this as level 3, not level 4.
+#pragma warning( 3      :  4263 )	// 'function' : member function does not override any base class virtual member function
+#pragma warning( 3      :  4264 )	// "'virtual_function' : no override available for virtual member function from base 'class'; function is hidden"
+#pragma warning( 3       : 4265 )	// "class has virtual functions, but destructor is not virtual"
+#pragma warning( 3      :  4266 )	// 'function' : no override available for virtual member function from base 'type'; function is hidden
+#pragma warning (disable : 4180)	// qualifier applied to function type has no meaning; ignored
+#pragma warning( disable : 4284 )	// silly MS warning deep inside their <map> include file
+#pragma warning( disable : 4503 )	// 'decorated name length exceeded, name was truncated'. Does not seem to affect compilation.
+#pragma warning( disable : 4800 )	// 'BOOL' : forcing value to bool 'true' or 'false' (performance warning)
+#pragma warning( disable : 4996 )	// warning: deprecated
+
+// level 4 warnings that we need to disable:
+#pragma warning (disable : 4100) // unreferenced formal parameter
+#pragma warning (disable : 4127) // conditional expression is constant (e.g. while(1) )
+#pragma warning (disable : 4244) // possible loss of data on conversions
+#pragma warning (disable : 4396) // the inline specifier cannot be used when a friend declaration refers to a specialization of a function template
+#pragma warning (disable : 4512) // assignment operator could not be generated
+#pragma warning (disable : 4706) // assignment within conditional (even if((x = y)) )
+
+#pragma warning (disable : 4251) // member needs to have dll-interface to be used by clients of class
+#pragma warning (disable : 4275) // non dll-interface class used as base for dll-interface class
+#endif	//	LL_MSVC
+
+#if LL_WINDOWS
+#define LL_DLLEXPORT __declspec(dllexport)
+#define LL_DLLIMPORT __declspec(dllimport)
+#elif LL_LINUX
+#define LL_DLLEXPORT __attribute__ ((visibility("default")))
+#define LL_DLLIMPORT
+#else
+#define LL_DLLEXPORT
+#define LL_DLLIMPORT
+#endif // LL_WINDOWS
+
+#if LL_COMMON_LINK_SHARED
+// CMake automagically defines llcommon_EXPORTS only when building llcommon
+// sources, and only when llcommon is a shared library (i.e. when
+// LL_COMMON_LINK_SHARED). We must still test LL_COMMON_LINK_SHARED because
+// otherwise we can't distinguish between (non-llcommon source) and (llcommon
+// not shared).
+# if defined(llcommon_EXPORTS)
+#   define LL_COMMON_API LL_DLLEXPORT
+# else //llcommon_EXPORTS
+#   define LL_COMMON_API LL_DLLIMPORT
+# endif //llcommon_EXPORTS
+#else // LL_COMMON_LINK_SHARED
+# define LL_COMMON_API
+#endif // LL_COMMON_LINK_SHARED
+
+#endif	//	not LL_LINDEN_PREPROCESSOR_H
diff --git a/indra/llcommon/llstacktrace.cpp b/indra/llcommon/llstacktrace.cpp
index 3cb074257bc..6558df70a42 100644
--- a/indra/llcommon/llstacktrace.cpp
+++ b/indra/llcommon/llstacktrace.cpp
@@ -1,142 +1,142 @@
-/** 
- * @file llstacktrace.cpp
- * @brief stack tracing functionality
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- * 
- * Copyright (c) 2001-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-#include "llstacktrace.h"
-
-#ifdef LL_WINDOWS
-
-#include <iostream>
-#include <sstream>
-
-#include "windows.h"
-#include "Dbghelp.h"
-
-typedef USHORT NTAPI RtlCaptureStackBackTrace_Function(
-    IN ULONG frames_to_skip,
-    IN ULONG frames_to_capture,
-    OUT PVOID *backtrace,
-    OUT PULONG backtrace_hash);
-
-static RtlCaptureStackBackTrace_Function* const RtlCaptureStackBackTrace_fn =
-   (RtlCaptureStackBackTrace_Function*)
-   GetProcAddress(GetModuleHandleA("ntdll.dll"), "RtlCaptureStackBackTrace");
-
-bool ll_get_stack_trace(std::vector<std::string>& lines)
-{
-	const S32 MAX_STACK_DEPTH = 32;
-	const S32 STRING_NAME_LENGTH = 200;
-	const S32 FRAME_SKIP = 2;
-	static BOOL symbolsLoaded = false;
-	static BOOL firstCall = true;
-
-	HANDLE hProc = GetCurrentProcess();
-
-	// load the symbols if they're not loaded
-	if(!symbolsLoaded && firstCall)
-	{
-		symbolsLoaded = SymInitialize(hProc, NULL, true);
-		firstCall = false;
-	}
-
-	// if loaded, get the call stack
-	if(symbolsLoaded)
-	{
-		// create the frames to hold the addresses
-		void* frames[MAX_STACK_DEPTH];
-		memset(frames, 0, sizeof(void*)*MAX_STACK_DEPTH);
-		S32 depth = 0;
-
-		// get the addresses
-		depth = RtlCaptureStackBackTrace_fn(FRAME_SKIP, MAX_STACK_DEPTH, frames, NULL);
-
-		IMAGEHLP_LINE64 line;
-		memset(&line, 0, sizeof(IMAGEHLP_LINE64));
-		line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
-
-		// create something to hold address info
-		PIMAGEHLP_SYMBOL64 pSym;
-		pSym = (PIMAGEHLP_SYMBOL64)malloc(sizeof(IMAGEHLP_SYMBOL64) + STRING_NAME_LENGTH);
-		memset(pSym, 0, sizeof(IMAGEHLP_SYMBOL64) + STRING_NAME_LENGTH);
-		pSym->MaxNameLength = STRING_NAME_LENGTH;
-		pSym->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64);
-
-		// get address info for each address frame
-		// and store
-		for(S32 i=0; i < depth; i++)
-		{
-			std::stringstream stack_line;
-			BOOL ret;
-
-			DWORD64 addr = (DWORD64)frames[i];
-			ret = SymGetSymFromAddr64(hProc, addr, 0, pSym);
-			if(ret)
-			{
-				stack_line << pSym->Name << " ";
-			}
-
-			DWORD dummy;
-			ret = SymGetLineFromAddr64(hProc, addr, &dummy, &line);
-			if(ret)
-			{
-				std::string file_name = line.FileName;
-				std::string::size_type index = file_name.rfind("\\");
-				stack_line << file_name.substr(index + 1, file_name.size()) << ":" << line.LineNumber; 
-			}
-
-			lines.push_back(stack_line.str());
-		}
-		
-		free(pSym);
-
-		// TODO: figure out a way to cleanup symbol loading
-		// Not hugely necessary, however.
-		//SymCleanup(hProc);
-		return true;
-	}
-	else
-	{
-		lines.push_back("Stack Trace Failed.  PDB symbol info not loaded");
-	}
-
-	return false;
-}
-
-#else
-
-bool ll_get_stack_trace(std::vector<std::string>& lines)
-{
-	return false;
-}
-
-#endif
-
+/** 
+ * @file llstacktrace.cpp
+ * @brief stack tracing functionality
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "llstacktrace.h"
+
+#ifdef LL_WINDOWS
+
+#include <iostream>
+#include <sstream>
+
+#include "windows.h"
+#include "Dbghelp.h"
+
+typedef USHORT NTAPI RtlCaptureStackBackTrace_Function(
+    IN ULONG frames_to_skip,
+    IN ULONG frames_to_capture,
+    OUT PVOID *backtrace,
+    OUT PULONG backtrace_hash);
+
+static RtlCaptureStackBackTrace_Function* const RtlCaptureStackBackTrace_fn =
+   (RtlCaptureStackBackTrace_Function*)
+   GetProcAddress(GetModuleHandleA("ntdll.dll"), "RtlCaptureStackBackTrace");
+
+bool ll_get_stack_trace(std::vector<std::string>& lines)
+{
+	const S32 MAX_STACK_DEPTH = 32;
+	const S32 STRING_NAME_LENGTH = 200;
+	const S32 FRAME_SKIP = 2;
+	static BOOL symbolsLoaded = false;
+	static BOOL firstCall = true;
+
+	HANDLE hProc = GetCurrentProcess();
+
+	// load the symbols if they're not loaded
+	if(!symbolsLoaded && firstCall)
+	{
+		symbolsLoaded = SymInitialize(hProc, NULL, true);
+		firstCall = false;
+	}
+
+	// if loaded, get the call stack
+	if(symbolsLoaded)
+	{
+		// create the frames to hold the addresses
+		void* frames[MAX_STACK_DEPTH];
+		memset(frames, 0, sizeof(void*)*MAX_STACK_DEPTH);
+		S32 depth = 0;
+
+		// get the addresses
+		depth = RtlCaptureStackBackTrace_fn(FRAME_SKIP, MAX_STACK_DEPTH, frames, NULL);
+
+		IMAGEHLP_LINE64 line;
+		memset(&line, 0, sizeof(IMAGEHLP_LINE64));
+		line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
+
+		// create something to hold address info
+		PIMAGEHLP_SYMBOL64 pSym;
+		pSym = (PIMAGEHLP_SYMBOL64)malloc(sizeof(IMAGEHLP_SYMBOL64) + STRING_NAME_LENGTH);
+		memset(pSym, 0, sizeof(IMAGEHLP_SYMBOL64) + STRING_NAME_LENGTH);
+		pSym->MaxNameLength = STRING_NAME_LENGTH;
+		pSym->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64);
+
+		// get address info for each address frame
+		// and store
+		for(S32 i=0; i < depth; i++)
+		{
+			std::stringstream stack_line;
+			BOOL ret;
+
+			DWORD64 addr = (DWORD64)frames[i];
+			ret = SymGetSymFromAddr64(hProc, addr, 0, pSym);
+			if(ret)
+			{
+				stack_line << pSym->Name << " ";
+			}
+
+			DWORD dummy;
+			ret = SymGetLineFromAddr64(hProc, addr, &dummy, &line);
+			if(ret)
+			{
+				std::string file_name = line.FileName;
+				std::string::size_type index = file_name.rfind("\\");
+				stack_line << file_name.substr(index + 1, file_name.size()) << ":" << line.LineNumber; 
+			}
+
+			lines.push_back(stack_line.str());
+		}
+		
+		free(pSym);
+
+		// TODO: figure out a way to cleanup symbol loading
+		// Not hugely necessary, however.
+		//SymCleanup(hProc);
+		return true;
+	}
+	else
+	{
+		lines.push_back("Stack Trace Failed.  PDB symbol info not loaded");
+	}
+
+	return false;
+}
+
+#else
+
+bool ll_get_stack_trace(std::vector<std::string>& lines)
+{
+	return false;
+}
+
+#endif
+
diff --git a/indra/llcommon/llstacktrace.h b/indra/llcommon/llstacktrace.h
index b84b1aa6ade..9f857f0fd3f 100644
--- a/indra/llcommon/llstacktrace.h
+++ b/indra/llcommon/llstacktrace.h
@@ -1,44 +1,44 @@
-/** 
- * @file llstacktrace.h
- * @brief stack trace functions
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- * 
- * Copyright (c) 2001-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-
-#ifndef LL_LLSTACKTRACE_H
-#define LL_LLSTACKTRACE_H
-
-#include "stdtypes.h"
-#include <vector>
-#include <string>
-
-LL_COMMON_API bool ll_get_stack_trace(std::vector<std::string>& lines);
-
-#endif
-
+/** 
+ * @file llstacktrace.h
+ * @brief stack trace functions
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#ifndef LL_LLSTACKTRACE_H
+#define LL_LLSTACKTRACE_H
+
+#include "stdtypes.h"
+#include <vector>
+#include <string>
+
+LL_COMMON_API bool ll_get_stack_trace(std::vector<std::string>& lines);
+
+#endif
+
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index edbb007f61c..31e70e0fe4d 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -1,1300 +1,1300 @@
-/** 
- * @file llstring.h
- * @brief String utility functions and std::string class.
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- * 
- * Copyright (c) 2001-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLSTRING_H
-#define LL_LLSTRING_H
-
-#include <string>
-#include <cstdio>
-#include <locale>
-#include <iomanip>
-#include "llsd.h"
-#include "llfasttimer.h"
-
-#if LL_LINUX || LL_SOLARIS
-#include <wctype.h>
-#include <wchar.h>
-#endif
-
-#include <string.h>
-
-#if LL_SOLARIS
-// stricmp and strnicmp do not exist on Solaris:
-#define stricmp strcasecmp
-#define strnicmp strncasecmp
-#endif
-
-const char LL_UNKNOWN_CHAR = '?';
-
-#if LL_DARWIN || LL_LINUX || LL_SOLARIS
-// Template specialization of char_traits for U16s. Only necessary on Mac and Linux (exists on Windows already)
-#include <cstring>
-
-namespace std
-{
-template<>
-struct char_traits<U16>
-{
-	typedef U16 		char_type;
-	typedef int 	    int_type;
-	typedef streampos 	pos_type;
-	typedef streamoff 	off_type;
-	typedef mbstate_t 	state_type;
-	
-	static void 
-		assign(char_type& __c1, const char_type& __c2)
-	{ __c1 = __c2; }
-	
-	static bool 
-		eq(const char_type& __c1, const char_type& __c2)
-	{ return __c1 == __c2; }
-	
-	static bool 
-		lt(const char_type& __c1, const char_type& __c2)
-	{ return __c1 < __c2; }
-	
-	static int 
-		compare(const char_type* __s1, const char_type* __s2, size_t __n)
-	{ return memcmp(__s1, __s2, __n * sizeof(char_type)); }
-	
-	static size_t
-		length(const char_type* __s)
-	{
-		const char_type *cur_char = __s;
-		while (*cur_char != 0)
-		{
-			++cur_char;
-		}
-		return cur_char - __s;
-	}
-	
-	static const char_type* 
-		find(const char_type* __s, size_t __n, const char_type& __a)
-	{ return static_cast<const char_type*>(memchr(__s, __a, __n * sizeof(char_type))); }
-	
-	static char_type* 
-		move(char_type* __s1, const char_type* __s2, size_t __n)
-	{ return static_cast<char_type*>(memmove(__s1, __s2, __n * sizeof(char_type))); }
-	
-	static char_type* 
-		copy(char_type* __s1, const char_type* __s2, size_t __n)
-	{  return static_cast<char_type*>(memcpy(__s1, __s2, __n * sizeof(char_type))); }	/* Flawfinder: ignore */
-	
-	static char_type* 
-		assign(char_type* __s, size_t __n, char_type __a)
-	{ 
-		// This isn't right.
-		//return static_cast<char_type*>(memset(__s, __a, __n * sizeof(char_type))); 
-		
-		// I don't think there's a standard 'memset' for 16-bit values.
-		// Do this the old-fashioned way.
-		
-		size_t __i;
-		for(__i = 0; __i < __n; __i++)
-		{
-			__s[__i] = __a;
-		}
-		return __s; 
-	}
-	
-	static char_type 
-		to_char_type(const int_type& __c)
-	{ return static_cast<char_type>(__c); }
-	
-	static int_type 
-		to_int_type(const char_type& __c)
-	{ return static_cast<int_type>(__c); }
-	
-	static bool 
-		eq_int_type(const int_type& __c1, const int_type& __c2)
-	{ return __c1 == __c2; }
-	
-	static int_type 
-		eof() { return static_cast<int_type>(EOF); }
-	
-	static int_type 
-		not_eof(const int_type& __c)
-      { return (__c == eof()) ? 0 : __c; }
-  };
-};
-#endif
-
-class LL_COMMON_API LLStringOps
-{
-private:
-	static long sPacificTimeOffset;
-	static long sLocalTimeOffset;
-	static bool sPacificDaylightTime;
-	static std::map<std::string, std::string> datetimeToCodes;
-
-public:
-	static char toUpper(char elem) { return toupper((unsigned char)elem); }
-	static llwchar toUpper(llwchar elem) { return towupper(elem); }
-	
-	static char toLower(char elem) { return tolower((unsigned char)elem); }
-	static llwchar toLower(llwchar elem) { return towlower(elem); }
-
-	static bool isSpace(char elem) { return isspace((unsigned char)elem) != 0; }
-	static bool isSpace(llwchar elem) { return iswspace(elem) != 0; }
-
-	static bool isUpper(char elem) { return isupper((unsigned char)elem) != 0; }
-	static bool isUpper(llwchar elem) { return iswupper(elem) != 0; }
-
-	static bool isLower(char elem) { return islower((unsigned char)elem) != 0; }
-	static bool isLower(llwchar elem) { return iswlower(elem) != 0; }
-
-	static bool isDigit(char a) { return isdigit((unsigned char)a) != 0; }
-	static bool isDigit(llwchar a) { return iswdigit(a) != 0; }
-
-	static bool isPunct(char a) { return ispunct((unsigned char)a) != 0; }
-	static bool isPunct(llwchar a) { return iswpunct(a) != 0; }
-
-	static bool isAlnum(char a) { return isalnum((unsigned char)a) != 0; }
-	static bool isAlnum(llwchar a) { return iswalnum(a) != 0; }
-
-	static S32	collate(const char* a, const char* b) { return strcoll(a, b); }
-	static S32	collate(const llwchar* a, const llwchar* b);
-
-	static void setupDatetimeInfo(bool pacific_daylight_time);
-	static long getPacificTimeOffset(void) { return sPacificTimeOffset;}
-	static long getLocalTimeOffset(void) { return sLocalTimeOffset;}
-	// Is the Pacific time zone (aka server time zone)
-	// currently in daylight savings time?
-	static bool getPacificDaylightTime(void) { return sPacificDaylightTime;}
-
-	static std::string getDatetimeCode (std::string key);
-};
-
-/**
- * @brief Return a string constructed from in without crashing if the
- * pointer is NULL.
- */
-LL_COMMON_API std::string ll_safe_string(const char* in);
-LL_COMMON_API std::string ll_safe_string(const char* in, S32 maxlen);
-
-
-// Allowing assignments from non-strings into format_map_t is apparently
-// *really* error-prone, so subclass std::string with just basic c'tors.
-class LLFormatMapString
-{
-public:
-	LLFormatMapString() {};
-	LLFormatMapString(const char* s) : mString(ll_safe_string(s)) {};
-	LLFormatMapString(const std::string& s) : mString(s) {};
-	operator std::string() const { return mString; }
-	bool operator<(const LLFormatMapString& rhs) const { return mString < rhs.mString; }
-	std::size_t length() const { return mString.length(); }
-	
-private:
-	std::string mString;
-};
-
-template <class T>
-class LLStringUtilBase
-{
-private:
-	static std::string sLocale;
-
-public:
-	typedef typename std::basic_string<T>::size_type size_type;
-	
-public:
-	/////////////////////////////////////////////////////////////////////////////////////////
-	// Static Utility functions that operate on std::strings
-
-	static std::basic_string<T> null;
-	
-	typedef std::map<LLFormatMapString, LLFormatMapString> format_map_t;
-	LL_COMMON_API static void getTokens(const std::basic_string<T>& instr, std::vector<std::basic_string<T> >& tokens, const std::basic_string<T>& delims);
-	LL_COMMON_API static void formatNumber(std::basic_string<T>& numStr, std::basic_string<T> decimals);
-	LL_COMMON_API static bool formatDatetime(std::basic_string<T>& replacement, std::basic_string<T> token, std::basic_string<T> param, S32 secFromEpoch);
-	LL_COMMON_API static S32 format(std::basic_string<T>& s, const format_map_t& substitutions);
-	LL_COMMON_API static S32 format(std::basic_string<T>& s, const LLSD& substitutions);
-	LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const format_map_t& substitutions);
-	LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const LLSD& substitutions);
-	static void setLocale (std::string inLocale) {sLocale = inLocale;};
-	static std::string getLocale (void) {return sLocale;};
-	
-	static bool isValidIndex(const std::basic_string<T>& string, size_type i)
-	{
-		return !string.empty() && (0 <= i) && (i <= string.size());
-	}
-
-	static void	trimHead(std::basic_string<T>& string);
-	static void	trimTail(std::basic_string<T>& string);
-	static void	trim(std::basic_string<T>& string)	{ trimHead(string); trimTail(string); }
-	static void truncate(std::basic_string<T>& string, size_type count);
-
-	static void	toUpper(std::basic_string<T>& string);
-	static void	toLower(std::basic_string<T>& string);
-	
-	// True if this is the head of s.
-	static BOOL	isHead( const std::basic_string<T>& string, const T* s ); 
-
-	/**
-	 * @brief Returns true if string starts with substr
-	 *
-	 * If etither string or substr are empty, this method returns false.
-	 */
-	static bool startsWith(
-		const std::basic_string<T>& string,
-		const std::basic_string<T>& substr);
-
-	/**
-	 * @brief Returns true if string ends in substr
-	 *
-	 * If etither string or substr are empty, this method returns false.
-	 */
-	static bool endsWith(
-		const std::basic_string<T>& string,
-		const std::basic_string<T>& substr);
-
-	static void	addCRLF(std::basic_string<T>& string);
-	static void	removeCRLF(std::basic_string<T>& string);
-
-	static void	replaceTabsWithSpaces( std::basic_string<T>& string, size_type spaces_per_tab );
-	static void	replaceNonstandardASCII( std::basic_string<T>& string, T replacement );
-	static void	replaceChar( std::basic_string<T>& string, T target, T replacement );
-	static void replaceString( std::basic_string<T>& string, std::basic_string<T> target, std::basic_string<T> replacement );
-	
-	static BOOL	containsNonprintable(const std::basic_string<T>& string);
-	static void	stripNonprintable(std::basic_string<T>& string);
-
-	/**
-	 * @brief Unsafe way to make ascii characters. You should probably
-	 * only call this when interacting with the host operating system.
-	 * The 1 byte std::string does not work correctly.
-	 * The 2 and 4 byte std::string probably work, so LLWStringUtil::_makeASCII
-	 * should work.
-	 */
-	static void _makeASCII(std::basic_string<T>& string);
-
-	// Conversion to other data types
-	static BOOL	convertToBOOL(const std::basic_string<T>& string, BOOL& value);
-	static BOOL	convertToU8(const std::basic_string<T>& string, U8& value);
-	static BOOL	convertToS8(const std::basic_string<T>& string, S8& value);
-	static BOOL	convertToS16(const std::basic_string<T>& string, S16& value);
-	static BOOL	convertToU16(const std::basic_string<T>& string, U16& value);
-	static BOOL	convertToU32(const std::basic_string<T>& string, U32& value);
-	static BOOL	convertToS32(const std::basic_string<T>& string, S32& value);
-	static BOOL	convertToF32(const std::basic_string<T>& string, F32& value);
-	static BOOL	convertToF64(const std::basic_string<T>& string, F64& value);
-
-	/////////////////////////////////////////////////////////////////////////////////////////
-	// Utility functions for working with char*'s and strings
-
-	// Like strcmp but also handles empty strings. Uses
-	// current locale.
-	static S32		compareStrings(const T* lhs, const T* rhs);
-	static S32		compareStrings(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs);
-	
-	// case insensitive version of above. Uses current locale on
-	// Win32, and falls back to a non-locale aware comparison on
-	// Linux.
-	static S32		compareInsensitive(const T* lhs, const T* rhs);
-	static S32		compareInsensitive(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs);
-
-	// Case sensitive comparison with good handling of numbers.  Does not use current locale.
-	// a.k.a. strdictcmp()
-	static S32		compareDict(const std::basic_string<T>& a, const std::basic_string<T>& b);
-
-	// Case *in*sensitive comparison with good handling of numbers.  Does not use current locale.
-	// a.k.a. strdictcmp()
-	static S32		compareDictInsensitive(const std::basic_string<T>& a, const std::basic_string<T>& b);
-
-	// Puts compareDict() in a form appropriate for LL container classes to use for sorting.
-	static BOOL		precedesDict( const std::basic_string<T>& a, const std::basic_string<T>& b );
-
-	// A replacement for strncpy.
-	// If the dst buffer is dst_size bytes long or more, ensures that dst is null terminated and holds
-	// up to dst_size-1 characters of src.
-	static void		copy(T* dst, const T* src, size_type dst_size);
-	
-	// Copies src into dst at a given offset.  
-	static void		copyInto(std::basic_string<T>& dst, const std::basic_string<T>& src, size_type offset);
-	
-	static bool		isPartOfWord(T c) { return (c == (T)'_') || LLStringOps::isAlnum(c); }
-
-
-#ifdef _DEBUG	
-	LL_COMMON_API static void		testHarness();
-#endif
-
-private:
-	LL_COMMON_API static size_type getSubstitution(const std::basic_string<T>& instr, size_type& start, std::vector<std::basic_string<T> >& tokens);
-};
-
-template<class T> std::basic_string<T> LLStringUtilBase<T>::null;
-template<class T> std::string LLStringUtilBase<T>::sLocale;
-
-typedef LLStringUtilBase<char> LLStringUtil;
-typedef LLStringUtilBase<llwchar> LLWStringUtil;
-typedef std::basic_string<llwchar> LLWString;
-
-//@ Use this where we want to disallow input in the form of "foo"
-//  This is used to catch places where english text is embedded in the code
-//  instead of in a translatable XUI file.
-class LLStringExplicit : public std::string
-{
-public:
-	explicit LLStringExplicit(const char* s) : std::string(s) {}
-	LLStringExplicit(const std::string& s) : std::string(s) {}
-	LLStringExplicit(const std::string& s, size_type pos, size_type n = std::string::npos) : std::string(s, pos, n) {}
-};
-
-struct LLDictionaryLess
-{
-public:
-	bool operator()(const std::string& a, const std::string& b)
-	{
-		return (LLStringUtil::precedesDict(a, b) ? true : false);
-	}
-};
-
-
-/**
- * Simple support functions
- */
-
-/**
- * @brief chop off the trailing characters in a string.
- *
- * This function works on bytes rather than glyphs, so this will
- * incorrectly truncate non-single byte strings.
- * Use utf8str_truncate() for utf8 strings
- * @return a copy of in string minus the trailing count bytes.
- */
-inline std::string chop_tail_copy(
-	const std::string& in,
-	std::string::size_type count)
-{
-	return std::string(in, 0, in.length() - count);
-}
-
-/**
- * @brief This translates a nybble stored as a hex value from 0-f back
- * to a nybble in the low order bits of the return byte.
- */
-LL_COMMON_API U8 hex_as_nybble(char hex);
-
-/**
- * @brief read the contents of a file into a string.
- *
- * Since this function has no concept of character encoding, most
- * anything you do with this method ill-advised. Please avoid.
- * @param str [out] The string which will have.
- * @param filename The full name of the file to read.
- * @return Returns true on success. If false, str is unmodified.
- */
-LL_COMMON_API bool _read_file_into_string(std::string& str, const std::string& filename);
-LL_COMMON_API bool iswindividual(llwchar elem);
-
-/**
- * Unicode support
- */
-
-// Make the incoming string a utf8 string. Replaces any unknown glyph
-// with the UNKOWN_CHARACTER. Once any unknown glph is found, the rest
-// of the data may not be recovered.
-LL_COMMON_API std::string rawstr_to_utf8(const std::string& raw);
-
-//
-// We should never use UTF16 except when communicating with Win32!
-//
-typedef std::basic_string<U16> llutf16string;
-
-LL_COMMON_API LLWString utf16str_to_wstring(const llutf16string &utf16str, S32 len);
-LL_COMMON_API LLWString utf16str_to_wstring(const llutf16string &utf16str);
-
-LL_COMMON_API llutf16string wstring_to_utf16str(const LLWString &utf32str, S32 len);
-LL_COMMON_API llutf16string wstring_to_utf16str(const LLWString &utf32str);
-
-LL_COMMON_API llutf16string utf8str_to_utf16str ( const std::string& utf8str, S32 len);
-LL_COMMON_API llutf16string utf8str_to_utf16str ( const std::string& utf8str );
-
-LL_COMMON_API LLWString utf8str_to_wstring(const std::string &utf8str, S32 len);
-LL_COMMON_API LLWString utf8str_to_wstring(const std::string &utf8str);
-// Same function, better name. JC
-inline LLWString utf8string_to_wstring(const std::string& utf8_string) { return utf8str_to_wstring(utf8_string); }
-
-//
-LL_COMMON_API S32 wchar_to_utf8chars(llwchar inchar, char* outchars);
-
-LL_COMMON_API std::string wstring_to_utf8str(const LLWString &utf32str, S32 len);
-LL_COMMON_API std::string wstring_to_utf8str(const LLWString &utf32str);
-
-LL_COMMON_API std::string utf16str_to_utf8str(const llutf16string &utf16str, S32 len);
-LL_COMMON_API std::string utf16str_to_utf8str(const llutf16string &utf16str);
-
-// Length of this UTF32 string in bytes when transformed to UTF8
-LL_COMMON_API S32 wstring_utf8_length(const LLWString& wstr); 
-
-// Length in bytes of this wide char in a UTF8 string
-LL_COMMON_API S32 wchar_utf8_length(const llwchar wc); 
-
-LL_COMMON_API std::string utf8str_tolower(const std::string& utf8str);
-
-// Length in llwchar (UTF-32) of the first len units (16 bits) of the given UTF-16 string.
-LL_COMMON_API S32 utf16str_wstring_length(const llutf16string &utf16str, S32 len);
-
-// Length in utf16string (UTF-16) of wlen wchars beginning at woffset.
-LL_COMMON_API S32 wstring_utf16_length(const LLWString & wstr, S32 woffset, S32 wlen);
-
-// Length in wstring (i.e., llwchar count) of a part of a wstring specified by utf16 length (i.e., utf16 units.)
-LL_COMMON_API S32 wstring_wstring_length_from_utf16_length(const LLWString & wstr, S32 woffset, S32 utf16_length, BOOL *unaligned = NULL);
-
-/**
- * @brief Properly truncate a utf8 string to a maximum byte count.
- * 
- * The returned string may be less than max_len if the truncation
- * happens in the middle of a glyph. If max_len is longer than the
- * string passed in, the return value == utf8str.
- * @param utf8str A valid utf8 string to truncate.
- * @param max_len The maximum number of bytes in the return value.
- * @return Returns a valid utf8 string with byte count <= max_len.
- */
-LL_COMMON_API std::string utf8str_truncate(const std::string& utf8str, const S32 max_len);
-
-LL_COMMON_API std::string utf8str_trim(const std::string& utf8str);
-
-LL_COMMON_API S32 utf8str_compare_insensitive(
-	const std::string& lhs,
-	const std::string& rhs);
-
-/**
- * @brief Replace all occurences of target_char with replace_char
- *
- * @param utf8str A utf8 string to process.
- * @param target_char The wchar to be replaced
- * @param replace_char The wchar which is written on replace
- */
-LL_COMMON_API std::string utf8str_substChar(
-	const std::string& utf8str,
-	const llwchar target_char,
-	const llwchar replace_char);
-
-LL_COMMON_API std::string utf8str_makeASCII(const std::string& utf8str);
-
-// Hack - used for evil notecards.
-LL_COMMON_API std::string mbcsstring_makeASCII(const std::string& str); 
-
-LL_COMMON_API std::string utf8str_removeCRLF(const std::string& utf8str);
-
-
-#if LL_WINDOWS
-/* @name Windows string helpers
- */
-//@{
-
-/**
- * @brief Implementation the expected snprintf interface.
- *
- * If the size of the passed in buffer is not large enough to hold the string,
- * two bad things happen:
- * 1. resulting formatted string is NOT null terminated
- * 2. Depending on the platform, the return value could be a) the required
- *    size of the buffer to copy the entire formatted string or b) -1.
- *    On Windows with VS.Net 2003, it returns -1 e.g. 
- *
- * safe_snprintf always adds a NULL terminator so that the caller does not
- * need to check for return value or need to add the NULL terminator.
- * It does not, however change the return value - to let the caller know
- * that the passed in buffer size was not large enough to hold the
- * formatted string.
- *
- */
-
-// Deal with the differeneces on Windows
-namespace snprintf_hack
-{
-	LL_COMMON_API int snprintf(char *str, size_t size, const char *format, ...);
-}
-
-using snprintf_hack::snprintf;
-
-/**
- * @brief Convert a wide string to std::string
- *
- * This replaces the unsafe W2A macro from ATL.
- */
-LL_COMMON_API std::string ll_convert_wide_to_string(const wchar_t* in);
-
-//@}
-#endif // LL_WINDOWS
-
-/**
- * Many of the 'strip' and 'replace' methods of LLStringUtilBase need
- * specialization to work with the signed char type.
- * Sadly, it is not possible (AFAIK) to specialize a single method of
- * a template class.
- * That stuff should go here.
- */
-namespace LLStringFn
-{
-	/**
-	 * @brief Replace all non-printable characters with replacement in
-	 * string.
-	 * NOTE - this will zap non-ascii
-	 *
-	 * @param [in,out] string the to modify. out value is the string
-	 * with zero non-printable characters.
-	 * @param The replacement character. use LL_UNKNOWN_CHAR if unsure.
-	 */
-	LL_COMMON_API void replace_nonprintable_in_ascii(
-		std::basic_string<char>& string,
-		char replacement);
-
-
-	/**
-	 * @brief Replace all non-printable characters and pipe characters
-	 * with replacement in a string.
-	 * NOTE - this will zap non-ascii
-	 *
-	 * @param [in,out] the string to modify. out value is the string
-	 * with zero non-printable characters and zero pipe characters.
-	 * @param The replacement character. use LL_UNKNOWN_CHAR if unsure.
-	 */
-	LL_COMMON_API void replace_nonprintable_and_pipe_in_ascii(std::basic_string<char>& str,
-									   char replacement);
-
-
-	/**
-	 * @brief Remove all characters that are not allowed in XML 1.0.
-	 * Returns a copy of the string with those characters removed.
-	 * Works with US ASCII and UTF-8 encoded strings.  JC
-	 */
-	LL_COMMON_API std::string strip_invalid_xml(const std::string& input);
-
-
-	/**
-	 * @brief Replace all control characters (0 <= c < 0x20) with replacement in
-	 * string.   This is safe for utf-8
-	 *
-	 * @param [in,out] string the to modify. out value is the string
-	 * with zero non-printable characters.
-	 * @param The replacement character. use LL_UNKNOWN_CHAR if unsure.
-	 */
-	LL_COMMON_API void replace_ascii_controlchars(
-		std::basic_string<char>& string,
-		char replacement);
-}
-
-////////////////////////////////////////////////////////////
-// NOTE: LLStringUtil::format, getTokens, and support functions moved to llstring.cpp.
-// There is no LLWStringUtil::format implementation currently.
-// Calling thse for anything other than LLStringUtil will produce link errors.
-
-////////////////////////////////////////////////////////////
-
-
-// static
-template<class T> 
-S32 LLStringUtilBase<T>::compareStrings(const T* lhs, const T* rhs)
-{	
-	S32 result;
-	if( lhs == rhs )
-	{
-		result = 0;
-	}
-	else
-	if ( !lhs || !lhs[0] )
-	{
-		result = ((!rhs || !rhs[0]) ? 0 : 1);
-	}
-	else
-	if ( !rhs || !rhs[0])
-	{
-		result = -1;
-	}
-	else
-	{
-		result = LLStringOps::collate(lhs, rhs);
-	}
-	return result;
-}
-
-//static 
-template<class T> 
-S32 LLStringUtilBase<T>::compareStrings(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs)
-{
-	return LLStringOps::collate(lhs.c_str(), rhs.c_str());
-}
-
-// static
-template<class T> 
-S32 LLStringUtilBase<T>::compareInsensitive(const T* lhs, const T* rhs )
-{
-	S32 result;
-	if( lhs == rhs )
-	{
-		result = 0;
-	}
-	else
-	if ( !lhs || !lhs[0] )
-	{
-		result = ((!rhs || !rhs[0]) ? 0 : 1);
-	}
-	else
-	if ( !rhs || !rhs[0] )
-	{
-		result = -1;
-	}
-	else
-	{
-		std::basic_string<T> lhs_string(lhs);
-		std::basic_string<T> rhs_string(rhs);
-		LLStringUtilBase<T>::toUpper(lhs_string);
-		LLStringUtilBase<T>::toUpper(rhs_string);
-		result = LLStringOps::collate(lhs_string.c_str(), rhs_string.c_str());
-	}
-	return result;
-}
-
-//static 
-template<class T> 
-S32 LLStringUtilBase<T>::compareInsensitive(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs)
-{
-	std::basic_string<T> lhs_string(lhs);
-	std::basic_string<T> rhs_string(rhs);
-	LLStringUtilBase<T>::toUpper(lhs_string);
-	LLStringUtilBase<T>::toUpper(rhs_string);
-	return LLStringOps::collate(lhs_string.c_str(), rhs_string.c_str());
-}
-
-// Case sensitive comparison with good handling of numbers.  Does not use current locale.
-// a.k.a. strdictcmp()
-
-//static 
-template<class T>
-S32 LLStringUtilBase<T>::compareDict(const std::basic_string<T>& astr, const std::basic_string<T>& bstr)
-{
-	const T* a = astr.c_str();
-	const T* b = bstr.c_str();
-	T ca, cb;
-	S32 ai, bi, cnt = 0;
-	S32 bias = 0;
-
-	ca = *(a++);
-	cb = *(b++);
-	while( ca && cb ){
-		if( bias==0 ){
-			if( LLStringOps::isUpper(ca) ){ ca = LLStringOps::toLower(ca); bias--; }
-			if( LLStringOps::isUpper(cb) ){ cb = LLStringOps::toLower(cb); bias++; }
-		}else{
-			if( LLStringOps::isUpper(ca) ){ ca = LLStringOps::toLower(ca); }
-			if( LLStringOps::isUpper(cb) ){ cb = LLStringOps::toLower(cb); }
-		}
-		if( LLStringOps::isDigit(ca) ){
-			if( cnt-->0 ){
-				if( cb!=ca ) break;
-			}else{
-				if( !LLStringOps::isDigit(cb) ) break;
-				for(ai=0; LLStringOps::isDigit(a[ai]); ai++);
-				for(bi=0; LLStringOps::isDigit(b[bi]); bi++);
-				if( ai<bi ){ ca=0; break; }
-				if( bi<ai ){ cb=0; break; }
-				if( ca!=cb ) break;
-				cnt = ai;
-			}
-		}else if( ca!=cb ){   break;
-		}
-		ca = *(a++);
-		cb = *(b++);
-	}
-	if( ca==cb ) ca += bias;
-	return ca-cb;
-}
-
-// static
-template<class T>
-S32 LLStringUtilBase<T>::compareDictInsensitive(const std::basic_string<T>& astr, const std::basic_string<T>& bstr)
-{
-	const T* a = astr.c_str();
-	const T* b = bstr.c_str();
-	T ca, cb;
-	S32 ai, bi, cnt = 0;
-
-	ca = *(a++);
-	cb = *(b++);
-	while( ca && cb ){
-		if( LLStringOps::isUpper(ca) ){ ca = LLStringOps::toLower(ca); }
-		if( LLStringOps::isUpper(cb) ){ cb = LLStringOps::toLower(cb); }
-		if( LLStringOps::isDigit(ca) ){
-			if( cnt-->0 ){
-				if( cb!=ca ) break;
-			}else{
-				if( !LLStringOps::isDigit(cb) ) break;
-				for(ai=0; LLStringOps::isDigit(a[ai]); ai++);
-				for(bi=0; LLStringOps::isDigit(b[bi]); bi++);
-				if( ai<bi ){ ca=0; break; }
-				if( bi<ai ){ cb=0; break; }
-				if( ca!=cb ) break;
-				cnt = ai;
-			}
-		}else if( ca!=cb ){   break;
-		}
-		ca = *(a++);
-		cb = *(b++);
-	}
-	return ca-cb;
-}
-
-// Puts compareDict() in a form appropriate for LL container classes to use for sorting.
-// static 
-template<class T> 
-BOOL LLStringUtilBase<T>::precedesDict( const std::basic_string<T>& a, const std::basic_string<T>& b )
-{
-	if( a.size() && b.size() )
-	{
-		return (LLStringUtilBase<T>::compareDict(a.c_str(), b.c_str()) < 0);
-	}
-	else
-	{
-		return (!b.empty());
-	}
-}
-
-//static
-template<class T> 
-void LLStringUtilBase<T>::toUpper(std::basic_string<T>& string)	
-{ 
-	if( !string.empty() )
-	{ 
-		std::transform(
-			string.begin(),
-			string.end(),
-			string.begin(),
-			(T(*)(T)) &LLStringOps::toUpper);
-	}
-}
-
-//static
-template<class T> 
-void LLStringUtilBase<T>::toLower(std::basic_string<T>& string)
-{ 
-	if( !string.empty() )
-	{ 
-		std::transform(
-			string.begin(),
-			string.end(),
-			string.begin(),
-			(T(*)(T)) &LLStringOps::toLower);
-	}
-}
-
-//static
-template<class T> 
-void LLStringUtilBase<T>::trimHead(std::basic_string<T>& string)
-{			
-	if( !string.empty() )
-	{
-		size_type i = 0;
-		while( i < string.length() && LLStringOps::isSpace( string[i] ) )
-		{
-			i++;
-		}
-		string.erase(0, i);
-	}
-}
-
-//static
-template<class T> 
-void LLStringUtilBase<T>::trimTail(std::basic_string<T>& string)
-{			
-	if( string.size() )
-	{
-		size_type len = string.length();
-		size_type i = len;
-		while( i > 0 && LLStringOps::isSpace( string[i-1] ) )
-		{
-			i--;
-		}
-
-		string.erase( i, len - i );
-	}
-}
-
-
-// Replace line feeds with carriage return-line feed pairs.
-//static
-template<class T>
-void LLStringUtilBase<T>::addCRLF(std::basic_string<T>& string)
-{
-	const T LF = 10;
-	const T CR = 13;
-
-	// Count the number of line feeds
-	size_type count = 0;
-	size_type len = string.size();
-	size_type i;
-	for( i = 0; i < len; i++ )
-	{
-		if( string[i] == LF )
-		{
-			count++;
-		}
-	}
-
-	// Insert a carriage return before each line feed
-	if( count )
-	{
-		size_type size = len + count;
-		T *t = new T[size];
-		size_type j = 0;
-		for( i = 0; i < len; ++i )
-		{
-			if( string[i] == LF )
-			{
-				t[j] = CR;
-				++j;
-			}
-			t[j] = string[i];
-			++j;
-		}
-
-		string.assign(t, size);
-	}
-}
-
-// Remove all carriage returns
-//static
-template<class T> 
-void LLStringUtilBase<T>::removeCRLF(std::basic_string<T>& string)
-{
-	const T CR = 13;
-
-	size_type cr_count = 0;
-	size_type len = string.size();
-	size_type i;
-	for( i = 0; i < len - cr_count; i++ )
-	{
-		if( string[i+cr_count] == CR )
-		{
-			cr_count++;
-		}
-
-		string[i] = string[i+cr_count];
-	}
-	string.erase(i, cr_count);
-}
-
-//static
-template<class T> 
-void LLStringUtilBase<T>::replaceChar( std::basic_string<T>& string, T target, T replacement )
-{
-	size_type found_pos = 0;
-	while( (found_pos = string.find(target, found_pos)) != std::basic_string<T>::npos ) 
-	{
-		string[found_pos] = replacement;
-		found_pos++; // avoid infinite defeat if target == replacement
-	}
-}
-
-//static
-template<class T> 
-void LLStringUtilBase<T>::replaceString( std::basic_string<T>& string, std::basic_string<T> target, std::basic_string<T> replacement )
-{
-	size_type found_pos = 0;
-	while( (found_pos = string.find(target, found_pos)) != std::basic_string<T>::npos )
-	{
-		string.replace( found_pos, target.length(), replacement );
-		found_pos += replacement.length(); // avoid infinite defeat if replacement contains target
-	}
-}
-
-//static
-template<class T> 
-void LLStringUtilBase<T>::replaceNonstandardASCII( std::basic_string<T>& string, T replacement )
-{
-	const char LF = 10;
-	const S8 MIN = 32;
-//	const S8 MAX = 127;
-
-	size_type len = string.size();
-	for( size_type i = 0; i < len; i++ )
-	{
-		// No need to test MAX < mText[i] because we treat mText[i] as a signed char,
-		// which has a max value of 127.
-		if( ( S8(string[i]) < MIN ) && (string[i] != LF) )
-		{
-			string[i] = replacement;
-		}
-	}
-}
-
-//static
-template<class T> 
-void LLStringUtilBase<T>::replaceTabsWithSpaces( std::basic_string<T>& str, size_type spaces_per_tab )
-{
-	const T TAB = '\t';
-	const T SPACE = ' ';
-
-	std::basic_string<T> out_str;
-	// Replace tabs with spaces
-	for (size_type i = 0; i < str.length(); i++)
-	{
-		if (str[i] == TAB)
-		{
-			for (size_type j = 0; j < spaces_per_tab; j++)
-				out_str += SPACE;
-		}
-		else
-		{
-			out_str += str[i];
-		}
-	}
-	str = out_str;
-}
-
-//static
-template<class T> 
-BOOL LLStringUtilBase<T>::containsNonprintable(const std::basic_string<T>& string)
-{
-	const char MIN = 32;
-	BOOL rv = FALSE;
-	for (size_type i = 0; i < string.size(); i++)
-	{
-		if(string[i] < MIN)
-		{
-			rv = TRUE;
-			break;
-		}
-	}
-	return rv;
-}
-
-//static
-template<class T> 
-void LLStringUtilBase<T>::stripNonprintable(std::basic_string<T>& string)
-{
-	const char MIN = 32;
-	size_type j = 0;
-	if (string.empty())
-	{
-		return;
-	}
-	size_t src_size = string.size();
-	char* c_string = new char[src_size + 1];
-	if(c_string == NULL)
-	{
-		return;
-	}
-	copy(c_string, string.c_str(), src_size+1);
-	char* write_head = &c_string[0];
-	for (size_type i = 0; i < src_size; i++)
-	{
-		char* read_head = &string[i];
-		write_head = &c_string[j];
-		if(!(*read_head < MIN))
-		{
-			*write_head = *read_head;
-			++j;
-		}
-	}
-	c_string[j]= '\0';
-	string = c_string;
-	delete []c_string;
-}
-
-template<class T> 
-void LLStringUtilBase<T>::_makeASCII(std::basic_string<T>& string)
-{
-	// Replace non-ASCII chars with LL_UNKNOWN_CHAR
-	for (size_type i = 0; i < string.length(); i++)
-	{
-		if (string[i] > 0x7f)
-		{
-			string[i] = LL_UNKNOWN_CHAR;
-		}
-	}
-}
-
-// static
-template<class T> 
-void LLStringUtilBase<T>::copy( T* dst, const T* src, size_type dst_size )
-{
-	if( dst_size > 0 )
-	{
-		size_type min_len = 0;
-		if( src )
-		{
-			min_len = llmin( dst_size - 1, strlen( src ) );  /* Flawfinder: ignore */
-			memcpy(dst, src, min_len * sizeof(T));		/* Flawfinder: ignore */
-		}
-		dst[min_len] = '\0';
-	}
-}
-
-// static
-template<class T> 
-void LLStringUtilBase<T>::copyInto(std::basic_string<T>& dst, const std::basic_string<T>& src, size_type offset)
-{
-	if ( offset == dst.length() )
-	{
-		// special case - append to end of string and avoid expensive
-		// (when strings are large) string manipulations
-		dst += src;
-	}
-	else
-	{
-		std::basic_string<T> tail = dst.substr(offset);
-
-		dst = dst.substr(0, offset);
-		dst += src;
-		dst += tail;
-	};
-}
-
-// True if this is the head of s.
-//static
-template<class T> 
-BOOL LLStringUtilBase<T>::isHead( const std::basic_string<T>& string, const T* s ) 
-{ 
-	if( string.empty() )
-	{
-		// Early exit
-		return FALSE;
-	}
-	else
-	{
-		return (strncmp( s, string.c_str(), string.size() ) == 0);
-	}
-}
-
-// static
-template<class T> 
-bool LLStringUtilBase<T>::startsWith(
-	const std::basic_string<T>& string,
-	const std::basic_string<T>& substr)
-{
-	if(string.empty() || (substr.empty())) return false;
-	if(0 == string.find(substr)) return true;
-	return false;
-}
-
-// static
-template<class T> 
-bool LLStringUtilBase<T>::endsWith(
-	const std::basic_string<T>& string,
-	const std::basic_string<T>& substr)
-{
-	if(string.empty() || (substr.empty())) return false;
-	std::string::size_type idx = string.rfind(substr);
-	if(std::string::npos == idx) return false;
-	return (idx == (string.size() - substr.size()));
-}
-
-
-template<class T> 
-BOOL LLStringUtilBase<T>::convertToBOOL(const std::basic_string<T>& string, BOOL& value)
-{
-	if( string.empty() )
-	{
-		return FALSE;
-	}
-
-	std::basic_string<T> temp( string );
-	trim(temp);
-	if( 
-		(temp == "1") || 
-		(temp == "T") || 
-		(temp == "t") || 
-		(temp == "TRUE") || 
-		(temp == "true") || 
-		(temp == "True") )
-	{
-		value = TRUE;
-		return TRUE;
-	}
-	else
-	if( 
-		(temp == "0") || 
-		(temp == "F") || 
-		(temp == "f") || 
-		(temp == "FALSE") || 
-		(temp == "false") || 
-		(temp == "False") )
-	{
-		value = FALSE;
-		return TRUE;
-	}
-
-	return FALSE;
-}
-
-template<class T> 
-BOOL LLStringUtilBase<T>::convertToU8(const std::basic_string<T>& string, U8& value) 
-{
-	S32 value32 = 0;
-	BOOL success = convertToS32(string, value32);
-	if( success && (U8_MIN <= value32) && (value32 <= U8_MAX) )
-	{
-		value = (U8) value32;
-		return TRUE;
-	}
-	return FALSE;
-}
-
-template<class T> 
-BOOL LLStringUtilBase<T>::convertToS8(const std::basic_string<T>& string, S8& value) 
-{
-	S32 value32 = 0;
-	BOOL success = convertToS32(string, value32);
-	if( success && (S8_MIN <= value32) && (value32 <= S8_MAX) )
-	{
-		value = (S8) value32;
-		return TRUE;
-	}
-	return FALSE;
-}
-
-template<class T> 
-BOOL LLStringUtilBase<T>::convertToS16(const std::basic_string<T>& string, S16& value) 
-{
-	S32 value32 = 0;
-	BOOL success = convertToS32(string, value32);
-	if( success && (S16_MIN <= value32) && (value32 <= S16_MAX) )
-	{
-		value = (S16) value32;
-		return TRUE;
-	}
-	return FALSE;
-}
-
-template<class T> 
-BOOL LLStringUtilBase<T>::convertToU16(const std::basic_string<T>& string, U16& value) 
-{
-	S32 value32 = 0;
-	BOOL success = convertToS32(string, value32);
-	if( success && (U16_MIN <= value32) && (value32 <= U16_MAX) )
-	{
-		value = (U16) value32;
-		return TRUE;
-	}
-	return FALSE;
-}
-
-template<class T> 
-BOOL LLStringUtilBase<T>::convertToU32(const std::basic_string<T>& string, U32& value) 
-{
-	if( string.empty() )
-	{
-		return FALSE;
-	}
-
-	std::basic_string<T> temp( string );
-	trim(temp);
-	U32 v;
-	std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
-	if(i_stream >> v)
-	{
-		value = v;
-		return TRUE;
-	}
-	return FALSE;
-}
-
-template<class T> 
-BOOL LLStringUtilBase<T>::convertToS32(const std::basic_string<T>& string, S32& value) 
-{
-	if( string.empty() )
-	{
-		return FALSE;
-	}
-
-	std::basic_string<T> temp( string );
-	trim(temp);
-	S32 v;
-	std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
-	if(i_stream >> v)
-	{
-		//TODO: figure out overflow and underflow reporting here
-		//if((LONG_MAX == v) || (LONG_MIN == v))
-		//{
-		//	// Underflow or overflow
-		//	return FALSE;
-		//}
-
-		value = v;
-		return TRUE;
-	}
-	return FALSE;
-}
-
-template<class T> 
-BOOL LLStringUtilBase<T>::convertToF32(const std::basic_string<T>& string, F32& value) 
-{
-	F64 value64 = 0.0;
-	BOOL success = convertToF64(string, value64);
-	if( success && (-F32_MAX <= value64) && (value64 <= F32_MAX) )
-	{
-		value = (F32) value64;
-		return TRUE;
-	}
-	return FALSE;
-}
-
-template<class T> 
-BOOL LLStringUtilBase<T>::convertToF64(const std::basic_string<T>& string, F64& value)
-{
-	if( string.empty() )
-	{
-		return FALSE;
-	}
-
-	std::basic_string<T> temp( string );
-	trim(temp);
-	F64 v;
-	std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
-	if(i_stream >> v)
-	{
-		//TODO: figure out overflow and underflow reporting here
-		//if( ((-HUGE_VAL == v) || (HUGE_VAL == v))) )
-		//{
-		//	// Underflow or overflow
-		//	return FALSE;
-		//}
-
-		value = v;
-		return TRUE;
-	}
-	return FALSE;
-}
-
-template<class T> 
-void LLStringUtilBase<T>::truncate(std::basic_string<T>& string, size_type count)
-{
-	size_type cur_size = string.size();
-	string.resize(count < cur_size ? count : cur_size);
-}
-
-#endif  // LL_STRING_H
+/** 
+ * @file llstring.h
+ * @brief String utility functions and std::string class.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLSTRING_H
+#define LL_LLSTRING_H
+
+#include <string>
+#include <cstdio>
+#include <locale>
+#include <iomanip>
+#include "llsd.h"
+#include "llfasttimer.h"
+
+#if LL_LINUX || LL_SOLARIS
+#include <wctype.h>
+#include <wchar.h>
+#endif
+
+#include <string.h>
+
+#if LL_SOLARIS
+// stricmp and strnicmp do not exist on Solaris:
+#define stricmp strcasecmp
+#define strnicmp strncasecmp
+#endif
+
+const char LL_UNKNOWN_CHAR = '?';
+
+#if LL_DARWIN || LL_LINUX || LL_SOLARIS
+// Template specialization of char_traits for U16s. Only necessary on Mac and Linux (exists on Windows already)
+#include <cstring>
+
+namespace std
+{
+template<>
+struct char_traits<U16>
+{
+	typedef U16 		char_type;
+	typedef int 	    int_type;
+	typedef streampos 	pos_type;
+	typedef streamoff 	off_type;
+	typedef mbstate_t 	state_type;
+	
+	static void 
+		assign(char_type& __c1, const char_type& __c2)
+	{ __c1 = __c2; }
+	
+	static bool 
+		eq(const char_type& __c1, const char_type& __c2)
+	{ return __c1 == __c2; }
+	
+	static bool 
+		lt(const char_type& __c1, const char_type& __c2)
+	{ return __c1 < __c2; }
+	
+	static int 
+		compare(const char_type* __s1, const char_type* __s2, size_t __n)
+	{ return memcmp(__s1, __s2, __n * sizeof(char_type)); }
+	
+	static size_t
+		length(const char_type* __s)
+	{
+		const char_type *cur_char = __s;
+		while (*cur_char != 0)
+		{
+			++cur_char;
+		}
+		return cur_char - __s;
+	}
+	
+	static const char_type* 
+		find(const char_type* __s, size_t __n, const char_type& __a)
+	{ return static_cast<const char_type*>(memchr(__s, __a, __n * sizeof(char_type))); }
+	
+	static char_type* 
+		move(char_type* __s1, const char_type* __s2, size_t __n)
+	{ return static_cast<char_type*>(memmove(__s1, __s2, __n * sizeof(char_type))); }
+	
+	static char_type* 
+		copy(char_type* __s1, const char_type* __s2, size_t __n)
+	{  return static_cast<char_type*>(memcpy(__s1, __s2, __n * sizeof(char_type))); }	/* Flawfinder: ignore */
+	
+	static char_type* 
+		assign(char_type* __s, size_t __n, char_type __a)
+	{ 
+		// This isn't right.
+		//return static_cast<char_type*>(memset(__s, __a, __n * sizeof(char_type))); 
+		
+		// I don't think there's a standard 'memset' for 16-bit values.
+		// Do this the old-fashioned way.
+		
+		size_t __i;
+		for(__i = 0; __i < __n; __i++)
+		{
+			__s[__i] = __a;
+		}
+		return __s; 
+	}
+	
+	static char_type 
+		to_char_type(const int_type& __c)
+	{ return static_cast<char_type>(__c); }
+	
+	static int_type 
+		to_int_type(const char_type& __c)
+	{ return static_cast<int_type>(__c); }
+	
+	static bool 
+		eq_int_type(const int_type& __c1, const int_type& __c2)
+	{ return __c1 == __c2; }
+	
+	static int_type 
+		eof() { return static_cast<int_type>(EOF); }
+	
+	static int_type 
+		not_eof(const int_type& __c)
+      { return (__c == eof()) ? 0 : __c; }
+  };
+};
+#endif
+
+class LL_COMMON_API LLStringOps
+{
+private:
+	static long sPacificTimeOffset;
+	static long sLocalTimeOffset;
+	static bool sPacificDaylightTime;
+	static std::map<std::string, std::string> datetimeToCodes;
+
+public:
+	static char toUpper(char elem) { return toupper((unsigned char)elem); }
+	static llwchar toUpper(llwchar elem) { return towupper(elem); }
+	
+	static char toLower(char elem) { return tolower((unsigned char)elem); }
+	static llwchar toLower(llwchar elem) { return towlower(elem); }
+
+	static bool isSpace(char elem) { return isspace((unsigned char)elem) != 0; }
+	static bool isSpace(llwchar elem) { return iswspace(elem) != 0; }
+
+	static bool isUpper(char elem) { return isupper((unsigned char)elem) != 0; }
+	static bool isUpper(llwchar elem) { return iswupper(elem) != 0; }
+
+	static bool isLower(char elem) { return islower((unsigned char)elem) != 0; }
+	static bool isLower(llwchar elem) { return iswlower(elem) != 0; }
+
+	static bool isDigit(char a) { return isdigit((unsigned char)a) != 0; }
+	static bool isDigit(llwchar a) { return iswdigit(a) != 0; }
+
+	static bool isPunct(char a) { return ispunct((unsigned char)a) != 0; }
+	static bool isPunct(llwchar a) { return iswpunct(a) != 0; }
+
+	static bool isAlnum(char a) { return isalnum((unsigned char)a) != 0; }
+	static bool isAlnum(llwchar a) { return iswalnum(a) != 0; }
+
+	static S32	collate(const char* a, const char* b) { return strcoll(a, b); }
+	static S32	collate(const llwchar* a, const llwchar* b);
+
+	static void setupDatetimeInfo(bool pacific_daylight_time);
+	static long getPacificTimeOffset(void) { return sPacificTimeOffset;}
+	static long getLocalTimeOffset(void) { return sLocalTimeOffset;}
+	// Is the Pacific time zone (aka server time zone)
+	// currently in daylight savings time?
+	static bool getPacificDaylightTime(void) { return sPacificDaylightTime;}
+
+	static std::string getDatetimeCode (std::string key);
+};
+
+/**
+ * @brief Return a string constructed from in without crashing if the
+ * pointer is NULL.
+ */
+LL_COMMON_API std::string ll_safe_string(const char* in);
+LL_COMMON_API std::string ll_safe_string(const char* in, S32 maxlen);
+
+
+// Allowing assignments from non-strings into format_map_t is apparently
+// *really* error-prone, so subclass std::string with just basic c'tors.
+class LLFormatMapString
+{
+public:
+	LLFormatMapString() {};
+	LLFormatMapString(const char* s) : mString(ll_safe_string(s)) {};
+	LLFormatMapString(const std::string& s) : mString(s) {};
+	operator std::string() const { return mString; }
+	bool operator<(const LLFormatMapString& rhs) const { return mString < rhs.mString; }
+	std::size_t length() const { return mString.length(); }
+	
+private:
+	std::string mString;
+};
+
+template <class T>
+class LLStringUtilBase
+{
+private:
+	static std::string sLocale;
+
+public:
+	typedef typename std::basic_string<T>::size_type size_type;
+	
+public:
+	/////////////////////////////////////////////////////////////////////////////////////////
+	// Static Utility functions that operate on std::strings
+
+	static std::basic_string<T> null;
+	
+	typedef std::map<LLFormatMapString, LLFormatMapString> format_map_t;
+	LL_COMMON_API static void getTokens(const std::basic_string<T>& instr, std::vector<std::basic_string<T> >& tokens, const std::basic_string<T>& delims);
+	LL_COMMON_API static void formatNumber(std::basic_string<T>& numStr, std::basic_string<T> decimals);
+	LL_COMMON_API static bool formatDatetime(std::basic_string<T>& replacement, std::basic_string<T> token, std::basic_string<T> param, S32 secFromEpoch);
+	LL_COMMON_API static S32 format(std::basic_string<T>& s, const format_map_t& substitutions);
+	LL_COMMON_API static S32 format(std::basic_string<T>& s, const LLSD& substitutions);
+	LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const format_map_t& substitutions);
+	LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const LLSD& substitutions);
+	static void setLocale (std::string inLocale) {sLocale = inLocale;};
+	static std::string getLocale (void) {return sLocale;};
+	
+	static bool isValidIndex(const std::basic_string<T>& string, size_type i)
+	{
+		return !string.empty() && (0 <= i) && (i <= string.size());
+	}
+
+	static void	trimHead(std::basic_string<T>& string);
+	static void	trimTail(std::basic_string<T>& string);
+	static void	trim(std::basic_string<T>& string)	{ trimHead(string); trimTail(string); }
+	static void truncate(std::basic_string<T>& string, size_type count);
+
+	static void	toUpper(std::basic_string<T>& string);
+	static void	toLower(std::basic_string<T>& string);
+	
+	// True if this is the head of s.
+	static BOOL	isHead( const std::basic_string<T>& string, const T* s ); 
+
+	/**
+	 * @brief Returns true if string starts with substr
+	 *
+	 * If etither string or substr are empty, this method returns false.
+	 */
+	static bool startsWith(
+		const std::basic_string<T>& string,
+		const std::basic_string<T>& substr);
+
+	/**
+	 * @brief Returns true if string ends in substr
+	 *
+	 * If etither string or substr are empty, this method returns false.
+	 */
+	static bool endsWith(
+		const std::basic_string<T>& string,
+		const std::basic_string<T>& substr);
+
+	static void	addCRLF(std::basic_string<T>& string);
+	static void	removeCRLF(std::basic_string<T>& string);
+
+	static void	replaceTabsWithSpaces( std::basic_string<T>& string, size_type spaces_per_tab );
+	static void	replaceNonstandardASCII( std::basic_string<T>& string, T replacement );
+	static void	replaceChar( std::basic_string<T>& string, T target, T replacement );
+	static void replaceString( std::basic_string<T>& string, std::basic_string<T> target, std::basic_string<T> replacement );
+	
+	static BOOL	containsNonprintable(const std::basic_string<T>& string);
+	static void	stripNonprintable(std::basic_string<T>& string);
+
+	/**
+	 * @brief Unsafe way to make ascii characters. You should probably
+	 * only call this when interacting with the host operating system.
+	 * The 1 byte std::string does not work correctly.
+	 * The 2 and 4 byte std::string probably work, so LLWStringUtil::_makeASCII
+	 * should work.
+	 */
+	static void _makeASCII(std::basic_string<T>& string);
+
+	// Conversion to other data types
+	static BOOL	convertToBOOL(const std::basic_string<T>& string, BOOL& value);
+	static BOOL	convertToU8(const std::basic_string<T>& string, U8& value);
+	static BOOL	convertToS8(const std::basic_string<T>& string, S8& value);
+	static BOOL	convertToS16(const std::basic_string<T>& string, S16& value);
+	static BOOL	convertToU16(const std::basic_string<T>& string, U16& value);
+	static BOOL	convertToU32(const std::basic_string<T>& string, U32& value);
+	static BOOL	convertToS32(const std::basic_string<T>& string, S32& value);
+	static BOOL	convertToF32(const std::basic_string<T>& string, F32& value);
+	static BOOL	convertToF64(const std::basic_string<T>& string, F64& value);
+
+	/////////////////////////////////////////////////////////////////////////////////////////
+	// Utility functions for working with char*'s and strings
+
+	// Like strcmp but also handles empty strings. Uses
+	// current locale.
+	static S32		compareStrings(const T* lhs, const T* rhs);
+	static S32		compareStrings(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs);
+	
+	// case insensitive version of above. Uses current locale on
+	// Win32, and falls back to a non-locale aware comparison on
+	// Linux.
+	static S32		compareInsensitive(const T* lhs, const T* rhs);
+	static S32		compareInsensitive(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs);
+
+	// Case sensitive comparison with good handling of numbers.  Does not use current locale.
+	// a.k.a. strdictcmp()
+	static S32		compareDict(const std::basic_string<T>& a, const std::basic_string<T>& b);
+
+	// Case *in*sensitive comparison with good handling of numbers.  Does not use current locale.
+	// a.k.a. strdictcmp()
+	static S32		compareDictInsensitive(const std::basic_string<T>& a, const std::basic_string<T>& b);
+
+	// Puts compareDict() in a form appropriate for LL container classes to use for sorting.
+	static BOOL		precedesDict( const std::basic_string<T>& a, const std::basic_string<T>& b );
+
+	// A replacement for strncpy.
+	// If the dst buffer is dst_size bytes long or more, ensures that dst is null terminated and holds
+	// up to dst_size-1 characters of src.
+	static void		copy(T* dst, const T* src, size_type dst_size);
+	
+	// Copies src into dst at a given offset.  
+	static void		copyInto(std::basic_string<T>& dst, const std::basic_string<T>& src, size_type offset);
+	
+	static bool		isPartOfWord(T c) { return (c == (T)'_') || LLStringOps::isAlnum(c); }
+
+
+#ifdef _DEBUG	
+	LL_COMMON_API static void		testHarness();
+#endif
+
+private:
+	LL_COMMON_API static size_type getSubstitution(const std::basic_string<T>& instr, size_type& start, std::vector<std::basic_string<T> >& tokens);
+};
+
+template<class T> std::basic_string<T> LLStringUtilBase<T>::null;
+template<class T> std::string LLStringUtilBase<T>::sLocale;
+
+typedef LLStringUtilBase<char> LLStringUtil;
+typedef LLStringUtilBase<llwchar> LLWStringUtil;
+typedef std::basic_string<llwchar> LLWString;
+
+//@ Use this where we want to disallow input in the form of "foo"
+//  This is used to catch places where english text is embedded in the code
+//  instead of in a translatable XUI file.
+class LLStringExplicit : public std::string
+{
+public:
+	explicit LLStringExplicit(const char* s) : std::string(s) {}
+	LLStringExplicit(const std::string& s) : std::string(s) {}
+	LLStringExplicit(const std::string& s, size_type pos, size_type n = std::string::npos) : std::string(s, pos, n) {}
+};
+
+struct LLDictionaryLess
+{
+public:
+	bool operator()(const std::string& a, const std::string& b)
+	{
+		return (LLStringUtil::precedesDict(a, b) ? true : false);
+	}
+};
+
+
+/**
+ * Simple support functions
+ */
+
+/**
+ * @brief chop off the trailing characters in a string.
+ *
+ * This function works on bytes rather than glyphs, so this will
+ * incorrectly truncate non-single byte strings.
+ * Use utf8str_truncate() for utf8 strings
+ * @return a copy of in string minus the trailing count bytes.
+ */
+inline std::string chop_tail_copy(
+	const std::string& in,
+	std::string::size_type count)
+{
+	return std::string(in, 0, in.length() - count);
+}
+
+/**
+ * @brief This translates a nybble stored as a hex value from 0-f back
+ * to a nybble in the low order bits of the return byte.
+ */
+LL_COMMON_API U8 hex_as_nybble(char hex);
+
+/**
+ * @brief read the contents of a file into a string.
+ *
+ * Since this function has no concept of character encoding, most
+ * anything you do with this method ill-advised. Please avoid.
+ * @param str [out] The string which will have.
+ * @param filename The full name of the file to read.
+ * @return Returns true on success. If false, str is unmodified.
+ */
+LL_COMMON_API bool _read_file_into_string(std::string& str, const std::string& filename);
+LL_COMMON_API bool iswindividual(llwchar elem);
+
+/**
+ * Unicode support
+ */
+
+// Make the incoming string a utf8 string. Replaces any unknown glyph
+// with the UNKOWN_CHARACTER. Once any unknown glph is found, the rest
+// of the data may not be recovered.
+LL_COMMON_API std::string rawstr_to_utf8(const std::string& raw);
+
+//
+// We should never use UTF16 except when communicating with Win32!
+//
+typedef std::basic_string<U16> llutf16string;
+
+LL_COMMON_API LLWString utf16str_to_wstring(const llutf16string &utf16str, S32 len);
+LL_COMMON_API LLWString utf16str_to_wstring(const llutf16string &utf16str);
+
+LL_COMMON_API llutf16string wstring_to_utf16str(const LLWString &utf32str, S32 len);
+LL_COMMON_API llutf16string wstring_to_utf16str(const LLWString &utf32str);
+
+LL_COMMON_API llutf16string utf8str_to_utf16str ( const std::string& utf8str, S32 len);
+LL_COMMON_API llutf16string utf8str_to_utf16str ( const std::string& utf8str );
+
+LL_COMMON_API LLWString utf8str_to_wstring(const std::string &utf8str, S32 len);
+LL_COMMON_API LLWString utf8str_to_wstring(const std::string &utf8str);
+// Same function, better name. JC
+inline LLWString utf8string_to_wstring(const std::string& utf8_string) { return utf8str_to_wstring(utf8_string); }
+
+//
+LL_COMMON_API S32 wchar_to_utf8chars(llwchar inchar, char* outchars);
+
+LL_COMMON_API std::string wstring_to_utf8str(const LLWString &utf32str, S32 len);
+LL_COMMON_API std::string wstring_to_utf8str(const LLWString &utf32str);
+
+LL_COMMON_API std::string utf16str_to_utf8str(const llutf16string &utf16str, S32 len);
+LL_COMMON_API std::string utf16str_to_utf8str(const llutf16string &utf16str);
+
+// Length of this UTF32 string in bytes when transformed to UTF8
+LL_COMMON_API S32 wstring_utf8_length(const LLWString& wstr); 
+
+// Length in bytes of this wide char in a UTF8 string
+LL_COMMON_API S32 wchar_utf8_length(const llwchar wc); 
+
+LL_COMMON_API std::string utf8str_tolower(const std::string& utf8str);
+
+// Length in llwchar (UTF-32) of the first len units (16 bits) of the given UTF-16 string.
+LL_COMMON_API S32 utf16str_wstring_length(const llutf16string &utf16str, S32 len);
+
+// Length in utf16string (UTF-16) of wlen wchars beginning at woffset.
+LL_COMMON_API S32 wstring_utf16_length(const LLWString & wstr, S32 woffset, S32 wlen);
+
+// Length in wstring (i.e., llwchar count) of a part of a wstring specified by utf16 length (i.e., utf16 units.)
+LL_COMMON_API S32 wstring_wstring_length_from_utf16_length(const LLWString & wstr, S32 woffset, S32 utf16_length, BOOL *unaligned = NULL);
+
+/**
+ * @brief Properly truncate a utf8 string to a maximum byte count.
+ * 
+ * The returned string may be less than max_len if the truncation
+ * happens in the middle of a glyph. If max_len is longer than the
+ * string passed in, the return value == utf8str.
+ * @param utf8str A valid utf8 string to truncate.
+ * @param max_len The maximum number of bytes in the return value.
+ * @return Returns a valid utf8 string with byte count <= max_len.
+ */
+LL_COMMON_API std::string utf8str_truncate(const std::string& utf8str, const S32 max_len);
+
+LL_COMMON_API std::string utf8str_trim(const std::string& utf8str);
+
+LL_COMMON_API S32 utf8str_compare_insensitive(
+	const std::string& lhs,
+	const std::string& rhs);
+
+/**
+ * @brief Replace all occurences of target_char with replace_char
+ *
+ * @param utf8str A utf8 string to process.
+ * @param target_char The wchar to be replaced
+ * @param replace_char The wchar which is written on replace
+ */
+LL_COMMON_API std::string utf8str_substChar(
+	const std::string& utf8str,
+	const llwchar target_char,
+	const llwchar replace_char);
+
+LL_COMMON_API std::string utf8str_makeASCII(const std::string& utf8str);
+
+// Hack - used for evil notecards.
+LL_COMMON_API std::string mbcsstring_makeASCII(const std::string& str); 
+
+LL_COMMON_API std::string utf8str_removeCRLF(const std::string& utf8str);
+
+
+#if LL_WINDOWS
+/* @name Windows string helpers
+ */
+//@{
+
+/**
+ * @brief Implementation the expected snprintf interface.
+ *
+ * If the size of the passed in buffer is not large enough to hold the string,
+ * two bad things happen:
+ * 1. resulting formatted string is NOT null terminated
+ * 2. Depending on the platform, the return value could be a) the required
+ *    size of the buffer to copy the entire formatted string or b) -1.
+ *    On Windows with VS.Net 2003, it returns -1 e.g. 
+ *
+ * safe_snprintf always adds a NULL terminator so that the caller does not
+ * need to check for return value or need to add the NULL terminator.
+ * It does not, however change the return value - to let the caller know
+ * that the passed in buffer size was not large enough to hold the
+ * formatted string.
+ *
+ */
+
+// Deal with the differeneces on Windows
+namespace snprintf_hack
+{
+	LL_COMMON_API int snprintf(char *str, size_t size, const char *format, ...);
+}
+
+using snprintf_hack::snprintf;
+
+/**
+ * @brief Convert a wide string to std::string
+ *
+ * This replaces the unsafe W2A macro from ATL.
+ */
+LL_COMMON_API std::string ll_convert_wide_to_string(const wchar_t* in);
+
+//@}
+#endif // LL_WINDOWS
+
+/**
+ * Many of the 'strip' and 'replace' methods of LLStringUtilBase need
+ * specialization to work with the signed char type.
+ * Sadly, it is not possible (AFAIK) to specialize a single method of
+ * a template class.
+ * That stuff should go here.
+ */
+namespace LLStringFn
+{
+	/**
+	 * @brief Replace all non-printable characters with replacement in
+	 * string.
+	 * NOTE - this will zap non-ascii
+	 *
+	 * @param [in,out] string the to modify. out value is the string
+	 * with zero non-printable characters.
+	 * @param The replacement character. use LL_UNKNOWN_CHAR if unsure.
+	 */
+	LL_COMMON_API void replace_nonprintable_in_ascii(
+		std::basic_string<char>& string,
+		char replacement);
+
+
+	/**
+	 * @brief Replace all non-printable characters and pipe characters
+	 * with replacement in a string.
+	 * NOTE - this will zap non-ascii
+	 *
+	 * @param [in,out] the string to modify. out value is the string
+	 * with zero non-printable characters and zero pipe characters.
+	 * @param The replacement character. use LL_UNKNOWN_CHAR if unsure.
+	 */
+	LL_COMMON_API void replace_nonprintable_and_pipe_in_ascii(std::basic_string<char>& str,
+									   char replacement);
+
+
+	/**
+	 * @brief Remove all characters that are not allowed in XML 1.0.
+	 * Returns a copy of the string with those characters removed.
+	 * Works with US ASCII and UTF-8 encoded strings.  JC
+	 */
+	LL_COMMON_API std::string strip_invalid_xml(const std::string& input);
+
+
+	/**
+	 * @brief Replace all control characters (0 <= c < 0x20) with replacement in
+	 * string.   This is safe for utf-8
+	 *
+	 * @param [in,out] string the to modify. out value is the string
+	 * with zero non-printable characters.
+	 * @param The replacement character. use LL_UNKNOWN_CHAR if unsure.
+	 */
+	LL_COMMON_API void replace_ascii_controlchars(
+		std::basic_string<char>& string,
+		char replacement);
+}
+
+////////////////////////////////////////////////////////////
+// NOTE: LLStringUtil::format, getTokens, and support functions moved to llstring.cpp.
+// There is no LLWStringUtil::format implementation currently.
+// Calling thse for anything other than LLStringUtil will produce link errors.
+
+////////////////////////////////////////////////////////////
+
+
+// static
+template<class T> 
+S32 LLStringUtilBase<T>::compareStrings(const T* lhs, const T* rhs)
+{	
+	S32 result;
+	if( lhs == rhs )
+	{
+		result = 0;
+	}
+	else
+	if ( !lhs || !lhs[0] )
+	{
+		result = ((!rhs || !rhs[0]) ? 0 : 1);
+	}
+	else
+	if ( !rhs || !rhs[0])
+	{
+		result = -1;
+	}
+	else
+	{
+		result = LLStringOps::collate(lhs, rhs);
+	}
+	return result;
+}
+
+//static 
+template<class T> 
+S32 LLStringUtilBase<T>::compareStrings(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs)
+{
+	return LLStringOps::collate(lhs.c_str(), rhs.c_str());
+}
+
+// static
+template<class T> 
+S32 LLStringUtilBase<T>::compareInsensitive(const T* lhs, const T* rhs )
+{
+	S32 result;
+	if( lhs == rhs )
+	{
+		result = 0;
+	}
+	else
+	if ( !lhs || !lhs[0] )
+	{
+		result = ((!rhs || !rhs[0]) ? 0 : 1);
+	}
+	else
+	if ( !rhs || !rhs[0] )
+	{
+		result = -1;
+	}
+	else
+	{
+		std::basic_string<T> lhs_string(lhs);
+		std::basic_string<T> rhs_string(rhs);
+		LLStringUtilBase<T>::toUpper(lhs_string);
+		LLStringUtilBase<T>::toUpper(rhs_string);
+		result = LLStringOps::collate(lhs_string.c_str(), rhs_string.c_str());
+	}
+	return result;
+}
+
+//static 
+template<class T> 
+S32 LLStringUtilBase<T>::compareInsensitive(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs)
+{
+	std::basic_string<T> lhs_string(lhs);
+	std::basic_string<T> rhs_string(rhs);
+	LLStringUtilBase<T>::toUpper(lhs_string);
+	LLStringUtilBase<T>::toUpper(rhs_string);
+	return LLStringOps::collate(lhs_string.c_str(), rhs_string.c_str());
+}
+
+// Case sensitive comparison with good handling of numbers.  Does not use current locale.
+// a.k.a. strdictcmp()
+
+//static 
+template<class T>
+S32 LLStringUtilBase<T>::compareDict(const std::basic_string<T>& astr, const std::basic_string<T>& bstr)
+{
+	const T* a = astr.c_str();
+	const T* b = bstr.c_str();
+	T ca, cb;
+	S32 ai, bi, cnt = 0;
+	S32 bias = 0;
+
+	ca = *(a++);
+	cb = *(b++);
+	while( ca && cb ){
+		if( bias==0 ){
+			if( LLStringOps::isUpper(ca) ){ ca = LLStringOps::toLower(ca); bias--; }
+			if( LLStringOps::isUpper(cb) ){ cb = LLStringOps::toLower(cb); bias++; }
+		}else{
+			if( LLStringOps::isUpper(ca) ){ ca = LLStringOps::toLower(ca); }
+			if( LLStringOps::isUpper(cb) ){ cb = LLStringOps::toLower(cb); }
+		}
+		if( LLStringOps::isDigit(ca) ){
+			if( cnt-->0 ){
+				if( cb!=ca ) break;
+			}else{
+				if( !LLStringOps::isDigit(cb) ) break;
+				for(ai=0; LLStringOps::isDigit(a[ai]); ai++);
+				for(bi=0; LLStringOps::isDigit(b[bi]); bi++);
+				if( ai<bi ){ ca=0; break; }
+				if( bi<ai ){ cb=0; break; }
+				if( ca!=cb ) break;
+				cnt = ai;
+			}
+		}else if( ca!=cb ){   break;
+		}
+		ca = *(a++);
+		cb = *(b++);
+	}
+	if( ca==cb ) ca += bias;
+	return ca-cb;
+}
+
+// static
+template<class T>
+S32 LLStringUtilBase<T>::compareDictInsensitive(const std::basic_string<T>& astr, const std::basic_string<T>& bstr)
+{
+	const T* a = astr.c_str();
+	const T* b = bstr.c_str();
+	T ca, cb;
+	S32 ai, bi, cnt = 0;
+
+	ca = *(a++);
+	cb = *(b++);
+	while( ca && cb ){
+		if( LLStringOps::isUpper(ca) ){ ca = LLStringOps::toLower(ca); }
+		if( LLStringOps::isUpper(cb) ){ cb = LLStringOps::toLower(cb); }
+		if( LLStringOps::isDigit(ca) ){
+			if( cnt-->0 ){
+				if( cb!=ca ) break;
+			}else{
+				if( !LLStringOps::isDigit(cb) ) break;
+				for(ai=0; LLStringOps::isDigit(a[ai]); ai++);
+				for(bi=0; LLStringOps::isDigit(b[bi]); bi++);
+				if( ai<bi ){ ca=0; break; }
+				if( bi<ai ){ cb=0; break; }
+				if( ca!=cb ) break;
+				cnt = ai;
+			}
+		}else if( ca!=cb ){   break;
+		}
+		ca = *(a++);
+		cb = *(b++);
+	}
+	return ca-cb;
+}
+
+// Puts compareDict() in a form appropriate for LL container classes to use for sorting.
+// static 
+template<class T> 
+BOOL LLStringUtilBase<T>::precedesDict( const std::basic_string<T>& a, const std::basic_string<T>& b )
+{
+	if( a.size() && b.size() )
+	{
+		return (LLStringUtilBase<T>::compareDict(a.c_str(), b.c_str()) < 0);
+	}
+	else
+	{
+		return (!b.empty());
+	}
+}
+
+//static
+template<class T> 
+void LLStringUtilBase<T>::toUpper(std::basic_string<T>& string)	
+{ 
+	if( !string.empty() )
+	{ 
+		std::transform(
+			string.begin(),
+			string.end(),
+			string.begin(),
+			(T(*)(T)) &LLStringOps::toUpper);
+	}
+}
+
+//static
+template<class T> 
+void LLStringUtilBase<T>::toLower(std::basic_string<T>& string)
+{ 
+	if( !string.empty() )
+	{ 
+		std::transform(
+			string.begin(),
+			string.end(),
+			string.begin(),
+			(T(*)(T)) &LLStringOps::toLower);
+	}
+}
+
+//static
+template<class T> 
+void LLStringUtilBase<T>::trimHead(std::basic_string<T>& string)
+{			
+	if( !string.empty() )
+	{
+		size_type i = 0;
+		while( i < string.length() && LLStringOps::isSpace( string[i] ) )
+		{
+			i++;
+		}
+		string.erase(0, i);
+	}
+}
+
+//static
+template<class T> 
+void LLStringUtilBase<T>::trimTail(std::basic_string<T>& string)
+{			
+	if( string.size() )
+	{
+		size_type len = string.length();
+		size_type i = len;
+		while( i > 0 && LLStringOps::isSpace( string[i-1] ) )
+		{
+			i--;
+		}
+
+		string.erase( i, len - i );
+	}
+}
+
+
+// Replace line feeds with carriage return-line feed pairs.
+//static
+template<class T>
+void LLStringUtilBase<T>::addCRLF(std::basic_string<T>& string)
+{
+	const T LF = 10;
+	const T CR = 13;
+
+	// Count the number of line feeds
+	size_type count = 0;
+	size_type len = string.size();
+	size_type i;
+	for( i = 0; i < len; i++ )
+	{
+		if( string[i] == LF )
+		{
+			count++;
+		}
+	}
+
+	// Insert a carriage return before each line feed
+	if( count )
+	{
+		size_type size = len + count;
+		T *t = new T[size];
+		size_type j = 0;
+		for( i = 0; i < len; ++i )
+		{
+			if( string[i] == LF )
+			{
+				t[j] = CR;
+				++j;
+			}
+			t[j] = string[i];
+			++j;
+		}
+
+		string.assign(t, size);
+	}
+}
+
+// Remove all carriage returns
+//static
+template<class T> 
+void LLStringUtilBase<T>::removeCRLF(std::basic_string<T>& string)
+{
+	const T CR = 13;
+
+	size_type cr_count = 0;
+	size_type len = string.size();
+	size_type i;
+	for( i = 0; i < len - cr_count; i++ )
+	{
+		if( string[i+cr_count] == CR )
+		{
+			cr_count++;
+		}
+
+		string[i] = string[i+cr_count];
+	}
+	string.erase(i, cr_count);
+}
+
+//static
+template<class T> 
+void LLStringUtilBase<T>::replaceChar( std::basic_string<T>& string, T target, T replacement )
+{
+	size_type found_pos = 0;
+	while( (found_pos = string.find(target, found_pos)) != std::basic_string<T>::npos ) 
+	{
+		string[found_pos] = replacement;
+		found_pos++; // avoid infinite defeat if target == replacement
+	}
+}
+
+//static
+template<class T> 
+void LLStringUtilBase<T>::replaceString( std::basic_string<T>& string, std::basic_string<T> target, std::basic_string<T> replacement )
+{
+	size_type found_pos = 0;
+	while( (found_pos = string.find(target, found_pos)) != std::basic_string<T>::npos )
+	{
+		string.replace( found_pos, target.length(), replacement );
+		found_pos += replacement.length(); // avoid infinite defeat if replacement contains target
+	}
+}
+
+//static
+template<class T> 
+void LLStringUtilBase<T>::replaceNonstandardASCII( std::basic_string<T>& string, T replacement )
+{
+	const char LF = 10;
+	const S8 MIN = 32;
+//	const S8 MAX = 127;
+
+	size_type len = string.size();
+	for( size_type i = 0; i < len; i++ )
+	{
+		// No need to test MAX < mText[i] because we treat mText[i] as a signed char,
+		// which has a max value of 127.
+		if( ( S8(string[i]) < MIN ) && (string[i] != LF) )
+		{
+			string[i] = replacement;
+		}
+	}
+}
+
+//static
+template<class T> 
+void LLStringUtilBase<T>::replaceTabsWithSpaces( std::basic_string<T>& str, size_type spaces_per_tab )
+{
+	const T TAB = '\t';
+	const T SPACE = ' ';
+
+	std::basic_string<T> out_str;
+	// Replace tabs with spaces
+	for (size_type i = 0; i < str.length(); i++)
+	{
+		if (str[i] == TAB)
+		{
+			for (size_type j = 0; j < spaces_per_tab; j++)
+				out_str += SPACE;
+		}
+		else
+		{
+			out_str += str[i];
+		}
+	}
+	str = out_str;
+}
+
+//static
+template<class T> 
+BOOL LLStringUtilBase<T>::containsNonprintable(const std::basic_string<T>& string)
+{
+	const char MIN = 32;
+	BOOL rv = FALSE;
+	for (size_type i = 0; i < string.size(); i++)
+	{
+		if(string[i] < MIN)
+		{
+			rv = TRUE;
+			break;
+		}
+	}
+	return rv;
+}
+
+//static
+template<class T> 
+void LLStringUtilBase<T>::stripNonprintable(std::basic_string<T>& string)
+{
+	const char MIN = 32;
+	size_type j = 0;
+	if (string.empty())
+	{
+		return;
+	}
+	size_t src_size = string.size();
+	char* c_string = new char[src_size + 1];
+	if(c_string == NULL)
+	{
+		return;
+	}
+	copy(c_string, string.c_str(), src_size+1);
+	char* write_head = &c_string[0];
+	for (size_type i = 0; i < src_size; i++)
+	{
+		char* read_head = &string[i];
+		write_head = &c_string[j];
+		if(!(*read_head < MIN))
+		{
+			*write_head = *read_head;
+			++j;
+		}
+	}
+	c_string[j]= '\0';
+	string = c_string;
+	delete []c_string;
+}
+
+template<class T> 
+void LLStringUtilBase<T>::_makeASCII(std::basic_string<T>& string)
+{
+	// Replace non-ASCII chars with LL_UNKNOWN_CHAR
+	for (size_type i = 0; i < string.length(); i++)
+	{
+		if (string[i] > 0x7f)
+		{
+			string[i] = LL_UNKNOWN_CHAR;
+		}
+	}
+}
+
+// static
+template<class T> 
+void LLStringUtilBase<T>::copy( T* dst, const T* src, size_type dst_size )
+{
+	if( dst_size > 0 )
+	{
+		size_type min_len = 0;
+		if( src )
+		{
+			min_len = llmin( dst_size - 1, strlen( src ) );  /* Flawfinder: ignore */
+			memcpy(dst, src, min_len * sizeof(T));		/* Flawfinder: ignore */
+		}
+		dst[min_len] = '\0';
+	}
+}
+
+// static
+template<class T> 
+void LLStringUtilBase<T>::copyInto(std::basic_string<T>& dst, const std::basic_string<T>& src, size_type offset)
+{
+	if ( offset == dst.length() )
+	{
+		// special case - append to end of string and avoid expensive
+		// (when strings are large) string manipulations
+		dst += src;
+	}
+	else
+	{
+		std::basic_string<T> tail = dst.substr(offset);
+
+		dst = dst.substr(0, offset);
+		dst += src;
+		dst += tail;
+	};
+}
+
+// True if this is the head of s.
+//static
+template<class T> 
+BOOL LLStringUtilBase<T>::isHead( const std::basic_string<T>& string, const T* s ) 
+{ 
+	if( string.empty() )
+	{
+		// Early exit
+		return FALSE;
+	}
+	else
+	{
+		return (strncmp( s, string.c_str(), string.size() ) == 0);
+	}
+}
+
+// static
+template<class T> 
+bool LLStringUtilBase<T>::startsWith(
+	const std::basic_string<T>& string,
+	const std::basic_string<T>& substr)
+{
+	if(string.empty() || (substr.empty())) return false;
+	if(0 == string.find(substr)) return true;
+	return false;
+}
+
+// static
+template<class T> 
+bool LLStringUtilBase<T>::endsWith(
+	const std::basic_string<T>& string,
+	const std::basic_string<T>& substr)
+{
+	if(string.empty() || (substr.empty())) return false;
+	std::string::size_type idx = string.rfind(substr);
+	if(std::string::npos == idx) return false;
+	return (idx == (string.size() - substr.size()));
+}
+
+
+template<class T> 
+BOOL LLStringUtilBase<T>::convertToBOOL(const std::basic_string<T>& string, BOOL& value)
+{
+	if( string.empty() )
+	{
+		return FALSE;
+	}
+
+	std::basic_string<T> temp( string );
+	trim(temp);
+	if( 
+		(temp == "1") || 
+		(temp == "T") || 
+		(temp == "t") || 
+		(temp == "TRUE") || 
+		(temp == "true") || 
+		(temp == "True") )
+	{
+		value = TRUE;
+		return TRUE;
+	}
+	else
+	if( 
+		(temp == "0") || 
+		(temp == "F") || 
+		(temp == "f") || 
+		(temp == "FALSE") || 
+		(temp == "false") || 
+		(temp == "False") )
+	{
+		value = FALSE;
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+template<class T> 
+BOOL LLStringUtilBase<T>::convertToU8(const std::basic_string<T>& string, U8& value) 
+{
+	S32 value32 = 0;
+	BOOL success = convertToS32(string, value32);
+	if( success && (U8_MIN <= value32) && (value32 <= U8_MAX) )
+	{
+		value = (U8) value32;
+		return TRUE;
+	}
+	return FALSE;
+}
+
+template<class T> 
+BOOL LLStringUtilBase<T>::convertToS8(const std::basic_string<T>& string, S8& value) 
+{
+	S32 value32 = 0;
+	BOOL success = convertToS32(string, value32);
+	if( success && (S8_MIN <= value32) && (value32 <= S8_MAX) )
+	{
+		value = (S8) value32;
+		return TRUE;
+	}
+	return FALSE;
+}
+
+template<class T> 
+BOOL LLStringUtilBase<T>::convertToS16(const std::basic_string<T>& string, S16& value) 
+{
+	S32 value32 = 0;
+	BOOL success = convertToS32(string, value32);
+	if( success && (S16_MIN <= value32) && (value32 <= S16_MAX) )
+	{
+		value = (S16) value32;
+		return TRUE;
+	}
+	return FALSE;
+}
+
+template<class T> 
+BOOL LLStringUtilBase<T>::convertToU16(const std::basic_string<T>& string, U16& value) 
+{
+	S32 value32 = 0;
+	BOOL success = convertToS32(string, value32);
+	if( success && (U16_MIN <= value32) && (value32 <= U16_MAX) )
+	{
+		value = (U16) value32;
+		return TRUE;
+	}
+	return FALSE;
+}
+
+template<class T> 
+BOOL LLStringUtilBase<T>::convertToU32(const std::basic_string<T>& string, U32& value) 
+{
+	if( string.empty() )
+	{
+		return FALSE;
+	}
+
+	std::basic_string<T> temp( string );
+	trim(temp);
+	U32 v;
+	std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
+	if(i_stream >> v)
+	{
+		value = v;
+		return TRUE;
+	}
+	return FALSE;
+}
+
+template<class T> 
+BOOL LLStringUtilBase<T>::convertToS32(const std::basic_string<T>& string, S32& value) 
+{
+	if( string.empty() )
+	{
+		return FALSE;
+	}
+
+	std::basic_string<T> temp( string );
+	trim(temp);
+	S32 v;
+	std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
+	if(i_stream >> v)
+	{
+		//TODO: figure out overflow and underflow reporting here
+		//if((LONG_MAX == v) || (LONG_MIN == v))
+		//{
+		//	// Underflow or overflow
+		//	return FALSE;
+		//}
+
+		value = v;
+		return TRUE;
+	}
+	return FALSE;
+}
+
+template<class T> 
+BOOL LLStringUtilBase<T>::convertToF32(const std::basic_string<T>& string, F32& value) 
+{
+	F64 value64 = 0.0;
+	BOOL success = convertToF64(string, value64);
+	if( success && (-F32_MAX <= value64) && (value64 <= F32_MAX) )
+	{
+		value = (F32) value64;
+		return TRUE;
+	}
+	return FALSE;
+}
+
+template<class T> 
+BOOL LLStringUtilBase<T>::convertToF64(const std::basic_string<T>& string, F64& value)
+{
+	if( string.empty() )
+	{
+		return FALSE;
+	}
+
+	std::basic_string<T> temp( string );
+	trim(temp);
+	F64 v;
+	std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
+	if(i_stream >> v)
+	{
+		//TODO: figure out overflow and underflow reporting here
+		//if( ((-HUGE_VAL == v) || (HUGE_VAL == v))) )
+		//{
+		//	// Underflow or overflow
+		//	return FALSE;
+		//}
+
+		value = v;
+		return TRUE;
+	}
+	return FALSE;
+}
+
+template<class T> 
+void LLStringUtilBase<T>::truncate(std::basic_string<T>& string, size_type count)
+{
+	size_type cur_size = string.size();
+	string.resize(count < cur_size ? count : cur_size);
+}
+
+#endif  // LL_STRING_H
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 44eff8d357c..f5d81748206 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -391,7 +391,7 @@ void LLTabContainer::draw()
 						mNextArrowBtn->setFlashing( TRUE );
 					}
 				}
-			}
+			}
 
 			idx++;
 		}
diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
index 20ba5768dbb..236f79978de 100644
--- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
+++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
@@ -531,13 +531,13 @@ class MediaPluginQuickTime : public MediaPluginBase
 		// this wasn't required in 1.xx viewer but we have to manually 
 		// work the Windows message pump now
 		#if defined( LL_WINDOWS )
-		MSG msg;
-		while ( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) 
-		{
-			GetMessage( &msg, NULL, 0, 0 );
-			TranslateMessage( &msg );
-			DispatchMessage( &msg );
-		};
+		MSG msg;
+		while ( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) 
+		{
+			GetMessage( &msg, NULL, 0, 0 );
+			TranslateMessage( &msg );
+			DispatchMessage( &msg );
+		};
 		#endif
 
 		MCIdle( mMovieController );
diff --git a/indra/newview/app_settings/ignorable_dialogs.xml b/indra/newview/app_settings/ignorable_dialogs.xml
index 669235af1bc..ab18febcccc 100644
--- a/indra/newview/app_settings/ignorable_dialogs.xml
+++ b/indra/newview/app_settings/ignorable_dialogs.xml
@@ -1,291 +1,291 @@
-<?xml version="1.0" ?>
-<llsd>
-<map>
-    <key>FirstAppearance</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstAppearance warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstAttach</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstAttach warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstBalanceDecrease</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstBalanceDecrease warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstBalanceIncrease</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstBalanceIncrease warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstBuild</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstBuild warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstDebugMenus</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstDebugMenus warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstFlexible</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstFlexible warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstGoTo</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstGoTo warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstInventory</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstInventory warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstLeftClickNoHit</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstLeftClickNoHit warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstMap</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstMap warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstMedia</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstMedia warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstOverrideKeys</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstOverrideKeys warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstSandbox</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstSandbox warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstSculptedPrim</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstSculptedPrim warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstSit</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstSit warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstStreamingMusic</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstStreamingMusic warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstStreamingVideo</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstStreamingVideo warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstTeleport</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstTeleport warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstVoice</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstVoice warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>AboutDirectX9</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables AboutDirectX9 warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>BrowserLaunch</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables BrowserLaunch warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>DeedObject</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables DeedObject warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-  <key>NewClassified</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables NewClassified warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>QuickTimeInstalled</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables QuickTimeInstalled warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>ReturnToOwner</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables ReturnToOwner warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-  </map>
-</llsd>
+<?xml version="1.0" ?>
+<llsd>
+<map>
+    <key>FirstAppearance</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstAppearance warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstAttach</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstAttach warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstBalanceDecrease</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstBalanceDecrease warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstBalanceIncrease</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstBalanceIncrease warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstBuild</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstBuild warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstDebugMenus</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstDebugMenus warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstFlexible</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstFlexible warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstGoTo</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstGoTo warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstInventory</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstInventory warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstLeftClickNoHit</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstLeftClickNoHit warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstMap</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstMap warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstMedia</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstMedia warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstOverrideKeys</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstOverrideKeys warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstSandbox</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstSandbox warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstSculptedPrim</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstSculptedPrim warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstSit</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstSit warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstStreamingMusic</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstStreamingMusic warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstStreamingVideo</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstStreamingVideo warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstTeleport</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstTeleport warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstVoice</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstVoice warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>AboutDirectX9</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables AboutDirectX9 warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>BrowserLaunch</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables BrowserLaunch warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>DeedObject</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables DeedObject warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+  <key>NewClassified</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables NewClassified warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>QuickTimeInstalled</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables QuickTimeInstalled warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>ReturnToOwner</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables ReturnToOwner warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+  </map>
+</llsd>
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index ad80e7ed610..54b7c124e0a 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1,2556 +1,2556 @@
-/** 
- * @file LLIMMgr.cpp
- * @brief Container for Instant Messaging
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- * 
- * Copyright (c) 2001-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llimview.h"
-
-#include "llfloaterreg.h"
-#include "llfontgl.h"
-#include "llrect.h"
-#include "llerror.h"
-#include "llbutton.h"
-#include "llhttpclient.h"
-#include "llsdutil_math.h"
-#include "llstring.h"
-#include "lluictrlfactory.h"
-
-#include "llagent.h"
-#include "llavatariconctrl.h"
-#include "llbottomtray.h"
-#include "llcallingcard.h"
-#include "llchat.h"
-#include "llchiclet.h"
-#include "llresmgr.h"
-#include "llfloaterchat.h"
-#include "llfloaterchatterbox.h"
-#include "llavataractions.h"
-#include "llhttpnode.h"
-#include "llimfloater.h"
-#include "llimpanel.h"
-#include "llresizebar.h"
-#include "lltabcontainer.h"
-#include "llviewercontrol.h"
-#include "llfloater.h"
-#include "llmutelist.h"
-#include "llresizehandle.h"
-#include "llkeyboard.h"
-#include "llui.h"
-#include "llviewermenu.h"
-#include "llcallingcard.h"
-#include "lltoolbar.h"
-#include "llviewermessage.h"
-#include "llviewerwindow.h"
-#include "llnotify.h"
-#include "llviewerregion.h"
-#include "llvoicechannel.h"
-#include "lltrans.h"
-#include "llrecentpeople.h"
-#include "llsyswellwindow.h"
-
-#include "llfirstuse.h"
-#include "llagentui.h"
-
-//
-// Globals
-//
-LLIMMgr* gIMMgr = NULL;
-
-//
-// Statics
-//
-// *FIXME: make these all either UIStrings or Strings
-
-const static std::string IM_SEPARATOR(": ");
-
-
-void toast_callback(const LLSD& msg){
-	// do not show toast in busy mode or it goes from agent
-	if (gAgent.getBusy() || gAgent.getID() == msg["from_id"])
-	{
-		return;
-	}
-
-	// check whether incoming IM belongs to an active session or not
-	if (LLIMModel::getInstance()->getActiveSessionID() == msg["session_id"])
-	{
-		return;
-	}
-
-	// Skip toasting for system messages
-	if (msg["from_id"].asUUID() == LLUUID::null)
-	{
-		return;
-	}
-
-	LLSD args;
-	args["MESSAGE"] = msg["message"];
-	args["TIME"] = msg["time"];
-	args["FROM"] = msg["from"];
-	args["FROM_ID"] = msg["from_id"];
-	args["SESSION_ID"] = msg["session_id"];
-
-	LLNotifications::instance().add("IMToast", args, LLSD(), boost::bind(&LLIMFloater::show, msg["session_id"].asUUID()));
-}
-
-void LLIMModel::setActiveSessionID(const LLUUID& session_id)
-{
-	// check if such an ID really exists
-	if (!findIMSession(session_id))
-	{
-		llwarns << "Trying to set as active a non-existent session!" << llendl;
-		return;
-	}
-
-	mActiveSessionID = session_id;
-}
-
-LLIMModel::LLIMModel() 
-{
-	addNewMsgCallback(LLIMFloater::newIMCallback);
-	addNewMsgCallback(toast_callback);
-}
-
-LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
-:	mSessionID(session_id),
-	mName(name),
-	mType(type),
-	mNumUnread(0),
-	mOtherParticipantID(other_participant_id),
-	mInitialTargetIDs(ids),
-	mVoiceChannel(NULL),
-	mSpeakers(NULL),
-	mSessionInitialized(false),
-	mCallBackEnabled(true),
-	mTextIMPossible(true),
-	mOtherParticipantIsAvatar(true)
-{
-	if (IM_NOTHING_SPECIAL == type || IM_SESSION_P2P_INVITE == type)
-	{
-		mVoiceChannel  = new LLVoiceChannelP2P(session_id, name, other_participant_id);
-	}
-	else
-	{
-		mVoiceChannel = new LLVoiceChannelGroup(session_id, name);
-	}
-	mSpeakers = new LLIMSpeakerMgr(mVoiceChannel);
-
-	// All participants will be added to the list of people we've recently interacted with.
-	mSpeakers->addListener(&LLRecentPeople::instance(), "add");
-
-	//we need to wait for session initialization for outgoing ad-hoc and group chat session
-	//correct session id for initiated ad-hoc chat will be received from the server
-	if (!LLIMModel::getInstance()->sendStartSession(mSessionID, mOtherParticipantID, 
-		mInitialTargetIDs, mType))
-	{
-		//we don't need to wait for any responses
-		//so we're already initialized
-		mSessionInitialized = true;
-	}
-
-	if (IM_NOTHING_SPECIAL == type)
-	{
-		mCallBackEnabled = LLVoiceClient::getInstance()->isSessionCallBackPossible(mSessionID);
-		mTextIMPossible = LLVoiceClient::getInstance()->isSessionTextIMPossible(mSessionID);
-		mOtherParticipantIsAvatar = LLVoiceClient::getInstance()->isParticipantAvatar(mSessionID);
-	}
-
-	if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") )
-		LLLogChat::loadHistory(mName, &chatFromLogFile, (void *)this);
-}
-
-LLIMModel::LLIMSession::~LLIMSession()
-{
-	delete mSpeakers;
-	mSpeakers = NULL;
-
-	// End the text IM session if necessary
-	if(gVoiceClient && mOtherParticipantID.notNull())
-	{
-		switch(mType)
-		{
-		case IM_NOTHING_SPECIAL:
-		case IM_SESSION_P2P_INVITE:
-			gVoiceClient->endUserIMSession(mOtherParticipantID);
-			break;
-
-		default:
-			// Appease the linux compiler
-			break;
-		}
-	}
-
-	// HAVE to do this here -- if it happens in the LLVoiceChannel destructor it will call the wrong version (since the object's partially deconstructed at that point).
-	mVoiceChannel->deactivate();
-	
-	delete mVoiceChannel;
-	mVoiceChannel = NULL;
-}
-
-void LLIMModel::LLIMSession::sessionInitReplyReceived(const LLUUID& new_session_id)
-{
-	mSessionInitialized = true;
-
-	if (new_session_id != mSessionID)
-	{
-		mSessionID = new_session_id;
-		mVoiceChannel->updateSessionID(new_session_id);
-	}
-}
-
-void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time)
-{
-	LLSD message;
-	message["from"] = from;
-	message["from_id"] = from_id;
-	message["message"] = utf8_text;
-	message["time"] = time; 
-	message["index"] = (LLSD::Integer)mMsgs.size(); 
-
-	mMsgs.push_front(message); 
-
-	if (mSpeakers && from_id.notNull())
-	{
-		mSpeakers->speakerChatted(from_id);
-		mSpeakers->setSpeakerTyping(from_id, FALSE);
-	}
-}
-
-void LLIMModel::LLIMSession::chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata)
-{
-	if (!userdata) return;
-
-	LLIMSession* self = (LLIMSession*) userdata;
-
-	if (type == LLLogChat::LOG_LINE)
-	{
-		self->addMessage("", LLSD(), msg["message"].asString(), "");
-	}
-	else if (type == LLLogChat::LOG_LLSD)
-	{
-		self->addMessage(msg["from"].asString(), msg["from_id"].asUUID(), msg["message"].asString(), msg["time"].asString());
-	}
-}
-
-LLIMModel::LLIMSession* LLIMModel::findIMSession(const LLUUID& session_id) const
-{
-	return get_if_there(mId2SessionMap, session_id,
-		(LLIMModel::LLIMSession*) NULL);
-}
-
-void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id)
-{
-	LLIMSession* session = findIMSession(old_session_id);
-	if (session)
-	{
-		session->sessionInitReplyReceived(new_session_id);
-
-		if (old_session_id != new_session_id)
-		{
-			mId2SessionMap.erase(old_session_id);
-			mId2SessionMap[new_session_id] = session;
-
-			gIMMgr->notifyObserverSessionIDUpdated(old_session_id, new_session_id);
-		}
-
-		LLIMFloater* im_floater = LLIMFloater::findInstance(old_session_id);
-		if (im_floater)
-		{
-			im_floater->sessionInitReplyReceived(new_session_id);
-		}
-	}
-
-	//*TODO remove this "floater" stuff when Communicate Floater is gone
-	LLFloaterIMPanel* floater = gIMMgr->findFloaterBySession(old_session_id);
-	if (floater)
-	{
-		floater->sessionInitReplyReceived(new_session_id);
-	}
-}
-
-void LLIMModel::testMessages()
-{
-	LLUUID bot1_id("d0426ec6-6535-4c11-a5d9-526bb0c654d9");
-	LLUUID bot1_session_id;
-	std::string from = "IM Tester";
-
-	bot1_session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, bot1_id);
-	newSession(bot1_session_id, from, IM_NOTHING_SPECIAL, bot1_id);
-	addMessage(bot1_session_id, from, bot1_id, "Test Message: Hi from testerbot land!");
-
-	LLUUID bot2_id;
-	std::string firstname[] = {"Roflcopter", "Joe"};
-	std::string lastname[] = {"Linden", "Tester", "Resident", "Schmoe"};
-
-	S32 rand1 = ll_rand(sizeof firstname)/(sizeof firstname[0]);
-	S32 rand2 = ll_rand(sizeof lastname)/(sizeof lastname[0]);
-	
-	from = firstname[rand1] + " " + lastname[rand2];
-	bot2_id.generate(from);
-	LLUUID bot2_session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, bot2_id);
-	newSession(bot2_session_id, from, IM_NOTHING_SPECIAL, bot2_id);
-	addMessage(bot2_session_id, from, bot2_id, "Test Message: Hello there, I have a question. Can I bother you for a second? ");
-	addMessage(bot2_session_id, from, bot2_id, "Test Message: OMGWTFBBQ.");
-}
-
-
-bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, 
-						   const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
-{
-	if (findIMSession(session_id))
-	{
-		llwarns << "IM Session " << session_id << " already exists" << llendl;
-		return false;
-	}
-
-	LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids);
-	mId2SessionMap[session_id] = session;
-
-	LLIMMgr::getInstance()->notifyObserverSessionAdded(session_id, name, other_participant_id);
-
-	return true;
-
-}
-
-bool LLIMModel::clearSession(const LLUUID& session_id)
-{
-	if (mId2SessionMap.find(session_id) == mId2SessionMap.end()) return false;
-	delete (mId2SessionMap[session_id]);
-	mId2SessionMap.erase(session_id);
-	return true;
-}
-
-void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index)
-{
-	LLIMSession* session = findIMSession(session_id);
-	if (!session) 
-	{
-		llwarns << "session " << session_id << "does not exist " << llendl;
-		return;
-	}
-
-	int i = session->mMsgs.size() - start_index;
-
-	for (std::list<LLSD>::iterator iter = session->mMsgs.begin(); 
-		iter != session->mMsgs.end() && i > 0;
-		iter++)
-	{
-		LLSD msg;
-		msg = *iter;
-		messages.push_back(*iter);
-		i--;
-	}
-
-	session->mNumUnread = 0;
-	
-	LLSD arg;
-	arg["session_id"] = session_id;
-	arg["num_unread"] = 0;
-	mNoUnreadMsgsSignal(arg);
-}
-
-bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text) {
-	
-	LLIMSession* session = findIMSession(session_id);
-
-	if (!session) 
-	{
-		llwarns << "session " << session_id << "does not exist " << llendl;
-		return false;
-	}
-
-	session->addMessage(from, from_id, utf8_text, LLLogChat::timestamp(false)); //might want to add date separately
-
-	return true;
-}
-
-bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
-{
-	S32 im_log_option =  gSavedPerAccountSettings.getS32("IMLogOptions");
-	if (im_log_option != LOG_CHAT)
-	{
-		if(im_log_option == LOG_BOTH_TOGETHER)
-		{
-			LLLogChat::saveHistory(std::string("chat"), from, from_id, utf8_text);
-			return true;
-		}
-		else
-		{
-			LLLogChat::saveHistory(LLIMModel::getInstance()->getName(session_id), from, from_id, utf8_text);
-			return true;
-		}
-	}
-	return false;
-}
-
-bool LLIMModel::proccessOnlineOfflineNotification(
-	const LLUUID& session_id, 
-	const std::string& utf8_text)
-{
-	// Add message to old one floater
-	LLFloaterIMPanel *floater = gIMMgr->findFloaterBySession(session_id);
-	if ( floater )
-	{
-		if ( !utf8_text.empty() )
-		{
-			floater->addHistoryLine(utf8_text, LLUIColorTable::instance().getColor("SystemChatColor"));
-		}
-	}
-	// Add system message to history
-	return addMessage(session_id, SYSTEM_FROM, LLUUID::null, utf8_text);
-}
-
-bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, 
-						   const std::string& utf8_text, bool log2file /* = true */) { 
-	LLIMSession* session = findIMSession(session_id);
-
-	if (!session) 
-	{
-		llwarns << "session " << session_id << "does not exist " << llendl;
-		return false;
-	}
-
-	addToHistory(session_id, from, from_id, utf8_text);
-	if (log2file) logToFile(session_id, from, from_id, utf8_text);
-
-	session->mNumUnread++;
-
-	// notify listeners
-	LLSD arg;
-	arg["session_id"] = session_id;
-	arg["num_unread"] = session->mNumUnread;
-	arg["message"] = utf8_text;
-	arg["from"] = from;
-	arg["from_id"] = from_id;
-	arg["time"] = LLLogChat::timestamp(false);
-	mNewMsgSignal(arg);
-
-	return true;
-}
-
-
-const std::string& LLIMModel::getName(const LLUUID& session_id) const
-{
-	LLIMSession* session = findIMSession(session_id);
-
-	if (!session) 
-	{
-		llwarns << "session " << session_id << "does not exist " << llendl;
-		return LLStringUtil::null;
-	}
-
-	return session->mName;
-}
-
-const S32 LLIMModel::getNumUnread(const LLUUID& session_id) const
-{
-	LLIMSession* session = findIMSession(session_id);
-	if (!session)
-	{
-		llwarns << "session " << session_id << "does not exist " << llendl;
-		return -1;
-	}
-
-	return session->mNumUnread;
-}
-
-const LLUUID& LLIMModel::getOtherParticipantID(const LLUUID& session_id) const
-{
-	LLIMSession* session = findIMSession(session_id);
-	if (!session)
-	{
-		llwarns << "session " << session_id << "does not exist " << llendl;
-		return LLUUID::null;
-	}
-
-	return session->mOtherParticipantID;
-}
-
-EInstantMessage LLIMModel::getType(const LLUUID& session_id) const
-{
-	LLIMSession* session = findIMSession(session_id);
-	if (!session)
-	{
-		llwarns << "session " << session_id << "does not exist " << llendl;
-		return IM_COUNT;
-	}
-
-	return session->mType;
-}
-
-LLVoiceChannel* LLIMModel::getVoiceChannel( const LLUUID& session_id ) const
-{
-	LLIMSession* session = findIMSession(session_id);
-	if (!session)
-	{
-		llwarns << "session " << session_id << "does not exist " << llendl;
-		return NULL;
-	}
-
-	return session->mVoiceChannel;
-}
-
-LLIMSpeakerMgr* LLIMModel::getSpeakerManager( const LLUUID& session_id ) const
-{
-	LLIMSession* session = findIMSession(session_id);
-	if (!session)
-	{
-		llwarns << "session " << session_id << "does not exist " << llendl;
-		return NULL;
-	}
-
-	return session->mSpeakers;
-}
-
-
-// TODO get rid of other participant ID
-void LLIMModel::sendTypingState(LLUUID session_id, LLUUID other_participant_id, BOOL typing) 
-{
-	std::string name;
-	LLAgentUI::buildFullname(name);
-
-	pack_instant_message(
-		gMessageSystem,
-		gAgent.getID(),
-		FALSE,
-		gAgent.getSessionID(),
-		other_participant_id,
-		name,
-		std::string("typing"),
-		IM_ONLINE,
-		(typing ? IM_TYPING_START : IM_TYPING_STOP),
-		session_id);
-	gAgent.sendReliableMessage();
-}
-
-void LLIMModel::sendLeaveSession(const LLUUID& session_id, const LLUUID& other_participant_id)
-{
-	if(session_id.notNull())
-	{
-		std::string name;
-		LLAgentUI::buildFullname(name);
-		pack_instant_message(
-			gMessageSystem,
-			gAgent.getID(),
-			FALSE,
-			gAgent.getSessionID(),
-			other_participant_id,
-			name, 
-			LLStringUtil::null,
-			IM_ONLINE,
-			IM_SESSION_LEAVE,
-			session_id);
-		gAgent.sendReliableMessage();
-	}
-}
-
-//*TODO this method is better be moved to the LLIMMgr
-void LLIMModel::sendMessage(const std::string& utf8_text,
-					 const LLUUID& im_session_id,
-					 const LLUUID& other_participant_id,
-					 EInstantMessage dialog)
-{
-	std::string name;
-	bool sent = false;
-	LLAgentUI::buildFullname(name);
-
-	const LLRelationship* info = NULL;
-	info = LLAvatarTracker::instance().getBuddyInfo(other_participant_id);
-	
-	U8 offline = (!info || info->isOnline()) ? IM_ONLINE : IM_OFFLINE;
-	
-	if((offline == IM_OFFLINE) && (LLVoiceClient::getInstance()->isOnlineSIP(other_participant_id)))
-	{
-		// User is online through the OOW connector, but not with a regular viewer.  Try to send the message via SLVoice.
-		sent = gVoiceClient->sendTextMessage(other_participant_id, utf8_text);
-	}
-	
-	if(!sent)
-	{
-		// Send message normally.
-
-		// default to IM_SESSION_SEND unless it's nothing special - in
-		// which case it's probably an IM to everyone.
-		U8 new_dialog = dialog;
-
-		if ( dialog != IM_NOTHING_SPECIAL )
-		{
-			new_dialog = IM_SESSION_SEND;
-		}
-		pack_instant_message(
-			gMessageSystem,
-			gAgent.getID(),
-			FALSE,
-			gAgent.getSessionID(),
-			other_participant_id,
-			name.c_str(),
-			utf8_text.c_str(),
-			offline,
-			(EInstantMessage)new_dialog,
-			im_session_id);
-		gAgent.sendReliableMessage();
-	}
-
-	// If there is a mute list and this is not a group chat...
-	if ( LLMuteList::getInstance() )
-	{
-		// ... the target should not be in our mute list for some message types.
-		// Auto-remove them if present.
-		switch( dialog )
-		{
-		case IM_NOTHING_SPECIAL:
-		case IM_GROUP_INVITATION:
-		case IM_INVENTORY_OFFERED:
-		case IM_SESSION_INVITE:
-		case IM_SESSION_P2P_INVITE:
-		case IM_SESSION_CONFERENCE_START:
-		case IM_SESSION_SEND: // This one is marginal - erring on the side of hearing.
-		case IM_LURE_USER:
-		case IM_GODLIKE_LURE_USER:
-		case IM_FRIENDSHIP_OFFERED:
-			LLMuteList::getInstance()->autoRemove(other_participant_id, LLMuteList::AR_IM);
-			break;
-		default: ; // do nothing
-		}
-	}
-
-	if((dialog == IM_NOTHING_SPECIAL) && 
-	   (other_participant_id.notNull()))
-	{
-		// Do we have to replace the /me's here?
-		std::string from;
-		LLAgentUI::buildFullname(from);
-		LLIMModel::getInstance()->addMessage(im_session_id, from, gAgentID, utf8_text);
-
-		//local echo for the legacy communicate panel
-		std::string history_echo;
-		LLAgentUI::buildFullname(history_echo);
-
-		history_echo += ": " + utf8_text;
-
-		LLFloaterIMPanel* floater = gIMMgr->findFloaterBySession(im_session_id);
-		if (floater) floater->addHistoryLine(history_echo, LLUIColorTable::instance().getColor("IMChatColor"), true, gAgent.getID());
-
-		LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(im_session_id);
-		if (speaker_mgr)
-		{
-			speaker_mgr->speakerChatted(gAgentID);
-			speaker_mgr->setSpeakerTyping(gAgentID, FALSE);
-		}
-	}
-
-	// Add the recipient to the recent people list.
-	LLRecentPeople::instance().add(other_participant_id);
-}
-
-void session_starter_helper(
-	const LLUUID& temp_session_id,
-	const LLUUID& other_participant_id,
-	EInstantMessage im_type)
-{
-	LLMessageSystem *msg = gMessageSystem;
-
-	msg->newMessageFast(_PREHASH_ImprovedInstantMessage);
-	msg->nextBlockFast(_PREHASH_AgentData);
-	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-
-	msg->nextBlockFast(_PREHASH_MessageBlock);
-	msg->addBOOLFast(_PREHASH_FromGroup, FALSE);
-	msg->addUUIDFast(_PREHASH_ToAgentID, other_participant_id);
-	msg->addU8Fast(_PREHASH_Offline, IM_ONLINE);
-	msg->addU8Fast(_PREHASH_Dialog, im_type);
-	msg->addUUIDFast(_PREHASH_ID, temp_session_id);
-	msg->addU32Fast(_PREHASH_Timestamp, NO_TIMESTAMP); // no timestamp necessary
-
-	std::string name;
-	LLAgentUI::buildFullname(name);
-
-	msg->addStringFast(_PREHASH_FromAgentName, name);
-	msg->addStringFast(_PREHASH_Message, LLStringUtil::null);
-	msg->addU32Fast(_PREHASH_ParentEstateID, 0);
-	msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null);
-	msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent());
-}
-
-void start_deprecated_conference_chat(
-	const LLUUID& temp_session_id,
-	const LLUUID& creator_id,
-	const LLUUID& other_participant_id,
-	const LLSD& agents_to_invite)
-{
-	U8* bucket;
-	U8* pos;
-	S32 count;
-	S32 bucket_size;
-
-	// *FIX: this could suffer from endian issues
-	count = agents_to_invite.size();
-	bucket_size = UUID_BYTES * count;
-	bucket = new U8[bucket_size];
-	pos = bucket;
-
-	for(S32 i = 0; i < count; ++i)
-	{
-		LLUUID agent_id = agents_to_invite[i].asUUID();
-		
-		memcpy(pos, &agent_id, UUID_BYTES);
-		pos += UUID_BYTES;
-	}
-
-	session_starter_helper(
-		temp_session_id,
-		other_participant_id,
-		IM_SESSION_CONFERENCE_START);
-
-	gMessageSystem->addBinaryDataFast(
-		_PREHASH_BinaryBucket,
-		bucket,
-		bucket_size);
-
-	gAgent.sendReliableMessage();
- 
-	delete[] bucket;
-}
-
-class LLStartConferenceChatResponder : public LLHTTPClient::Responder
-{
-public:
-	LLStartConferenceChatResponder(
-		const LLUUID& temp_session_id,
-		const LLUUID& creator_id,
-		const LLUUID& other_participant_id,
-		const LLSD& agents_to_invite)
-	{
-		mTempSessionID = temp_session_id;
-		mCreatorID = creator_id;
-		mOtherParticipantID = other_participant_id;
-		mAgents = agents_to_invite;
-	}
-
-	virtual void error(U32 statusNum, const std::string& reason)
-	{
-		//try an "old school" way.
-		if ( statusNum == 400 )
-		{
-			start_deprecated_conference_chat(
-				mTempSessionID,
-				mCreatorID,
-				mOtherParticipantID,
-				mAgents);
-		}
-
-		//else throw an error back to the client?
-		//in theory we should have just have these error strings
-		//etc. set up in this file as opposed to the IMMgr,
-		//but the error string were unneeded here previously
-		//and it is not worth the effort switching over all
-		//the possible different language translations
-	}
-
-private:
-	LLUUID mTempSessionID;
-	LLUUID mCreatorID;
-	LLUUID mOtherParticipantID;
-
-	LLSD mAgents;
-};
-
-// Returns true if any messages were sent, false otherwise.
-// Is sort of equivalent to "does the server need to do anything?"
-bool LLIMModel::sendStartSession(
-	const LLUUID& temp_session_id,
-	const LLUUID& other_participant_id,
-	const std::vector<LLUUID>& ids,
-	EInstantMessage dialog)
-{
-	if ( dialog == IM_SESSION_GROUP_START )
-	{
-		session_starter_helper(
-			temp_session_id,
-			other_participant_id,
-			dialog);
-		gMessageSystem->addBinaryDataFast(
-				_PREHASH_BinaryBucket,
-				EMPTY_BINARY_BUCKET,
-				EMPTY_BINARY_BUCKET_SIZE);
-		gAgent.sendReliableMessage();
-
-		return true;
-	}
-	else if ( dialog == IM_SESSION_CONFERENCE_START )
-	{
-		LLSD agents;
-		for (int i = 0; i < (S32) ids.size(); i++)
-		{
-			agents.append(ids[i]);
-		}
-
-		//we have a new way of starting conference calls now
-		LLViewerRegion* region = gAgent.getRegion();
-		if (region)
-		{
-			std::string url = region->getCapability(
-				"ChatSessionRequest");
-			LLSD data;
-			data["method"] = "start conference";
-			data["session-id"] = temp_session_id;
-
-			data["params"] = agents;
-
-			LLHTTPClient::post(
-				url,
-				data,
-				new LLStartConferenceChatResponder(
-					temp_session_id,
-					gAgent.getID(),
-					other_participant_id,
-					data["params"]));
-		}
-		else
-		{
-			start_deprecated_conference_chat(
-				temp_session_id,
-				gAgent.getID(),
-				other_participant_id,
-				agents);
-		}
-
-		//we also need to wait for reply from the server in case of ad-hoc chat (we'll get new session id)
-		return true;
-	}
-
-	return false;
-}
-
-// static
-void LLIMModel::sendSessionInitialized(const LLUUID &session_id)
-{
-	LLIMSession* session = getInstance()->findIMSession(session_id);
-	if (session)
-	{
-		LLSD arg;
-		arg["session_id"] = session_id;
-		getInstance()->mSessionInitializedSignal(arg);
-	}
-}
-
-//
-// Helper Functions
-//
-
-class LLViewerChatterBoxInvitationAcceptResponder :
-	public LLHTTPClient::Responder
-{
-public:
-	LLViewerChatterBoxInvitationAcceptResponder(
-		const LLUUID& session_id,
-		LLIMMgr::EInvitationType invitation_type)
-	{
-		mSessionID = session_id;
-		mInvitiationType = invitation_type;
-	}
-
-	void result(const LLSD& content)
-	{
-		if ( gIMMgr)
-		{
-			LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
-			if (speaker_mgr)
-			{
-				//we've accepted our invitation
-				//and received a list of agents that were
-				//currently in the session when the reply was sent
-				//to us.  Now, it is possible that there were some agents
-				//to slip in/out between when that message was sent to us
-				//and now.
-
-				//the agent list updates we've received have been
-				//accurate from the time we were added to the session
-				//but unfortunately, our base that we are receiving here
-				//may not be the most up to date.  It was accurate at
-				//some point in time though.
-				speaker_mgr->setSpeakers(content);
-
-				//we now have our base of users in the session
-				//that was accurate at some point, but maybe not now
-				//so now we apply all of the udpates we've received
-				//in case of race conditions
-				speaker_mgr->updateSpeakers(gIMMgr->getPendingAgentListUpdates(mSessionID));
-			}
-
-			if (LLIMMgr::INVITATION_TYPE_VOICE == mInvitiationType)
-			{
-				gIMMgr->startCall(mSessionID);
-			}
-
-			if ((mInvitiationType == LLIMMgr::INVITATION_TYPE_VOICE 
-				|| mInvitiationType == LLIMMgr::INVITATION_TYPE_IMMEDIATE)
-				&& LLIMModel::getInstance()->findIMSession(mSessionID))
-			{
-				// always open IM window when connecting to voice
-				LLIMFloater::show(mSessionID);
-			}
-
-			gIMMgr->clearPendingAgentListUpdates(mSessionID);
-			gIMMgr->clearPendingInvitation(mSessionID);
-		}
-	}
-
-	void error(U32 statusNum, const std::string& reason)
-	{		
-		//throw something back to the viewer here?
-		if ( gIMMgr )
-		{
-			gIMMgr->clearPendingAgentListUpdates(mSessionID);
-			gIMMgr->clearPendingInvitation(mSessionID);
-			if ( 404 == statusNum )
-			{
-				std::string error_string;
-				error_string = "does not exist";
-				gIMMgr->showSessionStartError(error_string, mSessionID);
-			}
-		}
-	}
-
-private:
-	LLUUID mSessionID;
-	LLIMMgr::EInvitationType mInvitiationType;
-};
-
-
-// the other_participant_id is either an agent_id, a group_id, or an inventory
-// folder item_id (collection of calling cards)
-
-// static
-LLUUID LLIMMgr::computeSessionID(
-	EInstantMessage dialog,
-	const LLUUID& other_participant_id)
-{
-	LLUUID session_id;
-	if (IM_SESSION_GROUP_START == dialog)
-	{
-		// slam group session_id to the group_id (other_participant_id)
-		session_id = other_participant_id;
-	}
-	else if (IM_SESSION_CONFERENCE_START == dialog)
-	{
-		session_id.generate();
-	}
-	else if (IM_SESSION_INVITE == dialog)
-	{
-		// use provided session id for invites
-		session_id = other_participant_id;
-	}
-	else
-	{
-		LLUUID agent_id = gAgent.getID();
-		if (other_participant_id == agent_id)
-		{
-			// if we try to send an IM to ourselves then the XOR would be null
-			// so we just make the session_id the same as the agent_id
-			session_id = agent_id;
-		}
-		else
-		{
-			// peer-to-peer or peer-to-asset session_id is the XOR
-			session_id = other_participant_id ^ agent_id;
-		}
-	}
-	return session_id;
-}
-
-inline LLFloater* getFloaterBySessionID(const LLUUID session_id)
-{
-	LLFloater* floater = NULL;
-	if ( gIMMgr )
-	{
-		floater = dynamic_cast < LLFloater* >
-			( gIMMgr->findFloaterBySession(session_id) );
-	}
-	if ( !floater )
-	{
-		floater = dynamic_cast < LLFloater* >
-			( LLIMFloater::findInstance(session_id) );
-	}
-	return floater;
-}
-
-void
-LLIMMgr::showSessionStartError(
-	const std::string& error_string,
-	const LLUUID session_id)
-{
-	const LLFloater* floater = getFloaterBySessionID (session_id);
-	if (!floater) return;
-
-	LLSD args;
-	args["REASON"] = LLTrans::getString(error_string);
-	args["RECIPIENT"] = floater->getTitle();
-
-	LLSD payload;
-	payload["session_id"] = session_id;
-
-	LLNotifications::instance().add(
-		"ChatterBoxSessionStartError",
-		args,
-		payload,
-		LLIMMgr::onConfirmForceCloseError);
-}
-
-void
-LLIMMgr::showSessionEventError(
-	const std::string& event_string,
-	const std::string& error_string,
-	const LLUUID session_id)
-{
-	const LLFloater* floater = getFloaterBySessionID (session_id);
-	if (!floater) return;
-
-	LLSD args;
-	args["REASON"] =
-		LLTrans::getString(error_string);
-	args["EVENT"] =
-		LLTrans::getString(event_string);
-	args["RECIPIENT"] = floater->getTitle();
-
-	LLNotifications::instance().add(
-		"ChatterBoxSessionEventError",
-		args);
-}
-
-void
-LLIMMgr::showSessionForceClose(
-	const std::string& reason_string,
-	const LLUUID session_id)
-{
-	const LLFloater* floater = getFloaterBySessionID (session_id);
-	if (!floater) return;
-
-	LLSD args;
-
-	args["NAME"] = floater->getTitle();
-	args["REASON"] = LLTrans::getString(reason_string);
-
-	LLSD payload;
-	payload["session_id"] = session_id;
-
-	LLNotifications::instance().add(
-		"ForceCloseChatterBoxSession",
-		args,
-		payload,
-		LLIMMgr::onConfirmForceCloseError);
-}
-
-//static
-bool
-LLIMMgr::onConfirmForceCloseError(
-	const LLSD& notification,
-	const LLSD& response)
-{
-	//only 1 option really
-	LLUUID session_id = notification["payload"]["session_id"];
-
-	LLFloater* floater = getFloaterBySessionID (session_id);
-	if ( floater )
-	{
-		floater->closeFloater(FALSE);
-	}
-	return false;
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLOutgoingCallDialog
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-LLOutgoingCallDialog::LLOutgoingCallDialog(const LLSD& payload) :
-	LLDockableFloater(NULL, false, payload),
-	mPayload(payload)
-{
-}
-
-void LLOutgoingCallDialog::getAllowedRect(LLRect& rect)
-{
-	rect = gViewerWindow->getWorldViewRectScaled();
-}
-
-void LLOutgoingCallDialog::onOpen(const LLSD& key)
-{
-	// tell the user which voice channel they are leaving
-	if (!mPayload["old_channel_name"].asString().empty())
-	{
-		childSetTextArg("leaving", "[CURRENT_CHAT]", mPayload["old_channel_name"].asString());
-	}
-	else
-	{
-		childSetTextArg("leaving", "[CURRENT_CHAT]", getString("localchat"));
-	}
-
-	std::string callee_name = mPayload["session_name"].asString();
-	if (callee_name == "anonymous")
-	{
-		callee_name = getString("anonymous");
-	}
-	
-	setTitle(callee_name);
-
-	LLSD callee_id = mPayload["other_user_id"];
-	childSetTextArg("calling", "[CALLEE_NAME]", callee_name);
-	childSetTextArg("connecting", "[CALLEE_NAME]", callee_name);
-	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
-	icon->setValue(callee_id);
-}
-
-
-//static
-void LLOutgoingCallDialog::onCancel(void* user_data)
-{
-	LLOutgoingCallDialog* self = (LLOutgoingCallDialog*)user_data;
-
-	if (!gIMMgr)
-		return;
-
-	LLUUID session_id = self->mPayload["session_id"].asUUID();
-	gIMMgr->endCall(session_id);
-	
-	self->closeFloater();
-}
-
-
-BOOL LLOutgoingCallDialog::postBuild()
-{
-	BOOL success = LLDockableFloater::postBuild();
-
-	childSetAction("Cancel", onCancel, this);
-
-	// dock the dialog to the sys well, where other sys messages appear
-	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
-					 this, getDockTongue(), LLDockControl::TOP,
-					 boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1)));
-
-	return success;
-}
-
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLIncomingCallDialog
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-LLIncomingCallDialog::LLIncomingCallDialog(const LLSD& payload) :
-	LLDockableFloater(NULL, false, payload),
-	mPayload(payload)
-{
-}
-
-BOOL LLIncomingCallDialog::postBuild()
-{
-	LLDockableFloater::postBuild();
-
-	LLSD caller_id = mPayload["caller_id"];
-	EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
-
-	std::string call_type = getString("VoiceInviteP2P");
-	std::string caller_name = mPayload["caller_name"].asString();
-	if (caller_name == "anonymous")
-	{
-		caller_name = getString("anonymous");
-	}
-	
-	setTitle(caller_name + " " + call_type);
-	
-	// If it is not a P2P invite, then it's an AdHoc invite
-	if ( type != IM_SESSION_P2P_INVITE )
-	{
-		call_type = getString("VoiceInviteAdHoc");
-	}
-
-	// check to see if this is an Avaline call
-	LLUUID session_id = mPayload["session_id"].asUUID();
-	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
-	childSetVisible("Start IM", is_avatar); // no IM for avaline
-
-	LLUICtrl* caller_name_widget = getChild<LLUICtrl>("caller name");
-	caller_name_widget->setValue(caller_name + " " + call_type);
-	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
-	icon->setValue(caller_id);
-
-	childSetAction("Accept", onAccept, this);
-	childSetAction("Reject", onReject, this);
-	childSetAction("Start IM", onStartIM, this);
-	childSetFocus("Accept");
-
-	return TRUE;
-}
-
-void LLIncomingCallDialog::getAllowedRect(LLRect& rect)
-{
-	rect = gViewerWindow->getWorldViewRectScaled();
-}
-
-void LLIncomingCallDialog::onOpen(const LLSD& key)
-{
-	// tell the user which voice channel they would be leaving
-	LLVoiceChannel *voice = LLVoiceChannel::getCurrentVoiceChannel();
-	if (voice && !voice->getSessionName().empty())
-	{
-		childSetTextArg("question", "[CURRENT_CHAT]", voice->getSessionName());
-	}
-	else
-	{
-		childSetTextArg("question", "[CURRENT_CHAT]", getString("localchat"));
-	}
-
-	// dock the dialog to the sys well, where other sys messages appear
-	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
-									 this, getDockTongue(), LLDockControl::TOP,
-									 boost::bind(&LLIncomingCallDialog::getAllowedRect, this, _1)));
-}
-
-//static
-void LLIncomingCallDialog::onAccept(void* user_data)
-{
-	LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data;
-	self->processCallResponse(0);
-	self->closeFloater();
-}
-
-//static
-void LLIncomingCallDialog::onReject(void* user_data)
-{
-	LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data;
-	self->processCallResponse(1);
-	self->closeFloater();
-}
-
-//static
-void LLIncomingCallDialog::onStartIM(void* user_data)
-{
-	LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data;
-	self->processCallResponse(2);
-	self->closeFloater();
-}
-
-void LLIncomingCallDialog::processCallResponse(S32 response)
-{
-	if (!gIMMgr)
-		return;
-
-	LLUUID session_id = mPayload["session_id"].asUUID();
-	EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
-	LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)mPayload["inv_type"].asInteger();
-	bool voice = true;
-	switch(response)
-	{
-	case 2: // start IM: just don't start the voice chat
-	{
-		voice = false;
-		/* FALLTHROUGH */
-	}
-	case 0: // accept
-	{
-		if (type == IM_SESSION_P2P_INVITE)
-		{
-			// create a normal IM session
-			session_id = gIMMgr->addP2PSession(
-				mPayload["session_name"].asString(),
-				mPayload["caller_id"].asUUID(),
-				mPayload["session_handle"].asString());
-
-			if (voice)
-			{
-				if (gIMMgr->startCall(session_id))
-				{
-					// always open IM window when connecting to voice
-					LLIMFloater::show(session_id);
-				}
-			}
-
-			gIMMgr->clearPendingAgentListUpdates(session_id);
-			gIMMgr->clearPendingInvitation(session_id);
-		}
-		else
-		{
-			LLUUID session_id = gIMMgr->addSession(
-				mPayload["session_name"].asString(),
-				type,
-				session_id);
-			if (session_id != LLUUID::null)
-			{
-				LLIMFloater::show(session_id);
-			}
-
-			std::string url = gAgent.getRegion()->getCapability(
-				"ChatSessionRequest");
-
-			if (voice)
-			{
-				LLSD data;
-				data["method"] = "accept invitation";
-				data["session-id"] = session_id;
-				LLHTTPClient::post(
-					url,
-					data,
-					new LLViewerChatterBoxInvitationAcceptResponder(
-						session_id,
-						inv_type));
-			}
-		}
-		if (voice)
-		{
-			break;
-		}
-	}
-	case 1: // decline
-	{
-		if (type == IM_SESSION_P2P_INVITE)
-		{
-			if(gVoiceClient)
-			{
-				std::string s = mPayload["session_handle"].asString();
-				gVoiceClient->declineInvite(s);
-			}
-		}
-		else
-		{
-			std::string url = gAgent.getRegion()->getCapability(
-				"ChatSessionRequest");
-
-			LLSD data;
-			data["method"] = "decline invitation";
-			data["session-id"] = session_id;
-			LLHTTPClient::post(
-				url,
-				data,
-				NULL);
-		}
-	}
-
-	gIMMgr->clearPendingAgentListUpdates(session_id);
-	gIMMgr->clearPendingInvitation(session_id);
-	}
-}
-
-bool inviteUserResponse(const LLSD& notification, const LLSD& response)
-{
-	if (!gIMMgr)
-		return false;
-
-	const LLSD& payload = notification["payload"];
-	LLUUID session_id = payload["session_id"].asUUID();
-	EInstantMessage type = (EInstantMessage)payload["type"].asInteger();
-	LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)payload["inv_type"].asInteger();
-	S32 option = LLNotification::getSelectedOption(notification, response);
-	switch(option) 
-	{
-	case 0: // accept
-		{
-			if (type == IM_SESSION_P2P_INVITE)
-			{
-				// create a normal IM session
-				session_id = gIMMgr->addP2PSession(
-					payload["session_name"].asString(),
-					payload["caller_id"].asUUID(),
-					payload["session_handle"].asString(),
-					payload["session_uri"].asString());
-
-				if (gIMMgr->startCall(session_id))
-				{
-					// always open IM window when connecting to voice
-					LLIMFloater::show(session_id);
-				}
-
-				gIMMgr->clearPendingAgentListUpdates(session_id);
-				gIMMgr->clearPendingInvitation(session_id);
-			}
-			else
-			{
-				LLUUID session_id = gIMMgr->addSession(
-					payload["session_name"].asString(),
-					type,
-					session_id);
-				if (session_id != LLUUID::null)
-				{
-					LLIMFloater::show(session_id);
-				}
-
-				std::string url = gAgent.getRegion()->getCapability(
-					"ChatSessionRequest");
-
-				LLSD data;
-				data["method"] = "accept invitation";
-				data["session-id"] = session_id;
-				LLHTTPClient::post(
-					url,
-					data,
-					new LLViewerChatterBoxInvitationAcceptResponder(
-						session_id,
-						inv_type));
-			}
-		}
-		break;
-	case 2: // mute (also implies ignore, so this falls through to the "ignore" case below)
-	{
-		// mute the sender of this invite
-		if (!LLMuteList::getInstance()->isMuted(payload["caller_id"].asUUID()))
-		{
-			LLMute mute(payload["caller_id"].asUUID(), payload["caller_name"].asString(), LLMute::AGENT);
-			LLMuteList::getInstance()->add(mute);
-		}
-	}
-	/* FALLTHROUGH */
-	
-	case 1: // decline
-	{
-		if (type == IM_SESSION_P2P_INVITE)
-		{
-			if(gVoiceClient)
-			{
-				std::string s = payload["session_handle"].asString();
-				gVoiceClient->declineInvite(s);
-			}
-		}
-		else
-		{
-			std::string url = gAgent.getRegion()->getCapability(
-				"ChatSessionRequest");
-
-			LLSD data;
-			data["method"] = "decline invitation";
-			data["session-id"] = session_id;
-			LLHTTPClient::post(
-				url,
-				data,
-				NULL);				
-		}
-	}
-
-	gIMMgr->clearPendingAgentListUpdates(session_id);
-	gIMMgr->clearPendingInvitation(session_id);
-	break;
-	}
-	
-	return false;
-}
-
-//
-// Member Functions
-//
-
-LLIMMgr::LLIMMgr() :
-	mIMReceived(FALSE)
-{
-	mPendingInvitations = LLSD::emptyMap();
-	mPendingAgentListUpdates = LLSD::emptyMap();
-}
-
-// Add a message to a session. 
-void LLIMMgr::addMessage(
-	const LLUUID& session_id,
-	const LLUUID& target_id,
-	const std::string& from,
-	const std::string& msg,
-	const std::string& session_name,
-	EInstantMessage dialog,
-	U32 parent_estate_id,
-	const LLUUID& region_id,
-	const LLVector3& position,
-	bool link_name) // If this is true, then we insert the name and link it to a profile
-{
-	LLUUID other_participant_id = target_id;
-
-	// don't process muted IMs
-	if (LLMuteList::getInstance()->isMuted(
-			other_participant_id,
-			LLMute::flagTextChat) && !LLMuteList::getInstance()->isLinden(from))
-	{
-		return;
-	}
-
-	LLFloaterIMPanel* floater;
-	LLUUID new_session_id = session_id;
-	if (new_session_id.isNull())
-	{
-		//no session ID...compute new one
-		new_session_id = computeSessionID(dialog, other_participant_id);
-	}
-
-	//*NOTE session_name is empty in case of incoming P2P sessions
-	std::string fixed_session_name = from;
-	if(!session_name.empty() && session_name.size()>1)
-	{
-		fixed_session_name = session_name;
-	}
-
-	bool new_session = !hasSession(new_session_id);
-	if (new_session)
-	{
-		LLIMModel::getInstance()->newSession(new_session_id, fixed_session_name, dialog, other_participant_id);
-	}
-
-	floater = findFloaterBySession(new_session_id);
-	if (!floater)
-	{
-		floater = findFloaterBySession(other_participant_id);
-		if (floater)
-		{
-			llinfos << "found the IM session " << session_id 
-				<< " by participant " << other_participant_id << llendl;
-		}
-	}
-
-	// create IM window as necessary
-	if(!floater)
-	{
-		floater = createFloater(
-			new_session_id,
-			other_participant_id,
-			fixed_session_name,
-			dialog,
-			FALSE);
-	}
-
-	if (new_session)
-	{
-		// When we get a new IM, and if you are a god, display a bit
-		// of information about the source. This is to help liaisons
-		// when answering questions.
-		if(gAgent.isGodlike())
-		{
-			// *TODO:translate (low priority, god ability)
-			std::ostringstream bonus_info;
-			bonus_info << LLTrans::getString("***")+ " "+ LLTrans::getString("IMParentEstate") + ":" + " "
-				<< parent_estate_id
-				<< ((parent_estate_id == 1) ? "," + LLTrans::getString("IMMainland") : "")
-				<< ((parent_estate_id == 5) ? "," + LLTrans::getString ("IMTeen") : "");
-
-			// once we have web-services (or something) which returns
-			// information about a region id, we can print this out
-			// and even have it link to map-teleport or something.
-			//<< "*** region_id: " << region_id << std::endl
-			//<< "*** position: " << position << std::endl;
-
-			floater->addHistoryLine(bonus_info.str(), LLUIColorTable::instance().getColor("SystemChatColor"));
-			LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, bonus_info.str());
-		}
-
-		make_ui_sound("UISndNewIncomingIMSession");
-	}
-
-	// now add message to floater
-	bool is_from_system = target_id.isNull() || (from == SYSTEM_FROM);
-	const LLColor4& color = ( is_from_system ? 
-							  LLUIColorTable::instance().getColor("SystemChatColor") : 
-							  LLUIColorTable::instance().getColor("IMChatColor"));
-	if ( !link_name )
-	{
-		floater->addHistoryLine(msg,color); // No name to prepend, so just add the message normally
-	}
-	else
-	{
-		floater->addHistoryLine(msg, color, true, other_participant_id, from); // Insert linked name to front of message
-	}
-
-	LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg);
-
-	if( !LLFloaterReg::instanceVisible("communicate") && !floater->getVisible())
-	{
-		LLFloaterChatterBox* chat_floater = LLFloaterChatterBox::getInstance();
-		
-		//if the IM window is not open and the floater is not visible (i.e. not torn off)
-		LLFloater* previouslyActiveFloater = chat_floater->getActiveFloater();
-
-		// select the newly added floater (or the floater with the new line added to it).
-		// it should be there.
-		chat_floater->selectFloater(floater);
-
-		//there was a previously unseen IM, make that old tab flashing
-		//it is assumed that the most recently unseen IM tab is the one current selected/active
-		if ( previouslyActiveFloater && getIMReceived() )
-		{
-			chat_floater->setFloaterFlashing(previouslyActiveFloater, TRUE);
-		}
-
-		//notify of a new IM
-		notifyNewIM();
-	}
-}
-
-void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& message_name, const LLSD& args)
-{
-	LLUIString message;
-	
-	// null session id means near me (chat history)
-	if (session_id.isNull())
-	{
-		message = LLTrans::getString(message_name);
-		message.setArgs(args);
-
-		LLChat chat(message);
-		chat.mSourceType = CHAT_SOURCE_SYSTEM;
-		LLFloaterChat::addChatHistory(chat);
-	}
-	else // going to IM session
-	{
-		if (hasSession(session_id))
-		{
-			message = LLTrans::getString(message_name + "-im");
-			message.setArgs(args);
-			gIMMgr->addMessage(session_id, LLUUID::null, SYSTEM_FROM, message.getString());
-		}
-	}
-}
-
-void LLIMMgr::notifyNewIM()
-{
-	if(!LLFloaterReg::instanceVisible("communicate"))
-	{
-		mIMReceived = TRUE;
-	}
-}
-
-S32 LLIMMgr::getNumberOfUnreadIM()
-{
-	std::map<LLUUID, LLIMModel::LLIMSession*>::iterator it;
-	
-	S32 num = 0;
-	for(it = LLIMModel::getInstance()->mId2SessionMap.begin(); it != LLIMModel::getInstance()->mId2SessionMap.end(); ++it)
-	{
-		num += (*it).second->mNumUnread;
-	}
-
-	return num;
-}
-
-void LLIMMgr::clearNewIMNotification()
-{
-	mIMReceived = FALSE;
-}
-
-BOOL LLIMMgr::getIMReceived() const
-{
-	return mIMReceived;
-}
-
-LLUUID LLIMMgr::addP2PSession(const std::string& name,
-							const LLUUID& other_participant_id,
-							const std::string& voice_session_handle,
-							const std::string& caller_uri)
-{
-	LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id);
-	if (session_id != LLUUID::null)
-	{
-		LLIMFloater::show(session_id);
-	}
-
-	LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
-	if (speaker_mgr)
-	{
-		LLVoiceChannelP2P* voice_channel = dynamic_cast<LLVoiceChannelP2P*>(speaker_mgr->getVoiceChannel());
-		if (voice_channel)
-		{
-			voice_channel->setSessionHandle(voice_session_handle, caller_uri);
-		}
-	}
-	return session_id;
-}
-
-// This adds a session to the talk view. The name is the local name of
-// the session, dialog specifies the type of session. If the session
-// exists, it is brought forward.  Specifying id = NULL results in an
-// im session to everyone. Returns the uuid of the session.
-LLUUID LLIMMgr::addSession(
-	const std::string& name,
-	EInstantMessage dialog,
-	const LLUUID& other_participant_id)
-{
-	LLDynamicArray<LLUUID> ids;
-	ids.put(other_participant_id);
-	return addSession(name, dialog, other_participant_id, ids);
-}
-
-// Adds a session using the given session_id.  If the session already exists 
-// the dialog type is assumed correct. Returns the uuid of the session.
-LLUUID LLIMMgr::addSession(
-	const std::string& name,
-	EInstantMessage dialog,
-	const LLUUID& other_participant_id,
-	const LLDynamicArray<LLUUID>& ids)
-{
-	if (0 == ids.getLength())
-	{
-		return LLUUID::null;
-	}
-
-	LLUUID session_id = computeSessionID(dialog,other_participant_id);
-
-	bool new_session = !LLIMModel::getInstance()->findIMSession(session_id);
-
-	if (new_session)
-	{
-		LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids);
-	}
-
-
-	//*TODO remove this "floater" thing when Communicate Floater's gone
-	LLFloaterIMPanel* floater = findFloaterBySession(session_id);
-	if(!floater)
-	{
-		// On creation, use the first element of ids as the
-		// "other_participant_id"
-		floater = createFloater(
-			session_id,
-			other_participant_id,
-			name,
-			dialog,
-			TRUE,
-			ids);
-	}
-
-	//we don't need to show notes about online/offline, mute/unmute users' statuses for existing sessions
-	if (!new_session) return session_id;
-	
-	noteOfflineUsers(session_id, floater, ids);
-
-	// Only warn for regular IMs - not group IMs
-	if( dialog == IM_NOTHING_SPECIAL )
-	{
-		noteMutedUsers(session_id, floater, ids);
-	}
-
-	return session_id;
-}
-
-bool LLIMMgr::leaveSession(const LLUUID& session_id)
-{
-	LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id);
-	if (!im_session) return false;
-
-	LLIMModel::getInstance()->sendLeaveSession(session_id, im_session->mOtherParticipantID);
-	gIMMgr->removeSession(session_id);
-	return true;
-}
-
-// Removes data associated with a particular session specified by session_id
-void LLIMMgr::removeSession(const LLUUID& session_id)
-{
-	llassert_always(hasSession(session_id));
-	
-	//*TODO remove this floater thing when Communicate Floater is being deleted (IB)
-	LLFloaterIMPanel* floater = findFloaterBySession(session_id);
-	if(floater)
-	{
-		mFloaters.erase(floater->getHandle());
-		LLFloaterChatterBox::getInstance()->removeFloater(floater);
-	}
-
-	clearPendingInvitation(session_id);
-	clearPendingAgentListUpdates(session_id);
-
-	LLIMModel::getInstance()->clearSession(session_id);
-
-	notifyObserverSessionRemoved(session_id);
-}
-
-void LLIMMgr::inviteToSession(
-	const LLUUID& session_id, 
-	const std::string& session_name, 
-	const LLUUID& caller_id, 
-	const std::string& caller_name,
-	EInstantMessage type,
-	EInvitationType inv_type,
-	const std::string& session_handle,
-	const std::string& session_uri)
-{
-	//ignore invites from muted residents
-	if (LLMuteList::getInstance()->isMuted(caller_id))
-	{
-		return;
-	}
-
-	std::string notify_box_type;
-
-	BOOL ad_hoc_invite = FALSE;
-	if(type == IM_SESSION_P2P_INVITE)
-	{
-		//P2P is different...they only have voice invitations
-		notify_box_type = "VoiceInviteP2P";
-	}
-	else if ( gAgent.isInGroup(session_id) )
-	{
-		//only really old school groups have voice invitations
-		notify_box_type = "VoiceInviteGroup";
-	}
-	else if ( inv_type == INVITATION_TYPE_VOICE )
-	{
-		//else it's an ad-hoc
-		//and a voice ad-hoc
-		notify_box_type = "VoiceInviteAdHoc";
-		ad_hoc_invite = TRUE;
-	}
-	else if ( inv_type == INVITATION_TYPE_IMMEDIATE )
-	{
-		notify_box_type = "InviteAdHoc";
-		ad_hoc_invite = TRUE;
-	}
-
-	LLSD payload;
-	payload["session_id"] = session_id;
-	payload["session_name"] = session_name;
-	payload["caller_id"] = caller_id;
-	payload["caller_name"] = caller_name;
-	payload["type"] = type;
-	payload["inv_type"] = inv_type;
-	payload["session_handle"] = session_handle;
-	payload["session_uri"] = session_uri;
-	payload["notify_box_type"] = notify_box_type;
-	
-	LLVoiceChannel* channelp = LLVoiceChannel::getChannelByID(session_id);
-	if (channelp && channelp->callStarted())
-	{
-		// you have already started a call to the other user, so just accept the invite
-		LLNotifications::instance().forceResponse(LLNotification::Params("VoiceInviteP2P").payload(payload), 0);
-		return;
-	}
-
-	if (type == IM_SESSION_P2P_INVITE || ad_hoc_invite)
-	{
-		// is the inviter a friend?
-		if (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL)
-		{
-			// if not, and we are ignoring voice invites from non-friends
-			// then silently decline
-			if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly"))
-			{
-				// invite not from a friend, so decline
-				LLNotifications::instance().forceResponse(LLNotification::Params("VoiceInviteP2P").payload(payload), 1);
-				return;
-			}
-		}
-	}
-
-	if ( !mPendingInvitations.has(session_id.asString()) )
-	{
-		if (caller_name.empty())
-		{
-			gCacheName->get(caller_id, FALSE, boost::bind(&LLIMMgr::onInviteNameLookup, payload, _1, _2, _3, _4));
-		}
-		else
-		{
-			if (notify_box_type == "VoiceInviteP2P" || notify_box_type == "VoiceInviteAdHoc")
-			{
-				LLFloaterReg::showInstance("incoming_call", payload, TRUE);
-			}
-			else
-			{
-				LLSD args;
-				args["NAME"] = caller_name;
-				args["GROUP"] = session_name;
-
-				LLNotifications::instance().add(notify_box_type, args, payload, &inviteUserResponse);
-			}
-		}
-		mPendingInvitations[session_id.asString()] = LLSD();
-	}
-}
-
-void LLIMMgr::onInviteNameLookup(LLSD payload, const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group)
-{
-	payload["caller_name"] = first + " " + last;
-	payload["session_name"] = payload["caller_name"].asString();
-
-	std::string notify_box_type = payload["notify_box_type"].asString();
-
-	if (notify_box_type == "VoiceInviteP2P" || notify_box_type == "VoiceInviteAdHoc")
-	{
-		LLFloaterReg::showInstance("incoming_call", payload, TRUE);
-	}
-	else
-	{
-		LLSD args;
-		args["NAME"] = payload["caller_name"].asString();
-	
-		LLNotifications::instance().add(
-			payload["notify_box_type"].asString(),
-			args, 
-			payload,
-			&inviteUserResponse);
-	}
-}
-
-void LLIMMgr::disconnectAllSessions()
-{
-	LLFloaterIMPanel* floater = NULL;
-	std::set<LLHandle<LLFloater> >::iterator handle_it;
-	for(handle_it = mFloaters.begin();
-		handle_it != mFloaters.end();
-		)
-	{
-		floater = (LLFloaterIMPanel*)handle_it->get();
-
-		// MUST do this BEFORE calling floater->onClose() because that may remove the item from the set, causing the subsequent increment to crash.
-		++handle_it;
-
-		if (floater)
-		{
-			floater->setEnabled(FALSE);
-			floater->closeFloater(TRUE);
-		}
-	}
-}
-
-
-// This method returns the im panel corresponding to the uuid
-// provided. The uuid can either be a session id or an agent
-// id. Returns NULL if there is no matching panel.
-LLFloaterIMPanel* LLIMMgr::findFloaterBySession(const LLUUID& session_id)
-{
-	LLFloaterIMPanel* rv = NULL;
-	std::set<LLHandle<LLFloater> >::iterator handle_it;
-	for(handle_it = mFloaters.begin();
-		handle_it != mFloaters.end();
-		++handle_it)
-	{
-		rv = (LLFloaterIMPanel*)handle_it->get();
-		if(rv && session_id == rv->getSessionID())
-		{
-			break;
-		}
-		rv = NULL;
-	}
-	return rv;
-}
-
-
-BOOL LLIMMgr::hasSession(const LLUUID& session_id)
-{
-	return LLIMModel::getInstance()->findIMSession(session_id) != NULL;
-}
-
-void LLIMMgr::clearPendingInvitation(const LLUUID& session_id)
-{
-	if ( mPendingInvitations.has(session_id.asString()) )
-	{
-		mPendingInvitations.erase(session_id.asString());
-	}
-}
-
-void LLIMMgr::processAgentListUpdates(const LLUUID& session_id, const LLSD& body)
-{
-	LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
-	if ( im_floater )
-	{
-		im_floater->processAgentListUpdates(body);
-	}
-	LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
-	if (speaker_mgr)
-	{
-		speaker_mgr->updateSpeakers(body);
-	}
-	else
-	{
-		//we don't have a speaker manager yet..something went wrong
-		//we are probably receiving an update here before
-		//a start or an acceptance of an invitation.  Race condition.
-		gIMMgr->addPendingAgentListUpdates(
-			session_id,
-			body);
-	}
-}
-
-LLSD LLIMMgr::getPendingAgentListUpdates(const LLUUID& session_id)
-{
-	if ( mPendingAgentListUpdates.has(session_id.asString()) )
-	{
-		return mPendingAgentListUpdates[session_id.asString()];
-	}
-	else
-	{
-		return LLSD();
-	}
-}
-
-void LLIMMgr::addPendingAgentListUpdates(
-	const LLUUID& session_id,
-	const LLSD& updates)
-{
-	LLSD::map_const_iterator iter;
-
-	if ( !mPendingAgentListUpdates.has(session_id.asString()) )
-	{
-		//this is a new agent list update for this session
-		mPendingAgentListUpdates[session_id.asString()] = LLSD::emptyMap();
-	}
-
-	if (
-		updates.has("agent_updates") &&
-		updates["agent_updates"].isMap() &&
-		updates.has("updates") &&
-		updates["updates"].isMap() )
-	{
-		//new school update
-		LLSD update_types = LLSD::emptyArray();
-		LLSD::array_iterator array_iter;
-
-		update_types.append("agent_updates");
-		update_types.append("updates");
-
-		for (
-			array_iter = update_types.beginArray();
-			array_iter != update_types.endArray();
-			++array_iter)
-		{
-			//we only want to include the last update for a given agent
-			for (
-				iter = updates[array_iter->asString()].beginMap();
-				iter != updates[array_iter->asString()].endMap();
-				++iter)
-			{
-				mPendingAgentListUpdates[session_id.asString()][array_iter->asString()][iter->first] =
-					iter->second;
-			}
-		}
-	}
-	else if (
-		updates.has("updates") &&
-		updates["updates"].isMap() )
-	{
-		//old school update where the SD contained just mappings
-		//of agent_id -> "LEAVE"/"ENTER"
-
-		//only want to keep last update for each agent
-		for (
-			iter = updates["updates"].beginMap();
-			iter != updates["updates"].endMap();
-			++iter)
-		{
-			mPendingAgentListUpdates[session_id.asString()]["updates"][iter->first] =
-				iter->second;
-		}
-	}
-}
-
-void LLIMMgr::clearPendingAgentListUpdates(const LLUUID& session_id)
-{
-	if ( mPendingAgentListUpdates.has(session_id.asString()) )
-	{
-		mPendingAgentListUpdates.erase(session_id.asString());
-	}
-}
-
-void LLIMMgr::notifyObserverSessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
-{
-	for (session_observers_list_t::iterator it = mSessionObservers.begin(); it != mSessionObservers.end(); it++)
-	{
-		(*it)->sessionAdded(session_id, name, other_participant_id);
-	}
-}
-
-void LLIMMgr::notifyObserverSessionRemoved(const LLUUID& session_id)
-{
-	for (session_observers_list_t::iterator it = mSessionObservers.begin(); it != mSessionObservers.end(); it++)
-	{
-		(*it)->sessionRemoved(session_id);
-	}
-}
-
-void LLIMMgr::notifyObserverSessionIDUpdated( const LLUUID& old_session_id, const LLUUID& new_session_id )
-{
-	for (session_observers_list_t::iterator it = mSessionObservers.begin(); it != mSessionObservers.end(); it++)
-	{
-		(*it)->sessionIDUpdated(old_session_id, new_session_id);
-	}
-
-}
-
-void LLIMMgr::addSessionObserver(LLIMSessionObserver *observer)
-{
-	mSessionObservers.push_back(observer);
-}
-
-void LLIMMgr::removeSessionObserver(LLIMSessionObserver *observer)
-{
-	mSessionObservers.remove(observer);
-}
-
-bool LLIMMgr::startCall(const LLUUID& session_id)
-{
-	LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(session_id);
-	if (!voice_channel) return false;
-	
-	voice_channel->activate();
-	return true;
-}
-
-bool LLIMMgr::endCall(const LLUUID& session_id)
-{
-	LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(session_id);
-	if (!voice_channel) return false;
-
-	voice_channel->deactivate();
-	return true;
-}
-
-// create a floater and update internal representation for
-// consistency. Returns the pointer, caller (the class instance since
-// it is a private method) is not responsible for deleting the
-// pointer.  Add the floater to this but do not select it.
-LLFloaterIMPanel* LLIMMgr::createFloater(
-	const LLUUID& session_id,
-	const LLUUID& other_participant_id,
-	const std::string& session_label,
-	EInstantMessage dialog,
-	BOOL user_initiated,
-	const LLDynamicArray<LLUUID>& ids)
-{
-	if (session_id.isNull())
-	{
-		llwarns << "Creating LLFloaterIMPanel with null session ID" << llendl;
-	}
-
-	llinfos << "LLIMMgr::createFloater: from " << other_participant_id 
-			<< " in session " << session_id << llendl;
-	LLFloaterIMPanel* floater = new LLFloaterIMPanel(session_label,
-													 session_id,
-													 other_participant_id,
-													 ids,
-													 dialog);
-	LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END;
-	LLFloaterChatterBox::getInstance()->addFloater(floater, FALSE, i_pt);
-	mFloaters.insert(floater->getHandle());
-	return floater;
-}
-
-void LLIMMgr::noteOfflineUsers(
-	const LLUUID& session_id,
-	LLFloaterIMPanel* floater,
-	const LLDynamicArray<LLUUID>& ids)
-{
-	S32 count = ids.count();
-	if(count == 0)
-	{
-		const std::string& only_user = LLTrans::getString("only_user_message");
-		if (floater)
-		{
-			floater->addHistoryLine(only_user, LLUIColorTable::instance().getColor("SystemChatColor"));
-		}
-		LLIMModel::getInstance()->addMessage(session_id, SYSTEM_FROM, LLUUID::null, only_user);
-	}
-	else
-	{
-		const LLRelationship* info = NULL;
-		LLAvatarTracker& at = LLAvatarTracker::instance();
-		LLIMModel& im_model = LLIMModel::instance();
-		for(S32 i = 0; i < count; ++i)
-		{
-			info = at.getBuddyInfo(ids.get(i));
-			std::string first, last;
-			if(info && !info->isOnline()
-			   && gCacheName->getName(ids.get(i), first, last))
-			{
-				LLUIString offline = LLTrans::getString("offline_message");
-				offline.setArg("[FIRST]", first);
-				offline.setArg("[LAST]", last);
-				im_model.proccessOnlineOfflineNotification(session_id, offline);
-			}
-		}
-	}
-}
-
-void LLIMMgr::noteMutedUsers(const LLUUID& session_id, LLFloaterIMPanel* floater,
-								  const LLDynamicArray<LLUUID>& ids)
-{
-	// Don't do this if we don't have a mute list.
-	LLMuteList *ml = LLMuteList::getInstance();
-	if( !ml )
-	{
-		return;
-	}
-
-	S32 count = ids.count();
-	if(count > 0)
-	{
-		LLIMModel* im_model = LLIMModel::getInstance();
-		
-		for(S32 i = 0; i < count; ++i)
-		{
-			if( ml->isMuted(ids.get(i)) )
-			{
-				LLUIString muted = LLTrans::getString("muted_message");
-
-				//*TODO remove this "floater" thing when Communicate Floater's gone
-				floater->addHistoryLine(muted);
-
-				im_model->addMessage(session_id, SYSTEM_FROM, LLUUID::null, muted);
-				break;
-			}
-		}
-	}
-}
-
-void LLIMMgr::processIMTypingStart(const LLIMInfo* im_info)
-{
-	processIMTypingCore(im_info, TRUE);
-}
-
-void LLIMMgr::processIMTypingStop(const LLIMInfo* im_info)
-{
-	processIMTypingCore(im_info, FALSE);
-}
-
-void LLIMMgr::processIMTypingCore(const LLIMInfo* im_info, BOOL typing)
-{
-	LLUUID session_id = computeSessionID(im_info->mIMType, im_info->mFromID);
-	LLFloaterIMPanel* floater = findFloaterBySession(session_id);
-	if (floater)
-	{
-		floater->processIMTyping(im_info, typing);
-	}
-
-	LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
-	if ( im_floater )
-	{
-		im_floater->processIMTyping(im_info, typing);
-	}
-}
-
-class LLViewerChatterBoxSessionStartReply : public LLHTTPNode
-{
-public:
-	virtual void describe(Description& desc) const
-	{
-		desc.shortInfo("Used for receiving a reply to a request to initialize an ChatterBox session");
-		desc.postAPI();
-		desc.input(
-			"{\"client_session_id\": UUID, \"session_id\": UUID, \"success\" boolean, \"reason\": string");
-		desc.source(__FILE__, __LINE__);
-	}
-
-	virtual void post(ResponsePtr response,
-					  const LLSD& context,
-					  const LLSD& input) const
-	{
-		LLSD body;
-		LLUUID temp_session_id;
-		LLUUID session_id;
-		bool success;
-
-		body = input["body"];
-		success = body["success"].asBoolean();
-		temp_session_id = body["temp_session_id"].asUUID();
-
-		if ( success )
-		{
-			session_id = body["session_id"].asUUID();
-
-			LLIMModel::getInstance()->processSessionInitializedReply(temp_session_id, session_id);
-
-			LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
-			if (speaker_mgr)
-			{
-				speaker_mgr->setSpeakers(body);
-				speaker_mgr->updateSpeakers(gIMMgr->getPendingAgentListUpdates(session_id));
-			}
-
-			LLFloaterIMPanel* floaterp = gIMMgr->findFloaterBySession(session_id);
-			if (floaterp)
-			{
-				if ( body.has("session_info") )
-				{
-					floaterp->processSessionUpdate(body["session_info"]);
-				}
-			}
-
-			LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
-			if ( im_floater )
-			{
-				if ( body.has("session_info") )
-				{
-					im_floater->processSessionUpdate(body["session_info"]);
-				}
-			}
-
-			gIMMgr->clearPendingAgentListUpdates(session_id);
-		}
-		else
-		{
-			//throw an error dialog and close the temp session's floater
-			gIMMgr->showSessionStartError(body["error"].asString(), temp_session_id);
-		}
-
-		gIMMgr->clearPendingAgentListUpdates(session_id);
-	}
-};
-
-class LLViewerChatterBoxSessionEventReply : public LLHTTPNode
-{
-public:
-	virtual void describe(Description& desc) const
-	{
-		desc.shortInfo("Used for receiving a reply to a ChatterBox session event");
-		desc.postAPI();
-		desc.input(
-			"{\"event\": string, \"reason\": string, \"success\": boolean, \"session_id\": UUID");
-		desc.source(__FILE__, __LINE__);
-	}
-
-	virtual void post(ResponsePtr response,
-					  const LLSD& context,
-					  const LLSD& input) const
-	{
-		LLUUID session_id;
-		bool success;
-
-		LLSD body = input["body"];
-		success = body["success"].asBoolean();
-		session_id = body["session_id"].asUUID();
-
-		if ( !success )
-		{
-			//throw an error dialog
-			gIMMgr->showSessionEventError(
-				body["event"].asString(),
-				body["error"].asString(),
-				session_id);
-		}
-	}
-};
-
-class LLViewerForceCloseChatterBoxSession: public LLHTTPNode
-{
-public:
-	virtual void post(ResponsePtr response,
-					  const LLSD& context,
-					  const LLSD& input) const
-	{
-		LLUUID session_id;
-		std::string reason;
-
-		session_id = input["body"]["session_id"].asUUID();
-		reason = input["body"]["reason"].asString();
-
-		gIMMgr->showSessionForceClose(reason, session_id);
-	}
-};
-
-class LLViewerChatterBoxSessionAgentListUpdates : public LLHTTPNode
-{
-public:
-	virtual void post(
-		ResponsePtr responder,
-		const LLSD& context,
-		const LLSD& input) const
-	{
-		const LLUUID& session_id = input["body"]["session_id"].asUUID();
-		gIMMgr->processAgentListUpdates(session_id, input["body"]);
-	}
-};
-
-class LLViewerChatterBoxSessionUpdate : public LLHTTPNode
-{
-public:
-	virtual void post(
-		ResponsePtr responder,
-		const LLSD& context,
-		const LLSD& input) const
-	{
-		LLUUID session_id = input["body"]["session_id"].asUUID();
-		LLFloaterIMPanel* floaterp = gIMMgr->findFloaterBySession(session_id);
-		if (floaterp)
-		{
-			floaterp->processSessionUpdate(input["body"]["info"]);
-		}
-		LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
-		if ( im_floater )
-		{
-			im_floater->processSessionUpdate(input["body"]["info"]);
-		}
-	}
-};
-
-
-class LLViewerChatterBoxInvitation : public LLHTTPNode
-{
-public:
-
-	virtual void post(
-		ResponsePtr response,
-		const LLSD& context,
-		const LLSD& input) const
-	{
-		//for backwards compatiblity reasons...we need to still
-		//check for 'text' or 'voice' invitations...bleh
-		if ( input["body"].has("instantmessage") )
-		{
-			LLSD message_params =
-				input["body"]["instantmessage"]["message_params"];
-
-			//do something here to have the IM invite behave
-			//just like a normal IM
-			//this is just replicated code from process_improved_im
-			//and should really go in it's own function -jwolk
-			if (gNoRender)
-			{
-				return;
-			}
-			LLChat chat;
-
-			std::string message = message_params["message"].asString();
-			std::string name = message_params["from_name"].asString();
-			LLUUID from_id = message_params["from_id"].asUUID();
-			LLUUID session_id = message_params["id"].asUUID();
-			std::vector<U8> bin_bucket = message_params["data"]["binary_bucket"].asBinary();
-			U8 offline = (U8)message_params["offline"].asInteger();
-			
-			time_t timestamp =
-				(time_t) message_params["timestamp"].asInteger();
-
-			BOOL is_busy = gAgent.getBusy();
-			BOOL is_muted = LLMuteList::getInstance()->isMuted(
-				from_id,
-				name,
-				LLMute::flagTextChat);
-
-			BOOL is_linden = LLMuteList::getInstance()->isLinden(name);
-			std::string separator_string(": ");
-			
-			chat.mMuted = is_muted && !is_linden;
-			chat.mFromID = from_id;
-			chat.mFromName = name;
-
-			if (!is_linden && (is_busy || is_muted))
-			{
-				return;
-			}
-
-			// standard message, not from system
-			std::string saved;
-			if(offline == IM_OFFLINE)
-			{
-				saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());
-			}
-			std::string buffer = saved + message;
-
-			BOOL is_this_agent = FALSE;
-			if(from_id == gAgentID)
-			{
-				is_this_agent = TRUE;
-			}
-			gIMMgr->addMessage(
-				session_id,
-				from_id,
-				name,
-				buffer,
-				std::string((char*)&bin_bucket[0]),
-				IM_SESSION_INVITE,
-				message_params["parent_estate_id"].asInteger(),
-				message_params["region_id"].asUUID(),
-				ll_vector3_from_sd(message_params["position"]),
-				true);
-
-			chat.mText = std::string("IM: ") + name + separator_string + saved + message;
-			LLFloaterChat::addChat(chat, TRUE, is_this_agent);
-
-			//K now we want to accept the invitation
-			std::string url = gAgent.getRegion()->getCapability(
-				"ChatSessionRequest");
-
-			if ( url != "" )
-			{
-				LLSD data;
-				data["method"] = "accept invitation";
-				data["session-id"] = session_id;
-				LLHTTPClient::post(
-					url,
-					data,
-					new LLViewerChatterBoxInvitationAcceptResponder(
-						session_id,
-						LLIMMgr::INVITATION_TYPE_INSTANT_MESSAGE));
-			}
-		} //end if invitation has instant message
-		else if ( input["body"].has("voice") )
-		{
-			if (gNoRender)
-			{
-				return;
-			}
-			
-			if(!LLVoiceClient::voiceEnabled())
-			{
-				// Don't display voice invites unless the user has voice enabled.
-				return;
-			}
-
-			gIMMgr->inviteToSession(
-				input["body"]["session_id"].asUUID(), 
-				input["body"]["session_name"].asString(), 
-				input["body"]["from_id"].asUUID(),
-				input["body"]["from_name"].asString(),
-				IM_SESSION_INVITE,
-				LLIMMgr::INVITATION_TYPE_VOICE);
-		}
-		else if ( input["body"].has("immediate") )
-		{
-			gIMMgr->inviteToSession(
-				input["body"]["session_id"].asUUID(), 
-				input["body"]["session_name"].asString(), 
-				input["body"]["from_id"].asUUID(),
-				input["body"]["from_name"].asString(),
-				IM_SESSION_INVITE,
-				LLIMMgr::INVITATION_TYPE_IMMEDIATE);
-		}
-	}
-};
-
-LLHTTPRegistration<LLViewerChatterBoxSessionStartReply>
-   gHTTPRegistrationMessageChatterboxsessionstartreply(
-	   "/message/ChatterBoxSessionStartReply");
-
-LLHTTPRegistration<LLViewerChatterBoxSessionEventReply>
-   gHTTPRegistrationMessageChatterboxsessioneventreply(
-	   "/message/ChatterBoxSessionEventReply");
-
-LLHTTPRegistration<LLViewerForceCloseChatterBoxSession>
-    gHTTPRegistrationMessageForceclosechatterboxsession(
-		"/message/ForceCloseChatterBoxSession");
-
-LLHTTPRegistration<LLViewerChatterBoxSessionAgentListUpdates>
-    gHTTPRegistrationMessageChatterboxsessionagentlistupdates(
-	    "/message/ChatterBoxSessionAgentListUpdates");
-
-LLHTTPRegistration<LLViewerChatterBoxSessionUpdate>
-    gHTTPRegistrationMessageChatterBoxSessionUpdate(
-	    "/message/ChatterBoxSessionUpdate");
-
-LLHTTPRegistration<LLViewerChatterBoxInvitation>
-    gHTTPRegistrationMessageChatterBoxInvitation(
-		"/message/ChatterBoxInvitation");
-
+/** 
+ * @file LLIMMgr.cpp
+ * @brief Container for Instant Messaging
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llimview.h"
+
+#include "llfloaterreg.h"
+#include "llfontgl.h"
+#include "llrect.h"
+#include "llerror.h"
+#include "llbutton.h"
+#include "llhttpclient.h"
+#include "llsdutil_math.h"
+#include "llstring.h"
+#include "lluictrlfactory.h"
+
+#include "llagent.h"
+#include "llavatariconctrl.h"
+#include "llbottomtray.h"
+#include "llcallingcard.h"
+#include "llchat.h"
+#include "llchiclet.h"
+#include "llresmgr.h"
+#include "llfloaterchat.h"
+#include "llfloaterchatterbox.h"
+#include "llavataractions.h"
+#include "llhttpnode.h"
+#include "llimfloater.h"
+#include "llimpanel.h"
+#include "llresizebar.h"
+#include "lltabcontainer.h"
+#include "llviewercontrol.h"
+#include "llfloater.h"
+#include "llmutelist.h"
+#include "llresizehandle.h"
+#include "llkeyboard.h"
+#include "llui.h"
+#include "llviewermenu.h"
+#include "llcallingcard.h"
+#include "lltoolbar.h"
+#include "llviewermessage.h"
+#include "llviewerwindow.h"
+#include "llnotify.h"
+#include "llviewerregion.h"
+#include "llvoicechannel.h"
+#include "lltrans.h"
+#include "llrecentpeople.h"
+#include "llsyswellwindow.h"
+
+#include "llfirstuse.h"
+#include "llagentui.h"
+
+//
+// Globals
+//
+LLIMMgr* gIMMgr = NULL;
+
+//
+// Statics
+//
+// *FIXME: make these all either UIStrings or Strings
+
+const static std::string IM_SEPARATOR(": ");
+
+
+void toast_callback(const LLSD& msg){
+	// do not show toast in busy mode or it goes from agent
+	if (gAgent.getBusy() || gAgent.getID() == msg["from_id"])
+	{
+		return;
+	}
+
+	// check whether incoming IM belongs to an active session or not
+	if (LLIMModel::getInstance()->getActiveSessionID() == msg["session_id"])
+	{
+		return;
+	}
+
+	// Skip toasting for system messages
+	if (msg["from_id"].asUUID() == LLUUID::null)
+	{
+		return;
+	}
+
+	LLSD args;
+	args["MESSAGE"] = msg["message"];
+	args["TIME"] = msg["time"];
+	args["FROM"] = msg["from"];
+	args["FROM_ID"] = msg["from_id"];
+	args["SESSION_ID"] = msg["session_id"];
+
+	LLNotifications::instance().add("IMToast", args, LLSD(), boost::bind(&LLIMFloater::show, msg["session_id"].asUUID()));
+}
+
+void LLIMModel::setActiveSessionID(const LLUUID& session_id)
+{
+	// check if such an ID really exists
+	if (!findIMSession(session_id))
+	{
+		llwarns << "Trying to set as active a non-existent session!" << llendl;
+		return;
+	}
+
+	mActiveSessionID = session_id;
+}
+
+LLIMModel::LLIMModel() 
+{
+	addNewMsgCallback(LLIMFloater::newIMCallback);
+	addNewMsgCallback(toast_callback);
+}
+
+LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
+:	mSessionID(session_id),
+	mName(name),
+	mType(type),
+	mNumUnread(0),
+	mOtherParticipantID(other_participant_id),
+	mInitialTargetIDs(ids),
+	mVoiceChannel(NULL),
+	mSpeakers(NULL),
+	mSessionInitialized(false),
+	mCallBackEnabled(true),
+	mTextIMPossible(true),
+	mOtherParticipantIsAvatar(true)
+{
+	if (IM_NOTHING_SPECIAL == type || IM_SESSION_P2P_INVITE == type)
+	{
+		mVoiceChannel  = new LLVoiceChannelP2P(session_id, name, other_participant_id);
+	}
+	else
+	{
+		mVoiceChannel = new LLVoiceChannelGroup(session_id, name);
+	}
+	mSpeakers = new LLIMSpeakerMgr(mVoiceChannel);
+
+	// All participants will be added to the list of people we've recently interacted with.
+	mSpeakers->addListener(&LLRecentPeople::instance(), "add");
+
+	//we need to wait for session initialization for outgoing ad-hoc and group chat session
+	//correct session id for initiated ad-hoc chat will be received from the server
+	if (!LLIMModel::getInstance()->sendStartSession(mSessionID, mOtherParticipantID, 
+		mInitialTargetIDs, mType))
+	{
+		//we don't need to wait for any responses
+		//so we're already initialized
+		mSessionInitialized = true;
+	}
+
+	if (IM_NOTHING_SPECIAL == type)
+	{
+		mCallBackEnabled = LLVoiceClient::getInstance()->isSessionCallBackPossible(mSessionID);
+		mTextIMPossible = LLVoiceClient::getInstance()->isSessionTextIMPossible(mSessionID);
+		mOtherParticipantIsAvatar = LLVoiceClient::getInstance()->isParticipantAvatar(mSessionID);
+	}
+
+	if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") )
+		LLLogChat::loadHistory(mName, &chatFromLogFile, (void *)this);
+}
+
+LLIMModel::LLIMSession::~LLIMSession()
+{
+	delete mSpeakers;
+	mSpeakers = NULL;
+
+	// End the text IM session if necessary
+	if(gVoiceClient && mOtherParticipantID.notNull())
+	{
+		switch(mType)
+		{
+		case IM_NOTHING_SPECIAL:
+		case IM_SESSION_P2P_INVITE:
+			gVoiceClient->endUserIMSession(mOtherParticipantID);
+			break;
+
+		default:
+			// Appease the linux compiler
+			break;
+		}
+	}
+
+	// HAVE to do this here -- if it happens in the LLVoiceChannel destructor it will call the wrong version (since the object's partially deconstructed at that point).
+	mVoiceChannel->deactivate();
+	
+	delete mVoiceChannel;
+	mVoiceChannel = NULL;
+}
+
+void LLIMModel::LLIMSession::sessionInitReplyReceived(const LLUUID& new_session_id)
+{
+	mSessionInitialized = true;
+
+	if (new_session_id != mSessionID)
+	{
+		mSessionID = new_session_id;
+		mVoiceChannel->updateSessionID(new_session_id);
+	}
+}
+
+void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time)
+{
+	LLSD message;
+	message["from"] = from;
+	message["from_id"] = from_id;
+	message["message"] = utf8_text;
+	message["time"] = time; 
+	message["index"] = (LLSD::Integer)mMsgs.size(); 
+
+	mMsgs.push_front(message); 
+
+	if (mSpeakers && from_id.notNull())
+	{
+		mSpeakers->speakerChatted(from_id);
+		mSpeakers->setSpeakerTyping(from_id, FALSE);
+	}
+}
+
+void LLIMModel::LLIMSession::chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata)
+{
+	if (!userdata) return;
+
+	LLIMSession* self = (LLIMSession*) userdata;
+
+	if (type == LLLogChat::LOG_LINE)
+	{
+		self->addMessage("", LLSD(), msg["message"].asString(), "");
+	}
+	else if (type == LLLogChat::LOG_LLSD)
+	{
+		self->addMessage(msg["from"].asString(), msg["from_id"].asUUID(), msg["message"].asString(), msg["time"].asString());
+	}
+}
+
+LLIMModel::LLIMSession* LLIMModel::findIMSession(const LLUUID& session_id) const
+{
+	return get_if_there(mId2SessionMap, session_id,
+		(LLIMModel::LLIMSession*) NULL);
+}
+
+void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id)
+{
+	LLIMSession* session = findIMSession(old_session_id);
+	if (session)
+	{
+		session->sessionInitReplyReceived(new_session_id);
+
+		if (old_session_id != new_session_id)
+		{
+			mId2SessionMap.erase(old_session_id);
+			mId2SessionMap[new_session_id] = session;
+
+			gIMMgr->notifyObserverSessionIDUpdated(old_session_id, new_session_id);
+		}
+
+		LLIMFloater* im_floater = LLIMFloater::findInstance(old_session_id);
+		if (im_floater)
+		{
+			im_floater->sessionInitReplyReceived(new_session_id);
+		}
+	}
+
+	//*TODO remove this "floater" stuff when Communicate Floater is gone
+	LLFloaterIMPanel* floater = gIMMgr->findFloaterBySession(old_session_id);
+	if (floater)
+	{
+		floater->sessionInitReplyReceived(new_session_id);
+	}
+}
+
+void LLIMModel::testMessages()
+{
+	LLUUID bot1_id("d0426ec6-6535-4c11-a5d9-526bb0c654d9");
+	LLUUID bot1_session_id;
+	std::string from = "IM Tester";
+
+	bot1_session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, bot1_id);
+	newSession(bot1_session_id, from, IM_NOTHING_SPECIAL, bot1_id);
+	addMessage(bot1_session_id, from, bot1_id, "Test Message: Hi from testerbot land!");
+
+	LLUUID bot2_id;
+	std::string firstname[] = {"Roflcopter", "Joe"};
+	std::string lastname[] = {"Linden", "Tester", "Resident", "Schmoe"};
+
+	S32 rand1 = ll_rand(sizeof firstname)/(sizeof firstname[0]);
+	S32 rand2 = ll_rand(sizeof lastname)/(sizeof lastname[0]);
+	
+	from = firstname[rand1] + " " + lastname[rand2];
+	bot2_id.generate(from);
+	LLUUID bot2_session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, bot2_id);
+	newSession(bot2_session_id, from, IM_NOTHING_SPECIAL, bot2_id);
+	addMessage(bot2_session_id, from, bot2_id, "Test Message: Hello there, I have a question. Can I bother you for a second? ");
+	addMessage(bot2_session_id, from, bot2_id, "Test Message: OMGWTFBBQ.");
+}
+
+
+bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, 
+						   const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
+{
+	if (findIMSession(session_id))
+	{
+		llwarns << "IM Session " << session_id << " already exists" << llendl;
+		return false;
+	}
+
+	LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids);
+	mId2SessionMap[session_id] = session;
+
+	LLIMMgr::getInstance()->notifyObserverSessionAdded(session_id, name, other_participant_id);
+
+	return true;
+
+}
+
+bool LLIMModel::clearSession(const LLUUID& session_id)
+{
+	if (mId2SessionMap.find(session_id) == mId2SessionMap.end()) return false;
+	delete (mId2SessionMap[session_id]);
+	mId2SessionMap.erase(session_id);
+	return true;
+}
+
+void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index)
+{
+	LLIMSession* session = findIMSession(session_id);
+	if (!session) 
+	{
+		llwarns << "session " << session_id << "does not exist " << llendl;
+		return;
+	}
+
+	int i = session->mMsgs.size() - start_index;
+
+	for (std::list<LLSD>::iterator iter = session->mMsgs.begin(); 
+		iter != session->mMsgs.end() && i > 0;
+		iter++)
+	{
+		LLSD msg;
+		msg = *iter;
+		messages.push_back(*iter);
+		i--;
+	}
+
+	session->mNumUnread = 0;
+	
+	LLSD arg;
+	arg["session_id"] = session_id;
+	arg["num_unread"] = 0;
+	mNoUnreadMsgsSignal(arg);
+}
+
+bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text) {
+	
+	LLIMSession* session = findIMSession(session_id);
+
+	if (!session) 
+	{
+		llwarns << "session " << session_id << "does not exist " << llendl;
+		return false;
+	}
+
+	session->addMessage(from, from_id, utf8_text, LLLogChat::timestamp(false)); //might want to add date separately
+
+	return true;
+}
+
+bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
+{
+	S32 im_log_option =  gSavedPerAccountSettings.getS32("IMLogOptions");
+	if (im_log_option != LOG_CHAT)
+	{
+		if(im_log_option == LOG_BOTH_TOGETHER)
+		{
+			LLLogChat::saveHistory(std::string("chat"), from, from_id, utf8_text);
+			return true;
+		}
+		else
+		{
+			LLLogChat::saveHistory(LLIMModel::getInstance()->getName(session_id), from, from_id, utf8_text);
+			return true;
+		}
+	}
+	return false;
+}
+
+bool LLIMModel::proccessOnlineOfflineNotification(
+	const LLUUID& session_id, 
+	const std::string& utf8_text)
+{
+	// Add message to old one floater
+	LLFloaterIMPanel *floater = gIMMgr->findFloaterBySession(session_id);
+	if ( floater )
+	{
+		if ( !utf8_text.empty() )
+		{
+			floater->addHistoryLine(utf8_text, LLUIColorTable::instance().getColor("SystemChatColor"));
+		}
+	}
+	// Add system message to history
+	return addMessage(session_id, SYSTEM_FROM, LLUUID::null, utf8_text);
+}
+
+bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, 
+						   const std::string& utf8_text, bool log2file /* = true */) { 
+	LLIMSession* session = findIMSession(session_id);
+
+	if (!session) 
+	{
+		llwarns << "session " << session_id << "does not exist " << llendl;
+		return false;
+	}
+
+	addToHistory(session_id, from, from_id, utf8_text);
+	if (log2file) logToFile(session_id, from, from_id, utf8_text);
+
+	session->mNumUnread++;
+
+	// notify listeners
+	LLSD arg;
+	arg["session_id"] = session_id;
+	arg["num_unread"] = session->mNumUnread;
+	arg["message"] = utf8_text;
+	arg["from"] = from;
+	arg["from_id"] = from_id;
+	arg["time"] = LLLogChat::timestamp(false);
+	mNewMsgSignal(arg);
+
+	return true;
+}
+
+
+const std::string& LLIMModel::getName(const LLUUID& session_id) const
+{
+	LLIMSession* session = findIMSession(session_id);
+
+	if (!session) 
+	{
+		llwarns << "session " << session_id << "does not exist " << llendl;
+		return LLStringUtil::null;
+	}
+
+	return session->mName;
+}
+
+const S32 LLIMModel::getNumUnread(const LLUUID& session_id) const
+{
+	LLIMSession* session = findIMSession(session_id);
+	if (!session)
+	{
+		llwarns << "session " << session_id << "does not exist " << llendl;
+		return -1;
+	}
+
+	return session->mNumUnread;
+}
+
+const LLUUID& LLIMModel::getOtherParticipantID(const LLUUID& session_id) const
+{
+	LLIMSession* session = findIMSession(session_id);
+	if (!session)
+	{
+		llwarns << "session " << session_id << "does not exist " << llendl;
+		return LLUUID::null;
+	}
+
+	return session->mOtherParticipantID;
+}
+
+EInstantMessage LLIMModel::getType(const LLUUID& session_id) const
+{
+	LLIMSession* session = findIMSession(session_id);
+	if (!session)
+	{
+		llwarns << "session " << session_id << "does not exist " << llendl;
+		return IM_COUNT;
+	}
+
+	return session->mType;
+}
+
+LLVoiceChannel* LLIMModel::getVoiceChannel( const LLUUID& session_id ) const
+{
+	LLIMSession* session = findIMSession(session_id);
+	if (!session)
+	{
+		llwarns << "session " << session_id << "does not exist " << llendl;
+		return NULL;
+	}
+
+	return session->mVoiceChannel;
+}
+
+LLIMSpeakerMgr* LLIMModel::getSpeakerManager( const LLUUID& session_id ) const
+{
+	LLIMSession* session = findIMSession(session_id);
+	if (!session)
+	{
+		llwarns << "session " << session_id << "does not exist " << llendl;
+		return NULL;
+	}
+
+	return session->mSpeakers;
+}
+
+
+// TODO get rid of other participant ID
+void LLIMModel::sendTypingState(LLUUID session_id, LLUUID other_participant_id, BOOL typing) 
+{
+	std::string name;
+	LLAgentUI::buildFullname(name);
+
+	pack_instant_message(
+		gMessageSystem,
+		gAgent.getID(),
+		FALSE,
+		gAgent.getSessionID(),
+		other_participant_id,
+		name,
+		std::string("typing"),
+		IM_ONLINE,
+		(typing ? IM_TYPING_START : IM_TYPING_STOP),
+		session_id);
+	gAgent.sendReliableMessage();
+}
+
+void LLIMModel::sendLeaveSession(const LLUUID& session_id, const LLUUID& other_participant_id)
+{
+	if(session_id.notNull())
+	{
+		std::string name;
+		LLAgentUI::buildFullname(name);
+		pack_instant_message(
+			gMessageSystem,
+			gAgent.getID(),
+			FALSE,
+			gAgent.getSessionID(),
+			other_participant_id,
+			name, 
+			LLStringUtil::null,
+			IM_ONLINE,
+			IM_SESSION_LEAVE,
+			session_id);
+		gAgent.sendReliableMessage();
+	}
+}
+
+//*TODO this method is better be moved to the LLIMMgr
+void LLIMModel::sendMessage(const std::string& utf8_text,
+					 const LLUUID& im_session_id,
+					 const LLUUID& other_participant_id,
+					 EInstantMessage dialog)
+{
+	std::string name;
+	bool sent = false;
+	LLAgentUI::buildFullname(name);
+
+	const LLRelationship* info = NULL;
+	info = LLAvatarTracker::instance().getBuddyInfo(other_participant_id);
+	
+	U8 offline = (!info || info->isOnline()) ? IM_ONLINE : IM_OFFLINE;
+	
+	if((offline == IM_OFFLINE) && (LLVoiceClient::getInstance()->isOnlineSIP(other_participant_id)))
+	{
+		// User is online through the OOW connector, but not with a regular viewer.  Try to send the message via SLVoice.
+		sent = gVoiceClient->sendTextMessage(other_participant_id, utf8_text);
+	}
+	
+	if(!sent)
+	{
+		// Send message normally.
+
+		// default to IM_SESSION_SEND unless it's nothing special - in
+		// which case it's probably an IM to everyone.
+		U8 new_dialog = dialog;
+
+		if ( dialog != IM_NOTHING_SPECIAL )
+		{
+			new_dialog = IM_SESSION_SEND;
+		}
+		pack_instant_message(
+			gMessageSystem,
+			gAgent.getID(),
+			FALSE,
+			gAgent.getSessionID(),
+			other_participant_id,
+			name.c_str(),
+			utf8_text.c_str(),
+			offline,
+			(EInstantMessage)new_dialog,
+			im_session_id);
+		gAgent.sendReliableMessage();
+	}
+
+	// If there is a mute list and this is not a group chat...
+	if ( LLMuteList::getInstance() )
+	{
+		// ... the target should not be in our mute list for some message types.
+		// Auto-remove them if present.
+		switch( dialog )
+		{
+		case IM_NOTHING_SPECIAL:
+		case IM_GROUP_INVITATION:
+		case IM_INVENTORY_OFFERED:
+		case IM_SESSION_INVITE:
+		case IM_SESSION_P2P_INVITE:
+		case IM_SESSION_CONFERENCE_START:
+		case IM_SESSION_SEND: // This one is marginal - erring on the side of hearing.
+		case IM_LURE_USER:
+		case IM_GODLIKE_LURE_USER:
+		case IM_FRIENDSHIP_OFFERED:
+			LLMuteList::getInstance()->autoRemove(other_participant_id, LLMuteList::AR_IM);
+			break;
+		default: ; // do nothing
+		}
+	}
+
+	if((dialog == IM_NOTHING_SPECIAL) && 
+	   (other_participant_id.notNull()))
+	{
+		// Do we have to replace the /me's here?
+		std::string from;
+		LLAgentUI::buildFullname(from);
+		LLIMModel::getInstance()->addMessage(im_session_id, from, gAgentID, utf8_text);
+
+		//local echo for the legacy communicate panel
+		std::string history_echo;
+		LLAgentUI::buildFullname(history_echo);
+
+		history_echo += ": " + utf8_text;
+
+		LLFloaterIMPanel* floater = gIMMgr->findFloaterBySession(im_session_id);
+		if (floater) floater->addHistoryLine(history_echo, LLUIColorTable::instance().getColor("IMChatColor"), true, gAgent.getID());
+
+		LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(im_session_id);
+		if (speaker_mgr)
+		{
+			speaker_mgr->speakerChatted(gAgentID);
+			speaker_mgr->setSpeakerTyping(gAgentID, FALSE);
+		}
+	}
+
+	// Add the recipient to the recent people list.
+	LLRecentPeople::instance().add(other_participant_id);
+}
+
+void session_starter_helper(
+	const LLUUID& temp_session_id,
+	const LLUUID& other_participant_id,
+	EInstantMessage im_type)
+{
+	LLMessageSystem *msg = gMessageSystem;
+
+	msg->newMessageFast(_PREHASH_ImprovedInstantMessage);
+	msg->nextBlockFast(_PREHASH_AgentData);
+	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+
+	msg->nextBlockFast(_PREHASH_MessageBlock);
+	msg->addBOOLFast(_PREHASH_FromGroup, FALSE);
+	msg->addUUIDFast(_PREHASH_ToAgentID, other_participant_id);
+	msg->addU8Fast(_PREHASH_Offline, IM_ONLINE);
+	msg->addU8Fast(_PREHASH_Dialog, im_type);
+	msg->addUUIDFast(_PREHASH_ID, temp_session_id);
+	msg->addU32Fast(_PREHASH_Timestamp, NO_TIMESTAMP); // no timestamp necessary
+
+	std::string name;
+	LLAgentUI::buildFullname(name);
+
+	msg->addStringFast(_PREHASH_FromAgentName, name);
+	msg->addStringFast(_PREHASH_Message, LLStringUtil::null);
+	msg->addU32Fast(_PREHASH_ParentEstateID, 0);
+	msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null);
+	msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent());
+}
+
+void start_deprecated_conference_chat(
+	const LLUUID& temp_session_id,
+	const LLUUID& creator_id,
+	const LLUUID& other_participant_id,
+	const LLSD& agents_to_invite)
+{
+	U8* bucket;
+	U8* pos;
+	S32 count;
+	S32 bucket_size;
+
+	// *FIX: this could suffer from endian issues
+	count = agents_to_invite.size();
+	bucket_size = UUID_BYTES * count;
+	bucket = new U8[bucket_size];
+	pos = bucket;
+
+	for(S32 i = 0; i < count; ++i)
+	{
+		LLUUID agent_id = agents_to_invite[i].asUUID();
+		
+		memcpy(pos, &agent_id, UUID_BYTES);
+		pos += UUID_BYTES;
+	}
+
+	session_starter_helper(
+		temp_session_id,
+		other_participant_id,
+		IM_SESSION_CONFERENCE_START);
+
+	gMessageSystem->addBinaryDataFast(
+		_PREHASH_BinaryBucket,
+		bucket,
+		bucket_size);
+
+	gAgent.sendReliableMessage();
+ 
+	delete[] bucket;
+}
+
+class LLStartConferenceChatResponder : public LLHTTPClient::Responder
+{
+public:
+	LLStartConferenceChatResponder(
+		const LLUUID& temp_session_id,
+		const LLUUID& creator_id,
+		const LLUUID& other_participant_id,
+		const LLSD& agents_to_invite)
+	{
+		mTempSessionID = temp_session_id;
+		mCreatorID = creator_id;
+		mOtherParticipantID = other_participant_id;
+		mAgents = agents_to_invite;
+	}
+
+	virtual void error(U32 statusNum, const std::string& reason)
+	{
+		//try an "old school" way.
+		if ( statusNum == 400 )
+		{
+			start_deprecated_conference_chat(
+				mTempSessionID,
+				mCreatorID,
+				mOtherParticipantID,
+				mAgents);
+		}
+
+		//else throw an error back to the client?
+		//in theory we should have just have these error strings
+		//etc. set up in this file as opposed to the IMMgr,
+		//but the error string were unneeded here previously
+		//and it is not worth the effort switching over all
+		//the possible different language translations
+	}
+
+private:
+	LLUUID mTempSessionID;
+	LLUUID mCreatorID;
+	LLUUID mOtherParticipantID;
+
+	LLSD mAgents;
+};
+
+// Returns true if any messages were sent, false otherwise.
+// Is sort of equivalent to "does the server need to do anything?"
+bool LLIMModel::sendStartSession(
+	const LLUUID& temp_session_id,
+	const LLUUID& other_participant_id,
+	const std::vector<LLUUID>& ids,
+	EInstantMessage dialog)
+{
+	if ( dialog == IM_SESSION_GROUP_START )
+	{
+		session_starter_helper(
+			temp_session_id,
+			other_participant_id,
+			dialog);
+		gMessageSystem->addBinaryDataFast(
+				_PREHASH_BinaryBucket,
+				EMPTY_BINARY_BUCKET,
+				EMPTY_BINARY_BUCKET_SIZE);
+		gAgent.sendReliableMessage();
+
+		return true;
+	}
+	else if ( dialog == IM_SESSION_CONFERENCE_START )
+	{
+		LLSD agents;
+		for (int i = 0; i < (S32) ids.size(); i++)
+		{
+			agents.append(ids[i]);
+		}
+
+		//we have a new way of starting conference calls now
+		LLViewerRegion* region = gAgent.getRegion();
+		if (region)
+		{
+			std::string url = region->getCapability(
+				"ChatSessionRequest");
+			LLSD data;
+			data["method"] = "start conference";
+			data["session-id"] = temp_session_id;
+
+			data["params"] = agents;
+
+			LLHTTPClient::post(
+				url,
+				data,
+				new LLStartConferenceChatResponder(
+					temp_session_id,
+					gAgent.getID(),
+					other_participant_id,
+					data["params"]));
+		}
+		else
+		{
+			start_deprecated_conference_chat(
+				temp_session_id,
+				gAgent.getID(),
+				other_participant_id,
+				agents);
+		}
+
+		//we also need to wait for reply from the server in case of ad-hoc chat (we'll get new session id)
+		return true;
+	}
+
+	return false;
+}
+
+// static
+void LLIMModel::sendSessionInitialized(const LLUUID &session_id)
+{
+	LLIMSession* session = getInstance()->findIMSession(session_id);
+	if (session)
+	{
+		LLSD arg;
+		arg["session_id"] = session_id;
+		getInstance()->mSessionInitializedSignal(arg);
+	}
+}
+
+//
+// Helper Functions
+//
+
+class LLViewerChatterBoxInvitationAcceptResponder :
+	public LLHTTPClient::Responder
+{
+public:
+	LLViewerChatterBoxInvitationAcceptResponder(
+		const LLUUID& session_id,
+		LLIMMgr::EInvitationType invitation_type)
+	{
+		mSessionID = session_id;
+		mInvitiationType = invitation_type;
+	}
+
+	void result(const LLSD& content)
+	{
+		if ( gIMMgr)
+		{
+			LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+			if (speaker_mgr)
+			{
+				//we've accepted our invitation
+				//and received a list of agents that were
+				//currently in the session when the reply was sent
+				//to us.  Now, it is possible that there were some agents
+				//to slip in/out between when that message was sent to us
+				//and now.
+
+				//the agent list updates we've received have been
+				//accurate from the time we were added to the session
+				//but unfortunately, our base that we are receiving here
+				//may not be the most up to date.  It was accurate at
+				//some point in time though.
+				speaker_mgr->setSpeakers(content);
+
+				//we now have our base of users in the session
+				//that was accurate at some point, but maybe not now
+				//so now we apply all of the udpates we've received
+				//in case of race conditions
+				speaker_mgr->updateSpeakers(gIMMgr->getPendingAgentListUpdates(mSessionID));
+			}
+
+			if (LLIMMgr::INVITATION_TYPE_VOICE == mInvitiationType)
+			{
+				gIMMgr->startCall(mSessionID);
+			}
+
+			if ((mInvitiationType == LLIMMgr::INVITATION_TYPE_VOICE 
+				|| mInvitiationType == LLIMMgr::INVITATION_TYPE_IMMEDIATE)
+				&& LLIMModel::getInstance()->findIMSession(mSessionID))
+			{
+				// always open IM window when connecting to voice
+				LLIMFloater::show(mSessionID);
+			}
+
+			gIMMgr->clearPendingAgentListUpdates(mSessionID);
+			gIMMgr->clearPendingInvitation(mSessionID);
+		}
+	}
+
+	void error(U32 statusNum, const std::string& reason)
+	{		
+		//throw something back to the viewer here?
+		if ( gIMMgr )
+		{
+			gIMMgr->clearPendingAgentListUpdates(mSessionID);
+			gIMMgr->clearPendingInvitation(mSessionID);
+			if ( 404 == statusNum )
+			{
+				std::string error_string;
+				error_string = "does not exist";
+				gIMMgr->showSessionStartError(error_string, mSessionID);
+			}
+		}
+	}
+
+private:
+	LLUUID mSessionID;
+	LLIMMgr::EInvitationType mInvitiationType;
+};
+
+
+// the other_participant_id is either an agent_id, a group_id, or an inventory
+// folder item_id (collection of calling cards)
+
+// static
+LLUUID LLIMMgr::computeSessionID(
+	EInstantMessage dialog,
+	const LLUUID& other_participant_id)
+{
+	LLUUID session_id;
+	if (IM_SESSION_GROUP_START == dialog)
+	{
+		// slam group session_id to the group_id (other_participant_id)
+		session_id = other_participant_id;
+	}
+	else if (IM_SESSION_CONFERENCE_START == dialog)
+	{
+		session_id.generate();
+	}
+	else if (IM_SESSION_INVITE == dialog)
+	{
+		// use provided session id for invites
+		session_id = other_participant_id;
+	}
+	else
+	{
+		LLUUID agent_id = gAgent.getID();
+		if (other_participant_id == agent_id)
+		{
+			// if we try to send an IM to ourselves then the XOR would be null
+			// so we just make the session_id the same as the agent_id
+			session_id = agent_id;
+		}
+		else
+		{
+			// peer-to-peer or peer-to-asset session_id is the XOR
+			session_id = other_participant_id ^ agent_id;
+		}
+	}
+	return session_id;
+}
+
+inline LLFloater* getFloaterBySessionID(const LLUUID session_id)
+{
+	LLFloater* floater = NULL;
+	if ( gIMMgr )
+	{
+		floater = dynamic_cast < LLFloater* >
+			( gIMMgr->findFloaterBySession(session_id) );
+	}
+	if ( !floater )
+	{
+		floater = dynamic_cast < LLFloater* >
+			( LLIMFloater::findInstance(session_id) );
+	}
+	return floater;
+}
+
+void
+LLIMMgr::showSessionStartError(
+	const std::string& error_string,
+	const LLUUID session_id)
+{
+	const LLFloater* floater = getFloaterBySessionID (session_id);
+	if (!floater) return;
+
+	LLSD args;
+	args["REASON"] = LLTrans::getString(error_string);
+	args["RECIPIENT"] = floater->getTitle();
+
+	LLSD payload;
+	payload["session_id"] = session_id;
+
+	LLNotifications::instance().add(
+		"ChatterBoxSessionStartError",
+		args,
+		payload,
+		LLIMMgr::onConfirmForceCloseError);
+}
+
+void
+LLIMMgr::showSessionEventError(
+	const std::string& event_string,
+	const std::string& error_string,
+	const LLUUID session_id)
+{
+	const LLFloater* floater = getFloaterBySessionID (session_id);
+	if (!floater) return;
+
+	LLSD args;
+	args["REASON"] =
+		LLTrans::getString(error_string);
+	args["EVENT"] =
+		LLTrans::getString(event_string);
+	args["RECIPIENT"] = floater->getTitle();
+
+	LLNotifications::instance().add(
+		"ChatterBoxSessionEventError",
+		args);
+}
+
+void
+LLIMMgr::showSessionForceClose(
+	const std::string& reason_string,
+	const LLUUID session_id)
+{
+	const LLFloater* floater = getFloaterBySessionID (session_id);
+	if (!floater) return;
+
+	LLSD args;
+
+	args["NAME"] = floater->getTitle();
+	args["REASON"] = LLTrans::getString(reason_string);
+
+	LLSD payload;
+	payload["session_id"] = session_id;
+
+	LLNotifications::instance().add(
+		"ForceCloseChatterBoxSession",
+		args,
+		payload,
+		LLIMMgr::onConfirmForceCloseError);
+}
+
+//static
+bool
+LLIMMgr::onConfirmForceCloseError(
+	const LLSD& notification,
+	const LLSD& response)
+{
+	//only 1 option really
+	LLUUID session_id = notification["payload"]["session_id"];
+
+	LLFloater* floater = getFloaterBySessionID (session_id);
+	if ( floater )
+	{
+		floater->closeFloater(FALSE);
+	}
+	return false;
+}
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLOutgoingCallDialog
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LLOutgoingCallDialog::LLOutgoingCallDialog(const LLSD& payload) :
+	LLDockableFloater(NULL, false, payload),
+	mPayload(payload)
+{
+}
+
+void LLOutgoingCallDialog::getAllowedRect(LLRect& rect)
+{
+	rect = gViewerWindow->getWorldViewRectScaled();
+}
+
+void LLOutgoingCallDialog::onOpen(const LLSD& key)
+{
+	// tell the user which voice channel they are leaving
+	if (!mPayload["old_channel_name"].asString().empty())
+	{
+		childSetTextArg("leaving", "[CURRENT_CHAT]", mPayload["old_channel_name"].asString());
+	}
+	else
+	{
+		childSetTextArg("leaving", "[CURRENT_CHAT]", getString("localchat"));
+	}
+
+	std::string callee_name = mPayload["session_name"].asString();
+	if (callee_name == "anonymous")
+	{
+		callee_name = getString("anonymous");
+	}
+	
+	setTitle(callee_name);
+
+	LLSD callee_id = mPayload["other_user_id"];
+	childSetTextArg("calling", "[CALLEE_NAME]", callee_name);
+	childSetTextArg("connecting", "[CALLEE_NAME]", callee_name);
+	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
+	icon->setValue(callee_id);
+}
+
+
+//static
+void LLOutgoingCallDialog::onCancel(void* user_data)
+{
+	LLOutgoingCallDialog* self = (LLOutgoingCallDialog*)user_data;
+
+	if (!gIMMgr)
+		return;
+
+	LLUUID session_id = self->mPayload["session_id"].asUUID();
+	gIMMgr->endCall(session_id);
+	
+	self->closeFloater();
+}
+
+
+BOOL LLOutgoingCallDialog::postBuild()
+{
+	BOOL success = LLDockableFloater::postBuild();
+
+	childSetAction("Cancel", onCancel, this);
+
+	// dock the dialog to the sys well, where other sys messages appear
+	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
+					 this, getDockTongue(), LLDockControl::TOP,
+					 boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1)));
+
+	return success;
+}
+
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLIncomingCallDialog
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LLIncomingCallDialog::LLIncomingCallDialog(const LLSD& payload) :
+	LLDockableFloater(NULL, false, payload),
+	mPayload(payload)
+{
+}
+
+BOOL LLIncomingCallDialog::postBuild()
+{
+	LLDockableFloater::postBuild();
+
+	LLSD caller_id = mPayload["caller_id"];
+	EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
+
+	std::string call_type = getString("VoiceInviteP2P");
+	std::string caller_name = mPayload["caller_name"].asString();
+	if (caller_name == "anonymous")
+	{
+		caller_name = getString("anonymous");
+	}
+	
+	setTitle(caller_name + " " + call_type);
+	
+	// If it is not a P2P invite, then it's an AdHoc invite
+	if ( type != IM_SESSION_P2P_INVITE )
+	{
+		call_type = getString("VoiceInviteAdHoc");
+	}
+
+	// check to see if this is an Avaline call
+	LLUUID session_id = mPayload["session_id"].asUUID();
+	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
+	childSetVisible("Start IM", is_avatar); // no IM for avaline
+
+	LLUICtrl* caller_name_widget = getChild<LLUICtrl>("caller name");
+	caller_name_widget->setValue(caller_name + " " + call_type);
+	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
+	icon->setValue(caller_id);
+
+	childSetAction("Accept", onAccept, this);
+	childSetAction("Reject", onReject, this);
+	childSetAction("Start IM", onStartIM, this);
+	childSetFocus("Accept");
+
+	return TRUE;
+}
+
+void LLIncomingCallDialog::getAllowedRect(LLRect& rect)
+{
+	rect = gViewerWindow->getWorldViewRectScaled();
+}
+
+void LLIncomingCallDialog::onOpen(const LLSD& key)
+{
+	// tell the user which voice channel they would be leaving
+	LLVoiceChannel *voice = LLVoiceChannel::getCurrentVoiceChannel();
+	if (voice && !voice->getSessionName().empty())
+	{
+		childSetTextArg("question", "[CURRENT_CHAT]", voice->getSessionName());
+	}
+	else
+	{
+		childSetTextArg("question", "[CURRENT_CHAT]", getString("localchat"));
+	}
+
+	// dock the dialog to the sys well, where other sys messages appear
+	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
+									 this, getDockTongue(), LLDockControl::TOP,
+									 boost::bind(&LLIncomingCallDialog::getAllowedRect, this, _1)));
+}
+
+//static
+void LLIncomingCallDialog::onAccept(void* user_data)
+{
+	LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data;
+	self->processCallResponse(0);
+	self->closeFloater();
+}
+
+//static
+void LLIncomingCallDialog::onReject(void* user_data)
+{
+	LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data;
+	self->processCallResponse(1);
+	self->closeFloater();
+}
+
+//static
+void LLIncomingCallDialog::onStartIM(void* user_data)
+{
+	LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data;
+	self->processCallResponse(2);
+	self->closeFloater();
+}
+
+void LLIncomingCallDialog::processCallResponse(S32 response)
+{
+	if (!gIMMgr)
+		return;
+
+	LLUUID session_id = mPayload["session_id"].asUUID();
+	EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
+	LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)mPayload["inv_type"].asInteger();
+	bool voice = true;
+	switch(response)
+	{
+	case 2: // start IM: just don't start the voice chat
+	{
+		voice = false;
+		/* FALLTHROUGH */
+	}
+	case 0: // accept
+	{
+		if (type == IM_SESSION_P2P_INVITE)
+		{
+			// create a normal IM session
+			session_id = gIMMgr->addP2PSession(
+				mPayload["session_name"].asString(),
+				mPayload["caller_id"].asUUID(),
+				mPayload["session_handle"].asString());
+
+			if (voice)
+			{
+				if (gIMMgr->startCall(session_id))
+				{
+					// always open IM window when connecting to voice
+					LLIMFloater::show(session_id);
+				}
+			}
+
+			gIMMgr->clearPendingAgentListUpdates(session_id);
+			gIMMgr->clearPendingInvitation(session_id);
+		}
+		else
+		{
+			LLUUID session_id = gIMMgr->addSession(
+				mPayload["session_name"].asString(),
+				type,
+				session_id);
+			if (session_id != LLUUID::null)
+			{
+				LLIMFloater::show(session_id);
+			}
+
+			std::string url = gAgent.getRegion()->getCapability(
+				"ChatSessionRequest");
+
+			if (voice)
+			{
+				LLSD data;
+				data["method"] = "accept invitation";
+				data["session-id"] = session_id;
+				LLHTTPClient::post(
+					url,
+					data,
+					new LLViewerChatterBoxInvitationAcceptResponder(
+						session_id,
+						inv_type));
+			}
+		}
+		if (voice)
+		{
+			break;
+		}
+	}
+	case 1: // decline
+	{
+		if (type == IM_SESSION_P2P_INVITE)
+		{
+			if(gVoiceClient)
+			{
+				std::string s = mPayload["session_handle"].asString();
+				gVoiceClient->declineInvite(s);
+			}
+		}
+		else
+		{
+			std::string url = gAgent.getRegion()->getCapability(
+				"ChatSessionRequest");
+
+			LLSD data;
+			data["method"] = "decline invitation";
+			data["session-id"] = session_id;
+			LLHTTPClient::post(
+				url,
+				data,
+				NULL);
+		}
+	}
+
+	gIMMgr->clearPendingAgentListUpdates(session_id);
+	gIMMgr->clearPendingInvitation(session_id);
+	}
+}
+
+bool inviteUserResponse(const LLSD& notification, const LLSD& response)
+{
+	if (!gIMMgr)
+		return false;
+
+	const LLSD& payload = notification["payload"];
+	LLUUID session_id = payload["session_id"].asUUID();
+	EInstantMessage type = (EInstantMessage)payload["type"].asInteger();
+	LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)payload["inv_type"].asInteger();
+	S32 option = LLNotification::getSelectedOption(notification, response);
+	switch(option) 
+	{
+	case 0: // accept
+		{
+			if (type == IM_SESSION_P2P_INVITE)
+			{
+				// create a normal IM session
+				session_id = gIMMgr->addP2PSession(
+					payload["session_name"].asString(),
+					payload["caller_id"].asUUID(),
+					payload["session_handle"].asString(),
+					payload["session_uri"].asString());
+
+				if (gIMMgr->startCall(session_id))
+				{
+					// always open IM window when connecting to voice
+					LLIMFloater::show(session_id);
+				}
+
+				gIMMgr->clearPendingAgentListUpdates(session_id);
+				gIMMgr->clearPendingInvitation(session_id);
+			}
+			else
+			{
+				LLUUID session_id = gIMMgr->addSession(
+					payload["session_name"].asString(),
+					type,
+					session_id);
+				if (session_id != LLUUID::null)
+				{
+					LLIMFloater::show(session_id);
+				}
+
+				std::string url = gAgent.getRegion()->getCapability(
+					"ChatSessionRequest");
+
+				LLSD data;
+				data["method"] = "accept invitation";
+				data["session-id"] = session_id;
+				LLHTTPClient::post(
+					url,
+					data,
+					new LLViewerChatterBoxInvitationAcceptResponder(
+						session_id,
+						inv_type));
+			}
+		}
+		break;
+	case 2: // mute (also implies ignore, so this falls through to the "ignore" case below)
+	{
+		// mute the sender of this invite
+		if (!LLMuteList::getInstance()->isMuted(payload["caller_id"].asUUID()))
+		{
+			LLMute mute(payload["caller_id"].asUUID(), payload["caller_name"].asString(), LLMute::AGENT);
+			LLMuteList::getInstance()->add(mute);
+		}
+	}
+	/* FALLTHROUGH */
+	
+	case 1: // decline
+	{
+		if (type == IM_SESSION_P2P_INVITE)
+		{
+			if(gVoiceClient)
+			{
+				std::string s = payload["session_handle"].asString();
+				gVoiceClient->declineInvite(s);
+			}
+		}
+		else
+		{
+			std::string url = gAgent.getRegion()->getCapability(
+				"ChatSessionRequest");
+
+			LLSD data;
+			data["method"] = "decline invitation";
+			data["session-id"] = session_id;
+			LLHTTPClient::post(
+				url,
+				data,
+				NULL);				
+		}
+	}
+
+	gIMMgr->clearPendingAgentListUpdates(session_id);
+	gIMMgr->clearPendingInvitation(session_id);
+	break;
+	}
+	
+	return false;
+}
+
+//
+// Member Functions
+//
+
+LLIMMgr::LLIMMgr() :
+	mIMReceived(FALSE)
+{
+	mPendingInvitations = LLSD::emptyMap();
+	mPendingAgentListUpdates = LLSD::emptyMap();
+}
+
+// Add a message to a session. 
+void LLIMMgr::addMessage(
+	const LLUUID& session_id,
+	const LLUUID& target_id,
+	const std::string& from,
+	const std::string& msg,
+	const std::string& session_name,
+	EInstantMessage dialog,
+	U32 parent_estate_id,
+	const LLUUID& region_id,
+	const LLVector3& position,
+	bool link_name) // If this is true, then we insert the name and link it to a profile
+{
+	LLUUID other_participant_id = target_id;
+
+	// don't process muted IMs
+	if (LLMuteList::getInstance()->isMuted(
+			other_participant_id,
+			LLMute::flagTextChat) && !LLMuteList::getInstance()->isLinden(from))
+	{
+		return;
+	}
+
+	LLFloaterIMPanel* floater;
+	LLUUID new_session_id = session_id;
+	if (new_session_id.isNull())
+	{
+		//no session ID...compute new one
+		new_session_id = computeSessionID(dialog, other_participant_id);
+	}
+
+	//*NOTE session_name is empty in case of incoming P2P sessions
+	std::string fixed_session_name = from;
+	if(!session_name.empty() && session_name.size()>1)
+	{
+		fixed_session_name = session_name;
+	}
+
+	bool new_session = !hasSession(new_session_id);
+	if (new_session)
+	{
+		LLIMModel::getInstance()->newSession(new_session_id, fixed_session_name, dialog, other_participant_id);
+	}
+
+	floater = findFloaterBySession(new_session_id);
+	if (!floater)
+	{
+		floater = findFloaterBySession(other_participant_id);
+		if (floater)
+		{
+			llinfos << "found the IM session " << session_id 
+				<< " by participant " << other_participant_id << llendl;
+		}
+	}
+
+	// create IM window as necessary
+	if(!floater)
+	{
+		floater = createFloater(
+			new_session_id,
+			other_participant_id,
+			fixed_session_name,
+			dialog,
+			FALSE);
+	}
+
+	if (new_session)
+	{
+		// When we get a new IM, and if you are a god, display a bit
+		// of information about the source. This is to help liaisons
+		// when answering questions.
+		if(gAgent.isGodlike())
+		{
+			// *TODO:translate (low priority, god ability)
+			std::ostringstream bonus_info;
+			bonus_info << LLTrans::getString("***")+ " "+ LLTrans::getString("IMParentEstate") + ":" + " "
+				<< parent_estate_id
+				<< ((parent_estate_id == 1) ? "," + LLTrans::getString("IMMainland") : "")
+				<< ((parent_estate_id == 5) ? "," + LLTrans::getString ("IMTeen") : "");
+
+			// once we have web-services (or something) which returns
+			// information about a region id, we can print this out
+			// and even have it link to map-teleport or something.
+			//<< "*** region_id: " << region_id << std::endl
+			//<< "*** position: " << position << std::endl;
+
+			floater->addHistoryLine(bonus_info.str(), LLUIColorTable::instance().getColor("SystemChatColor"));
+			LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, bonus_info.str());
+		}
+
+		make_ui_sound("UISndNewIncomingIMSession");
+	}
+
+	// now add message to floater
+	bool is_from_system = target_id.isNull() || (from == SYSTEM_FROM);
+	const LLColor4& color = ( is_from_system ? 
+							  LLUIColorTable::instance().getColor("SystemChatColor") : 
+							  LLUIColorTable::instance().getColor("IMChatColor"));
+	if ( !link_name )
+	{
+		floater->addHistoryLine(msg,color); // No name to prepend, so just add the message normally
+	}
+	else
+	{
+		floater->addHistoryLine(msg, color, true, other_participant_id, from); // Insert linked name to front of message
+	}
+
+	LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg);
+
+	if( !LLFloaterReg::instanceVisible("communicate") && !floater->getVisible())
+	{
+		LLFloaterChatterBox* chat_floater = LLFloaterChatterBox::getInstance();
+		
+		//if the IM window is not open and the floater is not visible (i.e. not torn off)
+		LLFloater* previouslyActiveFloater = chat_floater->getActiveFloater();
+
+		// select the newly added floater (or the floater with the new line added to it).
+		// it should be there.
+		chat_floater->selectFloater(floater);
+
+		//there was a previously unseen IM, make that old tab flashing
+		//it is assumed that the most recently unseen IM tab is the one current selected/active
+		if ( previouslyActiveFloater && getIMReceived() )
+		{
+			chat_floater->setFloaterFlashing(previouslyActiveFloater, TRUE);
+		}
+
+		//notify of a new IM
+		notifyNewIM();
+	}
+}
+
+void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& message_name, const LLSD& args)
+{
+	LLUIString message;
+	
+	// null session id means near me (chat history)
+	if (session_id.isNull())
+	{
+		message = LLTrans::getString(message_name);
+		message.setArgs(args);
+
+		LLChat chat(message);
+		chat.mSourceType = CHAT_SOURCE_SYSTEM;
+		LLFloaterChat::addChatHistory(chat);
+	}
+	else // going to IM session
+	{
+		if (hasSession(session_id))
+		{
+			message = LLTrans::getString(message_name + "-im");
+			message.setArgs(args);
+			gIMMgr->addMessage(session_id, LLUUID::null, SYSTEM_FROM, message.getString());
+		}
+	}
+}
+
+void LLIMMgr::notifyNewIM()
+{
+	if(!LLFloaterReg::instanceVisible("communicate"))
+	{
+		mIMReceived = TRUE;
+	}
+}
+
+S32 LLIMMgr::getNumberOfUnreadIM()
+{
+	std::map<LLUUID, LLIMModel::LLIMSession*>::iterator it;
+	
+	S32 num = 0;
+	for(it = LLIMModel::getInstance()->mId2SessionMap.begin(); it != LLIMModel::getInstance()->mId2SessionMap.end(); ++it)
+	{
+		num += (*it).second->mNumUnread;
+	}
+
+	return num;
+}
+
+void LLIMMgr::clearNewIMNotification()
+{
+	mIMReceived = FALSE;
+}
+
+BOOL LLIMMgr::getIMReceived() const
+{
+	return mIMReceived;
+}
+
+LLUUID LLIMMgr::addP2PSession(const std::string& name,
+							const LLUUID& other_participant_id,
+							const std::string& voice_session_handle,
+							const std::string& caller_uri)
+{
+	LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id);
+	if (session_id != LLUUID::null)
+	{
+		LLIMFloater::show(session_id);
+	}
+
+	LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
+	if (speaker_mgr)
+	{
+		LLVoiceChannelP2P* voice_channel = dynamic_cast<LLVoiceChannelP2P*>(speaker_mgr->getVoiceChannel());
+		if (voice_channel)
+		{
+			voice_channel->setSessionHandle(voice_session_handle, caller_uri);
+		}
+	}
+	return session_id;
+}
+
+// This adds a session to the talk view. The name is the local name of
+// the session, dialog specifies the type of session. If the session
+// exists, it is brought forward.  Specifying id = NULL results in an
+// im session to everyone. Returns the uuid of the session.
+LLUUID LLIMMgr::addSession(
+	const std::string& name,
+	EInstantMessage dialog,
+	const LLUUID& other_participant_id)
+{
+	LLDynamicArray<LLUUID> ids;
+	ids.put(other_participant_id);
+	return addSession(name, dialog, other_participant_id, ids);
+}
+
+// Adds a session using the given session_id.  If the session already exists 
+// the dialog type is assumed correct. Returns the uuid of the session.
+LLUUID LLIMMgr::addSession(
+	const std::string& name,
+	EInstantMessage dialog,
+	const LLUUID& other_participant_id,
+	const LLDynamicArray<LLUUID>& ids)
+{
+	if (0 == ids.getLength())
+	{
+		return LLUUID::null;
+	}
+
+	LLUUID session_id = computeSessionID(dialog,other_participant_id);
+
+	bool new_session = !LLIMModel::getInstance()->findIMSession(session_id);
+
+	if (new_session)
+	{
+		LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids);
+	}
+
+
+	//*TODO remove this "floater" thing when Communicate Floater's gone
+	LLFloaterIMPanel* floater = findFloaterBySession(session_id);
+	if(!floater)
+	{
+		// On creation, use the first element of ids as the
+		// "other_participant_id"
+		floater = createFloater(
+			session_id,
+			other_participant_id,
+			name,
+			dialog,
+			TRUE,
+			ids);
+	}
+
+	//we don't need to show notes about online/offline, mute/unmute users' statuses for existing sessions
+	if (!new_session) return session_id;
+	
+	noteOfflineUsers(session_id, floater, ids);
+
+	// Only warn for regular IMs - not group IMs
+	if( dialog == IM_NOTHING_SPECIAL )
+	{
+		noteMutedUsers(session_id, floater, ids);
+	}
+
+	return session_id;
+}
+
+bool LLIMMgr::leaveSession(const LLUUID& session_id)
+{
+	LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id);
+	if (!im_session) return false;
+
+	LLIMModel::getInstance()->sendLeaveSession(session_id, im_session->mOtherParticipantID);
+	gIMMgr->removeSession(session_id);
+	return true;
+}
+
+// Removes data associated with a particular session specified by session_id
+void LLIMMgr::removeSession(const LLUUID& session_id)
+{
+	llassert_always(hasSession(session_id));
+	
+	//*TODO remove this floater thing when Communicate Floater is being deleted (IB)
+	LLFloaterIMPanel* floater = findFloaterBySession(session_id);
+	if(floater)
+	{
+		mFloaters.erase(floater->getHandle());
+		LLFloaterChatterBox::getInstance()->removeFloater(floater);
+	}
+
+	clearPendingInvitation(session_id);
+	clearPendingAgentListUpdates(session_id);
+
+	LLIMModel::getInstance()->clearSession(session_id);
+
+	notifyObserverSessionRemoved(session_id);
+}
+
+void LLIMMgr::inviteToSession(
+	const LLUUID& session_id, 
+	const std::string& session_name, 
+	const LLUUID& caller_id, 
+	const std::string& caller_name,
+	EInstantMessage type,
+	EInvitationType inv_type,
+	const std::string& session_handle,
+	const std::string& session_uri)
+{
+	//ignore invites from muted residents
+	if (LLMuteList::getInstance()->isMuted(caller_id))
+	{
+		return;
+	}
+
+	std::string notify_box_type;
+
+	BOOL ad_hoc_invite = FALSE;
+	if(type == IM_SESSION_P2P_INVITE)
+	{
+		//P2P is different...they only have voice invitations
+		notify_box_type = "VoiceInviteP2P";
+	}
+	else if ( gAgent.isInGroup(session_id) )
+	{
+		//only really old school groups have voice invitations
+		notify_box_type = "VoiceInviteGroup";
+	}
+	else if ( inv_type == INVITATION_TYPE_VOICE )
+	{
+		//else it's an ad-hoc
+		//and a voice ad-hoc
+		notify_box_type = "VoiceInviteAdHoc";
+		ad_hoc_invite = TRUE;
+	}
+	else if ( inv_type == INVITATION_TYPE_IMMEDIATE )
+	{
+		notify_box_type = "InviteAdHoc";
+		ad_hoc_invite = TRUE;
+	}
+
+	LLSD payload;
+	payload["session_id"] = session_id;
+	payload["session_name"] = session_name;
+	payload["caller_id"] = caller_id;
+	payload["caller_name"] = caller_name;
+	payload["type"] = type;
+	payload["inv_type"] = inv_type;
+	payload["session_handle"] = session_handle;
+	payload["session_uri"] = session_uri;
+	payload["notify_box_type"] = notify_box_type;
+	
+	LLVoiceChannel* channelp = LLVoiceChannel::getChannelByID(session_id);
+	if (channelp && channelp->callStarted())
+	{
+		// you have already started a call to the other user, so just accept the invite
+		LLNotifications::instance().forceResponse(LLNotification::Params("VoiceInviteP2P").payload(payload), 0);
+		return;
+	}
+
+	if (type == IM_SESSION_P2P_INVITE || ad_hoc_invite)
+	{
+		// is the inviter a friend?
+		if (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL)
+		{
+			// if not, and we are ignoring voice invites from non-friends
+			// then silently decline
+			if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly"))
+			{
+				// invite not from a friend, so decline
+				LLNotifications::instance().forceResponse(LLNotification::Params("VoiceInviteP2P").payload(payload), 1);
+				return;
+			}
+		}
+	}
+
+	if ( !mPendingInvitations.has(session_id.asString()) )
+	{
+		if (caller_name.empty())
+		{
+			gCacheName->get(caller_id, FALSE, boost::bind(&LLIMMgr::onInviteNameLookup, payload, _1, _2, _3, _4));
+		}
+		else
+		{
+			if (notify_box_type == "VoiceInviteP2P" || notify_box_type == "VoiceInviteAdHoc")
+			{
+				LLFloaterReg::showInstance("incoming_call", payload, TRUE);
+			}
+			else
+			{
+				LLSD args;
+				args["NAME"] = caller_name;
+				args["GROUP"] = session_name;
+
+				LLNotifications::instance().add(notify_box_type, args, payload, &inviteUserResponse);
+			}
+		}
+		mPendingInvitations[session_id.asString()] = LLSD();
+	}
+}
+
+void LLIMMgr::onInviteNameLookup(LLSD payload, const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group)
+{
+	payload["caller_name"] = first + " " + last;
+	payload["session_name"] = payload["caller_name"].asString();
+
+	std::string notify_box_type = payload["notify_box_type"].asString();
+
+	if (notify_box_type == "VoiceInviteP2P" || notify_box_type == "VoiceInviteAdHoc")
+	{
+		LLFloaterReg::showInstance("incoming_call", payload, TRUE);
+	}
+	else
+	{
+		LLSD args;
+		args["NAME"] = payload["caller_name"].asString();
+	
+		LLNotifications::instance().add(
+			payload["notify_box_type"].asString(),
+			args, 
+			payload,
+			&inviteUserResponse);
+	}
+}
+
+void LLIMMgr::disconnectAllSessions()
+{
+	LLFloaterIMPanel* floater = NULL;
+	std::set<LLHandle<LLFloater> >::iterator handle_it;
+	for(handle_it = mFloaters.begin();
+		handle_it != mFloaters.end();
+		)
+	{
+		floater = (LLFloaterIMPanel*)handle_it->get();
+
+		// MUST do this BEFORE calling floater->onClose() because that may remove the item from the set, causing the subsequent increment to crash.
+		++handle_it;
+
+		if (floater)
+		{
+			floater->setEnabled(FALSE);
+			floater->closeFloater(TRUE);
+		}
+	}
+}
+
+
+// This method returns the im panel corresponding to the uuid
+// provided. The uuid can either be a session id or an agent
+// id. Returns NULL if there is no matching panel.
+LLFloaterIMPanel* LLIMMgr::findFloaterBySession(const LLUUID& session_id)
+{
+	LLFloaterIMPanel* rv = NULL;
+	std::set<LLHandle<LLFloater> >::iterator handle_it;
+	for(handle_it = mFloaters.begin();
+		handle_it != mFloaters.end();
+		++handle_it)
+	{
+		rv = (LLFloaterIMPanel*)handle_it->get();
+		if(rv && session_id == rv->getSessionID())
+		{
+			break;
+		}
+		rv = NULL;
+	}
+	return rv;
+}
+
+
+BOOL LLIMMgr::hasSession(const LLUUID& session_id)
+{
+	return LLIMModel::getInstance()->findIMSession(session_id) != NULL;
+}
+
+void LLIMMgr::clearPendingInvitation(const LLUUID& session_id)
+{
+	if ( mPendingInvitations.has(session_id.asString()) )
+	{
+		mPendingInvitations.erase(session_id.asString());
+	}
+}
+
+void LLIMMgr::processAgentListUpdates(const LLUUID& session_id, const LLSD& body)
+{
+	LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+	if ( im_floater )
+	{
+		im_floater->processAgentListUpdates(body);
+	}
+	LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
+	if (speaker_mgr)
+	{
+		speaker_mgr->updateSpeakers(body);
+	}
+	else
+	{
+		//we don't have a speaker manager yet..something went wrong
+		//we are probably receiving an update here before
+		//a start or an acceptance of an invitation.  Race condition.
+		gIMMgr->addPendingAgentListUpdates(
+			session_id,
+			body);
+	}
+}
+
+LLSD LLIMMgr::getPendingAgentListUpdates(const LLUUID& session_id)
+{
+	if ( mPendingAgentListUpdates.has(session_id.asString()) )
+	{
+		return mPendingAgentListUpdates[session_id.asString()];
+	}
+	else
+	{
+		return LLSD();
+	}
+}
+
+void LLIMMgr::addPendingAgentListUpdates(
+	const LLUUID& session_id,
+	const LLSD& updates)
+{
+	LLSD::map_const_iterator iter;
+
+	if ( !mPendingAgentListUpdates.has(session_id.asString()) )
+	{
+		//this is a new agent list update for this session
+		mPendingAgentListUpdates[session_id.asString()] = LLSD::emptyMap();
+	}
+
+	if (
+		updates.has("agent_updates") &&
+		updates["agent_updates"].isMap() &&
+		updates.has("updates") &&
+		updates["updates"].isMap() )
+	{
+		//new school update
+		LLSD update_types = LLSD::emptyArray();
+		LLSD::array_iterator array_iter;
+
+		update_types.append("agent_updates");
+		update_types.append("updates");
+
+		for (
+			array_iter = update_types.beginArray();
+			array_iter != update_types.endArray();
+			++array_iter)
+		{
+			//we only want to include the last update for a given agent
+			for (
+				iter = updates[array_iter->asString()].beginMap();
+				iter != updates[array_iter->asString()].endMap();
+				++iter)
+			{
+				mPendingAgentListUpdates[session_id.asString()][array_iter->asString()][iter->first] =
+					iter->second;
+			}
+		}
+	}
+	else if (
+		updates.has("updates") &&
+		updates["updates"].isMap() )
+	{
+		//old school update where the SD contained just mappings
+		//of agent_id -> "LEAVE"/"ENTER"
+
+		//only want to keep last update for each agent
+		for (
+			iter = updates["updates"].beginMap();
+			iter != updates["updates"].endMap();
+			++iter)
+		{
+			mPendingAgentListUpdates[session_id.asString()]["updates"][iter->first] =
+				iter->second;
+		}
+	}
+}
+
+void LLIMMgr::clearPendingAgentListUpdates(const LLUUID& session_id)
+{
+	if ( mPendingAgentListUpdates.has(session_id.asString()) )
+	{
+		mPendingAgentListUpdates.erase(session_id.asString());
+	}
+}
+
+void LLIMMgr::notifyObserverSessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
+{
+	for (session_observers_list_t::iterator it = mSessionObservers.begin(); it != mSessionObservers.end(); it++)
+	{
+		(*it)->sessionAdded(session_id, name, other_participant_id);
+	}
+}
+
+void LLIMMgr::notifyObserverSessionRemoved(const LLUUID& session_id)
+{
+	for (session_observers_list_t::iterator it = mSessionObservers.begin(); it != mSessionObservers.end(); it++)
+	{
+		(*it)->sessionRemoved(session_id);
+	}
+}
+
+void LLIMMgr::notifyObserverSessionIDUpdated( const LLUUID& old_session_id, const LLUUID& new_session_id )
+{
+	for (session_observers_list_t::iterator it = mSessionObservers.begin(); it != mSessionObservers.end(); it++)
+	{
+		(*it)->sessionIDUpdated(old_session_id, new_session_id);
+	}
+
+}
+
+void LLIMMgr::addSessionObserver(LLIMSessionObserver *observer)
+{
+	mSessionObservers.push_back(observer);
+}
+
+void LLIMMgr::removeSessionObserver(LLIMSessionObserver *observer)
+{
+	mSessionObservers.remove(observer);
+}
+
+bool LLIMMgr::startCall(const LLUUID& session_id)
+{
+	LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(session_id);
+	if (!voice_channel) return false;
+	
+	voice_channel->activate();
+	return true;
+}
+
+bool LLIMMgr::endCall(const LLUUID& session_id)
+{
+	LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(session_id);
+	if (!voice_channel) return false;
+
+	voice_channel->deactivate();
+	return true;
+}
+
+// create a floater and update internal representation for
+// consistency. Returns the pointer, caller (the class instance since
+// it is a private method) is not responsible for deleting the
+// pointer.  Add the floater to this but do not select it.
+LLFloaterIMPanel* LLIMMgr::createFloater(
+	const LLUUID& session_id,
+	const LLUUID& other_participant_id,
+	const std::string& session_label,
+	EInstantMessage dialog,
+	BOOL user_initiated,
+	const LLDynamicArray<LLUUID>& ids)
+{
+	if (session_id.isNull())
+	{
+		llwarns << "Creating LLFloaterIMPanel with null session ID" << llendl;
+	}
+
+	llinfos << "LLIMMgr::createFloater: from " << other_participant_id 
+			<< " in session " << session_id << llendl;
+	LLFloaterIMPanel* floater = new LLFloaterIMPanel(session_label,
+													 session_id,
+													 other_participant_id,
+													 ids,
+													 dialog);
+	LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END;
+	LLFloaterChatterBox::getInstance()->addFloater(floater, FALSE, i_pt);
+	mFloaters.insert(floater->getHandle());
+	return floater;
+}
+
+void LLIMMgr::noteOfflineUsers(
+	const LLUUID& session_id,
+	LLFloaterIMPanel* floater,
+	const LLDynamicArray<LLUUID>& ids)
+{
+	S32 count = ids.count();
+	if(count == 0)
+	{
+		const std::string& only_user = LLTrans::getString("only_user_message");
+		if (floater)
+		{
+			floater->addHistoryLine(only_user, LLUIColorTable::instance().getColor("SystemChatColor"));
+		}
+		LLIMModel::getInstance()->addMessage(session_id, SYSTEM_FROM, LLUUID::null, only_user);
+	}
+	else
+	{
+		const LLRelationship* info = NULL;
+		LLAvatarTracker& at = LLAvatarTracker::instance();
+		LLIMModel& im_model = LLIMModel::instance();
+		for(S32 i = 0; i < count; ++i)
+		{
+			info = at.getBuddyInfo(ids.get(i));
+			std::string first, last;
+			if(info && !info->isOnline()
+			   && gCacheName->getName(ids.get(i), first, last))
+			{
+				LLUIString offline = LLTrans::getString("offline_message");
+				offline.setArg("[FIRST]", first);
+				offline.setArg("[LAST]", last);
+				im_model.proccessOnlineOfflineNotification(session_id, offline);
+			}
+		}
+	}
+}
+
+void LLIMMgr::noteMutedUsers(const LLUUID& session_id, LLFloaterIMPanel* floater,
+								  const LLDynamicArray<LLUUID>& ids)
+{
+	// Don't do this if we don't have a mute list.
+	LLMuteList *ml = LLMuteList::getInstance();
+	if( !ml )
+	{
+		return;
+	}
+
+	S32 count = ids.count();
+	if(count > 0)
+	{
+		LLIMModel* im_model = LLIMModel::getInstance();
+		
+		for(S32 i = 0; i < count; ++i)
+		{
+			if( ml->isMuted(ids.get(i)) )
+			{
+				LLUIString muted = LLTrans::getString("muted_message");
+
+				//*TODO remove this "floater" thing when Communicate Floater's gone
+				floater->addHistoryLine(muted);
+
+				im_model->addMessage(session_id, SYSTEM_FROM, LLUUID::null, muted);
+				break;
+			}
+		}
+	}
+}
+
+void LLIMMgr::processIMTypingStart(const LLIMInfo* im_info)
+{
+	processIMTypingCore(im_info, TRUE);
+}
+
+void LLIMMgr::processIMTypingStop(const LLIMInfo* im_info)
+{
+	processIMTypingCore(im_info, FALSE);
+}
+
+void LLIMMgr::processIMTypingCore(const LLIMInfo* im_info, BOOL typing)
+{
+	LLUUID session_id = computeSessionID(im_info->mIMType, im_info->mFromID);
+	LLFloaterIMPanel* floater = findFloaterBySession(session_id);
+	if (floater)
+	{
+		floater->processIMTyping(im_info, typing);
+	}
+
+	LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+	if ( im_floater )
+	{
+		im_floater->processIMTyping(im_info, typing);
+	}
+}
+
+class LLViewerChatterBoxSessionStartReply : public LLHTTPNode
+{
+public:
+	virtual void describe(Description& desc) const
+	{
+		desc.shortInfo("Used for receiving a reply to a request to initialize an ChatterBox session");
+		desc.postAPI();
+		desc.input(
+			"{\"client_session_id\": UUID, \"session_id\": UUID, \"success\" boolean, \"reason\": string");
+		desc.source(__FILE__, __LINE__);
+	}
+
+	virtual void post(ResponsePtr response,
+					  const LLSD& context,
+					  const LLSD& input) const
+	{
+		LLSD body;
+		LLUUID temp_session_id;
+		LLUUID session_id;
+		bool success;
+
+		body = input["body"];
+		success = body["success"].asBoolean();
+		temp_session_id = body["temp_session_id"].asUUID();
+
+		if ( success )
+		{
+			session_id = body["session_id"].asUUID();
+
+			LLIMModel::getInstance()->processSessionInitializedReply(temp_session_id, session_id);
+
+			LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
+			if (speaker_mgr)
+			{
+				speaker_mgr->setSpeakers(body);
+				speaker_mgr->updateSpeakers(gIMMgr->getPendingAgentListUpdates(session_id));
+			}
+
+			LLFloaterIMPanel* floaterp = gIMMgr->findFloaterBySession(session_id);
+			if (floaterp)
+			{
+				if ( body.has("session_info") )
+				{
+					floaterp->processSessionUpdate(body["session_info"]);
+				}
+			}
+
+			LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+			if ( im_floater )
+			{
+				if ( body.has("session_info") )
+				{
+					im_floater->processSessionUpdate(body["session_info"]);
+				}
+			}
+
+			gIMMgr->clearPendingAgentListUpdates(session_id);
+		}
+		else
+		{
+			//throw an error dialog and close the temp session's floater
+			gIMMgr->showSessionStartError(body["error"].asString(), temp_session_id);
+		}
+
+		gIMMgr->clearPendingAgentListUpdates(session_id);
+	}
+};
+
+class LLViewerChatterBoxSessionEventReply : public LLHTTPNode
+{
+public:
+	virtual void describe(Description& desc) const
+	{
+		desc.shortInfo("Used for receiving a reply to a ChatterBox session event");
+		desc.postAPI();
+		desc.input(
+			"{\"event\": string, \"reason\": string, \"success\": boolean, \"session_id\": UUID");
+		desc.source(__FILE__, __LINE__);
+	}
+
+	virtual void post(ResponsePtr response,
+					  const LLSD& context,
+					  const LLSD& input) const
+	{
+		LLUUID session_id;
+		bool success;
+
+		LLSD body = input["body"];
+		success = body["success"].asBoolean();
+		session_id = body["session_id"].asUUID();
+
+		if ( !success )
+		{
+			//throw an error dialog
+			gIMMgr->showSessionEventError(
+				body["event"].asString(),
+				body["error"].asString(),
+				session_id);
+		}
+	}
+};
+
+class LLViewerForceCloseChatterBoxSession: public LLHTTPNode
+{
+public:
+	virtual void post(ResponsePtr response,
+					  const LLSD& context,
+					  const LLSD& input) const
+	{
+		LLUUID session_id;
+		std::string reason;
+
+		session_id = input["body"]["session_id"].asUUID();
+		reason = input["body"]["reason"].asString();
+
+		gIMMgr->showSessionForceClose(reason, session_id);
+	}
+};
+
+class LLViewerChatterBoxSessionAgentListUpdates : public LLHTTPNode
+{
+public:
+	virtual void post(
+		ResponsePtr responder,
+		const LLSD& context,
+		const LLSD& input) const
+	{
+		const LLUUID& session_id = input["body"]["session_id"].asUUID();
+		gIMMgr->processAgentListUpdates(session_id, input["body"]);
+	}
+};
+
+class LLViewerChatterBoxSessionUpdate : public LLHTTPNode
+{
+public:
+	virtual void post(
+		ResponsePtr responder,
+		const LLSD& context,
+		const LLSD& input) const
+	{
+		LLUUID session_id = input["body"]["session_id"].asUUID();
+		LLFloaterIMPanel* floaterp = gIMMgr->findFloaterBySession(session_id);
+		if (floaterp)
+		{
+			floaterp->processSessionUpdate(input["body"]["info"]);
+		}
+		LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+		if ( im_floater )
+		{
+			im_floater->processSessionUpdate(input["body"]["info"]);
+		}
+	}
+};
+
+
+class LLViewerChatterBoxInvitation : public LLHTTPNode
+{
+public:
+
+	virtual void post(
+		ResponsePtr response,
+		const LLSD& context,
+		const LLSD& input) const
+	{
+		//for backwards compatiblity reasons...we need to still
+		//check for 'text' or 'voice' invitations...bleh
+		if ( input["body"].has("instantmessage") )
+		{
+			LLSD message_params =
+				input["body"]["instantmessage"]["message_params"];
+
+			//do something here to have the IM invite behave
+			//just like a normal IM
+			//this is just replicated code from process_improved_im
+			//and should really go in it's own function -jwolk
+			if (gNoRender)
+			{
+				return;
+			}
+			LLChat chat;
+
+			std::string message = message_params["message"].asString();
+			std::string name = message_params["from_name"].asString();
+			LLUUID from_id = message_params["from_id"].asUUID();
+			LLUUID session_id = message_params["id"].asUUID();
+			std::vector<U8> bin_bucket = message_params["data"]["binary_bucket"].asBinary();
+			U8 offline = (U8)message_params["offline"].asInteger();
+			
+			time_t timestamp =
+				(time_t) message_params["timestamp"].asInteger();
+
+			BOOL is_busy = gAgent.getBusy();
+			BOOL is_muted = LLMuteList::getInstance()->isMuted(
+				from_id,
+				name,
+				LLMute::flagTextChat);
+
+			BOOL is_linden = LLMuteList::getInstance()->isLinden(name);
+			std::string separator_string(": ");
+			
+			chat.mMuted = is_muted && !is_linden;
+			chat.mFromID = from_id;
+			chat.mFromName = name;
+
+			if (!is_linden && (is_busy || is_muted))
+			{
+				return;
+			}
+
+			// standard message, not from system
+			std::string saved;
+			if(offline == IM_OFFLINE)
+			{
+				saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());
+			}
+			std::string buffer = saved + message;
+
+			BOOL is_this_agent = FALSE;
+			if(from_id == gAgentID)
+			{
+				is_this_agent = TRUE;
+			}
+			gIMMgr->addMessage(
+				session_id,
+				from_id,
+				name,
+				buffer,
+				std::string((char*)&bin_bucket[0]),
+				IM_SESSION_INVITE,
+				message_params["parent_estate_id"].asInteger(),
+				message_params["region_id"].asUUID(),
+				ll_vector3_from_sd(message_params["position"]),
+				true);
+
+			chat.mText = std::string("IM: ") + name + separator_string + saved + message;
+			LLFloaterChat::addChat(chat, TRUE, is_this_agent);
+
+			//K now we want to accept the invitation
+			std::string url = gAgent.getRegion()->getCapability(
+				"ChatSessionRequest");
+
+			if ( url != "" )
+			{
+				LLSD data;
+				data["method"] = "accept invitation";
+				data["session-id"] = session_id;
+				LLHTTPClient::post(
+					url,
+					data,
+					new LLViewerChatterBoxInvitationAcceptResponder(
+						session_id,
+						LLIMMgr::INVITATION_TYPE_INSTANT_MESSAGE));
+			}
+		} //end if invitation has instant message
+		else if ( input["body"].has("voice") )
+		{
+			if (gNoRender)
+			{
+				return;
+			}
+			
+			if(!LLVoiceClient::voiceEnabled())
+			{
+				// Don't display voice invites unless the user has voice enabled.
+				return;
+			}
+
+			gIMMgr->inviteToSession(
+				input["body"]["session_id"].asUUID(), 
+				input["body"]["session_name"].asString(), 
+				input["body"]["from_id"].asUUID(),
+				input["body"]["from_name"].asString(),
+				IM_SESSION_INVITE,
+				LLIMMgr::INVITATION_TYPE_VOICE);
+		}
+		else if ( input["body"].has("immediate") )
+		{
+			gIMMgr->inviteToSession(
+				input["body"]["session_id"].asUUID(), 
+				input["body"]["session_name"].asString(), 
+				input["body"]["from_id"].asUUID(),
+				input["body"]["from_name"].asString(),
+				IM_SESSION_INVITE,
+				LLIMMgr::INVITATION_TYPE_IMMEDIATE);
+		}
+	}
+};
+
+LLHTTPRegistration<LLViewerChatterBoxSessionStartReply>
+   gHTTPRegistrationMessageChatterboxsessionstartreply(
+	   "/message/ChatterBoxSessionStartReply");
+
+LLHTTPRegistration<LLViewerChatterBoxSessionEventReply>
+   gHTTPRegistrationMessageChatterboxsessioneventreply(
+	   "/message/ChatterBoxSessionEventReply");
+
+LLHTTPRegistration<LLViewerForceCloseChatterBoxSession>
+    gHTTPRegistrationMessageForceclosechatterboxsession(
+		"/message/ForceCloseChatterBoxSession");
+
+LLHTTPRegistration<LLViewerChatterBoxSessionAgentListUpdates>
+    gHTTPRegistrationMessageChatterboxsessionagentlistupdates(
+	    "/message/ChatterBoxSessionAgentListUpdates");
+
+LLHTTPRegistration<LLViewerChatterBoxSessionUpdate>
+    gHTTPRegistrationMessageChatterBoxSessionUpdate(
+	    "/message/ChatterBoxSessionUpdate");
+
+LLHTTPRegistration<LLViewerChatterBoxInvitation>
+    gHTTPRegistrationMessageChatterBoxInvitation(
+		"/message/ChatterBoxInvitation");
+
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 173f2634aa2..a6a5ecb8e76 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -1,5146 +1,5146 @@
-/**
- * @file llinventorybridge.cpp
- * @brief Implementation of the Inventory-Folder-View-Bridge classes.
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- *
- * Copyright (c) 2001-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-#include "llinventorybridge.h"
-
-#include "llagent.h"
-#include "llagentwearables.h"
-#include "llappearancemgr.h"
-#include "llavataractions.h"
-#include "llfloatercustomize.h"
-#include "llfloaterinventory.h"
-#include "llfloateropenobject.h"
-#include "llfloaterreg.h"
-#include "llfloaterworldmap.h"
-#include "llfriendcard.h"
-#include "llgesturemgr.h"
-#include "llimfloater.h"
-#include "llimview.h"
-#include "llinventoryclipboard.h"
-#include "llinventoryfunctions.h"
-#include "llinventorymodel.h"
-#include "llinventorypanel.h"
-#include "llpreviewanim.h"
-#include "llpreviewgesture.h"
-#include "llpreviewtexture.h"
-#include "llselectmgr.h"
-#include "llsidetray.h"
-#include "lltrans.h"
-#include "llviewerassettype.h"
-#include "llviewermessage.h"
-#include "llviewerobjectlist.h"
-#include "llviewerwindow.h"
-#include "llvoavatarself.h"
-#include "llwearablelist.h"
-
-using namespace LLOldEvents;
-
-// Helpers
-// bug in busy count inc/dec right now, logic is complex... do we really need it?
-void inc_busy_count()
-{
-// 	gViewerWindow->getWindow()->incBusyCount();
-//  check balance of these calls if this code is changed to ever actually
-//  *do* something!
-}
-void dec_busy_count()
-{
-// 	gViewerWindow->getWindow()->decBusyCount();
-//  check balance of these calls if this code is changed to ever actually
-//  *do* something!
-}
-
-// Function declarations
-void wear_add_inventory_item_on_avatar(LLInventoryItem* item);
-void remove_inventory_category_from_avatar(LLInventoryCategory* category);
-void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id);
-bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*);
-bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response);
-
-std::string ICON_NAME[ICON_NAME_COUNT] =
-{
-	"Inv_Texture",
-	"Inv_Sound",
-	"Inv_CallingCard",
-	"Inv_CallingCard",
-	"Inv_Landmark",
-	"Inv_Landmark",
-	"Inv_Script",
-	"Inv_Clothing",
-	"Inv_Object",
-	"Inv_Object",
-	"Inv_Notecard",
-	"Inv_Skin",
-	"Inv_Snapshot",
-
-	"Inv_BodyShape",
-	"Inv_Skin",
-	"Inv_Hair",
-	"Inv_Eye",
-	"Inv_Shirt",
-	"Inv_Pants",
-	"Inv_Shoe",
-	"Inv_Socks",
-	"Inv_Jacket",
-	"Inv_Gloves",
-	"Inv_Undershirt",
-	"Inv_Underpants",
-	"Inv_Skirt",
-	"Inv_Alpha",
-	"Inv_Tattoo",
-
-	"Inv_Animation",
-	"Inv_Gesture",
-
-	"inv_item_linkitem.tga",
-	"inv_item_linkfolder.tga"
-};
-
-// +=================================================+
-// |        LLInvFVBridge                            |
-// +=================================================+
-
-LLInvFVBridge::LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid) :
-mUUID(uuid), mInvType(LLInventoryType::IT_NONE)
-{
-	mInventoryPanel = inventory->getHandle();
-}
-
-const std::string& LLInvFVBridge::getName() const
-{
-	LLInventoryObject* obj = getInventoryObject();
-	if(obj)
-	{
-		return obj->getName();
-	}
-	return LLStringUtil::null;
-}
-
-const std::string& LLInvFVBridge::getDisplayName() const
-{
-	return getName();
-}
-
-// Folders have full perms
-PermissionMask LLInvFVBridge::getPermissionMask() const
-{
-
-	return PERM_ALL;
-}
-
-// virtual
-LLFolderType::EType LLInvFVBridge::getPreferredType() const
-{
-	return LLFolderType::FT_NONE;
-}
-
-
-// Folders don't have creation dates.
-time_t LLInvFVBridge::getCreationDate() const
-{
-	return 0;
-}
-
-// Can be destoryed (or moved to trash)
-BOOL LLInvFVBridge::isItemRemovable()
-{
-	LLInventoryModel* model = getInventoryModel();
-	if(!model) return FALSE;
-	if(model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()))
-	{
-		return TRUE;
-	}
-	return FALSE;
-}
-
-// Can be moved to another folder
-BOOL LLInvFVBridge::isItemMovable() const
-{
-	return TRUE;
-}
-
-/*virtual*/
-/**
- * @brief Adds this item into clipboard storage
- */
-void LLInvFVBridge::cutToClipboard()
-{
-	if(isItemMovable())
-	{
-		LLInventoryClipboard::instance().cut(mUUID);
-	}
-}
-// *TODO: make sure this does the right thing
-void LLInvFVBridge::showProperties()
-{
-	LLSD key;
-	key["id"] = mUUID;
-	LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
-
-	// Disable old properties floater; this is replaced by the sidepanel.
-	/*
-	LLFloaterReg::showInstance("properties", mUUID);
-	*/
-}
-
-void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch)
-{
-	// Deactivate gestures when moving them into Trash
-	LLInvFVBridge* bridge;
-	LLInventoryModel* model = getInventoryModel();
-	LLViewerInventoryItem* item = NULL;
-	LLViewerInventoryCategory* cat = NULL;
-	LLInventoryModel::cat_array_t	descendent_categories;
-	LLInventoryModel::item_array_t	descendent_items;
-	S32 count = batch.count();
-	S32 i,j;
-	for(i = 0; i < count; ++i)
-	{
-		bridge = (LLInvFVBridge*)(batch.get(i));
-		if(!bridge || !bridge->isItemRemovable()) continue;
-		item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID());
-		if (item)
-		{
-			if(LLAssetType::AT_GESTURE == item->getType())
-			{
-				LLGestureManager::instance().deactivateGesture(item->getUUID());
-			}
-		}
-	}
-	for(i = 0; i < count; ++i)
-	{
-		bridge = (LLInvFVBridge*)(batch.get(i));
-		if(!bridge || !bridge->isItemRemovable()) continue;
-		cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID());
-		if (cat)
-		{
-			gInventory.collectDescendents( cat->getUUID(), descendent_categories, descendent_items, FALSE );
-			for (j=0; j<descendent_items.count(); j++)
-			{
-				if(LLAssetType::AT_GESTURE == descendent_items[j]->getType())
-				{
-					LLGestureManager::instance().deactivateGesture(descendent_items[j]->getUUID());
-				}
-			}
-		}
-	}
-	removeBatchNoCheck(batch);
-}
-
-void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch)
-{
-	// this method moves a bunch of items and folders to the trash. As
-	// per design guidelines for the inventory model, the message is
-	// built and the accounting is performed first. After all of that,
-	// we call LLInventoryModel::moveObject() to move everything
-	// around.
-	LLInvFVBridge* bridge;
-	LLInventoryModel* model = getInventoryModel();
-	if(!model) return;
-	LLMessageSystem* msg = gMessageSystem;
-	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
-	LLViewerInventoryItem* item = NULL;
-	LLViewerInventoryCategory* cat = NULL;
-	std::vector<LLUUID> move_ids;
-	LLInventoryModel::update_map_t update;
-	bool start_new_message = true;
-	S32 count = batch.count();
-	S32 i;
-	for(i = 0; i < count; ++i)
-	{
-		bridge = (LLInvFVBridge*)(batch.get(i));
-		if(!bridge || !bridge->isItemRemovable()) continue;
-		item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID());
-		if(item)
-		{
-			if(item->getParentUUID() == trash_id) continue;
-			move_ids.push_back(item->getUUID());
-			LLPreview::hide(item->getUUID());
-			--update[item->getParentUUID()];
-			++update[trash_id];
-			if(start_new_message)
-			{
-				start_new_message = false;
-				msg->newMessageFast(_PREHASH_MoveInventoryItem);
-				msg->nextBlockFast(_PREHASH_AgentData);
-				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-				msg->addBOOLFast(_PREHASH_Stamp, TRUE);
-			}
-			msg->nextBlockFast(_PREHASH_InventoryData);
-			msg->addUUIDFast(_PREHASH_ItemID, item->getUUID());
-			msg->addUUIDFast(_PREHASH_FolderID, trash_id);
-			msg->addString("NewName", NULL);
-			if(msg->isSendFullFast(_PREHASH_InventoryData))
-			{
-				start_new_message = true;
-				gAgent.sendReliableMessage();
-				gInventory.accountForUpdate(update);
-				update.clear();
-			}
-		}
-	}
-	if(!start_new_message)
-	{
-		start_new_message = true;
-		gAgent.sendReliableMessage();
-		gInventory.accountForUpdate(update);
-		update.clear();
-	}
-	for(i = 0; i < count; ++i)
-	{
-		bridge = (LLInvFVBridge*)(batch.get(i));
-		if(!bridge || !bridge->isItemRemovable()) continue;
-		cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID());
-		if(cat)
-		{
-			if(cat->getParentUUID() == trash_id) continue;
-			move_ids.push_back(cat->getUUID());
-			--update[cat->getParentUUID()];
-			++update[trash_id];
-			if(start_new_message)
-			{
-				start_new_message = false;
-				msg->newMessageFast(_PREHASH_MoveInventoryFolder);
-				msg->nextBlockFast(_PREHASH_AgentData);
-				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-				msg->addBOOL("Stamp", TRUE);
-			}
-			msg->nextBlockFast(_PREHASH_InventoryData);
-			msg->addUUIDFast(_PREHASH_FolderID, cat->getUUID());
-			msg->addUUIDFast(_PREHASH_ParentID, trash_id);
-			if(msg->isSendFullFast(_PREHASH_InventoryData))
-			{
-				start_new_message = true;
-				gAgent.sendReliableMessage();
-				gInventory.accountForUpdate(update);
-				update.clear();
-			}
-		}
-	}
-	if(!start_new_message)
-	{
-		gAgent.sendReliableMessage();
-		gInventory.accountForUpdate(update);
-	}
-
-	// move everything.
-	std::vector<LLUUID>::iterator it = move_ids.begin();
-	std::vector<LLUUID>::iterator end = move_ids.end();
-	for(; it != end; ++it)
-	{
-		gInventory.moveObject((*it), trash_id);
-	}
-
-	// notify inventory observers.
-	model->notifyObservers();
-}
-
-BOOL LLInvFVBridge::isClipboardPasteable() const
-{
-	if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory())
-	{
-		return FALSE;
-	}
-	LLInventoryModel* model = getInventoryModel();
-	if (!model)
-	{
-		return FALSE;
-	}
-
-	const LLUUID &agent_id = gAgent.getID();
-
-	LLDynamicArray<LLUUID> objects;
-	LLInventoryClipboard::instance().retrieve(objects);
-	S32 count = objects.count();
-	for(S32 i = 0; i < count; i++)
-	{
-		const LLUUID &item_id = objects.get(i);
-
-		// Can't paste folders
-		const LLInventoryCategory *cat = model->getCategory(item_id);
-		if (cat)
-		{
-			return FALSE;
-		}
-
-		const LLInventoryItem *item = model->getItem(item_id);
-		if (item)
-		{
-			if (!item->getPermissions().allowCopyBy(agent_id))
-			{
-				return FALSE;
-			}
-		}
-	}
-	return TRUE;
-}
-
-BOOL LLInvFVBridge::isClipboardPasteableAsLink() const
-{
-	if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory())
-	{
-		return FALSE;
-	}
-	const LLInventoryModel* model = getInventoryModel();
-	if (!model)
-	{
-		return FALSE;
-	}
-
-	LLDynamicArray<LLUUID> objects;
-	LLInventoryClipboard::instance().retrieve(objects);
-	S32 count = objects.count();
-	for(S32 i = 0; i < count; i++)
-	{
-		const LLInventoryItem *item = model->getItem(objects.get(i));
-		if (item)
-		{
-			if (!LLAssetType::lookupCanLink(item->getActualType()))
-			{
-				return FALSE;
-			}
-		}
-		const LLViewerInventoryCategory *cat = model->getCategory(objects.get(i));
-		if (cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
-		{
-			return FALSE;
-		}
-	}
-	return TRUE;
-}
-
-void hide_context_entries(LLMenuGL& menu, 
-						const std::vector<std::string> &entries_to_show,
-						const std::vector<std::string> &disabled_entries)
-{
-	const LLView::child_list_t *list = menu.getChildList();
-
-	LLView::child_list_t::const_iterator itor;
-	for (itor = list->begin(); itor != list->end(); ++itor)
-	{
-		std::string name = (*itor)->getName();
-
-		// descend into split menus:
-		LLMenuItemBranchGL* branchp = dynamic_cast<LLMenuItemBranchGL*>(*itor);
-		if ((name == "More") && branchp)
-		{
-			hide_context_entries(*branchp->getBranch(), entries_to_show, disabled_entries);
-		}
-
-
-		bool found = false;
-		std::vector<std::string>::const_iterator itor2;
-		for (itor2 = entries_to_show.begin(); itor2 != entries_to_show.end(); ++itor2)
-		{
-			if (*itor2 == name)
-			{
-				found = true;
-			}
-		}
-		if (!found)
-		{
-			(*itor)->setVisible(FALSE);
-		}
-		else
-		{
-			for (itor2 = disabled_entries.begin(); itor2 != disabled_entries.end(); ++itor2)
-			{
-				if (*itor2 == name)
-				{
-					(*itor)->setEnabled(FALSE);
-				}
-			}
-		}
-	}
-}
-
-// Helper for commonly-used entries
-void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
-										std::vector<std::string> &items,
-										std::vector<std::string> &disabled_items, U32 flags)
-{
-	items.push_back(std::string("Rename"));
-	if (!isItemRenameable() || (flags & FIRST_SELECTED_ITEM) == 0)
-	{
-		disabled_items.push_back(std::string("Rename"));
-	}
-
-	if (show_asset_id)
-	{
-		items.push_back(std::string("Copy Asset UUID"));
-		if ( (! ( isItemPermissive() || gAgent.isGodlike() ) )
-			  || (flags & FIRST_SELECTED_ITEM) == 0)
-		{
-			disabled_items.push_back(std::string("Copy Asset UUID"));
-		}
-	}
-
-	items.push_back(std::string("Copy Separator"));
-
-	items.push_back(std::string("Copy"));
-	if (!isItemCopyable())
-	{
-		disabled_items.push_back(std::string("Copy"));
-	}
-
-	items.push_back(std::string("Paste"));
-	if (!isClipboardPasteable() || (flags & FIRST_SELECTED_ITEM) == 0)
-	{
-		disabled_items.push_back(std::string("Paste"));
-	}
-
-	items.push_back(std::string("Paste As Link"));
-	if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0)
-	{
-		disabled_items.push_back(std::string("Paste As Link"));
-	}
-	items.push_back(std::string("Paste Separator"));
-
-	items.push_back(std::string("Delete"));
-	if (!isItemRemovable())
-	{
-		disabled_items.push_back(std::string("Delete"));
-	}
-
-	// If multiple items are selected, disable properties (if it exists).
-	if ((flags & FIRST_SELECTED_ITEM) == 0)
-	{
-		disabled_items.push_back(std::string("Properties"));
-	}
-}
-
-void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
-{
-	lldebugs << "LLInvFVBridge::buildContextMenu()" << llendl;
-	std::vector<std::string> items;
-	std::vector<std::string> disabled_items;
-	if(isInTrash())
-	{
-		items.push_back(std::string("PurgeItem"));
-		if (!isItemRemovable())
-		{
-			disabled_items.push_back(std::string("PurgeItem"));
-		}
-		items.push_back(std::string("RestoreItem"));
-	}
-	else
-	{
-		items.push_back(std::string("Open"));
-		items.push_back(std::string("Properties"));
-
-		getClipboardEntries(true, items, disabled_items, flags);
-	}
-	hide_context_entries(menu, items, disabled_items);
-}
-
-// *TODO: remove this
-BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
-{
-	BOOL rv = FALSE;
-
-	const LLInventoryObject* obj = getInventoryObject();
-
-	if(obj)
-	{
-		*type = LLViewerAssetType::lookupDragAndDropType(obj->getActualType());
-		if(*type == DAD_NONE)
-		{
-			return FALSE;
-		}
-
-		*id = obj->getUUID();
-		//object_ids.put(obj->getUUID());
-
-		if (*type == DAD_CATEGORY)
-		{
-			gInventory.startBackgroundFetch(obj->getUUID());
-		}
-
-		rv = TRUE;
-	}
-
-	return rv;
-}
-
-LLInventoryObject* LLInvFVBridge::getInventoryObject() const
-{
-	LLInventoryObject* obj = NULL;
-	LLInventoryModel* model = getInventoryModel();
-	if(model)
-	{
-		obj = (LLInventoryObject*)model->getObject(mUUID);
-	}
-	return obj;
-}
-
-LLInventoryModel* LLInvFVBridge::getInventoryModel() const
-{
-	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
-	return panel ? panel->getModel() : NULL;
-}
-
-BOOL LLInvFVBridge::isInTrash() const
-{
-	LLInventoryModel* model = getInventoryModel();
-	if(!model) return FALSE;
-	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
-	return model->isObjectDescendentOf(mUUID, trash_id);
-}
-
-BOOL LLInvFVBridge::isLinkedObjectInTrash() const
-{
-	if (isInTrash()) return TRUE;
-
-	const LLInventoryObject *obj = getInventoryObject();
-	if (obj && obj->getIsLinkType())
-	{
-		LLInventoryModel* model = getInventoryModel();
-		if(!model) return FALSE;
-		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
-		return model->isObjectDescendentOf(obj->getLinkedUUID(), trash_id);
-	}
-	return FALSE;
-}
-
-BOOL LLInvFVBridge::isAgentInventory() const
-{
-	const LLInventoryModel* model = getInventoryModel();
-	if(!model) return FALSE;
-	if(gInventory.getRootFolderID() == mUUID) return TRUE;
-	return model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID());
-}
-
-BOOL LLInvFVBridge::isCOFFolder() const
-{
-	const LLInventoryModel* model = getInventoryModel();
-	if(!model) return TRUE;
-	const LLUUID cof_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
-	if (mUUID == cof_id || model->isObjectDescendentOf(mUUID, cof_id))
-	{
-		return TRUE;
-	}
-	return FALSE;
-}
-
-BOOL LLInvFVBridge::isItemPermissive() const
-{
-	return FALSE;
-}
-
-// static
-void LLInvFVBridge::changeItemParent(LLInventoryModel* model,
-									 LLViewerInventoryItem* item,
-									 const LLUUID& new_parent,
-									 BOOL restamp)
-{
-	if(item->getParentUUID() != new_parent)
-	{
-		LLInventoryModel::update_list_t update;
-		LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1);
-		update.push_back(old_folder);
-		LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1);
-		update.push_back(new_folder);
-		gInventory.accountForUpdate(update);
-
-		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
-		new_item->setParent(new_parent);
-		new_item->updateParentOnServer(restamp);
-		model->updateItem(new_item);
-		model->notifyObservers();
-	}
-}
-
-// static
-void LLInvFVBridge::changeCategoryParent(LLInventoryModel* model,
-										 LLViewerInventoryCategory* cat,
-										 const LLUUID& new_parent,
-										 BOOL restamp)
-{
-	if(cat->getParentUUID() != new_parent)
-	{
-		LLInventoryModel::update_list_t update;
-		LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1);
-		update.push_back(old_folder);
-		LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1);
-		update.push_back(new_folder);
-		gInventory.accountForUpdate(update);
-
-		LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat);
-		new_cat->setParent(new_parent);
-		new_cat->updateParentOnServer(restamp);
-		model->updateCategory(new_cat);
-		model->notifyObservers();
-	}
-}
-
-
-const std::string safe_inv_type_lookup(LLInventoryType::EType inv_type)
-{
-	const std::string rv= LLInventoryType::lookup(inv_type);
-	if(rv.empty())
-	{
-		return std::string("<invalid>");
-	}
-	return rv;
-}
-
-LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
-										   LLAssetType::EType actual_asset_type,
-										   LLInventoryType::EType inv_type,
-										   LLInventoryPanel* inventory,
-										   const LLUUID& uuid,
-										   U32 flags)
-{
-	LLInvFVBridge* new_listener = NULL;
-	switch(asset_type)
-	{
-		case LLAssetType::AT_TEXTURE:
-			if(!(inv_type == LLInventoryType::IT_TEXTURE || inv_type == LLInventoryType::IT_SNAPSHOT))
-			{
-				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
-			}
-			new_listener = new LLTextureBridge(inventory, uuid, inv_type);
-			break;
-
-		case LLAssetType::AT_SOUND:
-			if(!(inv_type == LLInventoryType::IT_SOUND))
-			{
-				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
-			}
-			new_listener = new LLSoundBridge(inventory, uuid);
-			break;
-
-		case LLAssetType::AT_LANDMARK:
-			if(!(inv_type == LLInventoryType::IT_LANDMARK))
-			{
-				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
-			}
-			new_listener = new LLLandmarkBridge(inventory, uuid, flags);
-			break;
-
-		case LLAssetType::AT_CALLINGCARD:
-			if(!(inv_type == LLInventoryType::IT_CALLINGCARD))
-			{
-				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
-			}
-			new_listener = new LLCallingCardBridge(inventory, uuid);
-			break;
-
-		case LLAssetType::AT_SCRIPT:
-			if(!(inv_type == LLInventoryType::IT_LSL))
-			{
-				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
-			}
-			new_listener = new LLScriptBridge(inventory, uuid);
-			break;
-
-		case LLAssetType::AT_OBJECT:
-			if(!(inv_type == LLInventoryType::IT_OBJECT || inv_type == LLInventoryType::IT_ATTACHMENT))
-			{
-				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
-			}
-			new_listener = new LLObjectBridge(inventory, uuid, inv_type, flags);
-			break;
-
-		case LLAssetType::AT_NOTECARD:
-			if(!(inv_type == LLInventoryType::IT_NOTECARD))
-			{
-				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
-			}
-			new_listener = new LLNotecardBridge(inventory, uuid);
-			break;
-
-		case LLAssetType::AT_ANIMATION:
-			if(!(inv_type == LLInventoryType::IT_ANIMATION))
-			{
-				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
-			}
-			new_listener = new LLAnimationBridge(inventory, uuid);
-			break;
-
-		case LLAssetType::AT_GESTURE:
-			if(!(inv_type == LLInventoryType::IT_GESTURE))
-			{
-				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
-			}
-			new_listener = new LLGestureBridge(inventory, uuid);
-			break;
-
-		case LLAssetType::AT_LSL_TEXT:
-			if(!(inv_type == LLInventoryType::IT_LSL))
-			{
-				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
-			}
-			new_listener = new LLLSLTextBridge(inventory, uuid);
-			break;
-
-		case LLAssetType::AT_CLOTHING:
-		case LLAssetType::AT_BODYPART:
-			if(!(inv_type == LLInventoryType::IT_WEARABLE))
-			{
-				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
-			}
-			new_listener = new LLWearableBridge(inventory, uuid, asset_type, inv_type, (EWearableType)flags);
-			break;
-		case LLAssetType::AT_CATEGORY:
-			if (actual_asset_type == LLAssetType::AT_LINK_FOLDER)
-			{
-				// Create a link folder handler instead.
-				new_listener = new LLLinkFolderBridge(inventory, uuid);
-				break;
-			}
-			new_listener = new LLFolderBridge(inventory, uuid);
-			break;
-		case LLAssetType::AT_LINK:
-			// Only should happen for broken links.
-			new_listener = new LLLinkItemBridge(inventory, uuid);
-			break;
-		case LLAssetType::AT_LINK_FOLDER:
-			// Only should happen for broken links.
-			new_listener = new LLLinkItemBridge(inventory, uuid);
-			break;
-		default:
-			llinfos << "Unhandled asset type (llassetstorage.h): "
-					<< (S32)asset_type << llendl;
-			break;
-	}
-
-	if (new_listener)
-	{
-		new_listener->mInvType = inv_type;
-	}
-
-	return new_listener;
-}
-
-void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid)
-{
-	LLInventoryCategory* cat = model->getCategory(uuid);
-	if (cat)
-	{
-		model->purgeDescendentsOf(uuid);
-		model->notifyObservers();
-	}
-	LLInventoryObject* obj = model->getObject(uuid);
-	if (obj)
-	{
-		model->purgeObject(uuid);
-		model->notifyObservers();
-	}
-}
-
-// +=================================================+
-// |        InventoryFVBridgeBuilder                 |
-// +=================================================+
-LLInvFVBridge* LLInventoryFVBridgeBuilder::createBridge(LLAssetType::EType asset_type,
-														LLAssetType::EType actual_asset_type,
-														LLInventoryType::EType inv_type,
-														LLInventoryPanel* inventory,
-														const LLUUID& uuid,
-														U32 flags /* = 0x00 */) const
-{
-	return LLInvFVBridge::createBridge(asset_type,
-		actual_asset_type,
-		inv_type,
-		inventory,
-		uuid,
-		flags);
-}
-
-// +=================================================+
-// |        LLItemBridge                             |
-// +=================================================+
-
-void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
-{
-	if ("goto" == action)
-	{
-		gotoItem(folder);
-	}
-	if ("open" == action)
-	{
-		openItem();
-		return;
-	}
-	else if ("properties" == action)
-	{
-		showProperties();
-		return;
-	}
-	else if ("purge" == action)
-	{
-		purgeItem(model, mUUID);
-		return;
-	}
-	else if ("restoreToWorld" == action)
-	{
-		restoreToWorld();
-		return;
-	}
-	else if ("restore" == action)
-	{
-		restoreItem();
-		return;
-	}
-	else if ("copy_uuid" == action)
-	{
-		// Single item only
-		LLInventoryItem* item = model->getItem(mUUID);
-		if(!item) return;
-		LLUUID asset_id = item->getAssetUUID();
-		std::string buffer;
-		asset_id.toString(buffer);
-
-		gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(buffer));
-		return;
-	}
-	else if ("copy" == action)
-	{
-		copyToClipboard();
-		return;
-	}
-	else if ("paste" == action)
-	{
-		// Single item only
-		LLInventoryItem* itemp = model->getItem(mUUID);
-		if (!itemp) return;
-
-		LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID());
-		if (!folder_view_itemp) return;
-
-		folder_view_itemp->getListener()->pasteFromClipboard();
-		return;
-	}
-	else if ("paste_link" == action)
-	{
-		// Single item only
-		LLInventoryItem* itemp = model->getItem(mUUID);
-		if (!itemp) return;
-
-		LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID());
-		if (!folder_view_itemp) return;
-
-		folder_view_itemp->getListener()->pasteLinkFromClipboard();
-		return;
-	}
-}
-
-void LLItemBridge::selectItem()
-{
-	LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem();
-	if(item && !item->isComplete())
-	{
-		item->fetchFromServer();
-	}
-}
-
-void LLItemBridge::restoreItem()
-{
-	LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem();
-	if(item)
-	{
-		LLInventoryModel* model = getInventoryModel();
-		const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(item->getType()));
-		// do not restamp on restore.
-		LLInvFVBridge::changeItemParent(model, item, new_parent, FALSE);
-	}
-}
-
-void LLItemBridge::restoreToWorld()
-{
-	LLViewerInventoryItem* itemp = (LLViewerInventoryItem*)getItem();
-	if (itemp)
-	{
-		LLMessageSystem* msg = gMessageSystem;
-		msg->newMessage("RezRestoreToWorld");
-		msg->nextBlockFast(_PREHASH_AgentData);
-		msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-		msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-
-		msg->nextBlockFast(_PREHASH_InventoryData);
-		itemp->packMessage(msg);
-		msg->sendReliable(gAgent.getRegion()->getHost());
-	}
-
-	//Similar functionality to the drag and drop rez logic
-	BOOL remove_from_inventory = FALSE;
-
-	//remove local inventory copy, sim will deal with permissions and removing the item
-	//from the actual inventory if its a no-copy etc
-	if(!itemp->getPermissions().allowCopyBy(gAgent.getID()))
-	{
-		remove_from_inventory = TRUE;
-	}
-
-	// Check if it's in the trash. (again similar to the normal rez logic)
-	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
-	if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id))
-	{
-		remove_from_inventory = TRUE;
-	}
-
-	if(remove_from_inventory)
-	{
-		gInventory.deleteObject(itemp->getUUID());
-		gInventory.notifyObservers();
-	}
-}
-
-void LLItemBridge::gotoItem(LLFolderView *folder)
-{
-	LLInventoryObject *obj = getInventoryObject();
-	if (obj && obj->getIsLinkType())
-	{
-		LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel();
-		if (active_panel)
-		{
-			active_panel->setSelection(obj->getLinkedUUID(), TAKE_FOCUS_NO);
-		}
-	}
-}
-
-LLUIImagePtr LLItemBridge::getIcon() const
-{
-	return LLUI::getUIImage(ICON_NAME[OBJECT_ICON_NAME]);
-}
-
-PermissionMask LLItemBridge::getPermissionMask() const
-{
-	LLViewerInventoryItem* item = getItem();
-	PermissionMask perm_mask = 0;
-	if(item)
-	{
-		BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID());
-		BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID());
-		BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER,
-															gAgent.getID());
-
-		if (copy) perm_mask |= PERM_COPY;
-		if (mod)  perm_mask |= PERM_MODIFY;
-		if (xfer) perm_mask |= PERM_TRANSFER;
-
-	}
-	return perm_mask;
-}
-
-const std::string& LLItemBridge::getDisplayName() const
-{
-	if(mDisplayName.empty())
-	{
-		buildDisplayName(getItem(), mDisplayName);
-	}
-	return mDisplayName;
-}
-
-void LLItemBridge::buildDisplayName(LLInventoryItem* item, std::string& name)
-{
-	if(item)
-	{
-		name.assign(item->getName());
-	}
-	else
-	{
-		name.assign(LLStringUtil::null);
-	}
-}
-
-LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const
-{
-	U8 font = LLFontGL::NORMAL;
-
-	if( gAgentWearables.isWearingItem( mUUID ) )
-	{
-		// llinfos << "BOLD" << llendl;
-		font |= LLFontGL::BOLD;
-	}
-
-	const LLViewerInventoryItem* item = getItem();
-	if (item && item->getIsLinkType())
-	{
-		font |= LLFontGL::ITALIC;
-	}
-	return (LLFontGL::StyleFlags)font;
-}
-
-std::string LLItemBridge::getLabelSuffix() const
-{
-	// String table is loaded before login screen and inventory items are
-	// loaded after login, so LLTrans should be ready.
-	static std::string NO_COPY =LLTrans::getString("no_copy");
-	static std::string NO_MOD = LLTrans::getString("no_modify");
-	static std::string NO_XFER = LLTrans::getString("no_transfer");
-	static std::string LINK = LLTrans::getString("link");
-	static std::string BROKEN_LINK = LLTrans::getString("broken_link");
-	std::string suffix;
-	LLInventoryItem* item = getItem();
-	if(item)
-	{
-		// it's a bit confusing to put nocopy/nomod/etc on calling cards.
-		if(LLAssetType::AT_CALLINGCARD != item->getType()
-		   && item->getPermissions().getOwner() == gAgent.getID())
-		{
-			BOOL broken_link = LLAssetType::lookupIsLinkType(item->getType());
-			if (broken_link) return BROKEN_LINK;
-
-			BOOL link = item->getIsLinkType();
-			if (link) return LINK;
-
-			BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID());
-			if (!copy)
-			{
-				suffix += NO_COPY;
-			}
-			BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID());
-			if (!mod)
-			{
-				suffix += NO_MOD;
-			}
-			BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER,
-																gAgent.getID());
-			if (!xfer)
-			{
-				suffix += NO_XFER;
-			}
-		}
-	}
-	return suffix;
-}
-
-time_t LLItemBridge::getCreationDate() const
-{
-	LLViewerInventoryItem* item = getItem();
-	if (item)
-	{
-		return item->getCreationDate();
-	}
-	return 0;
-}
-
-
-BOOL LLItemBridge::isItemRenameable() const
-{
-	LLViewerInventoryItem* item = getItem();
-	if(item)
-	{
-		// (For now) Don't allow calling card rename since that may confuse users as to
-		// what the calling card points to.
-		if (item->getInventoryType() == LLInventoryType::IT_CALLINGCARD)
-		{
-			return FALSE;
-		}
-		return (item->getPermissions().allowModifyBy(gAgent.getID()));
-	}
-	return FALSE;
-}
-
-BOOL LLItemBridge::renameItem(const std::string& new_name)
-{
-	if(!isItemRenameable())
-		return FALSE;
-	LLPreview::dirty(mUUID);
-	LLInventoryModel* model = getInventoryModel();
-	if(!model)
-		return FALSE;
-	LLViewerInventoryItem* item = getItem();
-	if(item && (item->getName() != new_name))
-	{
-		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
-		new_item->rename(new_name);
-		buildDisplayName(new_item, mDisplayName);
-		new_item->updateServer(FALSE);
-		model->updateItem(new_item);
-
-		model->notifyObservers();
-	}
-	// return FALSE because we either notified observers (& therefore
-	// rebuilt) or we didn't update.
-	return FALSE;
-}
-
-
-BOOL LLItemBridge::removeItem()
-{
-	if(!isItemRemovable())
-	{
-		return FALSE;
-	}
-	// move it to the trash
-	LLPreview::hide(mUUID, TRUE);
-	LLInventoryModel* model = getInventoryModel();
-	if(!model) return FALSE;
-	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
-	LLViewerInventoryItem* item = getItem();
-
-	// if item is not already in trash
-	if(item && !model->isObjectDescendentOf(mUUID, trash_id))
-	{
-		// move to trash, and restamp
-		LLInvFVBridge::changeItemParent(model, item, trash_id, TRUE);
-		// delete was successful
-		return TRUE;
-	}
-	else
-	{
-		// tried to delete already item in trash (should purge?)
-		return FALSE;
-	}
-}
-
-BOOL LLItemBridge::isItemCopyable() const
-{
-	LLViewerInventoryItem* item = getItem();
-	if (item)
-	{
-		// can't copy worn objects. DEV-15183
-		LLVOAvatarSelf *avatarp = gAgent.getAvatarObject();
-		if( !avatarp )
-		{
-			return FALSE;
-		}
-
-		if(avatarp->isWearingAttachment(mUUID))
-		{
-			return FALSE;
-		}
-
-		// All items can be copied, not all can be pasted.
-		// The only time an item can't be copied is if it's a link
-		// return (item->getPermissions().allowCopyBy(gAgent.getID()));
-		if (item->getIsLinkType())
-		{
-			return FALSE;
-		}
-		return TRUE;
-	}
-	return FALSE;
-}
-BOOL LLItemBridge::copyToClipboard() const
-{
-	if(isItemCopyable())
-	{
-		LLInventoryClipboard::instance().add(mUUID);
-		return TRUE;
-	}
-	return FALSE;
-}
-
-LLViewerInventoryItem* LLItemBridge::getItem() const
-{
-	LLViewerInventoryItem* item = NULL;
-	LLInventoryModel* model = getInventoryModel();
-	if(model)
-	{
-		item = (LLViewerInventoryItem*)model->getItem(mUUID);
-	}
-	return item;
-}
-
-BOOL LLItemBridge::isItemPermissive() const
-{
-	LLViewerInventoryItem* item = getItem();
-	if(item)
-	{
-		U32 mask = item->getPermissions().getMaskBase();
-		if((mask & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED)
-		{
-			return TRUE;
-		}
-	}
-	return FALSE;
-}
-
-// +=================================================+
-// |        LLFolderBridge                           |
-// +=================================================+
-
-LLFolderBridge* LLFolderBridge::sSelf=NULL;
-
-// Can be moved to another folder
-BOOL LLFolderBridge::isItemMovable() const
-{
-	LLInventoryObject* obj = getInventoryObject();
-	if(obj)
-	{
-		return (!LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)obj)->getPreferredType()));
-	}
-	return FALSE;
-}
-
-void LLFolderBridge::selectItem()
-{
-}
-
-
-// Can be destroyed (or moved to trash)
-BOOL LLFolderBridge::isItemRemovable()
-{
-	LLInventoryModel* model = getInventoryModel();
-	if(!model)
-	{
-		return FALSE;
-	}
-
-	if(!model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()))
-	{
-		return FALSE;
-	}
-
-	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
-	if( !avatar )
-	{
-		return FALSE;
-	}
-
-	LLInventoryCategory* category = model->getCategory(mUUID);
-	if( !category )
-	{
-		return FALSE;
-	}
-
-	if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
-	{
-		return FALSE;
-	}
-
-	LLInventoryModel::cat_array_t	descendent_categories;
-	LLInventoryModel::item_array_t	descendent_items;
-	gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE );
-
-	S32 i;
-	for( i = 0; i < descendent_categories.count(); i++ )
-	{
-		LLInventoryCategory* category = descendent_categories[i];
-		if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
-		{
-			return FALSE;
-		}
-	}
-
-	for( i = 0; i < descendent_items.count(); i++ )
-	{
-		LLInventoryItem* item = descendent_items[i];
-		if( (item->getType() == LLAssetType::AT_CLOTHING) ||
-			(item->getType() == LLAssetType::AT_BODYPART) )
-		{
-			if(gAgentWearables.isWearingItem(item->getUUID()))
-			{
-				return FALSE;
-			}
-		}
-		else
-		if( item->getType() == LLAssetType::AT_OBJECT )
-		{
-			if(avatar->isWearingAttachment(item->getUUID()))
-			{
-				return FALSE;
-			}
-		}
-	}
-
-	return TRUE;
-}
-
-BOOL LLFolderBridge::isUpToDate() const
-{
-	LLInventoryModel* model = getInventoryModel();
-	if(!model) return FALSE;
-	LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID);
-	if( !category )
-	{
-		return FALSE;
-	}
-
-	return category->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN;
-}
-
-BOOL LLFolderBridge::isItemCopyable() const
-{
-	return TRUE;
-}
-
-BOOL LLFolderBridge::copyToClipboard() const
-{
-	if(isItemCopyable())
-	{
-		LLInventoryClipboard::instance().add(mUUID);
-		return TRUE;
-	}
-	return FALSE;
-}
-
-BOOL LLFolderBridge::isClipboardPasteable() const
-{
-	if ( ! LLInvFVBridge::isClipboardPasteable() )
-		return FALSE;
-
-	// Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599
-	if ( LLFriendCardsManager::instance().isCategoryInFriendFolder( getCategory() ) )
-	{
-		LLInventoryModel* model = getInventoryModel();
-		if ( !model )
-		{
-			return FALSE;
-		}
-
-		LLDynamicArray<LLUUID> objects;
-		LLInventoryClipboard::instance().retrieve(objects);
-		const LLViewerInventoryCategory *current_cat = getCategory();
-
-		// Search for the direct descendent of current Friends subfolder among all pasted items,
-		// and return false if is found.
-		for(S32 i = objects.count() - 1; i >= 0; --i)
-		{
-			const LLUUID &obj_id = objects.get(i);
-			if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) )
-			{
-				return FALSE;
-			}
-		}
-
-	}
-	return TRUE;
-}
-
-BOOL LLFolderBridge::isClipboardPasteableAsLink() const
-{
-	// Check normal paste-as-link permissions
-	if (!LLInvFVBridge::isClipboardPasteableAsLink())
-	{
-		return FALSE;
-	}
-
-	const LLInventoryModel* model = getInventoryModel();
-	if (!model)
-	{
-		return FALSE;
-	}
-
-	const LLViewerInventoryCategory *current_cat = getCategory();
-	if (current_cat)
-	{
-		const BOOL is_in_friend_folder = LLFriendCardsManager::instance().isCategoryInFriendFolder( current_cat );
-		const LLUUID &current_cat_id = current_cat->getUUID();
-		LLDynamicArray<LLUUID> objects;
-		LLInventoryClipboard::instance().retrieve(objects);
-		S32 count = objects.count();
-		for(S32 i = 0; i < count; i++)
-		{
-			const LLUUID &obj_id = objects.get(i);
-			const LLInventoryCategory *cat = model->getCategory(obj_id);
-			if (cat)
-			{
-				const LLUUID &cat_id = cat->getUUID();
-				// Don't allow recursive pasting
-				if ((cat_id == current_cat_id) ||
-					model->isObjectDescendentOf(current_cat_id, cat_id))
-				{
-					return FALSE;
-				}
-			}
-			// Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599
-			if ( is_in_friend_folder )
-			{
-				// If object is direct descendent of current Friends subfolder than return false.
-				// Note: We can't use 'const LLInventoryCategory *cat', because it may be null
-				// in case type of obj_id is LLInventoryItem.
-				if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) )
-				{
-					return FALSE;
-				}
-			}
-		}
-	}
-	return TRUE;
-
-}
-
-BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
-											BOOL drop)
-{
-	// This should never happen, but if an inventory item is incorrectly parented,
-	// the UI will get confused and pass in a NULL.
-	if(!inv_cat) return FALSE;
-
-	LLInventoryModel* model = getInventoryModel();
-	if(!model) return FALSE;
-
-	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
-	if(!avatar) return FALSE;
-
-	// cannot drag categories into library
-	if(!isAgentInventory())
-	{
-		return FALSE;
-	}
-
-	// check to make sure source is agent inventory, and is represented there.
-	LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource();
-	BOOL is_agent_inventory = (model->getCategory(inv_cat->getUUID()) != NULL)
-		&& (LLToolDragAndDrop::SOURCE_AGENT == source);
-
-	BOOL accept = FALSE;
-	S32 i;
-	LLInventoryModel::cat_array_t	descendent_categories;
-	LLInventoryModel::item_array_t	descendent_items;
-	if(is_agent_inventory)
-	{
-		const LLUUID& cat_id = inv_cat->getUUID();
-
-		// Is the destination the trash?
-		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
-		BOOL move_is_into_trash = (mUUID == trash_id)
-				|| model->isObjectDescendentOf(mUUID, trash_id);
-		BOOL is_movable = (!LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType()));
-		const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
-		BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
-		BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
-		if (move_is_into_current_outfit || move_is_into_outfit)
-		{
-			// BAP - restrictions?
-			is_movable = true;
-		}
-
-		if (mUUID == gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE))
-		{
-			is_movable = FALSE; // It's generally movable but not into Favorites folder. EXT-1604
-		}
-
-		if( is_movable )
-		{
-			gInventory.collectDescendents( cat_id, descendent_categories, descendent_items, FALSE );
-
-			for( i = 0; i < descendent_categories.count(); i++ )
-			{
-				LLInventoryCategory* category = descendent_categories[i];
-				if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
-				{
-					// ...can't move "special folders" like Textures
-					is_movable = FALSE;
-					break;
-				}
-			}
-
-			if( is_movable )
-			{
-				if( move_is_into_trash )
-				{
-					for( i = 0; i < descendent_items.count(); i++ )
-					{
-						LLInventoryItem* item = descendent_items[i];
-						if( (item->getType() == LLAssetType::AT_CLOTHING) ||
-							(item->getType() == LLAssetType::AT_BODYPART) )
-						{
-							if( gAgentWearables.isWearingItem( item->getUUID() ) )
-							{
-								is_movable = FALSE;  // It's generally movable, but not into the trash!
-								break;
-							}
-						}
-						else
-						if( item->getType() == LLAssetType::AT_OBJECT )
-						{
-							if( avatar->isWearingAttachment( item->getUUID() ) )
-							{
-								is_movable = FALSE;  // It's generally movable, but not into the trash!
-								break;
-							}
-						}
-					}
-				}
-			}
-		}
-
-
-		accept =	is_movable
-					&& (mUUID != cat_id)								// Can't move a folder into itself
-					&& (mUUID != inv_cat->getParentUUID())				// Avoid moves that would change nothing
-					&& !(model->isObjectDescendentOf(mUUID, cat_id));	// Avoid circularity
-		if(accept && drop)
-		{
-			// Look for any gestures and deactivate them
-			if (move_is_into_trash)
-			{
-				for (i = 0; i < descendent_items.count(); i++)
-				{
-					LLInventoryItem* item = descendent_items[i];
-					if (item->getType() == LLAssetType::AT_GESTURE
-						&& LLGestureManager::instance().isGestureActive(item->getUUID()))
-					{
-						LLGestureManager::instance().deactivateGesture(item->getUUID());
-					}
-				}
-			}
-			// if target is an outfit or current outfit folder we use link
-			if (move_is_into_current_outfit || move_is_into_outfit)
-			{
-				if (inv_cat->getPreferredType() == LLFolderType::FT_NONE)
-				{
-					if (move_is_into_current_outfit)
-					{
-						// traverse category and add all contents to currently worn.
-						BOOL append = true;
-						LLAppearanceManager::instance().wearInventoryCategory(inv_cat, false, append);
-					}
-					else
-					{
-						// Recursively create links in target outfit.
-						LLInventoryModel::cat_array_t cats;
-						LLInventoryModel::item_array_t items;
-						gInventory.collectDescendents(inv_cat->getUUID(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
-						LLAppearanceManager::instance().linkAll(mUUID,items,NULL);
-					}
-				}
-				else
-				{
-#if SUPPORT_ENSEMBLES
-				// BAP - should skip if dup.
-				if (move_is_into_current_outfit)
-				{
-					LLAppearanceManager::instance().addEnsembleLink(inv_cat);
-				}
-				else
-				{
-					LLPointer<LLInventoryCallback> cb = NULL;
-					link_inventory_item(
-						gAgent.getID(),
-						inv_cat->getUUID(),
-						mUUID,
-						inv_cat->getName(),
-						LLAssetType::AT_LINK_FOLDER,
-						cb);
-				}
-#endif
-				}
-			}
-			else
-			{
-
-				// Reparent the folder and restamp children if it's moving
-				// into trash.
-				LLInvFVBridge::changeCategoryParent(
-					model,
-					(LLViewerInventoryCategory*)inv_cat,
-					mUUID,
-					move_is_into_trash);
-			}
-		}
-	}
-	else if(LLToolDragAndDrop::SOURCE_WORLD == source)
-	{
-		// content category has same ID as object itself
-		LLUUID object_id = inv_cat->getUUID();
-		LLUUID category_id = mUUID;
-		accept = move_inv_category_world_to_agent(object_id, category_id, drop);
-	}
-	return accept;
-}
-
-void warn_move_inventory(LLViewerObject* object, LLMoveInv* move_inv)
-{
-	const char* dialog = NULL;
-	if (object->flagScripted())
-	{
-		dialog = "MoveInventoryFromScriptedObject";
-	}
-	else
-	{
-		dialog = "MoveInventoryFromObject";
-	}
-	LLNotifications::instance().add(dialog, LLSD(), LLSD(), boost::bind(move_task_inventory_callback, _1, _2, move_inv));
-}
-
-// Move/copy all inventory items from the Contents folder of an in-world
-// object to the agent's inventory, inside a given category.
-BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
-									  const LLUUID& category_id,
-									  BOOL drop,
-									  void (*callback)(S32, void*),
-									  void* user_data)
-{
-	// Make sure the object exists. If we allowed dragging from
-	// anonymous objects, it would be possible to bypass
-	// permissions.
-	// content category has same ID as object itself
-	LLViewerObject* object = gObjectList.findObject(object_id);
-	if(!object)
-	{
-		llinfos << "Object not found for drop." << llendl;
-		return FALSE;
-	}
-
-	// this folder is coming from an object, as there is only one folder in an object, the root,
-	// we need to collect the entire contents and handle them as a group
-	InventoryObjectList inventory_objects;
-	object->getInventoryContents(inventory_objects);
-
-	if (inventory_objects.empty())
-	{
-		llinfos << "Object contents not found for drop." << llendl;
-		return FALSE;
-	}
-
-	BOOL accept = TRUE;
-	BOOL is_move = FALSE;
-
-	// coming from a task. Need to figure out if the person can
-	// move/copy this item.
-	InventoryObjectList::iterator it = inventory_objects.begin();
-	InventoryObjectList::iterator end = inventory_objects.end();
-	for ( ; it != end; ++it)
-	{
-		// coming from a task. Need to figure out if the person can
-		// move/copy this item.
-		LLPermissions perm(((LLInventoryItem*)((LLInventoryObject*)(*it)))->getPermissions());
-		if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID())
-			&& perm.allowTransferTo(gAgent.getID())))
-//			|| gAgent.isGodlike())
-		{
-			accept = TRUE;
-		}
-		else if(object->permYouOwner())
-		{
-			// If the object cannot be copied, but the object the
-			// inventory is owned by the agent, then the item can be
-			// moved from the task to agent inventory.
-			is_move = TRUE;
-			accept = TRUE;
-		}
-		else
-		{
-			accept = FALSE;
-			break;
-		}
-	}
-
-	if(drop && accept)
-	{
-		it = inventory_objects.begin();
-		InventoryObjectList::iterator first_it = inventory_objects.begin();
-		LLMoveInv* move_inv = new LLMoveInv;
-		move_inv->mObjectID = object_id;
-		move_inv->mCategoryID = category_id;
-		move_inv->mCallback = callback;
-		move_inv->mUserData = user_data;
-
-		for ( ; it != end; ++it)
-		{
-			two_uuids_t two(category_id, (*it)->getUUID());
-			move_inv->mMoveList.push_back(two);
-		}
-
-		if(is_move)
-		{
-			// Callback called from within here.
-			warn_move_inventory(object, move_inv);
-		}
-		else
-		{
-			LLNotification::Params params("MoveInventoryFromObject");
-			params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv));
-			LLNotifications::instance().forceResponse(params, 0);
-		}
-	}
-	return accept;
-}
-
-bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat,
-									 LLInventoryItem* item)
-{
-	// Valid COF items are:
-	// - links to wearables (body parts or clothing)
-	// - links to attachments
-	// - links to gestures
-	// - links to ensemble folders
-	LLViewerInventoryItem *linked_item = ((LLViewerInventoryItem*)item)->getLinkedItem(); // BAP - safe?
-	if (linked_item)
-	{
-		LLAssetType::EType type = linked_item->getType();
-		return (type == LLAssetType::AT_CLOTHING ||
-				type == LLAssetType::AT_BODYPART ||
-				type == LLAssetType::AT_GESTURE ||
-				type == LLAssetType::AT_OBJECT);
-	}
-	else
-	{
-		LLViewerInventoryCategory *linked_category = ((LLViewerInventoryItem*)item)->getLinkedCategory(); // BAP - safe?
-		// BAP remove AT_NONE support after ensembles are fully working?
-		return (linked_category &&
-				((linked_category->getPreferredType() == LLFolderType::FT_NONE) ||
-				 (LLFolderType::lookupIsEnsembleType(linked_category->getPreferredType()))));
-	}
-}
-
-
-bool LLFindWearables::operator()(LLInventoryCategory* cat,
-								 LLInventoryItem* item)
-{
-	if(item)
-	{
-		if((item->getType() == LLAssetType::AT_CLOTHING)
-		   || (item->getType() == LLAssetType::AT_BODYPART))
-		{
-			return TRUE;
-		}
-	}
-	return FALSE;
-}
-
-
-
-//Used by LLFolderBridge as callback for directory recursion.
-class LLRightClickInventoryFetchObserver : public LLInventoryFetchObserver
-{
-public:
-	LLRightClickInventoryFetchObserver() :
-		mCopyItems(false)
-	{ };
-	LLRightClickInventoryFetchObserver(const LLUUID& cat_id, bool copy_items) :
-		mCatID(cat_id),
-		mCopyItems(copy_items)
-		{ };
-	virtual void done()
-	{
-		// we've downloaded all the items, so repaint the dialog
-		LLFolderBridge::staticFolderOptionsMenu();
-
-		gInventory.removeObserver(this);
-		delete this;
-	}
-
-
-protected:
-	LLUUID mCatID;
-	bool mCopyItems;
-
-};
-
-//Used by LLFolderBridge as callback for directory recursion.
-class LLRightClickInventoryFetchDescendentsObserver : public LLInventoryFetchDescendentsObserver
-{
-public:
-	LLRightClickInventoryFetchDescendentsObserver(bool copy_items) : mCopyItems(copy_items) {}
-	~LLRightClickInventoryFetchDescendentsObserver() {}
-	virtual void done();
-protected:
-	bool mCopyItems;
-};
-
-void LLRightClickInventoryFetchDescendentsObserver::done()
-{
-	// Avoid passing a NULL-ref as mCompleteFolders.front() down to
-	// gInventory.collectDescendents()
-	if( mCompleteFolders.empty() )
-	{
-		llwarns << "LLRightClickInventoryFetchDescendentsObserver::done with empty mCompleteFolders" << llendl;
-		dec_busy_count();
-		gInventory.removeObserver(this);
-		delete this;
-		return;
-	}
-
-	// What we do here is get the complete information on the items in
-	// the library, and set up an observer that will wait for that to
-	// happen.
-	LLInventoryModel::cat_array_t cat_array;
-	LLInventoryModel::item_array_t item_array;
-	gInventory.collectDescendents(mCompleteFolders.front(),
-								  cat_array,
-								  item_array,
-								  LLInventoryModel::EXCLUDE_TRASH);
-	S32 count = item_array.count();
-#if 0 // HACK/TODO: Why?
-	// This early causes a giant menu to get produced, and doesn't seem to be needed.
-	if(!count)
-	{
-		llwarns << "Nothing fetched in category " << mCompleteFolders.front()
-				<< llendl;
-		dec_busy_count();
-		gInventory.removeObserver(this);
-		delete this;
-		return;
-	}
-#endif
-
-	LLRightClickInventoryFetchObserver* outfit;
-	outfit = new LLRightClickInventoryFetchObserver(mCompleteFolders.front(), mCopyItems);
-	LLInventoryFetchObserver::item_ref_t ids;
-	for(S32 i = 0; i < count; ++i)
-	{
-		ids.push_back(item_array.get(i)->getUUID());
-	}
-
-	// clean up, and remove this as an observer since the call to the
-	// outfit could notify observers and throw us into an infinite
-	// loop.
-	dec_busy_count();
-	gInventory.removeObserver(this);
-	delete this;
-
-	// increment busy count and either tell the inventory to check &
-	// call done, or add this object to the inventory for observation.
-	inc_busy_count();
-
-	// do the fetch
-	outfit->fetchItems(ids);
-	outfit->done();				//Not interested in waiting and this will be right 99% of the time.
-//Uncomment the following code for laggy Inventory UI.
-/*	if(outfit->isEverythingComplete())
-	{
-		// everything is already here - call done.
-		outfit->done();
-	}
-	else
-	{
-		// it's all on it's way - add an observer, and the inventory
-		// will call done for us when everything is here.
-		gInventory.addObserver(outfit);
-	}*/
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryWearObserver
-//
-// Observer for "copy and wear" operation to support knowing
-// when the all of the contents have been added to inventory.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLInventoryCopyAndWearObserver : public LLInventoryObserver
-{
-public:
-	LLInventoryCopyAndWearObserver(const LLUUID& cat_id, int count) :mCatID(cat_id), mContentsCount(count), mFolderAdded(FALSE) {}
-	virtual ~LLInventoryCopyAndWearObserver() {}
-	virtual void changed(U32 mask);
-
-protected:
-	LLUUID mCatID;
-	int    mContentsCount;
-	BOOL   mFolderAdded;
-};
-
-
-
-void LLInventoryCopyAndWearObserver::changed(U32 mask)
-{
-	if((mask & (LLInventoryObserver::ADD)) != 0)
-	{
-		if (!mFolderAdded)
-		{
-			const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
-
-			std::set<LLUUID>::const_iterator id_it = changed_items.begin();
-			std::set<LLUUID>::const_iterator id_end = changed_items.end();
-			for (;id_it != id_end; ++id_it)
-			{
-				if ((*id_it) == mCatID)
-				{
-					mFolderAdded = TRUE;
-					break;
-				}
-			}
-		}
-
-		if (mFolderAdded)
-		{
-			LLViewerInventoryCategory* category = gInventory.getCategory(mCatID);
-
-			if (NULL == category)
-			{
-				llwarns << "gInventory.getCategory(" << mCatID
-					<< ") was NULL" << llendl;
-			}
-			else
-			{
-				if (category->getDescendentCount() ==
-				    mContentsCount)
-				{
-					gInventory.removeObserver(this);
-					LLAppearanceManager::instance().wearInventoryCategory(category, FALSE, TRUE);
-					delete this;
-				}
-			}
-		}
-
-	}
-}
-
-
-
-void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
-{
-	if ("open" == action)
-	{
-		openItem();
-		return;
-	}
-	else if ("paste" == action)
-	{
-		pasteFromClipboard();
-		return;
-	}
-	else if ("paste_link" == action)
-	{
-		pasteLinkFromClipboard();
-		return;
-	}
-	else if ("properties" == action)
-	{
-		showProperties();
-		return;
-	}
-	else if ("replaceoutfit" == action)
-	{
-		modifyOutfit(FALSE);
-		return;
-	}
-#if SUPPORT_ENSEMBLES
-	else if ("wearasensemble" == action)
-	{
-		LLInventoryModel* model = getInventoryModel();
-		if(!model) return;
-		LLViewerInventoryCategory* cat = getCategory();
-		if(!cat) return;
-		LLAppearanceManager::instance().addEnsembleLink(cat,true);
-		return;
-	}
-#endif
-	else if ("addtooutfit" == action)
-	{
-		modifyOutfit(TRUE);
-		return;
-	}
-	else if ("copy" == action)
-	{
-		copyToClipboard();
-		return;
-	}
-	else if ("removefromoutfit" == action)
-	{
-		LLInventoryModel* model = getInventoryModel();
-		if(!model) return;
-		LLViewerInventoryCategory* cat = getCategory();
-		if(!cat) return;
-
-		remove_inventory_category_from_avatar ( cat );
-		return;
-	}
-	else if ("purge" == action)
-	{
-		purgeItem(model, mUUID);
-		return;
-	}
-	else if ("restore" == action)
-	{
-		restoreItem();
-		return;
-	}
-}
-
-void LLFolderBridge::openItem()
-{
-	lldebugs << "LLFolderBridge::openItem()" << llendl;
-	LLInventoryModel* model = getInventoryModel();
-	if(!model) return;
-	if(mUUID.isNull()) return;
-	bool fetching_inventory = model->fetchDescendentsOf(mUUID);
-	// Only change folder type if we have the folder contents.
-	if (!fetching_inventory)
-	{
-		// Disabling this for now, it's causing crash when new items are added to folders
-		// since folder type may change before new item item has finished processing.
-		// determineFolderType();
-	}
-}
-
-void LLFolderBridge::closeItem()
-{
-	determineFolderType();
-}
-
-void LLFolderBridge::determineFolderType()
-{
-	if (isUpToDate())
-	{
-		LLInventoryModel* model = getInventoryModel();
-		LLViewerInventoryCategory* category = model->getCategory(mUUID);
-		category->determineFolderType();
-	}
-}
-
-BOOL LLFolderBridge::isItemRenameable() const
-{
-	LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)getCategory();
-	if(cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType())
-	   && (cat->getOwnerID() == gAgent.getID()))
-	{
-		return TRUE;
-	}
-	return FALSE;
-}
-
-void LLFolderBridge::restoreItem()
-{
-	LLViewerInventoryCategory* cat;
-	cat = (LLViewerInventoryCategory*)getCategory();
-	if(cat)
-	{
-		LLInventoryModel* model = getInventoryModel();
-		const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(cat->getType()));
-		// do not restamp children on restore
-		LLInvFVBridge::changeCategoryParent(model, cat, new_parent, FALSE);
-	}
-}
-
-LLFolderType::EType LLFolderBridge::getPreferredType() const
-{
-	LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
-	LLViewerInventoryCategory* cat = getCategory();
-	if(cat)
-	{
-		preferred_type = cat->getPreferredType();
-	}
-
-	return preferred_type;
-}
-
-// Icons for folders are based on the preferred type
-LLUIImagePtr LLFolderBridge::getIcon() const
-{
-	LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
-	LLViewerInventoryCategory* cat = getCategory();
-	if(cat)
-	{
-		preferred_type = cat->getPreferredType();
-	}
-	return getIcon(preferred_type);
-}
-
-LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type)
-{
-	// we only have one folder image now
-	return LLUI::getUIImage("Inv_FolderClosed");
-}
-
-BOOL LLFolderBridge::renameItem(const std::string& new_name)
-{
-	if(!isItemRenameable())
-		return FALSE;
-	LLInventoryModel* model = getInventoryModel();
-	if(!model)
-		return FALSE;
-	LLViewerInventoryCategory* cat = getCategory();
-	if(cat && (cat->getName() != new_name))
-	{
-		LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat);
-		new_cat->rename(new_name);
-		new_cat->updateServer(FALSE);
-		model->updateCategory(new_cat);
-
-		model->notifyObservers();
-	}
-	// return FALSE because we either notified observers (& therefore
-	// rebuilt) or we didn't update.
-	return FALSE;
-}
-
-BOOL LLFolderBridge::removeItem()
-{
-	if(!isItemRemovable())
-	{
-		return FALSE;
-	}
-	// move it to the trash
-	LLPreview::hide(mUUID);
-	LLInventoryModel* model = getInventoryModel();
-	if(!model) return FALSE;
-
-	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
-
-	// Look for any gestures and deactivate them
-	LLInventoryModel::cat_array_t	descendent_categories;
-	LLInventoryModel::item_array_t	descendent_items;
-	gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE );
-
-	S32 i;
-	for (i = 0; i < descendent_items.count(); i++)
-	{
-		LLInventoryItem* item = descendent_items[i];
-		if (item->getType() == LLAssetType::AT_GESTURE
-			&& LLGestureManager::instance().isGestureActive(item->getUUID()))
-		{
-			LLGestureManager::instance().deactivateGesture(item->getUUID());
-		}
-	}
-
-	// go ahead and do the normal remove if no 'last calling
-	// cards' are being removed.
-	LLViewerInventoryCategory* cat = getCategory();
-	if(cat)
-	{
-		LLInvFVBridge::changeCategoryParent(model, cat, trash_id, TRUE);
-	}
-
-	return TRUE;
-}
-
-void LLFolderBridge::pasteFromClipboard()
-{
-	LLInventoryModel* model = getInventoryModel();
-	if(model && isClipboardPasteable())
-	{
-		LLInventoryItem* item = NULL;
-		LLDynamicArray<LLUUID> objects;
-		LLInventoryClipboard::instance().retrieve(objects);
-		S32 count = objects.count();
-		const LLUUID parent_id(mUUID);
-		for(S32 i = 0; i < count; i++)
-		{
-			item = model->getItem(objects.get(i));
-			if (item)
-			{
-				if(LLInventoryClipboard::instance().isCutMode())
-				{
-					// move_inventory_item() is not enough,
-					//we have to update inventory locally too
-					changeItemParent(model, dynamic_cast<LLViewerInventoryItem*>(item), parent_id, FALSE);
-				}
-				else
-				{
-					copy_inventory_item(
-						gAgent.getID(),
-						item->getPermissions().getOwner(),
-						item->getUUID(),
-						parent_id,
-						std::string(),
-						LLPointer<LLInventoryCallback>(NULL));
-				}
-			}
-		}
-	}
-}
-
-void LLFolderBridge::pasteLinkFromClipboard()
-{
-	const LLInventoryModel* model = getInventoryModel();
-	if(model)
-	{
-		LLDynamicArray<LLUUID> objects;
-		LLInventoryClipboard::instance().retrieve(objects);
-		S32 count = objects.count();
-		LLUUID parent_id(mUUID);
-		for(S32 i = 0; i < count; i++)
-		{
-			const LLUUID &object_id = objects.get(i);
-#if SUPPORT_ENSEMBLES
-			if (LLInventoryCategory *cat = model->getCategory(object_id))
-			{
-				link_inventory_item(
-					gAgent.getID(),
-					cat->getUUID(),
-					parent_id,
-					cat->getName(),
-					LLAssetType::AT_LINK_FOLDER,
-					LLPointer<LLInventoryCallback>(NULL));
-			}
-			else
-#endif
-			if (LLInventoryItem *item = model->getItem(object_id))
-			{
-				link_inventory_item(
-					gAgent.getID(),
-					item->getLinkedUUID(),
-					parent_id,
-					item->getName(),
-					LLAssetType::AT_LINK,
-					LLPointer<LLInventoryCallback>(NULL));
-			}
-		}
-	}
-}
-
-void LLFolderBridge::staticFolderOptionsMenu()
-{
-	if (!sSelf) return;
-	sSelf->folderOptionsMenu();
-}
-
-void LLFolderBridge::folderOptionsMenu()
-{
-	std::vector<std::string> disabled_items;
-
-	LLInventoryModel* model = getInventoryModel();
-	if(!model) return;
-
-	const LLInventoryCategory* category = model->getCategory(mUUID);
-	LLFolderType::EType type = category->getPreferredType();
-	const bool is_default_folder = category && LLFolderType::lookupIsProtectedType(type);
-	// BAP change once we're no longer treating regular categories as ensembles.
-	const bool is_ensemble = category && (type == LLFolderType::FT_NONE ||
-										  LLFolderType::lookupIsEnsembleType(type));
-
-	// calling card related functionality for folders.
-
-	// Only enable calling-card related options for non-default folders.
-	if (!is_default_folder)
-	{
-		LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD);
-		if (mCallingCards || checkFolderForContentsOfType(model, is_callingcard))
-		{
-			mItems.push_back(std::string("Calling Card Separator"));
-			mItems.push_back(std::string("Conference Chat Folder"));
-			mItems.push_back(std::string("IM All Contacts In Folder"));
-		}
-	}
-
-	// wearables related functionality for folders.
-	//is_wearable
-	LLFindWearables is_wearable;
-	LLIsType is_object( LLAssetType::AT_OBJECT );
-	LLIsType is_gesture( LLAssetType::AT_GESTURE );
-
-	if (mWearables ||
-		checkFolderForContentsOfType(model, is_wearable)  ||
-		checkFolderForContentsOfType(model, is_object) ||
-		checkFolderForContentsOfType(model, is_gesture) )
-	{
-		mItems.push_back(std::string("Folder Wearables Separator"));
-
-		// Only enable add/replace outfit for non-default folders.
-		if (!is_default_folder)
-		{
-			mItems.push_back(std::string("Add To Outfit"));
-			mItems.push_back(std::string("Replace Outfit"));
-		}
-		if (is_ensemble)
-		{
-			mItems.push_back(std::string("Wear As Ensemble"));
-		}
-		mItems.push_back(std::string("Remove From Outfit"));
-	}
-	hide_context_entries(*mMenu, mItems, disabled_items);
-}
-
-BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& is_type)
-{
-	LLInventoryModel::cat_array_t cat_array;
-	LLInventoryModel::item_array_t item_array;
-	model->collectDescendentsIf(mUUID,
-								cat_array,
-								item_array,
-								LLInventoryModel::EXCLUDE_TRASH,
-								is_type);
-	return ((item_array.count() > 0) ? TRUE : FALSE );
-}
-
-// Flags unused
-void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
-{
-	mItems.clear();
-	mDisabledItems.clear();
-
-	lldebugs << "LLFolderBridge::buildContextMenu()" << llendl;
-//	std::vector<std::string> disabled_items;
-	LLInventoryModel* model = getInventoryModel();
-	if(!model) return;
-	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
-	const LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
-
-	mItems.clear(); //adding code to clear out member Items (which means Items should not have other data here at this point)
-	mDisabledItems.clear(); //adding code to clear out disabled members from previous
-	if (lost_and_found_id == mUUID)
-	  {
-		// This is the lost+found folder.
-		  mItems.push_back(std::string("Empty Lost And Found"));
-	  }
-
-	if(trash_id == mUUID)
-	{
-		// This is the trash.
-		mItems.push_back(std::string("Empty Trash"));
-	}
-	else if(model->isObjectDescendentOf(mUUID, trash_id))
-	{
-		// This is a folder in the trash.
-		mItems.clear(); // clear any items that used to exist
-		mItems.push_back(std::string("Purge Item"));
-		if (!isItemRemovable())
-		{
-			mDisabledItems.push_back(std::string("Purge Item"));
-		}
-
-		mItems.push_back(std::string("Restore Item"));
-	}
-	else if(isAgentInventory()) // do not allow creating in library
-	{
-		LLViewerInventoryCategory *cat =  getCategory();
-		// BAP removed protected check to re-enable standard ops in untyped folders.
-		// Not sure what the right thing is to do here.
-		if (!isCOFFolder() && cat /*&&
-			LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())*/)
-		{
-			// Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694.
-			if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat))
-				mItems.push_back(std::string("New Folder"));
-			mItems.push_back(std::string("New Script"));
-			mItems.push_back(std::string("New Note"));
-			mItems.push_back(std::string("New Gesture"));
-			mItems.push_back(std::string("New Clothes"));
-			mItems.push_back(std::string("New Body Parts"));
-			mItems.push_back(std::string("Change Type"));
-
-			LLViewerInventoryCategory *cat = getCategory();
-			if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
-			{
-				mDisabledItems.push_back(std::string("Change Type"));
-			}
-
-			getClipboardEntries(false, mItems, mDisabledItems, flags);
-		}
-		else
-		{
-			// Want some but not all of the items from getClipboardEntries for outfits.
-			if (cat && cat->getPreferredType()==LLFolderType::FT_OUTFIT)
-			{
-				mItems.push_back(std::string("Rename"));
-				mItems.push_back(std::string("Delete"));
-			}
-		}
-
-		//Added by spatters to force inventory pull on right-click to display folder options correctly. 07-17-06
-		mCallingCards = mWearables = FALSE;
-
-		LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD);
-		if (checkFolderForContentsOfType(model, is_callingcard))
-		{
-			mCallingCards=TRUE;
-		}
-
-		LLFindWearables is_wearable;
-		LLIsType is_object( LLAssetType::AT_OBJECT );
-		LLIsType is_gesture( LLAssetType::AT_GESTURE );
-
-		if (checkFolderForContentsOfType(model, is_wearable)  ||
-			checkFolderForContentsOfType(model, is_object) ||
-			checkFolderForContentsOfType(model, is_gesture) )
-		{
-			mWearables=TRUE;
-		}
-
-		mMenu = &menu;
-		sSelf = this;
-		LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(FALSE);
-
-		LLInventoryFetchDescendentsObserver::folder_ref_t folders;
-		LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID);
-		if (category)
-		{
-			folders.push_back(category->getUUID());
-		}
-		fetch->fetchDescendents(folders);
-		inc_busy_count();
-		if(fetch->isEverythingComplete())
-		{
-			// everything is already here - call done.
-			fetch->done();
-		}
-		else
-		{
-			// it's all on it's way - add an observer, and the inventory
-			// will call done for us when everything is here.
-			gInventory.addObserver(fetch);
-		}
-	}
-	else
-	{
-		mItems.push_back(std::string("--no options--"));
-		mDisabledItems.push_back(std::string("--no options--"));
-	}
-	hide_context_entries(menu, mItems, mDisabledItems);
-}
-
-BOOL LLFolderBridge::hasChildren() const
-{
-	LLInventoryModel* model = getInventoryModel();
-	if(!model) return FALSE;
-	LLInventoryModel::EHasChildren has_children;
-	has_children = gInventory.categoryHasChildren(mUUID);
-	return has_children != LLInventoryModel::CHILDREN_NO;
-}
-
-BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,
-								EDragAndDropType cargo_type,
-								void* cargo_data)
-{
-	//llinfos << "LLFolderBridge::dragOrDrop()" << llendl;
-	BOOL accept = FALSE;
-	switch(cargo_type)
-	{
-		case DAD_TEXTURE:
-		case DAD_SOUND:
-		case DAD_CALLINGCARD:
-		case DAD_LANDMARK:
-		case DAD_SCRIPT:
-		case DAD_OBJECT:
-		case DAD_NOTECARD:
-		case DAD_CLOTHING:
-		case DAD_BODYPART:
-		case DAD_ANIMATION:
-		case DAD_GESTURE:
-		case DAD_LINK:
-			accept = dragItemIntoFolder((LLInventoryItem*)cargo_data,
-										drop);
-			break;
-		case DAD_CATEGORY:
-			if (LLFriendCardsManager::instance().isAnyFriendCategory(mUUID))
-			{
-				accept = FALSE;
-			}
-			else
-			{
-				accept = dragCategoryIntoFolder((LLInventoryCategory*)cargo_data, drop);
-			}
-			break;
-		default:
-			break;
-	}
-	return accept;
-}
-
-LLViewerInventoryCategory* LLFolderBridge::getCategory() const
-{
-	LLViewerInventoryCategory* cat = NULL;
-	LLInventoryModel* model = getInventoryModel();
-	if(model)
-	{
-		cat = (LLViewerInventoryCategory*)model->getCategory(mUUID);
-	}
-	return cat;
-}
-
-
-// static
-void LLFolderBridge::pasteClipboard(void* user_data)
-{
-	LLFolderBridge* self = (LLFolderBridge*)user_data;
-	if(self) self->pasteFromClipboard();
-}
-
-void LLFolderBridge::createNewCategory(void* user_data)
-{
-	LLFolderBridge* bridge = (LLFolderBridge*)user_data;
-	if(!bridge) return;
-	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(bridge->mInventoryPanel.get());
-	if (!panel) return;
-	LLInventoryModel* model = panel->getModel();
-	if(!model) return;
-	LLUUID id;
-	id = model->createNewCategory(bridge->getUUID(),
-								  LLFolderType::FT_NONE,
-								  LLStringUtil::null);
-	model->notifyObservers();
-
-	// At this point, the bridge has probably been deleted, but the
-	// view is still there.
-	panel->setSelection(id, TAKE_FOCUS_YES);
-}
-
-void LLFolderBridge::createNewShirt(void* user_data)
-{
-	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHIRT);
-}
-
-void LLFolderBridge::createNewPants(void* user_data)
-{
-	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_PANTS);
-}
-
-void LLFolderBridge::createNewShoes(void* user_data)
-{
-	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHOES);
-}
-
-void LLFolderBridge::createNewSocks(void* user_data)
-{
-	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SOCKS);
-}
-
-void LLFolderBridge::createNewJacket(void* user_data)
-{
-	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_JACKET);
-}
-
-void LLFolderBridge::createNewSkirt(void* user_data)
-{
-	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIRT);
-}
-
-void LLFolderBridge::createNewGloves(void* user_data)
-{
-	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_GLOVES);
-}
-
-void LLFolderBridge::createNewUndershirt(void* user_data)
-{
-	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERSHIRT);
-}
-
-void LLFolderBridge::createNewUnderpants(void* user_data)
-{
-	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERPANTS);
-}
-
-void LLFolderBridge::createNewShape(void* user_data)
-{
-	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHAPE);
-}
-
-void LLFolderBridge::createNewSkin(void* user_data)
-{
-	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIN);
-}
-
-void LLFolderBridge::createNewHair(void* user_data)
-{
-	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_HAIR);
-}
-
-void LLFolderBridge::createNewEyes(void* user_data)
-{
-	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_EYES);
-}
-
-// static
-void LLFolderBridge::createWearable(LLFolderBridge* bridge, EWearableType type)
-{
-	if(!bridge) return;
-	LLUUID parent_id = bridge->getUUID();
-	createWearable(parent_id, type);
-}
-
-// Separate function so can be called by global menu as well as right-click
-// menu.
-// static
-void LLFolderBridge::createWearable(const LLUUID &parent_id, EWearableType type)
-{
-	LLWearable* wearable = LLWearableList::instance().createNewWearable(type);
-	LLAssetType::EType asset_type = wearable->getAssetType();
-	LLInventoryType::EType inv_type = LLInventoryType::IT_WEARABLE;
-	create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
-		parent_id, wearable->getTransactionID(), wearable->getName(),
-		wearable->getDescription(), asset_type, inv_type, wearable->getType(),
-		wearable->getPermissions().getMaskNextOwner(),
-		LLPointer<LLInventoryCallback>(NULL));
-}
-
-void LLFolderBridge::modifyOutfit(BOOL append)
-{
-	LLInventoryModel* model = getInventoryModel();
-	if(!model) return;
-	LLViewerInventoryCategory* cat = getCategory();
-	if(!cat) return;
-
-	// BAP - was:
-	// wear_inventory_category_on_avatar( cat, append );
-	LLAppearanceManager::instance().wearInventoryCategory( cat, FALSE, append );
-}
-
-// helper stuff
-bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv* move_inv)
-{
-	LLFloaterOpenObject::LLCatAndWear* cat_and_wear = (LLFloaterOpenObject::LLCatAndWear* )move_inv->mUserData;
-	LLViewerObject* object = gObjectList.findObject(move_inv->mObjectID);
-	S32 option = LLNotification::getSelectedOption(notification, response);
-
-	if(option == 0 && object)
-	{
-		if (cat_and_wear && cat_and_wear->mWear)
-		{
-			InventoryObjectList inventory_objects;
-			object->getInventoryContents(inventory_objects);
-			int contents_count = inventory_objects.size()-1; //subtract one for containing folder
-
-			LLInventoryCopyAndWearObserver* inventoryObserver = new LLInventoryCopyAndWearObserver(cat_and_wear->mCatID, contents_count);
-			gInventory.addObserver(inventoryObserver);
-		}
-
-		two_uuids_list_t::iterator move_it;
-		for (move_it = move_inv->mMoveList.begin();
-			move_it != move_inv->mMoveList.end();
-			++move_it)
-		{
-			object->moveInventory(move_it->first, move_it->second);
-		}
-
-		// update the UI.
-		dialog_refresh_all();
-	}
-
-	if (move_inv->mCallback)
-	{
-		move_inv->mCallback(option, move_inv->mUserData);
-	}
-
-	delete move_inv;
-	return false;
-}
-
-/*
-Next functions intended to reorder items in the inventory folder and save order on server
-Is now used for Favorites folder.
-
-*TODO: refactoring is needed with Favorites Bar functionality. Probably should be moved in LLInventoryModel
-*/
-void saveItemsOrder(LLInventoryModel::item_array_t& items)
-{
-	int sortField = 0;
-
-	// current order is saved by setting incremental values (1, 2, 3, ...) for the sort field
-	for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i)
-	{
-		LLViewerInventoryItem* item = *i;
-
-		item->setSortField(++sortField);
-		item->setComplete(TRUE);
-		item->updateServer(FALSE);
-
-		gInventory.updateItem(item);
-	}
-
-	gInventory.notifyObservers();
-}
-
-LLInventoryModel::item_array_t::iterator findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id)
-{
-	LLInventoryModel::item_array_t::iterator result = items.end();
-
-	for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i)
-	{
-		if ((*i)->getUUID() == id)
-		{
-			result = i;
-			break;
-		}
-	}
-
-	return result;
-}
-
-void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& srcItemId, const LLUUID& destItemId)
-{
-	LLViewerInventoryItem* srcItem = gInventory.getItem(srcItemId);
-	LLViewerInventoryItem* destItem = gInventory.getItem(destItemId);
-
-	items.erase(findItemByUUID(items, srcItem->getUUID()));
-	items.insert(findItemByUUID(items, destItem->getUUID()), srcItem);
-}
-
-BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
-										BOOL drop)
-{
-	LLInventoryModel* model = getInventoryModel();
-	if(!model) return FALSE;
-
-	// cannot drag into library
-	if(!isAgentInventory())
-	{
-		return FALSE;
-	}
-
-	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
-	if(!avatar) return FALSE;
-
-	LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource();
-	BOOL accept = FALSE;
-	LLViewerObject* object = NULL;
-	if(LLToolDragAndDrop::SOURCE_AGENT == source)
-	{
-
-		BOOL is_movable = TRUE;
-		switch( inv_item->getActualType() )
-		{
-		case LLAssetType::AT_CATEGORY:
-			is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType());
-			break;
-		default:
-			break;
-		}
-
-		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
-		BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id);
-		const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
-		BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
-		BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
-
-		if(is_movable && move_is_into_trash)
-		{
-			switch(inv_item->getType())
-			{
-			case LLAssetType::AT_CLOTHING:
-			case LLAssetType::AT_BODYPART:
-				is_movable = !gAgentWearables.isWearingItem(inv_item->getUUID());
-				break;
-
-			case LLAssetType::AT_OBJECT:
-				is_movable = !avatar->isWearingAttachment(inv_item->getUUID());
-				break;
-			default:
-				break;
-			}
-		}
-
-		if ( is_movable )
-		{
-			// Don't allow creating duplicates in the Calling Card/Friends
-			// subfolders, see bug EXT-1599. Check is item direct descendent
-			// of target folder and forbid item's movement if it so.
-			// Note: isItemDirectDescendentOfCategory checks if
-			// passed category is in the Calling Card/Friends folder
-			is_movable = ! LLFriendCardsManager::instance()
-				.isObjDirectDescendentOfCategory (inv_item, getCategory());
-		}
-
-		const LLUUID& favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
-		const LLUUID& landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
-		const BOOL folder_allows_reorder = ((mUUID == landmarks_id) || (mUUID == favorites_id));
-	   
-		// we can move item inside a folder only if this folder is Favorites. See EXT-719
-		accept = is_movable && ((mUUID != inv_item->getParentUUID()) || folder_allows_reorder);
-		if(accept && drop)
-		{
-			if (inv_item->getType() == LLAssetType::AT_GESTURE
-				&& LLGestureManager::instance().isGestureActive(inv_item->getUUID()) && move_is_into_trash)
-			{
-				LLGestureManager::instance().deactivateGesture(inv_item->getUUID());
-			}
-			// If an item is being dragged between windows, unselect
-			// everything in the active window so that we don't follow
-			// the selection to its new location (which is very
-			// annoying).
-			if (LLFloaterInventory::getActiveInventory())
-			{
-				LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel();
-				LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
-				if (active_panel && (panel != active_panel))
-				{
-					active_panel->unSelectAll();
-				}
-			}
-
-			// if dragging from/into favorites folder only reorder items
-			if ((mUUID == inv_item->getParentUUID()) && folder_allows_reorder)
-			{
-				LLInventoryModel::cat_array_t cats;
-				LLInventoryModel::item_array_t items;
-				LLIsType is_type(LLAssetType::AT_LANDMARK);
-				model->collectDescendentsIf(mUUID, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type);
-
-				LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
-				LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL;
-				if (itemp)
-				{
-					LLUUID srcItemId = inv_item->getUUID();
-					LLUUID destItemId = itemp->getListener()->getUUID();
-
-					// update order
-					updateItemsOrder(items, srcItemId, destItemId);
-
-					saveItemsOrder(items);
-				}
-			}
-			else if (favorites_id == mUUID) // if target is the favorites folder we use copy
-			{
-				copy_inventory_item(
-					gAgent.getID(),
-					inv_item->getPermissions().getOwner(),
-					inv_item->getUUID(),
-					mUUID,
-					std::string(),
-					LLPointer<LLInventoryCallback>(NULL));
-			}
-			else if (move_is_into_current_outfit || move_is_into_outfit)
-			{
-				// BAP - should skip if dup.
-				if (move_is_into_current_outfit)
-				{
-					LLAppearanceManager::instance().addCOFItemLink(inv_item);
-				}
-				else
-				{
-					LLPointer<LLInventoryCallback> cb = NULL;
-					link_inventory_item(
-						gAgent.getID(),
-						inv_item->getLinkedUUID(),
-						mUUID,
-						inv_item->getName(),
-						LLAssetType::AT_LINK,
-						cb);
-				}
-			}
-			else
-			{
-				// restamp if the move is into the trash.
-				LLInvFVBridge::changeItemParent(
-					model,
-					(LLViewerInventoryItem*)inv_item,
-					mUUID,
-					move_is_into_trash);
-			}
-		}
-	}
-	else if(LLToolDragAndDrop::SOURCE_WORLD == source)
-	{
-		// Make sure the object exists. If we allowed dragging from
-		// anonymous objects, it would be possible to bypass
-		// permissions.
-		object = gObjectList.findObject(inv_item->getParentUUID());
-		if(!object)
-		{
-			llinfos << "Object not found for drop." << llendl;
-			return FALSE;
-		}
-
-		// coming from a task. Need to figure out if the person can
-		// move/copy this item.
-		LLPermissions perm(inv_item->getPermissions());
-		BOOL is_move = FALSE;
-		if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID())
-			&& perm.allowTransferTo(gAgent.getID())))
-//		   || gAgent.isGodlike())
-
-		{
-			accept = TRUE;
-		}
-		else if(object->permYouOwner())
-		{
-			// If the object cannot be copied, but the object the
-			// inventory is owned by the agent, then the item can be
-			// moved from the task to agent inventory.
-			is_move = TRUE;
-			accept = TRUE;
-		}
-		if(drop && accept)
-		{
-			LLMoveInv* move_inv = new LLMoveInv;
-			move_inv->mObjectID = inv_item->getParentUUID();
-			two_uuids_t item_pair(mUUID, inv_item->getUUID());
-			move_inv->mMoveList.push_back(item_pair);
-			move_inv->mCallback = NULL;
-			move_inv->mUserData = NULL;
-			if(is_move)
-			{
-				warn_move_inventory(object, move_inv);
-			}
-			else
-			{
-				LLNotification::Params params("MoveInventoryFromObject");
-				params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv));
-				LLNotifications::instance().forceResponse(params, 0);
-			}
-		}
-
-	}
-	else if(LLToolDragAndDrop::SOURCE_NOTECARD == source)
-	{
-		accept = TRUE;
-		if(drop)
-		{
-			copy_inventory_from_notecard(LLToolDragAndDrop::getInstance()->getObjectID(),
-				LLToolDragAndDrop::getInstance()->getSourceID(), inv_item);
-		}
-	}
-	else if(LLToolDragAndDrop::SOURCE_LIBRARY == source)
-	{
-		LLViewerInventoryItem* item = (LLViewerInventoryItem*)inv_item;
-		if(item && item->isComplete())
-		{
-			accept = TRUE;
-			if(drop)
-			{
-				copy_inventory_item(
-					gAgent.getID(),
-					inv_item->getPermissions().getOwner(),
-					inv_item->getUUID(),
-					mUUID,
-					std::string(),
-					LLPointer<LLInventoryCallback>(NULL));
-			}
-		}
-	}
-	else
-	{
-		llwarns << "unhandled drag source" << llendl;
-	}
-	return accept;
-}
-
-// +=================================================+
-// |        LLScriptBridge (DEPRECTED)               |
-// +=================================================+
-
-LLUIImagePtr LLScriptBridge::getIcon() const
-{
-	return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE);
-}
-
-// +=================================================+
-// |        LLTextureBridge                          |
-// +=================================================+
-
-LLUIImagePtr LLTextureBridge::getIcon() const
-{
-	return get_item_icon(LLAssetType::AT_TEXTURE, mInvType, 0, FALSE);
-}
-
-void LLTextureBridge::openItem()
-{
-	LLViewerInventoryItem* item = getItem();
-
-	if (item)
-	{
-		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
-	}
-}
-
-void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
-{
-	lldebugs << "LLTextureBridge::buildContextMenu()" << llendl;
-	std::vector<std::string> items;
-	std::vector<std::string> disabled_items;
-	if(isInTrash())
-	{
-		items.push_back(std::string("Purge Item"));
-		if (!isItemRemovable())
-		{
-			disabled_items.push_back(std::string("Purge Item"));
-		}
-
-		items.push_back(std::string("Restore Item"));
-	}
-	else
-	{
-		items.push_back(std::string("Open"));
-		items.push_back(std::string("Properties"));
-
-		getClipboardEntries(true, items, disabled_items, flags);
-
-		items.push_back(std::string("Texture Separator"));
-		items.push_back(std::string("Save As"));
-	}
-	hide_context_entries(menu, items, disabled_items);	
-}
-
-// virtual
-void LLTextureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
-{
-	if ("save_as" == action)
-	{
-		LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES);
-		LLPreviewTexture* preview_texture = LLFloaterReg::findTypedInstance<LLPreviewTexture>("preview_texture", mUUID);
-		if (preview_texture)
-		{
-			preview_texture->openToSave();
-		}
-	}
-	else LLItemBridge::performAction(folder, model, action);
-}
-
-// +=================================================+
-// |        LLSoundBridge                            |
-// +=================================================+
-
-LLUIImagePtr LLSoundBridge::getIcon() const
-{
-	return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0, FALSE);
-}
-
-void LLSoundBridge::openItem()
-{
-	LLViewerInventoryItem* item = getItem();
-
-	if (item)
-	{
-		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
-	}
-/*
-// Changed this back to the way it USED to work:
-// only open the preview dialog through the contextual right-click menu
-// double-click just plays the sound
-
-	LLViewerInventoryItem* item = getItem();
-	if(item)
-	{
-		openSoundPreview((void*)this);
-		//send_uuid_sound_trigger(item->getAssetUUID(), 1.0);
-	}
-*/
-}
-
-void LLSoundBridge::previewItem()
-{
-	LLViewerInventoryItem* item = getItem();
-	if(item)
-	{
-		send_sound_trigger(item->getAssetUUID(), 1.0);
-	}
-}
-
-void LLSoundBridge::openSoundPreview(void* which)
-{
-	LLSoundBridge *me = (LLSoundBridge *)which;
-	LLFloaterReg::showInstance("preview_sound", LLSD(me->mUUID), TAKE_FOCUS_YES);
-}
-
-void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
-{
-	lldebugs << "LLSoundBridge::buildContextMenu()" << llendl;
-	std::vector<std::string> items;
-	std::vector<std::string> disabled_items;
-
-	if(isInTrash())
-	{
-		items.push_back(std::string("Purge Item"));
-		if (!isItemRemovable())
-		{
-			disabled_items.push_back(std::string("Purge Item"));
-		}
-
-		items.push_back(std::string("Restore Item"));
-	}
-	else
-	{
-		items.push_back(std::string("Sound Open"));
-		items.push_back(std::string("Properties"));
-
-		getClipboardEntries(true, items, disabled_items, flags);
-	}
-
-	items.push_back(std::string("Sound Separator"));
-	items.push_back(std::string("Sound Play"));
-
-	hide_context_entries(menu, items, disabled_items);
-}
-
-// +=================================================+
-// |        LLLandmarkBridge                         |
-// +=================================================+
-
-LLLandmarkBridge::LLLandmarkBridge(LLInventoryPanel* inventory, const LLUUID& uuid, U32 flags/* = 0x00*/) :
-LLItemBridge(inventory, uuid)
-{
-	mVisited = FALSE;
-	if (flags & LLInventoryItem::II_FLAGS_LANDMARK_VISITED)
-	{
-		mVisited = TRUE;
-	}
-}
-
-LLUIImagePtr LLLandmarkBridge::getIcon() const
-{
-	return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, mVisited, FALSE);
-}
-
-void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
-{
-	std::vector<std::string> items;
-	std::vector<std::string> disabled_items;
-
-	lldebugs << "LLLandmarkBridge::buildContextMenu()" << llendl;
-	if(isInTrash())
-	{
-		items.push_back(std::string("Purge Item"));
-		if (!isItemRemovable())
-		{
-			disabled_items.push_back(std::string("Purge Item"));
-		}
-
-		items.push_back(std::string("Restore Item"));
-	}
-	else
-	{
-		items.push_back(std::string("Landmark Open"));
-		items.push_back(std::string("Properties"));
-
-		getClipboardEntries(true, items, disabled_items, flags);
-	}
-
-	items.push_back(std::string("Landmark Separator"));
-	items.push_back(std::string("About Landmark"));
-
-	// Disable "About Landmark" menu item for
-	// multiple landmarks selected. Only one landmark
-	// info panel can be shown at a time.
-	if ((flags & FIRST_SELECTED_ITEM) == 0)
-	{
-		disabled_items.push_back(std::string("About Landmark"));
-	}
-
-	hide_context_entries(menu, items, disabled_items);
-}
-
-// Convenience function for the two functions below.
-void teleport_via_landmark(const LLUUID& asset_id)
-{
-	gAgent.teleportViaLandmark( asset_id );
-
-	// we now automatically track the landmark you're teleporting to
-	// because you'll probably arrive at a telehub instead
-	LLFloaterWorldMap* floater_world_map = LLFloaterWorldMap::getInstance();
-	if( floater_world_map )
-	{
-		floater_world_map->trackLandmark( asset_id );
-	}
-}
-
-// virtual
-void LLLandmarkBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
-{
-	if ("teleport" == action)
-	{
-		LLViewerInventoryItem* item = getItem();
-		if(item)
-		{
-			teleport_via_landmark(item->getAssetUUID());
-		}
-	}
-	else if ("about" == action)
-	{
-		LLViewerInventoryItem* item = getItem();
-		if(item)
-		{
-			LLSD key;
-			key["type"] = "landmark";
-			key["id"] = item->getUUID();
-
-			LLSideTray::getInstance()->showPanel("panel_places", key);
-		}
-	}
-	else
-	{
-		LLItemBridge::performAction(folder, model, action);
-	}
-}
-
-static bool open_landmark_callback(const LLSD& notification, const LLSD& response)
-{
-	S32 option = LLNotification::getSelectedOption(notification, response);
-
-	LLUUID asset_id = notification["payload"]["asset_id"].asUUID();
-	if (option == 0)
-	{
-		teleport_via_landmark(asset_id);
-	}
-
-	return false;
-}
-static LLNotificationFunctorRegistration open_landmark_callback_reg("TeleportFromLandmark", open_landmark_callback);
-
-
-void LLLandmarkBridge::openItem()
-{
-	LLViewerInventoryItem* item = getItem();
-
-	if (item)
-	{
-		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
-	}
-/*
-	LLViewerInventoryItem* item = getItem();
-	if( item )
-	{
-		// Opening (double-clicking) a landmark immediately teleports,
-		// but warns you the first time.
-		// open_landmark(item);
-		LLSD payload;
-		payload["asset_id"] = item->getAssetUUID();
-		LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload);
-	}
-*/
-}
-
-
-// +=================================================+
-// |        LLCallingCardObserver                    |
-// +=================================================+
-void LLCallingCardObserver::changed(U32 mask)
-{
-	mBridgep->refreshFolderViewItem();
-}
-
-// +=================================================+
-// |        LLCallingCardBridge                      |
-// +=================================================+
-
-LLCallingCardBridge::LLCallingCardBridge( LLInventoryPanel* inventory, const LLUUID& uuid ) :
-	LLItemBridge(inventory, uuid)
-{
-	mObserver = new LLCallingCardObserver(this);
-	LLAvatarTracker::instance().addObserver(mObserver);
-}
-
-LLCallingCardBridge::~LLCallingCardBridge()
-{
-	LLAvatarTracker::instance().removeObserver(mObserver);
-	delete mObserver;
-}
-
-void LLCallingCardBridge::refreshFolderViewItem()
-{
-	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
-	LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL;
-	if (itemp)
-	{
-		itemp->refresh();
-	}
-}
-
-// virtual
-void LLCallingCardBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
-{
-	if ("begin_im" == action)
-	{
-		LLViewerInventoryItem *item = getItem();
-		if (item && (item->getCreatorUUID() != gAgent.getID()) &&
-			(!item->getCreatorUUID().isNull()))
-		{
-			std::string callingcard_name;
-			gCacheName->getFullName(item->getCreatorUUID(), callingcard_name);
-			LLUUID session_id = gIMMgr->addSession(callingcard_name, IM_NOTHING_SPECIAL, item->getCreatorUUID());
-			if (session_id != LLUUID::null)
-			{
-				LLIMFloater::show(session_id);
-			}
-		}
-	}
-	else if ("lure" == action)
-	{
-		LLViewerInventoryItem *item = getItem();
-		if (item && (item->getCreatorUUID() != gAgent.getID()) &&
-			(!item->getCreatorUUID().isNull()))
-		{
-			LLAvatarActions::offerTeleport(item->getCreatorUUID());
-		}
-	}
-	else LLItemBridge::performAction(folder, model, action);
-}
-
-LLUIImagePtr LLCallingCardBridge::getIcon() const
-{
-	BOOL online = FALSE;
-	LLViewerInventoryItem* item = getItem();
-	if(item)
-	{
-		online = LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID());
-	}
-	return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, online, FALSE);
-}
-
-std::string LLCallingCardBridge::getLabelSuffix() const
-{
-	LLViewerInventoryItem* item = getItem();
-	if( item && LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()) )
-	{
-		return LLItemBridge::getLabelSuffix() + " (online)";
-	}
-	else
-	{
-		return LLItemBridge::getLabelSuffix();
-	}
-}
-
-void LLCallingCardBridge::openItem()
-{
-	LLViewerInventoryItem* item = getItem();
-
-	if (item)
-	{
-		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
-	}
-/*
-	LLViewerInventoryItem* item = getItem();
-	if(item && !item->getCreatorUUID().isNull())
-	{
-		LLAvatarActions::showProfile(item->getCreatorUUID());
-	}
-*/
-}
-
-void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
-{
-	lldebugs << "LLCallingCardBridge::buildContextMenu()" << llendl;
-	std::vector<std::string> items;
-	std::vector<std::string> disabled_items;
-
-	if(isInTrash())
-	{
-		items.push_back(std::string("Purge Item"));
-		if (!isItemRemovable())
-		{
-			disabled_items.push_back(std::string("Purge Item"));
-		}
-
-		items.push_back(std::string("Restore Item"));
-	}
-	else
-	{
-		items.push_back(std::string("Open"));
-		items.push_back(std::string("Properties"));
-
-		getClipboardEntries(true, items, disabled_items, flags);
-
-		LLInventoryItem* item = getItem();
-		BOOL good_card = (item
-						  && (LLUUID::null != item->getCreatorUUID())
-						  && (item->getCreatorUUID() != gAgent.getID()));
-		BOOL user_online = (LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()));
-		items.push_back(std::string("Send Instant Message Separator"));
-		items.push_back(std::string("Send Instant Message"));
-		items.push_back(std::string("Offer Teleport..."));
-		items.push_back(std::string("Conference Chat"));
-
-		if (!good_card)
-		{
-			disabled_items.push_back(std::string("Send Instant Message"));
-		}
-		if (!good_card || !user_online)
-		{
-			disabled_items.push_back(std::string("Offer Teleport..."));
-			disabled_items.push_back(std::string("Conference Chat"));
-		}
-	}
-	hide_context_entries(menu, items, disabled_items);
-}
-
-BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
-									 EDragAndDropType cargo_type,
-									 void* cargo_data)
-{
-	LLViewerInventoryItem* item = getItem();
-	BOOL rv = FALSE;
-	if(item)
-	{
-		// check the type
-		switch(cargo_type)
-		{
-		case DAD_TEXTURE:
-		case DAD_SOUND:
-		case DAD_LANDMARK:
-		case DAD_SCRIPT:
-		case DAD_CLOTHING:
-		case DAD_OBJECT:
-		case DAD_NOTECARD:
-		case DAD_BODYPART:
-		case DAD_ANIMATION:
-		case DAD_GESTURE:
-			{
-				LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data;
-				const LLPermissions& perm = inv_item->getPermissions();
-				if(gInventory.getItem(inv_item->getUUID())
-				   && perm.allowOperationBy(PERM_TRANSFER, gAgent.getID()))
-				{
-					rv = TRUE;
-					if(drop)
-					{
-						LLToolDragAndDrop::giveInventory(item->getCreatorUUID(),
-														 (LLInventoryItem*)cargo_data);
-					}
-				}
-				else
-				{
-					// It's not in the user's inventory (it's probably in
-					// an object's contents), so disallow dragging it here.
-					// You can't give something you don't yet have.
-					rv = FALSE;
-				}
-				break;
-			}
-		case DAD_CATEGORY:
-			{
-				LLInventoryCategory* inv_cat = (LLInventoryCategory*)cargo_data;
-				if( gInventory.getCategory( inv_cat->getUUID() ) )
-				{
-					rv = TRUE;
-					if(drop)
-					{
-						LLToolDragAndDrop::giveInventoryCategory(
-							item->getCreatorUUID(),
-							inv_cat);
-					}
-				}
-				else
-				{
-					// It's not in the user's inventory (it's probably in
-					// an object's contents), so disallow dragging it here.
-					// You can't give something you don't yet have.
-					rv = FALSE;
-				}
-				break;
-			}
-		default:
-			break;
-		}
-	}
-	return rv;
-}
-
-BOOL LLCallingCardBridge::removeItem()
-{
-	if (LLFriendCardsManager::instance().isItemInAnyFriendsList(getItem()))
-	{
-		LLAvatarActions::removeFriendDialog(getItem()->getCreatorUUID());
-		return FALSE;
-	}
-	else
-	{
-		return LLItemBridge::removeItem();
-	}
-}
-// +=================================================+
-// |        LLNotecardBridge                         |
-// +=================================================+
-
-LLUIImagePtr LLNotecardBridge::getIcon() const
-{
-	return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE);
-}
-
-void LLNotecardBridge::openItem()
-{
-	LLViewerInventoryItem* item = getItem();
-
-	if (item)
-	{
-		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
-	}
-
-/*
-	LLViewerInventoryItem* item = getItem();
-	if (item)
-	{
-		LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES);
-	}
-*/
-}
-
-
-// +=================================================+
-// |        LLGestureBridge                          |
-// +=================================================+
-
-LLUIImagePtr LLGestureBridge::getIcon() const
-{
-	return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0, FALSE);
-}
-
-LLFontGL::StyleFlags LLGestureBridge::getLabelStyle() const
-{
-	if( LLGestureManager::instance().isGestureActive(mUUID) )
-	{
-		return LLFontGL::BOLD;
-	}
-	else
-	{
-		return LLFontGL::NORMAL;
-	}
-}
-
-std::string LLGestureBridge::getLabelSuffix() const
-{
-	if( LLGestureManager::instance().isGestureActive(mUUID) )
-	{
-		return LLItemBridge::getLabelSuffix() + " (active)";
-	}
-	else
-	{
-		return LLItemBridge::getLabelSuffix();
-	}
-}
-
-// virtual
-void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
-{
-	if ("activate" == action)
-	{
-		LLGestureManager::instance().activateGesture(mUUID);
-
-		LLViewerInventoryItem* item = gInventory.getItem(mUUID);
-		if (!item) return;
-
-		// Since we just changed the suffix to indicate (active)
-		// the server doesn't need to know, just the viewer.
-		gInventory.updateItem(item);
-		gInventory.notifyObservers();
-	}
-	else if ("deactivate" == action)
-	{
-		LLGestureManager::instance().deactivateGesture(mUUID);
-
-		LLViewerInventoryItem* item = gInventory.getItem(mUUID);
-		if (!item) return;
-
-		// Since we just changed the suffix to indicate (active)
-		// the server doesn't need to know, just the viewer.
-		gInventory.updateItem(item);
-		gInventory.notifyObservers();
-	}
-	else LLItemBridge::performAction(folder, model, action);
-}
-
-void LLGestureBridge::openItem()
-{
-	LLViewerInventoryItem* item = getItem();
-
-	if (item)
-	{
-		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
-	}
-/*
-	LLViewerInventoryItem* item = getItem();
-	if (item)
-	{
-		LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null);
-		preview->setFocus(TRUE);
-	}
-*/
-}
-
-BOOL LLGestureBridge::removeItem()
-{
-	// Force close the preview window, if it exists
-	LLGestureManager::instance().deactivateGesture(mUUID);
-	return LLItemBridge::removeItem();
-}
-
-void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
-{
-	lldebugs << "LLGestureBridge::buildContextMenu()" << llendl;
-	std::vector<std::string> items;
-	std::vector<std::string> disabled_items;
-	if(isInTrash())
-	{
-		items.push_back(std::string("Purge Item"));
-		if (!isItemRemovable())
-		{
-			disabled_items.push_back(std::string("Purge Item"));
-		}
-
-		items.push_back(std::string("Restore Item"));
-	}
-	else
-	{
-		LLInventoryItem* item = getItem();
-		if (item && item->getIsLinkType())
-		{
-			items.push_back(std::string("Find Original"));
-		}
-		items.push_back(std::string("Open"));
-		items.push_back(std::string("Properties"));
-
-		getClipboardEntries(true, items, disabled_items, flags);
-
-		items.push_back(std::string("Gesture Separator"));
-		items.push_back(std::string("Activate"));
-		items.push_back(std::string("Deactivate"));
-	}
-	hide_context_entries(menu, items, disabled_items);
-}
-
-// +=================================================+
-// |        LLAnimationBridge                        |
-// +=================================================+
-
-LLUIImagePtr LLAnimationBridge::getIcon() const
-{
-	return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE);
-}
-
-void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
-{
-	std::vector<std::string> items;
-	std::vector<std::string> disabled_items;
-
-	lldebugs << "LLAnimationBridge::buildContextMenu()" << llendl;
-	if(isInTrash())
-	{
-		items.push_back(std::string("Purge Item"));
-		if (!isItemRemovable())
-		{
-			disabled_items.push_back(std::string("Purge Item"));
-		}
-
-		items.push_back(std::string("Restore Item"));
-	}
-	else
-	{
-		items.push_back(std::string("Animation Open"));
-		items.push_back(std::string("Properties"));
-
-		getClipboardEntries(true, items, disabled_items, flags);
-	}
-
-	items.push_back(std::string("Animation Separator"));
-	items.push_back(std::string("Animation Play"));
-	items.push_back(std::string("Animation Audition"));
-
-	hide_context_entries(menu, items, disabled_items);
-
-}
-
-// virtual
-void LLAnimationBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
-{
-	if ((action == "playworld") || (action == "playlocal"))
-	{
-		if (getItem())
-		{
-			LLPreviewAnim::e_activation_type activate = LLPreviewAnim::NONE;
-			if ("playworld" == action) activate = LLPreviewAnim::PLAY;
-			if ("playlocal" == action) activate = LLPreviewAnim::AUDITION;
-
-			LLPreviewAnim* preview = LLFloaterReg::showTypedInstance<LLPreviewAnim>("preview_anim", LLSD(mUUID));
-			if (preview)
-			{
-				preview->activate(activate);
-			}
-		}
-	}
-	else
-	{
-		LLItemBridge::performAction(folder, model, action);
-	}
-}
-
-void LLAnimationBridge::openItem()
-{
-	LLViewerInventoryItem* item = getItem();
-
-	if (item)
-	{
-		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
-	}
-/*
-	LLViewerInventoryItem* item = getItem();
-	if (item)
-	{
-		LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES);
-	}
-*/
-}
-
-// +=================================================+
-// |        LLObjectBridge                           |
-// +=================================================+
-
-// static
-LLUUID LLObjectBridge::sContextMenuItemID;
-
-LLObjectBridge::LLObjectBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type, U32 flags) :
-LLItemBridge(inventory, uuid), mInvType(type)
-{
-	mAttachPt = (flags & 0xff); // low bye of inventory flags
-
-	mIsMultiObject = ( flags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) ?  TRUE: FALSE;
-}
-
-BOOL LLObjectBridge::isItemRemovable()
-{
-	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
-	if(!avatar) return FALSE;
-	if(avatar->isWearingAttachment(mUUID)) return FALSE;
-	return LLInvFVBridge::isItemRemovable();
-}
-
-LLUIImagePtr LLObjectBridge::getIcon() const
-{
-	return get_item_icon(LLAssetType::AT_OBJECT, mInvType, mAttachPt, mIsMultiObject );
-}
-
-LLInventoryObject* LLObjectBridge::getObject() const
-{
-	LLInventoryObject* object = NULL;
-	LLInventoryModel* model = getInventoryModel();
-	if(model)
-	{
-		object = (LLInventoryObject*)model->getObject(mUUID);
-	}
-	return object;
-}
-
-// virtual
-void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
-{
-	if ("attach" == action)
-	{
-		LLUUID object_id = mUUID;
-		LLViewerInventoryItem* item;
-		item = (LLViewerInventoryItem*)gInventory.getItem(object_id);
-		if(item && gInventory.isObjectDescendentOf(object_id, gInventory.getRootFolderID()))
-		{
-			rez_attachment(item, NULL);
-		}
-		else if(item && item->isComplete())
-		{
-			// must be in library. copy it to our inventory and put it on.
-			LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(0);
-			copy_inventory_item(
-				gAgent.getID(),
-				item->getPermissions().getOwner(),
-				item->getUUID(),
-				LLUUID::null,
-				std::string(),
-				cb);
-		}
-		gFocusMgr.setKeyboardFocus(NULL);
-	}
-	else if ("detach" == action)
-	{
-		LLInventoryItem* item = gInventory.getItem(mUUID);
-		if(item)
-		{
-			gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv);
-			gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
-			gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-			gMessageSystem->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID());
-			gMessageSystem->sendReliable( gAgent.getRegion()->getHost());
-		}
-		// this object might have been selected, so let the selection manager know it's gone now
-		LLViewerObject *found_obj = gObjectList.findObject(item->getLinkedUUID());
-		if (found_obj)
-		{
-			LLSelectMgr::getInstance()->remove(found_obj);
-		}
-	}
-	else LLItemBridge::performAction(folder, model, action);
-}
-
-void LLObjectBridge::openItem()
-{
-	LLViewerInventoryItem* item = getItem();
-
-	if (item)
-	{
-		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
-	}
-
-	LLSD key;
-	key["id"] = mUUID;
-	LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
-
-	// Disable old properties floater; this is replaced by the sidepanel.
-	/*
-	LLFloaterReg::showInstance("properties", mUUID);
-	*/
-}
-
-LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const
-{
-	U8 font = LLFontGL::NORMAL;
-
-	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
-	if( avatar && avatar->isWearingAttachment( mUUID ) )
-	{
-		font |= LLFontGL::BOLD;
-	}
-
-	LLInventoryItem* item = getItem();
-	if (item && item->getIsLinkType())
-	{
-		font |= LLFontGL::ITALIC;
-	}
-
-	return (LLFontGL::StyleFlags)font;
-}
-
-std::string LLObjectBridge::getLabelSuffix() const
-{
-	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
-	if( avatar && avatar->isWearingAttachment( mUUID ) )
-	{
-		std::string attachment_point_name = avatar->getAttachedPointName(mUUID);
-
-		// e.g. "(worn on ...)" / "(attached to ...)"
-		LLStringUtil::format_map_t args;
-		args["[ATTACHMENT_POINT]"] =  attachment_point_name.c_str();
-		return LLItemBridge::getLabelSuffix() + LLTrans::getString("WornOnAttachmentPoint", args);
-	}
-	else
-	{
-		return LLItemBridge::getLabelSuffix();
-	}
-}
-
-void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment)
-{
-	LLSD payload;
-	payload["item_id"] = item->getLinkedUUID(); // Wear the base object in case this is a link.
-
-	S32 attach_pt = 0;
-	if (gAgent.getAvatarObject() && attachment)
-	{
-		for (LLVOAvatar::attachment_map_t::iterator iter = gAgent.getAvatarObject()->mAttachmentPoints.begin();
-			 iter != gAgent.getAvatarObject()->mAttachmentPoints.end(); ++iter)
-		{
-			if (iter->second == attachment)
-			{
-				attach_pt = iter->first;
-				break;
-			}
-		}
-	}
-
-	payload["attachment_point"] = attach_pt;
-
-#if !ENABLE_MULTIATTACHMENTS
-	if (attachment && attachment->getNumObjects() > 0)
-	{
-		LLNotifications::instance().add("ReplaceAttachment", LLSD(), payload, confirm_replace_attachment_rez);
-	}
-	else
-#endif
-	{
-		LLNotifications::instance().forceResponse(LLNotification::Params("ReplaceAttachment").payload(payload), 0/*YES*/);
-	}
-}
-
-bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response)
-{
-	LLVOAvatar *avatarp = gAgent.getAvatarObject();
-
-	if (!avatarp->canAttachMoreObjects())
-	{
-		LLSD args;
-		args["MAX_ATTACHMENTS"] = llformat("%d", MAX_AGENT_ATTACHMENTS);
-		LLNotifications::instance().add("MaxAttachmentsOnOutfit", args);
-		return false;
-	}
-
-	S32 option = LLNotification::getSelectedOption(notification, response);
-	if (option == 0/*YES*/)
-	{
-		LLViewerInventoryItem* itemp = gInventory.getItem(notification["payload"]["item_id"].asUUID());
-
-		if (itemp)
-		{
-			LLMessageSystem* msg = gMessageSystem;
-			msg->newMessageFast(_PREHASH_RezSingleAttachmentFromInv);
-			msg->nextBlockFast(_PREHASH_AgentData);
-			msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-			msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-			msg->nextBlockFast(_PREHASH_ObjectData);
-			msg->addUUIDFast(_PREHASH_ItemID, itemp->getUUID());
-			msg->addUUIDFast(_PREHASH_OwnerID, itemp->getPermissions().getOwner());
-			U8 attachment_pt = notification["payload"]["attachment_point"].asInteger();
-#if ENABLE_MULTIATTACHMENTS
-			attachment_pt |= ATTACHMENT_ADD;
-#endif
-			msg->addU8Fast(_PREHASH_AttachmentPt, attachment_pt);
-			pack_permissions_slam(msg, itemp->getFlags(), itemp->getPermissions());
-			msg->addStringFast(_PREHASH_Name, itemp->getName());
-			msg->addStringFast(_PREHASH_Description, itemp->getDescription());
-			msg->sendReliable(gAgent.getRegion()->getHost());
-		}
-	}
-	return false;
-}
-static LLNotificationFunctorRegistration confirm_replace_attachment_rez_reg("ReplaceAttachment", confirm_replace_attachment_rez);
-
-void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
-{
-	std::vector<std::string> items;
-	std::vector<std::string> disabled_items;
-	if(isInTrash())
-	{
-		items.push_back(std::string("Purge Item"));
-		if (!isItemRemovable())
-		{
-			disabled_items.push_back(std::string("Purge Item"));
-		}
-
-		items.push_back(std::string("Restore Item"));
-	}
-	else
-	{
-		LLInventoryItem* item = getItem();
-		if (item && item->getIsLinkType())
-		{
-			items.push_back(std::string("Find Original"));
-		}
-
-		items.push_back(std::string("Properties"));
-
-		getClipboardEntries(true, items, disabled_items, flags);
-
-		LLObjectBridge::sContextMenuItemID = mUUID;
-
-		if(item)
-		{
-			LLVOAvatarSelf* avatarp = gAgent.getAvatarObject();
-			if( !avatarp )
-			{
-				return;
-			}
-
-			if( avatarp->isWearingAttachment( mUUID ) )
-			{
-				items.push_back(std::string("Detach From Yourself"));
-			}
-			else
-			if( !isInTrash() && !isLinkedObjectInTrash() )
-			{
-				items.push_back(std::string("Attach Separator"));
-				items.push_back(std::string("Object Wear"));
-				items.push_back(std::string("Attach To"));
-				items.push_back(std::string("Attach To HUD"));
-				// commented out for DEV-32347
-				//items.push_back(std::string("Restore to Last Position"));
-
-				if (!avatarp->canAttachMoreObjects())
-				{
-					disabled_items.push_back(std::string("Object Wear"));
-					disabled_items.push_back(std::string("Attach To"));
-					disabled_items.push_back(std::string("Attach To HUD"));
-				}
-				LLMenuGL* attach_menu = menu.findChildMenuByName("Attach To", TRUE);
-				LLMenuGL* attach_hud_menu = menu.findChildMenuByName("Attach To HUD", TRUE);
-				LLVOAvatar *avatarp = gAgent.getAvatarObject();
-				if (attach_menu
-					&& (attach_menu->getChildCount() == 0)
-					&& attach_hud_menu
-					&& (attach_hud_menu->getChildCount() == 0)
-					&& avatarp)
-				{
-					for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin();
-						 iter != avatarp->mAttachmentPoints.end(); )
-					{
-						LLVOAvatar::attachment_map_t::iterator curiter = iter++;
-						LLViewerJointAttachment* attachment = curiter->second;
-						LLMenuItemCallGL::Params p;
-						std::string submenu_name = attachment->getName();
-						if (LLTrans::getString(submenu_name) != "")
-						{
-						    p.name = (" ")+LLTrans::getString(submenu_name)+" ";
-						}
-						else
-						{
-							p.name = submenu_name;
-						}
-						LLSD cbparams;
-						cbparams["index"] = curiter->first;
-						cbparams["label"] = attachment->getName();
-						p.on_click.function_name = "Inventory.AttachObject";
-						p.on_click.parameter = LLSD(attachment->getName());
-						p.on_enable.function_name = "Attachment.Label";
-						p.on_enable.parameter = cbparams;
-						LLView* parent = attachment->getIsHUDAttachment() ? attach_hud_menu : attach_menu;
-						LLUICtrlFactory::create<LLMenuItemCallGL>(p, parent);
-					}
-				}
-			}
-		}
-	}
-	hide_context_entries(menu, items, disabled_items);
-}
-
-BOOL LLObjectBridge::renameItem(const std::string& new_name)
-{
-	if(!isItemRenameable())
-		return FALSE;
-	LLPreview::dirty(mUUID);
-	LLInventoryModel* model = getInventoryModel();
-	if(!model)
-		return FALSE;
-	LLViewerInventoryItem* item = getItem();
-	if(item && (item->getName() != new_name))
-	{
-		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
-		new_item->rename(new_name);
-		buildDisplayName(new_item, mDisplayName);
-		new_item->updateServer(FALSE);
-		model->updateItem(new_item);
-
-		model->notifyObservers();
-
-		LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
-		if( avatar )
-		{
-			LLViewerObject* obj = avatar->getWornAttachment( item->getUUID() );
-			if( obj )
-			{
-				LLSelectMgr::getInstance()->deselectAll();
-				LLSelectMgr::getInstance()->addAsIndividual( obj, SELECT_ALL_TES, FALSE );
-				LLSelectMgr::getInstance()->selectionSetObjectName( new_name );
-				LLSelectMgr::getInstance()->deselectAll();
-			}
-		}
-	}
-	// return FALSE because we either notified observers (& therefore
-	// rebuilt) or we didn't update.
-	return FALSE;
-}
-
-// +=================================================+
-// |        LLLSLTextBridge                          |
-// +=================================================+
-
-LLUIImagePtr LLLSLTextBridge::getIcon() const
-{
-	return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE);
-}
-
-void LLLSLTextBridge::openItem()
-{
-	LLViewerInventoryItem* item = getItem();
-
-	if (item)
-	{
-		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
-	}
-	/*
-	LLViewerInventoryItem* item = getItem();
-	if (item)
-	{
-		LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES);
-	}
-	*/
-}
-
-// +=================================================+
-// |        LLWearableBridge                         |
-// +=================================================+
-
-// *NOTE: hack to get from avatar inventory to avatar
-void wear_inventory_item_on_avatar( LLInventoryItem* item )
-{
-	if(item)
-	{
-		lldebugs << "wear_inventory_item_on_avatar( " << item->getName()
-				 << " )" << llendl;
-
-		LLAppearanceManager::instance().addCOFItemLink(item);
-	}
-}
-
-void wear_add_inventory_item_on_avatar( LLInventoryItem* item )
-{
-	if(item)
-	{
-		lldebugs << "wear_add_inventory_item_on_avatar( " << item->getName()
-				 << " )" << llendl;
-
-		LLWearableList::instance().getAsset(item->getAssetUUID(),
-							   item->getName(),
-							   item->getType(),
-							   LLWearableBridge::onWearAddOnAvatarArrived,
-							   new LLUUID(item->getUUID()));
-	}
-}
-
-void remove_inventory_category_from_avatar( LLInventoryCategory* category )
-{
-	if(!category) return;
-	lldebugs << "remove_inventory_category_from_avatar( " << category->getName()
-			 << " )" << llendl;
-
-
-	if( gFloaterCustomize )
-	{
-		gFloaterCustomize->askToSaveIfDirty(
-			boost::bind(remove_inventory_category_from_avatar_step2, _1, category->getUUID()));
-	}
-	else
-	{
-		remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() );
-	}
-}
-
-struct OnRemoveStruct
-{
-	LLUUID mUUID;
-	OnRemoveStruct(const LLUUID& uuid):
-		mUUID(uuid)
-	{
-	}
-};
-
-void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id)
-{
-
-	// Find all the wearables that are in the category's subtree.
-	lldebugs << "remove_inventory_category_from_avatar_step2()" << llendl;
-	if(proceed)
-	{
-		LLInventoryModel::cat_array_t cat_array;
-		LLInventoryModel::item_array_t item_array;
-		LLFindWearables is_wearable;
-		gInventory.collectDescendentsIf(category_id,
-										cat_array,
-										item_array,
-										LLInventoryModel::EXCLUDE_TRASH,
-										is_wearable);
-		S32 i;
-		S32 wearable_count = item_array.count();
-
-		LLInventoryModel::cat_array_t	obj_cat_array;
-		LLInventoryModel::item_array_t	obj_item_array;
-		LLIsType is_object( LLAssetType::AT_OBJECT );
-		gInventory.collectDescendentsIf(category_id,
-										obj_cat_array,
-										obj_item_array,
-										LLInventoryModel::EXCLUDE_TRASH,
-										is_object);
-		S32 obj_count = obj_item_array.count();
-
-		// Find all gestures in this folder
-		LLInventoryModel::cat_array_t	gest_cat_array;
-		LLInventoryModel::item_array_t	gest_item_array;
-		LLIsType is_gesture( LLAssetType::AT_GESTURE );
-		gInventory.collectDescendentsIf(category_id,
-										gest_cat_array,
-										gest_item_array,
-										LLInventoryModel::EXCLUDE_TRASH,
-										is_gesture);
-		S32 gest_count = gest_item_array.count();
-
-		if (wearable_count > 0)	//Loop through wearables.  If worn, remove.
-		{
-			for(i = 0; i  < wearable_count; ++i)
-			{
-				if( gAgentWearables.isWearingItem (item_array.get(i)->getUUID()) )
-				{
-					LLWearableList::instance().getAsset(item_array.get(i)->getAssetUUID(),
-														item_array.get(i)->getName(),
-														item_array.get(i)->getType(),
-														LLWearableBridge::onRemoveFromAvatarArrived,
-														new OnRemoveStruct(item_array.get(i)->getUUID()));
-
-				}
-			}
-		}
-
-
-		if (obj_count > 0)
-		{
-			for(i = 0; i  < obj_count; ++i)
-			{
-				gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv);
-				gMessageSystem->nextBlockFast(_PREHASH_ObjectData );
-				gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
-				gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item_array.get(i)->getUUID() );
-
-				gMessageSystem->sendReliable( gAgent.getRegion()->getHost() );
-
-				// this object might have been selected, so let the selection manager know it's gone now
-				LLViewerObject *found_obj = gObjectList.findObject( obj_item_array.get(i)->getUUID());
-				if (found_obj)
-				{
-					LLSelectMgr::getInstance()->remove(found_obj);
-				}
-			}
-		}
-
-		if (gest_count > 0)
-		{
-			for(i = 0; i  < gest_count; ++i)
-			{
-				if ( LLGestureManager::instance().isGestureActive( gest_item_array.get(i)->getUUID()) )
-				{
-					LLGestureManager::instance().deactivateGesture( gest_item_array.get(i)->getUUID() );
-					gInventory.updateItem( gest_item_array.get(i) );
-					gInventory.notifyObservers();
-				}
-
-			}
-		}
-	}
-}
-
-BOOL LLWearableBridge::renameItem(const std::string& new_name)
-{
-	if( gAgentWearables.isWearingItem( mUUID ) )
-	{
-		gAgentWearables.setWearableName( mUUID, new_name );
-	}
-	return LLItemBridge::renameItem(new_name);
-}
-
-BOOL LLWearableBridge::isItemRemovable()
-{
-	if (gAgentWearables.isWearingItem(mUUID)) return FALSE;
-	return LLInvFVBridge::isItemRemovable();
-}
-
-std::string LLWearableBridge::getLabelSuffix() const
-{
-	if( gAgentWearables.isWearingItem( mUUID ) )
-	{
-		// e.g. "(worn)" 
-		return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn");
-	}
-	else
-	{
-		return LLItemBridge::getLabelSuffix();
-	}
-}
-
-LLUIImagePtr LLWearableBridge::getIcon() const
-{
-	return get_item_icon(mAssetType, mInvType, mWearableType, FALSE);
-}
-
-// virtual
-void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
-{
-	if ("wear" == action)
-	{
-		wearOnAvatar();
-	}
-	else if ("wear_add" == action)
-	{
-		wearAddOnAvatar();
-	}
-	else if ("edit" == action)
-	{
-		editOnAvatar();
-		return;
-	}
-	else if ("take_off" == action)
-	{
-		if(gAgentWearables.isWearingItem(mUUID))
-		{
-			LLViewerInventoryItem* item = getItem();
-			if (item)
-			{
-				LLWearableList::instance().getAsset(item->getAssetUUID(),
-													item->getName(),
-													item->getType(),
-													LLWearableBridge::onRemoveFromAvatarArrived,
-													new OnRemoveStruct(mUUID));
-			}
-		}
-	}
-	else LLItemBridge::performAction(folder, model, action);
-}
-
-void LLWearableBridge::openItem()
-{
-	LLViewerInventoryItem* item = getItem();
-
-	if (item)
-	{
-		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
-	}
-	/*
-	if( isInTrash() )
-	{
-		LLNotifications::instance().add("CannotWearTrash");
-	}
-	else if(isAgentInventory())
-	{
-		if( !gAgentWearables.isWearingItem( mUUID ) )
-		{
-			wearOnAvatar();
-		}
-	}
-	else
-	{
-		// must be in the inventory library. copy it to our inventory
-		// and put it on right away.
-		LLViewerInventoryItem* item = getItem();
-		if(item && item->isComplete())
-		{
-			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
-			copy_inventory_item(
-				gAgent.getID(),
-				item->getPermissions().getOwner(),
-				item->getUUID(),
-				LLUUID::null,
-				std::string(),
-				cb);
-		}
-		else if(item)
-		{
-			// *TODO: We should fetch the item details, and then do
-			// the operation above.
-			LLNotifications::instance().add("CannotWearInfoNotComplete");
-		}
-	}
-	*/
-}
-
-void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
-{
-	lldebugs << "LLWearableBridge::buildContextMenu()" << llendl;
-	std::vector<std::string> items;
-	std::vector<std::string> disabled_items;
-	if(isInTrash())
-	{
-		items.push_back(std::string("Purge Item"));
-		if (!isItemRemovable())
-		{
-			disabled_items.push_back(std::string("Purge Item"));
-		}
-
-		items.push_back(std::string("Restore Item"));
-	}
-	else
-	{	// FWIW, it looks like SUPPRESS_OPEN_ITEM is not set anywhere
-		BOOL no_open = ((flags & SUPPRESS_OPEN_ITEM) == SUPPRESS_OPEN_ITEM);
-
-		// If we have clothing, don't add "Open" as it's the same action as "Wear"   SL-18976
-		LLViewerInventoryItem* item = getItem();
-		if( !no_open && item )
-		{
-			no_open = (item->getType() == LLAssetType::AT_CLOTHING) ||
-					  (item->getType() == LLAssetType::AT_BODYPART);
-		}
-		if (!no_open)
-		{
-			items.push_back(std::string("Open"));
-		}
-
-		if (item && item->getIsLinkType())
-		{
-			items.push_back(std::string("Find Original"));
-		}
-
-		items.push_back(std::string("Properties"));
-
-		getClipboardEntries(true, items, disabled_items, flags);
-
-		items.push_back(std::string("Wearable Separator"));
-
-		items.push_back(std::string("Wearable Wear"));
-		items.push_back(std::string("Wearable Add"));
-		items.push_back(std::string("Wearable Edit"));
-
-		if ((flags & FIRST_SELECTED_ITEM) == 0)
-		{
-			disabled_items.push_back(std::string("Wearable Edit"));
-		}
-		// Don't allow items to be worn if their baseobj is in the trash.
-		if (isLinkedObjectInTrash())
-		{
-			disabled_items.push_back(std::string("Wearable Wear"));
-			disabled_items.push_back(std::string("Wearable Add"));
-			disabled_items.push_back(std::string("Wearable Edit"));
-		}
-
-		// Disable wear and take off based on whether the item is worn.
-		if(item)
-		{
-			switch (item->getType())
-			{
-				case LLAssetType::AT_CLOTHING:
-					items.push_back(std::string("Take Off"));
-				case LLAssetType::AT_BODYPART:
-					if (gAgentWearables.isWearingItem(item->getUUID()))
-					{
-						disabled_items.push_back(std::string("Wearable Wear"));
-						disabled_items.push_back(std::string("Wearable Add"));
-					}
-					else
-					{
-						disabled_items.push_back(std::string("Take Off"));
-					}
-					break;
-				default:
-					break;
-			}
-		}
-	}
-	hide_context_entries(menu, items, disabled_items);
-}
-
-// Called from menus
-// static
-BOOL LLWearableBridge::canWearOnAvatar(void* user_data)
-{
-	LLWearableBridge* self = (LLWearableBridge*)user_data;
-	if(!self) return FALSE;
-	if(!self->isAgentInventory())
-	{
-		LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem();
-		if(!item || !item->isComplete()) return FALSE;
-	}
-	return (!gAgentWearables.isWearingItem(self->mUUID));
-}
-
-// Called from menus
-// static
-void LLWearableBridge::onWearOnAvatar(void* user_data)
-{
-	LLWearableBridge* self = (LLWearableBridge*)user_data;
-	if(!self) return;
-	self->wearOnAvatar();
-}
-
-void LLWearableBridge::wearOnAvatar()
-{
-	// Don't wear anything until initial wearables are loaded, can
-	// destroy clothing items.
-	if (!gAgentWearables.areWearablesLoaded())
-	{
-		LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
-		return;
-	}
-
-	LLViewerInventoryItem* item = getItem();
-	if(item)
-	{
-		if(!isAgentInventory())
-		{
-			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
-			copy_inventory_item(
-				gAgent.getID(),
-				item->getPermissions().getOwner(),
-				item->getUUID(),
-				LLUUID::null,
-				std::string(),
-				cb);
-		}
-		else
-		{
-			wear_inventory_item_on_avatar(item);
-		}
-	}
-}
-
-void LLWearableBridge::wearAddOnAvatar()
-{
-	// Don't wear anything until initial wearables are loaded, can
-	// destroy clothing items.
-	if (!gAgentWearables.areWearablesLoaded())
-	{
-		LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
-		return;
-	}
-
-	LLViewerInventoryItem* item = getItem();
-	if(item)
-	{
-		if(!isAgentInventory())
-		{
-			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
-			copy_inventory_item(
-				gAgent.getID(),
-				item->getPermissions().getOwner(),
-				item->getUUID(),
-				LLUUID::null,
-				std::string(),
-				cb);
-		}
-		else
-		{
-			wear_add_inventory_item_on_avatar(item);
-		}
-	}
-}
-
-// static
-void LLWearableBridge::onWearOnAvatarArrived( LLWearable* wearable, void* userdata )
-{
-	LLUUID* item_id = (LLUUID*) userdata;
-	if(wearable)
-	{
-		LLViewerInventoryItem* item = NULL;
-		item = (LLViewerInventoryItem*)gInventory.getItem(*item_id);
-		if(item)
-		{
-			if(item->getAssetUUID() == wearable->getAssetID())
-			{
-				gAgentWearables.setWearableItem(item, wearable);
-				gInventory.notifyObservers();
-				//self->getFolderItem()->refreshFromRoot();
-			}
-			else
-			{
-				llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl;
-			}
-		}
-	}
-	delete item_id;
-}
-
-// static
-// BAP remove the "add" code path once everything is fully COF-ified.
-void LLWearableBridge::onWearAddOnAvatarArrived( LLWearable* wearable, void* userdata )
-{
-	LLUUID* item_id = (LLUUID*) userdata;
-	if(wearable)
-	{
-		LLViewerInventoryItem* item = NULL;
-		item = (LLViewerInventoryItem*)gInventory.getItem(*item_id);
-		if(item)
-		{
-			if(item->getAssetUUID() == wearable->getAssetID())
-			{
-				bool do_append = true;
-				gAgentWearables.setWearableItem(item, wearable, do_append);
-				gInventory.notifyObservers();
-				//self->getFolderItem()->refreshFromRoot();
-			}
-			else
-			{
-				llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl;
-			}
-		}
-	}
-	delete item_id;
-}
-
-// static
-BOOL LLWearableBridge::canEditOnAvatar(void* user_data)
-{
-	LLWearableBridge* self = (LLWearableBridge*)user_data;
-	if(!self) return FALSE;
-
-	return (gAgentWearables.isWearingItem(self->mUUID));
-}
-
-// static
-void LLWearableBridge::onEditOnAvatar(void* user_data)
-{
-	LLWearableBridge* self = (LLWearableBridge*)user_data;
-	if(self)
-	{
-		self->editOnAvatar();
-	}
-}
-
-void LLWearableBridge::editOnAvatar()
-{
-	const LLWearable* wearable = gAgentWearables.getWearableFromItemID(mUUID);
-	if( wearable )
-	{
-		// Set the tab to the right wearable.
-		if (gFloaterCustomize)
-			gFloaterCustomize->setCurrentWearableType( wearable->getType() );
-
-		if( CAMERA_MODE_CUSTOMIZE_AVATAR != gAgent.getCameraMode() )
-		{
-			// Start Avatar Customization
-			gAgent.changeCameraToCustomizeAvatar();
-		}
-	}
-}
-
-// static
-BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data)
-{
-	LLWearableBridge* self = (LLWearableBridge*)user_data;
-	if( self && (LLAssetType::AT_BODYPART != self->mAssetType) )
-	{
-		return gAgentWearables.isWearingItem( self->mUUID );
-	}
-	return FALSE;
-}
-
-// static
-void LLWearableBridge::onRemoveFromAvatar(void* user_data)
-{
-	LLWearableBridge* self = (LLWearableBridge*)user_data;
-	if(!self) return;
-	if(gAgentWearables.isWearingItem(self->mUUID))
-	{
-		LLViewerInventoryItem* item = self->getItem();
-		if (item)
-		{
-			LLUUID parent_id = item->getParentUUID();
-			LLWearableList::instance().getAsset(item->getAssetUUID(),
-												item->getName(),
-												item->getType(),
-												onRemoveFromAvatarArrived,
-												new OnRemoveStruct(LLUUID(self->mUUID)));
-		}
-	}
-}
-
-// static
-void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
-												 void* userdata)
-{
-	OnRemoveStruct *on_remove_struct = (OnRemoveStruct*) userdata;
-	const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID);
-	if(wearable)
-	{
-		if( gAgentWearables.isWearingItem( item_id ) )
-		{
-			EWearableType type = wearable->getType();
-
-			if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR || type==WT_EYES ) ) //&&
-				//!((!gAgent.isTeen()) && ( type==WT_UNDERPANTS || type==WT_UNDERSHIRT )) )
-			{
-				// MULTI_WEARABLE: FIXME HACK - always remove all
-				bool do_remove_all = false;
-				gAgentWearables.removeWearable( type, do_remove_all, 0 );
-			}
-		}
-	}
-
-	// Find and remove this item from the COF.
-	LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::instance().getCOF());
-	llassert(items.size() == 1); // Should always have one and only one item linked to this in the COF.
-	for (LLInventoryModel::item_array_t::const_iterator iter = items.begin();
-		 iter != items.end();
-		 ++iter)
-	{
-		const LLViewerInventoryItem *linked_item = (*iter);
-		const LLUUID &item_id = linked_item->getUUID();
-		gInventory.purgeObject(item_id);
-	}
-	gInventory.notifyObservers();
-
-	delete on_remove_struct;
-}
-
-LLInvFVBridgeAction* LLInvFVBridgeAction::createAction(LLAssetType::EType asset_type,
-													   const LLUUID& uuid,LLInventoryModel* model)
-{
-	LLInvFVBridgeAction* action = NULL;
-	switch(asset_type)
-	{
-	case LLAssetType::AT_TEXTURE:
-		action = new LLTextureBridgeAction(uuid,model);
-		break;
-
-	case LLAssetType::AT_SOUND:
-		action = new LLSoundBridgeAction(uuid,model);
-		break;
-
-	case LLAssetType::AT_LANDMARK:
-		action = new LLLandmarkBridgeAction(uuid,model);
-		break;
-
-	case LLAssetType::AT_CALLINGCARD:
-		action = new LLCallingCardBridgeAction(uuid,model);
-		break;
-
-	case LLAssetType::AT_OBJECT:
-		action = new LLObjectBridgeAction(uuid,model);
-		break;
-
-	case LLAssetType::AT_NOTECARD:
-		action = new LLNotecardBridgeAction(uuid,model);
-		break;
-
-	case LLAssetType::AT_ANIMATION:
-		action = new LLAnimationBridgeAction(uuid,model);
-		break;
-
-	case LLAssetType::AT_GESTURE:
-		action = new LLGestureBridgeAction(uuid,model);
-		break;
-
-	case LLAssetType::AT_LSL_TEXT:
-		action = new LLLSLTextBridgeAction(uuid,model);
-		break;
-
-	case LLAssetType::AT_CLOTHING:
-	case LLAssetType::AT_BODYPART:
-		action = new LLWearableBridgeAction(uuid,model);
-
-		break;
-
-	default:
-		break;
-	}
-	return action;
-}
-
-//static
-void LLInvFVBridgeAction::doAction(LLAssetType::EType asset_type,
-								   const LLUUID& uuid,LLInventoryModel* model)
-{
-	LLInvFVBridgeAction* action = createAction(asset_type,uuid,model);
-	if(action)
-	{
-		action->doIt();
-		delete action;
-	}
-}
-
-//static
-void LLInvFVBridgeAction::doAction(const LLUUID& uuid, LLInventoryModel* model)
-{
-	LLAssetType::EType asset_type = model->getItem(uuid)->getType();
-	LLInvFVBridgeAction* action = createAction(asset_type,uuid,model);
-	if(action)
-	{
-		action->doIt();
-		delete action;
-	}
-}
-
-LLViewerInventoryItem* LLInvFVBridgeAction::getItem() const
-{
-	if(mModel)
-		return (LLViewerInventoryItem*)mModel->getItem(mUUID);
-	return NULL;
-}
-
-//virtual
-void	LLTextureBridgeAction::doIt()
-{
-	if (getItem())
-	{
-		LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES);
-	}
-
-	LLInvFVBridgeAction::doIt();
-}
-
-//virtual
-void	LLSoundBridgeAction::doIt()
-{
-	LLViewerInventoryItem* item = getItem();
-	if(item)
-	{
-		LLFloaterReg::showInstance("preview_sound", LLSD(mUUID), TAKE_FOCUS_YES);
-	}
-
-	LLInvFVBridgeAction::doIt();
-}
-
-
-//virtual
-void	LLLandmarkBridgeAction::doIt()
-{
-	LLViewerInventoryItem* item = getItem();
-	if( item )
-	{
-		// Opening (double-clicking) a landmark immediately teleports,
-		// but warns you the first time.
-		LLSD payload;
-		payload["asset_id"] = item->getAssetUUID();
-		LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload);
-	}
-
-	LLInvFVBridgeAction::doIt();
-}
-
-
-//virtual
-void	LLCallingCardBridgeAction::doIt()
-{
-	LLViewerInventoryItem* item = getItem();
-	if(item && item->getCreatorUUID().notNull())
-	{
-		LLAvatarActions::showProfile(item->getCreatorUUID());
-	}
-
-	LLInvFVBridgeAction::doIt();
-}
-
-//virtual
-void
-LLNotecardBridgeAction::doIt()
-{
-	LLViewerInventoryItem* item = getItem();
-	if (item)
-	{
-		LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES);
-	}
-
-	LLInvFVBridgeAction::doIt();
-}
-
-//virtual
-void	LLGestureBridgeAction::doIt()
-{
-	LLViewerInventoryItem* item = getItem();
-	if (item)
-	{
-		LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null);
-		preview->setFocus(TRUE);
-	}
-
-	LLInvFVBridgeAction::doIt();
-}
-
-//virtual
-void	LLAnimationBridgeAction::doIt()
-{
-	LLViewerInventoryItem* item = getItem();
-	if (item)
-	{
-		LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES);
-	}
-
-	LLInvFVBridgeAction::doIt();
-}
-
-
-//virtual
-void	LLObjectBridgeAction::doIt()
-{
-	LLFloaterReg::showInstance("properties", mUUID);
-
-	LLInvFVBridgeAction::doIt();
-}
-
-
-//virtual
-void	LLLSLTextBridgeAction::doIt()
-{
-	LLViewerInventoryItem* item = getItem();
-	if (item)
-	{
-		LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES);
-	}
-
-	LLInvFVBridgeAction::doIt();
-}
-
-
-BOOL LLWearableBridgeAction::isInTrash() const
-{
-	if(!mModel) return FALSE;
-	const LLUUID trash_id = mModel->findCategoryUUIDForType(LLFolderType::FT_TRASH);
-	return mModel->isObjectDescendentOf(mUUID, trash_id);
-}
-
-BOOL LLWearableBridgeAction::isAgentInventory() const
-{
-	if(!mModel) return FALSE;
-	if(gInventory.getRootFolderID() == mUUID) return TRUE;
-	return mModel->isObjectDescendentOf(mUUID, gInventory.getRootFolderID());
-}
-
-void LLWearableBridgeAction::wearOnAvatar()
-{
-	// Don't wear anything until initial wearables are loaded, can
-	// destroy clothing items.
-	if (!gAgentWearables.areWearablesLoaded())
-	{
-		LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
-		return;
-	}
-
-	LLViewerInventoryItem* item = getItem();
-	if(item)
-	{
-		if(!isAgentInventory())
-		{
-			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
-			copy_inventory_item(
-				gAgent.getID(),
-				item->getPermissions().getOwner(),
-				item->getUUID(),
-				LLUUID::null,
-				std::string(),
-				cb);
-		}
-		else
-		{
-			wear_inventory_item_on_avatar(item);
-		}
-	}
-}
-
-//virtual
-void LLWearableBridgeAction::doIt()
-{
-	if(isInTrash())
-	{
-		LLNotifications::instance().add("CannotWearTrash");
-	}
-	else if(isAgentInventory())
-	{
-		if(!gAgentWearables.isWearingItem(mUUID))
-		{
-			wearOnAvatar();
-		}
-	}
-	else
-	{
-		// must be in the inventory library. copy it to our inventory
-		// and put it on right away.
-		LLViewerInventoryItem* item = getItem();
-		if(item && item->isComplete())
-		{
-			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
-			copy_inventory_item(
-				gAgent.getID(),
-				item->getPermissions().getOwner(),
-				item->getUUID(),
-				LLUUID::null,
-				std::string(),
-				cb);
-		}
-		else if(item)
-		{
-			// *TODO: We should fetch the item details, and then do
-			// the operation above.
-			LLNotifications::instance().add("CannotWearInfoNotComplete");
-		}
-	}
-
-	LLInvFVBridgeAction::doIt();
-}
-
-// +=================================================+
-// |        LLLinkItemBridge                         |
-// +=================================================+
-// For broken links
-
-std::string LLLinkItemBridge::sPrefix("Link: ");
-
-
-LLUIImagePtr LLLinkItemBridge::getIcon() const
-{
-	if (LLViewerInventoryItem *item = getItem())
-	{
-		return get_item_icon(item->getActualType(), LLInventoryType::IT_NONE, 0, FALSE);
-	}
-	return get_item_icon(LLAssetType::AT_LINK, LLInventoryType::IT_NONE, 0, FALSE);
-}
-
-void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
-{
-	// *TODO: Translate
-	lldebugs << "LLLink::buildContextMenu()" << llendl;
-	std::vector<std::string> items;
-	std::vector<std::string> disabled_items;
-
-	if(isInTrash())
-	{
-		items.push_back(std::string("Purge Item"));
-		if (!isItemRemovable())
-		{
-			disabled_items.push_back(std::string("Purge Item"));
-		}
-
-		items.push_back(std::string("Restore Item"));
-	}
-	else
-	{
-		items.push_back(std::string("Delete"));
-		if (!isItemRemovable())
-		{
-			disabled_items.push_back(std::string("Delete"));
-		}
-	}
-	hide_context_entries(menu, items, disabled_items);
-}
-
-
-// +=================================================+
-// |        LLLinkBridge                             |
-// +=================================================+
-// For broken links.
-
-std::string LLLinkFolderBridge::sPrefix("Link: ");
-
-
-LLUIImagePtr LLLinkFolderBridge::getIcon() const
-{
-	LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
-	if (LLViewerInventoryItem *item = getItem())
-	{
-		if (const LLViewerInventoryCategory* cat = item->getLinkedCategory())
-		{
-			preferred_type = cat->getPreferredType();
-		}
-	}
-	return LLFolderBridge::getIcon(preferred_type);
-}
-
-void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
-{
-	// *TODO: Translate
-	lldebugs << "LLLink::buildContextMenu()" << llendl;
-	std::vector<std::string> items;
-	std::vector<std::string> disabled_items;
-
-	if(isInTrash())
-	{
-		items.push_back(std::string("Purge Item"));
-		if (!isItemRemovable())
-		{
-			disabled_items.push_back(std::string("Purge Item"));
-		}
-
-		items.push_back(std::string("Restore Item"));
-	}
-	else
-	{
-		items.push_back(std::string("Find Original"));
-		items.push_back(std::string("Delete"));
-		if (!isItemRemovable())
-		{
-			disabled_items.push_back(std::string("Delete"));
-		}
-	}
-	hide_context_entries(menu, items, disabled_items);
-}
-
-void LLLinkFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
-{
-	if ("goto" == action)
-	{
-		gotoItem(folder);
-		return;
-	}
-	LLItemBridge::performAction(folder,model,action);
-}
-
-void LLLinkFolderBridge::gotoItem(LLFolderView *folder)
-{
-	const LLUUID &cat_uuid = getFolderID();
-	if (!cat_uuid.isNull())
-	{
-		if (LLFolderViewItem *base_folder = folder->getItemByID(cat_uuid))
-		{
-			if (LLInventoryModel* model = getInventoryModel())
-			{
-				model->fetchDescendentsOf(cat_uuid);
-			}
-			base_folder->setOpen(TRUE);
-			folder->setSelectionFromRoot(base_folder,TRUE);
-			folder->scrollToShowSelection();
-		}
-	}
-}
-
-const LLUUID &LLLinkFolderBridge::getFolderID() const
-{
-	if (LLViewerInventoryItem *link_item = getItem())
-	{
-		if (const LLViewerInventoryCategory *cat = link_item->getLinkedCategory())
-		{
-			const LLUUID& cat_uuid = cat->getUUID();
-			return cat_uuid;
-		}
-	}
-	return LLUUID::null;
-}
+/**
+ * @file llinventorybridge.cpp
+ * @brief Implementation of the Inventory-Folder-View-Bridge classes.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llinventorybridge.h"
+
+#include "llagent.h"
+#include "llagentwearables.h"
+#include "llappearancemgr.h"
+#include "llavataractions.h"
+#include "llfloatercustomize.h"
+#include "llfloaterinventory.h"
+#include "llfloateropenobject.h"
+#include "llfloaterreg.h"
+#include "llfloaterworldmap.h"
+#include "llfriendcard.h"
+#include "llgesturemgr.h"
+#include "llimfloater.h"
+#include "llimview.h"
+#include "llinventoryclipboard.h"
+#include "llinventoryfunctions.h"
+#include "llinventorymodel.h"
+#include "llinventorypanel.h"
+#include "llpreviewanim.h"
+#include "llpreviewgesture.h"
+#include "llpreviewtexture.h"
+#include "llselectmgr.h"
+#include "llsidetray.h"
+#include "lltrans.h"
+#include "llviewerassettype.h"
+#include "llviewermessage.h"
+#include "llviewerobjectlist.h"
+#include "llviewerwindow.h"
+#include "llvoavatarself.h"
+#include "llwearablelist.h"
+
+using namespace LLOldEvents;
+
+// Helpers
+// bug in busy count inc/dec right now, logic is complex... do we really need it?
+void inc_busy_count()
+{
+// 	gViewerWindow->getWindow()->incBusyCount();
+//  check balance of these calls if this code is changed to ever actually
+//  *do* something!
+}
+void dec_busy_count()
+{
+// 	gViewerWindow->getWindow()->decBusyCount();
+//  check balance of these calls if this code is changed to ever actually
+//  *do* something!
+}
+
+// Function declarations
+void wear_add_inventory_item_on_avatar(LLInventoryItem* item);
+void remove_inventory_category_from_avatar(LLInventoryCategory* category);
+void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id);
+bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*);
+bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response);
+
+std::string ICON_NAME[ICON_NAME_COUNT] =
+{
+	"Inv_Texture",
+	"Inv_Sound",
+	"Inv_CallingCard",
+	"Inv_CallingCard",
+	"Inv_Landmark",
+	"Inv_Landmark",
+	"Inv_Script",
+	"Inv_Clothing",
+	"Inv_Object",
+	"Inv_Object",
+	"Inv_Notecard",
+	"Inv_Skin",
+	"Inv_Snapshot",
+
+	"Inv_BodyShape",
+	"Inv_Skin",
+	"Inv_Hair",
+	"Inv_Eye",
+	"Inv_Shirt",
+	"Inv_Pants",
+	"Inv_Shoe",
+	"Inv_Socks",
+	"Inv_Jacket",
+	"Inv_Gloves",
+	"Inv_Undershirt",
+	"Inv_Underpants",
+	"Inv_Skirt",
+	"Inv_Alpha",
+	"Inv_Tattoo",
+
+	"Inv_Animation",
+	"Inv_Gesture",
+
+	"inv_item_linkitem.tga",
+	"inv_item_linkfolder.tga"
+};
+
+// +=================================================+
+// |        LLInvFVBridge                            |
+// +=================================================+
+
+LLInvFVBridge::LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid) :
+mUUID(uuid), mInvType(LLInventoryType::IT_NONE)
+{
+	mInventoryPanel = inventory->getHandle();
+}
+
+const std::string& LLInvFVBridge::getName() const
+{
+	LLInventoryObject* obj = getInventoryObject();
+	if(obj)
+	{
+		return obj->getName();
+	}
+	return LLStringUtil::null;
+}
+
+const std::string& LLInvFVBridge::getDisplayName() const
+{
+	return getName();
+}
+
+// Folders have full perms
+PermissionMask LLInvFVBridge::getPermissionMask() const
+{
+
+	return PERM_ALL;
+}
+
+// virtual
+LLFolderType::EType LLInvFVBridge::getPreferredType() const
+{
+	return LLFolderType::FT_NONE;
+}
+
+
+// Folders don't have creation dates.
+time_t LLInvFVBridge::getCreationDate() const
+{
+	return 0;
+}
+
+// Can be destoryed (or moved to trash)
+BOOL LLInvFVBridge::isItemRemovable()
+{
+	LLInventoryModel* model = getInventoryModel();
+	if(!model) return FALSE;
+	if(model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()))
+	{
+		return TRUE;
+	}
+	return FALSE;
+}
+
+// Can be moved to another folder
+BOOL LLInvFVBridge::isItemMovable() const
+{
+	return TRUE;
+}
+
+/*virtual*/
+/**
+ * @brief Adds this item into clipboard storage
+ */
+void LLInvFVBridge::cutToClipboard()
+{
+	if(isItemMovable())
+	{
+		LLInventoryClipboard::instance().cut(mUUID);
+	}
+}
+// *TODO: make sure this does the right thing
+void LLInvFVBridge::showProperties()
+{
+	LLSD key;
+	key["id"] = mUUID;
+	LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
+
+	// Disable old properties floater; this is replaced by the sidepanel.
+	/*
+	LLFloaterReg::showInstance("properties", mUUID);
+	*/
+}
+
+void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch)
+{
+	// Deactivate gestures when moving them into Trash
+	LLInvFVBridge* bridge;
+	LLInventoryModel* model = getInventoryModel();
+	LLViewerInventoryItem* item = NULL;
+	LLViewerInventoryCategory* cat = NULL;
+	LLInventoryModel::cat_array_t	descendent_categories;
+	LLInventoryModel::item_array_t	descendent_items;
+	S32 count = batch.count();
+	S32 i,j;
+	for(i = 0; i < count; ++i)
+	{
+		bridge = (LLInvFVBridge*)(batch.get(i));
+		if(!bridge || !bridge->isItemRemovable()) continue;
+		item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID());
+		if (item)
+		{
+			if(LLAssetType::AT_GESTURE == item->getType())
+			{
+				LLGestureManager::instance().deactivateGesture(item->getUUID());
+			}
+		}
+	}
+	for(i = 0; i < count; ++i)
+	{
+		bridge = (LLInvFVBridge*)(batch.get(i));
+		if(!bridge || !bridge->isItemRemovable()) continue;
+		cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID());
+		if (cat)
+		{
+			gInventory.collectDescendents( cat->getUUID(), descendent_categories, descendent_items, FALSE );
+			for (j=0; j<descendent_items.count(); j++)
+			{
+				if(LLAssetType::AT_GESTURE == descendent_items[j]->getType())
+				{
+					LLGestureManager::instance().deactivateGesture(descendent_items[j]->getUUID());
+				}
+			}
+		}
+	}
+	removeBatchNoCheck(batch);
+}
+
+void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch)
+{
+	// this method moves a bunch of items and folders to the trash. As
+	// per design guidelines for the inventory model, the message is
+	// built and the accounting is performed first. After all of that,
+	// we call LLInventoryModel::moveObject() to move everything
+	// around.
+	LLInvFVBridge* bridge;
+	LLInventoryModel* model = getInventoryModel();
+	if(!model) return;
+	LLMessageSystem* msg = gMessageSystem;
+	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+	LLViewerInventoryItem* item = NULL;
+	LLViewerInventoryCategory* cat = NULL;
+	std::vector<LLUUID> move_ids;
+	LLInventoryModel::update_map_t update;
+	bool start_new_message = true;
+	S32 count = batch.count();
+	S32 i;
+	for(i = 0; i < count; ++i)
+	{
+		bridge = (LLInvFVBridge*)(batch.get(i));
+		if(!bridge || !bridge->isItemRemovable()) continue;
+		item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID());
+		if(item)
+		{
+			if(item->getParentUUID() == trash_id) continue;
+			move_ids.push_back(item->getUUID());
+			LLPreview::hide(item->getUUID());
+			--update[item->getParentUUID()];
+			++update[trash_id];
+			if(start_new_message)
+			{
+				start_new_message = false;
+				msg->newMessageFast(_PREHASH_MoveInventoryItem);
+				msg->nextBlockFast(_PREHASH_AgentData);
+				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+				msg->addBOOLFast(_PREHASH_Stamp, TRUE);
+			}
+			msg->nextBlockFast(_PREHASH_InventoryData);
+			msg->addUUIDFast(_PREHASH_ItemID, item->getUUID());
+			msg->addUUIDFast(_PREHASH_FolderID, trash_id);
+			msg->addString("NewName", NULL);
+			if(msg->isSendFullFast(_PREHASH_InventoryData))
+			{
+				start_new_message = true;
+				gAgent.sendReliableMessage();
+				gInventory.accountForUpdate(update);
+				update.clear();
+			}
+		}
+	}
+	if(!start_new_message)
+	{
+		start_new_message = true;
+		gAgent.sendReliableMessage();
+		gInventory.accountForUpdate(update);
+		update.clear();
+	}
+	for(i = 0; i < count; ++i)
+	{
+		bridge = (LLInvFVBridge*)(batch.get(i));
+		if(!bridge || !bridge->isItemRemovable()) continue;
+		cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID());
+		if(cat)
+		{
+			if(cat->getParentUUID() == trash_id) continue;
+			move_ids.push_back(cat->getUUID());
+			--update[cat->getParentUUID()];
+			++update[trash_id];
+			if(start_new_message)
+			{
+				start_new_message = false;
+				msg->newMessageFast(_PREHASH_MoveInventoryFolder);
+				msg->nextBlockFast(_PREHASH_AgentData);
+				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+				msg->addBOOL("Stamp", TRUE);
+			}
+			msg->nextBlockFast(_PREHASH_InventoryData);
+			msg->addUUIDFast(_PREHASH_FolderID, cat->getUUID());
+			msg->addUUIDFast(_PREHASH_ParentID, trash_id);
+			if(msg->isSendFullFast(_PREHASH_InventoryData))
+			{
+				start_new_message = true;
+				gAgent.sendReliableMessage();
+				gInventory.accountForUpdate(update);
+				update.clear();
+			}
+		}
+	}
+	if(!start_new_message)
+	{
+		gAgent.sendReliableMessage();
+		gInventory.accountForUpdate(update);
+	}
+
+	// move everything.
+	std::vector<LLUUID>::iterator it = move_ids.begin();
+	std::vector<LLUUID>::iterator end = move_ids.end();
+	for(; it != end; ++it)
+	{
+		gInventory.moveObject((*it), trash_id);
+	}
+
+	// notify inventory observers.
+	model->notifyObservers();
+}
+
+BOOL LLInvFVBridge::isClipboardPasteable() const
+{
+	if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory())
+	{
+		return FALSE;
+	}
+	LLInventoryModel* model = getInventoryModel();
+	if (!model)
+	{
+		return FALSE;
+	}
+
+	const LLUUID &agent_id = gAgent.getID();
+
+	LLDynamicArray<LLUUID> objects;
+	LLInventoryClipboard::instance().retrieve(objects);
+	S32 count = objects.count();
+	for(S32 i = 0; i < count; i++)
+	{
+		const LLUUID &item_id = objects.get(i);
+
+		// Can't paste folders
+		const LLInventoryCategory *cat = model->getCategory(item_id);
+		if (cat)
+		{
+			return FALSE;
+		}
+
+		const LLInventoryItem *item = model->getItem(item_id);
+		if (item)
+		{
+			if (!item->getPermissions().allowCopyBy(agent_id))
+			{
+				return FALSE;
+			}
+		}
+	}
+	return TRUE;
+}
+
+BOOL LLInvFVBridge::isClipboardPasteableAsLink() const
+{
+	if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory())
+	{
+		return FALSE;
+	}
+	const LLInventoryModel* model = getInventoryModel();
+	if (!model)
+	{
+		return FALSE;
+	}
+
+	LLDynamicArray<LLUUID> objects;
+	LLInventoryClipboard::instance().retrieve(objects);
+	S32 count = objects.count();
+	for(S32 i = 0; i < count; i++)
+	{
+		const LLInventoryItem *item = model->getItem(objects.get(i));
+		if (item)
+		{
+			if (!LLAssetType::lookupCanLink(item->getActualType()))
+			{
+				return FALSE;
+			}
+		}
+		const LLViewerInventoryCategory *cat = model->getCategory(objects.get(i));
+		if (cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
+		{
+			return FALSE;
+		}
+	}
+	return TRUE;
+}
+
+void hide_context_entries(LLMenuGL& menu, 
+						const std::vector<std::string> &entries_to_show,
+						const std::vector<std::string> &disabled_entries)
+{
+	const LLView::child_list_t *list = menu.getChildList();
+
+	LLView::child_list_t::const_iterator itor;
+	for (itor = list->begin(); itor != list->end(); ++itor)
+	{
+		std::string name = (*itor)->getName();
+
+		// descend into split menus:
+		LLMenuItemBranchGL* branchp = dynamic_cast<LLMenuItemBranchGL*>(*itor);
+		if ((name == "More") && branchp)
+		{
+			hide_context_entries(*branchp->getBranch(), entries_to_show, disabled_entries);
+		}
+
+
+		bool found = false;
+		std::vector<std::string>::const_iterator itor2;
+		for (itor2 = entries_to_show.begin(); itor2 != entries_to_show.end(); ++itor2)
+		{
+			if (*itor2 == name)
+			{
+				found = true;
+			}
+		}
+		if (!found)
+		{
+			(*itor)->setVisible(FALSE);
+		}
+		else
+		{
+			for (itor2 = disabled_entries.begin(); itor2 != disabled_entries.end(); ++itor2)
+			{
+				if (*itor2 == name)
+				{
+					(*itor)->setEnabled(FALSE);
+				}
+			}
+		}
+	}
+}
+
+// Helper for commonly-used entries
+void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
+										std::vector<std::string> &items,
+										std::vector<std::string> &disabled_items, U32 flags)
+{
+	items.push_back(std::string("Rename"));
+	if (!isItemRenameable() || (flags & FIRST_SELECTED_ITEM) == 0)
+	{
+		disabled_items.push_back(std::string("Rename"));
+	}
+
+	if (show_asset_id)
+	{
+		items.push_back(std::string("Copy Asset UUID"));
+		if ( (! ( isItemPermissive() || gAgent.isGodlike() ) )
+			  || (flags & FIRST_SELECTED_ITEM) == 0)
+		{
+			disabled_items.push_back(std::string("Copy Asset UUID"));
+		}
+	}
+
+	items.push_back(std::string("Copy Separator"));
+
+	items.push_back(std::string("Copy"));
+	if (!isItemCopyable())
+	{
+		disabled_items.push_back(std::string("Copy"));
+	}
+
+	items.push_back(std::string("Paste"));
+	if (!isClipboardPasteable() || (flags & FIRST_SELECTED_ITEM) == 0)
+	{
+		disabled_items.push_back(std::string("Paste"));
+	}
+
+	items.push_back(std::string("Paste As Link"));
+	if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0)
+	{
+		disabled_items.push_back(std::string("Paste As Link"));
+	}
+	items.push_back(std::string("Paste Separator"));
+
+	items.push_back(std::string("Delete"));
+	if (!isItemRemovable())
+	{
+		disabled_items.push_back(std::string("Delete"));
+	}
+
+	// If multiple items are selected, disable properties (if it exists).
+	if ((flags & FIRST_SELECTED_ITEM) == 0)
+	{
+		disabled_items.push_back(std::string("Properties"));
+	}
+}
+
+void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+	lldebugs << "LLInvFVBridge::buildContextMenu()" << llendl;
+	std::vector<std::string> items;
+	std::vector<std::string> disabled_items;
+	if(isInTrash())
+	{
+		items.push_back(std::string("PurgeItem"));
+		if (!isItemRemovable())
+		{
+			disabled_items.push_back(std::string("PurgeItem"));
+		}
+		items.push_back(std::string("RestoreItem"));
+	}
+	else
+	{
+		items.push_back(std::string("Open"));
+		items.push_back(std::string("Properties"));
+
+		getClipboardEntries(true, items, disabled_items, flags);
+	}
+	hide_context_entries(menu, items, disabled_items);
+}
+
+// *TODO: remove this
+BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
+{
+	BOOL rv = FALSE;
+
+	const LLInventoryObject* obj = getInventoryObject();
+
+	if(obj)
+	{
+		*type = LLViewerAssetType::lookupDragAndDropType(obj->getActualType());
+		if(*type == DAD_NONE)
+		{
+			return FALSE;
+		}
+
+		*id = obj->getUUID();
+		//object_ids.put(obj->getUUID());
+
+		if (*type == DAD_CATEGORY)
+		{
+			gInventory.startBackgroundFetch(obj->getUUID());
+		}
+
+		rv = TRUE;
+	}
+
+	return rv;
+}
+
+LLInventoryObject* LLInvFVBridge::getInventoryObject() const
+{
+	LLInventoryObject* obj = NULL;
+	LLInventoryModel* model = getInventoryModel();
+	if(model)
+	{
+		obj = (LLInventoryObject*)model->getObject(mUUID);
+	}
+	return obj;
+}
+
+LLInventoryModel* LLInvFVBridge::getInventoryModel() const
+{
+	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
+	return panel ? panel->getModel() : NULL;
+}
+
+BOOL LLInvFVBridge::isInTrash() const
+{
+	LLInventoryModel* model = getInventoryModel();
+	if(!model) return FALSE;
+	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+	return model->isObjectDescendentOf(mUUID, trash_id);
+}
+
+BOOL LLInvFVBridge::isLinkedObjectInTrash() const
+{
+	if (isInTrash()) return TRUE;
+
+	const LLInventoryObject *obj = getInventoryObject();
+	if (obj && obj->getIsLinkType())
+	{
+		LLInventoryModel* model = getInventoryModel();
+		if(!model) return FALSE;
+		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+		return model->isObjectDescendentOf(obj->getLinkedUUID(), trash_id);
+	}
+	return FALSE;
+}
+
+BOOL LLInvFVBridge::isAgentInventory() const
+{
+	const LLInventoryModel* model = getInventoryModel();
+	if(!model) return FALSE;
+	if(gInventory.getRootFolderID() == mUUID) return TRUE;
+	return model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID());
+}
+
+BOOL LLInvFVBridge::isCOFFolder() const
+{
+	const LLInventoryModel* model = getInventoryModel();
+	if(!model) return TRUE;
+	const LLUUID cof_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
+	if (mUUID == cof_id || model->isObjectDescendentOf(mUUID, cof_id))
+	{
+		return TRUE;
+	}
+	return FALSE;
+}
+
+BOOL LLInvFVBridge::isItemPermissive() const
+{
+	return FALSE;
+}
+
+// static
+void LLInvFVBridge::changeItemParent(LLInventoryModel* model,
+									 LLViewerInventoryItem* item,
+									 const LLUUID& new_parent,
+									 BOOL restamp)
+{
+	if(item->getParentUUID() != new_parent)
+	{
+		LLInventoryModel::update_list_t update;
+		LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1);
+		update.push_back(old_folder);
+		LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1);
+		update.push_back(new_folder);
+		gInventory.accountForUpdate(update);
+
+		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+		new_item->setParent(new_parent);
+		new_item->updateParentOnServer(restamp);
+		model->updateItem(new_item);
+		model->notifyObservers();
+	}
+}
+
+// static
+void LLInvFVBridge::changeCategoryParent(LLInventoryModel* model,
+										 LLViewerInventoryCategory* cat,
+										 const LLUUID& new_parent,
+										 BOOL restamp)
+{
+	if(cat->getParentUUID() != new_parent)
+	{
+		LLInventoryModel::update_list_t update;
+		LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1);
+		update.push_back(old_folder);
+		LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1);
+		update.push_back(new_folder);
+		gInventory.accountForUpdate(update);
+
+		LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat);
+		new_cat->setParent(new_parent);
+		new_cat->updateParentOnServer(restamp);
+		model->updateCategory(new_cat);
+		model->notifyObservers();
+	}
+}
+
+
+const std::string safe_inv_type_lookup(LLInventoryType::EType inv_type)
+{
+	const std::string rv= LLInventoryType::lookup(inv_type);
+	if(rv.empty())
+	{
+		return std::string("<invalid>");
+	}
+	return rv;
+}
+
+LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
+										   LLAssetType::EType actual_asset_type,
+										   LLInventoryType::EType inv_type,
+										   LLInventoryPanel* inventory,
+										   const LLUUID& uuid,
+										   U32 flags)
+{
+	LLInvFVBridge* new_listener = NULL;
+	switch(asset_type)
+	{
+		case LLAssetType::AT_TEXTURE:
+			if(!(inv_type == LLInventoryType::IT_TEXTURE || inv_type == LLInventoryType::IT_SNAPSHOT))
+			{
+				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+			}
+			new_listener = new LLTextureBridge(inventory, uuid, inv_type);
+			break;
+
+		case LLAssetType::AT_SOUND:
+			if(!(inv_type == LLInventoryType::IT_SOUND))
+			{
+				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+			}
+			new_listener = new LLSoundBridge(inventory, uuid);
+			break;
+
+		case LLAssetType::AT_LANDMARK:
+			if(!(inv_type == LLInventoryType::IT_LANDMARK))
+			{
+				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+			}
+			new_listener = new LLLandmarkBridge(inventory, uuid, flags);
+			break;
+
+		case LLAssetType::AT_CALLINGCARD:
+			if(!(inv_type == LLInventoryType::IT_CALLINGCARD))
+			{
+				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+			}
+			new_listener = new LLCallingCardBridge(inventory, uuid);
+			break;
+
+		case LLAssetType::AT_SCRIPT:
+			if(!(inv_type == LLInventoryType::IT_LSL))
+			{
+				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+			}
+			new_listener = new LLScriptBridge(inventory, uuid);
+			break;
+
+		case LLAssetType::AT_OBJECT:
+			if(!(inv_type == LLInventoryType::IT_OBJECT || inv_type == LLInventoryType::IT_ATTACHMENT))
+			{
+				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+			}
+			new_listener = new LLObjectBridge(inventory, uuid, inv_type, flags);
+			break;
+
+		case LLAssetType::AT_NOTECARD:
+			if(!(inv_type == LLInventoryType::IT_NOTECARD))
+			{
+				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+			}
+			new_listener = new LLNotecardBridge(inventory, uuid);
+			break;
+
+		case LLAssetType::AT_ANIMATION:
+			if(!(inv_type == LLInventoryType::IT_ANIMATION))
+			{
+				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+			}
+			new_listener = new LLAnimationBridge(inventory, uuid);
+			break;
+
+		case LLAssetType::AT_GESTURE:
+			if(!(inv_type == LLInventoryType::IT_GESTURE))
+			{
+				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+			}
+			new_listener = new LLGestureBridge(inventory, uuid);
+			break;
+
+		case LLAssetType::AT_LSL_TEXT:
+			if(!(inv_type == LLInventoryType::IT_LSL))
+			{
+				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+			}
+			new_listener = new LLLSLTextBridge(inventory, uuid);
+			break;
+
+		case LLAssetType::AT_CLOTHING:
+		case LLAssetType::AT_BODYPART:
+			if(!(inv_type == LLInventoryType::IT_WEARABLE))
+			{
+				llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+			}
+			new_listener = new LLWearableBridge(inventory, uuid, asset_type, inv_type, (EWearableType)flags);
+			break;
+		case LLAssetType::AT_CATEGORY:
+			if (actual_asset_type == LLAssetType::AT_LINK_FOLDER)
+			{
+				// Create a link folder handler instead.
+				new_listener = new LLLinkFolderBridge(inventory, uuid);
+				break;
+			}
+			new_listener = new LLFolderBridge(inventory, uuid);
+			break;
+		case LLAssetType::AT_LINK:
+			// Only should happen for broken links.
+			new_listener = new LLLinkItemBridge(inventory, uuid);
+			break;
+		case LLAssetType::AT_LINK_FOLDER:
+			// Only should happen for broken links.
+			new_listener = new LLLinkItemBridge(inventory, uuid);
+			break;
+		default:
+			llinfos << "Unhandled asset type (llassetstorage.h): "
+					<< (S32)asset_type << llendl;
+			break;
+	}
+
+	if (new_listener)
+	{
+		new_listener->mInvType = inv_type;
+	}
+
+	return new_listener;
+}
+
+void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid)
+{
+	LLInventoryCategory* cat = model->getCategory(uuid);
+	if (cat)
+	{
+		model->purgeDescendentsOf(uuid);
+		model->notifyObservers();
+	}
+	LLInventoryObject* obj = model->getObject(uuid);
+	if (obj)
+	{
+		model->purgeObject(uuid);
+		model->notifyObservers();
+	}
+}
+
+// +=================================================+
+// |        InventoryFVBridgeBuilder                 |
+// +=================================================+
+LLInvFVBridge* LLInventoryFVBridgeBuilder::createBridge(LLAssetType::EType asset_type,
+														LLAssetType::EType actual_asset_type,
+														LLInventoryType::EType inv_type,
+														LLInventoryPanel* inventory,
+														const LLUUID& uuid,
+														U32 flags /* = 0x00 */) const
+{
+	return LLInvFVBridge::createBridge(asset_type,
+		actual_asset_type,
+		inv_type,
+		inventory,
+		uuid,
+		flags);
+}
+
+// +=================================================+
+// |        LLItemBridge                             |
+// +=================================================+
+
+void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+{
+	if ("goto" == action)
+	{
+		gotoItem(folder);
+	}
+	if ("open" == action)
+	{
+		openItem();
+		return;
+	}
+	else if ("properties" == action)
+	{
+		showProperties();
+		return;
+	}
+	else if ("purge" == action)
+	{
+		purgeItem(model, mUUID);
+		return;
+	}
+	else if ("restoreToWorld" == action)
+	{
+		restoreToWorld();
+		return;
+	}
+	else if ("restore" == action)
+	{
+		restoreItem();
+		return;
+	}
+	else if ("copy_uuid" == action)
+	{
+		// Single item only
+		LLInventoryItem* item = model->getItem(mUUID);
+		if(!item) return;
+		LLUUID asset_id = item->getAssetUUID();
+		std::string buffer;
+		asset_id.toString(buffer);
+
+		gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(buffer));
+		return;
+	}
+	else if ("copy" == action)
+	{
+		copyToClipboard();
+		return;
+	}
+	else if ("paste" == action)
+	{
+		// Single item only
+		LLInventoryItem* itemp = model->getItem(mUUID);
+		if (!itemp) return;
+
+		LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID());
+		if (!folder_view_itemp) return;
+
+		folder_view_itemp->getListener()->pasteFromClipboard();
+		return;
+	}
+	else if ("paste_link" == action)
+	{
+		// Single item only
+		LLInventoryItem* itemp = model->getItem(mUUID);
+		if (!itemp) return;
+
+		LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID());
+		if (!folder_view_itemp) return;
+
+		folder_view_itemp->getListener()->pasteLinkFromClipboard();
+		return;
+	}
+}
+
+void LLItemBridge::selectItem()
+{
+	LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem();
+	if(item && !item->isComplete())
+	{
+		item->fetchFromServer();
+	}
+}
+
+void LLItemBridge::restoreItem()
+{
+	LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem();
+	if(item)
+	{
+		LLInventoryModel* model = getInventoryModel();
+		const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(item->getType()));
+		// do not restamp on restore.
+		LLInvFVBridge::changeItemParent(model, item, new_parent, FALSE);
+	}
+}
+
+void LLItemBridge::restoreToWorld()
+{
+	LLViewerInventoryItem* itemp = (LLViewerInventoryItem*)getItem();
+	if (itemp)
+	{
+		LLMessageSystem* msg = gMessageSystem;
+		msg->newMessage("RezRestoreToWorld");
+		msg->nextBlockFast(_PREHASH_AgentData);
+		msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+		msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+
+		msg->nextBlockFast(_PREHASH_InventoryData);
+		itemp->packMessage(msg);
+		msg->sendReliable(gAgent.getRegion()->getHost());
+	}
+
+	//Similar functionality to the drag and drop rez logic
+	BOOL remove_from_inventory = FALSE;
+
+	//remove local inventory copy, sim will deal with permissions and removing the item
+	//from the actual inventory if its a no-copy etc
+	if(!itemp->getPermissions().allowCopyBy(gAgent.getID()))
+	{
+		remove_from_inventory = TRUE;
+	}
+
+	// Check if it's in the trash. (again similar to the normal rez logic)
+	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+	if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id))
+	{
+		remove_from_inventory = TRUE;
+	}
+
+	if(remove_from_inventory)
+	{
+		gInventory.deleteObject(itemp->getUUID());
+		gInventory.notifyObservers();
+	}
+}
+
+void LLItemBridge::gotoItem(LLFolderView *folder)
+{
+	LLInventoryObject *obj = getInventoryObject();
+	if (obj && obj->getIsLinkType())
+	{
+		LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel();
+		if (active_panel)
+		{
+			active_panel->setSelection(obj->getLinkedUUID(), TAKE_FOCUS_NO);
+		}
+	}
+}
+
+LLUIImagePtr LLItemBridge::getIcon() const
+{
+	return LLUI::getUIImage(ICON_NAME[OBJECT_ICON_NAME]);
+}
+
+PermissionMask LLItemBridge::getPermissionMask() const
+{
+	LLViewerInventoryItem* item = getItem();
+	PermissionMask perm_mask = 0;
+	if(item)
+	{
+		BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID());
+		BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID());
+		BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER,
+															gAgent.getID());
+
+		if (copy) perm_mask |= PERM_COPY;
+		if (mod)  perm_mask |= PERM_MODIFY;
+		if (xfer) perm_mask |= PERM_TRANSFER;
+
+	}
+	return perm_mask;
+}
+
+const std::string& LLItemBridge::getDisplayName() const
+{
+	if(mDisplayName.empty())
+	{
+		buildDisplayName(getItem(), mDisplayName);
+	}
+	return mDisplayName;
+}
+
+void LLItemBridge::buildDisplayName(LLInventoryItem* item, std::string& name)
+{
+	if(item)
+	{
+		name.assign(item->getName());
+	}
+	else
+	{
+		name.assign(LLStringUtil::null);
+	}
+}
+
+LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const
+{
+	U8 font = LLFontGL::NORMAL;
+
+	if( gAgentWearables.isWearingItem( mUUID ) )
+	{
+		// llinfos << "BOLD" << llendl;
+		font |= LLFontGL::BOLD;
+	}
+
+	const LLViewerInventoryItem* item = getItem();
+	if (item && item->getIsLinkType())
+	{
+		font |= LLFontGL::ITALIC;
+	}
+	return (LLFontGL::StyleFlags)font;
+}
+
+std::string LLItemBridge::getLabelSuffix() const
+{
+	// String table is loaded before login screen and inventory items are
+	// loaded after login, so LLTrans should be ready.
+	static std::string NO_COPY =LLTrans::getString("no_copy");
+	static std::string NO_MOD = LLTrans::getString("no_modify");
+	static std::string NO_XFER = LLTrans::getString("no_transfer");
+	static std::string LINK = LLTrans::getString("link");
+	static std::string BROKEN_LINK = LLTrans::getString("broken_link");
+	std::string suffix;
+	LLInventoryItem* item = getItem();
+	if(item)
+	{
+		// it's a bit confusing to put nocopy/nomod/etc on calling cards.
+		if(LLAssetType::AT_CALLINGCARD != item->getType()
+		   && item->getPermissions().getOwner() == gAgent.getID())
+		{
+			BOOL broken_link = LLAssetType::lookupIsLinkType(item->getType());
+			if (broken_link) return BROKEN_LINK;
+
+			BOOL link = item->getIsLinkType();
+			if (link) return LINK;
+
+			BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID());
+			if (!copy)
+			{
+				suffix += NO_COPY;
+			}
+			BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID());
+			if (!mod)
+			{
+				suffix += NO_MOD;
+			}
+			BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER,
+																gAgent.getID());
+			if (!xfer)
+			{
+				suffix += NO_XFER;
+			}
+		}
+	}
+	return suffix;
+}
+
+time_t LLItemBridge::getCreationDate() const
+{
+	LLViewerInventoryItem* item = getItem();
+	if (item)
+	{
+		return item->getCreationDate();
+	}
+	return 0;
+}
+
+
+BOOL LLItemBridge::isItemRenameable() const
+{
+	LLViewerInventoryItem* item = getItem();
+	if(item)
+	{
+		// (For now) Don't allow calling card rename since that may confuse users as to
+		// what the calling card points to.
+		if (item->getInventoryType() == LLInventoryType::IT_CALLINGCARD)
+		{
+			return FALSE;
+		}
+		return (item->getPermissions().allowModifyBy(gAgent.getID()));
+	}
+	return FALSE;
+}
+
+BOOL LLItemBridge::renameItem(const std::string& new_name)
+{
+	if(!isItemRenameable())
+		return FALSE;
+	LLPreview::dirty(mUUID);
+	LLInventoryModel* model = getInventoryModel();
+	if(!model)
+		return FALSE;
+	LLViewerInventoryItem* item = getItem();
+	if(item && (item->getName() != new_name))
+	{
+		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+		new_item->rename(new_name);
+		buildDisplayName(new_item, mDisplayName);
+		new_item->updateServer(FALSE);
+		model->updateItem(new_item);
+
+		model->notifyObservers();
+	}
+	// return FALSE because we either notified observers (& therefore
+	// rebuilt) or we didn't update.
+	return FALSE;
+}
+
+
+BOOL LLItemBridge::removeItem()
+{
+	if(!isItemRemovable())
+	{
+		return FALSE;
+	}
+	// move it to the trash
+	LLPreview::hide(mUUID, TRUE);
+	LLInventoryModel* model = getInventoryModel();
+	if(!model) return FALSE;
+	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+	LLViewerInventoryItem* item = getItem();
+
+	// if item is not already in trash
+	if(item && !model->isObjectDescendentOf(mUUID, trash_id))
+	{
+		// move to trash, and restamp
+		LLInvFVBridge::changeItemParent(model, item, trash_id, TRUE);
+		// delete was successful
+		return TRUE;
+	}
+	else
+	{
+		// tried to delete already item in trash (should purge?)
+		return FALSE;
+	}
+}
+
+BOOL LLItemBridge::isItemCopyable() const
+{
+	LLViewerInventoryItem* item = getItem();
+	if (item)
+	{
+		// can't copy worn objects. DEV-15183
+		LLVOAvatarSelf *avatarp = gAgent.getAvatarObject();
+		if( !avatarp )
+		{
+			return FALSE;
+		}
+
+		if(avatarp->isWearingAttachment(mUUID))
+		{
+			return FALSE;
+		}
+
+		// All items can be copied, not all can be pasted.
+		// The only time an item can't be copied is if it's a link
+		// return (item->getPermissions().allowCopyBy(gAgent.getID()));
+		if (item->getIsLinkType())
+		{
+			return FALSE;
+		}
+		return TRUE;
+	}
+	return FALSE;
+}
+BOOL LLItemBridge::copyToClipboard() const
+{
+	if(isItemCopyable())
+	{
+		LLInventoryClipboard::instance().add(mUUID);
+		return TRUE;
+	}
+	return FALSE;
+}
+
+LLViewerInventoryItem* LLItemBridge::getItem() const
+{
+	LLViewerInventoryItem* item = NULL;
+	LLInventoryModel* model = getInventoryModel();
+	if(model)
+	{
+		item = (LLViewerInventoryItem*)model->getItem(mUUID);
+	}
+	return item;
+}
+
+BOOL LLItemBridge::isItemPermissive() const
+{
+	LLViewerInventoryItem* item = getItem();
+	if(item)
+	{
+		U32 mask = item->getPermissions().getMaskBase();
+		if((mask & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED)
+		{
+			return TRUE;
+		}
+	}
+	return FALSE;
+}
+
+// +=================================================+
+// |        LLFolderBridge                           |
+// +=================================================+
+
+LLFolderBridge* LLFolderBridge::sSelf=NULL;
+
+// Can be moved to another folder
+BOOL LLFolderBridge::isItemMovable() const
+{
+	LLInventoryObject* obj = getInventoryObject();
+	if(obj)
+	{
+		return (!LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)obj)->getPreferredType()));
+	}
+	return FALSE;
+}
+
+void LLFolderBridge::selectItem()
+{
+}
+
+
+// Can be destroyed (or moved to trash)
+BOOL LLFolderBridge::isItemRemovable()
+{
+	LLInventoryModel* model = getInventoryModel();
+	if(!model)
+	{
+		return FALSE;
+	}
+
+	if(!model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()))
+	{
+		return FALSE;
+	}
+
+	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
+	if( !avatar )
+	{
+		return FALSE;
+	}
+
+	LLInventoryCategory* category = model->getCategory(mUUID);
+	if( !category )
+	{
+		return FALSE;
+	}
+
+	if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
+	{
+		return FALSE;
+	}
+
+	LLInventoryModel::cat_array_t	descendent_categories;
+	LLInventoryModel::item_array_t	descendent_items;
+	gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE );
+
+	S32 i;
+	for( i = 0; i < descendent_categories.count(); i++ )
+	{
+		LLInventoryCategory* category = descendent_categories[i];
+		if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
+		{
+			return FALSE;
+		}
+	}
+
+	for( i = 0; i < descendent_items.count(); i++ )
+	{
+		LLInventoryItem* item = descendent_items[i];
+		if( (item->getType() == LLAssetType::AT_CLOTHING) ||
+			(item->getType() == LLAssetType::AT_BODYPART) )
+		{
+			if(gAgentWearables.isWearingItem(item->getUUID()))
+			{
+				return FALSE;
+			}
+		}
+		else
+		if( item->getType() == LLAssetType::AT_OBJECT )
+		{
+			if(avatar->isWearingAttachment(item->getUUID()))
+			{
+				return FALSE;
+			}
+		}
+	}
+
+	return TRUE;
+}
+
+BOOL LLFolderBridge::isUpToDate() const
+{
+	LLInventoryModel* model = getInventoryModel();
+	if(!model) return FALSE;
+	LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID);
+	if( !category )
+	{
+		return FALSE;
+	}
+
+	return category->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN;
+}
+
+BOOL LLFolderBridge::isItemCopyable() const
+{
+	return TRUE;
+}
+
+BOOL LLFolderBridge::copyToClipboard() const
+{
+	if(isItemCopyable())
+	{
+		LLInventoryClipboard::instance().add(mUUID);
+		return TRUE;
+	}
+	return FALSE;
+}
+
+BOOL LLFolderBridge::isClipboardPasteable() const
+{
+	if ( ! LLInvFVBridge::isClipboardPasteable() )
+		return FALSE;
+
+	// Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599
+	if ( LLFriendCardsManager::instance().isCategoryInFriendFolder( getCategory() ) )
+	{
+		LLInventoryModel* model = getInventoryModel();
+		if ( !model )
+		{
+			return FALSE;
+		}
+
+		LLDynamicArray<LLUUID> objects;
+		LLInventoryClipboard::instance().retrieve(objects);
+		const LLViewerInventoryCategory *current_cat = getCategory();
+
+		// Search for the direct descendent of current Friends subfolder among all pasted items,
+		// and return false if is found.
+		for(S32 i = objects.count() - 1; i >= 0; --i)
+		{
+			const LLUUID &obj_id = objects.get(i);
+			if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) )
+			{
+				return FALSE;
+			}
+		}
+
+	}
+	return TRUE;
+}
+
+BOOL LLFolderBridge::isClipboardPasteableAsLink() const
+{
+	// Check normal paste-as-link permissions
+	if (!LLInvFVBridge::isClipboardPasteableAsLink())
+	{
+		return FALSE;
+	}
+
+	const LLInventoryModel* model = getInventoryModel();
+	if (!model)
+	{
+		return FALSE;
+	}
+
+	const LLViewerInventoryCategory *current_cat = getCategory();
+	if (current_cat)
+	{
+		const BOOL is_in_friend_folder = LLFriendCardsManager::instance().isCategoryInFriendFolder( current_cat );
+		const LLUUID &current_cat_id = current_cat->getUUID();
+		LLDynamicArray<LLUUID> objects;
+		LLInventoryClipboard::instance().retrieve(objects);
+		S32 count = objects.count();
+		for(S32 i = 0; i < count; i++)
+		{
+			const LLUUID &obj_id = objects.get(i);
+			const LLInventoryCategory *cat = model->getCategory(obj_id);
+			if (cat)
+			{
+				const LLUUID &cat_id = cat->getUUID();
+				// Don't allow recursive pasting
+				if ((cat_id == current_cat_id) ||
+					model->isObjectDescendentOf(current_cat_id, cat_id))
+				{
+					return FALSE;
+				}
+			}
+			// Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599
+			if ( is_in_friend_folder )
+			{
+				// If object is direct descendent of current Friends subfolder than return false.
+				// Note: We can't use 'const LLInventoryCategory *cat', because it may be null
+				// in case type of obj_id is LLInventoryItem.
+				if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) )
+				{
+					return FALSE;
+				}
+			}
+		}
+	}
+	return TRUE;
+
+}
+
+BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
+											BOOL drop)
+{
+	// This should never happen, but if an inventory item is incorrectly parented,
+	// the UI will get confused and pass in a NULL.
+	if(!inv_cat) return FALSE;
+
+	LLInventoryModel* model = getInventoryModel();
+	if(!model) return FALSE;
+
+	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
+	if(!avatar) return FALSE;
+
+	// cannot drag categories into library
+	if(!isAgentInventory())
+	{
+		return FALSE;
+	}
+
+	// check to make sure source is agent inventory, and is represented there.
+	LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource();
+	BOOL is_agent_inventory = (model->getCategory(inv_cat->getUUID()) != NULL)
+		&& (LLToolDragAndDrop::SOURCE_AGENT == source);
+
+	BOOL accept = FALSE;
+	S32 i;
+	LLInventoryModel::cat_array_t	descendent_categories;
+	LLInventoryModel::item_array_t	descendent_items;
+	if(is_agent_inventory)
+	{
+		const LLUUID& cat_id = inv_cat->getUUID();
+
+		// Is the destination the trash?
+		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+		BOOL move_is_into_trash = (mUUID == trash_id)
+				|| model->isObjectDescendentOf(mUUID, trash_id);
+		BOOL is_movable = (!LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType()));
+		const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
+		BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
+		BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
+		if (move_is_into_current_outfit || move_is_into_outfit)
+		{
+			// BAP - restrictions?
+			is_movable = true;
+		}
+
+		if (mUUID == gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE))
+		{
+			is_movable = FALSE; // It's generally movable but not into Favorites folder. EXT-1604
+		}
+
+		if( is_movable )
+		{
+			gInventory.collectDescendents( cat_id, descendent_categories, descendent_items, FALSE );
+
+			for( i = 0; i < descendent_categories.count(); i++ )
+			{
+				LLInventoryCategory* category = descendent_categories[i];
+				if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
+				{
+					// ...can't move "special folders" like Textures
+					is_movable = FALSE;
+					break;
+				}
+			}
+
+			if( is_movable )
+			{
+				if( move_is_into_trash )
+				{
+					for( i = 0; i < descendent_items.count(); i++ )
+					{
+						LLInventoryItem* item = descendent_items[i];
+						if( (item->getType() == LLAssetType::AT_CLOTHING) ||
+							(item->getType() == LLAssetType::AT_BODYPART) )
+						{
+							if( gAgentWearables.isWearingItem( item->getUUID() ) )
+							{
+								is_movable = FALSE;  // It's generally movable, but not into the trash!
+								break;
+							}
+						}
+						else
+						if( item->getType() == LLAssetType::AT_OBJECT )
+						{
+							if( avatar->isWearingAttachment( item->getUUID() ) )
+							{
+								is_movable = FALSE;  // It's generally movable, but not into the trash!
+								break;
+							}
+						}
+					}
+				}
+			}
+		}
+
+
+		accept =	is_movable
+					&& (mUUID != cat_id)								// Can't move a folder into itself
+					&& (mUUID != inv_cat->getParentUUID())				// Avoid moves that would change nothing
+					&& !(model->isObjectDescendentOf(mUUID, cat_id));	// Avoid circularity
+		if(accept && drop)
+		{
+			// Look for any gestures and deactivate them
+			if (move_is_into_trash)
+			{
+				for (i = 0; i < descendent_items.count(); i++)
+				{
+					LLInventoryItem* item = descendent_items[i];
+					if (item->getType() == LLAssetType::AT_GESTURE
+						&& LLGestureManager::instance().isGestureActive(item->getUUID()))
+					{
+						LLGestureManager::instance().deactivateGesture(item->getUUID());
+					}
+				}
+			}
+			// if target is an outfit or current outfit folder we use link
+			if (move_is_into_current_outfit || move_is_into_outfit)
+			{
+				if (inv_cat->getPreferredType() == LLFolderType::FT_NONE)
+				{
+					if (move_is_into_current_outfit)
+					{
+						// traverse category and add all contents to currently worn.
+						BOOL append = true;
+						LLAppearanceManager::instance().wearInventoryCategory(inv_cat, false, append);
+					}
+					else
+					{
+						// Recursively create links in target outfit.
+						LLInventoryModel::cat_array_t cats;
+						LLInventoryModel::item_array_t items;
+						gInventory.collectDescendents(inv_cat->getUUID(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
+						LLAppearanceManager::instance().linkAll(mUUID,items,NULL);
+					}
+				}
+				else
+				{
+#if SUPPORT_ENSEMBLES
+				// BAP - should skip if dup.
+				if (move_is_into_current_outfit)
+				{
+					LLAppearanceManager::instance().addEnsembleLink(inv_cat);
+				}
+				else
+				{
+					LLPointer<LLInventoryCallback> cb = NULL;
+					link_inventory_item(
+						gAgent.getID(),
+						inv_cat->getUUID(),
+						mUUID,
+						inv_cat->getName(),
+						LLAssetType::AT_LINK_FOLDER,
+						cb);
+				}
+#endif
+				}
+			}
+			else
+			{
+
+				// Reparent the folder and restamp children if it's moving
+				// into trash.
+				LLInvFVBridge::changeCategoryParent(
+					model,
+					(LLViewerInventoryCategory*)inv_cat,
+					mUUID,
+					move_is_into_trash);
+			}
+		}
+	}
+	else if(LLToolDragAndDrop::SOURCE_WORLD == source)
+	{
+		// content category has same ID as object itself
+		LLUUID object_id = inv_cat->getUUID();
+		LLUUID category_id = mUUID;
+		accept = move_inv_category_world_to_agent(object_id, category_id, drop);
+	}
+	return accept;
+}
+
+void warn_move_inventory(LLViewerObject* object, LLMoveInv* move_inv)
+{
+	const char* dialog = NULL;
+	if (object->flagScripted())
+	{
+		dialog = "MoveInventoryFromScriptedObject";
+	}
+	else
+	{
+		dialog = "MoveInventoryFromObject";
+	}
+	LLNotifications::instance().add(dialog, LLSD(), LLSD(), boost::bind(move_task_inventory_callback, _1, _2, move_inv));
+}
+
+// Move/copy all inventory items from the Contents folder of an in-world
+// object to the agent's inventory, inside a given category.
+BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
+									  const LLUUID& category_id,
+									  BOOL drop,
+									  void (*callback)(S32, void*),
+									  void* user_data)
+{
+	// Make sure the object exists. If we allowed dragging from
+	// anonymous objects, it would be possible to bypass
+	// permissions.
+	// content category has same ID as object itself
+	LLViewerObject* object = gObjectList.findObject(object_id);
+	if(!object)
+	{
+		llinfos << "Object not found for drop." << llendl;
+		return FALSE;
+	}
+
+	// this folder is coming from an object, as there is only one folder in an object, the root,
+	// we need to collect the entire contents and handle them as a group
+	InventoryObjectList inventory_objects;
+	object->getInventoryContents(inventory_objects);
+
+	if (inventory_objects.empty())
+	{
+		llinfos << "Object contents not found for drop." << llendl;
+		return FALSE;
+	}
+
+	BOOL accept = TRUE;
+	BOOL is_move = FALSE;
+
+	// coming from a task. Need to figure out if the person can
+	// move/copy this item.
+	InventoryObjectList::iterator it = inventory_objects.begin();
+	InventoryObjectList::iterator end = inventory_objects.end();
+	for ( ; it != end; ++it)
+	{
+		// coming from a task. Need to figure out if the person can
+		// move/copy this item.
+		LLPermissions perm(((LLInventoryItem*)((LLInventoryObject*)(*it)))->getPermissions());
+		if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID())
+			&& perm.allowTransferTo(gAgent.getID())))
+//			|| gAgent.isGodlike())
+		{
+			accept = TRUE;
+		}
+		else if(object->permYouOwner())
+		{
+			// If the object cannot be copied, but the object the
+			// inventory is owned by the agent, then the item can be
+			// moved from the task to agent inventory.
+			is_move = TRUE;
+			accept = TRUE;
+		}
+		else
+		{
+			accept = FALSE;
+			break;
+		}
+	}
+
+	if(drop && accept)
+	{
+		it = inventory_objects.begin();
+		InventoryObjectList::iterator first_it = inventory_objects.begin();
+		LLMoveInv* move_inv = new LLMoveInv;
+		move_inv->mObjectID = object_id;
+		move_inv->mCategoryID = category_id;
+		move_inv->mCallback = callback;
+		move_inv->mUserData = user_data;
+
+		for ( ; it != end; ++it)
+		{
+			two_uuids_t two(category_id, (*it)->getUUID());
+			move_inv->mMoveList.push_back(two);
+		}
+
+		if(is_move)
+		{
+			// Callback called from within here.
+			warn_move_inventory(object, move_inv);
+		}
+		else
+		{
+			LLNotification::Params params("MoveInventoryFromObject");
+			params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv));
+			LLNotifications::instance().forceResponse(params, 0);
+		}
+	}
+	return accept;
+}
+
+bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat,
+									 LLInventoryItem* item)
+{
+	// Valid COF items are:
+	// - links to wearables (body parts or clothing)
+	// - links to attachments
+	// - links to gestures
+	// - links to ensemble folders
+	LLViewerInventoryItem *linked_item = ((LLViewerInventoryItem*)item)->getLinkedItem(); // BAP - safe?
+	if (linked_item)
+	{
+		LLAssetType::EType type = linked_item->getType();
+		return (type == LLAssetType::AT_CLOTHING ||
+				type == LLAssetType::AT_BODYPART ||
+				type == LLAssetType::AT_GESTURE ||
+				type == LLAssetType::AT_OBJECT);
+	}
+	else
+	{
+		LLViewerInventoryCategory *linked_category = ((LLViewerInventoryItem*)item)->getLinkedCategory(); // BAP - safe?
+		// BAP remove AT_NONE support after ensembles are fully working?
+		return (linked_category &&
+				((linked_category->getPreferredType() == LLFolderType::FT_NONE) ||
+				 (LLFolderType::lookupIsEnsembleType(linked_category->getPreferredType()))));
+	}
+}
+
+
+bool LLFindWearables::operator()(LLInventoryCategory* cat,
+								 LLInventoryItem* item)
+{
+	if(item)
+	{
+		if((item->getType() == LLAssetType::AT_CLOTHING)
+		   || (item->getType() == LLAssetType::AT_BODYPART))
+		{
+			return TRUE;
+		}
+	}
+	return FALSE;
+}
+
+
+
+//Used by LLFolderBridge as callback for directory recursion.
+class LLRightClickInventoryFetchObserver : public LLInventoryFetchObserver
+{
+public:
+	LLRightClickInventoryFetchObserver() :
+		mCopyItems(false)
+	{ };
+	LLRightClickInventoryFetchObserver(const LLUUID& cat_id, bool copy_items) :
+		mCatID(cat_id),
+		mCopyItems(copy_items)
+		{ };
+	virtual void done()
+	{
+		// we've downloaded all the items, so repaint the dialog
+		LLFolderBridge::staticFolderOptionsMenu();
+
+		gInventory.removeObserver(this);
+		delete this;
+	}
+
+
+protected:
+	LLUUID mCatID;
+	bool mCopyItems;
+
+};
+
+//Used by LLFolderBridge as callback for directory recursion.
+class LLRightClickInventoryFetchDescendentsObserver : public LLInventoryFetchDescendentsObserver
+{
+public:
+	LLRightClickInventoryFetchDescendentsObserver(bool copy_items) : mCopyItems(copy_items) {}
+	~LLRightClickInventoryFetchDescendentsObserver() {}
+	virtual void done();
+protected:
+	bool mCopyItems;
+};
+
+void LLRightClickInventoryFetchDescendentsObserver::done()
+{
+	// Avoid passing a NULL-ref as mCompleteFolders.front() down to
+	// gInventory.collectDescendents()
+	if( mCompleteFolders.empty() )
+	{
+		llwarns << "LLRightClickInventoryFetchDescendentsObserver::done with empty mCompleteFolders" << llendl;
+		dec_busy_count();
+		gInventory.removeObserver(this);
+		delete this;
+		return;
+	}
+
+	// What we do here is get the complete information on the items in
+	// the library, and set up an observer that will wait for that to
+	// happen.
+	LLInventoryModel::cat_array_t cat_array;
+	LLInventoryModel::item_array_t item_array;
+	gInventory.collectDescendents(mCompleteFolders.front(),
+								  cat_array,
+								  item_array,
+								  LLInventoryModel::EXCLUDE_TRASH);
+	S32 count = item_array.count();
+#if 0 // HACK/TODO: Why?
+	// This early causes a giant menu to get produced, and doesn't seem to be needed.
+	if(!count)
+	{
+		llwarns << "Nothing fetched in category " << mCompleteFolders.front()
+				<< llendl;
+		dec_busy_count();
+		gInventory.removeObserver(this);
+		delete this;
+		return;
+	}
+#endif
+
+	LLRightClickInventoryFetchObserver* outfit;
+	outfit = new LLRightClickInventoryFetchObserver(mCompleteFolders.front(), mCopyItems);
+	LLInventoryFetchObserver::item_ref_t ids;
+	for(S32 i = 0; i < count; ++i)
+	{
+		ids.push_back(item_array.get(i)->getUUID());
+	}
+
+	// clean up, and remove this as an observer since the call to the
+	// outfit could notify observers and throw us into an infinite
+	// loop.
+	dec_busy_count();
+	gInventory.removeObserver(this);
+	delete this;
+
+	// increment busy count and either tell the inventory to check &
+	// call done, or add this object to the inventory for observation.
+	inc_busy_count();
+
+	// do the fetch
+	outfit->fetchItems(ids);
+	outfit->done();				//Not interested in waiting and this will be right 99% of the time.
+//Uncomment the following code for laggy Inventory UI.
+/*	if(outfit->isEverythingComplete())
+	{
+		// everything is already here - call done.
+		outfit->done();
+	}
+	else
+	{
+		// it's all on it's way - add an observer, and the inventory
+		// will call done for us when everything is here.
+		gInventory.addObserver(outfit);
+	}*/
+}
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryWearObserver
+//
+// Observer for "copy and wear" operation to support knowing
+// when the all of the contents have been added to inventory.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryCopyAndWearObserver : public LLInventoryObserver
+{
+public:
+	LLInventoryCopyAndWearObserver(const LLUUID& cat_id, int count) :mCatID(cat_id), mContentsCount(count), mFolderAdded(FALSE) {}
+	virtual ~LLInventoryCopyAndWearObserver() {}
+	virtual void changed(U32 mask);
+
+protected:
+	LLUUID mCatID;
+	int    mContentsCount;
+	BOOL   mFolderAdded;
+};
+
+
+
+void LLInventoryCopyAndWearObserver::changed(U32 mask)
+{
+	if((mask & (LLInventoryObserver::ADD)) != 0)
+	{
+		if (!mFolderAdded)
+		{
+			const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
+
+			std::set<LLUUID>::const_iterator id_it = changed_items.begin();
+			std::set<LLUUID>::const_iterator id_end = changed_items.end();
+			for (;id_it != id_end; ++id_it)
+			{
+				if ((*id_it) == mCatID)
+				{
+					mFolderAdded = TRUE;
+					break;
+				}
+			}
+		}
+
+		if (mFolderAdded)
+		{
+			LLViewerInventoryCategory* category = gInventory.getCategory(mCatID);
+
+			if (NULL == category)
+			{
+				llwarns << "gInventory.getCategory(" << mCatID
+					<< ") was NULL" << llendl;
+			}
+			else
+			{
+				if (category->getDescendentCount() ==
+				    mContentsCount)
+				{
+					gInventory.removeObserver(this);
+					LLAppearanceManager::instance().wearInventoryCategory(category, FALSE, TRUE);
+					delete this;
+				}
+			}
+		}
+
+	}
+}
+
+
+
+void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+{
+	if ("open" == action)
+	{
+		openItem();
+		return;
+	}
+	else if ("paste" == action)
+	{
+		pasteFromClipboard();
+		return;
+	}
+	else if ("paste_link" == action)
+	{
+		pasteLinkFromClipboard();
+		return;
+	}
+	else if ("properties" == action)
+	{
+		showProperties();
+		return;
+	}
+	else if ("replaceoutfit" == action)
+	{
+		modifyOutfit(FALSE);
+		return;
+	}
+#if SUPPORT_ENSEMBLES
+	else if ("wearasensemble" == action)
+	{
+		LLInventoryModel* model = getInventoryModel();
+		if(!model) return;
+		LLViewerInventoryCategory* cat = getCategory();
+		if(!cat) return;
+		LLAppearanceManager::instance().addEnsembleLink(cat,true);
+		return;
+	}
+#endif
+	else if ("addtooutfit" == action)
+	{
+		modifyOutfit(TRUE);
+		return;
+	}
+	else if ("copy" == action)
+	{
+		copyToClipboard();
+		return;
+	}
+	else if ("removefromoutfit" == action)
+	{
+		LLInventoryModel* model = getInventoryModel();
+		if(!model) return;
+		LLViewerInventoryCategory* cat = getCategory();
+		if(!cat) return;
+
+		remove_inventory_category_from_avatar ( cat );
+		return;
+	}
+	else if ("purge" == action)
+	{
+		purgeItem(model, mUUID);
+		return;
+	}
+	else if ("restore" == action)
+	{
+		restoreItem();
+		return;
+	}
+}
+
+void LLFolderBridge::openItem()
+{
+	lldebugs << "LLFolderBridge::openItem()" << llendl;
+	LLInventoryModel* model = getInventoryModel();
+	if(!model) return;
+	if(mUUID.isNull()) return;
+	bool fetching_inventory = model->fetchDescendentsOf(mUUID);
+	// Only change folder type if we have the folder contents.
+	if (!fetching_inventory)
+	{
+		// Disabling this for now, it's causing crash when new items are added to folders
+		// since folder type may change before new item item has finished processing.
+		// determineFolderType();
+	}
+}
+
+void LLFolderBridge::closeItem()
+{
+	determineFolderType();
+}
+
+void LLFolderBridge::determineFolderType()
+{
+	if (isUpToDate())
+	{
+		LLInventoryModel* model = getInventoryModel();
+		LLViewerInventoryCategory* category = model->getCategory(mUUID);
+		category->determineFolderType();
+	}
+}
+
+BOOL LLFolderBridge::isItemRenameable() const
+{
+	LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)getCategory();
+	if(cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType())
+	   && (cat->getOwnerID() == gAgent.getID()))
+	{
+		return TRUE;
+	}
+	return FALSE;
+}
+
+void LLFolderBridge::restoreItem()
+{
+	LLViewerInventoryCategory* cat;
+	cat = (LLViewerInventoryCategory*)getCategory();
+	if(cat)
+	{
+		LLInventoryModel* model = getInventoryModel();
+		const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(cat->getType()));
+		// do not restamp children on restore
+		LLInvFVBridge::changeCategoryParent(model, cat, new_parent, FALSE);
+	}
+}
+
+LLFolderType::EType LLFolderBridge::getPreferredType() const
+{
+	LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
+	LLViewerInventoryCategory* cat = getCategory();
+	if(cat)
+	{
+		preferred_type = cat->getPreferredType();
+	}
+
+	return preferred_type;
+}
+
+// Icons for folders are based on the preferred type
+LLUIImagePtr LLFolderBridge::getIcon() const
+{
+	LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
+	LLViewerInventoryCategory* cat = getCategory();
+	if(cat)
+	{
+		preferred_type = cat->getPreferredType();
+	}
+	return getIcon(preferred_type);
+}
+
+LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type)
+{
+	// we only have one folder image now
+	return LLUI::getUIImage("Inv_FolderClosed");
+}
+
+BOOL LLFolderBridge::renameItem(const std::string& new_name)
+{
+	if(!isItemRenameable())
+		return FALSE;
+	LLInventoryModel* model = getInventoryModel();
+	if(!model)
+		return FALSE;
+	LLViewerInventoryCategory* cat = getCategory();
+	if(cat && (cat->getName() != new_name))
+	{
+		LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat);
+		new_cat->rename(new_name);
+		new_cat->updateServer(FALSE);
+		model->updateCategory(new_cat);
+
+		model->notifyObservers();
+	}
+	// return FALSE because we either notified observers (& therefore
+	// rebuilt) or we didn't update.
+	return FALSE;
+}
+
+BOOL LLFolderBridge::removeItem()
+{
+	if(!isItemRemovable())
+	{
+		return FALSE;
+	}
+	// move it to the trash
+	LLPreview::hide(mUUID);
+	LLInventoryModel* model = getInventoryModel();
+	if(!model) return FALSE;
+
+	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+
+	// Look for any gestures and deactivate them
+	LLInventoryModel::cat_array_t	descendent_categories;
+	LLInventoryModel::item_array_t	descendent_items;
+	gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE );
+
+	S32 i;
+	for (i = 0; i < descendent_items.count(); i++)
+	{
+		LLInventoryItem* item = descendent_items[i];
+		if (item->getType() == LLAssetType::AT_GESTURE
+			&& LLGestureManager::instance().isGestureActive(item->getUUID()))
+		{
+			LLGestureManager::instance().deactivateGesture(item->getUUID());
+		}
+	}
+
+	// go ahead and do the normal remove if no 'last calling
+	// cards' are being removed.
+	LLViewerInventoryCategory* cat = getCategory();
+	if(cat)
+	{
+		LLInvFVBridge::changeCategoryParent(model, cat, trash_id, TRUE);
+	}
+
+	return TRUE;
+}
+
+void LLFolderBridge::pasteFromClipboard()
+{
+	LLInventoryModel* model = getInventoryModel();
+	if(model && isClipboardPasteable())
+	{
+		LLInventoryItem* item = NULL;
+		LLDynamicArray<LLUUID> objects;
+		LLInventoryClipboard::instance().retrieve(objects);
+		S32 count = objects.count();
+		const LLUUID parent_id(mUUID);
+		for(S32 i = 0; i < count; i++)
+		{
+			item = model->getItem(objects.get(i));
+			if (item)
+			{
+				if(LLInventoryClipboard::instance().isCutMode())
+				{
+					// move_inventory_item() is not enough,
+					//we have to update inventory locally too
+					changeItemParent(model, dynamic_cast<LLViewerInventoryItem*>(item), parent_id, FALSE);
+				}
+				else
+				{
+					copy_inventory_item(
+						gAgent.getID(),
+						item->getPermissions().getOwner(),
+						item->getUUID(),
+						parent_id,
+						std::string(),
+						LLPointer<LLInventoryCallback>(NULL));
+				}
+			}
+		}
+	}
+}
+
+void LLFolderBridge::pasteLinkFromClipboard()
+{
+	const LLInventoryModel* model = getInventoryModel();
+	if(model)
+	{
+		LLDynamicArray<LLUUID> objects;
+		LLInventoryClipboard::instance().retrieve(objects);
+		S32 count = objects.count();
+		LLUUID parent_id(mUUID);
+		for(S32 i = 0; i < count; i++)
+		{
+			const LLUUID &object_id = objects.get(i);
+#if SUPPORT_ENSEMBLES
+			if (LLInventoryCategory *cat = model->getCategory(object_id))
+			{
+				link_inventory_item(
+					gAgent.getID(),
+					cat->getUUID(),
+					parent_id,
+					cat->getName(),
+					LLAssetType::AT_LINK_FOLDER,
+					LLPointer<LLInventoryCallback>(NULL));
+			}
+			else
+#endif
+			if (LLInventoryItem *item = model->getItem(object_id))
+			{
+				link_inventory_item(
+					gAgent.getID(),
+					item->getLinkedUUID(),
+					parent_id,
+					item->getName(),
+					LLAssetType::AT_LINK,
+					LLPointer<LLInventoryCallback>(NULL));
+			}
+		}
+	}
+}
+
+void LLFolderBridge::staticFolderOptionsMenu()
+{
+	if (!sSelf) return;
+	sSelf->folderOptionsMenu();
+}
+
+void LLFolderBridge::folderOptionsMenu()
+{
+	std::vector<std::string> disabled_items;
+
+	LLInventoryModel* model = getInventoryModel();
+	if(!model) return;
+
+	const LLInventoryCategory* category = model->getCategory(mUUID);
+	LLFolderType::EType type = category->getPreferredType();
+	const bool is_default_folder = category && LLFolderType::lookupIsProtectedType(type);
+	// BAP change once we're no longer treating regular categories as ensembles.
+	const bool is_ensemble = category && (type == LLFolderType::FT_NONE ||
+										  LLFolderType::lookupIsEnsembleType(type));
+
+	// calling card related functionality for folders.
+
+	// Only enable calling-card related options for non-default folders.
+	if (!is_default_folder)
+	{
+		LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD);
+		if (mCallingCards || checkFolderForContentsOfType(model, is_callingcard))
+		{
+			mItems.push_back(std::string("Calling Card Separator"));
+			mItems.push_back(std::string("Conference Chat Folder"));
+			mItems.push_back(std::string("IM All Contacts In Folder"));
+		}
+	}
+
+	// wearables related functionality for folders.
+	//is_wearable
+	LLFindWearables is_wearable;
+	LLIsType is_object( LLAssetType::AT_OBJECT );
+	LLIsType is_gesture( LLAssetType::AT_GESTURE );
+
+	if (mWearables ||
+		checkFolderForContentsOfType(model, is_wearable)  ||
+		checkFolderForContentsOfType(model, is_object) ||
+		checkFolderForContentsOfType(model, is_gesture) )
+	{
+		mItems.push_back(std::string("Folder Wearables Separator"));
+
+		// Only enable add/replace outfit for non-default folders.
+		if (!is_default_folder)
+		{
+			mItems.push_back(std::string("Add To Outfit"));
+			mItems.push_back(std::string("Replace Outfit"));
+		}
+		if (is_ensemble)
+		{
+			mItems.push_back(std::string("Wear As Ensemble"));
+		}
+		mItems.push_back(std::string("Remove From Outfit"));
+	}
+	hide_context_entries(*mMenu, mItems, disabled_items);
+}
+
+BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& is_type)
+{
+	LLInventoryModel::cat_array_t cat_array;
+	LLInventoryModel::item_array_t item_array;
+	model->collectDescendentsIf(mUUID,
+								cat_array,
+								item_array,
+								LLInventoryModel::EXCLUDE_TRASH,
+								is_type);
+	return ((item_array.count() > 0) ? TRUE : FALSE );
+}
+
+// Flags unused
+void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+	mItems.clear();
+	mDisabledItems.clear();
+
+	lldebugs << "LLFolderBridge::buildContextMenu()" << llendl;
+//	std::vector<std::string> disabled_items;
+	LLInventoryModel* model = getInventoryModel();
+	if(!model) return;
+	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+	const LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
+
+	mItems.clear(); //adding code to clear out member Items (which means Items should not have other data here at this point)
+	mDisabledItems.clear(); //adding code to clear out disabled members from previous
+	if (lost_and_found_id == mUUID)
+	  {
+		// This is the lost+found folder.
+		  mItems.push_back(std::string("Empty Lost And Found"));
+	  }
+
+	if(trash_id == mUUID)
+	{
+		// This is the trash.
+		mItems.push_back(std::string("Empty Trash"));
+	}
+	else if(model->isObjectDescendentOf(mUUID, trash_id))
+	{
+		// This is a folder in the trash.
+		mItems.clear(); // clear any items that used to exist
+		mItems.push_back(std::string("Purge Item"));
+		if (!isItemRemovable())
+		{
+			mDisabledItems.push_back(std::string("Purge Item"));
+		}
+
+		mItems.push_back(std::string("Restore Item"));
+	}
+	else if(isAgentInventory()) // do not allow creating in library
+	{
+		LLViewerInventoryCategory *cat =  getCategory();
+		// BAP removed protected check to re-enable standard ops in untyped folders.
+		// Not sure what the right thing is to do here.
+		if (!isCOFFolder() && cat /*&&
+			LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())*/)
+		{
+			// Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694.
+			if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat))
+				mItems.push_back(std::string("New Folder"));
+			mItems.push_back(std::string("New Script"));
+			mItems.push_back(std::string("New Note"));
+			mItems.push_back(std::string("New Gesture"));
+			mItems.push_back(std::string("New Clothes"));
+			mItems.push_back(std::string("New Body Parts"));
+			mItems.push_back(std::string("Change Type"));
+
+			LLViewerInventoryCategory *cat = getCategory();
+			if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
+			{
+				mDisabledItems.push_back(std::string("Change Type"));
+			}
+
+			getClipboardEntries(false, mItems, mDisabledItems, flags);
+		}
+		else
+		{
+			// Want some but not all of the items from getClipboardEntries for outfits.
+			if (cat && cat->getPreferredType()==LLFolderType::FT_OUTFIT)
+			{
+				mItems.push_back(std::string("Rename"));
+				mItems.push_back(std::string("Delete"));
+			}
+		}
+
+		//Added by spatters to force inventory pull on right-click to display folder options correctly. 07-17-06
+		mCallingCards = mWearables = FALSE;
+
+		LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD);
+		if (checkFolderForContentsOfType(model, is_callingcard))
+		{
+			mCallingCards=TRUE;
+		}
+
+		LLFindWearables is_wearable;
+		LLIsType is_object( LLAssetType::AT_OBJECT );
+		LLIsType is_gesture( LLAssetType::AT_GESTURE );
+
+		if (checkFolderForContentsOfType(model, is_wearable)  ||
+			checkFolderForContentsOfType(model, is_object) ||
+			checkFolderForContentsOfType(model, is_gesture) )
+		{
+			mWearables=TRUE;
+		}
+
+		mMenu = &menu;
+		sSelf = this;
+		LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(FALSE);
+
+		LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+		LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID);
+		if (category)
+		{
+			folders.push_back(category->getUUID());
+		}
+		fetch->fetchDescendents(folders);
+		inc_busy_count();
+		if(fetch->isEverythingComplete())
+		{
+			// everything is already here - call done.
+			fetch->done();
+		}
+		else
+		{
+			// it's all on it's way - add an observer, and the inventory
+			// will call done for us when everything is here.
+			gInventory.addObserver(fetch);
+		}
+	}
+	else
+	{
+		mItems.push_back(std::string("--no options--"));
+		mDisabledItems.push_back(std::string("--no options--"));
+	}
+	hide_context_entries(menu, mItems, mDisabledItems);
+}
+
+BOOL LLFolderBridge::hasChildren() const
+{
+	LLInventoryModel* model = getInventoryModel();
+	if(!model) return FALSE;
+	LLInventoryModel::EHasChildren has_children;
+	has_children = gInventory.categoryHasChildren(mUUID);
+	return has_children != LLInventoryModel::CHILDREN_NO;
+}
+
+BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,
+								EDragAndDropType cargo_type,
+								void* cargo_data)
+{
+	//llinfos << "LLFolderBridge::dragOrDrop()" << llendl;
+	BOOL accept = FALSE;
+	switch(cargo_type)
+	{
+		case DAD_TEXTURE:
+		case DAD_SOUND:
+		case DAD_CALLINGCARD:
+		case DAD_LANDMARK:
+		case DAD_SCRIPT:
+		case DAD_OBJECT:
+		case DAD_NOTECARD:
+		case DAD_CLOTHING:
+		case DAD_BODYPART:
+		case DAD_ANIMATION:
+		case DAD_GESTURE:
+		case DAD_LINK:
+			accept = dragItemIntoFolder((LLInventoryItem*)cargo_data,
+										drop);
+			break;
+		case DAD_CATEGORY:
+			if (LLFriendCardsManager::instance().isAnyFriendCategory(mUUID))
+			{
+				accept = FALSE;
+			}
+			else
+			{
+				accept = dragCategoryIntoFolder((LLInventoryCategory*)cargo_data, drop);
+			}
+			break;
+		default:
+			break;
+	}
+	return accept;
+}
+
+LLViewerInventoryCategory* LLFolderBridge::getCategory() const
+{
+	LLViewerInventoryCategory* cat = NULL;
+	LLInventoryModel* model = getInventoryModel();
+	if(model)
+	{
+		cat = (LLViewerInventoryCategory*)model->getCategory(mUUID);
+	}
+	return cat;
+}
+
+
+// static
+void LLFolderBridge::pasteClipboard(void* user_data)
+{
+	LLFolderBridge* self = (LLFolderBridge*)user_data;
+	if(self) self->pasteFromClipboard();
+}
+
+void LLFolderBridge::createNewCategory(void* user_data)
+{
+	LLFolderBridge* bridge = (LLFolderBridge*)user_data;
+	if(!bridge) return;
+	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(bridge->mInventoryPanel.get());
+	if (!panel) return;
+	LLInventoryModel* model = panel->getModel();
+	if(!model) return;
+	LLUUID id;
+	id = model->createNewCategory(bridge->getUUID(),
+								  LLFolderType::FT_NONE,
+								  LLStringUtil::null);
+	model->notifyObservers();
+
+	// At this point, the bridge has probably been deleted, but the
+	// view is still there.
+	panel->setSelection(id, TAKE_FOCUS_YES);
+}
+
+void LLFolderBridge::createNewShirt(void* user_data)
+{
+	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHIRT);
+}
+
+void LLFolderBridge::createNewPants(void* user_data)
+{
+	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_PANTS);
+}
+
+void LLFolderBridge::createNewShoes(void* user_data)
+{
+	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHOES);
+}
+
+void LLFolderBridge::createNewSocks(void* user_data)
+{
+	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SOCKS);
+}
+
+void LLFolderBridge::createNewJacket(void* user_data)
+{
+	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_JACKET);
+}
+
+void LLFolderBridge::createNewSkirt(void* user_data)
+{
+	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIRT);
+}
+
+void LLFolderBridge::createNewGloves(void* user_data)
+{
+	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_GLOVES);
+}
+
+void LLFolderBridge::createNewUndershirt(void* user_data)
+{
+	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERSHIRT);
+}
+
+void LLFolderBridge::createNewUnderpants(void* user_data)
+{
+	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERPANTS);
+}
+
+void LLFolderBridge::createNewShape(void* user_data)
+{
+	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHAPE);
+}
+
+void LLFolderBridge::createNewSkin(void* user_data)
+{
+	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIN);
+}
+
+void LLFolderBridge::createNewHair(void* user_data)
+{
+	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_HAIR);
+}
+
+void LLFolderBridge::createNewEyes(void* user_data)
+{
+	LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_EYES);
+}
+
+// static
+void LLFolderBridge::createWearable(LLFolderBridge* bridge, EWearableType type)
+{
+	if(!bridge) return;
+	LLUUID parent_id = bridge->getUUID();
+	createWearable(parent_id, type);
+}
+
+// Separate function so can be called by global menu as well as right-click
+// menu.
+// static
+void LLFolderBridge::createWearable(const LLUUID &parent_id, EWearableType type)
+{
+	LLWearable* wearable = LLWearableList::instance().createNewWearable(type);
+	LLAssetType::EType asset_type = wearable->getAssetType();
+	LLInventoryType::EType inv_type = LLInventoryType::IT_WEARABLE;
+	create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
+		parent_id, wearable->getTransactionID(), wearable->getName(),
+		wearable->getDescription(), asset_type, inv_type, wearable->getType(),
+		wearable->getPermissions().getMaskNextOwner(),
+		LLPointer<LLInventoryCallback>(NULL));
+}
+
+void LLFolderBridge::modifyOutfit(BOOL append)
+{
+	LLInventoryModel* model = getInventoryModel();
+	if(!model) return;
+	LLViewerInventoryCategory* cat = getCategory();
+	if(!cat) return;
+
+	// BAP - was:
+	// wear_inventory_category_on_avatar( cat, append );
+	LLAppearanceManager::instance().wearInventoryCategory( cat, FALSE, append );
+}
+
+// helper stuff
+bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv* move_inv)
+{
+	LLFloaterOpenObject::LLCatAndWear* cat_and_wear = (LLFloaterOpenObject::LLCatAndWear* )move_inv->mUserData;
+	LLViewerObject* object = gObjectList.findObject(move_inv->mObjectID);
+	S32 option = LLNotification::getSelectedOption(notification, response);
+
+	if(option == 0 && object)
+	{
+		if (cat_and_wear && cat_and_wear->mWear)
+		{
+			InventoryObjectList inventory_objects;
+			object->getInventoryContents(inventory_objects);
+			int contents_count = inventory_objects.size()-1; //subtract one for containing folder
+
+			LLInventoryCopyAndWearObserver* inventoryObserver = new LLInventoryCopyAndWearObserver(cat_and_wear->mCatID, contents_count);
+			gInventory.addObserver(inventoryObserver);
+		}
+
+		two_uuids_list_t::iterator move_it;
+		for (move_it = move_inv->mMoveList.begin();
+			move_it != move_inv->mMoveList.end();
+			++move_it)
+		{
+			object->moveInventory(move_it->first, move_it->second);
+		}
+
+		// update the UI.
+		dialog_refresh_all();
+	}
+
+	if (move_inv->mCallback)
+	{
+		move_inv->mCallback(option, move_inv->mUserData);
+	}
+
+	delete move_inv;
+	return false;
+}
+
+/*
+Next functions intended to reorder items in the inventory folder and save order on server
+Is now used for Favorites folder.
+
+*TODO: refactoring is needed with Favorites Bar functionality. Probably should be moved in LLInventoryModel
+*/
+void saveItemsOrder(LLInventoryModel::item_array_t& items)
+{
+	int sortField = 0;
+
+	// current order is saved by setting incremental values (1, 2, 3, ...) for the sort field
+	for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i)
+	{
+		LLViewerInventoryItem* item = *i;
+
+		item->setSortField(++sortField);
+		item->setComplete(TRUE);
+		item->updateServer(FALSE);
+
+		gInventory.updateItem(item);
+	}
+
+	gInventory.notifyObservers();
+}
+
+LLInventoryModel::item_array_t::iterator findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id)
+{
+	LLInventoryModel::item_array_t::iterator result = items.end();
+
+	for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i)
+	{
+		if ((*i)->getUUID() == id)
+		{
+			result = i;
+			break;
+		}
+	}
+
+	return result;
+}
+
+void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& srcItemId, const LLUUID& destItemId)
+{
+	LLViewerInventoryItem* srcItem = gInventory.getItem(srcItemId);
+	LLViewerInventoryItem* destItem = gInventory.getItem(destItemId);
+
+	items.erase(findItemByUUID(items, srcItem->getUUID()));
+	items.insert(findItemByUUID(items, destItem->getUUID()), srcItem);
+}
+
+BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
+										BOOL drop)
+{
+	LLInventoryModel* model = getInventoryModel();
+	if(!model) return FALSE;
+
+	// cannot drag into library
+	if(!isAgentInventory())
+	{
+		return FALSE;
+	}
+
+	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
+	if(!avatar) return FALSE;
+
+	LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource();
+	BOOL accept = FALSE;
+	LLViewerObject* object = NULL;
+	if(LLToolDragAndDrop::SOURCE_AGENT == source)
+	{
+
+		BOOL is_movable = TRUE;
+		switch( inv_item->getActualType() )
+		{
+		case LLAssetType::AT_CATEGORY:
+			is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType());
+			break;
+		default:
+			break;
+		}
+
+		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+		BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id);
+		const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
+		BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
+		BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
+
+		if(is_movable && move_is_into_trash)
+		{
+			switch(inv_item->getType())
+			{
+			case LLAssetType::AT_CLOTHING:
+			case LLAssetType::AT_BODYPART:
+				is_movable = !gAgentWearables.isWearingItem(inv_item->getUUID());
+				break;
+
+			case LLAssetType::AT_OBJECT:
+				is_movable = !avatar->isWearingAttachment(inv_item->getUUID());
+				break;
+			default:
+				break;
+			}
+		}
+
+		if ( is_movable )
+		{
+			// Don't allow creating duplicates in the Calling Card/Friends
+			// subfolders, see bug EXT-1599. Check is item direct descendent
+			// of target folder and forbid item's movement if it so.
+			// Note: isItemDirectDescendentOfCategory checks if
+			// passed category is in the Calling Card/Friends folder
+			is_movable = ! LLFriendCardsManager::instance()
+				.isObjDirectDescendentOfCategory (inv_item, getCategory());
+		}
+
+		const LLUUID& favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
+		const LLUUID& landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
+		const BOOL folder_allows_reorder = ((mUUID == landmarks_id) || (mUUID == favorites_id));
+	   
+		// we can move item inside a folder only if this folder is Favorites. See EXT-719
+		accept = is_movable && ((mUUID != inv_item->getParentUUID()) || folder_allows_reorder);
+		if(accept && drop)
+		{
+			if (inv_item->getType() == LLAssetType::AT_GESTURE
+				&& LLGestureManager::instance().isGestureActive(inv_item->getUUID()) && move_is_into_trash)
+			{
+				LLGestureManager::instance().deactivateGesture(inv_item->getUUID());
+			}
+			// If an item is being dragged between windows, unselect
+			// everything in the active window so that we don't follow
+			// the selection to its new location (which is very
+			// annoying).
+			if (LLFloaterInventory::getActiveInventory())
+			{
+				LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel();
+				LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
+				if (active_panel && (panel != active_panel))
+				{
+					active_panel->unSelectAll();
+				}
+			}
+
+			// if dragging from/into favorites folder only reorder items
+			if ((mUUID == inv_item->getParentUUID()) && folder_allows_reorder)
+			{
+				LLInventoryModel::cat_array_t cats;
+				LLInventoryModel::item_array_t items;
+				LLIsType is_type(LLAssetType::AT_LANDMARK);
+				model->collectDescendentsIf(mUUID, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type);
+
+				LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
+				LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL;
+				if (itemp)
+				{
+					LLUUID srcItemId = inv_item->getUUID();
+					LLUUID destItemId = itemp->getListener()->getUUID();
+
+					// update order
+					updateItemsOrder(items, srcItemId, destItemId);
+
+					saveItemsOrder(items);
+				}
+			}
+			else if (favorites_id == mUUID) // if target is the favorites folder we use copy
+			{
+				copy_inventory_item(
+					gAgent.getID(),
+					inv_item->getPermissions().getOwner(),
+					inv_item->getUUID(),
+					mUUID,
+					std::string(),
+					LLPointer<LLInventoryCallback>(NULL));
+			}
+			else if (move_is_into_current_outfit || move_is_into_outfit)
+			{
+				// BAP - should skip if dup.
+				if (move_is_into_current_outfit)
+				{
+					LLAppearanceManager::instance().addCOFItemLink(inv_item);
+				}
+				else
+				{
+					LLPointer<LLInventoryCallback> cb = NULL;
+					link_inventory_item(
+						gAgent.getID(),
+						inv_item->getLinkedUUID(),
+						mUUID,
+						inv_item->getName(),
+						LLAssetType::AT_LINK,
+						cb);
+				}
+			}
+			else
+			{
+				// restamp if the move is into the trash.
+				LLInvFVBridge::changeItemParent(
+					model,
+					(LLViewerInventoryItem*)inv_item,
+					mUUID,
+					move_is_into_trash);
+			}
+		}
+	}
+	else if(LLToolDragAndDrop::SOURCE_WORLD == source)
+	{
+		// Make sure the object exists. If we allowed dragging from
+		// anonymous objects, it would be possible to bypass
+		// permissions.
+		object = gObjectList.findObject(inv_item->getParentUUID());
+		if(!object)
+		{
+			llinfos << "Object not found for drop." << llendl;
+			return FALSE;
+		}
+
+		// coming from a task. Need to figure out if the person can
+		// move/copy this item.
+		LLPermissions perm(inv_item->getPermissions());
+		BOOL is_move = FALSE;
+		if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID())
+			&& perm.allowTransferTo(gAgent.getID())))
+//		   || gAgent.isGodlike())
+
+		{
+			accept = TRUE;
+		}
+		else if(object->permYouOwner())
+		{
+			// If the object cannot be copied, but the object the
+			// inventory is owned by the agent, then the item can be
+			// moved from the task to agent inventory.
+			is_move = TRUE;
+			accept = TRUE;
+		}
+		if(drop && accept)
+		{
+			LLMoveInv* move_inv = new LLMoveInv;
+			move_inv->mObjectID = inv_item->getParentUUID();
+			two_uuids_t item_pair(mUUID, inv_item->getUUID());
+			move_inv->mMoveList.push_back(item_pair);
+			move_inv->mCallback = NULL;
+			move_inv->mUserData = NULL;
+			if(is_move)
+			{
+				warn_move_inventory(object, move_inv);
+			}
+			else
+			{
+				LLNotification::Params params("MoveInventoryFromObject");
+				params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv));
+				LLNotifications::instance().forceResponse(params, 0);
+			}
+		}
+
+	}
+	else if(LLToolDragAndDrop::SOURCE_NOTECARD == source)
+	{
+		accept = TRUE;
+		if(drop)
+		{
+			copy_inventory_from_notecard(LLToolDragAndDrop::getInstance()->getObjectID(),
+				LLToolDragAndDrop::getInstance()->getSourceID(), inv_item);
+		}
+	}
+	else if(LLToolDragAndDrop::SOURCE_LIBRARY == source)
+	{
+		LLViewerInventoryItem* item = (LLViewerInventoryItem*)inv_item;
+		if(item && item->isComplete())
+		{
+			accept = TRUE;
+			if(drop)
+			{
+				copy_inventory_item(
+					gAgent.getID(),
+					inv_item->getPermissions().getOwner(),
+					inv_item->getUUID(),
+					mUUID,
+					std::string(),
+					LLPointer<LLInventoryCallback>(NULL));
+			}
+		}
+	}
+	else
+	{
+		llwarns << "unhandled drag source" << llendl;
+	}
+	return accept;
+}
+
+// +=================================================+
+// |        LLScriptBridge (DEPRECTED)               |
+// +=================================================+
+
+LLUIImagePtr LLScriptBridge::getIcon() const
+{
+	return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE);
+}
+
+// +=================================================+
+// |        LLTextureBridge                          |
+// +=================================================+
+
+LLUIImagePtr LLTextureBridge::getIcon() const
+{
+	return get_item_icon(LLAssetType::AT_TEXTURE, mInvType, 0, FALSE);
+}
+
+void LLTextureBridge::openItem()
+{
+	LLViewerInventoryItem* item = getItem();
+
+	if (item)
+	{
+		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
+	}
+}
+
+void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+	lldebugs << "LLTextureBridge::buildContextMenu()" << llendl;
+	std::vector<std::string> items;
+	std::vector<std::string> disabled_items;
+	if(isInTrash())
+	{
+		items.push_back(std::string("Purge Item"));
+		if (!isItemRemovable())
+		{
+			disabled_items.push_back(std::string("Purge Item"));
+		}
+
+		items.push_back(std::string("Restore Item"));
+	}
+	else
+	{
+		items.push_back(std::string("Open"));
+		items.push_back(std::string("Properties"));
+
+		getClipboardEntries(true, items, disabled_items, flags);
+
+		items.push_back(std::string("Texture Separator"));
+		items.push_back(std::string("Save As"));
+	}
+	hide_context_entries(menu, items, disabled_items);	
+}
+
+// virtual
+void LLTextureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+{
+	if ("save_as" == action)
+	{
+		LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES);
+		LLPreviewTexture* preview_texture = LLFloaterReg::findTypedInstance<LLPreviewTexture>("preview_texture", mUUID);
+		if (preview_texture)
+		{
+			preview_texture->openToSave();
+		}
+	}
+	else LLItemBridge::performAction(folder, model, action);
+}
+
+// +=================================================+
+// |        LLSoundBridge                            |
+// +=================================================+
+
+LLUIImagePtr LLSoundBridge::getIcon() const
+{
+	return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0, FALSE);
+}
+
+void LLSoundBridge::openItem()
+{
+	LLViewerInventoryItem* item = getItem();
+
+	if (item)
+	{
+		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
+	}
+/*
+// Changed this back to the way it USED to work:
+// only open the preview dialog through the contextual right-click menu
+// double-click just plays the sound
+
+	LLViewerInventoryItem* item = getItem();
+	if(item)
+	{
+		openSoundPreview((void*)this);
+		//send_uuid_sound_trigger(item->getAssetUUID(), 1.0);
+	}
+*/
+}
+
+void LLSoundBridge::previewItem()
+{
+	LLViewerInventoryItem* item = getItem();
+	if(item)
+	{
+		send_sound_trigger(item->getAssetUUID(), 1.0);
+	}
+}
+
+void LLSoundBridge::openSoundPreview(void* which)
+{
+	LLSoundBridge *me = (LLSoundBridge *)which;
+	LLFloaterReg::showInstance("preview_sound", LLSD(me->mUUID), TAKE_FOCUS_YES);
+}
+
+void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+	lldebugs << "LLSoundBridge::buildContextMenu()" << llendl;
+	std::vector<std::string> items;
+	std::vector<std::string> disabled_items;
+
+	if(isInTrash())
+	{
+		items.push_back(std::string("Purge Item"));
+		if (!isItemRemovable())
+		{
+			disabled_items.push_back(std::string("Purge Item"));
+		}
+
+		items.push_back(std::string("Restore Item"));
+	}
+	else
+	{
+		items.push_back(std::string("Sound Open"));
+		items.push_back(std::string("Properties"));
+
+		getClipboardEntries(true, items, disabled_items, flags);
+	}
+
+	items.push_back(std::string("Sound Separator"));
+	items.push_back(std::string("Sound Play"));
+
+	hide_context_entries(menu, items, disabled_items);
+}
+
+// +=================================================+
+// |        LLLandmarkBridge                         |
+// +=================================================+
+
+LLLandmarkBridge::LLLandmarkBridge(LLInventoryPanel* inventory, const LLUUID& uuid, U32 flags/* = 0x00*/) :
+LLItemBridge(inventory, uuid)
+{
+	mVisited = FALSE;
+	if (flags & LLInventoryItem::II_FLAGS_LANDMARK_VISITED)
+	{
+		mVisited = TRUE;
+	}
+}
+
+LLUIImagePtr LLLandmarkBridge::getIcon() const
+{
+	return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, mVisited, FALSE);
+}
+
+void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+	std::vector<std::string> items;
+	std::vector<std::string> disabled_items;
+
+	lldebugs << "LLLandmarkBridge::buildContextMenu()" << llendl;
+	if(isInTrash())
+	{
+		items.push_back(std::string("Purge Item"));
+		if (!isItemRemovable())
+		{
+			disabled_items.push_back(std::string("Purge Item"));
+		}
+
+		items.push_back(std::string("Restore Item"));
+	}
+	else
+	{
+		items.push_back(std::string("Landmark Open"));
+		items.push_back(std::string("Properties"));
+
+		getClipboardEntries(true, items, disabled_items, flags);
+	}
+
+	items.push_back(std::string("Landmark Separator"));
+	items.push_back(std::string("About Landmark"));
+
+	// Disable "About Landmark" menu item for
+	// multiple landmarks selected. Only one landmark
+	// info panel can be shown at a time.
+	if ((flags & FIRST_SELECTED_ITEM) == 0)
+	{
+		disabled_items.push_back(std::string("About Landmark"));
+	}
+
+	hide_context_entries(menu, items, disabled_items);
+}
+
+// Convenience function for the two functions below.
+void teleport_via_landmark(const LLUUID& asset_id)
+{
+	gAgent.teleportViaLandmark( asset_id );
+
+	// we now automatically track the landmark you're teleporting to
+	// because you'll probably arrive at a telehub instead
+	LLFloaterWorldMap* floater_world_map = LLFloaterWorldMap::getInstance();
+	if( floater_world_map )
+	{
+		floater_world_map->trackLandmark( asset_id );
+	}
+}
+
+// virtual
+void LLLandmarkBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+{
+	if ("teleport" == action)
+	{
+		LLViewerInventoryItem* item = getItem();
+		if(item)
+		{
+			teleport_via_landmark(item->getAssetUUID());
+		}
+	}
+	else if ("about" == action)
+	{
+		LLViewerInventoryItem* item = getItem();
+		if(item)
+		{
+			LLSD key;
+			key["type"] = "landmark";
+			key["id"] = item->getUUID();
+
+			LLSideTray::getInstance()->showPanel("panel_places", key);
+		}
+	}
+	else
+	{
+		LLItemBridge::performAction(folder, model, action);
+	}
+}
+
+static bool open_landmark_callback(const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotification::getSelectedOption(notification, response);
+
+	LLUUID asset_id = notification["payload"]["asset_id"].asUUID();
+	if (option == 0)
+	{
+		teleport_via_landmark(asset_id);
+	}
+
+	return false;
+}
+static LLNotificationFunctorRegistration open_landmark_callback_reg("TeleportFromLandmark", open_landmark_callback);
+
+
+void LLLandmarkBridge::openItem()
+{
+	LLViewerInventoryItem* item = getItem();
+
+	if (item)
+	{
+		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
+	}
+/*
+	LLViewerInventoryItem* item = getItem();
+	if( item )
+	{
+		// Opening (double-clicking) a landmark immediately teleports,
+		// but warns you the first time.
+		// open_landmark(item);
+		LLSD payload;
+		payload["asset_id"] = item->getAssetUUID();
+		LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload);
+	}
+*/
+}
+
+
+// +=================================================+
+// |        LLCallingCardObserver                    |
+// +=================================================+
+void LLCallingCardObserver::changed(U32 mask)
+{
+	mBridgep->refreshFolderViewItem();
+}
+
+// +=================================================+
+// |        LLCallingCardBridge                      |
+// +=================================================+
+
+LLCallingCardBridge::LLCallingCardBridge( LLInventoryPanel* inventory, const LLUUID& uuid ) :
+	LLItemBridge(inventory, uuid)
+{
+	mObserver = new LLCallingCardObserver(this);
+	LLAvatarTracker::instance().addObserver(mObserver);
+}
+
+LLCallingCardBridge::~LLCallingCardBridge()
+{
+	LLAvatarTracker::instance().removeObserver(mObserver);
+	delete mObserver;
+}
+
+void LLCallingCardBridge::refreshFolderViewItem()
+{
+	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
+	LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL;
+	if (itemp)
+	{
+		itemp->refresh();
+	}
+}
+
+// virtual
+void LLCallingCardBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+{
+	if ("begin_im" == action)
+	{
+		LLViewerInventoryItem *item = getItem();
+		if (item && (item->getCreatorUUID() != gAgent.getID()) &&
+			(!item->getCreatorUUID().isNull()))
+		{
+			std::string callingcard_name;
+			gCacheName->getFullName(item->getCreatorUUID(), callingcard_name);
+			LLUUID session_id = gIMMgr->addSession(callingcard_name, IM_NOTHING_SPECIAL, item->getCreatorUUID());
+			if (session_id != LLUUID::null)
+			{
+				LLIMFloater::show(session_id);
+			}
+		}
+	}
+	else if ("lure" == action)
+	{
+		LLViewerInventoryItem *item = getItem();
+		if (item && (item->getCreatorUUID() != gAgent.getID()) &&
+			(!item->getCreatorUUID().isNull()))
+		{
+			LLAvatarActions::offerTeleport(item->getCreatorUUID());
+		}
+	}
+	else LLItemBridge::performAction(folder, model, action);
+}
+
+LLUIImagePtr LLCallingCardBridge::getIcon() const
+{
+	BOOL online = FALSE;
+	LLViewerInventoryItem* item = getItem();
+	if(item)
+	{
+		online = LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID());
+	}
+	return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, online, FALSE);
+}
+
+std::string LLCallingCardBridge::getLabelSuffix() const
+{
+	LLViewerInventoryItem* item = getItem();
+	if( item && LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()) )
+	{
+		return LLItemBridge::getLabelSuffix() + " (online)";
+	}
+	else
+	{
+		return LLItemBridge::getLabelSuffix();
+	}
+}
+
+void LLCallingCardBridge::openItem()
+{
+	LLViewerInventoryItem* item = getItem();
+
+	if (item)
+	{
+		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
+	}
+/*
+	LLViewerInventoryItem* item = getItem();
+	if(item && !item->getCreatorUUID().isNull())
+	{
+		LLAvatarActions::showProfile(item->getCreatorUUID());
+	}
+*/
+}
+
+void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+	lldebugs << "LLCallingCardBridge::buildContextMenu()" << llendl;
+	std::vector<std::string> items;
+	std::vector<std::string> disabled_items;
+
+	if(isInTrash())
+	{
+		items.push_back(std::string("Purge Item"));
+		if (!isItemRemovable())
+		{
+			disabled_items.push_back(std::string("Purge Item"));
+		}
+
+		items.push_back(std::string("Restore Item"));
+	}
+	else
+	{
+		items.push_back(std::string("Open"));
+		items.push_back(std::string("Properties"));
+
+		getClipboardEntries(true, items, disabled_items, flags);
+
+		LLInventoryItem* item = getItem();
+		BOOL good_card = (item
+						  && (LLUUID::null != item->getCreatorUUID())
+						  && (item->getCreatorUUID() != gAgent.getID()));
+		BOOL user_online = (LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()));
+		items.push_back(std::string("Send Instant Message Separator"));
+		items.push_back(std::string("Send Instant Message"));
+		items.push_back(std::string("Offer Teleport..."));
+		items.push_back(std::string("Conference Chat"));
+
+		if (!good_card)
+		{
+			disabled_items.push_back(std::string("Send Instant Message"));
+		}
+		if (!good_card || !user_online)
+		{
+			disabled_items.push_back(std::string("Offer Teleport..."));
+			disabled_items.push_back(std::string("Conference Chat"));
+		}
+	}
+	hide_context_entries(menu, items, disabled_items);
+}
+
+BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
+									 EDragAndDropType cargo_type,
+									 void* cargo_data)
+{
+	LLViewerInventoryItem* item = getItem();
+	BOOL rv = FALSE;
+	if(item)
+	{
+		// check the type
+		switch(cargo_type)
+		{
+		case DAD_TEXTURE:
+		case DAD_SOUND:
+		case DAD_LANDMARK:
+		case DAD_SCRIPT:
+		case DAD_CLOTHING:
+		case DAD_OBJECT:
+		case DAD_NOTECARD:
+		case DAD_BODYPART:
+		case DAD_ANIMATION:
+		case DAD_GESTURE:
+			{
+				LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data;
+				const LLPermissions& perm = inv_item->getPermissions();
+				if(gInventory.getItem(inv_item->getUUID())
+				   && perm.allowOperationBy(PERM_TRANSFER, gAgent.getID()))
+				{
+					rv = TRUE;
+					if(drop)
+					{
+						LLToolDragAndDrop::giveInventory(item->getCreatorUUID(),
+														 (LLInventoryItem*)cargo_data);
+					}
+				}
+				else
+				{
+					// It's not in the user's inventory (it's probably in
+					// an object's contents), so disallow dragging it here.
+					// You can't give something you don't yet have.
+					rv = FALSE;
+				}
+				break;
+			}
+		case DAD_CATEGORY:
+			{
+				LLInventoryCategory* inv_cat = (LLInventoryCategory*)cargo_data;
+				if( gInventory.getCategory( inv_cat->getUUID() ) )
+				{
+					rv = TRUE;
+					if(drop)
+					{
+						LLToolDragAndDrop::giveInventoryCategory(
+							item->getCreatorUUID(),
+							inv_cat);
+					}
+				}
+				else
+				{
+					// It's not in the user's inventory (it's probably in
+					// an object's contents), so disallow dragging it here.
+					// You can't give something you don't yet have.
+					rv = FALSE;
+				}
+				break;
+			}
+		default:
+			break;
+		}
+	}
+	return rv;
+}
+
+BOOL LLCallingCardBridge::removeItem()
+{
+	if (LLFriendCardsManager::instance().isItemInAnyFriendsList(getItem()))
+	{
+		LLAvatarActions::removeFriendDialog(getItem()->getCreatorUUID());
+		return FALSE;
+	}
+	else
+	{
+		return LLItemBridge::removeItem();
+	}
+}
+// +=================================================+
+// |        LLNotecardBridge                         |
+// +=================================================+
+
+LLUIImagePtr LLNotecardBridge::getIcon() const
+{
+	return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE);
+}
+
+void LLNotecardBridge::openItem()
+{
+	LLViewerInventoryItem* item = getItem();
+
+	if (item)
+	{
+		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
+	}
+
+/*
+	LLViewerInventoryItem* item = getItem();
+	if (item)
+	{
+		LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES);
+	}
+*/
+}
+
+
+// +=================================================+
+// |        LLGestureBridge                          |
+// +=================================================+
+
+LLUIImagePtr LLGestureBridge::getIcon() const
+{
+	return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0, FALSE);
+}
+
+LLFontGL::StyleFlags LLGestureBridge::getLabelStyle() const
+{
+	if( LLGestureManager::instance().isGestureActive(mUUID) )
+	{
+		return LLFontGL::BOLD;
+	}
+	else
+	{
+		return LLFontGL::NORMAL;
+	}
+}
+
+std::string LLGestureBridge::getLabelSuffix() const
+{
+	if( LLGestureManager::instance().isGestureActive(mUUID) )
+	{
+		return LLItemBridge::getLabelSuffix() + " (active)";
+	}
+	else
+	{
+		return LLItemBridge::getLabelSuffix();
+	}
+}
+
+// virtual
+void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+{
+	if ("activate" == action)
+	{
+		LLGestureManager::instance().activateGesture(mUUID);
+
+		LLViewerInventoryItem* item = gInventory.getItem(mUUID);
+		if (!item) return;
+
+		// Since we just changed the suffix to indicate (active)
+		// the server doesn't need to know, just the viewer.
+		gInventory.updateItem(item);
+		gInventory.notifyObservers();
+	}
+	else if ("deactivate" == action)
+	{
+		LLGestureManager::instance().deactivateGesture(mUUID);
+
+		LLViewerInventoryItem* item = gInventory.getItem(mUUID);
+		if (!item) return;
+
+		// Since we just changed the suffix to indicate (active)
+		// the server doesn't need to know, just the viewer.
+		gInventory.updateItem(item);
+		gInventory.notifyObservers();
+	}
+	else LLItemBridge::performAction(folder, model, action);
+}
+
+void LLGestureBridge::openItem()
+{
+	LLViewerInventoryItem* item = getItem();
+
+	if (item)
+	{
+		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
+	}
+/*
+	LLViewerInventoryItem* item = getItem();
+	if (item)
+	{
+		LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null);
+		preview->setFocus(TRUE);
+	}
+*/
+}
+
+BOOL LLGestureBridge::removeItem()
+{
+	// Force close the preview window, if it exists
+	LLGestureManager::instance().deactivateGesture(mUUID);
+	return LLItemBridge::removeItem();
+}
+
+void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+	lldebugs << "LLGestureBridge::buildContextMenu()" << llendl;
+	std::vector<std::string> items;
+	std::vector<std::string> disabled_items;
+	if(isInTrash())
+	{
+		items.push_back(std::string("Purge Item"));
+		if (!isItemRemovable())
+		{
+			disabled_items.push_back(std::string("Purge Item"));
+		}
+
+		items.push_back(std::string("Restore Item"));
+	}
+	else
+	{
+		LLInventoryItem* item = getItem();
+		if (item && item->getIsLinkType())
+		{
+			items.push_back(std::string("Find Original"));
+		}
+		items.push_back(std::string("Open"));
+		items.push_back(std::string("Properties"));
+
+		getClipboardEntries(true, items, disabled_items, flags);
+
+		items.push_back(std::string("Gesture Separator"));
+		items.push_back(std::string("Activate"));
+		items.push_back(std::string("Deactivate"));
+	}
+	hide_context_entries(menu, items, disabled_items);
+}
+
+// +=================================================+
+// |        LLAnimationBridge                        |
+// +=================================================+
+
+LLUIImagePtr LLAnimationBridge::getIcon() const
+{
+	return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE);
+}
+
+void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+	std::vector<std::string> items;
+	std::vector<std::string> disabled_items;
+
+	lldebugs << "LLAnimationBridge::buildContextMenu()" << llendl;
+	if(isInTrash())
+	{
+		items.push_back(std::string("Purge Item"));
+		if (!isItemRemovable())
+		{
+			disabled_items.push_back(std::string("Purge Item"));
+		}
+
+		items.push_back(std::string("Restore Item"));
+	}
+	else
+	{
+		items.push_back(std::string("Animation Open"));
+		items.push_back(std::string("Properties"));
+
+		getClipboardEntries(true, items, disabled_items, flags);
+	}
+
+	items.push_back(std::string("Animation Separator"));
+	items.push_back(std::string("Animation Play"));
+	items.push_back(std::string("Animation Audition"));
+
+	hide_context_entries(menu, items, disabled_items);
+
+}
+
+// virtual
+void LLAnimationBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+{
+	if ((action == "playworld") || (action == "playlocal"))
+	{
+		if (getItem())
+		{
+			LLPreviewAnim::e_activation_type activate = LLPreviewAnim::NONE;
+			if ("playworld" == action) activate = LLPreviewAnim::PLAY;
+			if ("playlocal" == action) activate = LLPreviewAnim::AUDITION;
+
+			LLPreviewAnim* preview = LLFloaterReg::showTypedInstance<LLPreviewAnim>("preview_anim", LLSD(mUUID));
+			if (preview)
+			{
+				preview->activate(activate);
+			}
+		}
+	}
+	else
+	{
+		LLItemBridge::performAction(folder, model, action);
+	}
+}
+
+void LLAnimationBridge::openItem()
+{
+	LLViewerInventoryItem* item = getItem();
+
+	if (item)
+	{
+		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
+	}
+/*
+	LLViewerInventoryItem* item = getItem();
+	if (item)
+	{
+		LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES);
+	}
+*/
+}
+
+// +=================================================+
+// |        LLObjectBridge                           |
+// +=================================================+
+
+// static
+LLUUID LLObjectBridge::sContextMenuItemID;
+
+LLObjectBridge::LLObjectBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type, U32 flags) :
+LLItemBridge(inventory, uuid), mInvType(type)
+{
+	mAttachPt = (flags & 0xff); // low bye of inventory flags
+
+	mIsMultiObject = ( flags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) ?  TRUE: FALSE;
+}
+
+BOOL LLObjectBridge::isItemRemovable()
+{
+	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
+	if(!avatar) return FALSE;
+	if(avatar->isWearingAttachment(mUUID)) return FALSE;
+	return LLInvFVBridge::isItemRemovable();
+}
+
+LLUIImagePtr LLObjectBridge::getIcon() const
+{
+	return get_item_icon(LLAssetType::AT_OBJECT, mInvType, mAttachPt, mIsMultiObject );
+}
+
+LLInventoryObject* LLObjectBridge::getObject() const
+{
+	LLInventoryObject* object = NULL;
+	LLInventoryModel* model = getInventoryModel();
+	if(model)
+	{
+		object = (LLInventoryObject*)model->getObject(mUUID);
+	}
+	return object;
+}
+
+// virtual
+void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+{
+	if ("attach" == action)
+	{
+		LLUUID object_id = mUUID;
+		LLViewerInventoryItem* item;
+		item = (LLViewerInventoryItem*)gInventory.getItem(object_id);
+		if(item && gInventory.isObjectDescendentOf(object_id, gInventory.getRootFolderID()))
+		{
+			rez_attachment(item, NULL);
+		}
+		else if(item && item->isComplete())
+		{
+			// must be in library. copy it to our inventory and put it on.
+			LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(0);
+			copy_inventory_item(
+				gAgent.getID(),
+				item->getPermissions().getOwner(),
+				item->getUUID(),
+				LLUUID::null,
+				std::string(),
+				cb);
+		}
+		gFocusMgr.setKeyboardFocus(NULL);
+	}
+	else if ("detach" == action)
+	{
+		LLInventoryItem* item = gInventory.getItem(mUUID);
+		if(item)
+		{
+			gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv);
+			gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
+			gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+			gMessageSystem->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID());
+			gMessageSystem->sendReliable( gAgent.getRegion()->getHost());
+		}
+		// this object might have been selected, so let the selection manager know it's gone now
+		LLViewerObject *found_obj = gObjectList.findObject(item->getLinkedUUID());
+		if (found_obj)
+		{
+			LLSelectMgr::getInstance()->remove(found_obj);
+		}
+	}
+	else LLItemBridge::performAction(folder, model, action);
+}
+
+void LLObjectBridge::openItem()
+{
+	LLViewerInventoryItem* item = getItem();
+
+	if (item)
+	{
+		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
+	}
+
+	LLSD key;
+	key["id"] = mUUID;
+	LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
+
+	// Disable old properties floater; this is replaced by the sidepanel.
+	/*
+	LLFloaterReg::showInstance("properties", mUUID);
+	*/
+}
+
+LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const
+{
+	U8 font = LLFontGL::NORMAL;
+
+	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
+	if( avatar && avatar->isWearingAttachment( mUUID ) )
+	{
+		font |= LLFontGL::BOLD;
+	}
+
+	LLInventoryItem* item = getItem();
+	if (item && item->getIsLinkType())
+	{
+		font |= LLFontGL::ITALIC;
+	}
+
+	return (LLFontGL::StyleFlags)font;
+}
+
+std::string LLObjectBridge::getLabelSuffix() const
+{
+	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
+	if( avatar && avatar->isWearingAttachment( mUUID ) )
+	{
+		std::string attachment_point_name = avatar->getAttachedPointName(mUUID);
+
+		// e.g. "(worn on ...)" / "(attached to ...)"
+		LLStringUtil::format_map_t args;
+		args["[ATTACHMENT_POINT]"] =  attachment_point_name.c_str();
+		return LLItemBridge::getLabelSuffix() + LLTrans::getString("WornOnAttachmentPoint", args);
+	}
+	else
+	{
+		return LLItemBridge::getLabelSuffix();
+	}
+}
+
+void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment)
+{
+	LLSD payload;
+	payload["item_id"] = item->getLinkedUUID(); // Wear the base object in case this is a link.
+
+	S32 attach_pt = 0;
+	if (gAgent.getAvatarObject() && attachment)
+	{
+		for (LLVOAvatar::attachment_map_t::iterator iter = gAgent.getAvatarObject()->mAttachmentPoints.begin();
+			 iter != gAgent.getAvatarObject()->mAttachmentPoints.end(); ++iter)
+		{
+			if (iter->second == attachment)
+			{
+				attach_pt = iter->first;
+				break;
+			}
+		}
+	}
+
+	payload["attachment_point"] = attach_pt;
+
+#if !ENABLE_MULTIATTACHMENTS
+	if (attachment && attachment->getNumObjects() > 0)
+	{
+		LLNotifications::instance().add("ReplaceAttachment", LLSD(), payload, confirm_replace_attachment_rez);
+	}
+	else
+#endif
+	{
+		LLNotifications::instance().forceResponse(LLNotification::Params("ReplaceAttachment").payload(payload), 0/*YES*/);
+	}
+}
+
+bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response)
+{
+	LLVOAvatar *avatarp = gAgent.getAvatarObject();
+
+	if (!avatarp->canAttachMoreObjects())
+	{
+		LLSD args;
+		args["MAX_ATTACHMENTS"] = llformat("%d", MAX_AGENT_ATTACHMENTS);
+		LLNotifications::instance().add("MaxAttachmentsOnOutfit", args);
+		return false;
+	}
+
+	S32 option = LLNotification::getSelectedOption(notification, response);
+	if (option == 0/*YES*/)
+	{
+		LLViewerInventoryItem* itemp = gInventory.getItem(notification["payload"]["item_id"].asUUID());
+
+		if (itemp)
+		{
+			LLMessageSystem* msg = gMessageSystem;
+			msg->newMessageFast(_PREHASH_RezSingleAttachmentFromInv);
+			msg->nextBlockFast(_PREHASH_AgentData);
+			msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+			msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+			msg->nextBlockFast(_PREHASH_ObjectData);
+			msg->addUUIDFast(_PREHASH_ItemID, itemp->getUUID());
+			msg->addUUIDFast(_PREHASH_OwnerID, itemp->getPermissions().getOwner());
+			U8 attachment_pt = notification["payload"]["attachment_point"].asInteger();
+#if ENABLE_MULTIATTACHMENTS
+			attachment_pt |= ATTACHMENT_ADD;
+#endif
+			msg->addU8Fast(_PREHASH_AttachmentPt, attachment_pt);
+			pack_permissions_slam(msg, itemp->getFlags(), itemp->getPermissions());
+			msg->addStringFast(_PREHASH_Name, itemp->getName());
+			msg->addStringFast(_PREHASH_Description, itemp->getDescription());
+			msg->sendReliable(gAgent.getRegion()->getHost());
+		}
+	}
+	return false;
+}
+static LLNotificationFunctorRegistration confirm_replace_attachment_rez_reg("ReplaceAttachment", confirm_replace_attachment_rez);
+
+void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+	std::vector<std::string> items;
+	std::vector<std::string> disabled_items;
+	if(isInTrash())
+	{
+		items.push_back(std::string("Purge Item"));
+		if (!isItemRemovable())
+		{
+			disabled_items.push_back(std::string("Purge Item"));
+		}
+
+		items.push_back(std::string("Restore Item"));
+	}
+	else
+	{
+		LLInventoryItem* item = getItem();
+		if (item && item->getIsLinkType())
+		{
+			items.push_back(std::string("Find Original"));
+		}
+
+		items.push_back(std::string("Properties"));
+
+		getClipboardEntries(true, items, disabled_items, flags);
+
+		LLObjectBridge::sContextMenuItemID = mUUID;
+
+		if(item)
+		{
+			LLVOAvatarSelf* avatarp = gAgent.getAvatarObject();
+			if( !avatarp )
+			{
+				return;
+			}
+
+			if( avatarp->isWearingAttachment( mUUID ) )
+			{
+				items.push_back(std::string("Detach From Yourself"));
+			}
+			else
+			if( !isInTrash() && !isLinkedObjectInTrash() )
+			{
+				items.push_back(std::string("Attach Separator"));
+				items.push_back(std::string("Object Wear"));
+				items.push_back(std::string("Attach To"));
+				items.push_back(std::string("Attach To HUD"));
+				// commented out for DEV-32347
+				//items.push_back(std::string("Restore to Last Position"));
+
+				if (!avatarp->canAttachMoreObjects())
+				{
+					disabled_items.push_back(std::string("Object Wear"));
+					disabled_items.push_back(std::string("Attach To"));
+					disabled_items.push_back(std::string("Attach To HUD"));
+				}
+				LLMenuGL* attach_menu = menu.findChildMenuByName("Attach To", TRUE);
+				LLMenuGL* attach_hud_menu = menu.findChildMenuByName("Attach To HUD", TRUE);
+				LLVOAvatar *avatarp = gAgent.getAvatarObject();
+				if (attach_menu
+					&& (attach_menu->getChildCount() == 0)
+					&& attach_hud_menu
+					&& (attach_hud_menu->getChildCount() == 0)
+					&& avatarp)
+				{
+					for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin();
+						 iter != avatarp->mAttachmentPoints.end(); )
+					{
+						LLVOAvatar::attachment_map_t::iterator curiter = iter++;
+						LLViewerJointAttachment* attachment = curiter->second;
+						LLMenuItemCallGL::Params p;
+						std::string submenu_name = attachment->getName();
+						if (LLTrans::getString(submenu_name) != "")
+						{
+						    p.name = (" ")+LLTrans::getString(submenu_name)+" ";
+						}
+						else
+						{
+							p.name = submenu_name;
+						}
+						LLSD cbparams;
+						cbparams["index"] = curiter->first;
+						cbparams["label"] = attachment->getName();
+						p.on_click.function_name = "Inventory.AttachObject";
+						p.on_click.parameter = LLSD(attachment->getName());
+						p.on_enable.function_name = "Attachment.Label";
+						p.on_enable.parameter = cbparams;
+						LLView* parent = attachment->getIsHUDAttachment() ? attach_hud_menu : attach_menu;
+						LLUICtrlFactory::create<LLMenuItemCallGL>(p, parent);
+					}
+				}
+			}
+		}
+	}
+	hide_context_entries(menu, items, disabled_items);
+}
+
+BOOL LLObjectBridge::renameItem(const std::string& new_name)
+{
+	if(!isItemRenameable())
+		return FALSE;
+	LLPreview::dirty(mUUID);
+	LLInventoryModel* model = getInventoryModel();
+	if(!model)
+		return FALSE;
+	LLViewerInventoryItem* item = getItem();
+	if(item && (item->getName() != new_name))
+	{
+		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+		new_item->rename(new_name);
+		buildDisplayName(new_item, mDisplayName);
+		new_item->updateServer(FALSE);
+		model->updateItem(new_item);
+
+		model->notifyObservers();
+
+		LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
+		if( avatar )
+		{
+			LLViewerObject* obj = avatar->getWornAttachment( item->getUUID() );
+			if( obj )
+			{
+				LLSelectMgr::getInstance()->deselectAll();
+				LLSelectMgr::getInstance()->addAsIndividual( obj, SELECT_ALL_TES, FALSE );
+				LLSelectMgr::getInstance()->selectionSetObjectName( new_name );
+				LLSelectMgr::getInstance()->deselectAll();
+			}
+		}
+	}
+	// return FALSE because we either notified observers (& therefore
+	// rebuilt) or we didn't update.
+	return FALSE;
+}
+
+// +=================================================+
+// |        LLLSLTextBridge                          |
+// +=================================================+
+
+LLUIImagePtr LLLSLTextBridge::getIcon() const
+{
+	return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE);
+}
+
+void LLLSLTextBridge::openItem()
+{
+	LLViewerInventoryItem* item = getItem();
+
+	if (item)
+	{
+		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
+	}
+	/*
+	LLViewerInventoryItem* item = getItem();
+	if (item)
+	{
+		LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES);
+	}
+	*/
+}
+
+// +=================================================+
+// |        LLWearableBridge                         |
+// +=================================================+
+
+// *NOTE: hack to get from avatar inventory to avatar
+void wear_inventory_item_on_avatar( LLInventoryItem* item )
+{
+	if(item)
+	{
+		lldebugs << "wear_inventory_item_on_avatar( " << item->getName()
+				 << " )" << llendl;
+
+		LLAppearanceManager::instance().addCOFItemLink(item);
+	}
+}
+
+void wear_add_inventory_item_on_avatar( LLInventoryItem* item )
+{
+	if(item)
+	{
+		lldebugs << "wear_add_inventory_item_on_avatar( " << item->getName()
+				 << " )" << llendl;
+
+		LLWearableList::instance().getAsset(item->getAssetUUID(),
+							   item->getName(),
+							   item->getType(),
+							   LLWearableBridge::onWearAddOnAvatarArrived,
+							   new LLUUID(item->getUUID()));
+	}
+}
+
+void remove_inventory_category_from_avatar( LLInventoryCategory* category )
+{
+	if(!category) return;
+	lldebugs << "remove_inventory_category_from_avatar( " << category->getName()
+			 << " )" << llendl;
+
+
+	if( gFloaterCustomize )
+	{
+		gFloaterCustomize->askToSaveIfDirty(
+			boost::bind(remove_inventory_category_from_avatar_step2, _1, category->getUUID()));
+	}
+	else
+	{
+		remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() );
+	}
+}
+
+struct OnRemoveStruct
+{
+	LLUUID mUUID;
+	OnRemoveStruct(const LLUUID& uuid):
+		mUUID(uuid)
+	{
+	}
+};
+
+void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id)
+{
+
+	// Find all the wearables that are in the category's subtree.
+	lldebugs << "remove_inventory_category_from_avatar_step2()" << llendl;
+	if(proceed)
+	{
+		LLInventoryModel::cat_array_t cat_array;
+		LLInventoryModel::item_array_t item_array;
+		LLFindWearables is_wearable;
+		gInventory.collectDescendentsIf(category_id,
+										cat_array,
+										item_array,
+										LLInventoryModel::EXCLUDE_TRASH,
+										is_wearable);
+		S32 i;
+		S32 wearable_count = item_array.count();
+
+		LLInventoryModel::cat_array_t	obj_cat_array;
+		LLInventoryModel::item_array_t	obj_item_array;
+		LLIsType is_object( LLAssetType::AT_OBJECT );
+		gInventory.collectDescendentsIf(category_id,
+										obj_cat_array,
+										obj_item_array,
+										LLInventoryModel::EXCLUDE_TRASH,
+										is_object);
+		S32 obj_count = obj_item_array.count();
+
+		// Find all gestures in this folder
+		LLInventoryModel::cat_array_t	gest_cat_array;
+		LLInventoryModel::item_array_t	gest_item_array;
+		LLIsType is_gesture( LLAssetType::AT_GESTURE );
+		gInventory.collectDescendentsIf(category_id,
+										gest_cat_array,
+										gest_item_array,
+										LLInventoryModel::EXCLUDE_TRASH,
+										is_gesture);
+		S32 gest_count = gest_item_array.count();
+
+		if (wearable_count > 0)	//Loop through wearables.  If worn, remove.
+		{
+			for(i = 0; i  < wearable_count; ++i)
+			{
+				if( gAgentWearables.isWearingItem (item_array.get(i)->getUUID()) )
+				{
+					LLWearableList::instance().getAsset(item_array.get(i)->getAssetUUID(),
+														item_array.get(i)->getName(),
+														item_array.get(i)->getType(),
+														LLWearableBridge::onRemoveFromAvatarArrived,
+														new OnRemoveStruct(item_array.get(i)->getUUID()));
+
+				}
+			}
+		}
+
+
+		if (obj_count > 0)
+		{
+			for(i = 0; i  < obj_count; ++i)
+			{
+				gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv);
+				gMessageSystem->nextBlockFast(_PREHASH_ObjectData );
+				gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+				gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item_array.get(i)->getUUID() );
+
+				gMessageSystem->sendReliable( gAgent.getRegion()->getHost() );
+
+				// this object might have been selected, so let the selection manager know it's gone now
+				LLViewerObject *found_obj = gObjectList.findObject( obj_item_array.get(i)->getUUID());
+				if (found_obj)
+				{
+					LLSelectMgr::getInstance()->remove(found_obj);
+				}
+			}
+		}
+
+		if (gest_count > 0)
+		{
+			for(i = 0; i  < gest_count; ++i)
+			{
+				if ( LLGestureManager::instance().isGestureActive( gest_item_array.get(i)->getUUID()) )
+				{
+					LLGestureManager::instance().deactivateGesture( gest_item_array.get(i)->getUUID() );
+					gInventory.updateItem( gest_item_array.get(i) );
+					gInventory.notifyObservers();
+				}
+
+			}
+		}
+	}
+}
+
+BOOL LLWearableBridge::renameItem(const std::string& new_name)
+{
+	if( gAgentWearables.isWearingItem( mUUID ) )
+	{
+		gAgentWearables.setWearableName( mUUID, new_name );
+	}
+	return LLItemBridge::renameItem(new_name);
+}
+
+BOOL LLWearableBridge::isItemRemovable()
+{
+	if (gAgentWearables.isWearingItem(mUUID)) return FALSE;
+	return LLInvFVBridge::isItemRemovable();
+}
+
+std::string LLWearableBridge::getLabelSuffix() const
+{
+	if( gAgentWearables.isWearingItem( mUUID ) )
+	{
+		// e.g. "(worn)" 
+		return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn");
+	}
+	else
+	{
+		return LLItemBridge::getLabelSuffix();
+	}
+}
+
+LLUIImagePtr LLWearableBridge::getIcon() const
+{
+	return get_item_icon(mAssetType, mInvType, mWearableType, FALSE);
+}
+
+// virtual
+void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+{
+	if ("wear" == action)
+	{
+		wearOnAvatar();
+	}
+	else if ("wear_add" == action)
+	{
+		wearAddOnAvatar();
+	}
+	else if ("edit" == action)
+	{
+		editOnAvatar();
+		return;
+	}
+	else if ("take_off" == action)
+	{
+		if(gAgentWearables.isWearingItem(mUUID))
+		{
+			LLViewerInventoryItem* item = getItem();
+			if (item)
+			{
+				LLWearableList::instance().getAsset(item->getAssetUUID(),
+													item->getName(),
+													item->getType(),
+													LLWearableBridge::onRemoveFromAvatarArrived,
+													new OnRemoveStruct(mUUID));
+			}
+		}
+	}
+	else LLItemBridge::performAction(folder, model, action);
+}
+
+void LLWearableBridge::openItem()
+{
+	LLViewerInventoryItem* item = getItem();
+
+	if (item)
+	{
+		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
+	}
+	/*
+	if( isInTrash() )
+	{
+		LLNotifications::instance().add("CannotWearTrash");
+	}
+	else if(isAgentInventory())
+	{
+		if( !gAgentWearables.isWearingItem( mUUID ) )
+		{
+			wearOnAvatar();
+		}
+	}
+	else
+	{
+		// must be in the inventory library. copy it to our inventory
+		// and put it on right away.
+		LLViewerInventoryItem* item = getItem();
+		if(item && item->isComplete())
+		{
+			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
+			copy_inventory_item(
+				gAgent.getID(),
+				item->getPermissions().getOwner(),
+				item->getUUID(),
+				LLUUID::null,
+				std::string(),
+				cb);
+		}
+		else if(item)
+		{
+			// *TODO: We should fetch the item details, and then do
+			// the operation above.
+			LLNotifications::instance().add("CannotWearInfoNotComplete");
+		}
+	}
+	*/
+}
+
+void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+	lldebugs << "LLWearableBridge::buildContextMenu()" << llendl;
+	std::vector<std::string> items;
+	std::vector<std::string> disabled_items;
+	if(isInTrash())
+	{
+		items.push_back(std::string("Purge Item"));
+		if (!isItemRemovable())
+		{
+			disabled_items.push_back(std::string("Purge Item"));
+		}
+
+		items.push_back(std::string("Restore Item"));
+	}
+	else
+	{	// FWIW, it looks like SUPPRESS_OPEN_ITEM is not set anywhere
+		BOOL no_open = ((flags & SUPPRESS_OPEN_ITEM) == SUPPRESS_OPEN_ITEM);
+
+		// If we have clothing, don't add "Open" as it's the same action as "Wear"   SL-18976
+		LLViewerInventoryItem* item = getItem();
+		if( !no_open && item )
+		{
+			no_open = (item->getType() == LLAssetType::AT_CLOTHING) ||
+					  (item->getType() == LLAssetType::AT_BODYPART);
+		}
+		if (!no_open)
+		{
+			items.push_back(std::string("Open"));
+		}
+
+		if (item && item->getIsLinkType())
+		{
+			items.push_back(std::string("Find Original"));
+		}
+
+		items.push_back(std::string("Properties"));
+
+		getClipboardEntries(true, items, disabled_items, flags);
+
+		items.push_back(std::string("Wearable Separator"));
+
+		items.push_back(std::string("Wearable Wear"));
+		items.push_back(std::string("Wearable Add"));
+		items.push_back(std::string("Wearable Edit"));
+
+		if ((flags & FIRST_SELECTED_ITEM) == 0)
+		{
+			disabled_items.push_back(std::string("Wearable Edit"));
+		}
+		// Don't allow items to be worn if their baseobj is in the trash.
+		if (isLinkedObjectInTrash())
+		{
+			disabled_items.push_back(std::string("Wearable Wear"));
+			disabled_items.push_back(std::string("Wearable Add"));
+			disabled_items.push_back(std::string("Wearable Edit"));
+		}
+
+		// Disable wear and take off based on whether the item is worn.
+		if(item)
+		{
+			switch (item->getType())
+			{
+				case LLAssetType::AT_CLOTHING:
+					items.push_back(std::string("Take Off"));
+				case LLAssetType::AT_BODYPART:
+					if (gAgentWearables.isWearingItem(item->getUUID()))
+					{
+						disabled_items.push_back(std::string("Wearable Wear"));
+						disabled_items.push_back(std::string("Wearable Add"));
+					}
+					else
+					{
+						disabled_items.push_back(std::string("Take Off"));
+					}
+					break;
+				default:
+					break;
+			}
+		}
+	}
+	hide_context_entries(menu, items, disabled_items);
+}
+
+// Called from menus
+// static
+BOOL LLWearableBridge::canWearOnAvatar(void* user_data)
+{
+	LLWearableBridge* self = (LLWearableBridge*)user_data;
+	if(!self) return FALSE;
+	if(!self->isAgentInventory())
+	{
+		LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem();
+		if(!item || !item->isComplete()) return FALSE;
+	}
+	return (!gAgentWearables.isWearingItem(self->mUUID));
+}
+
+// Called from menus
+// static
+void LLWearableBridge::onWearOnAvatar(void* user_data)
+{
+	LLWearableBridge* self = (LLWearableBridge*)user_data;
+	if(!self) return;
+	self->wearOnAvatar();
+}
+
+void LLWearableBridge::wearOnAvatar()
+{
+	// Don't wear anything until initial wearables are loaded, can
+	// destroy clothing items.
+	if (!gAgentWearables.areWearablesLoaded())
+	{
+		LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
+		return;
+	}
+
+	LLViewerInventoryItem* item = getItem();
+	if(item)
+	{
+		if(!isAgentInventory())
+		{
+			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
+			copy_inventory_item(
+				gAgent.getID(),
+				item->getPermissions().getOwner(),
+				item->getUUID(),
+				LLUUID::null,
+				std::string(),
+				cb);
+		}
+		else
+		{
+			wear_inventory_item_on_avatar(item);
+		}
+	}
+}
+
+void LLWearableBridge::wearAddOnAvatar()
+{
+	// Don't wear anything until initial wearables are loaded, can
+	// destroy clothing items.
+	if (!gAgentWearables.areWearablesLoaded())
+	{
+		LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
+		return;
+	}
+
+	LLViewerInventoryItem* item = getItem();
+	if(item)
+	{
+		if(!isAgentInventory())
+		{
+			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
+			copy_inventory_item(
+				gAgent.getID(),
+				item->getPermissions().getOwner(),
+				item->getUUID(),
+				LLUUID::null,
+				std::string(),
+				cb);
+		}
+		else
+		{
+			wear_add_inventory_item_on_avatar(item);
+		}
+	}
+}
+
+// static
+void LLWearableBridge::onWearOnAvatarArrived( LLWearable* wearable, void* userdata )
+{
+	LLUUID* item_id = (LLUUID*) userdata;
+	if(wearable)
+	{
+		LLViewerInventoryItem* item = NULL;
+		item = (LLViewerInventoryItem*)gInventory.getItem(*item_id);
+		if(item)
+		{
+			if(item->getAssetUUID() == wearable->getAssetID())
+			{
+				gAgentWearables.setWearableItem(item, wearable);
+				gInventory.notifyObservers();
+				//self->getFolderItem()->refreshFromRoot();
+			}
+			else
+			{
+				llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl;
+			}
+		}
+	}
+	delete item_id;
+}
+
+// static
+// BAP remove the "add" code path once everything is fully COF-ified.
+void LLWearableBridge::onWearAddOnAvatarArrived( LLWearable* wearable, void* userdata )
+{
+	LLUUID* item_id = (LLUUID*) userdata;
+	if(wearable)
+	{
+		LLViewerInventoryItem* item = NULL;
+		item = (LLViewerInventoryItem*)gInventory.getItem(*item_id);
+		if(item)
+		{
+			if(item->getAssetUUID() == wearable->getAssetID())
+			{
+				bool do_append = true;
+				gAgentWearables.setWearableItem(item, wearable, do_append);
+				gInventory.notifyObservers();
+				//self->getFolderItem()->refreshFromRoot();
+			}
+			else
+			{
+				llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl;
+			}
+		}
+	}
+	delete item_id;
+}
+
+// static
+BOOL LLWearableBridge::canEditOnAvatar(void* user_data)
+{
+	LLWearableBridge* self = (LLWearableBridge*)user_data;
+	if(!self) return FALSE;
+
+	return (gAgentWearables.isWearingItem(self->mUUID));
+}
+
+// static
+void LLWearableBridge::onEditOnAvatar(void* user_data)
+{
+	LLWearableBridge* self = (LLWearableBridge*)user_data;
+	if(self)
+	{
+		self->editOnAvatar();
+	}
+}
+
+void LLWearableBridge::editOnAvatar()
+{
+	const LLWearable* wearable = gAgentWearables.getWearableFromItemID(mUUID);
+	if( wearable )
+	{
+		// Set the tab to the right wearable.
+		if (gFloaterCustomize)
+			gFloaterCustomize->setCurrentWearableType( wearable->getType() );
+
+		if( CAMERA_MODE_CUSTOMIZE_AVATAR != gAgent.getCameraMode() )
+		{
+			// Start Avatar Customization
+			gAgent.changeCameraToCustomizeAvatar();
+		}
+	}
+}
+
+// static
+BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data)
+{
+	LLWearableBridge* self = (LLWearableBridge*)user_data;
+	if( self && (LLAssetType::AT_BODYPART != self->mAssetType) )
+	{
+		return gAgentWearables.isWearingItem( self->mUUID );
+	}
+	return FALSE;
+}
+
+// static
+void LLWearableBridge::onRemoveFromAvatar(void* user_data)
+{
+	LLWearableBridge* self = (LLWearableBridge*)user_data;
+	if(!self) return;
+	if(gAgentWearables.isWearingItem(self->mUUID))
+	{
+		LLViewerInventoryItem* item = self->getItem();
+		if (item)
+		{
+			LLUUID parent_id = item->getParentUUID();
+			LLWearableList::instance().getAsset(item->getAssetUUID(),
+												item->getName(),
+												item->getType(),
+												onRemoveFromAvatarArrived,
+												new OnRemoveStruct(LLUUID(self->mUUID)));
+		}
+	}
+}
+
+// static
+void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
+												 void* userdata)
+{
+	OnRemoveStruct *on_remove_struct = (OnRemoveStruct*) userdata;
+	const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID);
+	if(wearable)
+	{
+		if( gAgentWearables.isWearingItem( item_id ) )
+		{
+			EWearableType type = wearable->getType();
+
+			if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR || type==WT_EYES ) ) //&&
+				//!((!gAgent.isTeen()) && ( type==WT_UNDERPANTS || type==WT_UNDERSHIRT )) )
+			{
+				// MULTI_WEARABLE: FIXME HACK - always remove all
+				bool do_remove_all = false;
+				gAgentWearables.removeWearable( type, do_remove_all, 0 );
+			}
+		}
+	}
+
+	// Find and remove this item from the COF.
+	LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::instance().getCOF());
+	llassert(items.size() == 1); // Should always have one and only one item linked to this in the COF.
+	for (LLInventoryModel::item_array_t::const_iterator iter = items.begin();
+		 iter != items.end();
+		 ++iter)
+	{
+		const LLViewerInventoryItem *linked_item = (*iter);
+		const LLUUID &item_id = linked_item->getUUID();
+		gInventory.purgeObject(item_id);
+	}
+	gInventory.notifyObservers();
+
+	delete on_remove_struct;
+}
+
+LLInvFVBridgeAction* LLInvFVBridgeAction::createAction(LLAssetType::EType asset_type,
+													   const LLUUID& uuid,LLInventoryModel* model)
+{
+	LLInvFVBridgeAction* action = NULL;
+	switch(asset_type)
+	{
+	case LLAssetType::AT_TEXTURE:
+		action = new LLTextureBridgeAction(uuid,model);
+		break;
+
+	case LLAssetType::AT_SOUND:
+		action = new LLSoundBridgeAction(uuid,model);
+		break;
+
+	case LLAssetType::AT_LANDMARK:
+		action = new LLLandmarkBridgeAction(uuid,model);
+		break;
+
+	case LLAssetType::AT_CALLINGCARD:
+		action = new LLCallingCardBridgeAction(uuid,model);
+		break;
+
+	case LLAssetType::AT_OBJECT:
+		action = new LLObjectBridgeAction(uuid,model);
+		break;
+
+	case LLAssetType::AT_NOTECARD:
+		action = new LLNotecardBridgeAction(uuid,model);
+		break;
+
+	case LLAssetType::AT_ANIMATION:
+		action = new LLAnimationBridgeAction(uuid,model);
+		break;
+
+	case LLAssetType::AT_GESTURE:
+		action = new LLGestureBridgeAction(uuid,model);
+		break;
+
+	case LLAssetType::AT_LSL_TEXT:
+		action = new LLLSLTextBridgeAction(uuid,model);
+		break;
+
+	case LLAssetType::AT_CLOTHING:
+	case LLAssetType::AT_BODYPART:
+		action = new LLWearableBridgeAction(uuid,model);
+
+		break;
+
+	default:
+		break;
+	}
+	return action;
+}
+
+//static
+void LLInvFVBridgeAction::doAction(LLAssetType::EType asset_type,
+								   const LLUUID& uuid,LLInventoryModel* model)
+{
+	LLInvFVBridgeAction* action = createAction(asset_type,uuid,model);
+	if(action)
+	{
+		action->doIt();
+		delete action;
+	}
+}
+
+//static
+void LLInvFVBridgeAction::doAction(const LLUUID& uuid, LLInventoryModel* model)
+{
+	LLAssetType::EType asset_type = model->getItem(uuid)->getType();
+	LLInvFVBridgeAction* action = createAction(asset_type,uuid,model);
+	if(action)
+	{
+		action->doIt();
+		delete action;
+	}
+}
+
+LLViewerInventoryItem* LLInvFVBridgeAction::getItem() const
+{
+	if(mModel)
+		return (LLViewerInventoryItem*)mModel->getItem(mUUID);
+	return NULL;
+}
+
+//virtual
+void	LLTextureBridgeAction::doIt()
+{
+	if (getItem())
+	{
+		LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES);
+	}
+
+	LLInvFVBridgeAction::doIt();
+}
+
+//virtual
+void	LLSoundBridgeAction::doIt()
+{
+	LLViewerInventoryItem* item = getItem();
+	if(item)
+	{
+		LLFloaterReg::showInstance("preview_sound", LLSD(mUUID), TAKE_FOCUS_YES);
+	}
+
+	LLInvFVBridgeAction::doIt();
+}
+
+
+//virtual
+void	LLLandmarkBridgeAction::doIt()
+{
+	LLViewerInventoryItem* item = getItem();
+	if( item )
+	{
+		// Opening (double-clicking) a landmark immediately teleports,
+		// but warns you the first time.
+		LLSD payload;
+		payload["asset_id"] = item->getAssetUUID();
+		LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload);
+	}
+
+	LLInvFVBridgeAction::doIt();
+}
+
+
+//virtual
+void	LLCallingCardBridgeAction::doIt()
+{
+	LLViewerInventoryItem* item = getItem();
+	if(item && item->getCreatorUUID().notNull())
+	{
+		LLAvatarActions::showProfile(item->getCreatorUUID());
+	}
+
+	LLInvFVBridgeAction::doIt();
+}
+
+//virtual
+void
+LLNotecardBridgeAction::doIt()
+{
+	LLViewerInventoryItem* item = getItem();
+	if (item)
+	{
+		LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES);
+	}
+
+	LLInvFVBridgeAction::doIt();
+}
+
+//virtual
+void	LLGestureBridgeAction::doIt()
+{
+	LLViewerInventoryItem* item = getItem();
+	if (item)
+	{
+		LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null);
+		preview->setFocus(TRUE);
+	}
+
+	LLInvFVBridgeAction::doIt();
+}
+
+//virtual
+void	LLAnimationBridgeAction::doIt()
+{
+	LLViewerInventoryItem* item = getItem();
+	if (item)
+	{
+		LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES);
+	}
+
+	LLInvFVBridgeAction::doIt();
+}
+
+
+//virtual
+void	LLObjectBridgeAction::doIt()
+{
+	LLFloaterReg::showInstance("properties", mUUID);
+
+	LLInvFVBridgeAction::doIt();
+}
+
+
+//virtual
+void	LLLSLTextBridgeAction::doIt()
+{
+	LLViewerInventoryItem* item = getItem();
+	if (item)
+	{
+		LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES);
+	}
+
+	LLInvFVBridgeAction::doIt();
+}
+
+
+BOOL LLWearableBridgeAction::isInTrash() const
+{
+	if(!mModel) return FALSE;
+	const LLUUID trash_id = mModel->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+	return mModel->isObjectDescendentOf(mUUID, trash_id);
+}
+
+BOOL LLWearableBridgeAction::isAgentInventory() const
+{
+	if(!mModel) return FALSE;
+	if(gInventory.getRootFolderID() == mUUID) return TRUE;
+	return mModel->isObjectDescendentOf(mUUID, gInventory.getRootFolderID());
+}
+
+void LLWearableBridgeAction::wearOnAvatar()
+{
+	// Don't wear anything until initial wearables are loaded, can
+	// destroy clothing items.
+	if (!gAgentWearables.areWearablesLoaded())
+	{
+		LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
+		return;
+	}
+
+	LLViewerInventoryItem* item = getItem();
+	if(item)
+	{
+		if(!isAgentInventory())
+		{
+			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
+			copy_inventory_item(
+				gAgent.getID(),
+				item->getPermissions().getOwner(),
+				item->getUUID(),
+				LLUUID::null,
+				std::string(),
+				cb);
+		}
+		else
+		{
+			wear_inventory_item_on_avatar(item);
+		}
+	}
+}
+
+//virtual
+void LLWearableBridgeAction::doIt()
+{
+	if(isInTrash())
+	{
+		LLNotifications::instance().add("CannotWearTrash");
+	}
+	else if(isAgentInventory())
+	{
+		if(!gAgentWearables.isWearingItem(mUUID))
+		{
+			wearOnAvatar();
+		}
+	}
+	else
+	{
+		// must be in the inventory library. copy it to our inventory
+		// and put it on right away.
+		LLViewerInventoryItem* item = getItem();
+		if(item && item->isComplete())
+		{
+			LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
+			copy_inventory_item(
+				gAgent.getID(),
+				item->getPermissions().getOwner(),
+				item->getUUID(),
+				LLUUID::null,
+				std::string(),
+				cb);
+		}
+		else if(item)
+		{
+			// *TODO: We should fetch the item details, and then do
+			// the operation above.
+			LLNotifications::instance().add("CannotWearInfoNotComplete");
+		}
+	}
+
+	LLInvFVBridgeAction::doIt();
+}
+
+// +=================================================+
+// |        LLLinkItemBridge                         |
+// +=================================================+
+// For broken links
+
+std::string LLLinkItemBridge::sPrefix("Link: ");
+
+
+LLUIImagePtr LLLinkItemBridge::getIcon() const
+{
+	if (LLViewerInventoryItem *item = getItem())
+	{
+		return get_item_icon(item->getActualType(), LLInventoryType::IT_NONE, 0, FALSE);
+	}
+	return get_item_icon(LLAssetType::AT_LINK, LLInventoryType::IT_NONE, 0, FALSE);
+}
+
+void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+	// *TODO: Translate
+	lldebugs << "LLLink::buildContextMenu()" << llendl;
+	std::vector<std::string> items;
+	std::vector<std::string> disabled_items;
+
+	if(isInTrash())
+	{
+		items.push_back(std::string("Purge Item"));
+		if (!isItemRemovable())
+		{
+			disabled_items.push_back(std::string("Purge Item"));
+		}
+
+		items.push_back(std::string("Restore Item"));
+	}
+	else
+	{
+		items.push_back(std::string("Delete"));
+		if (!isItemRemovable())
+		{
+			disabled_items.push_back(std::string("Delete"));
+		}
+	}
+	hide_context_entries(menu, items, disabled_items);
+}
+
+
+// +=================================================+
+// |        LLLinkBridge                             |
+// +=================================================+
+// For broken links.
+
+std::string LLLinkFolderBridge::sPrefix("Link: ");
+
+
+LLUIImagePtr LLLinkFolderBridge::getIcon() const
+{
+	LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
+	if (LLViewerInventoryItem *item = getItem())
+	{
+		if (const LLViewerInventoryCategory* cat = item->getLinkedCategory())
+		{
+			preferred_type = cat->getPreferredType();
+		}
+	}
+	return LLFolderBridge::getIcon(preferred_type);
+}
+
+void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+	// *TODO: Translate
+	lldebugs << "LLLink::buildContextMenu()" << llendl;
+	std::vector<std::string> items;
+	std::vector<std::string> disabled_items;
+
+	if(isInTrash())
+	{
+		items.push_back(std::string("Purge Item"));
+		if (!isItemRemovable())
+		{
+			disabled_items.push_back(std::string("Purge Item"));
+		}
+
+		items.push_back(std::string("Restore Item"));
+	}
+	else
+	{
+		items.push_back(std::string("Find Original"));
+		items.push_back(std::string("Delete"));
+		if (!isItemRemovable())
+		{
+			disabled_items.push_back(std::string("Delete"));
+		}
+	}
+	hide_context_entries(menu, items, disabled_items);
+}
+
+void LLLinkFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+{
+	if ("goto" == action)
+	{
+		gotoItem(folder);
+		return;
+	}
+	LLItemBridge::performAction(folder,model,action);
+}
+
+void LLLinkFolderBridge::gotoItem(LLFolderView *folder)
+{
+	const LLUUID &cat_uuid = getFolderID();
+	if (!cat_uuid.isNull())
+	{
+		if (LLFolderViewItem *base_folder = folder->getItemByID(cat_uuid))
+		{
+			if (LLInventoryModel* model = getInventoryModel())
+			{
+				model->fetchDescendentsOf(cat_uuid);
+			}
+			base_folder->setOpen(TRUE);
+			folder->setSelectionFromRoot(base_folder,TRUE);
+			folder->scrollToShowSelection();
+		}
+	}
+}
+
+const LLUUID &LLLinkFolderBridge::getFolderID() const
+{
+	if (LLViewerInventoryItem *link_item = getItem())
+	{
+		if (const LLViewerInventoryCategory *cat = link_item->getLinkedCategory())
+		{
+			const LLUUID& cat_uuid = cat->getUUID();
+			return cat_uuid;
+		}
+	}
+	return LLUUID::null;
+}
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index efd40576a76..95cc68ddbe1 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -1,136 +1,136 @@
-/** 
- * @file llinventoryfunctions.h
- * @brief Miscellaneous inventory-related functions and classes
- * class definition
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- * 
- * Copyright (c) 2001-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLINVENTORYFUNCTIONS_H
-#define LL_LLINVENTORYFUNCTIONS_H
-
-#include "llassetstorage.h"
-#include "lldarray.h"
-#include "llfloater.h"
-#include "llinventory.h"
-#include "llinventoryfilter.h"
-#include "llfolderview.h"
-#include "llinventorymodel.h"
-#include "lluictrlfactory.h"
-#include <set>
-
-
-class LLFolderViewItem;
-class LLInventoryFilter;
-class LLInventoryModel;
-class LLInventoryPanel;
-class LLInvFVBridge;
-class LLInventoryFVBridgeBuilder;
-class LLMenuBarGL;
-class LLCheckBoxCtrl;
-class LLSpinCtrl;
-class LLScrollContainer;
-class LLTextBox;
-class LLIconCtrl;
-class LLSaveFolderState;
-class LLFilterEditor;
-class LLTabContainer;
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-//
-// This is a collection of miscellaneous functions and classes
-// that don't fit cleanly into any other class header.
-//
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryState
-{
-public:
-	// HACK: Until we can route this info through the instant message hierarchy
-	static BOOL sWearNewClothing;
-	static LLUUID sWearNewClothingTransactionID;	// wear all clothing in this transaction	
-};
-
-class LLSelectFirstFilteredItem : public LLFolderViewFunctor
-{
-public:
-	LLSelectFirstFilteredItem() : mItemSelected(FALSE) {}
-	virtual ~LLSelectFirstFilteredItem() {}
-	virtual void doFolder(LLFolderViewFolder* folder);
-	virtual void doItem(LLFolderViewItem* item);
-	BOOL wasItemSelected() { return mItemSelected; }
-protected:
-	BOOL	mItemSelected;
-};
-
-class LLOpenFilteredFolders : public LLFolderViewFunctor
-{
-public:
-	LLOpenFilteredFolders()  {}
-	virtual ~LLOpenFilteredFolders() {}
-	virtual void doFolder(LLFolderViewFolder* folder);
-	virtual void doItem(LLFolderViewItem* item);
-};
-
-class LLSaveFolderState : public LLFolderViewFunctor
-{
-public:
-	LLSaveFolderState() : mApply(FALSE) {}
-	virtual ~LLSaveFolderState() {}
-	virtual void doFolder(LLFolderViewFolder* folder);
-	virtual void doItem(LLFolderViewItem* item) {}
-	void setApply(BOOL apply);
-	void clearOpenFolders() { mOpenFolders.clear(); }
-protected:
-	std::set<LLUUID> mOpenFolders;
-	BOOL mApply;
-};
-
-class LLOpenFoldersWithSelection : public LLFolderViewFunctor
-{
-public:
-	LLOpenFoldersWithSelection() {}
-	virtual ~LLOpenFoldersWithSelection() {}
-	virtual void doFolder(LLFolderViewFolder* folder);
-	virtual void doItem(LLFolderViewItem* item);
-};
-
-const std::string& get_item_icon_name(LLAssetType::EType asset_type,
-							 LLInventoryType::EType inventory_type,
-							 U32 attachment_point, 
-							 BOOL item_is_multi );
-
-LLUIImagePtr get_item_icon(LLAssetType::EType asset_type,
-							 LLInventoryType::EType inventory_type,
-							 U32 attachment_point, 
-							 BOOL item_is_multi );
-
-#endif // LL_LLINVENTORYFUNCTIONS_H
-
-
-
+/** 
+ * @file llinventoryfunctions.h
+ * @brief Miscellaneous inventory-related functions and classes
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLINVENTORYFUNCTIONS_H
+#define LL_LLINVENTORYFUNCTIONS_H
+
+#include "llassetstorage.h"
+#include "lldarray.h"
+#include "llfloater.h"
+#include "llinventory.h"
+#include "llinventoryfilter.h"
+#include "llfolderview.h"
+#include "llinventorymodel.h"
+#include "lluictrlfactory.h"
+#include <set>
+
+
+class LLFolderViewItem;
+class LLInventoryFilter;
+class LLInventoryModel;
+class LLInventoryPanel;
+class LLInvFVBridge;
+class LLInventoryFVBridgeBuilder;
+class LLMenuBarGL;
+class LLCheckBoxCtrl;
+class LLSpinCtrl;
+class LLScrollContainer;
+class LLTextBox;
+class LLIconCtrl;
+class LLSaveFolderState;
+class LLFilterEditor;
+class LLTabContainer;
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// This is a collection of miscellaneous functions and classes
+// that don't fit cleanly into any other class header.
+//
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryState
+{
+public:
+	// HACK: Until we can route this info through the instant message hierarchy
+	static BOOL sWearNewClothing;
+	static LLUUID sWearNewClothingTransactionID;	// wear all clothing in this transaction	
+};
+
+class LLSelectFirstFilteredItem : public LLFolderViewFunctor
+{
+public:
+	LLSelectFirstFilteredItem() : mItemSelected(FALSE) {}
+	virtual ~LLSelectFirstFilteredItem() {}
+	virtual void doFolder(LLFolderViewFolder* folder);
+	virtual void doItem(LLFolderViewItem* item);
+	BOOL wasItemSelected() { return mItemSelected; }
+protected:
+	BOOL	mItemSelected;
+};
+
+class LLOpenFilteredFolders : public LLFolderViewFunctor
+{
+public:
+	LLOpenFilteredFolders()  {}
+	virtual ~LLOpenFilteredFolders() {}
+	virtual void doFolder(LLFolderViewFolder* folder);
+	virtual void doItem(LLFolderViewItem* item);
+};
+
+class LLSaveFolderState : public LLFolderViewFunctor
+{
+public:
+	LLSaveFolderState() : mApply(FALSE) {}
+	virtual ~LLSaveFolderState() {}
+	virtual void doFolder(LLFolderViewFolder* folder);
+	virtual void doItem(LLFolderViewItem* item) {}
+	void setApply(BOOL apply);
+	void clearOpenFolders() { mOpenFolders.clear(); }
+protected:
+	std::set<LLUUID> mOpenFolders;
+	BOOL mApply;
+};
+
+class LLOpenFoldersWithSelection : public LLFolderViewFunctor
+{
+public:
+	LLOpenFoldersWithSelection() {}
+	virtual ~LLOpenFoldersWithSelection() {}
+	virtual void doFolder(LLFolderViewFolder* folder);
+	virtual void doItem(LLFolderViewItem* item);
+};
+
+const std::string& get_item_icon_name(LLAssetType::EType asset_type,
+							 LLInventoryType::EType inventory_type,
+							 U32 attachment_point, 
+							 BOOL item_is_multi );
+
+LLUIImagePtr get_item_icon(LLAssetType::EType asset_type,
+							 LLInventoryType::EType inventory_type,
+							 U32 attachment_point, 
+							 BOOL item_is_multi );
+
+#endif // LL_LLINVENTORYFUNCTIONS_H
+
+
+
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 99591dea577..327a735f783 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -1,890 +1,890 @@
-/* 
- * @file llinventorypanel.cpp
- * @brief Implementation of the inventory panel and associated stuff.
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- * 
- * Copyright (c) 2001-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include <utility> // for std::pair<>
-
-#include "llinventorypanel.h"
-
-#include "llagent.h"
-#include "llagentwearables.h"
-#include "llappearancemgr.h"
-#include "llfloaterreg.h"
-#include "llimview.h"
-#include "llinventorybridge.h"
-#include "llscrollcontainer.h"
-#include "llviewerfoldertype.h"
-#include "llimfloater.h"
-#include "llvoavatarself.h"
-
-static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel");
-
-const std::string LLInventoryPanel::DEFAULT_SORT_ORDER = std::string("InventorySortOrder");
-const std::string LLInventoryPanel::RECENTITEMS_SORT_ORDER = std::string("RecentItemsSortOrder");
-const std::string LLInventoryPanel::INHERIT_SORT_ORDER = std::string("");
-static const LLInventoryFVBridgeBuilder INVENTORY_BRIDGE_BUILDER;
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryPanelObserver
-//
-// Bridge to support knowing when the inventory has changed.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLInventoryPanelObserver : public LLInventoryObserver
-{
-public:
-	LLInventoryPanelObserver(LLInventoryPanel* ip) : mIP(ip) {}
-	virtual ~LLInventoryPanelObserver() {}
-	virtual void changed(U32 mask);
-protected:
-	LLInventoryPanel* mIP;
-};
-
-LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :	
-	LLPanel(p),
-	mInventoryObserver(NULL),
-	mFolders(NULL),
-	mScroller(NULL),
-	mSortOrderSetting(p.sort_order_setting),
-	mInventory(p.inventory),
-	mAllowMultiSelect(p.allow_multi_select),
-	mHasInventoryConnection(false),
-	mStartFolderString(p.start_folder),	
-	mBuildDefaultHierarchy(true),
-	mInvFVBridgeBuilder(NULL)
-{
-	mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER;
-
-	// contex menu callbacks
-	mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLInventoryPanel::doToSelected, this, _2));
-	mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH));
-	mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND));
-	mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLInventoryPanel::doCreate, this, _2));
-	mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2));
-	mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this));
-	
-	setBackgroundColor(LLUIColorTable::instance().getColor("InventoryBackgroundColor"));
-	setBackgroundVisible(TRUE);
-	setBackgroundOpaque(TRUE);
-}
-
-BOOL LLInventoryPanel::postBuild()
-{
-	LLMemType mt(LLMemType::MTYPE_INVENTORY_POST_BUILD);
-
-	mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves
-	
-	// create root folder
-	{
-		LLRect folder_rect(0,
-						   0,
-						   getRect().getWidth(),
-						   0);
-		LLFolderView::Params p;
-		p.name = getName();
-		p.rect = folder_rect;
-		p.parent_panel = this;
-		p.tool_tip = p.name;
-		mFolders = LLUICtrlFactory::create<LLFolderView>(p);
-		mFolders->setAllowMultiSelect(mAllowMultiSelect);
-	}
-
-	mCommitCallbackRegistrar.popScope();
-	
-	mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar);
-	
-	// scroller
-	{
-		LLRect scroller_view_rect = getRect();
-		scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
-		LLScrollContainer::Params p;
-		p.name("Inventory Scroller");
-		p.rect(scroller_view_rect);
-		p.follows.flags(FOLLOWS_ALL);
-		p.reserve_scroll_corner(true);
-		p.tab_stop(true);
-		mScroller = LLUICtrlFactory::create<LLScrollContainer>(p);
-	}
-	addChild(mScroller);
-	mScroller->addChild(mFolders);
-	
-	mFolders->setScrollContainer(mScroller);
-
-	// set up the callbacks from the inventory we're viewing, and then
-	// build everything.
-	mInventoryObserver = new LLInventoryPanelObserver(this);
-	mInventory->addObserver(mInventoryObserver);
-
-	// build view of inventory if we need default full hierarchy and inventory ready, otherwise wait for modelChanged() callback
-	if (mBuildDefaultHierarchy && mInventory->isInventoryUsable() && !mHasInventoryConnection)
-	{
-		rebuildViews();
-		mHasInventoryConnection = true;
-		defaultOpenInventory();
-	}
-
-	if (mSortOrderSetting != INHERIT_SORT_ORDER)
-	{
-		setSortOrder(gSavedSettings.getU32(mSortOrderSetting));
-	}
-	else
-	{
-		setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER));
-	}
-	mFolders->setSortOrder(mFolders->getFilter()->getSortOrder());
-
-	return TRUE;
-}
-
-LLInventoryPanel::~LLInventoryPanel()
-{
-	// should this be a global setting?
-	if (mFolders)
-	{
-		U32 sort_order = mFolders->getSortOrder();
-		if (mSortOrderSetting != INHERIT_SORT_ORDER)
-		{
-			gSavedSettings.setU32(mSortOrderSetting, sort_order);
-		}
-	}
-
-	// LLView destructor will take care of the sub-views.
-	mInventory->removeObserver(mInventoryObserver);
-	delete mInventoryObserver;
-	mScroller = NULL;
-}
-
-LLMemType mt(LLMemType::MTYPE_INVENTORY_FROM_XML); // ! BUG ! Should this be removed?
-void LLInventoryPanel::draw()
-{
-	// select the desired item (in case it wasn't loaded when the selection was requested)
-	mFolders->updateSelection();
-	LLPanel::draw();
-}
-
-LLInventoryFilter* LLInventoryPanel::getFilter()
-{
-	if (mFolders) return mFolders->getFilter();
-	return NULL;
-}
-
-void LLInventoryPanel::setFilterTypes(U64 filter_types, BOOL filter_for_categories)
-{
-	mFolders->getFilter()->setFilterTypes(filter_types, filter_for_categories);
-}	
-
-void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask)
-{
-	mFolders->getFilter()->setFilterPermissions(filter_perm_mask);
-}
-
-void LLInventoryPanel::setFilterSubString(const std::string& string)
-{
-	mFolders->getFilter()->setFilterSubString(string);
-}
-
-void LLInventoryPanel::setSortOrder(U32 order)
-{
-	mFolders->getFilter()->setSortOrder(order);
-	if (mFolders->getFilter()->isModified())
-	{
-		mFolders->setSortOrder(order);
-		// try to keep selection onscreen, even if it wasn't to start with
-		mFolders->scrollToShowSelection();
-	}
-}
-
-void LLInventoryPanel::setSinceLogoff(BOOL sl)
-{
-	mFolders->getFilter()->setDateRangeLastLogoff(sl);
-}
-
-void LLInventoryPanel::setHoursAgo(U32 hours)
-{
-	mFolders->getFilter()->setHoursAgo(hours);
-}
-
-void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show)
-{
-	mFolders->getFilter()->setShowFolderState(show);
-}
-
-LLInventoryFilter::EFolderShow LLInventoryPanel::getShowFolderState()
-{
-	return mFolders->getFilter()->getShowFolderState();
-}
-
-static LLFastTimer::DeclareTimer FTM_REFRESH("Inventory Refresh");
-
-void LLInventoryPanel::modelChanged(U32 mask)
-{
-	LLFastTimer t2(FTM_REFRESH);
-
-	bool handled = false;
-
-	// inventory just initialized, do complete build
-	if ((mask & LLInventoryObserver::ADD) && gInventory.getChangedIDs().empty() && !mHasInventoryConnection)
-	{
-		rebuildViews();
-		mHasInventoryConnection = true;
-		defaultOpenInventory();
-		return;
-	}
-
-	if (mask & LLInventoryObserver::LABEL)
-	{
-		handled = true;
-		// label change - empty out the display name for each object
-		// in this change set.
-		const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
-		std::set<LLUUID>::const_iterator id_it = changed_items.begin();
-		std::set<LLUUID>::const_iterator id_end = changed_items.end();
-		LLFolderViewItem* view = NULL;
-		LLInvFVBridge* bridge = NULL;
-		for (;id_it != id_end; ++id_it)
-		{
-			view = mFolders->getItemByID(*id_it);
-			if(view)
-			{
-				// request refresh on this item (also flags for filtering)
-				bridge = (LLInvFVBridge*)view->getListener();
-				if(bridge)
-				{	// Clear the display name first, so it gets properly re-built during refresh()
-					bridge->clearDisplayName();
-				}
-				view->refresh();
-			}
-		}
-	}
-
-	// We don't really care which of these masks the item is actually flagged with, since the masks
-	// may not be accurate (e.g. in the main inventory panel, I move an item from My Inventory into
-	// Landmarks; this is a STRUCTURE change for that panel but is an ADD change for the Landmarks
-	// panel).  What's relevant is that the item and UI are probably out of sync and thus need to be
-	// resynchronized.
-	if (mask & (LLInventoryObserver::STRUCTURE |
-				LLInventoryObserver::ADD |
-				LLInventoryObserver::REMOVE))
-	{
-		handled = true;
-		// Record which folders are open by uuid.
-		LLInventoryModel* model = getModel();
-		if (model)
-		{
-			const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
-
-			std::set<LLUUID>::const_iterator id_it = changed_items.begin();
-			std::set<LLUUID>::const_iterator id_end = changed_items.end();
-			for (;id_it != id_end; ++id_it)
-			{
-				// sync view with model
-				LLInventoryObject* model_item = model->getObject(*id_it);
-				LLFolderViewItem* view_item = mFolders->getItemByID(*id_it);
-
-				// Item exists in memory but a UI element hasn't been created for it.
-				if (model_item && !view_item)
-				{
-					// Add the UI element for this item.
-					buildNewViews(*id_it);
-					// Select any newly created object that has the auto rename at top of folder root set.
-					if(mFolders->getRoot()->needsAutoRename())
-					{
-						setSelection(*id_it, FALSE);
-					}
-				}
-
-				// This item already exists in both memory and UI.  It was probably moved
-				// around in the panel's directory structure (i.e. reparented).
-				if (model_item && view_item)
-				{
-					LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
-
-					// Item has been moved.
-					if (view_item->getParentFolder() != new_parent)
-					{
-						if (new_parent != NULL)
-						{
-							// Item is to be moved and we found its new parent in the panel's directory, so move the item's UI.
-							view_item->getParentFolder()->extractItem(view_item);
-							view_item->addToFolder(new_parent, mFolders);
-						}
-						else 
-						{
-							// Item is to be moved outside the panel's directory (e.g. moved to trash for a panel that 
-							// doesn't include trash).  Just remove the item's UI.
-							view_item->destroyView();
-						}
-					}
-				}
-
-				// This item has been removed from memory, but its associated UI element still exists.
-				if (!model_item && view_item)
-				{
-					// Remove the item's UI.
-					view_item->destroyView();
-				}
-			}
-		}
-	}
-
-	if (!handled)
-	{
-		// it's a small change that only requires a refresh.
-		// *TODO: figure out a more efficient way to do the refresh
-		// since it is expensive on large inventories
-		mFolders->refresh();
-	}
-}
-
-
-void LLInventoryPanel::rebuildViews()
-{
-	// Determine the root folder and rebuild the views starting
-	// at that folder.
-	const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString);
-
-	if ("LIBRARY" == mStartFolderString)
-	{
-		mStartFolderID = gInventory.getLibraryRootFolderID();
-	}
-	else
-	{
-		mStartFolderID = (preferred_type != LLFolderType::FT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null);
-	}
-	
-	rebuildViewsFor(mStartFolderID);
-}
-
-void LLInventoryPanel::rebuildViewsFor(const LLUUID& id)
-{
-	LLFolderViewItem* old_view = NULL;
-
-	// get old LLFolderViewItem
-	old_view = mFolders->getItemByID(id);
-	if (old_view && id.notNull())
-	{
-		old_view->destroyView();
-	}
-
-	buildNewViews(id);
-}
-
-void LLInventoryPanel::buildNewViews(const LLUUID& id)
-{
-	LLMemType mt(LLMemType::MTYPE_INVENTORY_BUILD_NEW_VIEWS);
-	LLFolderViewItem* itemp = NULL;
-	LLInventoryObject* objectp = gInventory.getObject(id);
-	if (objectp)
-	{
-		const LLUUID &parent_id = objectp->getParentUUID();
-		LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)mFolders->getItemByID(parent_id);
-		if (id == mStartFolderID)
-			parent_folder = mFolders;
-		
-		if (!parent_folder)
-		{
-			// This item exists outside the inventory's hierarchy, so don't add it.
-			return;
-		}
-		
-		if (objectp->getType() <= LLAssetType::AT_NONE ||
-			objectp->getType() >= LLAssetType::AT_COUNT)
-		{
-			llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " << 
-				((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID() << llendl;
-			return;
-		}
-		
-		if (objectp->getType() == LLAssetType::AT_CATEGORY &&
-			objectp->getActualType() != LLAssetType::AT_LINK_FOLDER) 
-		{
-			LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(),
-																			objectp->getType(),
-																			LLInventoryType::IT_CATEGORY,
-																			this,
-																			objectp->getUUID());
-			
-			if (new_listener)
-			{
-				LLFolderViewFolder::Params p;
-				p.name = new_listener->getDisplayName();
-				p.icon = new_listener->getIcon();
-				p.root = mFolders;
-				p.listener = new_listener;
-				p.tool_tip = p.name;
-				LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(p);
-				folderp->setItemSortOrder(mFolders->getSortOrder());
-				itemp = folderp;
-
-				// Hide the root folder, so we can show the contents of a folder
-				// flat but still have the parent folder present for listener-related
-				// operations.
-				if (id == mStartFolderID)
-				{
-					folderp->setDontShowInHierarchy(TRUE);
-				}
-			}
-		}
-		else 
-		{
-			// Build new view for item
-			LLInventoryItem* item = (LLInventoryItem*)objectp;
-			LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(item->getType(),
-																			item->getActualType(),
-																			item->getInventoryType(),
-																			this,
-																			item->getUUID(),
-																			item->getFlags());
-
-			if (new_listener)
-			{
-				LLFolderViewItem::Params params;
-				params.name(new_listener->getDisplayName());
-				params.icon(new_listener->getIcon());
-				params.creation_date(new_listener->getCreationDate());
-				params.root(mFolders);
-				params.listener(new_listener);
-				params.rect(LLRect (0, 0, 0, 0));
-				params.tool_tip = params.name;
-				itemp = LLUICtrlFactory::create<LLFolderViewItem> (params);
-			}
-		}
-
-		if (itemp)
-		{
-			itemp->addToFolder(parent_folder, mFolders);
-		}
-	}
-
-	// If this is a folder, add the children of the folder and recursively add any 
-	// child folders.
-	if ((id == mStartFolderID) ||
-		(objectp && objectp->getType() == LLAssetType::AT_CATEGORY))
-	{
-		LLViewerInventoryCategory::cat_array_t* categories;
-		LLViewerInventoryItem::item_array_t* items;
-
-		mInventory->lockDirectDescendentArrays(id, categories, items);
-		if(categories)
-		{
-			S32 count = categories->count();
-			for(S32 i = 0; i < count; ++i)
-			{
-				LLInventoryCategory* cat = categories->get(i);
-				buildNewViews(cat->getUUID());
-			}
-		}
-		if(items)
-		{
-			S32 count = items->count();
-			for(S32 i = 0; i < count; ++i)
-			{
-				LLInventoryItem* item = items->get(i);
-				buildNewViews(item->getUUID());
-			}
-		}
-		mInventory->unlockDirectDescendentArrays(id);
-	}
-}
-
-// bit of a hack to make sure the inventory is open.
-void LLInventoryPanel::defaultOpenInventory()
-{
-	const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString);
-	if (preferred_type != LLFolderType::FT_NONE)
-	{
-		const std::string& top_level_folder_name = LLViewerFolderType::lookupNewCategoryName(preferred_type);
-		mFolders->openFolder(top_level_folder_name);
-	}
-	else
-	{
-		// Get the first child (it should be "My Inventory") and
-		// open it up by name (just to make sure the first child is actually a folder).
-		LLView* first_child = mFolders->getFirstChild();
-		const std::string& first_child_name = first_child->getName();
-		mFolders->openFolder(first_child_name);
-	}
-}
-
-struct LLConfirmPurgeData
-{
-	LLUUID mID;
-	LLInventoryModel* mModel;
-};
-
-class LLIsNotWorn : public LLInventoryCollectFunctor
-{
-public:
-	LLIsNotWorn() {}
-	virtual ~LLIsNotWorn() {}
-	virtual bool operator()(LLInventoryCategory* cat,
-							LLInventoryItem* item)
-	{
-		return !gAgentWearables.isWearingItem(item->getUUID());
-	}
-};
-
-class LLOpenFolderByID : public LLFolderViewFunctor
-{
-public:
-	LLOpenFolderByID(const LLUUID& id) : mID(id) {}
-	virtual ~LLOpenFolderByID() {}
-	virtual void doFolder(LLFolderViewFolder* folder)
-		{
-			if (folder->getListener() && folder->getListener()->getUUID() == mID) folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
-		}
-	virtual void doItem(LLFolderViewItem* item) {}
-protected:
-	const LLUUID& mID;
-};
-
-
-void LLInventoryPanel::openSelected()
-{
-	LLFolderViewItem* folder_item = mFolders->getCurSelectedItem();
-	if(!folder_item) return;
-	LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener();
-	if(!bridge) return;
-	bridge->openItem();
-}
-
-BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask)
-{
-	BOOL handled = LLView::handleHover(x, y, mask);
-	if(handled)
-	{
-		ECursorType cursor = getWindow()->getCursor();
-		if (LLInventoryModel::backgroundFetchActive() && cursor == UI_CURSOR_ARROW)
-		{
-			// replace arrow cursor with arrow and hourglass cursor
-			getWindow()->setCursor(UI_CURSOR_WORKING);
-		}
-	}
-	else
-	{
-		getWindow()->setCursor(UI_CURSOR_ARROW);
-	}
-	return TRUE;
-}
-
-BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
-								   EDragAndDropType cargo_type,
-								   void* cargo_data,
-								   EAcceptance* accept,
-								   std::string& tooltip_msg)
-{
-
-	BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
-
-	if (handled)
-	{
-		mFolders->setDragAndDropThisFrame();
-	}
-
-	return handled;
-}
-
-void LLInventoryPanel::onFocusLost()
-{
-	// inventory no longer handles cut/copy/paste/delete
-	if (LLEditMenuHandler::gEditMenuHandler == mFolders)
-	{
-		LLEditMenuHandler::gEditMenuHandler = NULL;
-	}
-
-	LLPanel::onFocusLost();
-}
-
-void LLInventoryPanel::onFocusReceived()
-{
-	// inventory now handles cut/copy/paste/delete
-	LLEditMenuHandler::gEditMenuHandler = mFolders;
-
-	LLPanel::onFocusReceived();
-}
-
-
-void LLInventoryPanel::openAllFolders()
-{
-	mFolders->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN);
-	mFolders->arrangeAll();
-}
-
-void LLInventoryPanel::openDefaultFolderForType(LLFolderType::EType type)
-{
-	LLUUID category_id = mInventory->findCategoryUUIDForType(type);
-	LLOpenFolderByID opener(category_id);
-	mFolders->applyFunctorRecursively(opener);
-}
-
-void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus)
-{
-	// Don't select objects in COF (e.g. to prevent refocus when items are worn).
-	const LLInventoryObject *obj = gInventory.getObject(obj_id);
-	if (obj && obj->getParentUUID() == LLAppearanceManager::instance().getCOF())
-	{
-		return;
-	}
-	mFolders->setSelectionByID(obj_id, take_keyboard_focus);
-}
-
-void LLInventoryPanel::clearSelection()
-{
-	mFolders->clearSelection();
-}
-
-void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& items, BOOL user_action)
-{
-	LLFolderView* fv = getRootFolder();
-	if (fv->needsAutoRename()) // auto-selecting a new user-created asset and preparing to rename
-	{
-		fv->setNeedsAutoRename(FALSE);
-		if (items.size()) // new asset is visible and selected
-		{
-			fv->startRenamingSelectedItem();
-		}
-	}
-	// Seraph - Put determineFolderType in here for ensemble typing?
-}
-
-//----------------------------------------------------------------------------
-
-void LLInventoryPanel::doToSelected(const LLSD& userdata)
-{
-	mFolders->doToSelected(&gInventory, userdata);
-}
-
-void LLInventoryPanel::doCreate(const LLSD& userdata)
-{
-	menu_create_inventory_item(mFolders, LLFolderBridge::sSelf, userdata);
-}
-
-bool LLInventoryPanel::beginIMSession()
-{
-	std::set<LLUUID> selected_items;
-	mFolders->getSelectionList(selected_items);
-
-	std::string name;
-	static int session_num = 1;
-
-	LLDynamicArray<LLUUID> members;
-	EInstantMessage type = IM_SESSION_CONFERENCE_START;
-
-	std::set<LLUUID>::const_iterator iter;
-	for (iter = selected_items.begin(); iter != selected_items.end(); iter++)
-	{
-
-		LLUUID item = *iter;
-		LLFolderViewItem* folder_item = mFolders->getItemByID(item);
-			
-		if(folder_item) 
-		{
-			LLFolderViewEventListener* fve_listener = folder_item->getListener();
-			if (fve_listener && (fve_listener->getInventoryType() == LLInventoryType::IT_CATEGORY))
-			{
-
-				LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getListener();
-				if(!bridge) return true;
-				LLViewerInventoryCategory* cat = bridge->getCategory();
-				if(!cat) return true;
-				name = cat->getName();
-				LLUniqueBuddyCollector is_buddy;
-				LLInventoryModel::cat_array_t cat_array;
-				LLInventoryModel::item_array_t item_array;
-				gInventory.collectDescendentsIf(bridge->getUUID(),
-												cat_array,
-												item_array,
-												LLInventoryModel::EXCLUDE_TRASH,
-												is_buddy);
-				S32 count = item_array.count();
-				if(count > 0)
-				{
-					LLFloaterReg::showInstance("communicate");
-					// create the session
-					LLAvatarTracker& at = LLAvatarTracker::instance();
-					LLUUID id;
-					for(S32 i = 0; i < count; ++i)
-					{
-						id = item_array.get(i)->getCreatorUUID();
-						if(at.isBuddyOnline(id))
-						{
-							members.put(id);
-						}
-					}
-				}
-			}
-			else
-			{
-				LLFolderViewItem* folder_item = mFolders->getItemByID(item);
-				if(!folder_item) return true;
-				LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getListener();
-
-				if (listenerp->getInventoryType() == LLInventoryType::IT_CALLINGCARD)
-				{
-					LLInventoryItem* inv_item = gInventory.getItem(listenerp->getUUID());
-
-					if (inv_item)
-					{
-						LLAvatarTracker& at = LLAvatarTracker::instance();
-						LLUUID id = inv_item->getCreatorUUID();
-
-						if(at.isBuddyOnline(id))
-						{
-							members.put(id);
-						}
-					}
-				} //if IT_CALLINGCARD
-			} //if !IT_CATEGORY
-		}
-	} //for selected_items	
-
-	// the session_id is randomly generated UUID which will be replaced later
-	// with a server side generated number
-
-	if (name.empty())
-	{
-		name = llformat("Session %d", session_num++);
-	}
-
-	LLUUID session_id = gIMMgr->addSession(name, type, members[0], members);
-	if (session_id != LLUUID::null)
-	{
-		LLIMFloater::show(session_id);
-	}
-		
-	return true;
-}
-
-bool LLInventoryPanel::attachObject(const LLSD& userdata)
-{
-	std::set<LLUUID> selected_items;
-	mFolders->getSelectionList(selected_items);
-
-	std::string joint_name = userdata.asString();
-	LLVOAvatar *avatarp = static_cast<LLVOAvatar*>(gAgent.getAvatarObject());
-	LLViewerJointAttachment* attachmentp = NULL;
-	for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); 
-		 iter != avatarp->mAttachmentPoints.end(); )
-	{
-		LLVOAvatar::attachment_map_t::iterator curiter = iter++;
-		LLViewerJointAttachment* attachment = curiter->second;
-		if (attachment->getName() == joint_name)
-		{
-			attachmentp = attachment;
-			break;
-		}
-	}
-	if (attachmentp == NULL)
-	{
-		return true;
-	}
-
-	for (std::set<LLUUID>::const_iterator set_iter = selected_items.begin(); 
-		 set_iter != selected_items.end(); 
-		 ++set_iter)
-	{
-		const LLUUID &id = *set_iter;
-		LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(id);
-		if(item && gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID()))
-		{
-			rez_attachment(item, attachmentp);
-		}
-		else if(item && item->isComplete())
-		{
-			// must be in library. copy it to our inventory and put it on.
-			LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(attachmentp);
-			copy_inventory_item(gAgent.getID(),
-								item->getPermissions().getOwner(),
-								item->getUUID(),
-								LLUUID::null,
-								std::string(),
-								cb);
-		}
-	}
-	gFocusMgr.setKeyboardFocus(NULL);
-
-	return true;
-}
-
-
-//----------------------------------------------------------------------------
-
-// static DEBUG ONLY:
-void LLInventoryPanel::dumpSelectionInformation(void* user_data)
-{
-	LLInventoryPanel* iv = (LLInventoryPanel*)user_data;
-	iv->mFolders->dumpSelectionInformation();
-}
-
-BOOL LLInventoryPanel::getSinceLogoff()
-{
-	return mFolders->getFilter()->isSinceLogoff();
-}
-
-void example_param_block_usage()
-{
-	LLInventoryPanel::Params param_block;
-	param_block.name(std::string("inventory"));
-
-	param_block.sort_order_setting(LLInventoryPanel::RECENTITEMS_SORT_ORDER);
-	param_block.allow_multi_select(true);
-	param_block.filter(LLInventoryPanel::Filter()
-			.sort_order(1)
-			.types(0xffff0000));
-	param_block.inventory(&gInventory);
-	param_block.has_border(true);
-
-	LLUICtrlFactory::create<LLInventoryPanel>(param_block);
-
-	param_block = LLInventoryPanel::Params();
-	param_block.name(std::string("inventory"));
-
-	//LLSD param_block_sd;
-	//param_block_sd["sort_order_setting"] = LLInventoryPanel::RECENTITEMS_SORT_ORDER;
-	//param_block_sd["allow_multi_select"] = true;
-	//param_block_sd["filter"]["sort_order"] = 1;
-	//param_block_sd["filter"]["types"] = (S32)0xffff0000;
-	//param_block_sd["has_border"] = true;
-
-	//LLInitParam::LLSDParser(param_block_sd).parse(param_block);
-
-	LLUICtrlFactory::create<LLInventoryPanel>(param_block);
-}
-
-// +=================================================+
-// |        LLInventoryPanelObserver                 |
-// +=================================================+
-void LLInventoryPanelObserver::changed(U32 mask)
-{
-	mIP->modelChanged(mask);
-}
+/* 
+ * @file llinventorypanel.cpp
+ * @brief Implementation of the inventory panel and associated stuff.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include <utility> // for std::pair<>
+
+#include "llinventorypanel.h"
+
+#include "llagent.h"
+#include "llagentwearables.h"
+#include "llappearancemgr.h"
+#include "llfloaterreg.h"
+#include "llimview.h"
+#include "llinventorybridge.h"
+#include "llscrollcontainer.h"
+#include "llviewerfoldertype.h"
+#include "llimfloater.h"
+#include "llvoavatarself.h"
+
+static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel");
+
+const std::string LLInventoryPanel::DEFAULT_SORT_ORDER = std::string("InventorySortOrder");
+const std::string LLInventoryPanel::RECENTITEMS_SORT_ORDER = std::string("RecentItemsSortOrder");
+const std::string LLInventoryPanel::INHERIT_SORT_ORDER = std::string("");
+static const LLInventoryFVBridgeBuilder INVENTORY_BRIDGE_BUILDER;
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryPanelObserver
+//
+// Bridge to support knowing when the inventory has changed.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryPanelObserver : public LLInventoryObserver
+{
+public:
+	LLInventoryPanelObserver(LLInventoryPanel* ip) : mIP(ip) {}
+	virtual ~LLInventoryPanelObserver() {}
+	virtual void changed(U32 mask);
+protected:
+	LLInventoryPanel* mIP;
+};
+
+LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :	
+	LLPanel(p),
+	mInventoryObserver(NULL),
+	mFolders(NULL),
+	mScroller(NULL),
+	mSortOrderSetting(p.sort_order_setting),
+	mInventory(p.inventory),
+	mAllowMultiSelect(p.allow_multi_select),
+	mHasInventoryConnection(false),
+	mStartFolderString(p.start_folder),	
+	mBuildDefaultHierarchy(true),
+	mInvFVBridgeBuilder(NULL)
+{
+	mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER;
+
+	// contex menu callbacks
+	mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLInventoryPanel::doToSelected, this, _2));
+	mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH));
+	mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND));
+	mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLInventoryPanel::doCreate, this, _2));
+	mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2));
+	mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this));
+	
+	setBackgroundColor(LLUIColorTable::instance().getColor("InventoryBackgroundColor"));
+	setBackgroundVisible(TRUE);
+	setBackgroundOpaque(TRUE);
+}
+
+BOOL LLInventoryPanel::postBuild()
+{
+	LLMemType mt(LLMemType::MTYPE_INVENTORY_POST_BUILD);
+
+	mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves
+	
+	// create root folder
+	{
+		LLRect folder_rect(0,
+						   0,
+						   getRect().getWidth(),
+						   0);
+		LLFolderView::Params p;
+		p.name = getName();
+		p.rect = folder_rect;
+		p.parent_panel = this;
+		p.tool_tip = p.name;
+		mFolders = LLUICtrlFactory::create<LLFolderView>(p);
+		mFolders->setAllowMultiSelect(mAllowMultiSelect);
+	}
+
+	mCommitCallbackRegistrar.popScope();
+	
+	mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar);
+	
+	// scroller
+	{
+		LLRect scroller_view_rect = getRect();
+		scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
+		LLScrollContainer::Params p;
+		p.name("Inventory Scroller");
+		p.rect(scroller_view_rect);
+		p.follows.flags(FOLLOWS_ALL);
+		p.reserve_scroll_corner(true);
+		p.tab_stop(true);
+		mScroller = LLUICtrlFactory::create<LLScrollContainer>(p);
+	}
+	addChild(mScroller);
+	mScroller->addChild(mFolders);
+	
+	mFolders->setScrollContainer(mScroller);
+
+	// set up the callbacks from the inventory we're viewing, and then
+	// build everything.
+	mInventoryObserver = new LLInventoryPanelObserver(this);
+	mInventory->addObserver(mInventoryObserver);
+
+	// build view of inventory if we need default full hierarchy and inventory ready, otherwise wait for modelChanged() callback
+	if (mBuildDefaultHierarchy && mInventory->isInventoryUsable() && !mHasInventoryConnection)
+	{
+		rebuildViews();
+		mHasInventoryConnection = true;
+		defaultOpenInventory();
+	}
+
+	if (mSortOrderSetting != INHERIT_SORT_ORDER)
+	{
+		setSortOrder(gSavedSettings.getU32(mSortOrderSetting));
+	}
+	else
+	{
+		setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER));
+	}
+	mFolders->setSortOrder(mFolders->getFilter()->getSortOrder());
+
+	return TRUE;
+}
+
+LLInventoryPanel::~LLInventoryPanel()
+{
+	// should this be a global setting?
+	if (mFolders)
+	{
+		U32 sort_order = mFolders->getSortOrder();
+		if (mSortOrderSetting != INHERIT_SORT_ORDER)
+		{
+			gSavedSettings.setU32(mSortOrderSetting, sort_order);
+		}
+	}
+
+	// LLView destructor will take care of the sub-views.
+	mInventory->removeObserver(mInventoryObserver);
+	delete mInventoryObserver;
+	mScroller = NULL;
+}
+
+LLMemType mt(LLMemType::MTYPE_INVENTORY_FROM_XML); // ! BUG ! Should this be removed?
+void LLInventoryPanel::draw()
+{
+	// select the desired item (in case it wasn't loaded when the selection was requested)
+	mFolders->updateSelection();
+	LLPanel::draw();
+}
+
+LLInventoryFilter* LLInventoryPanel::getFilter()
+{
+	if (mFolders) return mFolders->getFilter();
+	return NULL;
+}
+
+void LLInventoryPanel::setFilterTypes(U64 filter_types, BOOL filter_for_categories)
+{
+	mFolders->getFilter()->setFilterTypes(filter_types, filter_for_categories);
+}	
+
+void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask)
+{
+	mFolders->getFilter()->setFilterPermissions(filter_perm_mask);
+}
+
+void LLInventoryPanel::setFilterSubString(const std::string& string)
+{
+	mFolders->getFilter()->setFilterSubString(string);
+}
+
+void LLInventoryPanel::setSortOrder(U32 order)
+{
+	mFolders->getFilter()->setSortOrder(order);
+	if (mFolders->getFilter()->isModified())
+	{
+		mFolders->setSortOrder(order);
+		// try to keep selection onscreen, even if it wasn't to start with
+		mFolders->scrollToShowSelection();
+	}
+}
+
+void LLInventoryPanel::setSinceLogoff(BOOL sl)
+{
+	mFolders->getFilter()->setDateRangeLastLogoff(sl);
+}
+
+void LLInventoryPanel::setHoursAgo(U32 hours)
+{
+	mFolders->getFilter()->setHoursAgo(hours);
+}
+
+void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show)
+{
+	mFolders->getFilter()->setShowFolderState(show);
+}
+
+LLInventoryFilter::EFolderShow LLInventoryPanel::getShowFolderState()
+{
+	return mFolders->getFilter()->getShowFolderState();
+}
+
+static LLFastTimer::DeclareTimer FTM_REFRESH("Inventory Refresh");
+
+void LLInventoryPanel::modelChanged(U32 mask)
+{
+	LLFastTimer t2(FTM_REFRESH);
+
+	bool handled = false;
+
+	// inventory just initialized, do complete build
+	if ((mask & LLInventoryObserver::ADD) && gInventory.getChangedIDs().empty() && !mHasInventoryConnection)
+	{
+		rebuildViews();
+		mHasInventoryConnection = true;
+		defaultOpenInventory();
+		return;
+	}
+
+	if (mask & LLInventoryObserver::LABEL)
+	{
+		handled = true;
+		// label change - empty out the display name for each object
+		// in this change set.
+		const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
+		std::set<LLUUID>::const_iterator id_it = changed_items.begin();
+		std::set<LLUUID>::const_iterator id_end = changed_items.end();
+		LLFolderViewItem* view = NULL;
+		LLInvFVBridge* bridge = NULL;
+		for (;id_it != id_end; ++id_it)
+		{
+			view = mFolders->getItemByID(*id_it);
+			if(view)
+			{
+				// request refresh on this item (also flags for filtering)
+				bridge = (LLInvFVBridge*)view->getListener();
+				if(bridge)
+				{	// Clear the display name first, so it gets properly re-built during refresh()
+					bridge->clearDisplayName();
+				}
+				view->refresh();
+			}
+		}
+	}
+
+	// We don't really care which of these masks the item is actually flagged with, since the masks
+	// may not be accurate (e.g. in the main inventory panel, I move an item from My Inventory into
+	// Landmarks; this is a STRUCTURE change for that panel but is an ADD change for the Landmarks
+	// panel).  What's relevant is that the item and UI are probably out of sync and thus need to be
+	// resynchronized.
+	if (mask & (LLInventoryObserver::STRUCTURE |
+				LLInventoryObserver::ADD |
+				LLInventoryObserver::REMOVE))
+	{
+		handled = true;
+		// Record which folders are open by uuid.
+		LLInventoryModel* model = getModel();
+		if (model)
+		{
+			const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
+
+			std::set<LLUUID>::const_iterator id_it = changed_items.begin();
+			std::set<LLUUID>::const_iterator id_end = changed_items.end();
+			for (;id_it != id_end; ++id_it)
+			{
+				// sync view with model
+				LLInventoryObject* model_item = model->getObject(*id_it);
+				LLFolderViewItem* view_item = mFolders->getItemByID(*id_it);
+
+				// Item exists in memory but a UI element hasn't been created for it.
+				if (model_item && !view_item)
+				{
+					// Add the UI element for this item.
+					buildNewViews(*id_it);
+					// Select any newly created object that has the auto rename at top of folder root set.
+					if(mFolders->getRoot()->needsAutoRename())
+					{
+						setSelection(*id_it, FALSE);
+					}
+				}
+
+				// This item already exists in both memory and UI.  It was probably moved
+				// around in the panel's directory structure (i.e. reparented).
+				if (model_item && view_item)
+				{
+					LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
+
+					// Item has been moved.
+					if (view_item->getParentFolder() != new_parent)
+					{
+						if (new_parent != NULL)
+						{
+							// Item is to be moved and we found its new parent in the panel's directory, so move the item's UI.
+							view_item->getParentFolder()->extractItem(view_item);
+							view_item->addToFolder(new_parent, mFolders);
+						}
+						else 
+						{
+							// Item is to be moved outside the panel's directory (e.g. moved to trash for a panel that 
+							// doesn't include trash).  Just remove the item's UI.
+							view_item->destroyView();
+						}
+					}
+				}
+
+				// This item has been removed from memory, but its associated UI element still exists.
+				if (!model_item && view_item)
+				{
+					// Remove the item's UI.
+					view_item->destroyView();
+				}
+			}
+		}
+	}
+
+	if (!handled)
+	{
+		// it's a small change that only requires a refresh.
+		// *TODO: figure out a more efficient way to do the refresh
+		// since it is expensive on large inventories
+		mFolders->refresh();
+	}
+}
+
+
+void LLInventoryPanel::rebuildViews()
+{
+	// Determine the root folder and rebuild the views starting
+	// at that folder.
+	const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString);
+
+	if ("LIBRARY" == mStartFolderString)
+	{
+		mStartFolderID = gInventory.getLibraryRootFolderID();
+	}
+	else
+	{
+		mStartFolderID = (preferred_type != LLFolderType::FT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null);
+	}
+	
+	rebuildViewsFor(mStartFolderID);
+}
+
+void LLInventoryPanel::rebuildViewsFor(const LLUUID& id)
+{
+	LLFolderViewItem* old_view = NULL;
+
+	// get old LLFolderViewItem
+	old_view = mFolders->getItemByID(id);
+	if (old_view && id.notNull())
+	{
+		old_view->destroyView();
+	}
+
+	buildNewViews(id);
+}
+
+void LLInventoryPanel::buildNewViews(const LLUUID& id)
+{
+	LLMemType mt(LLMemType::MTYPE_INVENTORY_BUILD_NEW_VIEWS);
+	LLFolderViewItem* itemp = NULL;
+	LLInventoryObject* objectp = gInventory.getObject(id);
+	if (objectp)
+	{
+		const LLUUID &parent_id = objectp->getParentUUID();
+		LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)mFolders->getItemByID(parent_id);
+		if (id == mStartFolderID)
+			parent_folder = mFolders;
+		
+		if (!parent_folder)
+		{
+			// This item exists outside the inventory's hierarchy, so don't add it.
+			return;
+		}
+		
+		if (objectp->getType() <= LLAssetType::AT_NONE ||
+			objectp->getType() >= LLAssetType::AT_COUNT)
+		{
+			llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " << 
+				((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID() << llendl;
+			return;
+		}
+		
+		if (objectp->getType() == LLAssetType::AT_CATEGORY &&
+			objectp->getActualType() != LLAssetType::AT_LINK_FOLDER) 
+		{
+			LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(),
+																			objectp->getType(),
+																			LLInventoryType::IT_CATEGORY,
+																			this,
+																			objectp->getUUID());
+			
+			if (new_listener)
+			{
+				LLFolderViewFolder::Params p;
+				p.name = new_listener->getDisplayName();
+				p.icon = new_listener->getIcon();
+				p.root = mFolders;
+				p.listener = new_listener;
+				p.tool_tip = p.name;
+				LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(p);
+				folderp->setItemSortOrder(mFolders->getSortOrder());
+				itemp = folderp;
+
+				// Hide the root folder, so we can show the contents of a folder
+				// flat but still have the parent folder present for listener-related
+				// operations.
+				if (id == mStartFolderID)
+				{
+					folderp->setDontShowInHierarchy(TRUE);
+				}
+			}
+		}
+		else 
+		{
+			// Build new view for item
+			LLInventoryItem* item = (LLInventoryItem*)objectp;
+			LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(item->getType(),
+																			item->getActualType(),
+																			item->getInventoryType(),
+																			this,
+																			item->getUUID(),
+																			item->getFlags());
+
+			if (new_listener)
+			{
+				LLFolderViewItem::Params params;
+				params.name(new_listener->getDisplayName());
+				params.icon(new_listener->getIcon());
+				params.creation_date(new_listener->getCreationDate());
+				params.root(mFolders);
+				params.listener(new_listener);
+				params.rect(LLRect (0, 0, 0, 0));
+				params.tool_tip = params.name;
+				itemp = LLUICtrlFactory::create<LLFolderViewItem> (params);
+			}
+		}
+
+		if (itemp)
+		{
+			itemp->addToFolder(parent_folder, mFolders);
+		}
+	}
+
+	// If this is a folder, add the children of the folder and recursively add any 
+	// child folders.
+	if ((id == mStartFolderID) ||
+		(objectp && objectp->getType() == LLAssetType::AT_CATEGORY))
+	{
+		LLViewerInventoryCategory::cat_array_t* categories;
+		LLViewerInventoryItem::item_array_t* items;
+
+		mInventory->lockDirectDescendentArrays(id, categories, items);
+		if(categories)
+		{
+			S32 count = categories->count();
+			for(S32 i = 0; i < count; ++i)
+			{
+				LLInventoryCategory* cat = categories->get(i);
+				buildNewViews(cat->getUUID());
+			}
+		}
+		if(items)
+		{
+			S32 count = items->count();
+			for(S32 i = 0; i < count; ++i)
+			{
+				LLInventoryItem* item = items->get(i);
+				buildNewViews(item->getUUID());
+			}
+		}
+		mInventory->unlockDirectDescendentArrays(id);
+	}
+}
+
+// bit of a hack to make sure the inventory is open.
+void LLInventoryPanel::defaultOpenInventory()
+{
+	const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString);
+	if (preferred_type != LLFolderType::FT_NONE)
+	{
+		const std::string& top_level_folder_name = LLViewerFolderType::lookupNewCategoryName(preferred_type);
+		mFolders->openFolder(top_level_folder_name);
+	}
+	else
+	{
+		// Get the first child (it should be "My Inventory") and
+		// open it up by name (just to make sure the first child is actually a folder).
+		LLView* first_child = mFolders->getFirstChild();
+		const std::string& first_child_name = first_child->getName();
+		mFolders->openFolder(first_child_name);
+	}
+}
+
+struct LLConfirmPurgeData
+{
+	LLUUID mID;
+	LLInventoryModel* mModel;
+};
+
+class LLIsNotWorn : public LLInventoryCollectFunctor
+{
+public:
+	LLIsNotWorn() {}
+	virtual ~LLIsNotWorn() {}
+	virtual bool operator()(LLInventoryCategory* cat,
+							LLInventoryItem* item)
+	{
+		return !gAgentWearables.isWearingItem(item->getUUID());
+	}
+};
+
+class LLOpenFolderByID : public LLFolderViewFunctor
+{
+public:
+	LLOpenFolderByID(const LLUUID& id) : mID(id) {}
+	virtual ~LLOpenFolderByID() {}
+	virtual void doFolder(LLFolderViewFolder* folder)
+		{
+			if (folder->getListener() && folder->getListener()->getUUID() == mID) folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
+		}
+	virtual void doItem(LLFolderViewItem* item) {}
+protected:
+	const LLUUID& mID;
+};
+
+
+void LLInventoryPanel::openSelected()
+{
+	LLFolderViewItem* folder_item = mFolders->getCurSelectedItem();
+	if(!folder_item) return;
+	LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener();
+	if(!bridge) return;
+	bridge->openItem();
+}
+
+BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask)
+{
+	BOOL handled = LLView::handleHover(x, y, mask);
+	if(handled)
+	{
+		ECursorType cursor = getWindow()->getCursor();
+		if (LLInventoryModel::backgroundFetchActive() && cursor == UI_CURSOR_ARROW)
+		{
+			// replace arrow cursor with arrow and hourglass cursor
+			getWindow()->setCursor(UI_CURSOR_WORKING);
+		}
+	}
+	else
+	{
+		getWindow()->setCursor(UI_CURSOR_ARROW);
+	}
+	return TRUE;
+}
+
+BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+								   EDragAndDropType cargo_type,
+								   void* cargo_data,
+								   EAcceptance* accept,
+								   std::string& tooltip_msg)
+{
+
+	BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+
+	if (handled)
+	{
+		mFolders->setDragAndDropThisFrame();
+	}
+
+	return handled;
+}
+
+void LLInventoryPanel::onFocusLost()
+{
+	// inventory no longer handles cut/copy/paste/delete
+	if (LLEditMenuHandler::gEditMenuHandler == mFolders)
+	{
+		LLEditMenuHandler::gEditMenuHandler = NULL;
+	}
+
+	LLPanel::onFocusLost();
+}
+
+void LLInventoryPanel::onFocusReceived()
+{
+	// inventory now handles cut/copy/paste/delete
+	LLEditMenuHandler::gEditMenuHandler = mFolders;
+
+	LLPanel::onFocusReceived();
+}
+
+
+void LLInventoryPanel::openAllFolders()
+{
+	mFolders->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN);
+	mFolders->arrangeAll();
+}
+
+void LLInventoryPanel::openDefaultFolderForType(LLFolderType::EType type)
+{
+	LLUUID category_id = mInventory->findCategoryUUIDForType(type);
+	LLOpenFolderByID opener(category_id);
+	mFolders->applyFunctorRecursively(opener);
+}
+
+void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus)
+{
+	// Don't select objects in COF (e.g. to prevent refocus when items are worn).
+	const LLInventoryObject *obj = gInventory.getObject(obj_id);
+	if (obj && obj->getParentUUID() == LLAppearanceManager::instance().getCOF())
+	{
+		return;
+	}
+	mFolders->setSelectionByID(obj_id, take_keyboard_focus);
+}
+
+void LLInventoryPanel::clearSelection()
+{
+	mFolders->clearSelection();
+}
+
+void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& items, BOOL user_action)
+{
+	LLFolderView* fv = getRootFolder();
+	if (fv->needsAutoRename()) // auto-selecting a new user-created asset and preparing to rename
+	{
+		fv->setNeedsAutoRename(FALSE);
+		if (items.size()) // new asset is visible and selected
+		{
+			fv->startRenamingSelectedItem();
+		}
+	}
+	// Seraph - Put determineFolderType in here for ensemble typing?
+}
+
+//----------------------------------------------------------------------------
+
+void LLInventoryPanel::doToSelected(const LLSD& userdata)
+{
+	mFolders->doToSelected(&gInventory, userdata);
+}
+
+void LLInventoryPanel::doCreate(const LLSD& userdata)
+{
+	menu_create_inventory_item(mFolders, LLFolderBridge::sSelf, userdata);
+}
+
+bool LLInventoryPanel::beginIMSession()
+{
+	std::set<LLUUID> selected_items;
+	mFolders->getSelectionList(selected_items);
+
+	std::string name;
+	static int session_num = 1;
+
+	LLDynamicArray<LLUUID> members;
+	EInstantMessage type = IM_SESSION_CONFERENCE_START;
+
+	std::set<LLUUID>::const_iterator iter;
+	for (iter = selected_items.begin(); iter != selected_items.end(); iter++)
+	{
+
+		LLUUID item = *iter;
+		LLFolderViewItem* folder_item = mFolders->getItemByID(item);
+			
+		if(folder_item) 
+		{
+			LLFolderViewEventListener* fve_listener = folder_item->getListener();
+			if (fve_listener && (fve_listener->getInventoryType() == LLInventoryType::IT_CATEGORY))
+			{
+
+				LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getListener();
+				if(!bridge) return true;
+				LLViewerInventoryCategory* cat = bridge->getCategory();
+				if(!cat) return true;
+				name = cat->getName();
+				LLUniqueBuddyCollector is_buddy;
+				LLInventoryModel::cat_array_t cat_array;
+				LLInventoryModel::item_array_t item_array;
+				gInventory.collectDescendentsIf(bridge->getUUID(),
+												cat_array,
+												item_array,
+												LLInventoryModel::EXCLUDE_TRASH,
+												is_buddy);
+				S32 count = item_array.count();
+				if(count > 0)
+				{
+					LLFloaterReg::showInstance("communicate");
+					// create the session
+					LLAvatarTracker& at = LLAvatarTracker::instance();
+					LLUUID id;
+					for(S32 i = 0; i < count; ++i)
+					{
+						id = item_array.get(i)->getCreatorUUID();
+						if(at.isBuddyOnline(id))
+						{
+							members.put(id);
+						}
+					}
+				}
+			}
+			else
+			{
+				LLFolderViewItem* folder_item = mFolders->getItemByID(item);
+				if(!folder_item) return true;
+				LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getListener();
+
+				if (listenerp->getInventoryType() == LLInventoryType::IT_CALLINGCARD)
+				{
+					LLInventoryItem* inv_item = gInventory.getItem(listenerp->getUUID());
+
+					if (inv_item)
+					{
+						LLAvatarTracker& at = LLAvatarTracker::instance();
+						LLUUID id = inv_item->getCreatorUUID();
+
+						if(at.isBuddyOnline(id))
+						{
+							members.put(id);
+						}
+					}
+				} //if IT_CALLINGCARD
+			} //if !IT_CATEGORY
+		}
+	} //for selected_items	
+
+	// the session_id is randomly generated UUID which will be replaced later
+	// with a server side generated number
+
+	if (name.empty())
+	{
+		name = llformat("Session %d", session_num++);
+	}
+
+	LLUUID session_id = gIMMgr->addSession(name, type, members[0], members);
+	if (session_id != LLUUID::null)
+	{
+		LLIMFloater::show(session_id);
+	}
+		
+	return true;
+}
+
+bool LLInventoryPanel::attachObject(const LLSD& userdata)
+{
+	std::set<LLUUID> selected_items;
+	mFolders->getSelectionList(selected_items);
+
+	std::string joint_name = userdata.asString();
+	LLVOAvatar *avatarp = static_cast<LLVOAvatar*>(gAgent.getAvatarObject());
+	LLViewerJointAttachment* attachmentp = NULL;
+	for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); 
+		 iter != avatarp->mAttachmentPoints.end(); )
+	{
+		LLVOAvatar::attachment_map_t::iterator curiter = iter++;
+		LLViewerJointAttachment* attachment = curiter->second;
+		if (attachment->getName() == joint_name)
+		{
+			attachmentp = attachment;
+			break;
+		}
+	}
+	if (attachmentp == NULL)
+	{
+		return true;
+	}
+
+	for (std::set<LLUUID>::const_iterator set_iter = selected_items.begin(); 
+		 set_iter != selected_items.end(); 
+		 ++set_iter)
+	{
+		const LLUUID &id = *set_iter;
+		LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(id);
+		if(item && gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID()))
+		{
+			rez_attachment(item, attachmentp);
+		}
+		else if(item && item->isComplete())
+		{
+			// must be in library. copy it to our inventory and put it on.
+			LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(attachmentp);
+			copy_inventory_item(gAgent.getID(),
+								item->getPermissions().getOwner(),
+								item->getUUID(),
+								LLUUID::null,
+								std::string(),
+								cb);
+		}
+	}
+	gFocusMgr.setKeyboardFocus(NULL);
+
+	return true;
+}
+
+
+//----------------------------------------------------------------------------
+
+// static DEBUG ONLY:
+void LLInventoryPanel::dumpSelectionInformation(void* user_data)
+{
+	LLInventoryPanel* iv = (LLInventoryPanel*)user_data;
+	iv->mFolders->dumpSelectionInformation();
+}
+
+BOOL LLInventoryPanel::getSinceLogoff()
+{
+	return mFolders->getFilter()->isSinceLogoff();
+}
+
+void example_param_block_usage()
+{
+	LLInventoryPanel::Params param_block;
+	param_block.name(std::string("inventory"));
+
+	param_block.sort_order_setting(LLInventoryPanel::RECENTITEMS_SORT_ORDER);
+	param_block.allow_multi_select(true);
+	param_block.filter(LLInventoryPanel::Filter()
+			.sort_order(1)
+			.types(0xffff0000));
+	param_block.inventory(&gInventory);
+	param_block.has_border(true);
+
+	LLUICtrlFactory::create<LLInventoryPanel>(param_block);
+
+	param_block = LLInventoryPanel::Params();
+	param_block.name(std::string("inventory"));
+
+	//LLSD param_block_sd;
+	//param_block_sd["sort_order_setting"] = LLInventoryPanel::RECENTITEMS_SORT_ORDER;
+	//param_block_sd["allow_multi_select"] = true;
+	//param_block_sd["filter"]["sort_order"] = 1;
+	//param_block_sd["filter"]["types"] = (S32)0xffff0000;
+	//param_block_sd["has_border"] = true;
+
+	//LLInitParam::LLSDParser(param_block_sd).parse(param_block);
+
+	LLUICtrlFactory::create<LLInventoryPanel>(param_block);
+}
+
+// +=================================================+
+// |        LLInventoryPanelObserver                 |
+// +=================================================+
+void LLInventoryPanelObserver::changed(U32 mask)
+{
+	mIP->modelChanged(mask);
+}
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index 5e23662a0bd..40319d949db 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -195,7 +195,7 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
 		childSetEnabled("teleport_btn", FALSE);
 		childSetEnabled("pay_btn", FALSE);
 
-        getChild<LLTextBox>("avatar_name")->setValue(im_session->mName);
+        getChild<LLTextBox>("avatar_name")->setValue(im_session->mName);
 	}
 	else
 	{
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 9f723169e12..74c1420cf37 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -1,1022 +1,1022 @@
-/** 
- * @file llsidepanelmaininventory.cpp
- * @brief Implementation of llsidepanelmaininventory.
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- * 
- * Copyright (c) 2001-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-#include "llpanelmaininventory.h"
-
-#include "lldndbutton.h"
-#include "llfilepicker.h"
-#include "llfloaterinventory.h"
-#include "llinventorybridge.h"
-#include "llinventoryfunctions.h"
-#include "llinventorypanel.h"
-#include "llfiltereditor.h"
-#include "llfloaterreg.h"
-#include "llpreviewtexture.h"
-#include "llscrollcontainer.h"
-#include "llsdserialize.h"
-#include "llspinctrl.h"
-#include "lltooldraganddrop.h"
-#include "llviewermenu.h"
-#include "llviewertexturelist.h"
-
-static LLRegisterPanelClassWrapper<LLPanelMainInventory> t_inventory("panel_main_inventory");
-
-void on_file_loaded_for_save(BOOL success, 
-							 LLViewerFetchedTexture *src_vi,
-							 LLImageRaw* src, 
-							 LLImageRaw* aux_src, 
-							 S32 discard_level,
-							 BOOL final,
-							 void* userdata);
-
-///----------------------------------------------------------------------------
-/// LLFloaterInventoryFinder
-///----------------------------------------------------------------------------
-
-class LLFloaterInventoryFinder : public LLFloater
-{
-public:
-	LLFloaterInventoryFinder( LLPanelMainInventory* inventory_view);
-	virtual void draw();
-	/*virtual*/	BOOL	postBuild();
-	void changeFilter(LLInventoryFilter* filter);
-	void updateElementsFromFilter();
-	BOOL getCheckShowEmpty();
-	BOOL getCheckSinceLogoff();
-
-	static void onTimeAgo(LLUICtrl*, void *);
-	static void onCheckSinceLogoff(LLUICtrl*, void *);
-	static void onCloseBtn(void* user_data);
-	static void selectAllTypes(void* user_data);
-	static void selectNoTypes(void* user_data);
-private:
-	LLPanelMainInventory*	mPanelMainInventory;
-	LLSpinCtrl*			mSpinSinceDays;
-	LLSpinCtrl*			mSpinSinceHours;
-	LLInventoryFilter*	mFilter;
-};
-
-///----------------------------------------------------------------------------
-/// LLPanelMainInventory
-///----------------------------------------------------------------------------
-
-LLPanelMainInventory::LLPanelMainInventory()
-	: LLPanel(),
-	  mActivePanel(NULL),
-	  mSavedFolderState(NULL),
-	  mFilterText(""),
-	  mMenuGearDefault(NULL),
-	  mMenuAdd(NULL)
-{
-	LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_INIT);
-	// Menu Callbacks (non contex menus)
-	mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelMainInventory::doToSelected, this, _2));
-	mCommitCallbackRegistrar.add("Inventory.CloseAllFolders", boost::bind(&LLPanelMainInventory::closeAllFolders, this));
-	mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH));
-	mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND));
-	mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLPanelMainInventory::doCreate, this, _2));
- 	mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow, this));
-	mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLPanelMainInventory::toggleFindOptions, this));
-	mCommitCallbackRegistrar.add("Inventory.ResetFilters", boost::bind(&LLPanelMainInventory::resetFilters, this));
-	mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLPanelMainInventory::setSortBy, this, _2));
-
-	// Controls
-	// *TODO: Just use persistant settings for each of these
-	U32 sort_order = gSavedSettings.getU32("InventorySortOrder");
-	BOOL sort_by_name = ! ( sort_order & LLInventoryFilter::SO_DATE );
-	BOOL sort_folders_by_name = ( sort_order & LLInventoryFilter::SO_FOLDERS_BY_NAME );
-	BOOL sort_system_folders_to_top = ( sort_order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP );
-	
-	gSavedSettings.declareBOOL("Inventory.SortByName", sort_by_name, "Declared in code", FALSE);
-	gSavedSettings.declareBOOL("Inventory.SortByDate", !sort_by_name, "Declared in code", FALSE);
-	gSavedSettings.declareBOOL("Inventory.FoldersAlwaysByName", sort_folders_by_name, "Declared in code", FALSE);
-	gSavedSettings.declareBOOL("Inventory.SystemFoldersToTop", sort_system_folders_to_top, "Declared in code", FALSE);
-	
-	mSavedFolderState = new LLSaveFolderState();
-	mSavedFolderState->setApply(FALSE);
-}
-
-BOOL LLPanelMainInventory::postBuild()
-{
-	gInventory.addObserver(this);
-	
-	mFilterTabs = getChild<LLTabContainer>("inventory filter tabs");
-	mFilterTabs->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterSelected, this));
-	
-	//panel->getFilter()->markDefault();
-
-	// Set up the default inv. panel/filter settings.
-	mActivePanel = getChild<LLInventoryPanel>("All Items");
-	if (mActivePanel)
-	{
-		// "All Items" is the previous only view, so it gets the InventorySortOrder
-		mActivePanel->setSortOrder(gSavedSettings.getU32("InventorySortOrder"));
-		mActivePanel->getFilter()->markDefault();
-		mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
-		mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2));
-	}
-	LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
-	if (recent_items_panel)
-	{
-		recent_items_panel->setSinceLogoff(TRUE);
-		recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE);
-		recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
-		recent_items_panel->getFilter()->markDefault();
-		recent_items_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, recent_items_panel, _1, _2));
-	}
-
-	// Now load the stored settings from disk, if available.
-	std::ostringstream filterSaveName;
-	filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml");
-	llinfos << "LLPanelMainInventory::init: reading from " << filterSaveName << llendl;
-	llifstream file(filterSaveName.str());
-	LLSD savedFilterState;
-	if (file.is_open())
-	{
-		LLSDSerialize::fromXML(savedFilterState, file);
-		file.close();
-
-		// Load the persistent "Recent Items" settings.
-		// Note that the "All Items" settings do not persist.
-		if(recent_items_panel)
-		{
-			if(savedFilterState.has(recent_items_panel->getFilter()->getName()))
-			{
-				LLSD recent_items = savedFilterState.get(
-					recent_items_panel->getFilter()->getName());
-				recent_items_panel->getFilter()->fromLLSD(recent_items);
-			}
-		}
-
-	}
-
-	mFilterEditor = getChild<LLFilterEditor>("inventory search editor");
-	if (mFilterEditor)
-	{
-		mFilterEditor->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterEdit, this, _2));
-	}
-
-	// *TODO:Get the cost info from the server
-	const std::string upload_cost("10");
-	childSetLabelArg("Upload Image", "[COST]", upload_cost);
-	childSetLabelArg("Upload Sound", "[COST]", upload_cost);
-	childSetLabelArg("Upload Animation", "[COST]", upload_cost);
-	childSetLabelArg("Bulk Upload", "[COST]", upload_cost);
-
-	initListCommandsHandlers();
-	return TRUE;
-}
-
-// Destroys the object
-LLPanelMainInventory::~LLPanelMainInventory( void )
-{
-	// Save the filters state.
-	LLSD filterRoot;
-	LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>("All Items");
-	if (all_items_panel)
-	{
-		LLInventoryFilter* filter = all_items_panel->getFilter();
-		if (filter)
-		{
-			LLSD filterState;
-			filter->toLLSD(filterState);
-			filterRoot[filter->getName()] = filterState;
-		}
-	}
-
-	LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
-	if (recent_items_panel)
-	{
-		LLInventoryFilter* filter = recent_items_panel->getFilter();
-		if (filter)
-		{
-			LLSD filterState;
-			filter->toLLSD(filterState);
-			filterRoot[filter->getName()] = filterState;
-		}
-	}
-
-	std::ostringstream filterSaveName;
-	filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml");
-	llofstream filtersFile(filterSaveName.str());
-	if(!LLSDSerialize::toPrettyXML(filterRoot, filtersFile))
-	{
-		llwarns << "Could not write to filters save file " << filterSaveName << llendl;
-	}
-	else
-		filtersFile.close();
-
-	gInventory.removeObserver(this);
-	delete mSavedFolderState;
-}
-
-void LLPanelMainInventory::startSearch()
-{
-	// this forces focus to line editor portion of search editor
-	if (mFilterEditor)
-	{
-		mFilterEditor->focusFirstItem(TRUE);
-	}
-}
-
-BOOL LLPanelMainInventory::handleKeyHere(KEY key, MASK mask)
-{
-	LLFolderView* root_folder = mActivePanel ? mActivePanel->getRootFolder() : NULL;
-	if (root_folder)
-	{
-		// first check for user accepting current search results
-		if (mFilterEditor 
-			&& mFilterEditor->hasFocus()
-		    && (key == KEY_RETURN 
-		    	|| key == KEY_DOWN)
-		    && mask == MASK_NONE)
-		{
-			// move focus to inventory proper
-			mActivePanel->setFocus(TRUE);
-			root_folder->scrollToShowSelection();
-			return TRUE;
-		}
-
-		if (mActivePanel->hasFocus() && key == KEY_UP)
-		{
-			startSearch();
-		}
-	}
-
-	return LLPanel::handleKeyHere(key, mask);
-
-}
-
-//----------------------------------------------------------------------------
-// menu callbacks
-
-void LLPanelMainInventory::doToSelected(const LLSD& userdata)
-{
-	getPanel()->getRootFolder()->doToSelected(&gInventory, userdata);
-}
-
-void LLPanelMainInventory::closeAllFolders()
-{
-	getPanel()->getRootFolder()->closeAllFolders();
-}
-
-void LLPanelMainInventory::newWindow()
-{
-	LLFloaterInventory::showAgentInventory();
-}
-
-void LLPanelMainInventory::doCreate(const LLSD& userdata)
-{
-	menu_create_inventory_item(getPanel()->getRootFolder(), NULL, userdata);
-}
-
-void LLPanelMainInventory::resetFilters()
-{
-	LLFloaterInventoryFinder *finder = getFinder();
-	getActivePanel()->getFilter()->resetDefault();
-	if (finder)
-	{
-		finder->updateElementsFromFilter();
-	}
-
-	setFilterTextFromFilter();
-}
-
-void LLPanelMainInventory::setSortBy(const LLSD& userdata)
-{
-	std::string sort_field = userdata.asString();
-	if (sort_field == "name")
-	{
-		U32 order = getActivePanel()->getSortOrder();
-		getActivePanel()->setSortOrder( order & ~LLInventoryFilter::SO_DATE );
-			
-		gSavedSettings.setBOOL("Inventory.SortByName", TRUE );
-		gSavedSettings.setBOOL("Inventory.SortByDate", FALSE );
-	}
-	else if (sort_field == "date")
-	{
-		U32 order = getActivePanel()->getSortOrder();
-		getActivePanel()->setSortOrder( order | LLInventoryFilter::SO_DATE );
-
-		gSavedSettings.setBOOL("Inventory.SortByName", FALSE );
-		gSavedSettings.setBOOL("Inventory.SortByDate", TRUE );
-	}
-	else if (sort_field == "foldersalwaysbyname")
-	{
-		U32 order = getActivePanel()->getSortOrder();
-		if ( order & LLInventoryFilter::SO_FOLDERS_BY_NAME )
-		{
-			order &= ~LLInventoryFilter::SO_FOLDERS_BY_NAME;
-
-			gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", FALSE );
-		}
-		else
-		{
-			order |= LLInventoryFilter::SO_FOLDERS_BY_NAME;
-
-			gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", TRUE );
-		}
-		getActivePanel()->setSortOrder( order );
-	}
-	else if (sort_field == "systemfolderstotop")
-	{
-		U32 order = getActivePanel()->getSortOrder();
-		if ( order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP )
-		{
-			order &= ~LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
-
-			gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", FALSE );
-		}
-		else
-		{
-			order |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
-
-			gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", TRUE );
-		}
-		getActivePanel()->setSortOrder( order );
-	}
-}
-
-// static
-BOOL LLPanelMainInventory::filtersVisible(void* user_data)
-{
-	LLPanelMainInventory* self = (LLPanelMainInventory*)user_data;
-	if(!self) return FALSE;
-
-	return self->getFinder() != NULL;
-}
-
-void LLPanelMainInventory::onClearSearch()
-{
-	LLFloater *finder = getFinder();
-	if (mActivePanel)
-	{
-		mActivePanel->setFilterSubString(LLStringUtil::null);
-		mActivePanel->setFilterTypes(0xffffffff);
-	}
-
-	if (finder)
-	{
-		LLFloaterInventoryFinder::selectAllTypes(finder);
-	}
-
-	// re-open folders that were initially open
-	if (mActivePanel)
-	{
-		mSavedFolderState->setApply(TRUE);
-		mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
-		LLOpenFoldersWithSelection opener;
-		mActivePanel->getRootFolder()->applyFunctorRecursively(opener);
-		mActivePanel->getRootFolder()->scrollToShowSelection();
-	}
-}
-
-void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
-{
-	if (search_string == "")
-	{
-		onClearSearch();
-	}
-	if (!mActivePanel)
-	{
-		return;
-	}
-
-	gInventory.startBackgroundFetch();
-
-	std::string uppercase_search_string = search_string;
-	LLStringUtil::toUpper(uppercase_search_string);
-	if (mActivePanel->getFilterSubString().empty() && uppercase_search_string.empty())
-	{
-			// current filter and new filter empty, do nothing
-			return;
-	}
-
-	// save current folder open state if no filter currently applied
-	if (!mActivePanel->getRootFolder()->isFilterModified())
-	{
-		mSavedFolderState->setApply(FALSE);
-		mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
-	}
-
-	// set new filter string
-	mActivePanel->setFilterSubString(uppercase_search_string);
-}
-
-
- //static
- BOOL LLPanelMainInventory::incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward)
- {
- 	LLPanelMainInventory* active_view = NULL;
-	
-	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
-	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
-	{
-		LLPanelMainInventory* iv = dynamic_cast<LLPanelMainInventory*>(*iter);
-		if (iv)
-		{
-			if (gFocusMgr.childHasKeyboardFocus(iv))
-			{
-				active_view = iv;
-				break;
-			}
- 		}
- 	}
-
- 	if (!active_view)
- 	{
- 		return FALSE;
- 	}
-
- 	std::string search_string(find_text);
-
- 	if (search_string.empty())
- 	{
- 		return FALSE;
- 	}
-
- 	if (active_view->getPanel() &&
- 		active_view->getPanel()->getRootFolder()->search(first_item, search_string, backward))
- 	{
- 		return TRUE;
- 	}
-
- 	return FALSE;
- }
-
-void LLPanelMainInventory::onFilterSelected()
-{
-	// Find my index
-	mActivePanel = (LLInventoryPanel*)childGetVisibleTab("inventory filter tabs");
-
-	if (!mActivePanel)
-	{
-		return;
-	}
-	LLInventoryFilter* filter = mActivePanel->getFilter();
-	LLFloaterInventoryFinder *finder = getFinder();
-	if (finder)
-	{
-		finder->changeFilter(filter);
-	}
-	if (filter->isActive())
-	{
-		// If our filter is active we may be the first thing requiring a fetch so we better start it here.
-		gInventory.startBackgroundFetch();
-	}
-	setFilterTextFromFilter();
-}
-
-const std::string LLPanelMainInventory::getFilterSubString() 
-{ 
-	return mActivePanel->getFilterSubString(); 
-}
-
-void LLPanelMainInventory::setFilterSubString(const std::string& string) 
-{ 
-	mActivePanel->setFilterSubString(string); 
-}
-
-BOOL LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
-										 EDragAndDropType cargo_type,
-										 void* cargo_data,
-										 EAcceptance* accept,
-										 std::string& tooltip_msg)
-{
-	// Check to see if we are auto scrolling from the last frame
-	LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel();
-	BOOL needsToScroll = panel->getScrollableContainer()->autoScroll(x, y);
-	if(mFilterTabs)
-	{
-		if(needsToScroll)
-		{
-			mFilterTabs->startDragAndDropDelayTimer();
-		}
-	}
-	
-	BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
-
-	return handled;
-}
-
-void LLPanelMainInventory::changed(U32 mask)
-{
-}
-
-
-void LLPanelMainInventory::setFilterTextFromFilter() 
-{ 
-	mFilterText = mActivePanel->getFilter()->getFilterText(); 
-}
-
-void LLPanelMainInventory::toggleFindOptions()
-{
-	LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_TOGGLE);
-	LLFloater *floater = getFinder();
-	if (!floater)
-	{
-		LLFloaterInventoryFinder * finder = new LLFloaterInventoryFinder(this);
-		mFinderHandle = finder->getHandle();
-		finder->openFloater();
-
-		LLFloater* parent_floater = gFloaterView->getParentFloater(this);
-		if (parent_floater) // Seraph: Fix this, shouldn't be null even for sidepanel
-			parent_floater->addDependentFloater(mFinderHandle);
-		// start background fetch of folders
-		gInventory.startBackgroundFetch();
-	}
-	else
-	{
-		floater->closeFloater();
-	}
-}
-
-void LLPanelMainInventory::setSelectCallback(const LLFolderView::signal_t::slot_type& cb)
-{
-	getChild<LLInventoryPanel>("All Items")->setSelectCallback(cb);
-	getChild<LLInventoryPanel>("Recent Items")->setSelectCallback(cb);
-}
-
-void LLPanelMainInventory::onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action)
-{
-	updateListCommands();
-	panel->onSelectionChange(items, user_action);
-}
-
-///----------------------------------------------------------------------------
-/// LLFloaterInventoryFinder
-///----------------------------------------------------------------------------
-
-LLFloaterInventoryFinder* LLPanelMainInventory::getFinder() 
-{ 
-	return (LLFloaterInventoryFinder*)mFinderHandle.get();
-}
-
-
-LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLPanelMainInventory* inventory_view) :	
-	LLFloater(LLSD()),
-	mPanelMainInventory(inventory_view),
-	mFilter(inventory_view->getPanel()->getFilter())
-{
-	LLUICtrlFactory::getInstance()->buildFloater(this, "floater_inventory_view_finder.xml", NULL);
-	updateElementsFromFilter();
-}
-
-
-void LLFloaterInventoryFinder::onCheckSinceLogoff(LLUICtrl *ctrl, void *user_data)
-{
-	LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data;
-	if (!self) return;
-
-	bool since_logoff= self->childGetValue("check_since_logoff");
-	
-	if (!since_logoff && 
-	    !(  self->mSpinSinceDays->get() ||  self->mSpinSinceHours->get() ) )
-	{
-		self->mSpinSinceHours->set(1.0f);
-	}	
-}
-BOOL LLFloaterInventoryFinder::postBuild()
-{
-	const LLRect& viewrect = mPanelMainInventory->getRect();
-	setRect(LLRect(viewrect.mLeft - getRect().getWidth(), viewrect.mTop, viewrect.mLeft, viewrect.mTop - getRect().getHeight()));
-
-	childSetAction("All", selectAllTypes, this);
-	childSetAction("None", selectNoTypes, this);
-
-	mSpinSinceHours = getChild<LLSpinCtrl>("spin_hours_ago");
-	childSetCommitCallback("spin_hours_ago", onTimeAgo, this);
-
-	mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago");
-	childSetCommitCallback("spin_days_ago", onTimeAgo, this);
-
-	//	mCheckSinceLogoff   = getChild<LLSpinCtrl>("check_since_logoff");
-	childSetCommitCallback("check_since_logoff", onCheckSinceLogoff, this);
-
-	childSetAction("Close", onCloseBtn, this);
-
-	updateElementsFromFilter();
-	return TRUE;
-}
-void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data)
-{
-	LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data;
-	if (!self) return;
-	
-	bool since_logoff=true;
-	if ( self->mSpinSinceDays->get() ||  self->mSpinSinceHours->get() )
-	{
-		since_logoff = false;
-	}
-	self->childSetValue("check_since_logoff", since_logoff);
-}
-
-void LLFloaterInventoryFinder::changeFilter(LLInventoryFilter* filter)
-{
-	mFilter = filter;
-	updateElementsFromFilter();
-}
-
-void LLFloaterInventoryFinder::updateElementsFromFilter()
-{
-	if (!mFilter)
-		return;
-
-	// Get data needed for filter display
-	U32 filter_types = mFilter->getFilterTypes();
-	std::string filter_string = mFilter->getFilterSubString();
-	LLInventoryFilter::EFolderShow show_folders = mFilter->getShowFolderState();
-	U32 hours = mFilter->getHoursAgo();
-
-	// update the ui elements
-	setTitle(mFilter->getName());
-
-	childSetValue("check_animation", (S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION));
-
-	childSetValue("check_calling_card", (S32) (filter_types & 0x1 << LLInventoryType::IT_CALLINGCARD));
-	childSetValue("check_clothing", (S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE));
-	childSetValue("check_gesture", (S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE));
-	childSetValue("check_landmark", (S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK));
-	childSetValue("check_notecard", (S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD));
-	childSetValue("check_object", (S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT));
-	childSetValue("check_script", (S32) (filter_types & 0x1 << LLInventoryType::IT_LSL));
-	childSetValue("check_sound", (S32) (filter_types & 0x1 << LLInventoryType::IT_SOUND));
-	childSetValue("check_texture", (S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE));
-	childSetValue("check_snapshot", (S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT));
-	childSetValue("check_show_empty", show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS);
-	childSetValue("check_since_logoff", mFilter->isSinceLogoff());
-	mSpinSinceHours->set((F32)(hours % 24));
-	mSpinSinceDays->set((F32)(hours / 24));
-}
-
-void LLFloaterInventoryFinder::draw()
-{
-	LLMemType mt(LLMemType::MTYPE_INVENTORY_DRAW);
-	U32 filter = 0xffffffff;
-	BOOL filtered_by_all_types = TRUE;
-
-	if (!childGetValue("check_animation"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_ANIMATION);
-		filtered_by_all_types = FALSE;
-	}
-
-
-	if (!childGetValue("check_calling_card"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_CALLINGCARD);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!childGetValue("check_clothing"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_WEARABLE);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!childGetValue("check_gesture"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_GESTURE);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!childGetValue("check_landmark"))
-
-
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_LANDMARK);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!childGetValue("check_notecard"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_NOTECARD);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!childGetValue("check_object"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_OBJECT);
-		filter &= ~(0x1 << LLInventoryType::IT_ATTACHMENT);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!childGetValue("check_script"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_LSL);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!childGetValue("check_sound"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_SOUND);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!childGetValue("check_texture"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_TEXTURE);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!childGetValue("check_snapshot"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_SNAPSHOT);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!filtered_by_all_types)
-	{
-		// don't include folders in filter, unless I've selected everything
-		filter &= ~(0x1 << LLInventoryType::IT_CATEGORY);
-	}
-
-	// update the panel, panel will update the filter
-	mPanelMainInventory->getPanel()->setShowFolderState(getCheckShowEmpty() ?
-		LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
-	mPanelMainInventory->getPanel()->setFilterTypes(filter);
-	if (getCheckSinceLogoff())
-	{
-		mSpinSinceDays->set(0);
-		mSpinSinceHours->set(0);
-	}
-	U32 days = (U32)mSpinSinceDays->get();
-	U32 hours = (U32)mSpinSinceHours->get();
-	if (hours > 24)
-	{
-		days += hours / 24;
-		hours = (U32)hours % 24;
-		mSpinSinceDays->set((F32)days);
-		mSpinSinceHours->set((F32)hours);
-	}
-	hours += days * 24;
-	mPanelMainInventory->getPanel()->setHoursAgo(hours);
-	mPanelMainInventory->getPanel()->setSinceLogoff(getCheckSinceLogoff());
-	mPanelMainInventory->setFilterTextFromFilter();
-
-	LLPanel::draw();
-}
-
-BOOL LLFloaterInventoryFinder::getCheckShowEmpty()
-{
-	return childGetValue("check_show_empty");
-}
-
-BOOL LLFloaterInventoryFinder::getCheckSinceLogoff()
-{
-	return childGetValue("check_since_logoff");
-}
-
-void LLFloaterInventoryFinder::onCloseBtn(void* user_data)
-{
-	LLFloaterInventoryFinder* finderp = (LLFloaterInventoryFinder*)user_data;
-	finderp->closeFloater();
-}
-
-// static
-void LLFloaterInventoryFinder::selectAllTypes(void* user_data)
-{
-	LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data;
-	if(!self) return;
-
-	self->childSetValue("check_animation", TRUE);
-	self->childSetValue("check_calling_card", TRUE);
-	self->childSetValue("check_clothing", TRUE);
-	self->childSetValue("check_gesture", TRUE);
-	self->childSetValue("check_landmark", TRUE);
-	self->childSetValue("check_notecard", TRUE);
-	self->childSetValue("check_object", TRUE);
-	self->childSetValue("check_script", TRUE);
-	self->childSetValue("check_sound", TRUE);
-	self->childSetValue("check_texture", TRUE);
-	self->childSetValue("check_snapshot", TRUE);
-}
-
-//static
-void LLFloaterInventoryFinder::selectNoTypes(void* user_data)
-{
-	LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data;
-	if(!self) return;
-
-	self->childSetValue("check_animation", FALSE);
-	self->childSetValue("check_calling_card", FALSE);
-	self->childSetValue("check_clothing", FALSE);
-	self->childSetValue("check_gesture", FALSE);
-	self->childSetValue("check_landmark", FALSE);
-	self->childSetValue("check_notecard", FALSE);
-	self->childSetValue("check_object", FALSE);
-	self->childSetValue("check_script", FALSE);
-	self->childSetValue("check_sound", FALSE);
-	self->childSetValue("check_texture", FALSE);
-	self->childSetValue("check_snapshot", FALSE);
-}
-
-//////////////////////////////////////////////////////////////////////////////////
-// List Commands                                                                //
-
-void LLPanelMainInventory::initListCommandsHandlers()
-{
-	mListCommands = getChild<LLPanel>("bottom_panel");
-
-	mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this));
-	mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this));
-	mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
-
-	LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");
-	trash_btn->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this
-			,	_4 // BOOL drop
-			,	_5 // EDragAndDropType cargo_type
-			,	_7 // EAcceptance* accept
-			));
-
-	mCommitCallbackRegistrar.add("Inventory.GearDefault.Custom.Action", boost::bind(&LLPanelMainInventory::onCustomAction, this, _2));
-	mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2));
-	mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-	mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-	
-}
-
-void LLPanelMainInventory::updateListCommands()
-{
-	bool trash_enabled = isActionEnabled("delete");
-
-	mListCommands->childSetEnabled("trash_btn", trash_enabled);
-}
-
-void LLPanelMainInventory::onGearButtonClick()
-{
-	showActionMenu(mMenuGearDefault,"options_gear_btn");
-}
-
-void LLPanelMainInventory::onAddButtonClick()
-{
-	showActionMenu(mMenuAdd,"add_btn");
-}
-
-void LLPanelMainInventory::showActionMenu(LLMenuGL* menu, std::string spawning_view_name)
-{
-	if (menu)
-	{
-		menu->buildDrawLabels();
-		menu->updateParent(LLMenuGL::sMenuContainer);
-		LLView* spawning_view = getChild<LLView> (spawning_view_name);
-		S32 menu_x, menu_y;
-		//show menu in co-ordinates of panel
-		spawning_view->localPointToOtherView(0, spawning_view->getRect().getHeight(), &menu_x, &menu_y, this);
-		menu_y += menu->getRect().getHeight();
-		LLMenuGL::showPopup(this, menu, menu_x, menu_y);
-	}
-}
-
-void LLPanelMainInventory::onTrashButtonClick()
-{
-	onClipboardAction("delete");
-}
-
-void LLPanelMainInventory::onClipboardAction(const LLSD& userdata)
-{
-	std::string command_name = userdata.asString();
-	getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name);
-}
-
-void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
-{
-	if (!isActionEnabled(userdata))
-		return;
-
-	const std::string command_name = userdata.asString();
-	if (command_name == "new_window")
-	{
-		newWindow();
-	}
-	if (command_name == "sort_by_name")
-	{
-		const LLSD arg = "name";
-		setSortBy(arg);
-	}
-	if (command_name == "sort_by_recent")
-	{
-		const LLSD arg = "date";
-		setSortBy(arg);
-	}
-	if (command_name == "show_filters")
-	{
-		toggleFindOptions();
-	}
-	if (command_name == "reset_filters")
-	{
-		resetFilters();
-	}
-	if (command_name == "close_folders")
-	{
-		closeAllFolders();
-	}
-	if (command_name == "empty_trash")
-	{
-		const std::string notification = "ConfirmEmptyTrash";
-		gInventory.emptyFolderType(notification, LLFolderType::FT_TRASH);
-	}
-	if (command_name == "empty_lostnfound")
-	{
-		const std::string notification = "ConfirmEmptyLostAndFound";
-		gInventory.emptyFolderType(notification, LLFolderType::FT_LOST_AND_FOUND);
-	}
-	if (command_name == "save_texture")
-	{
-		LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
-		if (!current_item)
-		{
-			return;
-		}
-
-		const LLUUID& item_id = current_item->getListener()->getUUID();
-		LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES);
-		if (preview_texture)
-		{
-			preview_texture->openToSave();
-		}
-	}
-}
-
-BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
-{
-	const std::string command_name = userdata.asString();
-	if (command_name == "delete")
-	{
-		BOOL can_delete = FALSE;
-		LLFolderView *folder = getActivePanel()->getRootFolder();
-		if (folder)
-		{
-			can_delete = TRUE;
-			std::set<LLUUID> selection_set;
-			folder->getSelectionList(selection_set);
-			for (std::set<LLUUID>::iterator iter = selection_set.begin();
-				 iter != selection_set.end();
-				 ++iter)
-			{
-				const LLUUID &item_id = (*iter);
-				LLFolderViewItem *item = folder->getItemByID(item_id);
-				can_delete &= item->getListener()->isItemRemovable();
-			}
-			return can_delete;
-		}
-		return FALSE;
-	}
-	if (command_name == "save_texture")
-	{
-		LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
-		if (current_item)
-		{
-			return (current_item->getListener()->getInventoryType() == LLInventoryType::IT_TEXTURE);
-		}
-		return FALSE;
-	}
-	return TRUE;
-}
-
-bool LLPanelMainInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept)
-{
-	*accept = ACCEPT_NO;
-
-	const bool is_enabled = isActionEnabled("delete");
-	if (is_enabled) *accept = ACCEPT_YES_MULTI;
-
-	if (is_enabled && drop)
-	{
-		onClipboardAction("delete");
-	}
-	return true;
-}
-
-// List Commands                                                              //
-////////////////////////////////////////////////////////////////////////////////
+/** 
+ * @file llsidepanelmaininventory.cpp
+ * @brief Implementation of llsidepanelmaininventory.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llpanelmaininventory.h"
+
+#include "lldndbutton.h"
+#include "llfilepicker.h"
+#include "llfloaterinventory.h"
+#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
+#include "llinventorypanel.h"
+#include "llfiltereditor.h"
+#include "llfloaterreg.h"
+#include "llpreviewtexture.h"
+#include "llscrollcontainer.h"
+#include "llsdserialize.h"
+#include "llspinctrl.h"
+#include "lltooldraganddrop.h"
+#include "llviewermenu.h"
+#include "llviewertexturelist.h"
+
+static LLRegisterPanelClassWrapper<LLPanelMainInventory> t_inventory("panel_main_inventory");
+
+void on_file_loaded_for_save(BOOL success, 
+							 LLViewerFetchedTexture *src_vi,
+							 LLImageRaw* src, 
+							 LLImageRaw* aux_src, 
+							 S32 discard_level,
+							 BOOL final,
+							 void* userdata);
+
+///----------------------------------------------------------------------------
+/// LLFloaterInventoryFinder
+///----------------------------------------------------------------------------
+
+class LLFloaterInventoryFinder : public LLFloater
+{
+public:
+	LLFloaterInventoryFinder( LLPanelMainInventory* inventory_view);
+	virtual void draw();
+	/*virtual*/	BOOL	postBuild();
+	void changeFilter(LLInventoryFilter* filter);
+	void updateElementsFromFilter();
+	BOOL getCheckShowEmpty();
+	BOOL getCheckSinceLogoff();
+
+	static void onTimeAgo(LLUICtrl*, void *);
+	static void onCheckSinceLogoff(LLUICtrl*, void *);
+	static void onCloseBtn(void* user_data);
+	static void selectAllTypes(void* user_data);
+	static void selectNoTypes(void* user_data);
+private:
+	LLPanelMainInventory*	mPanelMainInventory;
+	LLSpinCtrl*			mSpinSinceDays;
+	LLSpinCtrl*			mSpinSinceHours;
+	LLInventoryFilter*	mFilter;
+};
+
+///----------------------------------------------------------------------------
+/// LLPanelMainInventory
+///----------------------------------------------------------------------------
+
+LLPanelMainInventory::LLPanelMainInventory()
+	: LLPanel(),
+	  mActivePanel(NULL),
+	  mSavedFolderState(NULL),
+	  mFilterText(""),
+	  mMenuGearDefault(NULL),
+	  mMenuAdd(NULL)
+{
+	LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_INIT);
+	// Menu Callbacks (non contex menus)
+	mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelMainInventory::doToSelected, this, _2));
+	mCommitCallbackRegistrar.add("Inventory.CloseAllFolders", boost::bind(&LLPanelMainInventory::closeAllFolders, this));
+	mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH));
+	mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND));
+	mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLPanelMainInventory::doCreate, this, _2));
+ 	mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow, this));
+	mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLPanelMainInventory::toggleFindOptions, this));
+	mCommitCallbackRegistrar.add("Inventory.ResetFilters", boost::bind(&LLPanelMainInventory::resetFilters, this));
+	mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLPanelMainInventory::setSortBy, this, _2));
+
+	// Controls
+	// *TODO: Just use persistant settings for each of these
+	U32 sort_order = gSavedSettings.getU32("InventorySortOrder");
+	BOOL sort_by_name = ! ( sort_order & LLInventoryFilter::SO_DATE );
+	BOOL sort_folders_by_name = ( sort_order & LLInventoryFilter::SO_FOLDERS_BY_NAME );
+	BOOL sort_system_folders_to_top = ( sort_order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP );
+	
+	gSavedSettings.declareBOOL("Inventory.SortByName", sort_by_name, "Declared in code", FALSE);
+	gSavedSettings.declareBOOL("Inventory.SortByDate", !sort_by_name, "Declared in code", FALSE);
+	gSavedSettings.declareBOOL("Inventory.FoldersAlwaysByName", sort_folders_by_name, "Declared in code", FALSE);
+	gSavedSettings.declareBOOL("Inventory.SystemFoldersToTop", sort_system_folders_to_top, "Declared in code", FALSE);
+	
+	mSavedFolderState = new LLSaveFolderState();
+	mSavedFolderState->setApply(FALSE);
+}
+
+BOOL LLPanelMainInventory::postBuild()
+{
+	gInventory.addObserver(this);
+	
+	mFilterTabs = getChild<LLTabContainer>("inventory filter tabs");
+	mFilterTabs->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterSelected, this));
+	
+	//panel->getFilter()->markDefault();
+
+	// Set up the default inv. panel/filter settings.
+	mActivePanel = getChild<LLInventoryPanel>("All Items");
+	if (mActivePanel)
+	{
+		// "All Items" is the previous only view, so it gets the InventorySortOrder
+		mActivePanel->setSortOrder(gSavedSettings.getU32("InventorySortOrder"));
+		mActivePanel->getFilter()->markDefault();
+		mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+		mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2));
+	}
+	LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
+	if (recent_items_panel)
+	{
+		recent_items_panel->setSinceLogoff(TRUE);
+		recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE);
+		recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+		recent_items_panel->getFilter()->markDefault();
+		recent_items_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, recent_items_panel, _1, _2));
+	}
+
+	// Now load the stored settings from disk, if available.
+	std::ostringstream filterSaveName;
+	filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml");
+	llinfos << "LLPanelMainInventory::init: reading from " << filterSaveName << llendl;
+	llifstream file(filterSaveName.str());
+	LLSD savedFilterState;
+	if (file.is_open())
+	{
+		LLSDSerialize::fromXML(savedFilterState, file);
+		file.close();
+
+		// Load the persistent "Recent Items" settings.
+		// Note that the "All Items" settings do not persist.
+		if(recent_items_panel)
+		{
+			if(savedFilterState.has(recent_items_panel->getFilter()->getName()))
+			{
+				LLSD recent_items = savedFilterState.get(
+					recent_items_panel->getFilter()->getName());
+				recent_items_panel->getFilter()->fromLLSD(recent_items);
+			}
+		}
+
+	}
+
+	mFilterEditor = getChild<LLFilterEditor>("inventory search editor");
+	if (mFilterEditor)
+	{
+		mFilterEditor->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterEdit, this, _2));
+	}
+
+	// *TODO:Get the cost info from the server
+	const std::string upload_cost("10");
+	childSetLabelArg("Upload Image", "[COST]", upload_cost);
+	childSetLabelArg("Upload Sound", "[COST]", upload_cost);
+	childSetLabelArg("Upload Animation", "[COST]", upload_cost);
+	childSetLabelArg("Bulk Upload", "[COST]", upload_cost);
+
+	initListCommandsHandlers();
+	return TRUE;
+}
+
+// Destroys the object
+LLPanelMainInventory::~LLPanelMainInventory( void )
+{
+	// Save the filters state.
+	LLSD filterRoot;
+	LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>("All Items");
+	if (all_items_panel)
+	{
+		LLInventoryFilter* filter = all_items_panel->getFilter();
+		if (filter)
+		{
+			LLSD filterState;
+			filter->toLLSD(filterState);
+			filterRoot[filter->getName()] = filterState;
+		}
+	}
+
+	LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
+	if (recent_items_panel)
+	{
+		LLInventoryFilter* filter = recent_items_panel->getFilter();
+		if (filter)
+		{
+			LLSD filterState;
+			filter->toLLSD(filterState);
+			filterRoot[filter->getName()] = filterState;
+		}
+	}
+
+	std::ostringstream filterSaveName;
+	filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml");
+	llofstream filtersFile(filterSaveName.str());
+	if(!LLSDSerialize::toPrettyXML(filterRoot, filtersFile))
+	{
+		llwarns << "Could not write to filters save file " << filterSaveName << llendl;
+	}
+	else
+		filtersFile.close();
+
+	gInventory.removeObserver(this);
+	delete mSavedFolderState;
+}
+
+void LLPanelMainInventory::startSearch()
+{
+	// this forces focus to line editor portion of search editor
+	if (mFilterEditor)
+	{
+		mFilterEditor->focusFirstItem(TRUE);
+	}
+}
+
+BOOL LLPanelMainInventory::handleKeyHere(KEY key, MASK mask)
+{
+	LLFolderView* root_folder = mActivePanel ? mActivePanel->getRootFolder() : NULL;
+	if (root_folder)
+	{
+		// first check for user accepting current search results
+		if (mFilterEditor 
+			&& mFilterEditor->hasFocus()
+		    && (key == KEY_RETURN 
+		    	|| key == KEY_DOWN)
+		    && mask == MASK_NONE)
+		{
+			// move focus to inventory proper
+			mActivePanel->setFocus(TRUE);
+			root_folder->scrollToShowSelection();
+			return TRUE;
+		}
+
+		if (mActivePanel->hasFocus() && key == KEY_UP)
+		{
+			startSearch();
+		}
+	}
+
+	return LLPanel::handleKeyHere(key, mask);
+
+}
+
+//----------------------------------------------------------------------------
+// menu callbacks
+
+void LLPanelMainInventory::doToSelected(const LLSD& userdata)
+{
+	getPanel()->getRootFolder()->doToSelected(&gInventory, userdata);
+}
+
+void LLPanelMainInventory::closeAllFolders()
+{
+	getPanel()->getRootFolder()->closeAllFolders();
+}
+
+void LLPanelMainInventory::newWindow()
+{
+	LLFloaterInventory::showAgentInventory();
+}
+
+void LLPanelMainInventory::doCreate(const LLSD& userdata)
+{
+	menu_create_inventory_item(getPanel()->getRootFolder(), NULL, userdata);
+}
+
+void LLPanelMainInventory::resetFilters()
+{
+	LLFloaterInventoryFinder *finder = getFinder();
+	getActivePanel()->getFilter()->resetDefault();
+	if (finder)
+	{
+		finder->updateElementsFromFilter();
+	}
+
+	setFilterTextFromFilter();
+}
+
+void LLPanelMainInventory::setSortBy(const LLSD& userdata)
+{
+	std::string sort_field = userdata.asString();
+	if (sort_field == "name")
+	{
+		U32 order = getActivePanel()->getSortOrder();
+		getActivePanel()->setSortOrder( order & ~LLInventoryFilter::SO_DATE );
+			
+		gSavedSettings.setBOOL("Inventory.SortByName", TRUE );
+		gSavedSettings.setBOOL("Inventory.SortByDate", FALSE );
+	}
+	else if (sort_field == "date")
+	{
+		U32 order = getActivePanel()->getSortOrder();
+		getActivePanel()->setSortOrder( order | LLInventoryFilter::SO_DATE );
+
+		gSavedSettings.setBOOL("Inventory.SortByName", FALSE );
+		gSavedSettings.setBOOL("Inventory.SortByDate", TRUE );
+	}
+	else if (sort_field == "foldersalwaysbyname")
+	{
+		U32 order = getActivePanel()->getSortOrder();
+		if ( order & LLInventoryFilter::SO_FOLDERS_BY_NAME )
+		{
+			order &= ~LLInventoryFilter::SO_FOLDERS_BY_NAME;
+
+			gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", FALSE );
+		}
+		else
+		{
+			order |= LLInventoryFilter::SO_FOLDERS_BY_NAME;
+
+			gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", TRUE );
+		}
+		getActivePanel()->setSortOrder( order );
+	}
+	else if (sort_field == "systemfolderstotop")
+	{
+		U32 order = getActivePanel()->getSortOrder();
+		if ( order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP )
+		{
+			order &= ~LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
+
+			gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", FALSE );
+		}
+		else
+		{
+			order |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
+
+			gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", TRUE );
+		}
+		getActivePanel()->setSortOrder( order );
+	}
+}
+
+// static
+BOOL LLPanelMainInventory::filtersVisible(void* user_data)
+{
+	LLPanelMainInventory* self = (LLPanelMainInventory*)user_data;
+	if(!self) return FALSE;
+
+	return self->getFinder() != NULL;
+}
+
+void LLPanelMainInventory::onClearSearch()
+{
+	LLFloater *finder = getFinder();
+	if (mActivePanel)
+	{
+		mActivePanel->setFilterSubString(LLStringUtil::null);
+		mActivePanel->setFilterTypes(0xffffffff);
+	}
+
+	if (finder)
+	{
+		LLFloaterInventoryFinder::selectAllTypes(finder);
+	}
+
+	// re-open folders that were initially open
+	if (mActivePanel)
+	{
+		mSavedFolderState->setApply(TRUE);
+		mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+		LLOpenFoldersWithSelection opener;
+		mActivePanel->getRootFolder()->applyFunctorRecursively(opener);
+		mActivePanel->getRootFolder()->scrollToShowSelection();
+	}
+}
+
+void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
+{
+	if (search_string == "")
+	{
+		onClearSearch();
+	}
+	if (!mActivePanel)
+	{
+		return;
+	}
+
+	gInventory.startBackgroundFetch();
+
+	std::string uppercase_search_string = search_string;
+	LLStringUtil::toUpper(uppercase_search_string);
+	if (mActivePanel->getFilterSubString().empty() && uppercase_search_string.empty())
+	{
+			// current filter and new filter empty, do nothing
+			return;
+	}
+
+	// save current folder open state if no filter currently applied
+	if (!mActivePanel->getRootFolder()->isFilterModified())
+	{
+		mSavedFolderState->setApply(FALSE);
+		mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+	}
+
+	// set new filter string
+	mActivePanel->setFilterSubString(uppercase_search_string);
+}
+
+
+ //static
+ BOOL LLPanelMainInventory::incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward)
+ {
+ 	LLPanelMainInventory* active_view = NULL;
+	
+	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
+	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
+	{
+		LLPanelMainInventory* iv = dynamic_cast<LLPanelMainInventory*>(*iter);
+		if (iv)
+		{
+			if (gFocusMgr.childHasKeyboardFocus(iv))
+			{
+				active_view = iv;
+				break;
+			}
+ 		}
+ 	}
+
+ 	if (!active_view)
+ 	{
+ 		return FALSE;
+ 	}
+
+ 	std::string search_string(find_text);
+
+ 	if (search_string.empty())
+ 	{
+ 		return FALSE;
+ 	}
+
+ 	if (active_view->getPanel() &&
+ 		active_view->getPanel()->getRootFolder()->search(first_item, search_string, backward))
+ 	{
+ 		return TRUE;
+ 	}
+
+ 	return FALSE;
+ }
+
+void LLPanelMainInventory::onFilterSelected()
+{
+	// Find my index
+	mActivePanel = (LLInventoryPanel*)childGetVisibleTab("inventory filter tabs");
+
+	if (!mActivePanel)
+	{
+		return;
+	}
+	LLInventoryFilter* filter = mActivePanel->getFilter();
+	LLFloaterInventoryFinder *finder = getFinder();
+	if (finder)
+	{
+		finder->changeFilter(filter);
+	}
+	if (filter->isActive())
+	{
+		// If our filter is active we may be the first thing requiring a fetch so we better start it here.
+		gInventory.startBackgroundFetch();
+	}
+	setFilterTextFromFilter();
+}
+
+const std::string LLPanelMainInventory::getFilterSubString() 
+{ 
+	return mActivePanel->getFilterSubString(); 
+}
+
+void LLPanelMainInventory::setFilterSubString(const std::string& string) 
+{ 
+	mActivePanel->setFilterSubString(string); 
+}
+
+BOOL LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+										 EDragAndDropType cargo_type,
+										 void* cargo_data,
+										 EAcceptance* accept,
+										 std::string& tooltip_msg)
+{
+	// Check to see if we are auto scrolling from the last frame
+	LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel();
+	BOOL needsToScroll = panel->getScrollableContainer()->autoScroll(x, y);
+	if(mFilterTabs)
+	{
+		if(needsToScroll)
+		{
+			mFilterTabs->startDragAndDropDelayTimer();
+		}
+	}
+	
+	BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+
+	return handled;
+}
+
+void LLPanelMainInventory::changed(U32 mask)
+{
+}
+
+
+void LLPanelMainInventory::setFilterTextFromFilter() 
+{ 
+	mFilterText = mActivePanel->getFilter()->getFilterText(); 
+}
+
+void LLPanelMainInventory::toggleFindOptions()
+{
+	LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_TOGGLE);
+	LLFloater *floater = getFinder();
+	if (!floater)
+	{
+		LLFloaterInventoryFinder * finder = new LLFloaterInventoryFinder(this);
+		mFinderHandle = finder->getHandle();
+		finder->openFloater();
+
+		LLFloater* parent_floater = gFloaterView->getParentFloater(this);
+		if (parent_floater) // Seraph: Fix this, shouldn't be null even for sidepanel
+			parent_floater->addDependentFloater(mFinderHandle);
+		// start background fetch of folders
+		gInventory.startBackgroundFetch();
+	}
+	else
+	{
+		floater->closeFloater();
+	}
+}
+
+void LLPanelMainInventory::setSelectCallback(const LLFolderView::signal_t::slot_type& cb)
+{
+	getChild<LLInventoryPanel>("All Items")->setSelectCallback(cb);
+	getChild<LLInventoryPanel>("Recent Items")->setSelectCallback(cb);
+}
+
+void LLPanelMainInventory::onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action)
+{
+	updateListCommands();
+	panel->onSelectionChange(items, user_action);
+}
+
+///----------------------------------------------------------------------------
+/// LLFloaterInventoryFinder
+///----------------------------------------------------------------------------
+
+LLFloaterInventoryFinder* LLPanelMainInventory::getFinder() 
+{ 
+	return (LLFloaterInventoryFinder*)mFinderHandle.get();
+}
+
+
+LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLPanelMainInventory* inventory_view) :	
+	LLFloater(LLSD()),
+	mPanelMainInventory(inventory_view),
+	mFilter(inventory_view->getPanel()->getFilter())
+{
+	LLUICtrlFactory::getInstance()->buildFloater(this, "floater_inventory_view_finder.xml", NULL);
+	updateElementsFromFilter();
+}
+
+
+void LLFloaterInventoryFinder::onCheckSinceLogoff(LLUICtrl *ctrl, void *user_data)
+{
+	LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data;
+	if (!self) return;
+
+	bool since_logoff= self->childGetValue("check_since_logoff");
+	
+	if (!since_logoff && 
+	    !(  self->mSpinSinceDays->get() ||  self->mSpinSinceHours->get() ) )
+	{
+		self->mSpinSinceHours->set(1.0f);
+	}	
+}
+BOOL LLFloaterInventoryFinder::postBuild()
+{
+	const LLRect& viewrect = mPanelMainInventory->getRect();
+	setRect(LLRect(viewrect.mLeft - getRect().getWidth(), viewrect.mTop, viewrect.mLeft, viewrect.mTop - getRect().getHeight()));
+
+	childSetAction("All", selectAllTypes, this);
+	childSetAction("None", selectNoTypes, this);
+
+	mSpinSinceHours = getChild<LLSpinCtrl>("spin_hours_ago");
+	childSetCommitCallback("spin_hours_ago", onTimeAgo, this);
+
+	mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago");
+	childSetCommitCallback("spin_days_ago", onTimeAgo, this);
+
+	//	mCheckSinceLogoff   = getChild<LLSpinCtrl>("check_since_logoff");
+	childSetCommitCallback("check_since_logoff", onCheckSinceLogoff, this);
+
+	childSetAction("Close", onCloseBtn, this);
+
+	updateElementsFromFilter();
+	return TRUE;
+}
+void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data)
+{
+	LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data;
+	if (!self) return;
+	
+	bool since_logoff=true;
+	if ( self->mSpinSinceDays->get() ||  self->mSpinSinceHours->get() )
+	{
+		since_logoff = false;
+	}
+	self->childSetValue("check_since_logoff", since_logoff);
+}
+
+void LLFloaterInventoryFinder::changeFilter(LLInventoryFilter* filter)
+{
+	mFilter = filter;
+	updateElementsFromFilter();
+}
+
+void LLFloaterInventoryFinder::updateElementsFromFilter()
+{
+	if (!mFilter)
+		return;
+
+	// Get data needed for filter display
+	U32 filter_types = mFilter->getFilterTypes();
+	std::string filter_string = mFilter->getFilterSubString();
+	LLInventoryFilter::EFolderShow show_folders = mFilter->getShowFolderState();
+	U32 hours = mFilter->getHoursAgo();
+
+	// update the ui elements
+	setTitle(mFilter->getName());
+
+	childSetValue("check_animation", (S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION));
+
+	childSetValue("check_calling_card", (S32) (filter_types & 0x1 << LLInventoryType::IT_CALLINGCARD));
+	childSetValue("check_clothing", (S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE));
+	childSetValue("check_gesture", (S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE));
+	childSetValue("check_landmark", (S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK));
+	childSetValue("check_notecard", (S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD));
+	childSetValue("check_object", (S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT));
+	childSetValue("check_script", (S32) (filter_types & 0x1 << LLInventoryType::IT_LSL));
+	childSetValue("check_sound", (S32) (filter_types & 0x1 << LLInventoryType::IT_SOUND));
+	childSetValue("check_texture", (S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE));
+	childSetValue("check_snapshot", (S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT));
+	childSetValue("check_show_empty", show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS);
+	childSetValue("check_since_logoff", mFilter->isSinceLogoff());
+	mSpinSinceHours->set((F32)(hours % 24));
+	mSpinSinceDays->set((F32)(hours / 24));
+}
+
+void LLFloaterInventoryFinder::draw()
+{
+	LLMemType mt(LLMemType::MTYPE_INVENTORY_DRAW);
+	U32 filter = 0xffffffff;
+	BOOL filtered_by_all_types = TRUE;
+
+	if (!childGetValue("check_animation"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_ANIMATION);
+		filtered_by_all_types = FALSE;
+	}
+
+
+	if (!childGetValue("check_calling_card"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_CALLINGCARD);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!childGetValue("check_clothing"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_WEARABLE);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!childGetValue("check_gesture"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_GESTURE);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!childGetValue("check_landmark"))
+
+
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_LANDMARK);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!childGetValue("check_notecard"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_NOTECARD);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!childGetValue("check_object"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_OBJECT);
+		filter &= ~(0x1 << LLInventoryType::IT_ATTACHMENT);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!childGetValue("check_script"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_LSL);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!childGetValue("check_sound"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_SOUND);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!childGetValue("check_texture"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_TEXTURE);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!childGetValue("check_snapshot"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_SNAPSHOT);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!filtered_by_all_types)
+	{
+		// don't include folders in filter, unless I've selected everything
+		filter &= ~(0x1 << LLInventoryType::IT_CATEGORY);
+	}
+
+	// update the panel, panel will update the filter
+	mPanelMainInventory->getPanel()->setShowFolderState(getCheckShowEmpty() ?
+		LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+	mPanelMainInventory->getPanel()->setFilterTypes(filter);
+	if (getCheckSinceLogoff())
+	{
+		mSpinSinceDays->set(0);
+		mSpinSinceHours->set(0);
+	}
+	U32 days = (U32)mSpinSinceDays->get();
+	U32 hours = (U32)mSpinSinceHours->get();
+	if (hours > 24)
+	{
+		days += hours / 24;
+		hours = (U32)hours % 24;
+		mSpinSinceDays->set((F32)days);
+		mSpinSinceHours->set((F32)hours);
+	}
+	hours += days * 24;
+	mPanelMainInventory->getPanel()->setHoursAgo(hours);
+	mPanelMainInventory->getPanel()->setSinceLogoff(getCheckSinceLogoff());
+	mPanelMainInventory->setFilterTextFromFilter();
+
+	LLPanel::draw();
+}
+
+BOOL LLFloaterInventoryFinder::getCheckShowEmpty()
+{
+	return childGetValue("check_show_empty");
+}
+
+BOOL LLFloaterInventoryFinder::getCheckSinceLogoff()
+{
+	return childGetValue("check_since_logoff");
+}
+
+void LLFloaterInventoryFinder::onCloseBtn(void* user_data)
+{
+	LLFloaterInventoryFinder* finderp = (LLFloaterInventoryFinder*)user_data;
+	finderp->closeFloater();
+}
+
+// static
+void LLFloaterInventoryFinder::selectAllTypes(void* user_data)
+{
+	LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data;
+	if(!self) return;
+
+	self->childSetValue("check_animation", TRUE);
+	self->childSetValue("check_calling_card", TRUE);
+	self->childSetValue("check_clothing", TRUE);
+	self->childSetValue("check_gesture", TRUE);
+	self->childSetValue("check_landmark", TRUE);
+	self->childSetValue("check_notecard", TRUE);
+	self->childSetValue("check_object", TRUE);
+	self->childSetValue("check_script", TRUE);
+	self->childSetValue("check_sound", TRUE);
+	self->childSetValue("check_texture", TRUE);
+	self->childSetValue("check_snapshot", TRUE);
+}
+
+//static
+void LLFloaterInventoryFinder::selectNoTypes(void* user_data)
+{
+	LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data;
+	if(!self) return;
+
+	self->childSetValue("check_animation", FALSE);
+	self->childSetValue("check_calling_card", FALSE);
+	self->childSetValue("check_clothing", FALSE);
+	self->childSetValue("check_gesture", FALSE);
+	self->childSetValue("check_landmark", FALSE);
+	self->childSetValue("check_notecard", FALSE);
+	self->childSetValue("check_object", FALSE);
+	self->childSetValue("check_script", FALSE);
+	self->childSetValue("check_sound", FALSE);
+	self->childSetValue("check_texture", FALSE);
+	self->childSetValue("check_snapshot", FALSE);
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+// List Commands                                                                //
+
+void LLPanelMainInventory::initListCommandsHandlers()
+{
+	mListCommands = getChild<LLPanel>("bottom_panel");
+
+	mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this));
+	mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this));
+	mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
+
+	LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");
+	trash_btn->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this
+			,	_4 // BOOL drop
+			,	_5 // EDragAndDropType cargo_type
+			,	_7 // EAcceptance* accept
+			));
+
+	mCommitCallbackRegistrar.add("Inventory.GearDefault.Custom.Action", boost::bind(&LLPanelMainInventory::onCustomAction, this, _2));
+	mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2));
+	mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+	mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+	
+}
+
+void LLPanelMainInventory::updateListCommands()
+{
+	bool trash_enabled = isActionEnabled("delete");
+
+	mListCommands->childSetEnabled("trash_btn", trash_enabled);
+}
+
+void LLPanelMainInventory::onGearButtonClick()
+{
+	showActionMenu(mMenuGearDefault,"options_gear_btn");
+}
+
+void LLPanelMainInventory::onAddButtonClick()
+{
+	showActionMenu(mMenuAdd,"add_btn");
+}
+
+void LLPanelMainInventory::showActionMenu(LLMenuGL* menu, std::string spawning_view_name)
+{
+	if (menu)
+	{
+		menu->buildDrawLabels();
+		menu->updateParent(LLMenuGL::sMenuContainer);
+		LLView* spawning_view = getChild<LLView> (spawning_view_name);
+		S32 menu_x, menu_y;
+		//show menu in co-ordinates of panel
+		spawning_view->localPointToOtherView(0, spawning_view->getRect().getHeight(), &menu_x, &menu_y, this);
+		menu_y += menu->getRect().getHeight();
+		LLMenuGL::showPopup(this, menu, menu_x, menu_y);
+	}
+}
+
+void LLPanelMainInventory::onTrashButtonClick()
+{
+	onClipboardAction("delete");
+}
+
+void LLPanelMainInventory::onClipboardAction(const LLSD& userdata)
+{
+	std::string command_name = userdata.asString();
+	getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name);
+}
+
+void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
+{
+	if (!isActionEnabled(userdata))
+		return;
+
+	const std::string command_name = userdata.asString();
+	if (command_name == "new_window")
+	{
+		newWindow();
+	}
+	if (command_name == "sort_by_name")
+	{
+		const LLSD arg = "name";
+		setSortBy(arg);
+	}
+	if (command_name == "sort_by_recent")
+	{
+		const LLSD arg = "date";
+		setSortBy(arg);
+	}
+	if (command_name == "show_filters")
+	{
+		toggleFindOptions();
+	}
+	if (command_name == "reset_filters")
+	{
+		resetFilters();
+	}
+	if (command_name == "close_folders")
+	{
+		closeAllFolders();
+	}
+	if (command_name == "empty_trash")
+	{
+		const std::string notification = "ConfirmEmptyTrash";
+		gInventory.emptyFolderType(notification, LLFolderType::FT_TRASH);
+	}
+	if (command_name == "empty_lostnfound")
+	{
+		const std::string notification = "ConfirmEmptyLostAndFound";
+		gInventory.emptyFolderType(notification, LLFolderType::FT_LOST_AND_FOUND);
+	}
+	if (command_name == "save_texture")
+	{
+		LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+		if (!current_item)
+		{
+			return;
+		}
+
+		const LLUUID& item_id = current_item->getListener()->getUUID();
+		LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES);
+		if (preview_texture)
+		{
+			preview_texture->openToSave();
+		}
+	}
+}
+
+BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
+{
+	const std::string command_name = userdata.asString();
+	if (command_name == "delete")
+	{
+		BOOL can_delete = FALSE;
+		LLFolderView *folder = getActivePanel()->getRootFolder();
+		if (folder)
+		{
+			can_delete = TRUE;
+			std::set<LLUUID> selection_set;
+			folder->getSelectionList(selection_set);
+			for (std::set<LLUUID>::iterator iter = selection_set.begin();
+				 iter != selection_set.end();
+				 ++iter)
+			{
+				const LLUUID &item_id = (*iter);
+				LLFolderViewItem *item = folder->getItemByID(item_id);
+				can_delete &= item->getListener()->isItemRemovable();
+			}
+			return can_delete;
+		}
+		return FALSE;
+	}
+	if (command_name == "save_texture")
+	{
+		LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+		if (current_item)
+		{
+			return (current_item->getListener()->getInventoryType() == LLInventoryType::IT_TEXTURE);
+		}
+		return FALSE;
+	}
+	return TRUE;
+}
+
+bool LLPanelMainInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept)
+{
+	*accept = ACCEPT_NO;
+
+	const bool is_enabled = isActionEnabled("delete");
+	if (is_enabled) *accept = ACCEPT_YES_MULTI;
+
+	if (is_enabled && drop)
+	{
+		onClipboardAction("delete");
+	}
+	return true;
+}
+
+// List Commands                                                              //
+////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index 627be215779..ae78d3bec82 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -1,149 +1,149 @@
-/** 
- * @file llpanelmaininventory.h
- * @brief llpanelmaininventory.h
- * class definition
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- * 
- * Copyright (c) 2001-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLPANELMAININVENTORY_H
-#define LL_LLPANELMAININVENTORY_H
-
-#include "llpanel.h"
-#include "llinventoryobserver.h"
-
-#include "llfolderview.h"
-
-class LLFolderViewItem;
-class LLInventoryPanel;
-class LLSaveFolderState;
-class LLFilterEditor;
-class LLTabContainer;
-class LLFloaterInventoryFinder;
-class LLMenuGL;
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLPanelMainInventory
-//
-// This is a panel used to view and control an agent's inventory,
-// including all the fixin's (e.g. AllItems/RecentItems tabs, filter floaters).
-//
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLPanelMainInventory : public LLPanel, LLInventoryObserver
-{
-public:
-	friend class LLFloaterInventoryFinder;
-
-	LLPanelMainInventory();
-	~LLPanelMainInventory();
-
-	BOOL postBuild();
-
-	virtual BOOL handleKeyHere(KEY key, MASK mask);
-
-	// Inherited functionality
-	/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
-									   EDragAndDropType cargo_type,
-									   void* cargo_data,
-									   EAcceptance* accept,
-									   std::string& tooltip_msg);
-	/*virtual*/ void changed(U32 mask);
-
-	LLInventoryPanel* getPanel() { return mActivePanel; }
-	LLInventoryPanel* getActivePanel() { return mActivePanel; }
-	const LLInventoryPanel* getActivePanel() const { return mActivePanel; }
-
-	const std::string& getFilterText() const { return mFilterText; }
-	
-	void setSelectCallback(const LLFolderView::signal_t::slot_type& cb);
-
-protected:
-	//
-	// Misc functions
-	//
-	void setFilterTextFromFilter();
-	void startSearch();
-	
-	void toggleFindOptions();
-	void onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action);
-
-	static BOOL filtersVisible(void* user_data);
-	void onClearSearch();
-	static void onFoldersByName(void *user_data);
-	static BOOL checkFoldersByName(void *user_data);
-	void onFilterEdit(const std::string& search_string );
-	static BOOL incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward);
-	void onFilterSelected();
-
-	const std::string getFilterSubString();
-	void setFilterSubString(const std::string& string);
-	
-	// menu callbacks
-	void doToSelected(const LLSD& userdata);
-	void closeAllFolders();
-	void newWindow();
-	void doCreate(const LLSD& userdata);
-	void resetFilters();
-	void setSortBy(const LLSD& userdata);
-	
-private:
-	LLFloaterInventoryFinder* getFinder();
-
-	LLFilterEditor*				mFilterEditor;
-	LLTabContainer*				mFilterTabs;
-	LLHandle<LLFloater>			mFinderHandle;
-	LLInventoryPanel*			mActivePanel;
-	LLSaveFolderState*			mSavedFolderState;
-	std::string					mFilterText;
-
-
-	//////////////////////////////////////////////////////////////////////////////////
-	// List Commands                                                                //
-protected:
-	void initListCommandsHandlers();
-	void updateListCommands();
-	void onGearButtonClick();
-	void onAddButtonClick();
-	void showActionMenu(LLMenuGL* menu, std::string spawning_view_name);
-	void onTrashButtonClick();
-	void onClipboardAction(const LLSD& userdata);
-	BOOL isActionEnabled(const LLSD& command_name);
-	void onCustomAction(const LLSD& command_name);
-	bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept);
-private:
-	LLPanel*					mListCommands;
-	LLMenuGL*					mMenuGearDefault;
-	LLMenuGL*					mMenuAdd;
-	// List Commands                                                              //
-	////////////////////////////////////////////////////////////////////////////////
-};
-
-#endif // LL_LLPANELMAININVENTORY_H
-
-
-
+/** 
+ * @file llpanelmaininventory.h
+ * @brief llpanelmaininventory.h
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELMAININVENTORY_H
+#define LL_LLPANELMAININVENTORY_H
+
+#include "llpanel.h"
+#include "llinventoryobserver.h"
+
+#include "llfolderview.h"
+
+class LLFolderViewItem;
+class LLInventoryPanel;
+class LLSaveFolderState;
+class LLFilterEditor;
+class LLTabContainer;
+class LLFloaterInventoryFinder;
+class LLMenuGL;
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLPanelMainInventory
+//
+// This is a panel used to view and control an agent's inventory,
+// including all the fixin's (e.g. AllItems/RecentItems tabs, filter floaters).
+//
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLPanelMainInventory : public LLPanel, LLInventoryObserver
+{
+public:
+	friend class LLFloaterInventoryFinder;
+
+	LLPanelMainInventory();
+	~LLPanelMainInventory();
+
+	BOOL postBuild();
+
+	virtual BOOL handleKeyHere(KEY key, MASK mask);
+
+	// Inherited functionality
+	/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+									   EDragAndDropType cargo_type,
+									   void* cargo_data,
+									   EAcceptance* accept,
+									   std::string& tooltip_msg);
+	/*virtual*/ void changed(U32 mask);
+
+	LLInventoryPanel* getPanel() { return mActivePanel; }
+	LLInventoryPanel* getActivePanel() { return mActivePanel; }
+	const LLInventoryPanel* getActivePanel() const { return mActivePanel; }
+
+	const std::string& getFilterText() const { return mFilterText; }
+	
+	void setSelectCallback(const LLFolderView::signal_t::slot_type& cb);
+
+protected:
+	//
+	// Misc functions
+	//
+	void setFilterTextFromFilter();
+	void startSearch();
+	
+	void toggleFindOptions();
+	void onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action);
+
+	static BOOL filtersVisible(void* user_data);
+	void onClearSearch();
+	static void onFoldersByName(void *user_data);
+	static BOOL checkFoldersByName(void *user_data);
+	void onFilterEdit(const std::string& search_string );
+	static BOOL incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward);
+	void onFilterSelected();
+
+	const std::string getFilterSubString();
+	void setFilterSubString(const std::string& string);
+	
+	// menu callbacks
+	void doToSelected(const LLSD& userdata);
+	void closeAllFolders();
+	void newWindow();
+	void doCreate(const LLSD& userdata);
+	void resetFilters();
+	void setSortBy(const LLSD& userdata);
+	
+private:
+	LLFloaterInventoryFinder* getFinder();
+
+	LLFilterEditor*				mFilterEditor;
+	LLTabContainer*				mFilterTabs;
+	LLHandle<LLFloater>			mFinderHandle;
+	LLInventoryPanel*			mActivePanel;
+	LLSaveFolderState*			mSavedFolderState;
+	std::string					mFilterText;
+
+
+	//////////////////////////////////////////////////////////////////////////////////
+	// List Commands                                                                //
+protected:
+	void initListCommandsHandlers();
+	void updateListCommands();
+	void onGearButtonClick();
+	void onAddButtonClick();
+	void showActionMenu(LLMenuGL* menu, std::string spawning_view_name);
+	void onTrashButtonClick();
+	void onClipboardAction(const LLSD& userdata);
+	BOOL isActionEnabled(const LLSD& command_name);
+	void onCustomAction(const LLSD& command_name);
+	bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept);
+private:
+	LLPanel*					mListCommands;
+	LLMenuGL*					mMenuGearDefault;
+	LLMenuGL*					mMenuAdd;
+	// List Commands                                                              //
+	////////////////////////////////////////////////////////////////////////////////
+};
+
+#endif // LL_LLPANELMAININVENTORY_H
+
+
+
diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp
index bec2494eac9..1a772e4effd 100644
--- a/indra/newview/llpanelmediasettingssecurity.cpp
+++ b/indra/newview/llpanelmediasettingssecurity.cpp
@@ -1,345 +1,345 @@
-/**
- * @file llpanelmediasettingssecurity.cpp
- * @brief LLPanelMediaSettingsSecurity class implementation
- *
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- * 
- * Copyright (c) 2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-#include "llfloaterreg.h"
-#include "llpanelmediasettingssecurity.h"
-#include "llpanelcontents.h"
-#include "llcheckboxctrl.h"
-#include "llscrolllistctrl.h"
-#include "llscrolllistitem.h"
-#include "lluictrlfactory.h"
-#include "llwindow.h"
-#include "llviewerwindow.h"
-#include "llsdutil.h"
-#include "llselectmgr.h"
-#include "llmediaentry.h"
-#include "llfloaterwhitelistentry.h"
-#include "llfloatermediasettings.h"
-////////////////////////////////////////////////////////////////////////////////
-//
-LLPanelMediaSettingsSecurity::LLPanelMediaSettingsSecurity() :
-	mParent( NULL )
-{
-	mCommitCallbackRegistrar.add("Media.whitelistAdd",		boost::bind(&LLPanelMediaSettingsSecurity::onBtnAdd, this));
-	mCommitCallbackRegistrar.add("Media.whitelistDelete",	boost::bind(&LLPanelMediaSettingsSecurity::onBtnDel, this));	
-	// build dialog from XML
-	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_security.xml");
-
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-BOOL LLPanelMediaSettingsSecurity::postBuild()
-{
-	mEnableWhiteList = getChild< LLCheckBoxCtrl >( LLMediaEntry::WHITELIST_ENABLE_KEY );
-	mWhiteListList = getChild< LLScrollListCtrl >( LLMediaEntry::WHITELIST_KEY );
-	
-	setDefaultBtn("whitelist_add");
-
-	return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-LLPanelMediaSettingsSecurity::~LLPanelMediaSettingsSecurity()
-{
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// 
-void LLPanelMediaSettingsSecurity::draw()
-{
-	// housekeeping
-	LLPanel::draw();
-
-	// if list is empty, disable DEL button and checkbox to enable use of list
-	if ( mWhiteListList->isEmpty() )
-	{
-		childSetEnabled( "whitelist_del", false );
-		childSetEnabled( LLMediaEntry::WHITELIST_KEY, false );
-		childSetEnabled( LLMediaEntry::WHITELIST_ENABLE_KEY, false );
-	}
-	else
-	{
-		childSetEnabled( "whitelist_del", true );
-		childSetEnabled( LLMediaEntry::WHITELIST_KEY, true );
-		childSetEnabled( LLMediaEntry::WHITELIST_ENABLE_KEY, true );
-	};
-
-	// if nothing is selected, disable DEL button
-	if ( mWhiteListList->getSelectedValue().asString().empty() )
-	{
-		childSetEnabled( "whitelist_del", false );
-	}
-	else
-	{
-		childSetEnabled( "whitelist_del", true );
-	};
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static 
-void LLPanelMediaSettingsSecurity::initValues( void* userdata, const LLSD& media_settings , bool editable)
-{
-	LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
-
-	if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo )
-	{
-		if(LLFloaterMediaSettings::getInstance()->mMultipleMedia) 
-		{
-			self->clearValues(self, editable);
-			// only show multiple 
-			return;
-		}
-		
-	}
-	else
-	{
-		if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia) 
-		{
-			self->clearValues(self, editable);
-			// only show multiple 
-			return;
-		}			
-		
-	}
-	std::string base_key( "" );
-	std::string tentative_key( "" );
-
-	struct 
-	{
-		std::string key_name;
-		LLUICtrl* ctrl_ptr;
-		std::string ctrl_type;
-
-	} data_set [] = 
-	{
-		{ LLMediaEntry::WHITELIST_ENABLE_KEY,	self->mEnableWhiteList,		"LLCheckBoxCtrl" },
-		{ LLMediaEntry::WHITELIST_KEY,			self->mWhiteListList,		"LLScrollListCtrl" },
-		{ "", NULL , "" }
-	};
-
-	for( int i = 0; data_set[ i ].key_name.length() > 0; ++i )
-	{
-		base_key = std::string( data_set[ i ].key_name );
-        tentative_key = base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX );
-
-		// TODO: CP - I bet there is a better way to do this using Boost
-		if ( media_settings[ base_key ].isDefined() )
-		{
-			if ( data_set[ i ].ctrl_type == "LLCheckBoxCtrl" )
-			{
-				static_cast< LLCheckBoxCtrl* >( data_set[ i ].ctrl_ptr )->
-					setValue( media_settings[ base_key ].asBoolean() );
-			}
-			else
-			if ( data_set[ i ].ctrl_type == "LLScrollListCtrl" )
-			{
-				// get control 
-				LLScrollListCtrl* list = static_cast< LLScrollListCtrl* >( data_set[ i ].ctrl_ptr );
-				list->deleteAllItems();
-
-				// points to list of white list URLs
-				LLSD url_list = media_settings[ base_key ];
-
-				// iterate over them and add to scroll list
-				LLSD::array_iterator iter = url_list.beginArray();
-				while( iter != url_list.endArray() )
-				{
-					// TODO: is iter guaranteed to be valid here?
-					std::string url = *iter;
-					list->addSimpleElement( url );
-					++iter;
-				};
-			};
-			data_set[ i ].ctrl_ptr->setEnabled(editable);
-			data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );
-		};
-	};
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static 
-void LLPanelMediaSettingsSecurity::clearValues( void* userdata , bool editable)
-{
-	LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
-	self->mEnableWhiteList->clear();
-	self->mWhiteListList->deleteAllItems();
-	self->mEnableWhiteList->setEnabled(editable);
-	self->mWhiteListList->setEnabled(editable);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// 
-void LLPanelMediaSettingsSecurity::preApply()
-{
-	// no-op
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in )
-{
-    fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = mEnableWhiteList->getValue();
-
-    // iterate over white list and extract items
-    std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData();
-    std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin();
-	// *NOTE: need actually set the key to be an emptyArray(), or the merge
-	// we do with this LLSD will think there's nothing to change.
-    fill_me_in[LLMediaEntry::WHITELIST_KEY] = LLSD::emptyArray();
-    while( iter != white_list_items.end() )
-    {
-        std::string white_list_url = (*iter)->getValue().asString();
-        fill_me_in[ LLMediaEntry::WHITELIST_KEY ].append( white_list_url );
-        ++iter;
-    };
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// 
-void LLPanelMediaSettingsSecurity::postApply()
-{
-	// no-op
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Try to make a valid URL if a fragment (
-// white list list box widget and build a list to test against. Can also
-const std::string LLPanelMediaSettingsSecurity::makeValidUrl( const std::string& src_url )
-{
-	// use LLURI to determine if we have a valid scheme
-	LLURI candidate_url( src_url );
-	if ( candidate_url.scheme().empty() )
-	{
-		// build a URL comprised of default scheme and the original fragment 
-		const std::string default_scheme( "http://" );
-		return default_scheme + src_url;
-	};
-
-	// we *could* test the "default scheme" + "original fragment" URL again
-	// using LLURI to see if it's valid but I think the outcome is the same
-	// in either case - our only option is to return the original URL
-
-	// we *think* the original url passed in was valid
-	return src_url;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// wrapper for testing a URL against the whitelist. We grab entries from
-// white list list box widget and build a list to test against. Can also
-// optionally pass the URL that you are trying to add to the widget since
-// it won't be added until this call returns.
-bool LLPanelMediaSettingsSecurity::passesWhiteList( const std::string& added_url,
-													const std::string& test_url )
-{
-	// the checkUrlAgainstWhitelist(..) function works on a vector
-	// of strings for the white list entries - in this panel, the white list
-	// is stored in the widgets themselves so we need to build something compatible.
-	std::vector< std::string > whitelist_strings;
-	whitelist_strings.clear();	// may not be required - I forget what the spec says.
-
-	// step through whitelist widget entries and grab them as strings
-    std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData();
-    std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin(); 
-	while( iter != white_list_items.end()  )
-    {
-        const std::string whitelist_url = (*iter)->getValue().asString();
-		whitelist_strings.push_back( whitelist_url );
-
-		++iter;
-    };
-
-	// add in the URL that might be added to the whitelist so we can test that too
-	if ( added_url.length() )
-		whitelist_strings.push_back( added_url );
-
-	// possible the URL is just a fragment so we validize it
-	const std::string valid_url = makeValidUrl( test_url );
-
-	// indicate if the URL passes whitelist
-	return LLMediaEntry::checkUrlAgainstWhitelist( valid_url, whitelist_strings );
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//
-void LLPanelMediaSettingsSecurity::addWhiteListItem(const std::string& url)
-{
-	// grab home URL from the general panel (via the parent floater)
-	std::string home_url( "" );
-	if ( mParent )
-		home_url = mParent->getHomeUrl();
-
-	// if the home URL is blank (user hasn't entered it yet) then
-	// don't bother to check if it passes the white list
-	if ( home_url.empty() )
-	{
-		mWhiteListList->addSimpleElement( url );
-		return;
-	};
-
-	// if the URL passes the white list, add it
-	if ( passesWhiteList( url, home_url ) )
-	{
-		mWhiteListList->addSimpleElement( url );
-	}
-	else
-	// display a message indicating you can't do that
-	{
-		LLNotifications::instance().add("WhiteListInvalidatesHomeUrl");
-	};
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// static
-void LLPanelMediaSettingsSecurity::onBtnAdd( void* userdata )
-{
-	LLFloaterReg::showInstance("whitelist_entry");
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// static
-void LLPanelMediaSettingsSecurity::onBtnDel( void* userdata )
-{
-	LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
-
-	self->mWhiteListList->deleteSelectedItems();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLPanelMediaSettingsSecurity::setParent( LLFloaterMediaSettings* parent )
-{
-	mParent = parent;
-};
-
+/**
+ * @file llpanelmediasettingssecurity.cpp
+ * @brief LLPanelMediaSettingsSecurity class implementation
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llfloaterreg.h"
+#include "llpanelmediasettingssecurity.h"
+#include "llpanelcontents.h"
+#include "llcheckboxctrl.h"
+#include "llscrolllistctrl.h"
+#include "llscrolllistitem.h"
+#include "lluictrlfactory.h"
+#include "llwindow.h"
+#include "llviewerwindow.h"
+#include "llsdutil.h"
+#include "llselectmgr.h"
+#include "llmediaentry.h"
+#include "llfloaterwhitelistentry.h"
+#include "llfloatermediasettings.h"
+////////////////////////////////////////////////////////////////////////////////
+//
+LLPanelMediaSettingsSecurity::LLPanelMediaSettingsSecurity() :
+	mParent( NULL )
+{
+	mCommitCallbackRegistrar.add("Media.whitelistAdd",		boost::bind(&LLPanelMediaSettingsSecurity::onBtnAdd, this));
+	mCommitCallbackRegistrar.add("Media.whitelistDelete",	boost::bind(&LLPanelMediaSettingsSecurity::onBtnDel, this));	
+	// build dialog from XML
+	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_security.xml");
+
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+BOOL LLPanelMediaSettingsSecurity::postBuild()
+{
+	mEnableWhiteList = getChild< LLCheckBoxCtrl >( LLMediaEntry::WHITELIST_ENABLE_KEY );
+	mWhiteListList = getChild< LLScrollListCtrl >( LLMediaEntry::WHITELIST_KEY );
+	
+	setDefaultBtn("whitelist_add");
+
+	return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+LLPanelMediaSettingsSecurity::~LLPanelMediaSettingsSecurity()
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// 
+void LLPanelMediaSettingsSecurity::draw()
+{
+	// housekeeping
+	LLPanel::draw();
+
+	// if list is empty, disable DEL button and checkbox to enable use of list
+	if ( mWhiteListList->isEmpty() )
+	{
+		childSetEnabled( "whitelist_del", false );
+		childSetEnabled( LLMediaEntry::WHITELIST_KEY, false );
+		childSetEnabled( LLMediaEntry::WHITELIST_ENABLE_KEY, false );
+	}
+	else
+	{
+		childSetEnabled( "whitelist_del", true );
+		childSetEnabled( LLMediaEntry::WHITELIST_KEY, true );
+		childSetEnabled( LLMediaEntry::WHITELIST_ENABLE_KEY, true );
+	};
+
+	// if nothing is selected, disable DEL button
+	if ( mWhiteListList->getSelectedValue().asString().empty() )
+	{
+		childSetEnabled( "whitelist_del", false );
+	}
+	else
+	{
+		childSetEnabled( "whitelist_del", true );
+	};
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// static 
+void LLPanelMediaSettingsSecurity::initValues( void* userdata, const LLSD& media_settings , bool editable)
+{
+	LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
+
+	if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo )
+	{
+		if(LLFloaterMediaSettings::getInstance()->mMultipleMedia) 
+		{
+			self->clearValues(self, editable);
+			// only show multiple 
+			return;
+		}
+		
+	}
+	else
+	{
+		if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia) 
+		{
+			self->clearValues(self, editable);
+			// only show multiple 
+			return;
+		}			
+		
+	}
+	std::string base_key( "" );
+	std::string tentative_key( "" );
+
+	struct 
+	{
+		std::string key_name;
+		LLUICtrl* ctrl_ptr;
+		std::string ctrl_type;
+
+	} data_set [] = 
+	{
+		{ LLMediaEntry::WHITELIST_ENABLE_KEY,	self->mEnableWhiteList,		"LLCheckBoxCtrl" },
+		{ LLMediaEntry::WHITELIST_KEY,			self->mWhiteListList,		"LLScrollListCtrl" },
+		{ "", NULL , "" }
+	};
+
+	for( int i = 0; data_set[ i ].key_name.length() > 0; ++i )
+	{
+		base_key = std::string( data_set[ i ].key_name );
+        tentative_key = base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX );
+
+		// TODO: CP - I bet there is a better way to do this using Boost
+		if ( media_settings[ base_key ].isDefined() )
+		{
+			if ( data_set[ i ].ctrl_type == "LLCheckBoxCtrl" )
+			{
+				static_cast< LLCheckBoxCtrl* >( data_set[ i ].ctrl_ptr )->
+					setValue( media_settings[ base_key ].asBoolean() );
+			}
+			else
+			if ( data_set[ i ].ctrl_type == "LLScrollListCtrl" )
+			{
+				// get control 
+				LLScrollListCtrl* list = static_cast< LLScrollListCtrl* >( data_set[ i ].ctrl_ptr );
+				list->deleteAllItems();
+
+				// points to list of white list URLs
+				LLSD url_list = media_settings[ base_key ];
+
+				// iterate over them and add to scroll list
+				LLSD::array_iterator iter = url_list.beginArray();
+				while( iter != url_list.endArray() )
+				{
+					// TODO: is iter guaranteed to be valid here?
+					std::string url = *iter;
+					list->addSimpleElement( url );
+					++iter;
+				};
+			};
+			data_set[ i ].ctrl_ptr->setEnabled(editable);
+			data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );
+		};
+	};
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// static 
+void LLPanelMediaSettingsSecurity::clearValues( void* userdata , bool editable)
+{
+	LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
+	self->mEnableWhiteList->clear();
+	self->mWhiteListList->deleteAllItems();
+	self->mEnableWhiteList->setEnabled(editable);
+	self->mWhiteListList->setEnabled(editable);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// 
+void LLPanelMediaSettingsSecurity::preApply()
+{
+	// no-op
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in )
+{
+    fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = mEnableWhiteList->getValue();
+
+    // iterate over white list and extract items
+    std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData();
+    std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin();
+	// *NOTE: need actually set the key to be an emptyArray(), or the merge
+	// we do with this LLSD will think there's nothing to change.
+    fill_me_in[LLMediaEntry::WHITELIST_KEY] = LLSD::emptyArray();
+    while( iter != white_list_items.end() )
+    {
+        std::string white_list_url = (*iter)->getValue().asString();
+        fill_me_in[ LLMediaEntry::WHITELIST_KEY ].append( white_list_url );
+        ++iter;
+    };
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// 
+void LLPanelMediaSettingsSecurity::postApply()
+{
+	// no-op
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Try to make a valid URL if a fragment (
+// white list list box widget and build a list to test against. Can also
+const std::string LLPanelMediaSettingsSecurity::makeValidUrl( const std::string& src_url )
+{
+	// use LLURI to determine if we have a valid scheme
+	LLURI candidate_url( src_url );
+	if ( candidate_url.scheme().empty() )
+	{
+		// build a URL comprised of default scheme and the original fragment 
+		const std::string default_scheme( "http://" );
+		return default_scheme + src_url;
+	};
+
+	// we *could* test the "default scheme" + "original fragment" URL again
+	// using LLURI to see if it's valid but I think the outcome is the same
+	// in either case - our only option is to return the original URL
+
+	// we *think* the original url passed in was valid
+	return src_url;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// wrapper for testing a URL against the whitelist. We grab entries from
+// white list list box widget and build a list to test against. Can also
+// optionally pass the URL that you are trying to add to the widget since
+// it won't be added until this call returns.
+bool LLPanelMediaSettingsSecurity::passesWhiteList( const std::string& added_url,
+													const std::string& test_url )
+{
+	// the checkUrlAgainstWhitelist(..) function works on a vector
+	// of strings for the white list entries - in this panel, the white list
+	// is stored in the widgets themselves so we need to build something compatible.
+	std::vector< std::string > whitelist_strings;
+	whitelist_strings.clear();	// may not be required - I forget what the spec says.
+
+	// step through whitelist widget entries and grab them as strings
+    std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData();
+    std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin(); 
+	while( iter != white_list_items.end()  )
+    {
+        const std::string whitelist_url = (*iter)->getValue().asString();
+		whitelist_strings.push_back( whitelist_url );
+
+		++iter;
+    };
+
+	// add in the URL that might be added to the whitelist so we can test that too
+	if ( added_url.length() )
+		whitelist_strings.push_back( added_url );
+
+	// possible the URL is just a fragment so we validize it
+	const std::string valid_url = makeValidUrl( test_url );
+
+	// indicate if the URL passes whitelist
+	return LLMediaEntry::checkUrlAgainstWhitelist( valid_url, whitelist_strings );
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+void LLPanelMediaSettingsSecurity::addWhiteListItem(const std::string& url)
+{
+	// grab home URL from the general panel (via the parent floater)
+	std::string home_url( "" );
+	if ( mParent )
+		home_url = mParent->getHomeUrl();
+
+	// if the home URL is blank (user hasn't entered it yet) then
+	// don't bother to check if it passes the white list
+	if ( home_url.empty() )
+	{
+		mWhiteListList->addSimpleElement( url );
+		return;
+	};
+
+	// if the URL passes the white list, add it
+	if ( passesWhiteList( url, home_url ) )
+	{
+		mWhiteListList->addSimpleElement( url );
+	}
+	else
+	// display a message indicating you can't do that
+	{
+		LLNotifications::instance().add("WhiteListInvalidatesHomeUrl");
+	};
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// static
+void LLPanelMediaSettingsSecurity::onBtnAdd( void* userdata )
+{
+	LLFloaterReg::showInstance("whitelist_entry");
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// static
+void LLPanelMediaSettingsSecurity::onBtnDel( void* userdata )
+{
+	LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
+
+	self->mWhiteListList->deleteSelectedItems();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLPanelMediaSettingsSecurity::setParent( LLFloaterMediaSettings* parent )
+{
+	mParent = parent;
+};
+
diff --git a/indra/newview/llpanelobjectinventory.h b/indra/newview/llpanelobjectinventory.h
index 7a39d8fabc4..6722bb212e5 100644
--- a/indra/newview/llpanelobjectinventory.h
+++ b/indra/newview/llpanelobjectinventory.h
@@ -1,102 +1,102 @@
-/** 
- * @file llpanelobjectinventory.h
- * @brief LLPanelObjectInventory class definition
- *
- * $LicenseInfo:firstyear=2002&license=viewergpl$
- * 
- * Copyright (c) 2002-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLPANELOBJECTINVENTORY_H
-#define LL_LLPANELOBJECTINVENTORY_H
-
-#include "llvoinventorylistener.h"
-#include "llpanel.h"
-
-#include "llinventory.h"
-
-class LLScrollContainer;
-class LLFolderView;
-class LLFolderViewFolder;
-class LLViewerObject;
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLPanelObjectInventory
-//
-// This class represents the panel used to view and control a
-// particular task's inventory.
-//
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLPanelObjectInventory : public LLPanel, public LLVOInventoryListener
-{
-public:
-	// dummy param block for template registration purposes
-	struct Params : public LLPanel::Params {};
-
-	LLPanelObjectInventory(const Params&);
-	virtual ~LLPanelObjectInventory();
-	
-	virtual BOOL postBuild();
-
-	void doToSelected(const LLSD& userdata);
-	
-	void refresh();
-	const LLUUID& getTaskUUID() { return mTaskUUID;}
-	void removeSelectedItem();
-	void startRenamingSelectedItem();
-
-	LLFolderView* getRootFolder() const { return mFolders; }
-
-	virtual void draw();
-	virtual void deleteAllChildren();
-	virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string& tooltip_msg);
-	
-	static void idle(void* user_data);
-
-protected:
-	void reset();
-	/*virtual*/ void inventoryChanged(LLViewerObject* object,
-								 InventoryObjectList* inventory,
-								 S32 serial_num,
-								 void* user_data);
-	void updateInventory();
-	void createFolderViews(LLInventoryObject* inventory_root, InventoryObjectList& contents);
-	void createViewsForCategory(InventoryObjectList* inventory,
-								LLInventoryObject* parent,
-								LLFolderViewFolder* folder);
-	void clearContents();
-
-private:
-	LLScrollContainer* mScroller;
-	LLFolderView* mFolders;
-	
-	LLUUID mTaskUUID;
-	BOOL mHaveInventory;
-	BOOL mIsInventoryEmpty;
-	BOOL mInventoryNeedsUpdate;
-};
-
-#endif // LL_LLPANELOBJECTINVENTORY_H
+/** 
+ * @file llpanelobjectinventory.h
+ * @brief LLPanelObjectInventory class definition
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELOBJECTINVENTORY_H
+#define LL_LLPANELOBJECTINVENTORY_H
+
+#include "llvoinventorylistener.h"
+#include "llpanel.h"
+
+#include "llinventory.h"
+
+class LLScrollContainer;
+class LLFolderView;
+class LLFolderViewFolder;
+class LLViewerObject;
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLPanelObjectInventory
+//
+// This class represents the panel used to view and control a
+// particular task's inventory.
+//
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLPanelObjectInventory : public LLPanel, public LLVOInventoryListener
+{
+public:
+	// dummy param block for template registration purposes
+	struct Params : public LLPanel::Params {};
+
+	LLPanelObjectInventory(const Params&);
+	virtual ~LLPanelObjectInventory();
+	
+	virtual BOOL postBuild();
+
+	void doToSelected(const LLSD& userdata);
+	
+	void refresh();
+	const LLUUID& getTaskUUID() { return mTaskUUID;}
+	void removeSelectedItem();
+	void startRenamingSelectedItem();
+
+	LLFolderView* getRootFolder() const { return mFolders; }
+
+	virtual void draw();
+	virtual void deleteAllChildren();
+	virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string& tooltip_msg);
+	
+	static void idle(void* user_data);
+
+protected:
+	void reset();
+	/*virtual*/ void inventoryChanged(LLViewerObject* object,
+								 InventoryObjectList* inventory,
+								 S32 serial_num,
+								 void* user_data);
+	void updateInventory();
+	void createFolderViews(LLInventoryObject* inventory_root, InventoryObjectList& contents);
+	void createViewsForCategory(InventoryObjectList* inventory,
+								LLInventoryObject* parent,
+								LLFolderViewFolder* folder);
+	void clearContents();
+
+private:
+	LLScrollContainer* mScroller;
+	LLFolderView* mFolders;
+	
+	LLUUID mTaskUUID;
+	BOOL mHaveInventory;
+	BOOL mIsInventoryEmpty;
+	BOOL mInventoryNeedsUpdate;
+};
+
+#endif // LL_LLPANELOBJECTINVENTORY_H
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index 58962b67d66..824def3d928 100644
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -1,279 +1,279 @@
-/**
- * @file LLSidepanelInventory.cpp
- * @brief Side Bar "Inventory" panel
- *
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- *
- * Copyright (c) 2004-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-#include "llsidepanelinventory.h"
-
-#include "llagent.h"
-#include "llbutton.h"
-#include "llinventorybridge.h"
-#include "llinventorypanel.h"
-#include "llpanelmaininventory.h"
-#include "llsidepaneliteminfo.h"
-#include "llsidepaneltaskinfo.h"
-#include "lltabcontainer.h"
-#include "llselectmgr.h"
-
-static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory");
-
-LLSidepanelInventory::LLSidepanelInventory()
-	:	LLPanel(),
-		mItemPanel(NULL),
-		mPanelMainInventory(NULL)
-{
-
-	//LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
-}
-
-LLSidepanelInventory::~LLSidepanelInventory()
-{
-}
-
-BOOL LLSidepanelInventory::postBuild()
-{
-	// UI elements from inventory panel
-	{
-		mInventoryPanel = getChild<LLPanel>("sidepanel__inventory_panel");
-		
-		mInfoBtn = mInventoryPanel->getChild<LLButton>("info_btn");
-		mInfoBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onInfoButtonClicked, this));
-		
-		mShareBtn = mInventoryPanel->getChild<LLButton>("share_btn");
-		mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this));
-		
-		mWearBtn = mInventoryPanel->getChild<LLButton>("wear_btn");
-		mWearBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onWearButtonClicked, this));
-		
-		mPlayBtn = mInventoryPanel->getChild<LLButton>("play_btn");
-		mPlayBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onPlayButtonClicked, this));
-		
-		mTeleportBtn = mInventoryPanel->getChild<LLButton>("teleport_btn");
-		mTeleportBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onTeleportButtonClicked, this));
-		
-		mOverflowBtn = mInventoryPanel->getChild<LLButton>("overflow_btn");
-		mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this));
-		
-		mPanelMainInventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
-		mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2));
-	}
-
-	// UI elements from item panel
-	{
-		mItemPanel = getChild<LLSidepanelItemInfo>("sidepanel__item_panel");
-		
-		LLButton* back_btn = mItemPanel->getChild<LLButton>("back_btn");
-		back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this));
-	}
-
-	// UI elements from task panel
-	{
-		mTaskPanel = getChild<LLSidepanelTaskInfo>("sidepanel__task_panel");
-		if (mTaskPanel)
-		{
-			LLButton* back_btn = mTaskPanel->getChild<LLButton>("back_btn");
-			back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this));
-		}
-	}
-	
-	return TRUE;
-}
-
-void LLSidepanelInventory::onOpen(const LLSD& key)
-{
-	if(key.size() == 0)
-		return;
-
-	mItemPanel->reset();
-
-	if (key.has("id"))
-	{
-		mItemPanel->setItemID(key["id"].asUUID());
-		if (key.has("object"))
-		{
-			mItemPanel->setObjectID(key["object"].asUUID());
-		}
-		showItemInfoPanel();
-	}
-	if (key.has("task"))
-	{
-		if (mTaskPanel)
-			mTaskPanel->setObjectSelection(LLSelectMgr::getInstance()->getSelection());
-		showTaskInfoPanel();
-	}
-	if (key.has("select"))
-	{
-		mPanelMainInventory->getPanel()->setSelection(key["select"].asUUID(), TAKE_FOCUS_NO);
-	}
-}
-
-void LLSidepanelInventory::onInfoButtonClicked()
-{
-	LLInventoryItem *item = getSelectedItem();
-	if (item)
-	{
-		mItemPanel->reset();
-		mItemPanel->setItemID(item->getUUID());
-		showItemInfoPanel();
-	}
-}
-
-void LLSidepanelInventory::onShareButtonClicked()
-{
-}
-
-void LLSidepanelInventory::performActionOnSelection(const std::string &action)
-{
-	LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
-	LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem();
-	if (!current_item)
-	{
-		return;
-	}
-	current_item->getListener()->performAction(panel_main_inventory->getActivePanel()->getRootFolder(), panel_main_inventory->getActivePanel()->getModel(), action);
-}
-
-void LLSidepanelInventory::onWearButtonClicked()
-{
-	performActionOnSelection("wear");
-	performActionOnSelection("attach");
-}
-
-void LLSidepanelInventory::onPlayButtonClicked()
-{
-	performActionOnSelection("activate");
-}
-
-void LLSidepanelInventory::onTeleportButtonClicked()
-{
-	performActionOnSelection("teleport");
-}
-
-void LLSidepanelInventory::onOverflowButtonClicked()
-{
-}
-
-void LLSidepanelInventory::onBackButtonClicked()
-{
-	showInventoryPanel();
-}
-
-void LLSidepanelInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
-{
-	updateVerbs();
-}
-
-void LLSidepanelInventory::showItemInfoPanel()
-{
-	mItemPanel->setVisible(TRUE);
-	if (mTaskPanel)
-		mTaskPanel->setVisible(FALSE);
-	mInventoryPanel->setVisible(FALSE);
-
-	mItemPanel->dirty();
-	mItemPanel->setIsEditing(FALSE);
-}
-
-void LLSidepanelInventory::showTaskInfoPanel()
-{
-	mItemPanel->setVisible(FALSE);
-	mInventoryPanel->setVisible(FALSE);
-
-	if (mTaskPanel)
-	{
-		mTaskPanel->setVisible(TRUE);
-		mTaskPanel->dirty();
-		mTaskPanel->setIsEditing(FALSE);
-	}
-}
-
-void LLSidepanelInventory::showInventoryPanel()
-{
-	mItemPanel->setVisible(FALSE);
-	if (mTaskPanel)
-		mTaskPanel->setVisible(FALSE);
-	mInventoryPanel->setVisible(TRUE);
-	updateVerbs();
-}
-
-void LLSidepanelInventory::updateVerbs()
-{
-	mInfoBtn->setEnabled(FALSE);
-	mShareBtn->setEnabled(FALSE);
-
-	mWearBtn->setVisible(FALSE);
-	mWearBtn->setEnabled(FALSE);
-	mPlayBtn->setVisible(FALSE);
-	mPlayBtn->setEnabled(FALSE);
- 	mTeleportBtn->setVisible(FALSE);
- 	mTeleportBtn->setEnabled(FALSE);
-	
-	const LLInventoryItem *item = getSelectedItem();
-	if (!item)
-		return;
-
-	mInfoBtn->setEnabled(TRUE);
-	mShareBtn->setEnabled(TRUE);
-
-	switch(item->getInventoryType())
-	{
-		case LLInventoryType::IT_WEARABLE:
-		case LLInventoryType::IT_OBJECT:
-		case LLInventoryType::IT_ATTACHMENT:
-			mWearBtn->setVisible(TRUE);
-			mWearBtn->setEnabled(TRUE);
-			break;
-		case LLInventoryType::IT_SOUND:
-		case LLInventoryType::IT_GESTURE:
-		case LLInventoryType::IT_ANIMATION:
-			mPlayBtn->setVisible(TRUE);
-			mPlayBtn->setEnabled(TRUE);
-			break;
-		case LLInventoryType::IT_LANDMARK:
-			mTeleportBtn->setVisible(TRUE);
-			mTeleportBtn->setEnabled(TRUE);
-			break;
-		default:
-			break;
-	}
-}
-
-LLInventoryItem *LLSidepanelInventory::getSelectedItem()
-{
-	LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
-	LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem();
-	if (!current_item)
-	{
-		return NULL;
-	}
-	const LLUUID &item_id = current_item->getListener()->getUUID();
-	LLInventoryItem *item = gInventory.getItem(item_id);
-	return item;
-}
+/**
+ * @file LLSidepanelInventory.cpp
+ * @brief Side Bar "Inventory" panel
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llsidepanelinventory.h"
+
+#include "llagent.h"
+#include "llbutton.h"
+#include "llinventorybridge.h"
+#include "llinventorypanel.h"
+#include "llpanelmaininventory.h"
+#include "llsidepaneliteminfo.h"
+#include "llsidepaneltaskinfo.h"
+#include "lltabcontainer.h"
+#include "llselectmgr.h"
+
+static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory");
+
+LLSidepanelInventory::LLSidepanelInventory()
+	:	LLPanel(),
+		mItemPanel(NULL),
+		mPanelMainInventory(NULL)
+{
+
+	//LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
+}
+
+LLSidepanelInventory::~LLSidepanelInventory()
+{
+}
+
+BOOL LLSidepanelInventory::postBuild()
+{
+	// UI elements from inventory panel
+	{
+		mInventoryPanel = getChild<LLPanel>("sidepanel__inventory_panel");
+		
+		mInfoBtn = mInventoryPanel->getChild<LLButton>("info_btn");
+		mInfoBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onInfoButtonClicked, this));
+		
+		mShareBtn = mInventoryPanel->getChild<LLButton>("share_btn");
+		mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this));
+		
+		mWearBtn = mInventoryPanel->getChild<LLButton>("wear_btn");
+		mWearBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onWearButtonClicked, this));
+		
+		mPlayBtn = mInventoryPanel->getChild<LLButton>("play_btn");
+		mPlayBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onPlayButtonClicked, this));
+		
+		mTeleportBtn = mInventoryPanel->getChild<LLButton>("teleport_btn");
+		mTeleportBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onTeleportButtonClicked, this));
+		
+		mOverflowBtn = mInventoryPanel->getChild<LLButton>("overflow_btn");
+		mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this));
+		
+		mPanelMainInventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
+		mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2));
+	}
+
+	// UI elements from item panel
+	{
+		mItemPanel = getChild<LLSidepanelItemInfo>("sidepanel__item_panel");
+		
+		LLButton* back_btn = mItemPanel->getChild<LLButton>("back_btn");
+		back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this));
+	}
+
+	// UI elements from task panel
+	{
+		mTaskPanel = getChild<LLSidepanelTaskInfo>("sidepanel__task_panel");
+		if (mTaskPanel)
+		{
+			LLButton* back_btn = mTaskPanel->getChild<LLButton>("back_btn");
+			back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this));
+		}
+	}
+	
+	return TRUE;
+}
+
+void LLSidepanelInventory::onOpen(const LLSD& key)
+{
+	if(key.size() == 0)
+		return;
+
+	mItemPanel->reset();
+
+	if (key.has("id"))
+	{
+		mItemPanel->setItemID(key["id"].asUUID());
+		if (key.has("object"))
+		{
+			mItemPanel->setObjectID(key["object"].asUUID());
+		}
+		showItemInfoPanel();
+	}
+	if (key.has("task"))
+	{
+		if (mTaskPanel)
+			mTaskPanel->setObjectSelection(LLSelectMgr::getInstance()->getSelection());
+		showTaskInfoPanel();
+	}
+	if (key.has("select"))
+	{
+		mPanelMainInventory->getPanel()->setSelection(key["select"].asUUID(), TAKE_FOCUS_NO);
+	}
+}
+
+void LLSidepanelInventory::onInfoButtonClicked()
+{
+	LLInventoryItem *item = getSelectedItem();
+	if (item)
+	{
+		mItemPanel->reset();
+		mItemPanel->setItemID(item->getUUID());
+		showItemInfoPanel();
+	}
+}
+
+void LLSidepanelInventory::onShareButtonClicked()
+{
+}
+
+void LLSidepanelInventory::performActionOnSelection(const std::string &action)
+{
+	LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
+	LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem();
+	if (!current_item)
+	{
+		return;
+	}
+	current_item->getListener()->performAction(panel_main_inventory->getActivePanel()->getRootFolder(), panel_main_inventory->getActivePanel()->getModel(), action);
+}
+
+void LLSidepanelInventory::onWearButtonClicked()
+{
+	performActionOnSelection("wear");
+	performActionOnSelection("attach");
+}
+
+void LLSidepanelInventory::onPlayButtonClicked()
+{
+	performActionOnSelection("activate");
+}
+
+void LLSidepanelInventory::onTeleportButtonClicked()
+{
+	performActionOnSelection("teleport");
+}
+
+void LLSidepanelInventory::onOverflowButtonClicked()
+{
+}
+
+void LLSidepanelInventory::onBackButtonClicked()
+{
+	showInventoryPanel();
+}
+
+void LLSidepanelInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
+{
+	updateVerbs();
+}
+
+void LLSidepanelInventory::showItemInfoPanel()
+{
+	mItemPanel->setVisible(TRUE);
+	if (mTaskPanel)
+		mTaskPanel->setVisible(FALSE);
+	mInventoryPanel->setVisible(FALSE);
+
+	mItemPanel->dirty();
+	mItemPanel->setIsEditing(FALSE);
+}
+
+void LLSidepanelInventory::showTaskInfoPanel()
+{
+	mItemPanel->setVisible(FALSE);
+	mInventoryPanel->setVisible(FALSE);
+
+	if (mTaskPanel)
+	{
+		mTaskPanel->setVisible(TRUE);
+		mTaskPanel->dirty();
+		mTaskPanel->setIsEditing(FALSE);
+	}
+}
+
+void LLSidepanelInventory::showInventoryPanel()
+{
+	mItemPanel->setVisible(FALSE);
+	if (mTaskPanel)
+		mTaskPanel->setVisible(FALSE);
+	mInventoryPanel->setVisible(TRUE);
+	updateVerbs();
+}
+
+void LLSidepanelInventory::updateVerbs()
+{
+	mInfoBtn->setEnabled(FALSE);
+	mShareBtn->setEnabled(FALSE);
+
+	mWearBtn->setVisible(FALSE);
+	mWearBtn->setEnabled(FALSE);
+	mPlayBtn->setVisible(FALSE);
+	mPlayBtn->setEnabled(FALSE);
+ 	mTeleportBtn->setVisible(FALSE);
+ 	mTeleportBtn->setEnabled(FALSE);
+	
+	const LLInventoryItem *item = getSelectedItem();
+	if (!item)
+		return;
+
+	mInfoBtn->setEnabled(TRUE);
+	mShareBtn->setEnabled(TRUE);
+
+	switch(item->getInventoryType())
+	{
+		case LLInventoryType::IT_WEARABLE:
+		case LLInventoryType::IT_OBJECT:
+		case LLInventoryType::IT_ATTACHMENT:
+			mWearBtn->setVisible(TRUE);
+			mWearBtn->setEnabled(TRUE);
+			break;
+		case LLInventoryType::IT_SOUND:
+		case LLInventoryType::IT_GESTURE:
+		case LLInventoryType::IT_ANIMATION:
+			mPlayBtn->setVisible(TRUE);
+			mPlayBtn->setEnabled(TRUE);
+			break;
+		case LLInventoryType::IT_LANDMARK:
+			mTeleportBtn->setVisible(TRUE);
+			mTeleportBtn->setEnabled(TRUE);
+			break;
+		default:
+			break;
+	}
+}
+
+LLInventoryItem *LLSidepanelInventory::getSelectedItem()
+{
+	LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
+	LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem();
+	if (!current_item)
+	{
+		return NULL;
+	}
+	const LLUUID &item_id = current_item->getListener()->getUUID();
+	LLInventoryItem *item = gInventory.getItem(item_id);
+	return item;
+}
diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h
index 9eba77b5c3f..6aa9cc745fb 100644
--- a/indra/newview/llsidepanelinventory.h
+++ b/indra/newview/llsidepanelinventory.h
@@ -1,91 +1,91 @@
-/** 
- * @file LLSidepanelInventory.h
- * @brief Side Bar "Inventory" panel
- *
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- * 
- * Copyright (c) 2004-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLSIDEPANELINVENTORY_H
-#define LL_LLSIDEPANELINVENTORY_H
-
-#include "llpanel.h"
-
-class LLFolderViewItem;
-class LLInventoryItem;
-class LLPanelMainInventory;
-class LLSidepanelItemInfo;
-class LLSidepanelTaskInfo;
-
-class LLSidepanelInventory : public LLPanel
-{
-public:
-	LLSidepanelInventory();
-	virtual ~LLSidepanelInventory();
-
-	/*virtual*/ BOOL postBuild();
-	/*virtual*/ void onOpen(const LLSD& key);
-
-protected:
-	// Tracks highlighted (selected) item in inventory panel.
-	LLInventoryItem *getSelectedItem();
-	void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
-	// "wear", "teleport", etc.
-	void performActionOnSelection(const std::string &action);
-
-	void showItemInfoPanel();
-	void showTaskInfoPanel();
-	void showInventoryPanel();
-	void updateVerbs();
-
-	//
-	// UI Elements
-	//
-private:
-	LLPanel*					mInventoryPanel; // Main inventory view
-	LLSidepanelItemInfo*		mItemPanel; // Individual item view
-	LLSidepanelTaskInfo*		mTaskPanel; // Individual in-world object view
-	LLPanelMainInventory*		mPanelMainInventory;
-
-protected:
-	void 						onInfoButtonClicked();
-	void 						onShareButtonClicked();
-	void 						onWearButtonClicked();
-	void 						onPlayButtonClicked();
-	void 						onTeleportButtonClicked();
-	void 						onOverflowButtonClicked();
-	void 						onBackButtonClicked();
-private:
-	LLButton*					mInfoBtn;
-	LLButton*					mShareBtn;
-	LLButton*					mWearBtn;
-	LLButton*					mPlayBtn;
-	LLButton*					mTeleportBtn;
-	LLButton*					mOverflowBtn;
-
-};
-
-#endif //LL_LLSIDEPANELINVENTORY_H
+/** 
+ * @file LLSidepanelInventory.h
+ * @brief Side Bar "Inventory" panel
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLSIDEPANELINVENTORY_H
+#define LL_LLSIDEPANELINVENTORY_H
+
+#include "llpanel.h"
+
+class LLFolderViewItem;
+class LLInventoryItem;
+class LLPanelMainInventory;
+class LLSidepanelItemInfo;
+class LLSidepanelTaskInfo;
+
+class LLSidepanelInventory : public LLPanel
+{
+public:
+	LLSidepanelInventory();
+	virtual ~LLSidepanelInventory();
+
+	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void onOpen(const LLSD& key);
+
+protected:
+	// Tracks highlighted (selected) item in inventory panel.
+	LLInventoryItem *getSelectedItem();
+	void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+	// "wear", "teleport", etc.
+	void performActionOnSelection(const std::string &action);
+
+	void showItemInfoPanel();
+	void showTaskInfoPanel();
+	void showInventoryPanel();
+	void updateVerbs();
+
+	//
+	// UI Elements
+	//
+private:
+	LLPanel*					mInventoryPanel; // Main inventory view
+	LLSidepanelItemInfo*		mItemPanel; // Individual item view
+	LLSidepanelTaskInfo*		mTaskPanel; // Individual in-world object view
+	LLPanelMainInventory*		mPanelMainInventory;
+
+protected:
+	void 						onInfoButtonClicked();
+	void 						onShareButtonClicked();
+	void 						onWearButtonClicked();
+	void 						onPlayButtonClicked();
+	void 						onTeleportButtonClicked();
+	void 						onOverflowButtonClicked();
+	void 						onBackButtonClicked();
+private:
+	LLButton*					mInfoBtn;
+	LLButton*					mShareBtn;
+	LLButton*					mWearBtn;
+	LLButton*					mPlayBtn;
+	LLButton*					mTeleportBtn;
+	LLButton*					mOverflowBtn;
+
+};
+
+#endif //LL_LLSIDEPANELINVENTORY_H
diff --git a/indra/newview/llsidepanelinventorysubpanel.cpp b/indra/newview/llsidepanelinventorysubpanel.cpp
index 162198f1c55..23931defdd2 100644
--- a/indra/newview/llsidepanelinventorysubpanel.cpp
+++ b/indra/newview/llsidepanelinventorysubpanel.cpp
@@ -1,155 +1,155 @@
-/** 
- * @file llsidepanelinventorysubpanel.cpp
- * @brief A floater which shows an inventory item's properties.
- *
- * $LicenseInfo:firstyear=2002&license=viewergpl$
- * 
- * Copyright (c) 2002-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-#include "llsidepanelinventorysubpanel.h"
-
-#include "roles_constants.h"
-
-#include "llagent.h"
-#include "llavataractions.h"
-#include "llbutton.h"
-#include "llfloaterreg.h"
-#include "llgroupactions.h"
-#include "llinventorymodel.h"
-#include "lllineeditor.h"
-#include "llradiogroup.h"
-#include "llviewercontrol.h"
-#include "llviewerinventory.h"
-#include "llviewerobjectlist.h"
-
-
-///----------------------------------------------------------------------------
-/// Class LLSidepanelInventorySubpanel
-///----------------------------------------------------------------------------
-
-// Default constructor
-LLSidepanelInventorySubpanel::LLSidepanelInventorySubpanel()
-  : LLPanel(),
-	mIsDirty(TRUE),
-	mIsEditing(FALSE),
-	mEditBtn(NULL),
-	mCancelBtn(NULL),
-	mSaveBtn(NULL)
-{
-}
-
-// Destroys the object
-LLSidepanelInventorySubpanel::~LLSidepanelInventorySubpanel()
-{
-}
-
-// virtual
-BOOL LLSidepanelInventorySubpanel::postBuild()
-{
-	mEditBtn = getChild<LLButton>("edit_btn");
-	mEditBtn->setClickedCallback(boost::bind(&LLSidepanelInventorySubpanel::onEditButtonClicked, this));
-
-	mSaveBtn = getChild<LLButton>("save_btn");
-	mSaveBtn->setClickedCallback(boost::bind(&LLSidepanelInventorySubpanel::onSaveButtonClicked, this));
-
-	mCancelBtn = getChild<LLButton>("cancel_btn");
-	mCancelBtn->setClickedCallback(boost::bind(&LLSidepanelInventorySubpanel::onCancelButtonClicked, this));
-	return TRUE;
-}
-
-void LLSidepanelInventorySubpanel::setVisible(BOOL visible)
-{
-	if (visible)
-	{
-		dirty();
-	}
-	LLPanel::setVisible(visible);
-}
-
-void LLSidepanelInventorySubpanel::setIsEditing(BOOL edit)
-{
-	mIsEditing = edit;
-	mIsDirty = TRUE;
-}
-
-BOOL LLSidepanelInventorySubpanel::getIsEditing() const
-{
-	return mIsEditing;
-}
-
-void LLSidepanelInventorySubpanel::reset()
-{
-	mIsDirty = TRUE;
-}
-
-void LLSidepanelInventorySubpanel::draw()
-{
-	if (mIsDirty)
-	{
-		mIsDirty = FALSE;
-		refresh();
-		updateVerbs();
-	}
-
-	LLPanel::draw();
-}
-
-void LLSidepanelInventorySubpanel::dirty()
-{
-	mIsDirty = TRUE;
-	setIsEditing(FALSE);
-}
-
-void LLSidepanelInventorySubpanel::updateVerbs()
-{
-	mEditBtn->setVisible(!mIsEditing);
-	mSaveBtn->setVisible(mIsEditing);
-	mCancelBtn->setVisible(mIsEditing);
-}
-
-void LLSidepanelInventorySubpanel::onEditButtonClicked()
-{
-	setIsEditing(TRUE);
-	refresh();
-	updateVerbs();
-}
-
-void LLSidepanelInventorySubpanel::onSaveButtonClicked()
-{
-	save();
-	setIsEditing(FALSE);
-	refresh();
-	updateVerbs();
-}
-
-void LLSidepanelInventorySubpanel::onCancelButtonClicked()
-{
-	setIsEditing(FALSE);
-	refresh();
-	updateVerbs();
-}
+/** 
+ * @file llsidepanelinventorysubpanel.cpp
+ * @brief A floater which shows an inventory item's properties.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llsidepanelinventorysubpanel.h"
+
+#include "roles_constants.h"
+
+#include "llagent.h"
+#include "llavataractions.h"
+#include "llbutton.h"
+#include "llfloaterreg.h"
+#include "llgroupactions.h"
+#include "llinventorymodel.h"
+#include "lllineeditor.h"
+#include "llradiogroup.h"
+#include "llviewercontrol.h"
+#include "llviewerinventory.h"
+#include "llviewerobjectlist.h"
+
+
+///----------------------------------------------------------------------------
+/// Class LLSidepanelInventorySubpanel
+///----------------------------------------------------------------------------
+
+// Default constructor
+LLSidepanelInventorySubpanel::LLSidepanelInventorySubpanel()
+  : LLPanel(),
+	mIsDirty(TRUE),
+	mIsEditing(FALSE),
+	mEditBtn(NULL),
+	mCancelBtn(NULL),
+	mSaveBtn(NULL)
+{
+}
+
+// Destroys the object
+LLSidepanelInventorySubpanel::~LLSidepanelInventorySubpanel()
+{
+}
+
+// virtual
+BOOL LLSidepanelInventorySubpanel::postBuild()
+{
+	mEditBtn = getChild<LLButton>("edit_btn");
+	mEditBtn->setClickedCallback(boost::bind(&LLSidepanelInventorySubpanel::onEditButtonClicked, this));
+
+	mSaveBtn = getChild<LLButton>("save_btn");
+	mSaveBtn->setClickedCallback(boost::bind(&LLSidepanelInventorySubpanel::onSaveButtonClicked, this));
+
+	mCancelBtn = getChild<LLButton>("cancel_btn");
+	mCancelBtn->setClickedCallback(boost::bind(&LLSidepanelInventorySubpanel::onCancelButtonClicked, this));
+	return TRUE;
+}
+
+void LLSidepanelInventorySubpanel::setVisible(BOOL visible)
+{
+	if (visible)
+	{
+		dirty();
+	}
+	LLPanel::setVisible(visible);
+}
+
+void LLSidepanelInventorySubpanel::setIsEditing(BOOL edit)
+{
+	mIsEditing = edit;
+	mIsDirty = TRUE;
+}
+
+BOOL LLSidepanelInventorySubpanel::getIsEditing() const
+{
+	return mIsEditing;
+}
+
+void LLSidepanelInventorySubpanel::reset()
+{
+	mIsDirty = TRUE;
+}
+
+void LLSidepanelInventorySubpanel::draw()
+{
+	if (mIsDirty)
+	{
+		mIsDirty = FALSE;
+		refresh();
+		updateVerbs();
+	}
+
+	LLPanel::draw();
+}
+
+void LLSidepanelInventorySubpanel::dirty()
+{
+	mIsDirty = TRUE;
+	setIsEditing(FALSE);
+}
+
+void LLSidepanelInventorySubpanel::updateVerbs()
+{
+	mEditBtn->setVisible(!mIsEditing);
+	mSaveBtn->setVisible(mIsEditing);
+	mCancelBtn->setVisible(mIsEditing);
+}
+
+void LLSidepanelInventorySubpanel::onEditButtonClicked()
+{
+	setIsEditing(TRUE);
+	refresh();
+	updateVerbs();
+}
+
+void LLSidepanelInventorySubpanel::onSaveButtonClicked()
+{
+	save();
+	setIsEditing(FALSE);
+	refresh();
+	updateVerbs();
+}
+
+void LLSidepanelInventorySubpanel::onCancelButtonClicked()
+{
+	setIsEditing(FALSE);
+	refresh();
+	updateVerbs();
+}
diff --git a/indra/newview/llsidepanelinventorysubpanel.h b/indra/newview/llsidepanelinventorysubpanel.h
index 6503887cd1a..a74f4fdee61 100644
--- a/indra/newview/llsidepanelinventorysubpanel.h
+++ b/indra/newview/llsidepanelinventorysubpanel.h
@@ -1,82 +1,82 @@
-/** 
- * @file llsidepanelinventorysubpanel.h
- * @brief A panel which shows an inventory item's properties.
- *
- * $LicenseInfo:firstyear=2002&license=viewergpl$
- * 
- * Copyright (c) 2002-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLSIDEPANELINVENTORYSUBPANEL_H
-#define LL_LLSIDEPANELINVENTORYSUBPANEL_H
-
-#include "llpanel.h"
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLSidepanelInventorySubpanel
-// Base class for inventory sidepanel panels (e.g. item info, task info).
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLButton;
-class LLInventoryItem;
-
-class LLSidepanelInventorySubpanel : public LLPanel
-{
-public:
-	LLSidepanelInventorySubpanel();
-	virtual ~LLSidepanelInventorySubpanel();
-
-	/*virtual*/ void setVisible(BOOL visible);
-	virtual BOOL postBuild();
-	virtual void draw();
-	virtual void reset();
-
-	void dirty();
-	void setIsEditing(BOOL edit);
-protected:
-	virtual void refresh() = 0;
-	virtual void save() = 0;
-	virtual void updateVerbs();
-	
-	BOOL getIsEditing() const;
-	
-	//
-	// UI Elements
-	// 
-protected:
-	void 						onEditButtonClicked();
-	void 						onSaveButtonClicked();
-	void 						onCancelButtonClicked();
-	LLButton*					mEditBtn;
-	LLButton*					mSaveBtn;
-	LLButton*					mCancelBtn;
-
-private:
-	BOOL mIsDirty; 		// item properties need to be updated
-	BOOL mIsEditing; 	// if we're in edit mode
-};
-
-#endif // LL_LLSIDEPANELINVENTORYSUBPANEL_H
+/** 
+ * @file llsidepanelinventorysubpanel.h
+ * @brief A panel which shows an inventory item's properties.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLSIDEPANELINVENTORYSUBPANEL_H
+#define LL_LLSIDEPANELINVENTORYSUBPANEL_H
+
+#include "llpanel.h"
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLSidepanelInventorySubpanel
+// Base class for inventory sidepanel panels (e.g. item info, task info).
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLButton;
+class LLInventoryItem;
+
+class LLSidepanelInventorySubpanel : public LLPanel
+{
+public:
+	LLSidepanelInventorySubpanel();
+	virtual ~LLSidepanelInventorySubpanel();
+
+	/*virtual*/ void setVisible(BOOL visible);
+	virtual BOOL postBuild();
+	virtual void draw();
+	virtual void reset();
+
+	void dirty();
+	void setIsEditing(BOOL edit);
+protected:
+	virtual void refresh() = 0;
+	virtual void save() = 0;
+	virtual void updateVerbs();
+	
+	BOOL getIsEditing() const;
+	
+	//
+	// UI Elements
+	// 
+protected:
+	void 						onEditButtonClicked();
+	void 						onSaveButtonClicked();
+	void 						onCancelButtonClicked();
+	LLButton*					mEditBtn;
+	LLButton*					mSaveBtn;
+	LLButton*					mCancelBtn;
+
+private:
+	BOOL mIsDirty; 		// item properties need to be updated
+	BOOL mIsEditing; 	// if we're in edit mode
+};
+
+#endif // LL_LLSIDEPANELINVENTORYSUBPANEL_H
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index ff6e2d7363c..5081c33f8e2 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -1,883 +1,883 @@
-/** 
- * @file llsidepaneliteminfo.cpp
- * @brief A floater which shows an inventory item's properties.
- *
- * $LicenseInfo:firstyear=2002&license=viewergpl$
- * 
- * Copyright (c) 2002-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-#include "llsidepaneliteminfo.h"
-
-#include "roles_constants.h"
-
-#include "llagent.h"
-#include "llavataractions.h"
-#include "llbutton.h"
-#include "llfloaterreg.h"
-#include "llgroupactions.h"
-#include "llinventorymodel.h"
-#include "llinventoryobserver.h"
-#include "lllineeditor.h"
-#include "llradiogroup.h"
-#include "llviewercontrol.h"
-#include "llviewerinventory.h"
-#include "llviewerobjectlist.h"
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLItemPropertiesObserver
-//
-// Helper class to watch for changes to the item.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLItemPropertiesObserver : public LLInventoryObserver
-{
-public:
-	LLItemPropertiesObserver(LLSidepanelItemInfo* floater)
-		: mFloater(floater)
-	{
-		gInventory.addObserver(this);
-	}
-	virtual ~LLItemPropertiesObserver()
-	{
-		gInventory.removeObserver(this);
-	}
-	virtual void changed(U32 mask);
-private:
-	LLSidepanelItemInfo* mFloater;
-};
-
-void LLItemPropertiesObserver::changed(U32 mask)
-{
-	// if there's a change we're interested in.
-	if((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0)
-	{
-		mFloater->dirty();
-	}
-}
-
-
-
-///----------------------------------------------------------------------------
-/// Class LLSidepanelItemInfo
-///----------------------------------------------------------------------------
-
-static LLRegisterPanelClassWrapper<LLSidepanelItemInfo> t_item_info("sidepanel_item_info");
-
-// Default constructor
-LLSidepanelItemInfo::LLSidepanelItemInfo()
-  : mItemID(LLUUID::null)
-{
-	mPropertiesObserver = new LLItemPropertiesObserver(this);
-	
-	//LLUICtrlFactory::getInstance()->buildFloater(this,"floater_inventory_item_properties.xml");
-}
-
-// Destroys the object
-LLSidepanelItemInfo::~LLSidepanelItemInfo()
-{
-	delete mPropertiesObserver;
-	mPropertiesObserver = NULL;
-}
-
-// virtual
-BOOL LLSidepanelItemInfo::postBuild()
-{
-	LLSidepanelInventorySubpanel::postBuild();
-
-	// build the UI
-	// item name & description
-	childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
-	//getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this));
-	childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
-	//getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this));
-
-	// Creator information
-	getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickCreator,this));
-
-	// owner information
-	getChild<LLUICtrl>("BtnOwner")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickOwner,this));
-
-	refresh();
-	return TRUE;
-}
-
-void LLSidepanelItemInfo::setObjectID(const LLUUID& object_id)
-{
-	mObjectID = object_id;
-}
-
-void LLSidepanelItemInfo::setItemID(const LLUUID& item_id)
-{
-	mItemID = item_id;
-}
-
-void LLSidepanelItemInfo::reset()
-{
-	LLSidepanelInventorySubpanel::reset();
-
-	mObjectID = LLUUID::null;
-	mItemID = LLUUID::null;
-}
-
-void LLSidepanelItemInfo::refresh()
-{
-	LLInventoryItem* item = findItem();
-	if(item)
-	{
-		refreshFromItem(item);
-		updateVerbs();
-	}
-	else
-	{
-		if (getIsEditing())
-		{
-			setIsEditing(FALSE);
-			return;
-		}
-	}
-
-	if (!getIsEditing())
-	{
-		const std::string no_item_names[]={
-			"LabelItemName",
-			"LabelItemDesc",
-			"LabelCreatorName",
-			"LabelOwnerName",
-			"CheckOwnerModify",
-			"CheckOwnerCopy",
-			"CheckOwnerTransfer",
-			"CheckShareWithGroup",
-			"CheckEveryoneCopy",
-			"CheckNextOwnerModify",
-			"CheckNextOwnerCopy",
-			"CheckNextOwnerTransfer",
-			"CheckPurchase",
-			"RadioSaleType",
-			"Edit Cost"
-		};
-
-		for(size_t t=0; t<LL_ARRAY_SIZE(no_item_names); ++t)
-		{
-			childSetEnabled(no_item_names[t],false);
-		}
-		
-		const std::string hide_names[]={
-			"BaseMaskDebug",
-			"OwnerMaskDebug",
-			"GroupMaskDebug",
-			"EveryoneMaskDebug",
-			"NextMaskDebug"
-		};
-		for(size_t t=0; t<LL_ARRAY_SIZE(hide_names); ++t)
-		{
-			childSetVisible(hide_names[t],false);
-		}
-	}
-
-	if (!item)
-	{
-		const std::string no_edit_mode_names[]={
-			"BtnCreator",
-			"BtnOwner",
-		};
-		for(size_t t=0; t<LL_ARRAY_SIZE(no_edit_mode_names); ++t)
-		{
-			childSetEnabled(no_edit_mode_names[t],false);
-		}
-	}
-
-	updateVerbs();
-}
-
-void LLSidepanelItemInfo::refreshFromItem(LLInventoryItem* item)
-{
-	////////////////////////
-	// PERMISSIONS LOOKUP //
-	////////////////////////
-
-	// do not enable the UI for incomplete items.
-	LLViewerInventoryItem* i = (LLViewerInventoryItem*)item;
-	BOOL is_complete = i->isComplete();
-	const BOOL cannot_restrict_permissions = LLInventoryType::cannotRestrictPermissions(i->getInventoryType());
-	const BOOL is_calling_card = (i->getInventoryType() == LLInventoryType::IT_CALLINGCARD);
-	const LLPermissions& perm = item->getPermissions();
-	const BOOL can_agent_manipulate = gAgent.allowOperation(PERM_OWNER, perm, 
-															GP_OBJECT_MANIPULATE);
-	const BOOL can_agent_sell = gAgent.allowOperation(PERM_OWNER, perm, 
-													  GP_OBJECT_SET_SALE) &&
-		!cannot_restrict_permissions;
-	const BOOL is_link = i->getIsLinkType();
-
-	// You need permission to modify the object to modify an inventory
-	// item in it.
-	LLViewerObject* object = NULL;
-	if(!mObjectID.isNull()) object = gObjectList.findObject(mObjectID);
-	BOOL is_obj_modify = TRUE;
-	if(object)
-	{
-		is_obj_modify = object->permOwnerModify();
-	}
-
-	//////////////////////
-	// ITEM NAME & DESC //
-	//////////////////////
-	BOOL is_modifiable = gAgent.allowOperation(PERM_MODIFY, perm,
-											   GP_OBJECT_MANIPULATE)
-		&& is_obj_modify && is_complete;
-
-	childSetEnabled("LabelItemNameTitle",TRUE);
-	childSetEnabled("LabelItemName",is_modifiable && !is_calling_card); // for now, don't allow rename of calling cards
-	childSetText("LabelItemName",item->getName());
-	childSetEnabled("LabelItemDescTitle",TRUE);
-	childSetEnabled("LabelItemDesc",is_modifiable);
-	childSetVisible("IconLocked",!is_modifiable);
-	childSetText("LabelItemDesc",item->getDescription());
-
-	//////////////////
-	// CREATOR NAME //
-	//////////////////
-	if(!gCacheName) return;
-	if(!gAgent.getRegion()) return;
-
-	if (item->getCreatorUUID().notNull())
-	{
-		std::string name;
-		gCacheName->getFullName(item->getCreatorUUID(), name);
-		childSetEnabled("BtnCreator",TRUE);
-		childSetEnabled("LabelCreatorTitle",TRUE);
-		childSetEnabled("LabelCreatorName",TRUE);
-		childSetText("LabelCreatorName",name);
-	}
-	else
-	{
-		childSetEnabled("BtnCreator",FALSE);
-		childSetEnabled("LabelCreatorTitle",FALSE);
-		childSetEnabled("LabelCreatorName",FALSE);
-		childSetText("LabelCreatorName",getString("unknown"));
-	}
-
-	////////////////
-	// OWNER NAME //
-	////////////////
-	if(perm.isOwned())
-	{
-		std::string name;
-		if (perm.isGroupOwned())
-		{
-			gCacheName->getGroupName(perm.getGroup(), name);
-		}
-		else
-		{
-			gCacheName->getFullName(perm.getOwner(), name);
-		}
-		childSetEnabled("BtnOwner",TRUE);
-		childSetEnabled("LabelOwnerTitle",TRUE);
-		childSetEnabled("LabelOwnerName",TRUE);
-		childSetText("LabelOwnerName",name);
-	}
-	else
-	{
-		childSetEnabled("BtnOwner",FALSE);
-		childSetEnabled("LabelOwnerTitle",FALSE);
-		childSetEnabled("LabelOwnerName",FALSE);
-		childSetText("LabelOwnerName",getString("public"));
-	}
-	
-	//////////////////
-	// ACQUIRE DATE //
-	//////////////////
-	
-	time_t time_utc = item->getCreationDate();
-	if (0 == time_utc)
-	{
-		childSetText("LabelAcquiredDate",getString("unknown"));
-	}
-	else
-	{
-		std::string timeStr = getString("acquiredDate");
-		LLSD substitution;
-		substitution["datetime"] = (S32) time_utc;
-		LLStringUtil::format (timeStr, substitution);
-		childSetText ("LabelAcquiredDate", timeStr);
-	}
-
-	///////////////////////
-	// OWNER PERMISSIONS //
-	///////////////////////
-	if(can_agent_manipulate)
-	{
-		childSetText("OwnerLabel",getString("you_can"));
-	}
-	else
-	{
-		childSetText("OwnerLabel",getString("owner_can"));
-	}
-
-	U32 base_mask		= perm.getMaskBase();
-	U32 owner_mask		= perm.getMaskOwner();
-	U32 group_mask		= perm.getMaskGroup();
-	U32 everyone_mask	= perm.getMaskEveryone();
-	U32 next_owner_mask	= perm.getMaskNextOwner();
-
-	childSetEnabled("OwnerLabel",TRUE);
-	childSetEnabled("CheckOwnerModify",FALSE);
-	childSetValue("CheckOwnerModify",LLSD((BOOL)(owner_mask & PERM_MODIFY)));
-	childSetEnabled("CheckOwnerCopy",FALSE);
-	childSetValue("CheckOwnerCopy",LLSD((BOOL)(owner_mask & PERM_COPY)));
-	childSetEnabled("CheckOwnerTransfer",FALSE);
-	childSetValue("CheckOwnerTransfer",LLSD((BOOL)(owner_mask & PERM_TRANSFER)));
-
-	///////////////////////
-	// DEBUG PERMISSIONS //
-	///////////////////////
-
-	if( gSavedSettings.getBOOL("DebugPermissions") )
-	{
-		BOOL slam_perm 			= FALSE;
-		BOOL overwrite_group	= FALSE;
-		BOOL overwrite_everyone	= FALSE;
-
-		if (item->getType() == LLAssetType::AT_OBJECT)
-		{
-			U32 flags = item->getFlags();
-			slam_perm 			= flags & LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM;
-			overwrite_everyone	= flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
-			overwrite_group		= flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
-		}
-		
-		std::string perm_string;
-
-		perm_string = "B: ";
-		perm_string += mask_to_string(base_mask);
-		childSetText("BaseMaskDebug",perm_string);
-		childSetVisible("BaseMaskDebug",TRUE);
-		
-		perm_string = "O: ";
-		perm_string += mask_to_string(owner_mask);
-		childSetText("OwnerMaskDebug",perm_string);
-		childSetVisible("OwnerMaskDebug",TRUE);
-		
-		perm_string = "G";
-		perm_string += overwrite_group ? "*: " : ": ";
-		perm_string += mask_to_string(group_mask);
-		childSetText("GroupMaskDebug",perm_string);
-		childSetVisible("GroupMaskDebug",TRUE);
-		
-		perm_string = "E";
-		perm_string += overwrite_everyone ? "*: " : ": ";
-		perm_string += mask_to_string(everyone_mask);
-		childSetText("EveryoneMaskDebug",perm_string);
-		childSetVisible("EveryoneMaskDebug",TRUE);
-		
-		perm_string = "N";
-		perm_string += slam_perm ? "*: " : ": ";
-		perm_string += mask_to_string(next_owner_mask);
-		childSetText("NextMaskDebug",perm_string);
-		childSetVisible("NextMaskDebug",TRUE);
-	}
-	else
-	{
-		childSetVisible("BaseMaskDebug",FALSE);
-		childSetVisible("OwnerMaskDebug",FALSE);
-		childSetVisible("GroupMaskDebug",FALSE);
-		childSetVisible("EveryoneMaskDebug",FALSE);
-		childSetVisible("NextMaskDebug",FALSE);
-	}
-
-	/////////////
-	// SHARING //
-	/////////////
-
-	// Check for ability to change values.
-	if (is_link || cannot_restrict_permissions)
-	{
-		childSetEnabled("CheckShareWithGroup",FALSE);
-		childSetEnabled("CheckEveryoneCopy",FALSE);
-	}
-	else if (is_obj_modify && can_agent_manipulate)
-	{
-		childSetEnabled("CheckShareWithGroup",TRUE);
-		childSetEnabled("CheckEveryoneCopy",(owner_mask & PERM_COPY) && (owner_mask & PERM_TRANSFER));
-	}
-	else
-	{
-		childSetEnabled("CheckShareWithGroup",FALSE);
-		childSetEnabled("CheckEveryoneCopy",FALSE);
-	}
-
-	// Set values.
-	BOOL is_group_copy = (group_mask & PERM_COPY) ? TRUE : FALSE;
-	BOOL is_group_modify = (group_mask & PERM_MODIFY) ? TRUE : FALSE;
-	BOOL is_group_move = (group_mask & PERM_MOVE) ? TRUE : FALSE;
-
-	if (is_group_copy && is_group_modify && is_group_move)
-	{
-		childSetValue("CheckShareWithGroup",LLSD((BOOL)TRUE));
-
-		LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
-		if(ctl)
-		{
-			ctl->setTentative(FALSE);
-		}
-	}
-	else if (!is_group_copy && !is_group_modify && !is_group_move)
-	{
-		childSetValue("CheckShareWithGroup",LLSD((BOOL)FALSE));
-		LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
-		if(ctl)
-		{
-			ctl->setTentative(FALSE);
-		}
-	}
-	else
-	{
-		LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
-		if(ctl)
-		{
-			ctl->setTentative(TRUE);
-			ctl->set(TRUE);
-		}
-	}
-	
-	childSetValue("CheckEveryoneCopy",LLSD((BOOL)(everyone_mask & PERM_COPY)));
-
-	///////////////
-	// SALE INFO //
-	///////////////
-
-	const LLSaleInfo& sale_info = item->getSaleInfo();
-	BOOL is_for_sale = sale_info.isForSale();
-	// Check for ability to change values.
-	if (is_obj_modify && can_agent_sell 
-		&& gAgent.allowOperation(PERM_TRANSFER, perm, GP_OBJECT_MANIPULATE))
-	{
-		childSetEnabled("SaleLabel",is_complete);
-		childSetEnabled("CheckPurchase",is_complete);
-
-		childSetEnabled("NextOwnerLabel",TRUE);
-		childSetEnabled("CheckNextOwnerModify",(base_mask & PERM_MODIFY) && !cannot_restrict_permissions);
-		childSetEnabled("CheckNextOwnerCopy",(base_mask & PERM_COPY) && !cannot_restrict_permissions);
-		childSetEnabled("CheckNextOwnerTransfer",(next_owner_mask & PERM_COPY) && !cannot_restrict_permissions);
-
-		childSetEnabled("RadioSaleType",is_complete && is_for_sale);
-		childSetEnabled("TextPrice",is_complete && is_for_sale);
-		childSetEnabled("Edit Cost",is_complete && is_for_sale);
-	}
-	else
-	{
-		childSetEnabled("SaleLabel",FALSE);
-		childSetEnabled("CheckPurchase",FALSE);
-
-		childSetEnabled("NextOwnerLabel",FALSE);
-		childSetEnabled("CheckNextOwnerModify",FALSE);
-		childSetEnabled("CheckNextOwnerCopy",FALSE);
-		childSetEnabled("CheckNextOwnerTransfer",FALSE);
-
-		childSetEnabled("RadioSaleType",FALSE);
-		childSetEnabled("TextPrice",FALSE);
-		childSetEnabled("Edit Cost",FALSE);
-	}
-
-	// Set values.
-	childSetValue("CheckPurchase", is_for_sale);
-	childSetEnabled("combobox sale copy", is_for_sale);
-	childSetEnabled("Edit Cost", is_for_sale);
-	childSetValue("CheckNextOwnerModify",LLSD(BOOL(next_owner_mask & PERM_MODIFY)));
-	childSetValue("CheckNextOwnerCopy",LLSD(BOOL(next_owner_mask & PERM_COPY)));
-	childSetValue("CheckNextOwnerTransfer",LLSD(BOOL(next_owner_mask & PERM_TRANSFER)));
-
-	LLRadioGroup* radioSaleType = getChild<LLRadioGroup>("RadioSaleType");
-	if (is_for_sale)
-	{
-		radioSaleType->setSelectedIndex((S32)sale_info.getSaleType() - 1);
-		S32 numerical_price;
-		numerical_price = sale_info.getSalePrice();
-		childSetText("Edit Cost",llformat("%d",numerical_price));
-	}
-	else
-	{
-		radioSaleType->setSelectedIndex(-1);
-		childSetText("Edit Cost",llformat("%d",0));
-	}
-}
-
-void LLSidepanelItemInfo::onClickCreator()
-{
-	LLInventoryItem* item = findItem();
-	if(!item) return;
-	if(!item->getCreatorUUID().isNull())
-	{
-		LLAvatarActions::showProfile(item->getCreatorUUID());
-	}
-}
-
-// static
-void LLSidepanelItemInfo::onClickOwner()
-{
-	LLInventoryItem* item = findItem();
-	if(!item) return;
-	if(item->getPermissions().isGroupOwned())
-	{
-		LLGroupActions::show(item->getPermissions().getGroup());
-	}
-	else
-	{
-		LLAvatarActions::showProfile(item->getPermissions().getOwner());
-	}
-}
-
-// static
-void LLSidepanelItemInfo::onCommitName()
-{
-	//llinfos << "LLSidepanelItemInfo::onCommitName()" << llendl;
-	LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem();
-	if(!item)
-	{
-		return;
-	}
-	LLLineEditor* labelItemName = getChild<LLLineEditor>("LabelItemName");
-
-	if(labelItemName&&
-	   (item->getName() != labelItemName->getText()) && 
-	   (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE)) )
-	{
-		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
-		new_item->rename(labelItemName->getText());
-		if(mObjectID.isNull())
-		{
-			new_item->updateServer(FALSE);
-			gInventory.updateItem(new_item);
-			gInventory.notifyObservers();
-		}
-		else
-		{
-			LLViewerObject* object = gObjectList.findObject(mObjectID);
-			if(object)
-			{
-				object->updateInventory(
-					new_item,
-					TASK_INVENTORY_ITEM_KEY,
-					false);
-			}
-		}
-	}
-}
-
-void LLSidepanelItemInfo::onCommitDescription()
-{
-	//llinfos << "LLSidepanelItemInfo::onCommitDescription()" << llendl;
-	LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem();
-	if(!item) return;
-
-	LLLineEditor* labelItemDesc = getChild<LLLineEditor>("LabelItemDesc");
-	if(!labelItemDesc)
-	{
-		return;
-	}
-	if((item->getDescription() != labelItemDesc->getText()) && 
-	   (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE)))
-	{
-		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
-
-		new_item->setDescription(labelItemDesc->getText());
-		if(mObjectID.isNull())
-		{
-			new_item->updateServer(FALSE);
-			gInventory.updateItem(new_item);
-			gInventory.notifyObservers();
-		}
-		else
-		{
-			LLViewerObject* object = gObjectList.findObject(mObjectID);
-			if(object)
-			{
-				object->updateInventory(
-					new_item,
-					TASK_INVENTORY_ITEM_KEY,
-					false);
-			}
-		}
-	}
-}
-
-// static
-void LLSidepanelItemInfo::onCommitPermissions()
-{
-	//llinfos << "LLSidepanelItemInfo::onCommitPermissions()" << llendl;
-	LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem();
-	if(!item) return;
-	LLPermissions perm(item->getPermissions());
-
-
-	LLCheckBoxCtrl* CheckShareWithGroup = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
-
-	if(CheckShareWithGroup)
-	{
-		perm.setGroupBits(gAgent.getID(), gAgent.getGroupID(),
-						CheckShareWithGroup->get(),
-						PERM_MODIFY | PERM_MOVE | PERM_COPY);
-	}
-	LLCheckBoxCtrl* CheckEveryoneCopy = getChild<LLCheckBoxCtrl>("CheckEveryoneCopy");
-	if(CheckEveryoneCopy)
-	{
-		perm.setEveryoneBits(gAgent.getID(), gAgent.getGroupID(),
-						 CheckEveryoneCopy->get(), PERM_COPY);
-	}
-
-	LLCheckBoxCtrl* CheckNextOwnerModify = getChild<LLCheckBoxCtrl>("CheckNextOwnerModify");
-	if(CheckNextOwnerModify)
-	{
-		perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(),
-							CheckNextOwnerModify->get(), PERM_MODIFY);
-	}
-	LLCheckBoxCtrl* CheckNextOwnerCopy = getChild<LLCheckBoxCtrl>("CheckNextOwnerCopy");
-	if(CheckNextOwnerCopy)
-	{
-		perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(),
-							CheckNextOwnerCopy->get(), PERM_COPY);
-	}
-	LLCheckBoxCtrl* CheckNextOwnerTransfer = getChild<LLCheckBoxCtrl>("CheckNextOwnerTransfer");
-	if(CheckNextOwnerTransfer)
-	{
-		perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(),
-							CheckNextOwnerTransfer->get(), PERM_TRANSFER);
-	}
-	if(perm != item->getPermissions()
-		&& item->isComplete())
-	{
-		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
-		new_item->setPermissions(perm);
-		U32 flags = new_item->getFlags();
-		// If next owner permissions have changed (and this is an object)
-		// then set the slam permissions flag so that they are applied on rez.
-		if((perm.getMaskNextOwner()!=item->getPermissions().getMaskNextOwner())
-		   && (item->getType() == LLAssetType::AT_OBJECT))
-		{
-			flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM;
-		}
-		// If everyone permissions have changed (and this is an object)
-		// then set the overwrite everyone permissions flag so they
-		// are applied on rez.
-		if ((perm.getMaskEveryone()!=item->getPermissions().getMaskEveryone())
-			&& (item->getType() == LLAssetType::AT_OBJECT))
-		{
-			flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
-		}
-		// If group permissions have changed (and this is an object)
-		// then set the overwrite group permissions flag so they
-		// are applied on rez.
-		if ((perm.getMaskGroup()!=item->getPermissions().getMaskGroup())
-			&& (item->getType() == LLAssetType::AT_OBJECT))
-		{
-			flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
-		}
-		new_item->setFlags(flags);
-		if(mObjectID.isNull())
-		{
-			new_item->updateServer(FALSE);
-			gInventory.updateItem(new_item);
-			gInventory.notifyObservers();
-		}
-		else
-		{
-			LLViewerObject* object = gObjectList.findObject(mObjectID);
-			if(object)
-			{
-				object->updateInventory(
-					new_item,
-					TASK_INVENTORY_ITEM_KEY,
-					false);
-			}
-		}
-	}
-	else
-	{
-		// need to make sure we don't just follow the click
-		refresh();
-	}
-}
-
-// static
-void LLSidepanelItemInfo::onCommitSaleInfo()
-{
-	//llinfos << "LLSidepanelItemInfo::onCommitSaleInfo()" << llendl;
-	updateSaleInfo();
-}
-
-// static
-void LLSidepanelItemInfo::onCommitSaleType()
-{
-	//llinfos << "LLSidepanelItemInfo::onCommitSaleType()" << llendl;
-	updateSaleInfo();
-}
-
-void LLSidepanelItemInfo::updateSaleInfo()
-{
-	LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem();
-	if(!item) return;
-	LLSaleInfo sale_info(item->getSaleInfo());
-	if(!gAgent.allowOperation(PERM_TRANSFER, item->getPermissions(), GP_OBJECT_SET_SALE))
-	{
-		childSetValue("CheckPurchase",LLSD((BOOL)FALSE));
-	}
-
-	if((BOOL)childGetValue("CheckPurchase"))
-	{
-		// turn on sale info
-		LLSaleInfo::EForSale sale_type = LLSaleInfo::FS_COPY;
-	
-		LLRadioGroup* RadioSaleType = getChild<LLRadioGroup>("RadioSaleType");
-		if(RadioSaleType)
-		{
-			switch (RadioSaleType->getSelectedIndex())
-			{
-			case 0:
-				sale_type = LLSaleInfo::FS_ORIGINAL;
-				break;
-			case 1:
-				sale_type = LLSaleInfo::FS_COPY;
-				break;
-			case 2:
-				sale_type = LLSaleInfo::FS_CONTENTS;
-				break;
-			default:
-				sale_type = LLSaleInfo::FS_COPY;
-				break;
-			}
-		}
-
-		if (sale_type == LLSaleInfo::FS_COPY 
-			&& !gAgent.allowOperation(PERM_COPY, item->getPermissions(), 
-									  GP_OBJECT_SET_SALE))
-		{
-			sale_type = LLSaleInfo::FS_ORIGINAL;
-		}
-
-	     
-		
-		S32 price = -1;
-		price =  getChild<LLUICtrl>("Edit Cost")->getValue().asInteger();;
-
-		// Invalid data - turn off the sale
-		if (price < 0)
-		{
-			sale_type = LLSaleInfo::FS_NOT;
-			price = 0;
-		}
-
-		sale_info.setSaleType(sale_type);
-		sale_info.setSalePrice(price);
-	}
-	else
-	{
-		sale_info.setSaleType(LLSaleInfo::FS_NOT);
-	}
-	if(sale_info != item->getSaleInfo()
-		&& item->isComplete())
-	{
-		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
-
-		// Force an update on the sale price at rez
-		if (item->getType() == LLAssetType::AT_OBJECT)
-		{
-			U32 flags = new_item->getFlags();
-			flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_SALE;
-			new_item->setFlags(flags);
-		}
-
-		new_item->setSaleInfo(sale_info);
-		if(mObjectID.isNull())
-		{
-			// This is in the agent's inventory.
-			new_item->updateServer(FALSE);
-			gInventory.updateItem(new_item);
-			gInventory.notifyObservers();
-		}
-		else
-		{
-			// This is in an object's contents.
-			LLViewerObject* object = gObjectList.findObject(mObjectID);
-			if(object)
-			{
-				object->updateInventory(
-					new_item,
-					TASK_INVENTORY_ITEM_KEY,
-					false);
-			}
-		}
-	}
-	else
-	{
-		// need to make sure we don't just follow the click
-		refresh();
-	}
-}
-
-LLInventoryItem* LLSidepanelItemInfo::findItem() const
-{
-	LLInventoryItem* item = NULL;
-	if(mObjectID.isNull())
-	{
-		// it is in agent inventory
-		item = gInventory.getItem(mItemID);
-	}
-	else
-	{
-		LLViewerObject* object = gObjectList.findObject(mObjectID);
-		if(object)
-		{
-			item = (LLInventoryItem*)object->getInventoryObject(mItemID);
-		}
-	}
-	return item;
-}
-
-// virtual
-void LLSidepanelItemInfo::updateVerbs()
-{
-	LLSidepanelInventorySubpanel::updateVerbs();
-
-	const LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem();
-	if (item)
-	{
-		const LLPermissions& perm = item->getPermissions();
-		BOOL is_modifiable = gAgent.allowOperation(PERM_MODIFY, perm,
-												   GP_OBJECT_MANIPULATE);
-		mEditBtn->setEnabled(is_modifiable);
-	}
-}
-
-// virtual
-void LLSidepanelItemInfo::save()
-{
-	onCommitName();
-	onCommitDescription();
-	onCommitPermissions();
-	onCommitSaleInfo();
-	onCommitSaleType();
-}
+/** 
+ * @file llsidepaneliteminfo.cpp
+ * @brief A floater which shows an inventory item's properties.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llsidepaneliteminfo.h"
+
+#include "roles_constants.h"
+
+#include "llagent.h"
+#include "llavataractions.h"
+#include "llbutton.h"
+#include "llfloaterreg.h"
+#include "llgroupactions.h"
+#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
+#include "lllineeditor.h"
+#include "llradiogroup.h"
+#include "llviewercontrol.h"
+#include "llviewerinventory.h"
+#include "llviewerobjectlist.h"
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLItemPropertiesObserver
+//
+// Helper class to watch for changes to the item.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLItemPropertiesObserver : public LLInventoryObserver
+{
+public:
+	LLItemPropertiesObserver(LLSidepanelItemInfo* floater)
+		: mFloater(floater)
+	{
+		gInventory.addObserver(this);
+	}
+	virtual ~LLItemPropertiesObserver()
+	{
+		gInventory.removeObserver(this);
+	}
+	virtual void changed(U32 mask);
+private:
+	LLSidepanelItemInfo* mFloater;
+};
+
+void LLItemPropertiesObserver::changed(U32 mask)
+{
+	// if there's a change we're interested in.
+	if((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0)
+	{
+		mFloater->dirty();
+	}
+}
+
+
+
+///----------------------------------------------------------------------------
+/// Class LLSidepanelItemInfo
+///----------------------------------------------------------------------------
+
+static LLRegisterPanelClassWrapper<LLSidepanelItemInfo> t_item_info("sidepanel_item_info");
+
+// Default constructor
+LLSidepanelItemInfo::LLSidepanelItemInfo()
+  : mItemID(LLUUID::null)
+{
+	mPropertiesObserver = new LLItemPropertiesObserver(this);
+	
+	//LLUICtrlFactory::getInstance()->buildFloater(this,"floater_inventory_item_properties.xml");
+}
+
+// Destroys the object
+LLSidepanelItemInfo::~LLSidepanelItemInfo()
+{
+	delete mPropertiesObserver;
+	mPropertiesObserver = NULL;
+}
+
+// virtual
+BOOL LLSidepanelItemInfo::postBuild()
+{
+	LLSidepanelInventorySubpanel::postBuild();
+
+	// build the UI
+	// item name & description
+	childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+	//getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this));
+	childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+	//getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this));
+
+	// Creator information
+	getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickCreator,this));
+
+	// owner information
+	getChild<LLUICtrl>("BtnOwner")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickOwner,this));
+
+	refresh();
+	return TRUE;
+}
+
+void LLSidepanelItemInfo::setObjectID(const LLUUID& object_id)
+{
+	mObjectID = object_id;
+}
+
+void LLSidepanelItemInfo::setItemID(const LLUUID& item_id)
+{
+	mItemID = item_id;
+}
+
+void LLSidepanelItemInfo::reset()
+{
+	LLSidepanelInventorySubpanel::reset();
+
+	mObjectID = LLUUID::null;
+	mItemID = LLUUID::null;
+}
+
+void LLSidepanelItemInfo::refresh()
+{
+	LLInventoryItem* item = findItem();
+	if(item)
+	{
+		refreshFromItem(item);
+		updateVerbs();
+	}
+	else
+	{
+		if (getIsEditing())
+		{
+			setIsEditing(FALSE);
+			return;
+		}
+	}
+
+	if (!getIsEditing())
+	{
+		const std::string no_item_names[]={
+			"LabelItemName",
+			"LabelItemDesc",
+			"LabelCreatorName",
+			"LabelOwnerName",
+			"CheckOwnerModify",
+			"CheckOwnerCopy",
+			"CheckOwnerTransfer",
+			"CheckShareWithGroup",
+			"CheckEveryoneCopy",
+			"CheckNextOwnerModify",
+			"CheckNextOwnerCopy",
+			"CheckNextOwnerTransfer",
+			"CheckPurchase",
+			"RadioSaleType",
+			"Edit Cost"
+		};
+
+		for(size_t t=0; t<LL_ARRAY_SIZE(no_item_names); ++t)
+		{
+			childSetEnabled(no_item_names[t],false);
+		}
+		
+		const std::string hide_names[]={
+			"BaseMaskDebug",
+			"OwnerMaskDebug",
+			"GroupMaskDebug",
+			"EveryoneMaskDebug",
+			"NextMaskDebug"
+		};
+		for(size_t t=0; t<LL_ARRAY_SIZE(hide_names); ++t)
+		{
+			childSetVisible(hide_names[t],false);
+		}
+	}
+
+	if (!item)
+	{
+		const std::string no_edit_mode_names[]={
+			"BtnCreator",
+			"BtnOwner",
+		};
+		for(size_t t=0; t<LL_ARRAY_SIZE(no_edit_mode_names); ++t)
+		{
+			childSetEnabled(no_edit_mode_names[t],false);
+		}
+	}
+
+	updateVerbs();
+}
+
+void LLSidepanelItemInfo::refreshFromItem(LLInventoryItem* item)
+{
+	////////////////////////
+	// PERMISSIONS LOOKUP //
+	////////////////////////
+
+	// do not enable the UI for incomplete items.
+	LLViewerInventoryItem* i = (LLViewerInventoryItem*)item;
+	BOOL is_complete = i->isComplete();
+	const BOOL cannot_restrict_permissions = LLInventoryType::cannotRestrictPermissions(i->getInventoryType());
+	const BOOL is_calling_card = (i->getInventoryType() == LLInventoryType::IT_CALLINGCARD);
+	const LLPermissions& perm = item->getPermissions();
+	const BOOL can_agent_manipulate = gAgent.allowOperation(PERM_OWNER, perm, 
+															GP_OBJECT_MANIPULATE);
+	const BOOL can_agent_sell = gAgent.allowOperation(PERM_OWNER, perm, 
+													  GP_OBJECT_SET_SALE) &&
+		!cannot_restrict_permissions;
+	const BOOL is_link = i->getIsLinkType();
+
+	// You need permission to modify the object to modify an inventory
+	// item in it.
+	LLViewerObject* object = NULL;
+	if(!mObjectID.isNull()) object = gObjectList.findObject(mObjectID);
+	BOOL is_obj_modify = TRUE;
+	if(object)
+	{
+		is_obj_modify = object->permOwnerModify();
+	}
+
+	//////////////////////
+	// ITEM NAME & DESC //
+	//////////////////////
+	BOOL is_modifiable = gAgent.allowOperation(PERM_MODIFY, perm,
+											   GP_OBJECT_MANIPULATE)
+		&& is_obj_modify && is_complete;
+
+	childSetEnabled("LabelItemNameTitle",TRUE);
+	childSetEnabled("LabelItemName",is_modifiable && !is_calling_card); // for now, don't allow rename of calling cards
+	childSetText("LabelItemName",item->getName());
+	childSetEnabled("LabelItemDescTitle",TRUE);
+	childSetEnabled("LabelItemDesc",is_modifiable);
+	childSetVisible("IconLocked",!is_modifiable);
+	childSetText("LabelItemDesc",item->getDescription());
+
+	//////////////////
+	// CREATOR NAME //
+	//////////////////
+	if(!gCacheName) return;
+	if(!gAgent.getRegion()) return;
+
+	if (item->getCreatorUUID().notNull())
+	{
+		std::string name;
+		gCacheName->getFullName(item->getCreatorUUID(), name);
+		childSetEnabled("BtnCreator",TRUE);
+		childSetEnabled("LabelCreatorTitle",TRUE);
+		childSetEnabled("LabelCreatorName",TRUE);
+		childSetText("LabelCreatorName",name);
+	}
+	else
+	{
+		childSetEnabled("BtnCreator",FALSE);
+		childSetEnabled("LabelCreatorTitle",FALSE);
+		childSetEnabled("LabelCreatorName",FALSE);
+		childSetText("LabelCreatorName",getString("unknown"));
+	}
+
+	////////////////
+	// OWNER NAME //
+	////////////////
+	if(perm.isOwned())
+	{
+		std::string name;
+		if (perm.isGroupOwned())
+		{
+			gCacheName->getGroupName(perm.getGroup(), name);
+		}
+		else
+		{
+			gCacheName->getFullName(perm.getOwner(), name);
+		}
+		childSetEnabled("BtnOwner",TRUE);
+		childSetEnabled("LabelOwnerTitle",TRUE);
+		childSetEnabled("LabelOwnerName",TRUE);
+		childSetText("LabelOwnerName",name);
+	}
+	else
+	{
+		childSetEnabled("BtnOwner",FALSE);
+		childSetEnabled("LabelOwnerTitle",FALSE);
+		childSetEnabled("LabelOwnerName",FALSE);
+		childSetText("LabelOwnerName",getString("public"));
+	}
+	
+	//////////////////
+	// ACQUIRE DATE //
+	//////////////////
+	
+	time_t time_utc = item->getCreationDate();
+	if (0 == time_utc)
+	{
+		childSetText("LabelAcquiredDate",getString("unknown"));
+	}
+	else
+	{
+		std::string timeStr = getString("acquiredDate");
+		LLSD substitution;
+		substitution["datetime"] = (S32) time_utc;
+		LLStringUtil::format (timeStr, substitution);
+		childSetText ("LabelAcquiredDate", timeStr);
+	}
+
+	///////////////////////
+	// OWNER PERMISSIONS //
+	///////////////////////
+	if(can_agent_manipulate)
+	{
+		childSetText("OwnerLabel",getString("you_can"));
+	}
+	else
+	{
+		childSetText("OwnerLabel",getString("owner_can"));
+	}
+
+	U32 base_mask		= perm.getMaskBase();
+	U32 owner_mask		= perm.getMaskOwner();
+	U32 group_mask		= perm.getMaskGroup();
+	U32 everyone_mask	= perm.getMaskEveryone();
+	U32 next_owner_mask	= perm.getMaskNextOwner();
+
+	childSetEnabled("OwnerLabel",TRUE);
+	childSetEnabled("CheckOwnerModify",FALSE);
+	childSetValue("CheckOwnerModify",LLSD((BOOL)(owner_mask & PERM_MODIFY)));
+	childSetEnabled("CheckOwnerCopy",FALSE);
+	childSetValue("CheckOwnerCopy",LLSD((BOOL)(owner_mask & PERM_COPY)));
+	childSetEnabled("CheckOwnerTransfer",FALSE);
+	childSetValue("CheckOwnerTransfer",LLSD((BOOL)(owner_mask & PERM_TRANSFER)));
+
+	///////////////////////
+	// DEBUG PERMISSIONS //
+	///////////////////////
+
+	if( gSavedSettings.getBOOL("DebugPermissions") )
+	{
+		BOOL slam_perm 			= FALSE;
+		BOOL overwrite_group	= FALSE;
+		BOOL overwrite_everyone	= FALSE;
+
+		if (item->getType() == LLAssetType::AT_OBJECT)
+		{
+			U32 flags = item->getFlags();
+			slam_perm 			= flags & LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM;
+			overwrite_everyone	= flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
+			overwrite_group		= flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
+		}
+		
+		std::string perm_string;
+
+		perm_string = "B: ";
+		perm_string += mask_to_string(base_mask);
+		childSetText("BaseMaskDebug",perm_string);
+		childSetVisible("BaseMaskDebug",TRUE);
+		
+		perm_string = "O: ";
+		perm_string += mask_to_string(owner_mask);
+		childSetText("OwnerMaskDebug",perm_string);
+		childSetVisible("OwnerMaskDebug",TRUE);
+		
+		perm_string = "G";
+		perm_string += overwrite_group ? "*: " : ": ";
+		perm_string += mask_to_string(group_mask);
+		childSetText("GroupMaskDebug",perm_string);
+		childSetVisible("GroupMaskDebug",TRUE);
+		
+		perm_string = "E";
+		perm_string += overwrite_everyone ? "*: " : ": ";
+		perm_string += mask_to_string(everyone_mask);
+		childSetText("EveryoneMaskDebug",perm_string);
+		childSetVisible("EveryoneMaskDebug",TRUE);
+		
+		perm_string = "N";
+		perm_string += slam_perm ? "*: " : ": ";
+		perm_string += mask_to_string(next_owner_mask);
+		childSetText("NextMaskDebug",perm_string);
+		childSetVisible("NextMaskDebug",TRUE);
+	}
+	else
+	{
+		childSetVisible("BaseMaskDebug",FALSE);
+		childSetVisible("OwnerMaskDebug",FALSE);
+		childSetVisible("GroupMaskDebug",FALSE);
+		childSetVisible("EveryoneMaskDebug",FALSE);
+		childSetVisible("NextMaskDebug",FALSE);
+	}
+
+	/////////////
+	// SHARING //
+	/////////////
+
+	// Check for ability to change values.
+	if (is_link || cannot_restrict_permissions)
+	{
+		childSetEnabled("CheckShareWithGroup",FALSE);
+		childSetEnabled("CheckEveryoneCopy",FALSE);
+	}
+	else if (is_obj_modify && can_agent_manipulate)
+	{
+		childSetEnabled("CheckShareWithGroup",TRUE);
+		childSetEnabled("CheckEveryoneCopy",(owner_mask & PERM_COPY) && (owner_mask & PERM_TRANSFER));
+	}
+	else
+	{
+		childSetEnabled("CheckShareWithGroup",FALSE);
+		childSetEnabled("CheckEveryoneCopy",FALSE);
+	}
+
+	// Set values.
+	BOOL is_group_copy = (group_mask & PERM_COPY) ? TRUE : FALSE;
+	BOOL is_group_modify = (group_mask & PERM_MODIFY) ? TRUE : FALSE;
+	BOOL is_group_move = (group_mask & PERM_MOVE) ? TRUE : FALSE;
+
+	if (is_group_copy && is_group_modify && is_group_move)
+	{
+		childSetValue("CheckShareWithGroup",LLSD((BOOL)TRUE));
+
+		LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
+		if(ctl)
+		{
+			ctl->setTentative(FALSE);
+		}
+	}
+	else if (!is_group_copy && !is_group_modify && !is_group_move)
+	{
+		childSetValue("CheckShareWithGroup",LLSD((BOOL)FALSE));
+		LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
+		if(ctl)
+		{
+			ctl->setTentative(FALSE);
+		}
+	}
+	else
+	{
+		LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
+		if(ctl)
+		{
+			ctl->setTentative(TRUE);
+			ctl->set(TRUE);
+		}
+	}
+	
+	childSetValue("CheckEveryoneCopy",LLSD((BOOL)(everyone_mask & PERM_COPY)));
+
+	///////////////
+	// SALE INFO //
+	///////////////
+
+	const LLSaleInfo& sale_info = item->getSaleInfo();
+	BOOL is_for_sale = sale_info.isForSale();
+	// Check for ability to change values.
+	if (is_obj_modify && can_agent_sell 
+		&& gAgent.allowOperation(PERM_TRANSFER, perm, GP_OBJECT_MANIPULATE))
+	{
+		childSetEnabled("SaleLabel",is_complete);
+		childSetEnabled("CheckPurchase",is_complete);
+
+		childSetEnabled("NextOwnerLabel",TRUE);
+		childSetEnabled("CheckNextOwnerModify",(base_mask & PERM_MODIFY) && !cannot_restrict_permissions);
+		childSetEnabled("CheckNextOwnerCopy",(base_mask & PERM_COPY) && !cannot_restrict_permissions);
+		childSetEnabled("CheckNextOwnerTransfer",(next_owner_mask & PERM_COPY) && !cannot_restrict_permissions);
+
+		childSetEnabled("RadioSaleType",is_complete && is_for_sale);
+		childSetEnabled("TextPrice",is_complete && is_for_sale);
+		childSetEnabled("Edit Cost",is_complete && is_for_sale);
+	}
+	else
+	{
+		childSetEnabled("SaleLabel",FALSE);
+		childSetEnabled("CheckPurchase",FALSE);
+
+		childSetEnabled("NextOwnerLabel",FALSE);
+		childSetEnabled("CheckNextOwnerModify",FALSE);
+		childSetEnabled("CheckNextOwnerCopy",FALSE);
+		childSetEnabled("CheckNextOwnerTransfer",FALSE);
+
+		childSetEnabled("RadioSaleType",FALSE);
+		childSetEnabled("TextPrice",FALSE);
+		childSetEnabled("Edit Cost",FALSE);
+	}
+
+	// Set values.
+	childSetValue("CheckPurchase", is_for_sale);
+	childSetEnabled("combobox sale copy", is_for_sale);
+	childSetEnabled("Edit Cost", is_for_sale);
+	childSetValue("CheckNextOwnerModify",LLSD(BOOL(next_owner_mask & PERM_MODIFY)));
+	childSetValue("CheckNextOwnerCopy",LLSD(BOOL(next_owner_mask & PERM_COPY)));
+	childSetValue("CheckNextOwnerTransfer",LLSD(BOOL(next_owner_mask & PERM_TRANSFER)));
+
+	LLRadioGroup* radioSaleType = getChild<LLRadioGroup>("RadioSaleType");
+	if (is_for_sale)
+	{
+		radioSaleType->setSelectedIndex((S32)sale_info.getSaleType() - 1);
+		S32 numerical_price;
+		numerical_price = sale_info.getSalePrice();
+		childSetText("Edit Cost",llformat("%d",numerical_price));
+	}
+	else
+	{
+		radioSaleType->setSelectedIndex(-1);
+		childSetText("Edit Cost",llformat("%d",0));
+	}
+}
+
+void LLSidepanelItemInfo::onClickCreator()
+{
+	LLInventoryItem* item = findItem();
+	if(!item) return;
+	if(!item->getCreatorUUID().isNull())
+	{
+		LLAvatarActions::showProfile(item->getCreatorUUID());
+	}
+}
+
+// static
+void LLSidepanelItemInfo::onClickOwner()
+{
+	LLInventoryItem* item = findItem();
+	if(!item) return;
+	if(item->getPermissions().isGroupOwned())
+	{
+		LLGroupActions::show(item->getPermissions().getGroup());
+	}
+	else
+	{
+		LLAvatarActions::showProfile(item->getPermissions().getOwner());
+	}
+}
+
+// static
+void LLSidepanelItemInfo::onCommitName()
+{
+	//llinfos << "LLSidepanelItemInfo::onCommitName()" << llendl;
+	LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem();
+	if(!item)
+	{
+		return;
+	}
+	LLLineEditor* labelItemName = getChild<LLLineEditor>("LabelItemName");
+
+	if(labelItemName&&
+	   (item->getName() != labelItemName->getText()) && 
+	   (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE)) )
+	{
+		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+		new_item->rename(labelItemName->getText());
+		if(mObjectID.isNull())
+		{
+			new_item->updateServer(FALSE);
+			gInventory.updateItem(new_item);
+			gInventory.notifyObservers();
+		}
+		else
+		{
+			LLViewerObject* object = gObjectList.findObject(mObjectID);
+			if(object)
+			{
+				object->updateInventory(
+					new_item,
+					TASK_INVENTORY_ITEM_KEY,
+					false);
+			}
+		}
+	}
+}
+
+void LLSidepanelItemInfo::onCommitDescription()
+{
+	//llinfos << "LLSidepanelItemInfo::onCommitDescription()" << llendl;
+	LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem();
+	if(!item) return;
+
+	LLLineEditor* labelItemDesc = getChild<LLLineEditor>("LabelItemDesc");
+	if(!labelItemDesc)
+	{
+		return;
+	}
+	if((item->getDescription() != labelItemDesc->getText()) && 
+	   (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE)))
+	{
+		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+
+		new_item->setDescription(labelItemDesc->getText());
+		if(mObjectID.isNull())
+		{
+			new_item->updateServer(FALSE);
+			gInventory.updateItem(new_item);
+			gInventory.notifyObservers();
+		}
+		else
+		{
+			LLViewerObject* object = gObjectList.findObject(mObjectID);
+			if(object)
+			{
+				object->updateInventory(
+					new_item,
+					TASK_INVENTORY_ITEM_KEY,
+					false);
+			}
+		}
+	}
+}
+
+// static
+void LLSidepanelItemInfo::onCommitPermissions()
+{
+	//llinfos << "LLSidepanelItemInfo::onCommitPermissions()" << llendl;
+	LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem();
+	if(!item) return;
+	LLPermissions perm(item->getPermissions());
+
+
+	LLCheckBoxCtrl* CheckShareWithGroup = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
+
+	if(CheckShareWithGroup)
+	{
+		perm.setGroupBits(gAgent.getID(), gAgent.getGroupID(),
+						CheckShareWithGroup->get(),
+						PERM_MODIFY | PERM_MOVE | PERM_COPY);
+	}
+	LLCheckBoxCtrl* CheckEveryoneCopy = getChild<LLCheckBoxCtrl>("CheckEveryoneCopy");
+	if(CheckEveryoneCopy)
+	{
+		perm.setEveryoneBits(gAgent.getID(), gAgent.getGroupID(),
+						 CheckEveryoneCopy->get(), PERM_COPY);
+	}
+
+	LLCheckBoxCtrl* CheckNextOwnerModify = getChild<LLCheckBoxCtrl>("CheckNextOwnerModify");
+	if(CheckNextOwnerModify)
+	{
+		perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(),
+							CheckNextOwnerModify->get(), PERM_MODIFY);
+	}
+	LLCheckBoxCtrl* CheckNextOwnerCopy = getChild<LLCheckBoxCtrl>("CheckNextOwnerCopy");
+	if(CheckNextOwnerCopy)
+	{
+		perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(),
+							CheckNextOwnerCopy->get(), PERM_COPY);
+	}
+	LLCheckBoxCtrl* CheckNextOwnerTransfer = getChild<LLCheckBoxCtrl>("CheckNextOwnerTransfer");
+	if(CheckNextOwnerTransfer)
+	{
+		perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(),
+							CheckNextOwnerTransfer->get(), PERM_TRANSFER);
+	}
+	if(perm != item->getPermissions()
+		&& item->isComplete())
+	{
+		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+		new_item->setPermissions(perm);
+		U32 flags = new_item->getFlags();
+		// If next owner permissions have changed (and this is an object)
+		// then set the slam permissions flag so that they are applied on rez.
+		if((perm.getMaskNextOwner()!=item->getPermissions().getMaskNextOwner())
+		   && (item->getType() == LLAssetType::AT_OBJECT))
+		{
+			flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM;
+		}
+		// If everyone permissions have changed (and this is an object)
+		// then set the overwrite everyone permissions flag so they
+		// are applied on rez.
+		if ((perm.getMaskEveryone()!=item->getPermissions().getMaskEveryone())
+			&& (item->getType() == LLAssetType::AT_OBJECT))
+		{
+			flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
+		}
+		// If group permissions have changed (and this is an object)
+		// then set the overwrite group permissions flag so they
+		// are applied on rez.
+		if ((perm.getMaskGroup()!=item->getPermissions().getMaskGroup())
+			&& (item->getType() == LLAssetType::AT_OBJECT))
+		{
+			flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
+		}
+		new_item->setFlags(flags);
+		if(mObjectID.isNull())
+		{
+			new_item->updateServer(FALSE);
+			gInventory.updateItem(new_item);
+			gInventory.notifyObservers();
+		}
+		else
+		{
+			LLViewerObject* object = gObjectList.findObject(mObjectID);
+			if(object)
+			{
+				object->updateInventory(
+					new_item,
+					TASK_INVENTORY_ITEM_KEY,
+					false);
+			}
+		}
+	}
+	else
+	{
+		// need to make sure we don't just follow the click
+		refresh();
+	}
+}
+
+// static
+void LLSidepanelItemInfo::onCommitSaleInfo()
+{
+	//llinfos << "LLSidepanelItemInfo::onCommitSaleInfo()" << llendl;
+	updateSaleInfo();
+}
+
+// static
+void LLSidepanelItemInfo::onCommitSaleType()
+{
+	//llinfos << "LLSidepanelItemInfo::onCommitSaleType()" << llendl;
+	updateSaleInfo();
+}
+
+void LLSidepanelItemInfo::updateSaleInfo()
+{
+	LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem();
+	if(!item) return;
+	LLSaleInfo sale_info(item->getSaleInfo());
+	if(!gAgent.allowOperation(PERM_TRANSFER, item->getPermissions(), GP_OBJECT_SET_SALE))
+	{
+		childSetValue("CheckPurchase",LLSD((BOOL)FALSE));
+	}
+
+	if((BOOL)childGetValue("CheckPurchase"))
+	{
+		// turn on sale info
+		LLSaleInfo::EForSale sale_type = LLSaleInfo::FS_COPY;
+	
+		LLRadioGroup* RadioSaleType = getChild<LLRadioGroup>("RadioSaleType");
+		if(RadioSaleType)
+		{
+			switch (RadioSaleType->getSelectedIndex())
+			{
+			case 0:
+				sale_type = LLSaleInfo::FS_ORIGINAL;
+				break;
+			case 1:
+				sale_type = LLSaleInfo::FS_COPY;
+				break;
+			case 2:
+				sale_type = LLSaleInfo::FS_CONTENTS;
+				break;
+			default:
+				sale_type = LLSaleInfo::FS_COPY;
+				break;
+			}
+		}
+
+		if (sale_type == LLSaleInfo::FS_COPY 
+			&& !gAgent.allowOperation(PERM_COPY, item->getPermissions(), 
+									  GP_OBJECT_SET_SALE))
+		{
+			sale_type = LLSaleInfo::FS_ORIGINAL;
+		}
+
+	     
+		
+		S32 price = -1;
+		price =  getChild<LLUICtrl>("Edit Cost")->getValue().asInteger();;
+
+		// Invalid data - turn off the sale
+		if (price < 0)
+		{
+			sale_type = LLSaleInfo::FS_NOT;
+			price = 0;
+		}
+
+		sale_info.setSaleType(sale_type);
+		sale_info.setSalePrice(price);
+	}
+	else
+	{
+		sale_info.setSaleType(LLSaleInfo::FS_NOT);
+	}
+	if(sale_info != item->getSaleInfo()
+		&& item->isComplete())
+	{
+		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+
+		// Force an update on the sale price at rez
+		if (item->getType() == LLAssetType::AT_OBJECT)
+		{
+			U32 flags = new_item->getFlags();
+			flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_SALE;
+			new_item->setFlags(flags);
+		}
+
+		new_item->setSaleInfo(sale_info);
+		if(mObjectID.isNull())
+		{
+			// This is in the agent's inventory.
+			new_item->updateServer(FALSE);
+			gInventory.updateItem(new_item);
+			gInventory.notifyObservers();
+		}
+		else
+		{
+			// This is in an object's contents.
+			LLViewerObject* object = gObjectList.findObject(mObjectID);
+			if(object)
+			{
+				object->updateInventory(
+					new_item,
+					TASK_INVENTORY_ITEM_KEY,
+					false);
+			}
+		}
+	}
+	else
+	{
+		// need to make sure we don't just follow the click
+		refresh();
+	}
+}
+
+LLInventoryItem* LLSidepanelItemInfo::findItem() const
+{
+	LLInventoryItem* item = NULL;
+	if(mObjectID.isNull())
+	{
+		// it is in agent inventory
+		item = gInventory.getItem(mItemID);
+	}
+	else
+	{
+		LLViewerObject* object = gObjectList.findObject(mObjectID);
+		if(object)
+		{
+			item = (LLInventoryItem*)object->getInventoryObject(mItemID);
+		}
+	}
+	return item;
+}
+
+// virtual
+void LLSidepanelItemInfo::updateVerbs()
+{
+	LLSidepanelInventorySubpanel::updateVerbs();
+
+	const LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem();
+	if (item)
+	{
+		const LLPermissions& perm = item->getPermissions();
+		BOOL is_modifiable = gAgent.allowOperation(PERM_MODIFY, perm,
+												   GP_OBJECT_MANIPULATE);
+		mEditBtn->setEnabled(is_modifiable);
+	}
+}
+
+// virtual
+void LLSidepanelItemInfo::save()
+{
+	onCommitName();
+	onCommitDescription();
+	onCommitPermissions();
+	onCommitSaleInfo();
+	onCommitSaleType();
+}
diff --git a/indra/newview/llsidepaneliteminfo.h b/indra/newview/llsidepaneliteminfo.h
index b348b5cceba..4bfbd56ea79 100644
--- a/indra/newview/llsidepaneliteminfo.h
+++ b/indra/newview/llsidepaneliteminfo.h
@@ -1,91 +1,91 @@
-/** 
- * @file llsidepaneliteminfo.h
- * @brief A panel which shows an inventory item's properties.
- *
- * $LicenseInfo:firstyear=2002&license=viewergpl$
- * 
- * Copyright (c) 2002-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLSIDEPANELITEMINFO_H
-#define LL_LLSIDEPANELITEMINFO_H
-
-#include "llsidepanelinventorysubpanel.h"
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLSidepanelItemInfo
-// Object properties for inventory side panel.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLButton;
-class LLInventoryItem;
-class LLItemPropertiesObserver;
-class LLViewerObject;
-class LLPermissions;
-
-class LLSidepanelItemInfo : public LLSidepanelInventorySubpanel
-{
-public:
-	LLSidepanelItemInfo();
-	virtual ~LLSidepanelItemInfo();
-	
-	/*virtual*/ BOOL postBuild();
-	/*virtual*/ void reset();
-
-	void setObjectID(const LLUUID& object_id);
-	void setItemID(const LLUUID& item_id);
-	void setEditMode(BOOL edit);
-
-protected:
-	/*virtual*/ void refresh();
-	/*virtual*/ void save();
-	/*virtual*/ void updateVerbs();
-
-	LLInventoryItem* findItem() const;
-	LLViewerObject*  findObject() const;
-	
-	void refreshFromItem(LLInventoryItem* item);
-
-private:
-	LLUUID mItemID; 	// inventory UUID for the inventory item.
-	LLUUID mObjectID; 	// in-world task UUID, or null if in agent inventory.
-	LLItemPropertiesObserver* mPropertiesObserver; // for syncing changes to item
-	
-	//
-	// UI Elements
-	// 
-protected:
-	void 						onClickCreator();
-	void 						onClickOwner();
-	void 						onCommitName();
-	void 						onCommitDescription();
-	void 						onCommitPermissions();
-	void 						onCommitSaleInfo();
-	void 						onCommitSaleType();
-	void 						updateSaleInfo();
-};
-
-#endif // LL_LLSIDEPANELITEMINFO_H
+/** 
+ * @file llsidepaneliteminfo.h
+ * @brief A panel which shows an inventory item's properties.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLSIDEPANELITEMINFO_H
+#define LL_LLSIDEPANELITEMINFO_H
+
+#include "llsidepanelinventorysubpanel.h"
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLSidepanelItemInfo
+// Object properties for inventory side panel.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLButton;
+class LLInventoryItem;
+class LLItemPropertiesObserver;
+class LLViewerObject;
+class LLPermissions;
+
+class LLSidepanelItemInfo : public LLSidepanelInventorySubpanel
+{
+public:
+	LLSidepanelItemInfo();
+	virtual ~LLSidepanelItemInfo();
+	
+	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void reset();
+
+	void setObjectID(const LLUUID& object_id);
+	void setItemID(const LLUUID& item_id);
+	void setEditMode(BOOL edit);
+
+protected:
+	/*virtual*/ void refresh();
+	/*virtual*/ void save();
+	/*virtual*/ void updateVerbs();
+
+	LLInventoryItem* findItem() const;
+	LLViewerObject*  findObject() const;
+	
+	void refreshFromItem(LLInventoryItem* item);
+
+private:
+	LLUUID mItemID; 	// inventory UUID for the inventory item.
+	LLUUID mObjectID; 	// in-world task UUID, or null if in agent inventory.
+	LLItemPropertiesObserver* mPropertiesObserver; // for syncing changes to item
+	
+	//
+	// UI Elements
+	// 
+protected:
+	void 						onClickCreator();
+	void 						onClickOwner();
+	void 						onCommitName();
+	void 						onCommitDescription();
+	void 						onCommitPermissions();
+	void 						onCommitSaleInfo();
+	void 						onCommitSaleType();
+	void 						updateSaleInfo();
+};
+
+#endif // LL_LLSIDEPANELITEMINFO_H
diff --git a/indra/newview/skins/default/xui/da/panel_edit_profile.xml b/indra/newview/skins/default/xui/da/panel_edit_profile.xml
index 74b7c7dd726..b4d0fa20ef1 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_profile.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
-   <string name="CaptionTextAcctInfo">
-       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-   </string>
-   <string name="AcctTypeResident"
-    value="Beboer" />
-   <string name="AcctTypeTrial"
-    value="På prøve" />
-   <string name="AcctTypeCharterMember"
-    value="æresmedlem" />
-   <string name="AcctTypeEmployee"
-    value="Linden Lab medarbejder" />
-   <string name="PaymentInfoUsed"
-    value="Betalende medlem" />
-   <string name="PaymentInfoOnFile"
-    value="Registreret betalende" />
-   <string name="NoPaymentInfoOnFile"
-    value="Ingen betalingsinfo" />
-   <string name="AgeVerified"
-    value="Alders-checket" />
-   <string name="NotAgeVerified"
-    value="Ikke alders-checket" />
-   <string name="partner_edit_link_url">
-       http://www.secondlife.com/account/partners.php?lang=da
-   </string>
-    <panel name="scroll_content_panel">
-    <panel name="data_panel" >
-     <panel name="lifes_images_panel">
-          <panel name="second_life_image_panel">
-              <text name="second_life_photo_title_text">
-			[SECOND_LIFE]:
-              </text>
-          </panel>
-      </panel>
-        <text name="title_partner_text" value="Partner:"/>
-        <panel name="partner_data_panel">
-            <text name="partner_text" value="[FIRST] [LAST]"/>
-         </panel>
-      <text name="text_box3">
-	Optaget autosvar:
-      </text>
-    </panel>
-    </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="edit_profile_panel">
+   <string name="CaptionTextAcctInfo">
+       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+   </string>
+   <string name="AcctTypeResident"
+    value="Beboer" />
+   <string name="AcctTypeTrial"
+    value="På prøve" />
+   <string name="AcctTypeCharterMember"
+    value="æresmedlem" />
+   <string name="AcctTypeEmployee"
+    value="Linden Lab medarbejder" />
+   <string name="PaymentInfoUsed"
+    value="Betalende medlem" />
+   <string name="PaymentInfoOnFile"
+    value="Registreret betalende" />
+   <string name="NoPaymentInfoOnFile"
+    value="Ingen betalingsinfo" />
+   <string name="AgeVerified"
+    value="Alders-checket" />
+   <string name="NotAgeVerified"
+    value="Ikke alders-checket" />
+   <string name="partner_edit_link_url">
+       http://www.secondlife.com/account/partners.php?lang=da
+   </string>
+    <panel name="scroll_content_panel">
+    <panel name="data_panel" >
+     <panel name="lifes_images_panel">
+          <panel name="second_life_image_panel">
+              <text name="second_life_photo_title_text">
+			[SECOND_LIFE]:
+              </text>
+          </panel>
+      </panel>
+        <text name="title_partner_text" value="Partner:"/>
+        <panel name="partner_data_panel">
+            <text name="partner_text" value="[FIRST] [LAST]"/>
+         </panel>
+      <text name="text_box3">
+	Optaget autosvar:
+      </text>
+    </panel>
+    </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/floater_about.xml b/indra/newview/skins/default/xui/de/floater_about.xml
index 8522a89ec1c..ea5c33b3c87 100644
--- a/indra/newview/skins/default/xui/de/floater_about.xml
+++ b/indra/newview/skins/default/xui/de/floater_about.xml
@@ -1,40 +1,40 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="ÜBER [APP_NAME]">
-	<tab_container name="about_tab">
-		<panel label="Danksagung" name="credits_panel">
-			<text_editor name="credits_editor">
-				Second Life wird Ihnen präsentiert von Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl und vielen anderen.
-
-Vielen Dank den folgenden Einwohnern, die uns geholfen haben, dies zur bisher besten Version zu machen: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
-
-
-
-Um im Geschäftsleben erfolreich zu sein, sei kühn, sei schnell, sei anders. --Henry Marchant
-			</text_editor>
-		</panel>
-		<panel label="Lizenzen" name="licenses_panel">
-			<text_editor name="credits_editor">
-				3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
-APR Copyright (C) 2000-2004 The Apache Software Foundation
-cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
-expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
-FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
-GL Copyright (C) 1999-2004 Brian Paul.
-Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
-jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
-jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
-ogg/vorbis Copyright (C) 2001, Xiphophorus
-OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
-SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
-SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-zlib Copyright (C) 1995-2002 Jean-loup Gailly und Mark Adler.
-google-perftools Copyright (c) 2005, Google Inc.
-
-Alle Rechte vorbehalten. Details siehe licenses.txt.
-
-Voice-Chat-Audiocoding: Polycom(R) Siren14(TM) (ITU-T Empf.G.722.1 Anhang C)
-			</text_editor>
-		</panel>
-	</tab_container>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="ÜBER [APP_NAME]">
+	<tab_container name="about_tab">
+		<panel label="Danksagung" name="credits_panel">
+			<text_editor name="credits_editor">
+				Second Life wird Ihnen präsentiert von Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl und vielen anderen.
+
+Vielen Dank den folgenden Einwohnern, die uns geholfen haben, dies zur bisher besten Version zu machen: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
+
+
+
+Um im Geschäftsleben erfolreich zu sein, sei kühn, sei schnell, sei anders. --Henry Marchant
+			</text_editor>
+		</panel>
+		<panel label="Lizenzen" name="licenses_panel">
+			<text_editor name="credits_editor">
+				3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
+APR Copyright (C) 2000-2004 The Apache Software Foundation
+cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
+expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
+FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
+GL Copyright (C) 1999-2004 Brian Paul.
+Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
+jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
+jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
+ogg/vorbis Copyright (C) 2001, Xiphophorus
+OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
+SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+zlib Copyright (C) 1995-2002 Jean-loup Gailly und Mark Adler.
+google-perftools Copyright (c) 2005, Google Inc.
+
+Alle Rechte vorbehalten. Details siehe licenses.txt.
+
+Voice-Chat-Audiocoding: Polycom(R) Siren14(TM) (ITU-T Empf.G.722.1 Anhang C)
+			</text_editor>
+		</panel>
+	</tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml
index ae0ad2af65d..d6d7434d584 100644
--- a/indra/newview/skins/default/xui/de/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_about_land.xml
@@ -1,475 +1,475 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterland" title="LAND-INFO">
-	<floater.string name="Minutes">
-		[MINUTES] Minuten
-	</floater.string>
-	<floater.string name="Minute">
-		Minute
-	</floater.string>
-	<floater.string name="Seconds">
-		[SECONDS] Sekunden
-	</floater.string>
-	<tab_container name="landtab">
-		<panel label="Allgemein" name="land_general_panel">
-			<panel.string name="new users only">
-				Nur neue Benutzer
-			</panel.string>
-			<panel.string name="anyone">
-				Jeder
-			</panel.string>
-			<panel.string name="area_text">
-				Gebiet:
-			</panel.string>
-			<panel.string name="area_size_text">
-				[AREA] qm.
-			</panel.string>
-			<panel.string name="auction_id_text">
-				Auktions-ID: [ID]
-			</panel.string>
-			<panel.string name="need_tier_to_modify">
-				Bestätigen Sie den Kauf, um dieses Land zu bearbeiten.
-			</panel.string>
-			<panel.string name="group_owned_text">
-				(In Gruppenbesitz)
-			</panel.string>
-			<panel.string name="profile_text">
-				Profil...
-			</panel.string>
-			<panel.string name="info_text">
-				Info...
-			</panel.string>
-			<panel.string name="public_text">
-				(öffentlich)
-			</panel.string>
-			<panel.string name="none_text">
-				(keiner)
-			</panel.string>
-			<panel.string name="sale_pending_text">
-				(Wird verkauft)
-			</panel.string>
-			<panel.string name="no_selection_text">
-				Keine Parzelle ausgewählt.
-Öffnen Sie „Welt“ &gt; „Land-Info“ oder wählen Sie eine andere Parzelle aus, um Informationen darüber anzuzeigen.
-			</panel.string>
-			<text name="Name:">
-				Name:
-			</text>
-			<text name="Description:">
-				Beschreibung:
-			</text>
-			<text name="LandType">
-				Typ:
-			</text>
-			<text name="LandTypeText">
-				Mainland / Homestead
-			</text>
-			<text name="ContentRating">
-				Einstufung:
-			</text>
-			<text name="ContentRatingText">
-				Adult
-			</text>
-			<text name="Owner:">
-				Eigentümer:
-			</text>
-			<text name="OwnerText">
-				Leyla Linden
-			</text>
-			<button label="Profil..." label_selected="Profil..." name="Profile..."/>
-			<text name="Group:">
-				Gruppe:
-			</text>
-			<button label="Einstellen..." label_selected="Einstellen..." name="Set..."/>
-			<check_box label="Übertragung an Gruppe zulassen" name="check deed" tool_tip="Ein Gruppen-Officer kann dieses Land der Gruppe übertragen. Das Land wird dann über die Landzuteilung der Gruppe verwaltet."/>
-			<button label="Übertragen..." label_selected="Übertragen..." name="Deed..." tool_tip="Sie können Land nur übertragen, wenn Sie in der ausgewählten Gruppe Officer sind."/>
-			<check_box label="Eigentümer leistet Beitrag durch Übertragung" name="check contrib" tool_tip="Wenn das Land an die Gruppe übertragen wird, trägt der frühere Eigentümer ausreichend Landnutzungsrechte bei, um es zu halten."/>
-			<text name="For Sale:">
-				Zum Verkauf:
-			</text>
-			<text name="Not for sale.">
-				Nicht zu verkaufen.
-			</text>
-			<text name="For Sale: Price L$[PRICE].">
-				Preis: [PRICE] L$ ([PRICE_PER_SQM] L$/qm.).
-			</text>
-			<text name="SalePending"/>
-			<button bottom="-222" label="Land verkaufen..." label_selected="Land verkaufen..." name="Sell Land..."/>
-			<text name="For sale to">
-				Zum Verkauf an: [BUYER]
-			</text>
-			<text name="Sell with landowners objects in parcel." width="210">
-				Objekte sind im Verkauf eingeschlossen.
-			</text>
-			<text name="Selling with no objects in parcel." width="237">
-				Objekte sind im Verkauf nicht eingeschlossen.
-			</text>
-			<button bottom="-222" label="Landverkauf abbrechen" label_selected="Landverkauf abbrechen" name="Cancel Land Sale"/>
-			<text name="Claimed:">
-				Gekauft am:
-			</text>
-			<text name="DateClaimText">
-				Dienstag, 15. Aug. 2006, 13:47:25
-			</text>
-			<text name="PriceLabel">
-				Gebiet:
-			</text>
-			<text name="PriceText">
-				4048 qm.
-			</text>
-			<text name="Traffic:">
-				Traffic:
-			</text>
-			<text name="DwellText">
-				0
-			</text>
-			<button label="Land kaufen..." label_selected="Land kaufen..." name="Buy Land..."/>
-			<button label="Für Gruppe kaufen..." label_selected="Für Gruppe kaufen..." name="Buy For Group..."/>
-			<button label="Pass kaufen..." label_selected="Pass kaufen..." name="Buy Pass..." tool_tip="Ein Pass gibt Ihnen zeitbegrenzten Zugang zu diesem Land."/>
-			<button label="Land aufgeben..." label_selected="Land aufgeben..." name="Abandon Land..."/>
-			<button label="Land in Besitz nehmen..." label_selected="Land in Besitz nehmen..." name="Reclaim Land..."/>
-			<button label="Linden-Verkauf..." label_selected="Linden-Verkauf..." name="Linden Sale..." tool_tip="Land muss Eigentum und auf Inhalt gesetzt sein und nicht zur Auktion stehen."/>
-		</panel>
-		<panel label="Vertrag" name="land_covenant_panel">
-			<panel.string name="can_resell">
-				Gekauftes Land in dieser Region kann wiederverkauft werden.
-			</panel.string>
-			<panel.string name="can_not_resell">
-				Gekauftes Land in dieser Region kann nicht wiederverkauft werden.
-			</panel.string>
-			<panel.string name="can_change">
-				Gekauftes Land in dieser Region kann zusammengelegt und
-geteilt werden.
-			</panel.string>
-			<panel.string name="can_not_change">
-				Gekauftes Land in dieser Region kann nicht zusammengelegt
-und geteilt werden.
-			</panel.string>
-			<text name="estate_section_lbl">
-				Grundstück:
-			</text>
-			<text name="estate_name_lbl">
-				Name:
-			</text>
-			<text name="estate_name_text">
-				Mainland
-			</text>
-			<text name="estate_owner_lbl">
-				Eigentümer:
-			</text>
-			<text name="estate_owner_text">
-				(keiner)
-			</text>
-			<text_editor name="covenant_editor">
-				Für dieses Grundstück fehlt der Vertrag.
-			</text_editor>
-			<text name="covenant_timestamp_text">
-				Letzte Änderung am Mittwoch, den 31. Dez. 1969, 16:00:00
-			</text>
-			<text name="region_section_lbl">
-				Region:
-			</text>
-			<text name="region_name_lbl">
-				Name:
-			</text>
-			<text name="region_name_text">
-				leyla
-			</text>
-			<text name="region_landtype_lbl">
-				Typ:
-			</text>
-			<text name="region_landtype_text">
-				Mainland / Homestead
-			</text>
-			<text name="region_maturity_lbl">
-				Einstufung:
-			</text>
-			<text name="region_maturity_text">
-				Adult
-			</text>
-			<text name="resellable_lbl">
-				Wiederverkauf:
-			</text>
-			<text name="resellable_clause">
-				Land in dieser Region kann nicht wiederverkauft werden.
-			</text>
-			<text name="changeable_lbl">
-				Unterteilen:
-			</text>
-			<text name="changeable_clause">
-				Land in dieser Region kann nicht zusammengelegt/geteilt
-werden.
-			</text>
-		</panel>
-		<panel label="Objekte" name="land_objects_panel">
-			<panel.string name="objects_available_text">
-				[COUNT] von [MAX] ([AVAILABLE] verfügbar)
-			</panel.string>
-			<panel.string name="objects_deleted_text">
-				[COUNT] von [MAX] ([DELETED] werden gelöscht)
-			</panel.string>
-			<text name="parcel_object_bonus">
-				Objektbonusfaktor in Region: [BONUS]
-			</text>
-			<text name="Simulator primitive usage:">
-				Primitive in Simulator:
-			</text>
-			<text name="objects_available">
-				[COUNT] von [MAX] ([AVAILABLE] verfügbar)
-			</text>
-			<text name="Primitives parcel supports:" width="200">
-				Von Parzelle unterstützte Primitiva:
-			</text>
-			<text left="204" name="object_contrib_text" width="152">
-				[COUNT]
-			</text>
-			<text name="Primitives on parcel:">
-				Primitiva auf Parzelle:
-			</text>
-			<text left="204" name="total_objects_text" width="48">
-				[COUNT]
-			</text>
-			<text left="14" name="Owned by parcel owner:" width="200">
-				Im Eigentum des Parzellenbesitzers:
-			</text>
-			<text left="204" name="owner_objects_text" width="48">
-				[COUNT]
-			</text>
-			<button label="Anzeigen" label_selected="Anzeigen" name="ShowOwner" right="-135" width="60"/>
-			<button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnOwner..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/>
-			<text left="14" name="Set to group:">
-				Der Gruppe zugeordnet:
-			</text>
-			<text left="204" name="group_objects_text" width="48">
-				[COUNT]
-			</text>
-			<button label="Anzeigen" label_selected="Anzeigen" name="ShowGroup" right="-135" width="60"/>
-			<button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnGroup..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/>
-			<text left="14" name="Owned by others:" width="128">
-				Im Eigentum anderer:
-			</text>
-			<text left="204" name="other_objects_text" width="48">
-				[COUNT]
-			</text>
-			<button label="Anzeigen" label_selected="Anzeigen" name="ShowOther" right="-135" width="60"/>
-			<button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnOther..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/>
-			<text left="14" name="Selected / sat upon:" width="140">
-				Ausgewählt/gesessen auf:
-			</text>
-			<text left="204" name="selected_objects_text" width="48">
-				[COUNT]
-			</text>
-			<text left="4" name="Autoreturn" width="380">
-				Objekte anderer Einwohner automatisch zurückgeben (Minuten, 0 für aus):
-			</text>
-			<line_editor name="clean other time" right="-10" width="56"/>
-			<text name="Object Owners:">
-				Objekteigentümer:
-			</text>
-			<button label="Liste aktualisieren" label_selected="Liste aktualisieren" name="Refresh List"/>
-			<button label="Objekte zurückgeben..." label_selected="Objekte zurückgeben..." name="Return objects..."/>
-			<name_list name="owner list">
-				<name_list.columns label="Typ" name="type"/>
-				<name_list.columns label="Name" name="name"/>
-				<name_list.columns label="Zählen" name="count"/>
-				<name_list.columns label="Aktuellster" name="mostrecent"/>
-			</name_list>
-		</panel>
-		<panel label="Optionen" name="land_options_panel">
-			<panel.string name="search_enabled_tooltip">
-				Diese Parzelle in Suchergebnissen anzeigen.
-			</panel.string>
-			<panel.string name="search_disabled_small_tooltip">
-				Diese Option ist nicht aktiviert, da diese Parzelle nicht größer als 128 qm ist.
-Nur große Parzellen können in der Suche aufgeführt werden.
-			</panel.string>
-			<panel.string name="search_disabled_permissions_tooltip">
-				Diese Option ist nicht aktiviert, da Sie die Parzellenoptionen nicht verändern können.
-			</panel.string>
-			<panel.string name="mature_check_mature">
-				Mature-Inhalt
-			</panel.string>
-			<panel.string name="mature_check_adult">
-				Adult-Inhalt
-			</panel.string>
-			<panel.string name="mature_check_mature_tooltip">
-				Die Informationen oder Inhalte Ihrer Parzelle sind „Mature“.
-			</panel.string>
-			<panel.string name="mature_check_adult_tooltip">
-				Die Informationen oder Inhalte Ihrer Parzelle sind „Adult“.
-			</panel.string>
-			<panel.string name="landing_point_none">
-				(keiner)
-			</panel.string>
-			<panel.string name="push_restrict_text">
-				Kein Stoßen
-			</panel.string>
-			<panel.string name="push_restrict_region_text">
-				Kein Stoßen (regional)
-			</panel.string>
-			<text name="allow_label">
-				Anderen Einwohnern gestatten:
-			</text>
-			<check_box label="Terrain bearbeiten" name="edit land check" tool_tip="Falls aktiviert, kann jeder Ihr Land terraformen. Am besten ist es, wenn Sie diese Option deaktiviert lassen. Sie können Ihr eigenes Land jederzeit bearbeiten."/>
-			<check_box label="Fliegen" name="check fly" tool_tip="Falls aktiviert, können Einwohner auf Ihrem Land fliegen. Falls nicht aktiviert, können Einwohner lediglich auf Ihr Land fliegen und dort landen (dann jedoch nicht wieder weiterfliegen) oder über Ihr Land hinweg fliegen."/>
-			<text name="allow_label2">
-				Objekte erstellen:
-			</text>
-			<check_box label="Alle Einwohner" name="edit objects check"/>
-			<check_box label="Gruppe" name="edit group objects check"/>
-			<text name="allow_label3">
-				Objekteintritt:
-			</text>
-			<check_box label="Alle Einwohner" name="all object entry check"/>
-			<check_box label="Gruppe" name="group object entry check"/>
-			<text name="allow_label4">
-				Skripts ausführen:
-			</text>
-			<check_box label="Alle Einwohner" name="check other scripts"/>
-			<check_box label="Gruppe" name="check group scripts"/>
-			<text name="land_options_label">
-				Landoptionen:
-			</text>
-			<check_box label="Sicher (kein Schaden)" name="check safe" tool_tip="Falls aktiviert, wird Land auf Option „Sicher“ eingestellt, Kampfschäden sind deaktiviert. Falls nicht aktiviert, sind Kampfschäden aktiviert."/>
-			<check_box label="Kein Stoßen" name="PushRestrictCheck" tool_tip="Verhindert Skripte am Stoßen. Durch Aktivieren dieser Option verhindern Sie störendes Verhalten auf Ihrem Land."/>
-			<check_box label="Ort in Suche anzeigen (30 L$/Woche) unter" name="ShowDirectoryCheck" tool_tip="Diese Parzelle in Suchergebnissen anzeigen."/>
-			<combo_box name="land category with adult">
-				<combo_box.item label="Alle Kategorien" name="item0"/>
-				<combo_box.item label="Lindenort" name="item1"/>
-				<combo_box.item label="Adult" name="item2"/>
-				<combo_box.item label="Kunst &amp; Kultur" name="item3"/>
-				<combo_box.item label="Business" name="item4"/>
-				<combo_box.item label="Bildung" name="item5"/>
-				<combo_box.item label="Spielen" name="item6"/>
-				<combo_box.item label="Treffpunkt" name="item7"/>
-				<combo_box.item label="Anfängergerecht" name="item8"/>
-				<combo_box.item label="Parks und Natur" name="item9"/>
-				<combo_box.item label="Wohngebiet" name="item10"/>
-				<combo_box.item label="Shopping" name="item11"/>
-				<combo_box.item label="Sonstige" name="item12"/>
-			</combo_box>
-			<combo_box left="266" name="land category" width="130">
-				<combo_box.item label="Alle Kategorien" name="item0"/>
-				<combo_box.item label="Lindenort" name="item1"/>
-				<combo_box.item label="Kunst und Kultur" name="item3"/>
-				<combo_box.item label="Business" name="item4"/>
-				<combo_box.item label="Bildung" name="item5"/>
-				<combo_box.item label="Spielen" name="item6"/>
-				<combo_box.item label="Treffpunkt" name="item7"/>
-				<combo_box.item label="Anfängergerecht" name="item8"/>
-				<combo_box.item label="Parks und Natur" name="item9"/>
-				<combo_box.item label="Wohngebiet" name="item10"/>
-				<combo_box.item label="Shopping" name="item11"/>
-				<combo_box.item label="Sonstige" name="item12"/>
-			</combo_box>
-			<check_box label="Mature-Inhalt" name="MatureCheck" tool_tip=""/>
-			<text name="Snapshot:">
-				Foto:
-			</text>
-			<texture_picker label="" name="snapshot_ctrl" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
-			<text name="landing_point">
-				Landepunkt: [LANDING]
-			</text>
-			<button label="Festlegen" label_selected="Festlegen" left="234" name="Set" tool_tip="Legt den Landepunkt fest, an dem Besucher ankommen. Legt die Position Ihres Avatars innerhalb dieser Parzelle fest." width="70"/>
-			<button label="Löschen" label_selected="Löschen" left="312" name="Clear" tool_tip="Landepunkt löschen." width="70"/>
-			<text name="Teleport Routing: ">
-				Teleport-Route:
-			</text>
-			<combo_box name="landing type" tool_tip="Teleport-Route -- festlegen, wie Teleports auf Ihrem Land gehandhabt werden sollen.">
-				<combo_box.item label="Blockiert" name="Blocked"/>
-				<combo_box.item label="Landepunkt" name="LandingPoint"/>
-				<combo_box.item label="Überall" name="Anywhere"/>
-			</combo_box>
-		</panel>
-		<panel label="Medien" name="land_media_panel">
-			<text name="with media:">
-				Typ:
-			</text>
-			<combo_box name="media type" tool_tip="Geben Sie einen URL für den Film, die Webseite oder ein anderes Medium ein"/>
-			<text name="at URL:">
-				Start URL:
-			</text>
-			<button label="Einstellen..." label_selected="Einstellen..." name="set_media_url"/>
-			<text name="CurrentURL:">
-				Aktuelle URL:
-			</text>
-			<button label="Zurücksetzen..." label_selected="Zurücksetzen..." name="reset_media_url"/>
-			<check_box label="URL ausblenden" name="hide_media_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Medien-URL sehen können. Diese Option ist für HTML-Medien nicht verfügbar."/>
-			<text name="Description:">
-				Inhalt:
-			</text>
-			<line_editor name="url_description" tool_tip="Text, der neben der Abspielen/Laden-Schaltfläche angezeigt wird"/>
-			<text name="Media texture:">
-				Textur
-ersetzen:
-			</text>
-			<texture_picker label="" name="media texture" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
-			<text name="replace_texture_help">
-				Objekte, die diese Textur verwenden, werden den Film oder die Webseite anzeigen, nachdem Sie auf den Pfeil (Wiedergabe) klicken.
-
-Wählen Sie das kleine Bild aus, um eine andere Textur auszuwählen.
-			</text>
-			<check_box label="Automatisch skalieren" name="media_auto_scale" tool_tip="Aktivieren Sie diese Option, um den Inhalt für diese Parzelle automatisch zu skalieren. Dies ist eventuell langsamer und die Qualität ist schlechter, aber Sie müssen keine weitere Texturskalierung oder -anpassung vornehmen."/>
-			<text name="media_size" tool_tip="Darstellungsgröße von Webmedien, für Standard bei 0 belassen.">
-				Größe:
-			</text>
-			<spinner name="media_size_width" tool_tip="Darstellungsgröße von Webmedien, für Standard bei 0 belassen."/>
-			<spinner name="media_size_height" tool_tip="Darstellungsgröße von Webmedien, für Standard bei 0 belassen."/>
-			<text name="pixels">
-				Pixel
-			</text>
-			<text name="Options:">
-				Optionen:
-			</text>
-			<check_box label="Schleife" name="media_loop" tool_tip="Spielt das Medium in einer Schleife ab.  Der Abspielvorgang wird immer wieder von vorne fortgesetzt."/>
-		</panel>
-		<panel label="Audio" name="land_audio_panel">
-			<text name="MusicURL:">
-				Musik-URL:
-			</text>
-			<text name="Sound:">
-				Sound:
-			</text>
-			<check_box label="Gesten- und Objektgeräusche auf diese Parzelle beschränken" name="check sound local"/>
-			<text name="Voice settings:">
-				Voice:
-			</text>
-			<check_box label="Voice aktivieren" name="parcel_enable_voice_channel"/>
-			<check_box label="Voice aktivieren (vom Grundstück eingerichtet)" name="parcel_enable_voice_channel_is_estate_disabled"/>
-			<check_box label="Voice auf diese Parzelle beschränken" name="parcel_enable_voice_channel_parcel"/>
-		</panel>
-		<panel label="Zugang" name="land_access_panel">
-			<panel.string name="estate_override">
-				Eine oder mehrere dieser Optionen gelten auf Grundstücksebene
-			</panel.string>
-			<text name="Limit access to this parcel to:">
-				Zugang zu dieser Parzelle
-			</text>
-			<check_box label="Freien Zugang erlauben" name="public_access"/>
-			<text name="Only Allow">
-				Zugang verweigern für:
-			</text>
-			<check_box label="Einwohner, die keine Zahlungsinformationen bei Linden Lab hinterlegt haben" name="limit_payment" tool_tip="Nicht identifizierte Einwohner verbannen."/>
-			<check_box label="Einwohner, die keine altersgeprüften Erwachsenen sind" name="limit_age_verified" tool_tip="Einwohner ohne Altersüberprüfung verbannen. Weitere Informationen finden Sie auf [SUPPORT_SITE]."/>
-			<check_box label="Gruppenzugang erlauben: [GROUP]" name="GroupCheck" tool_tip="Gruppe im Register „Allgemein“ festlegen."/>
-			<check_box label="Pässe verkaufen an:" name="PassCheck" tool_tip="Ermöglicht befristeten Zugang zu dieser Parzelle"/>
-			<combo_box name="pass_combo">
-				<combo_box.item label="Jeden" name="Anyone"/>
-				<combo_box.item label="Gruppe" name="Group"/>
-			</combo_box>
-			<spinner label="Preis in L$:" name="PriceSpin"/>
-			<spinner label="Online-Zeit:" name="HoursSpin"/>
-			<text label="Immer erlauben" name="AllowedText">
-				Zulässige Einwohner
-			</text>
-			<name_list name="AccessList" tool_tip="([LISTED] angezeigt, max. [MAX])"/>
-			<button label="Hinzufügen..." label_selected="Hinzufügen..." name="add_allowed"/>
-			<button label="Entfernen" label_selected="Entfernen" name="remove_allowed"/>
-			<text label="Verbannen" name="BanCheck">
-				Verbannte Einwohner
-			</text>
-			<name_list name="BannedList" tool_tip="([LISTED] angezeigt, max. [MAX])"/>
-			<button label="Hinzufügen..." label_selected="Hinzufügen..." name="add_banned"/>
-			<button label="Entfernen" label_selected="Entfernen" name="remove_banned"/>
-		</panel>
-	</tab_container>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterland" title="LAND-INFO">
+	<floater.string name="Minutes">
+		[MINUTES] Minuten
+	</floater.string>
+	<floater.string name="Minute">
+		Minute
+	</floater.string>
+	<floater.string name="Seconds">
+		[SECONDS] Sekunden
+	</floater.string>
+	<tab_container name="landtab">
+		<panel label="Allgemein" name="land_general_panel">
+			<panel.string name="new users only">
+				Nur neue Benutzer
+			</panel.string>
+			<panel.string name="anyone">
+				Jeder
+			</panel.string>
+			<panel.string name="area_text">
+				Gebiet:
+			</panel.string>
+			<panel.string name="area_size_text">
+				[AREA] qm.
+			</panel.string>
+			<panel.string name="auction_id_text">
+				Auktions-ID: [ID]
+			</panel.string>
+			<panel.string name="need_tier_to_modify">
+				Bestätigen Sie den Kauf, um dieses Land zu bearbeiten.
+			</panel.string>
+			<panel.string name="group_owned_text">
+				(In Gruppenbesitz)
+			</panel.string>
+			<panel.string name="profile_text">
+				Profil...
+			</panel.string>
+			<panel.string name="info_text">
+				Info...
+			</panel.string>
+			<panel.string name="public_text">
+				(öffentlich)
+			</panel.string>
+			<panel.string name="none_text">
+				(keiner)
+			</panel.string>
+			<panel.string name="sale_pending_text">
+				(Wird verkauft)
+			</panel.string>
+			<panel.string name="no_selection_text">
+				Keine Parzelle ausgewählt.
+Öffnen Sie „Welt“ &gt; „Land-Info“ oder wählen Sie eine andere Parzelle aus, um Informationen darüber anzuzeigen.
+			</panel.string>
+			<text name="Name:">
+				Name:
+			</text>
+			<text name="Description:">
+				Beschreibung:
+			</text>
+			<text name="LandType">
+				Typ:
+			</text>
+			<text name="LandTypeText">
+				Mainland / Homestead
+			</text>
+			<text name="ContentRating">
+				Einstufung:
+			</text>
+			<text name="ContentRatingText">
+				Adult
+			</text>
+			<text name="Owner:">
+				Eigentümer:
+			</text>
+			<text name="OwnerText">
+				Leyla Linden
+			</text>
+			<button label="Profil..." label_selected="Profil..." name="Profile..."/>
+			<text name="Group:">
+				Gruppe:
+			</text>
+			<button label="Einstellen..." label_selected="Einstellen..." name="Set..."/>
+			<check_box label="Übertragung an Gruppe zulassen" name="check deed" tool_tip="Ein Gruppen-Officer kann dieses Land der Gruppe übertragen. Das Land wird dann über die Landzuteilung der Gruppe verwaltet."/>
+			<button label="Übertragen..." label_selected="Übertragen..." name="Deed..." tool_tip="Sie können Land nur übertragen, wenn Sie in der ausgewählten Gruppe Officer sind."/>
+			<check_box label="Eigentümer leistet Beitrag durch Übertragung" name="check contrib" tool_tip="Wenn das Land an die Gruppe übertragen wird, trägt der frühere Eigentümer ausreichend Landnutzungsrechte bei, um es zu halten."/>
+			<text name="For Sale:">
+				Zum Verkauf:
+			</text>
+			<text name="Not for sale.">
+				Nicht zu verkaufen.
+			</text>
+			<text name="For Sale: Price L$[PRICE].">
+				Preis: [PRICE] L$ ([PRICE_PER_SQM] L$/qm.).
+			</text>
+			<text name="SalePending"/>
+			<button bottom="-222" label="Land verkaufen..." label_selected="Land verkaufen..." name="Sell Land..."/>
+			<text name="For sale to">
+				Zum Verkauf an: [BUYER]
+			</text>
+			<text name="Sell with landowners objects in parcel." width="210">
+				Objekte sind im Verkauf eingeschlossen.
+			</text>
+			<text name="Selling with no objects in parcel." width="237">
+				Objekte sind im Verkauf nicht eingeschlossen.
+			</text>
+			<button bottom="-222" label="Landverkauf abbrechen" label_selected="Landverkauf abbrechen" name="Cancel Land Sale"/>
+			<text name="Claimed:">
+				Gekauft am:
+			</text>
+			<text name="DateClaimText">
+				Dienstag, 15. Aug. 2006, 13:47:25
+			</text>
+			<text name="PriceLabel">
+				Gebiet:
+			</text>
+			<text name="PriceText">
+				4048 qm.
+			</text>
+			<text name="Traffic:">
+				Traffic:
+			</text>
+			<text name="DwellText">
+				0
+			</text>
+			<button label="Land kaufen..." label_selected="Land kaufen..." name="Buy Land..."/>
+			<button label="Für Gruppe kaufen..." label_selected="Für Gruppe kaufen..." name="Buy For Group..."/>
+			<button label="Pass kaufen..." label_selected="Pass kaufen..." name="Buy Pass..." tool_tip="Ein Pass gibt Ihnen zeitbegrenzten Zugang zu diesem Land."/>
+			<button label="Land aufgeben..." label_selected="Land aufgeben..." name="Abandon Land..."/>
+			<button label="Land in Besitz nehmen..." label_selected="Land in Besitz nehmen..." name="Reclaim Land..."/>
+			<button label="Linden-Verkauf..." label_selected="Linden-Verkauf..." name="Linden Sale..." tool_tip="Land muss Eigentum und auf Inhalt gesetzt sein und nicht zur Auktion stehen."/>
+		</panel>
+		<panel label="Vertrag" name="land_covenant_panel">
+			<panel.string name="can_resell">
+				Gekauftes Land in dieser Region kann wiederverkauft werden.
+			</panel.string>
+			<panel.string name="can_not_resell">
+				Gekauftes Land in dieser Region kann nicht wiederverkauft werden.
+			</panel.string>
+			<panel.string name="can_change">
+				Gekauftes Land in dieser Region kann zusammengelegt und
+geteilt werden.
+			</panel.string>
+			<panel.string name="can_not_change">
+				Gekauftes Land in dieser Region kann nicht zusammengelegt
+und geteilt werden.
+			</panel.string>
+			<text name="estate_section_lbl">
+				Grundstück:
+			</text>
+			<text name="estate_name_lbl">
+				Name:
+			</text>
+			<text name="estate_name_text">
+				Mainland
+			</text>
+			<text name="estate_owner_lbl">
+				Eigentümer:
+			</text>
+			<text name="estate_owner_text">
+				(keiner)
+			</text>
+			<text_editor name="covenant_editor">
+				Für dieses Grundstück fehlt der Vertrag.
+			</text_editor>
+			<text name="covenant_timestamp_text">
+				Letzte Änderung am Mittwoch, den 31. Dez. 1969, 16:00:00
+			</text>
+			<text name="region_section_lbl">
+				Region:
+			</text>
+			<text name="region_name_lbl">
+				Name:
+			</text>
+			<text name="region_name_text">
+				leyla
+			</text>
+			<text name="region_landtype_lbl">
+				Typ:
+			</text>
+			<text name="region_landtype_text">
+				Mainland / Homestead
+			</text>
+			<text name="region_maturity_lbl">
+				Einstufung:
+			</text>
+			<text name="region_maturity_text">
+				Adult
+			</text>
+			<text name="resellable_lbl">
+				Wiederverkauf:
+			</text>
+			<text name="resellable_clause">
+				Land in dieser Region kann nicht wiederverkauft werden.
+			</text>
+			<text name="changeable_lbl">
+				Unterteilen:
+			</text>
+			<text name="changeable_clause">
+				Land in dieser Region kann nicht zusammengelegt/geteilt
+werden.
+			</text>
+		</panel>
+		<panel label="Objekte" name="land_objects_panel">
+			<panel.string name="objects_available_text">
+				[COUNT] von [MAX] ([AVAILABLE] verfügbar)
+			</panel.string>
+			<panel.string name="objects_deleted_text">
+				[COUNT] von [MAX] ([DELETED] werden gelöscht)
+			</panel.string>
+			<text name="parcel_object_bonus">
+				Objektbonusfaktor in Region: [BONUS]
+			</text>
+			<text name="Simulator primitive usage:">
+				Primitive in Simulator:
+			</text>
+			<text name="objects_available">
+				[COUNT] von [MAX] ([AVAILABLE] verfügbar)
+			</text>
+			<text name="Primitives parcel supports:" width="200">
+				Von Parzelle unterstützte Primitiva:
+			</text>
+			<text left="204" name="object_contrib_text" width="152">
+				[COUNT]
+			</text>
+			<text name="Primitives on parcel:">
+				Primitiva auf Parzelle:
+			</text>
+			<text left="204" name="total_objects_text" width="48">
+				[COUNT]
+			</text>
+			<text left="14" name="Owned by parcel owner:" width="200">
+				Im Eigentum des Parzellenbesitzers:
+			</text>
+			<text left="204" name="owner_objects_text" width="48">
+				[COUNT]
+			</text>
+			<button label="Anzeigen" label_selected="Anzeigen" name="ShowOwner" right="-135" width="60"/>
+			<button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnOwner..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/>
+			<text left="14" name="Set to group:">
+				Der Gruppe zugeordnet:
+			</text>
+			<text left="204" name="group_objects_text" width="48">
+				[COUNT]
+			</text>
+			<button label="Anzeigen" label_selected="Anzeigen" name="ShowGroup" right="-135" width="60"/>
+			<button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnGroup..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/>
+			<text left="14" name="Owned by others:" width="128">
+				Im Eigentum anderer:
+			</text>
+			<text left="204" name="other_objects_text" width="48">
+				[COUNT]
+			</text>
+			<button label="Anzeigen" label_selected="Anzeigen" name="ShowOther" right="-135" width="60"/>
+			<button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnOther..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/>
+			<text left="14" name="Selected / sat upon:" width="140">
+				Ausgewählt/gesessen auf:
+			</text>
+			<text left="204" name="selected_objects_text" width="48">
+				[COUNT]
+			</text>
+			<text left="4" name="Autoreturn" width="380">
+				Objekte anderer Einwohner automatisch zurückgeben (Minuten, 0 für aus):
+			</text>
+			<line_editor name="clean other time" right="-10" width="56"/>
+			<text name="Object Owners:">
+				Objekteigentümer:
+			</text>
+			<button label="Liste aktualisieren" label_selected="Liste aktualisieren" name="Refresh List"/>
+			<button label="Objekte zurückgeben..." label_selected="Objekte zurückgeben..." name="Return objects..."/>
+			<name_list name="owner list">
+				<name_list.columns label="Typ" name="type"/>
+				<name_list.columns label="Name" name="name"/>
+				<name_list.columns label="Zählen" name="count"/>
+				<name_list.columns label="Aktuellster" name="mostrecent"/>
+			</name_list>
+		</panel>
+		<panel label="Optionen" name="land_options_panel">
+			<panel.string name="search_enabled_tooltip">
+				Diese Parzelle in Suchergebnissen anzeigen.
+			</panel.string>
+			<panel.string name="search_disabled_small_tooltip">
+				Diese Option ist nicht aktiviert, da diese Parzelle nicht größer als 128 qm ist.
+Nur große Parzellen können in der Suche aufgeführt werden.
+			</panel.string>
+			<panel.string name="search_disabled_permissions_tooltip">
+				Diese Option ist nicht aktiviert, da Sie die Parzellenoptionen nicht verändern können.
+			</panel.string>
+			<panel.string name="mature_check_mature">
+				Mature-Inhalt
+			</panel.string>
+			<panel.string name="mature_check_adult">
+				Adult-Inhalt
+			</panel.string>
+			<panel.string name="mature_check_mature_tooltip">
+				Die Informationen oder Inhalte Ihrer Parzelle sind „Mature“.
+			</panel.string>
+			<panel.string name="mature_check_adult_tooltip">
+				Die Informationen oder Inhalte Ihrer Parzelle sind „Adult“.
+			</panel.string>
+			<panel.string name="landing_point_none">
+				(keiner)
+			</panel.string>
+			<panel.string name="push_restrict_text">
+				Kein Stoßen
+			</panel.string>
+			<panel.string name="push_restrict_region_text">
+				Kein Stoßen (regional)
+			</panel.string>
+			<text name="allow_label">
+				Anderen Einwohnern gestatten:
+			</text>
+			<check_box label="Terrain bearbeiten" name="edit land check" tool_tip="Falls aktiviert, kann jeder Ihr Land terraformen. Am besten ist es, wenn Sie diese Option deaktiviert lassen. Sie können Ihr eigenes Land jederzeit bearbeiten."/>
+			<check_box label="Fliegen" name="check fly" tool_tip="Falls aktiviert, können Einwohner auf Ihrem Land fliegen. Falls nicht aktiviert, können Einwohner lediglich auf Ihr Land fliegen und dort landen (dann jedoch nicht wieder weiterfliegen) oder über Ihr Land hinweg fliegen."/>
+			<text name="allow_label2">
+				Objekte erstellen:
+			</text>
+			<check_box label="Alle Einwohner" name="edit objects check"/>
+			<check_box label="Gruppe" name="edit group objects check"/>
+			<text name="allow_label3">
+				Objekteintritt:
+			</text>
+			<check_box label="Alle Einwohner" name="all object entry check"/>
+			<check_box label="Gruppe" name="group object entry check"/>
+			<text name="allow_label4">
+				Skripts ausführen:
+			</text>
+			<check_box label="Alle Einwohner" name="check other scripts"/>
+			<check_box label="Gruppe" name="check group scripts"/>
+			<text name="land_options_label">
+				Landoptionen:
+			</text>
+			<check_box label="Sicher (kein Schaden)" name="check safe" tool_tip="Falls aktiviert, wird Land auf Option „Sicher“ eingestellt, Kampfschäden sind deaktiviert. Falls nicht aktiviert, sind Kampfschäden aktiviert."/>
+			<check_box label="Kein Stoßen" name="PushRestrictCheck" tool_tip="Verhindert Skripte am Stoßen. Durch Aktivieren dieser Option verhindern Sie störendes Verhalten auf Ihrem Land."/>
+			<check_box label="Ort in Suche anzeigen (30 L$/Woche) unter" name="ShowDirectoryCheck" tool_tip="Diese Parzelle in Suchergebnissen anzeigen."/>
+			<combo_box name="land category with adult">
+				<combo_box.item label="Alle Kategorien" name="item0"/>
+				<combo_box.item label="Lindenort" name="item1"/>
+				<combo_box.item label="Adult" name="item2"/>
+				<combo_box.item label="Kunst &amp; Kultur" name="item3"/>
+				<combo_box.item label="Business" name="item4"/>
+				<combo_box.item label="Bildung" name="item5"/>
+				<combo_box.item label="Spielen" name="item6"/>
+				<combo_box.item label="Treffpunkt" name="item7"/>
+				<combo_box.item label="Anfängergerecht" name="item8"/>
+				<combo_box.item label="Parks und Natur" name="item9"/>
+				<combo_box.item label="Wohngebiet" name="item10"/>
+				<combo_box.item label="Shopping" name="item11"/>
+				<combo_box.item label="Sonstige" name="item12"/>
+			</combo_box>
+			<combo_box left="266" name="land category" width="130">
+				<combo_box.item label="Alle Kategorien" name="item0"/>
+				<combo_box.item label="Lindenort" name="item1"/>
+				<combo_box.item label="Kunst und Kultur" name="item3"/>
+				<combo_box.item label="Business" name="item4"/>
+				<combo_box.item label="Bildung" name="item5"/>
+				<combo_box.item label="Spielen" name="item6"/>
+				<combo_box.item label="Treffpunkt" name="item7"/>
+				<combo_box.item label="Anfängergerecht" name="item8"/>
+				<combo_box.item label="Parks und Natur" name="item9"/>
+				<combo_box.item label="Wohngebiet" name="item10"/>
+				<combo_box.item label="Shopping" name="item11"/>
+				<combo_box.item label="Sonstige" name="item12"/>
+			</combo_box>
+			<check_box label="Mature-Inhalt" name="MatureCheck" tool_tip=""/>
+			<text name="Snapshot:">
+				Foto:
+			</text>
+			<texture_picker label="" name="snapshot_ctrl" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
+			<text name="landing_point">
+				Landepunkt: [LANDING]
+			</text>
+			<button label="Festlegen" label_selected="Festlegen" left="234" name="Set" tool_tip="Legt den Landepunkt fest, an dem Besucher ankommen. Legt die Position Ihres Avatars innerhalb dieser Parzelle fest." width="70"/>
+			<button label="Löschen" label_selected="Löschen" left="312" name="Clear" tool_tip="Landepunkt löschen." width="70"/>
+			<text name="Teleport Routing: ">
+				Teleport-Route:
+			</text>
+			<combo_box name="landing type" tool_tip="Teleport-Route -- festlegen, wie Teleports auf Ihrem Land gehandhabt werden sollen.">
+				<combo_box.item label="Blockiert" name="Blocked"/>
+				<combo_box.item label="Landepunkt" name="LandingPoint"/>
+				<combo_box.item label="Überall" name="Anywhere"/>
+			</combo_box>
+		</panel>
+		<panel label="Medien" name="land_media_panel">
+			<text name="with media:">
+				Typ:
+			</text>
+			<combo_box name="media type" tool_tip="Geben Sie einen URL für den Film, die Webseite oder ein anderes Medium ein"/>
+			<text name="at URL:">
+				Start URL:
+			</text>
+			<button label="Einstellen..." label_selected="Einstellen..." name="set_media_url"/>
+			<text name="CurrentURL:">
+				Aktuelle URL:
+			</text>
+			<button label="Zurücksetzen..." label_selected="Zurücksetzen..." name="reset_media_url"/>
+			<check_box label="URL ausblenden" name="hide_media_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Medien-URL sehen können. Diese Option ist für HTML-Medien nicht verfügbar."/>
+			<text name="Description:">
+				Inhalt:
+			</text>
+			<line_editor name="url_description" tool_tip="Text, der neben der Abspielen/Laden-Schaltfläche angezeigt wird"/>
+			<text name="Media texture:">
+				Textur
+ersetzen:
+			</text>
+			<texture_picker label="" name="media texture" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
+			<text name="replace_texture_help">
+				Objekte, die diese Textur verwenden, werden den Film oder die Webseite anzeigen, nachdem Sie auf den Pfeil (Wiedergabe) klicken.
+
+Wählen Sie das kleine Bild aus, um eine andere Textur auszuwählen.
+			</text>
+			<check_box label="Automatisch skalieren" name="media_auto_scale" tool_tip="Aktivieren Sie diese Option, um den Inhalt für diese Parzelle automatisch zu skalieren. Dies ist eventuell langsamer und die Qualität ist schlechter, aber Sie müssen keine weitere Texturskalierung oder -anpassung vornehmen."/>
+			<text name="media_size" tool_tip="Darstellungsgröße von Webmedien, für Standard bei 0 belassen.">
+				Größe:
+			</text>
+			<spinner name="media_size_width" tool_tip="Darstellungsgröße von Webmedien, für Standard bei 0 belassen."/>
+			<spinner name="media_size_height" tool_tip="Darstellungsgröße von Webmedien, für Standard bei 0 belassen."/>
+			<text name="pixels">
+				Pixel
+			</text>
+			<text name="Options:">
+				Optionen:
+			</text>
+			<check_box label="Schleife" name="media_loop" tool_tip="Spielt das Medium in einer Schleife ab.  Der Abspielvorgang wird immer wieder von vorne fortgesetzt."/>
+		</panel>
+		<panel label="Audio" name="land_audio_panel">
+			<text name="MusicURL:">
+				Musik-URL:
+			</text>
+			<text name="Sound:">
+				Sound:
+			</text>
+			<check_box label="Gesten- und Objektgeräusche auf diese Parzelle beschränken" name="check sound local"/>
+			<text name="Voice settings:">
+				Voice:
+			</text>
+			<check_box label="Voice aktivieren" name="parcel_enable_voice_channel"/>
+			<check_box label="Voice aktivieren (vom Grundstück eingerichtet)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+			<check_box label="Voice auf diese Parzelle beschränken" name="parcel_enable_voice_channel_parcel"/>
+		</panel>
+		<panel label="Zugang" name="land_access_panel">
+			<panel.string name="estate_override">
+				Eine oder mehrere dieser Optionen gelten auf Grundstücksebene
+			</panel.string>
+			<text name="Limit access to this parcel to:">
+				Zugang zu dieser Parzelle
+			</text>
+			<check_box label="Freien Zugang erlauben" name="public_access"/>
+			<text name="Only Allow">
+				Zugang verweigern für:
+			</text>
+			<check_box label="Einwohner, die keine Zahlungsinformationen bei Linden Lab hinterlegt haben" name="limit_payment" tool_tip="Nicht identifizierte Einwohner verbannen."/>
+			<check_box label="Einwohner, die keine altersgeprüften Erwachsenen sind" name="limit_age_verified" tool_tip="Einwohner ohne Altersüberprüfung verbannen. Weitere Informationen finden Sie auf [SUPPORT_SITE]."/>
+			<check_box label="Gruppenzugang erlauben: [GROUP]" name="GroupCheck" tool_tip="Gruppe im Register „Allgemein“ festlegen."/>
+			<check_box label="Pässe verkaufen an:" name="PassCheck" tool_tip="Ermöglicht befristeten Zugang zu dieser Parzelle"/>
+			<combo_box name="pass_combo">
+				<combo_box.item label="Jeden" name="Anyone"/>
+				<combo_box.item label="Gruppe" name="Group"/>
+			</combo_box>
+			<spinner label="Preis in L$:" name="PriceSpin"/>
+			<spinner label="Online-Zeit:" name="HoursSpin"/>
+			<text label="Immer erlauben" name="AllowedText">
+				Zulässige Einwohner
+			</text>
+			<name_list name="AccessList" tool_tip="([LISTED] angezeigt, max. [MAX])"/>
+			<button label="Hinzufügen..." label_selected="Hinzufügen..." name="add_allowed"/>
+			<button label="Entfernen" label_selected="Entfernen" name="remove_allowed"/>
+			<text label="Verbannen" name="BanCheck">
+				Verbannte Einwohner
+			</text>
+			<name_list name="BannedList" tool_tip="([LISTED] angezeigt, max. [MAX])"/>
+			<button label="Hinzufügen..." label_selected="Hinzufügen..." name="add_banned"/>
+			<button label="Entfernen" label_selected="Entfernen" name="remove_banned"/>
+		</panel>
+	</tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_animation_preview.xml b/indra/newview/skins/default/xui/de/floater_animation_preview.xml
index 0d56f1ef9f5..33ce72855b2 100644
--- a/indra/newview/skins/default/xui/de/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/de/floater_animation_preview.xml
@@ -1,184 +1,184 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Animation Preview" title="">
-	<floater.string name="failed_to_initialize">
-		Bewegung konnte nicht initialisiert werden
-	</floater.string>
-	<floater.string name="anim_too_long">
-		Animationsdatei ist [LENGTH] Sekunden lang.
-
-Maximal erlaubt sind [MAX_LENGTH] Sekunden.
-	</floater.string>
-	<floater.string name="failed_file_read">
-		Animationsdatei konnte nicht gelesen werden.
-
-[STATUS]
-	</floater.string>
-	<floater.string name="E_ST_OK">
-		OK
-	</floater.string>
-	<floater.string name="E_ST_EOF">
-		Unvollständige Datei
-	</floater.string>
-	<floater.string name="E_ST_NO_CONSTRAINT">
-		Constraint-Definition kann nicht gelesen werden.
-	</floater.string>
-	<floater.string name="E_ST_NO_FILE">
-		BVH-Datei kann nicht geöffnet werden
-	</floater.string>
-	<floater.string name="E_ST_NO_HIER">
-		Ungültiger HIERARCHY-Titel.
-	</floater.string>
-	<floater.string name="E_ST_NO_JOINT">
-		ROOT oder JOINT nicht gefunden.
-	</floater.string>
-	<floater.string name="E_ST_NO_NAME">
-		JOINT-Name nicht erfasst.
-	</floater.string>
-	<floater.string name="E_ST_NO_OFFSET">
-		VERSATZ nicht gefunden.
-	</floater.string>
-	<floater.string name="E_ST_NO_CHANNELS">
-		CHANNELS nicht gefunden.
-	</floater.string>
-	<floater.string name="E_ST_NO_ROTATION">
-		Kann Rotations-Reihenfolge nicht erfassen.
-	</floater.string>
-	<floater.string name="E_ST_NO_AXIS">
-		Kann Rotations-Achse nicht erfassen.
-	</floater.string>
-	<floater.string name="E_ST_NO_MOTION">
-		MOTION nicht gefunden.
-	</floater.string>
-	<floater.string name="E_ST_NO_FRAMES">
-		Anzahl der Bilder kann nicht erfasst werden.
-	</floater.string>
-	<floater.string name="E_ST_NO_FRAME_TIME">
-		Bildzeit kann nicht erfasst werden.
-	</floater.string>
-	<floater.string name="E_ST_NO_POS">
-		Positions-Werte können nicht erfasst werden.
-	</floater.string>
-	<floater.string name="E_ST_NO_ROT">
-		Kann Rotations-Werte nicht erfassen.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_FILE">
-		Datei kann nicht geöffnet werden
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_HEADER">
-		Übersetzungstitel kann nicht gelesen werden.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_NAME">
-		Übersetzungsnamen können nicht geladen werden.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_IGNORE">
-		Ignorier-Wert kann nicht gelesen werden.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_RELATIVE">
-		Übersetzungs-Wert kann nicht gelesen werden.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_OUTNAME">
-		Outname-Wert kann nicht gelesen werden.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_MATRIX">
-		Übersetzungsmatrix kann nicht geladen werden.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_MERGECHILD">
-		Mergechild-Name nicht erfasst.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_MERGEPARENT">
-		Mergeparent-Name nicht erfasst.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_PRIORITY">
-		Prioritätswert kann nicht erfasst werden.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_LOOP">
-		Loop-Wert kann nicht erfasst werden.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_EASEIN">
-		Easeln-Wert kann nicht erfasst werden.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_EASEOUT">
-		easeOut-Wert kann nicht erfasst werden.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_HAND">
-		Hand-Morph-Wert nicht erfasst.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_EMOTE">
-		Emote-Name kann nicht gelesen werden.
-	</floater.string>
-	<text name="name_label">
-		Name:
-	</text>
-	<line_editor name="name_form"/>
-	<text name="description_label">
-		Beschreibung:
-	</text>
-	<spinner label="Priorität" name="priority" tool_tip="Steuert, welche Animationen von dieser Animation überschrieben werden können."/>
-	<check_box bottom_delta="-18" label="Schleife" name="loop_check" tool_tip="Erzeugt eine Animationsschleife."/>
-	<spinner label="In (%)" name="loop_in_point" tool_tip="Anfang einer Animationsschleife festlegen."/>
-	<spinner label="Aus (%)" name="loop_out_point" tool_tip="Ende einer Animationsschleife festlegen."/>
-	<text name="hand_label">
-		Handhaltung
-	</text>
-	<combo_box label="" name="hand_pose_combo" tool_tip="Steuert während der Animation die Bewegung der Hände.">
-		<combo_box.item label="Dehnen" name="Spread"/>
-		<combo_box.item label="Entspannt" name="Relaxed"/>
-		<combo_box.item label="Beide zeigen" name="PointBoth"/>
-		<combo_box.item label="Faust" name="Fist"/>
-		<combo_box.item label="Links entspannt" name="RelaxedLeft"/>
-		<combo_box.item label="Nach links zeigen" name="PointLeft"/>
-		<combo_box.item label="Linke Faust" name="FistLeft"/>
-		<combo_box.item label="Rechts entspannt" name="RelaxedRight"/>
-		<combo_box.item label="Nach rechts zeigen" name="PointRight"/>
-		<combo_box.item label="Rechte Faust" name="FistRight"/>
-		<combo_box.item label="Rechts salutieren" name="SaluteRight"/>
-		<combo_box.item label="Tippt" name="Typing"/>
-		<combo_box.item label="Friedensrecht" name="PeaceRight"/>
-	</combo_box>
-	<text name="emote_label">
-		Ausdruck
-	</text>
-	<combo_box label="" name="emote_combo" tool_tip="Steuert Gesichtsregungen während der Animation.">
-		<combo_box.item label="Keine]" name="[None]"/>
-		<combo_box.item label="Aaaaah" name="Aaaaah"/>
-		<combo_box.item label="Ängstlich" name="Afraid"/>
-		<combo_box.item label="Verärgert" name="Angry"/>
-		<combo_box.item label="Grinst" name="BigSmile"/>
-		<combo_box.item label="Gelangweilt" name="Bored"/>
-		<combo_box.item label="Weinen" name="Cry"/>
-		<combo_box.item label="Verachten" name="Disdain"/>
-		<combo_box.item label="Verlegen" name="Embarrassed"/>
-		<combo_box.item label="Stirnrunzeln" name="Frown"/>
-		<combo_box.item label="Küssen" name="Kiss"/>
-		<combo_box.item label="Lachen" name="Laugh"/>
-		<combo_box.item label="Bäääh" name="Plllppt"/>
-		<combo_box.item label="Zurückgestoßen" name="Repulsed"/>
-		<combo_box.item label="Traurig" name="Sad"/>
-		<combo_box.item label="Schulterzucken" name="Shrug"/>
-		<combo_box.item label="Lächeln" name="Smile"/>
-		<combo_box.item label="Überraschung" name="Surprise"/>
-		<combo_box.item label="Zwinkern" name="Wink"/>
-		<combo_box.item label="Sorgenvoll" name="Worry"/>
-	</combo_box>
-	<text name="preview_label" width="97">
-		Vorschau während:
-	</text>
-	<combo_box label="" left_delta="107" name="preview_base_anim" tool_tip="Hiermit können Sie das Verhalten Ihres Avatars testen, während Ihr Avatar normale Bewegungen ausführt.">
-		<combo_box.item label="Stehend" name="Standing"/>
-		<combo_box.item label="Geht" name="Walking"/>
-		<combo_box.item label="Sitzt" name="Sitting"/>
-		<combo_box.item label="Fliegend" name="Flying"/>
-	</combo_box>
-	<spinner label="Eingang glätten (s)" label_width="105" name="ease_in_time" tool_tip="Einblendungsgeschwindigkeit von Animationen (in Sekunden)." width="175"/>
-	<spinner bottom_delta="-20" label="Ausgang glätten (s)" label_width="105" left="10" name="ease_out_time" tool_tip="Ausblendungsgeschwindigkeit von Animationen (in Sekunden)." width="175"/>
-	<button bottom_delta="-32" label="" name="play_btn" tool_tip="Animation stoppen/wiedergeben."/>
-	<button label="" name="stop_btn" tool_tip="Animation anhalten"/>
-	<slider label="" name="playback_slider"/>
-	<text name="bad_animation_text">
-		Animationsdatei konnte nicht gelesen werden.
-
-Wir empfehlen exportierte BVH-Dateien aus Poser 4.
-	</text>
-	<button label="Abbrechen" name="cancel_btn"/>
-	<button label="Hochladen ([AMOUNT] L$)" name="ok_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Animation Preview" title="">
+	<floater.string name="failed_to_initialize">
+		Bewegung konnte nicht initialisiert werden
+	</floater.string>
+	<floater.string name="anim_too_long">
+		Animationsdatei ist [LENGTH] Sekunden lang.
+
+Maximal erlaubt sind [MAX_LENGTH] Sekunden.
+	</floater.string>
+	<floater.string name="failed_file_read">
+		Animationsdatei konnte nicht gelesen werden.
+
+[STATUS]
+	</floater.string>
+	<floater.string name="E_ST_OK">
+		OK
+	</floater.string>
+	<floater.string name="E_ST_EOF">
+		Unvollständige Datei
+	</floater.string>
+	<floater.string name="E_ST_NO_CONSTRAINT">
+		Constraint-Definition kann nicht gelesen werden.
+	</floater.string>
+	<floater.string name="E_ST_NO_FILE">
+		BVH-Datei kann nicht geöffnet werden
+	</floater.string>
+	<floater.string name="E_ST_NO_HIER">
+		Ungültiger HIERARCHY-Titel.
+	</floater.string>
+	<floater.string name="E_ST_NO_JOINT">
+		ROOT oder JOINT nicht gefunden.
+	</floater.string>
+	<floater.string name="E_ST_NO_NAME">
+		JOINT-Name nicht erfasst.
+	</floater.string>
+	<floater.string name="E_ST_NO_OFFSET">
+		VERSATZ nicht gefunden.
+	</floater.string>
+	<floater.string name="E_ST_NO_CHANNELS">
+		CHANNELS nicht gefunden.
+	</floater.string>
+	<floater.string name="E_ST_NO_ROTATION">
+		Kann Rotations-Reihenfolge nicht erfassen.
+	</floater.string>
+	<floater.string name="E_ST_NO_AXIS">
+		Kann Rotations-Achse nicht erfassen.
+	</floater.string>
+	<floater.string name="E_ST_NO_MOTION">
+		MOTION nicht gefunden.
+	</floater.string>
+	<floater.string name="E_ST_NO_FRAMES">
+		Anzahl der Bilder kann nicht erfasst werden.
+	</floater.string>
+	<floater.string name="E_ST_NO_FRAME_TIME">
+		Bildzeit kann nicht erfasst werden.
+	</floater.string>
+	<floater.string name="E_ST_NO_POS">
+		Positions-Werte können nicht erfasst werden.
+	</floater.string>
+	<floater.string name="E_ST_NO_ROT">
+		Kann Rotations-Werte nicht erfassen.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_FILE">
+		Datei kann nicht geöffnet werden
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_HEADER">
+		Übersetzungstitel kann nicht gelesen werden.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_NAME">
+		Übersetzungsnamen können nicht geladen werden.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_IGNORE">
+		Ignorier-Wert kann nicht gelesen werden.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_RELATIVE">
+		Übersetzungs-Wert kann nicht gelesen werden.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_OUTNAME">
+		Outname-Wert kann nicht gelesen werden.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_MATRIX">
+		Übersetzungsmatrix kann nicht geladen werden.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_MERGECHILD">
+		Mergechild-Name nicht erfasst.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_MERGEPARENT">
+		Mergeparent-Name nicht erfasst.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_PRIORITY">
+		Prioritätswert kann nicht erfasst werden.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_LOOP">
+		Loop-Wert kann nicht erfasst werden.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_EASEIN">
+		Easeln-Wert kann nicht erfasst werden.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_EASEOUT">
+		easeOut-Wert kann nicht erfasst werden.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_HAND">
+		Hand-Morph-Wert nicht erfasst.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_EMOTE">
+		Emote-Name kann nicht gelesen werden.
+	</floater.string>
+	<text name="name_label">
+		Name:
+	</text>
+	<line_editor name="name_form"/>
+	<text name="description_label">
+		Beschreibung:
+	</text>
+	<spinner label="Priorität" name="priority" tool_tip="Steuert, welche Animationen von dieser Animation überschrieben werden können."/>
+	<check_box bottom_delta="-18" label="Schleife" name="loop_check" tool_tip="Erzeugt eine Animationsschleife."/>
+	<spinner label="In (%)" name="loop_in_point" tool_tip="Anfang einer Animationsschleife festlegen."/>
+	<spinner label="Aus (%)" name="loop_out_point" tool_tip="Ende einer Animationsschleife festlegen."/>
+	<text name="hand_label">
+		Handhaltung
+	</text>
+	<combo_box label="" name="hand_pose_combo" tool_tip="Steuert während der Animation die Bewegung der Hände.">
+		<combo_box.item label="Dehnen" name="Spread"/>
+		<combo_box.item label="Entspannt" name="Relaxed"/>
+		<combo_box.item label="Beide zeigen" name="PointBoth"/>
+		<combo_box.item label="Faust" name="Fist"/>
+		<combo_box.item label="Links entspannt" name="RelaxedLeft"/>
+		<combo_box.item label="Nach links zeigen" name="PointLeft"/>
+		<combo_box.item label="Linke Faust" name="FistLeft"/>
+		<combo_box.item label="Rechts entspannt" name="RelaxedRight"/>
+		<combo_box.item label="Nach rechts zeigen" name="PointRight"/>
+		<combo_box.item label="Rechte Faust" name="FistRight"/>
+		<combo_box.item label="Rechts salutieren" name="SaluteRight"/>
+		<combo_box.item label="Tippt" name="Typing"/>
+		<combo_box.item label="Friedensrecht" name="PeaceRight"/>
+	</combo_box>
+	<text name="emote_label">
+		Ausdruck
+	</text>
+	<combo_box label="" name="emote_combo" tool_tip="Steuert Gesichtsregungen während der Animation.">
+		<combo_box.item label="Keine]" name="[None]"/>
+		<combo_box.item label="Aaaaah" name="Aaaaah"/>
+		<combo_box.item label="Ängstlich" name="Afraid"/>
+		<combo_box.item label="Verärgert" name="Angry"/>
+		<combo_box.item label="Grinst" name="BigSmile"/>
+		<combo_box.item label="Gelangweilt" name="Bored"/>
+		<combo_box.item label="Weinen" name="Cry"/>
+		<combo_box.item label="Verachten" name="Disdain"/>
+		<combo_box.item label="Verlegen" name="Embarrassed"/>
+		<combo_box.item label="Stirnrunzeln" name="Frown"/>
+		<combo_box.item label="Küssen" name="Kiss"/>
+		<combo_box.item label="Lachen" name="Laugh"/>
+		<combo_box.item label="Bäääh" name="Plllppt"/>
+		<combo_box.item label="Zurückgestoßen" name="Repulsed"/>
+		<combo_box.item label="Traurig" name="Sad"/>
+		<combo_box.item label="Schulterzucken" name="Shrug"/>
+		<combo_box.item label="Lächeln" name="Smile"/>
+		<combo_box.item label="Überraschung" name="Surprise"/>
+		<combo_box.item label="Zwinkern" name="Wink"/>
+		<combo_box.item label="Sorgenvoll" name="Worry"/>
+	</combo_box>
+	<text name="preview_label" width="97">
+		Vorschau während:
+	</text>
+	<combo_box label="" left_delta="107" name="preview_base_anim" tool_tip="Hiermit können Sie das Verhalten Ihres Avatars testen, während Ihr Avatar normale Bewegungen ausführt.">
+		<combo_box.item label="Stehend" name="Standing"/>
+		<combo_box.item label="Geht" name="Walking"/>
+		<combo_box.item label="Sitzt" name="Sitting"/>
+		<combo_box.item label="Fliegend" name="Flying"/>
+	</combo_box>
+	<spinner label="Eingang glätten (s)" label_width="105" name="ease_in_time" tool_tip="Einblendungsgeschwindigkeit von Animationen (in Sekunden)." width="175"/>
+	<spinner bottom_delta="-20" label="Ausgang glätten (s)" label_width="105" left="10" name="ease_out_time" tool_tip="Ausblendungsgeschwindigkeit von Animationen (in Sekunden)." width="175"/>
+	<button bottom_delta="-32" label="" name="play_btn" tool_tip="Animation stoppen/wiedergeben."/>
+	<button label="" name="stop_btn" tool_tip="Animation anhalten"/>
+	<slider label="" name="playback_slider"/>
+	<text name="bad_animation_text">
+		Animationsdatei konnte nicht gelesen werden.
+
+Wir empfehlen exportierte BVH-Dateien aus Poser 4.
+	</text>
+	<button label="Abbrechen" name="cancel_btn"/>
+	<button label="Hochladen ([AMOUNT] L$)" name="ok_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_avatar_picker.xml b/indra/newview/skins/default/xui/de/floater_avatar_picker.xml
index b95b6febd98..a188a9fd9ea 100644
--- a/indra/newview/skins/default/xui/de/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/de/floater_avatar_picker.xml
@@ -1,43 +1,43 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatarpicker" title="EINWOHNER AUSWÄHLEN">
-	<tab_container name="ResidentChooserTabs">
-		<panel label="Suchen" name="SearchPanel">
-			<text name="InstructSearchResidentName">
-				Geben Sie einen Teil des Namens einer Person ein:
-			</text>
-			<line_editor bottom_delta="-36" name="Edit"/>
-			<button label="Los" label_selected="Los" name="Find"/>
-			<scroll_list bottom_delta="-79" height="74" name="SearchResults"/>
-		</panel>
-		<panel label="Visitenkarten" name="CallingCardsPanel">
-			<text name="InstructSelectCallingCard">
-				Wählen Sie eine Visitenkarte:
-			</text>
-		</panel>
-		<panel label="In meiner Nähe" name="NearMePanel">
-			<text name="InstructSelectResident">
-				Wählen Sie eine Person aus, die sich in der Nähe befindet:
-			</text>
-			<button font="SansSerifSmall" label="Liste aktualisieren" label_selected="Liste aktualisieren" left_delta="10" name="Refresh" width="105"/>
-			<slider bottom_delta="-36" label="Bereich" name="near_me_range"/>
-			<text name="meters">
-				Meter
-			</text>
-			<scroll_list bottom_delta="-169" height="159" name="NearMe"/>
-		</panel>
-	</tab_container>
-	<button label="OK" label_selected="OK" name="Select"/>
-	<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
-	<string name="not_found">
-		„[TEXT]“ nicht gefunden
-	</string>
-	<string name="no_one_near">
-		Niemand in der Nähe
-	</string>
-	<string name="no_results">
-		Keine Ergebnisse
-	</string>
-	<string name="searching">
-		Suchen...
-	</string>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="avatarpicker" title="EINWOHNER AUSWÄHLEN">
+	<tab_container name="ResidentChooserTabs">
+		<panel label="Suchen" name="SearchPanel">
+			<text name="InstructSearchResidentName">
+				Geben Sie einen Teil des Namens einer Person ein:
+			</text>
+			<line_editor bottom_delta="-36" name="Edit"/>
+			<button label="Los" label_selected="Los" name="Find"/>
+			<scroll_list bottom_delta="-79" height="74" name="SearchResults"/>
+		</panel>
+		<panel label="Visitenkarten" name="CallingCardsPanel">
+			<text name="InstructSelectCallingCard">
+				Wählen Sie eine Visitenkarte:
+			</text>
+		</panel>
+		<panel label="In meiner Nähe" name="NearMePanel">
+			<text name="InstructSelectResident">
+				Wählen Sie eine Person aus, die sich in der Nähe befindet:
+			</text>
+			<button font="SansSerifSmall" label="Liste aktualisieren" label_selected="Liste aktualisieren" left_delta="10" name="Refresh" width="105"/>
+			<slider bottom_delta="-36" label="Bereich" name="near_me_range"/>
+			<text name="meters">
+				Meter
+			</text>
+			<scroll_list bottom_delta="-169" height="159" name="NearMe"/>
+		</panel>
+	</tab_container>
+	<button label="OK" label_selected="OK" name="Select"/>
+	<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
+	<string name="not_found">
+		„[TEXT]“ nicht gefunden
+	</string>
+	<string name="no_one_near">
+		Niemand in der Nähe
+	</string>
+	<string name="no_results">
+		Keine Ergebnisse
+	</string>
+	<string name="searching">
+		Suchen...
+	</string>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_beacons.xml b/indra/newview/skins/default/xui/de/floater_beacons.xml
index bfa3f6e4c93..f407ba6122c 100644
--- a/indra/newview/skins/default/xui/de/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/de/floater_beacons.xml
@@ -1,21 +1,21 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="beacons" title="BEACONS">
-	<panel name="beacons_panel">
-		<text name="label_show">
-			Anzeigen:
-		</text>
-		<check_box label="Beacons" name="beacons"/>
-		<check_box label="Glanzlichter" name="highlights"/>
-		<text name="beacon_width_label" tool_tip="Beacon-Breite">
-			Breite:
-		</text>
-		<text name="label_objects">
-			Für diese Objekte:
-		</text>
-		<check_box label="Physisch" name="physical"/>
-		<check_box label="Skriptobjekte" name="scripted"/>
-		<check_box label="Nur berühren" name="touch_only"/>
-		<check_box label="Soundquellen" name="sounds"/>
-		<check_box label="Partikelquellen" name="particles"/>
-	</panel>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="beacons" title="BEACONS">
+	<panel name="beacons_panel">
+		<text name="label_show">
+			Anzeigen:
+		</text>
+		<check_box label="Beacons" name="beacons"/>
+		<check_box label="Glanzlichter" name="highlights"/>
+		<text name="beacon_width_label" tool_tip="Beacon-Breite">
+			Breite:
+		</text>
+		<text name="label_objects">
+			Für diese Objekte:
+		</text>
+		<check_box label="Physisch" name="physical"/>
+		<check_box label="Skriptobjekte" name="scripted"/>
+		<check_box label="Nur berühren" name="touch_only"/>
+		<check_box label="Soundquellen" name="sounds"/>
+		<check_box label="Partikelquellen" name="particles"/>
+	</panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_build_options.xml b/indra/newview/skins/default/xui/de/floater_build_options.xml
index 2f510cd75af..932ea160a95 100644
--- a/indra/newview/skins/default/xui/de/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/de/floater_build_options.xml
@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="build options floater" title="RASTEROPTIONEN">
-	<spinner label="Rastereinheit (Meter)" name="GridResolution"/>
-	<spinner label="Rastergröße (Meter)" name="GridDrawSize"/>
-	<check_box label="An Untereinheiten ausrichten" name="GridSubUnit"/>
-	<check_box label="Querschnitte anzeigen" name="GridCrossSection"/>
-	<text name="grid_opacity_label" tool_tip="Rasterdeckkraft">
-		Deckkraft:
-	</text>
-	<slider label="Rasterdeckkraft" name="GridOpacity"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="build options floater" title="RASTEROPTIONEN">
+	<spinner label="Rastereinheit (Meter)" name="GridResolution"/>
+	<spinner label="Rastergröße (Meter)" name="GridDrawSize"/>
+	<check_box label="An Untereinheiten ausrichten" name="GridSubUnit"/>
+	<check_box label="Querschnitte anzeigen" name="GridCrossSection"/>
+	<text name="grid_opacity_label" tool_tip="Rasterdeckkraft">
+		Deckkraft:
+	</text>
+	<slider label="Rasterdeckkraft" name="GridOpacity"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml
index 1dceb1ad674..6c0574dee48 100644
--- a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml
@@ -1,53 +1,53 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="Inhalt-Berechtigungen bearbeiten">
-	<floater.string name="nothing_to_modify_text">
-		Auswahl enthält keinen Inhalt, der bearbeitet werden kann.
-	</floater.string>
-	<floater.string name="status_text">
-		Berechtigungen werden eingestellt auf [NAME]
-	</floater.string>
-	<floater.string name="start_text">
-		Start: Anforderung auf Änderung der Berechtigung...
-	</floater.string>
-	<floater.string name="done_text">
-		Ende: Anforderung auf Änderung der Berechtigung.
-	</floater.string>
-	<check_box label="Animation" name="check_animation"/>
-	<icon name="icon_animation" tool_tip="Animation"/>
-	<check_box label="Körperteile" name="check_bodypart"/>
-	<icon name="icon_bodypart" tool_tip="Körperteile"/>
-	<check_box label="Kleidung" name="check_clothing"/>
-	<icon name="icon_clothing" tool_tip="Kleidung"/>
-	<check_box label="Gesten" name="check_gesture"/>
-	<icon name="icon_gesture" tool_tip="Gesten"/>
-	<check_box label="Notizkarten" name="check_notecard"/>
-	<icon name="icon_notecard" tool_tip="Notizkarten"/>
-	<check_box label="Objekte" name="check_object"/>
-	<icon name="icon_object" tool_tip="Objekte"/>
-	<check_box label="Skripts" name="check_script"/>
-	<icon name="icon_script" tool_tip="Skripts"/>
-	<check_box label="Sounds" name="check_sound"/>
-	<icon name="icon_sound" tool_tip="Sounds"/>
-	<check_box label="Texturen" name="check_texture"/>
-	<button label="√ Alle" label_selected="Alle" name="check_all"/>
-	<button label="Löschen" label_selected="Keine" name="check_none"/>
-	<text name="newperms">
-		Neue Inhalts-Berechtigungen
-	</text>
-	<text name="GroupLabel">
-		Gruppe:
-	</text>
-	<check_box label="Freigeben" name="share_with_group"/>
-	<text name="AnyoneLabel">
-		Jeder:
-	</text>
-	<check_box label="Kopieren" name="everyone_copy"/>
-	<text name="NextOwnerLabel">
-		Nächster Eigentümer:
-	</text>
-	<check_box label="Bearbeiten" name="next_owner_modify"/>
-	<check_box label="Kopieren" name="next_owner_copy"/>
-	<check_box initial_value="true" label="Transferieren" name="next_owner_transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/>
-	<button label="OK" name="apply"/>
-	<button label="Abbrechen" name="close"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterbulkperms" title="Inhalt-Berechtigungen bearbeiten">
+	<floater.string name="nothing_to_modify_text">
+		Auswahl enthält keinen Inhalt, der bearbeitet werden kann.
+	</floater.string>
+	<floater.string name="status_text">
+		Berechtigungen werden eingestellt auf [NAME]
+	</floater.string>
+	<floater.string name="start_text">
+		Start: Anforderung auf Änderung der Berechtigung...
+	</floater.string>
+	<floater.string name="done_text">
+		Ende: Anforderung auf Änderung der Berechtigung.
+	</floater.string>
+	<check_box label="Animation" name="check_animation"/>
+	<icon name="icon_animation" tool_tip="Animation"/>
+	<check_box label="Körperteile" name="check_bodypart"/>
+	<icon name="icon_bodypart" tool_tip="Körperteile"/>
+	<check_box label="Kleidung" name="check_clothing"/>
+	<icon name="icon_clothing" tool_tip="Kleidung"/>
+	<check_box label="Gesten" name="check_gesture"/>
+	<icon name="icon_gesture" tool_tip="Gesten"/>
+	<check_box label="Notizkarten" name="check_notecard"/>
+	<icon name="icon_notecard" tool_tip="Notizkarten"/>
+	<check_box label="Objekte" name="check_object"/>
+	<icon name="icon_object" tool_tip="Objekte"/>
+	<check_box label="Skripts" name="check_script"/>
+	<icon name="icon_script" tool_tip="Skripts"/>
+	<check_box label="Sounds" name="check_sound"/>
+	<icon name="icon_sound" tool_tip="Sounds"/>
+	<check_box label="Texturen" name="check_texture"/>
+	<button label="√ Alle" label_selected="Alle" name="check_all"/>
+	<button label="Löschen" label_selected="Keine" name="check_none"/>
+	<text name="newperms">
+		Neue Inhalts-Berechtigungen
+	</text>
+	<text name="GroupLabel">
+		Gruppe:
+	</text>
+	<check_box label="Freigeben" name="share_with_group"/>
+	<text name="AnyoneLabel">
+		Jeder:
+	</text>
+	<check_box label="Kopieren" name="everyone_copy"/>
+	<text name="NextOwnerLabel">
+		Nächster Eigentümer:
+	</text>
+	<check_box label="Bearbeiten" name="next_owner_modify"/>
+	<check_box label="Kopieren" name="next_owner_copy"/>
+	<check_box initial_value="true" label="Transferieren" name="next_owner_transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/>
+	<button label="OK" name="apply"/>
+	<button label="Abbrechen" name="close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_buy_object.xml b/indra/newview/skins/default/xui/de/floater_buy_object.xml
index b1e4476207f..e35212915f0 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_object.xml
@@ -1,26 +1,26 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="OBJEKTKOPIE KAUFEN">
-	<text name="contents_text">
-		Inhalt:
-	</text>
-	<text name="buy_text">
-		[AMOUNT] L$ von [NAME] kaufen?
-	</text>
-	<button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn" width="73"/>
-	<button label="Kaufen" label_selected="Kaufen" name="buy_btn"/>
-	<text name="title_buy_text">
-		Kaufen
-	</text>
-	<string name="title_buy_copy_text">
-		Kopie kaufen von
-	</string>
-	<text name="no_copy_text">
-		(kein Kopieren)
-	</text>
-	<text name="no_modify_text">
-		(kein Bearbeiten)
-	</text>
-	<text name="no_transfer_text">
-		(kein Transferieren)
-	</text>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="OBJEKTKOPIE KAUFEN">
+	<text name="contents_text">
+		Inhalt:
+	</text>
+	<text name="buy_text">
+		[AMOUNT] L$ von [NAME] kaufen?
+	</text>
+	<button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn" width="73"/>
+	<button label="Kaufen" label_selected="Kaufen" name="buy_btn"/>
+	<text name="title_buy_text">
+		Kaufen
+	</text>
+	<string name="title_buy_copy_text">
+		Kopie kaufen von
+	</string>
+	<text name="no_copy_text">
+		(kein Kopieren)
+	</text>
+	<text name="no_modify_text">
+		(kein Bearbeiten)
+	</text>
+	<text name="no_transfer_text">
+		(kein Transferieren)
+	</text>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_camera.xml b/indra/newview/skins/default/xui/de/floater_camera.xml
index a0cf6cbecf3..131f077815f 100644
--- a/indra/newview/skins/default/xui/de/floater_camera.xml
+++ b/indra/newview/skins/default/xui/de/floater_camera.xml
@@ -1,23 +1,23 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater">
-	<floater.string name="rotate_tooltip">
-		Kamera um Fokus drehen
-	</floater.string>
-	<floater.string name="zoom_tooltip">
-		Kamera auf Fokus zoomen
-	</floater.string>
-	<floater.string name="move_tooltip">
-		Kamera nach oben, unten, links und rechts bewegen
-	</floater.string>
-	<panel name="controls">
-		<joystick_track name="cam_track_stick" tool_tip="Kamera nach oben, unten, links und rechts bewegen"/>
-		<joystick_zoom name="zoom" tool_tip="Kamera auf Fokus zoomen"/>
-		<joystick_rotate name="cam_rotate_stick" tool_tip="Kamera um Fokus herum kreisen"/>
-	</panel>
-	<panel name="buttons">
-		<button label="" name="orbit_btn" tool_tip="Kamera kreisen"/>
-		<button label="" name="pan_btn" tool_tip="Kamera schwenken"/>
-		<button label="" name="avatarview_btn" tool_tip="Avatarsicht"/>
-		<button label="" name="freecamera_btn" tool_tip="Objekt ansehen"/>
-	</panel>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="camera_floater">
+	<floater.string name="rotate_tooltip">
+		Kamera um Fokus drehen
+	</floater.string>
+	<floater.string name="zoom_tooltip">
+		Kamera auf Fokus zoomen
+	</floater.string>
+	<floater.string name="move_tooltip">
+		Kamera nach oben, unten, links und rechts bewegen
+	</floater.string>
+	<panel name="controls">
+		<joystick_track name="cam_track_stick" tool_tip="Kamera nach oben, unten, links und rechts bewegen"/>
+		<joystick_zoom name="zoom" tool_tip="Kamera auf Fokus zoomen"/>
+		<joystick_rotate name="cam_rotate_stick" tool_tip="Kamera um Fokus herum kreisen"/>
+	</panel>
+	<panel name="buttons">
+		<button label="" name="orbit_btn" tool_tip="Kamera kreisen"/>
+		<button label="" name="pan_btn" tool_tip="Kamera schwenken"/>
+		<button label="" name="avatarview_btn" tool_tip="Avatarsicht"/>
+		<button label="" name="freecamera_btn" tool_tip="Objekt ansehen"/>
+	</panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_color_picker.xml b/indra/newview/skins/default/xui/de/floater_color_picker.xml
index 4143f634aff..9221d1bcf7f 100644
--- a/indra/newview/skins/default/xui/de/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/de/floater_color_picker.xml
@@ -1,32 +1,32 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="ColorPicker" title="FARBAUSWAHL">
-	<text name="r_val_text">
-		Rot:
-	</text>
-	<text name="g_val_text">
-		Grün:
-	</text>
-	<text name="b_val_text">
-		Blau:
-	</text>
-	<text name="h_val_text">
-		Farbton:
-	</text>
-	<text name="s_val_text">
-		Sätt.:
-	</text>
-	<text name="l_val_text">
-		Hell.:
-	</text>
-	<check_box label="Jetzt übernehmen" name="apply_immediate"/>
-	<button label="" label_selected="" name="color_pipette"/>
-	<button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/>
-	<button label="OK" label_selected="Auswählen" name="select_btn"/>
-	<text name="Current color:">
-		Aktuelle Farbe:
-	</text>
-	<text name="(Drag below to save.)">
-		(Nach unten ziehen,
- um zu speichern)
-	</text>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="ColorPicker" title="FARBAUSWAHL">
+	<text name="r_val_text">
+		Rot:
+	</text>
+	<text name="g_val_text">
+		Grün:
+	</text>
+	<text name="b_val_text">
+		Blau:
+	</text>
+	<text name="h_val_text">
+		Farbton:
+	</text>
+	<text name="s_val_text">
+		Sätt.:
+	</text>
+	<text name="l_val_text">
+		Hell.:
+	</text>
+	<check_box label="Jetzt übernehmen" name="apply_immediate"/>
+	<button label="" label_selected="" name="color_pipette"/>
+	<button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/>
+	<button label="OK" label_selected="Auswählen" name="select_btn"/>
+	<text name="Current color:">
+		Aktuelle Farbe:
+	</text>
+	<text name="(Drag below to save.)">
+		(Nach unten ziehen,
+ um zu speichern)
+	</text>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_god_tools.xml b/indra/newview/skins/default/xui/de/floater_god_tools.xml
index 34ea18457e4..e790420efb6 100644
--- a/indra/newview/skins/default/xui/de/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/de/floater_god_tools.xml
@@ -1,102 +1,102 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="godtools floater" title="GOTT-WERKZEUGE">
-	<tab_container name="GodTools Tabs">
-		<panel label="Raster" name="grid">
-			<button label="Alle Benutzer hinauswerfen" label_selected="Alle Benutzer hinauswerfen" name="Kick all users" width="175"/>
-			<button label="Sichtbarkeits-Cache dieser Regionskarte leeren" label_selected="Sichtbarkeits-Cache dieser Regionskarte leeren" name="Flush This Region&apos;s Map Visibility Caches" width="285"/>
-		</panel>
-		<panel label="Region" name="region">
-			<text name="Sim Name:" width="55">
-				Sim-Name:
-			</text>
-			<check_box label="Startbereich Einleitung" name="check prelude" tool_tip="Diese Region zu einem Startbereich machen."/>
-			<check_box label="Sonne fest" name="check fixed sun" tool_tip="Fixiert den Sonnenstand (wie in „Region/Grundstück“ &gt; „Terrain“."/>
-			<check_box height="32" label="Zuhause auf Teleport 
-zurücksetzen" name="check reset home" tool_tip="Wenn Einwohner wegteleportieren, ihr Zuhause auf Zielposition setzen."/>
-			<check_box bottom_delta="-32" label="Sichtbar" name="check visible" tool_tip="Diese Region für Nicht-Götter sichtbar machen."/>
-			<check_box label="Schaden" name="check damage" tool_tip="Schaden in dieser Region aktivieren."/>
-			<check_box label="Trafficüberwachung blockieren" name="block dwell" tool_tip="In dieser Region die Traffic-Berechnung abschalten."/>
-			<check_box label="Terraformen blockieren" name="block terraform" tool_tip="Das Terraformen von Land verbieten (Benutzen Sie dies um Leuten das Terraformen ihres Landes zu verbieten)"/>
-			<check_box label="Sandkasten" name="is sandbox" tool_tip="Sandkastenregion ein-/ausschalten."/>
-			<button label="Terrain formen" label_selected="Terrain formen" name="Bake Terrain" tool_tip="Das aktuelle Terrain als Standard speichern." width="118"/>
-			<button label="Terrain zurücksetzen" label_selected="Terrain zurücksetzen" name="Revert Terrain" tool_tip="Das aktuelle Terrain mit dem Standard ersetzen." width="118"/>
-			<button label="Terrain tauschen" label_selected="Terrain tauschen" name="Swap Terrain" tool_tip="Aktuelles Terrain gegen Standard austauschen." width="118"/>
-			<text name="estate id">
-				Grundstücks-ID:
-			</text>
-			<text name="parent id">
-				Parent ID:
-			</text>
-			<line_editor name="parentestate" tool_tip="Das übergeordnete Grundstück dieser Region"/>
-			<text name="Grid Pos: ">
-				Raster-Pos.:
-			</text>
-			<line_editor left_delta="110" name="gridposx" tool_tip="Die X-Rasterposition dieser Region" width="35"/>
-			<line_editor left_delta="45" name="gridposy" tool_tip="Die Y-Rasterposition dieser Region" width="35"/>
-			<text name="Redirect to Grid: ">
-				Auf Raster umleiten:
-			</text>
-			<line_editor left_delta="110" name="redirectx" width="35"/>
-			<line_editor left_delta="45" name="redirecty" width="35"/>
-			<text font="SansSerifSmall" name="billable factor text">
-				Abrechnungsfaktor:
-			</text>
-			<text name="land cost text">
-				L$ pro qm:
-			</text>
-			<button label="Aktualisieren" label_selected="Aktualisieren" name="Refresh" tool_tip="Klicken Sie hier, um die obigen Informationen zu aktualisieren."/>
-			<button label="Übernehmen" label_selected="Übernehmen" name="Apply" tool_tip="Klicken Sie hier, um die obigen Änderungen zu übernehmen."/>
-			<button label="Region auswählen" label_selected="Region auswählen" left="136" name="Select Region" tool_tip="Die gesamte Region mit dem Landwerkzeug auswählen." width="130"/>
-			<button label="Automatisch speichern" label_selected="Automatisch speichern" left="136" name="Autosave now" tool_tip="gzipped-Status im Autosave-Verzeichnis speichern." width="130"/>
-		</panel>
-		<panel label="Objekte" name="objects">
-			<panel.string name="no_target">
-				(kein Ziel)
-			</panel.string>
-			<text name="Sim Name:" width="55">
-				Sim-Name:
-			</text>
-			<text name="region name">
-				Welsh
-			</text>
-			<check_box label="Skripts 
-deaktivieren" name="disable scripts" tool_tip="Skripts in dieser Region komplett abschalten"/>
-			<check_box label="Kollisionen 
-deaktivieren" name="disable collisions" tool_tip="Nicht-Avatar-Kollisionen in dieser Region komplett abschalten"/>
-			<check_box label="Physik deaktivieren" name="disable physics" tool_tip="Die Physik in dieser Region komplett abschalten"/>
-			<button label="Übernehmen" label_selected="Übernehmen" name="Apply" tool_tip="Klicken Sie hier, um die obigen Änderungen zu übernehmen."/>
-			<button label="Ziel festlegen" label_selected="Ziel festlegen" name="Set Target" tool_tip="Den Ziel-Avatar für das Löschen von Objekten auswählen."/>
-			<text name="target_avatar_name">
-				(kein Ziel)
-			</text>
-			<button label="Geskriptete Objekte des Ziels auf anderen Ländern löschen" label_selected="Geskriptete Objekte des Ziels auf anderen Ländern löschen" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Alle dem Ziel gehörenden geskripteten Objekte auf Land, das dem Ziel nicht gehört, löschen. Objekte (nicht kopierfähig) werden zurückgegeben."/>
-			<button label="Geskriptete Objekte des Ziels auf *allen* Ländern löschen" label_selected="Geskriptete Objekte des Ziels auf *allen* Ländern löschen" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Alle dem Ziel gehörenden geskripteten Objekte in dieser Region löschen. Objekte (nicht kopierfähig) werden zurückgegeben."/>
-			<button label="*ALLE* Objekte des Ziels löschen" label_selected="*ALLE* Objekte des Ziels löschen" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Alle dem Ziel gehörenden Objekte in dieser Region löschen. Objekte (nicht kopierfähig) werden zurückgegeben."/>
-			<button label="Top-Kollisionsobjekte" label_selected="Top-Kollisionsobjekte" name="Get Top Colliders" tool_tip="Zeigt eine Liste der Objekte mit den meisten Callbacks in der nahen Phase an." width="130"/>
-			<button label="Top-Skripts" label_selected="Top-Skripts" name="Get Top Scripts" tool_tip="Zeigt eine Liste der Objekte an, die die meiste Zeit über Skripts ausführen." width="130"/>
-			<button label="Scripting-Übersicht" label_selected="Scripting-Übersicht" name="Scripts digest" tool_tip="Zeigt eine Liste aller Skripts mit Häufigkeit an." width="130"/>
-		</panel>
-		<panel label="Anfrage" name="request">
-			<text name="Destination:">
-				Ziel:
-			</text>
-			<combo_box name="destination">
-				<combo_box.item label="Auswahl" name="item1"/>
-				<combo_box.item label="Avatar-Region" name="item2"/>
-			</combo_box>
-			<text name="Request:">
-				Anfrage:
-			</text>
-			<combo_box name="request">
-				<combo_box.item label="Kollisionsobjekte &lt;Schritte&gt;" name="item1"/>
-				<combo_box.item label="Skripts &lt;Zähler&gt;,&lt;Optionales Muster&gt;" name="item2"/>
-				<combo_box.item label="Objekte &lt;Muster&gt;" name="item3"/>
-				<combo_box.item label="lt;asset_id&gt; erstellen" name="item4"/>
-			</combo_box>
-			<text name="Parameter:">
-				Parameter:
-			</text>
-			<button label="Anfrage" label_selected="Anfrage" name="Make Request"/>
-		</panel>
-	</tab_container>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="godtools floater" title="GOTT-WERKZEUGE">
+	<tab_container name="GodTools Tabs">
+		<panel label="Raster" name="grid">
+			<button label="Alle Benutzer hinauswerfen" label_selected="Alle Benutzer hinauswerfen" name="Kick all users" width="175"/>
+			<button label="Sichtbarkeits-Cache dieser Regionskarte leeren" label_selected="Sichtbarkeits-Cache dieser Regionskarte leeren" name="Flush This Region&apos;s Map Visibility Caches" width="285"/>
+		</panel>
+		<panel label="Region" name="region">
+			<text name="Sim Name:" width="55">
+				Sim-Name:
+			</text>
+			<check_box label="Startbereich Einleitung" name="check prelude" tool_tip="Diese Region zu einem Startbereich machen."/>
+			<check_box label="Sonne fest" name="check fixed sun" tool_tip="Fixiert den Sonnenstand (wie in „Region/Grundstück“ &gt; „Terrain“."/>
+			<check_box height="32" label="Zuhause auf Teleport 
+zurücksetzen" name="check reset home" tool_tip="Wenn Einwohner wegteleportieren, ihr Zuhause auf Zielposition setzen."/>
+			<check_box bottom_delta="-32" label="Sichtbar" name="check visible" tool_tip="Diese Region für Nicht-Götter sichtbar machen."/>
+			<check_box label="Schaden" name="check damage" tool_tip="Schaden in dieser Region aktivieren."/>
+			<check_box label="Trafficüberwachung blockieren" name="block dwell" tool_tip="In dieser Region die Traffic-Berechnung abschalten."/>
+			<check_box label="Terraformen blockieren" name="block terraform" tool_tip="Das Terraformen von Land verbieten (Benutzen Sie dies um Leuten das Terraformen ihres Landes zu verbieten)"/>
+			<check_box label="Sandkasten" name="is sandbox" tool_tip="Sandkastenregion ein-/ausschalten."/>
+			<button label="Terrain formen" label_selected="Terrain formen" name="Bake Terrain" tool_tip="Das aktuelle Terrain als Standard speichern." width="118"/>
+			<button label="Terrain zurücksetzen" label_selected="Terrain zurücksetzen" name="Revert Terrain" tool_tip="Das aktuelle Terrain mit dem Standard ersetzen." width="118"/>
+			<button label="Terrain tauschen" label_selected="Terrain tauschen" name="Swap Terrain" tool_tip="Aktuelles Terrain gegen Standard austauschen." width="118"/>
+			<text name="estate id">
+				Grundstücks-ID:
+			</text>
+			<text name="parent id">
+				Parent ID:
+			</text>
+			<line_editor name="parentestate" tool_tip="Das übergeordnete Grundstück dieser Region"/>
+			<text name="Grid Pos: ">
+				Raster-Pos.:
+			</text>
+			<line_editor left_delta="110" name="gridposx" tool_tip="Die X-Rasterposition dieser Region" width="35"/>
+			<line_editor left_delta="45" name="gridposy" tool_tip="Die Y-Rasterposition dieser Region" width="35"/>
+			<text name="Redirect to Grid: ">
+				Auf Raster umleiten:
+			</text>
+			<line_editor left_delta="110" name="redirectx" width="35"/>
+			<line_editor left_delta="45" name="redirecty" width="35"/>
+			<text font="SansSerifSmall" name="billable factor text">
+				Abrechnungsfaktor:
+			</text>
+			<text name="land cost text">
+				L$ pro qm:
+			</text>
+			<button label="Aktualisieren" label_selected="Aktualisieren" name="Refresh" tool_tip="Klicken Sie hier, um die obigen Informationen zu aktualisieren."/>
+			<button label="Übernehmen" label_selected="Übernehmen" name="Apply" tool_tip="Klicken Sie hier, um die obigen Änderungen zu übernehmen."/>
+			<button label="Region auswählen" label_selected="Region auswählen" left="136" name="Select Region" tool_tip="Die gesamte Region mit dem Landwerkzeug auswählen." width="130"/>
+			<button label="Automatisch speichern" label_selected="Automatisch speichern" left="136" name="Autosave now" tool_tip="gzipped-Status im Autosave-Verzeichnis speichern." width="130"/>
+		</panel>
+		<panel label="Objekte" name="objects">
+			<panel.string name="no_target">
+				(kein Ziel)
+			</panel.string>
+			<text name="Sim Name:" width="55">
+				Sim-Name:
+			</text>
+			<text name="region name">
+				Welsh
+			</text>
+			<check_box label="Skripts 
+deaktivieren" name="disable scripts" tool_tip="Skripts in dieser Region komplett abschalten"/>
+			<check_box label="Kollisionen 
+deaktivieren" name="disable collisions" tool_tip="Nicht-Avatar-Kollisionen in dieser Region komplett abschalten"/>
+			<check_box label="Physik deaktivieren" name="disable physics" tool_tip="Die Physik in dieser Region komplett abschalten"/>
+			<button label="Übernehmen" label_selected="Übernehmen" name="Apply" tool_tip="Klicken Sie hier, um die obigen Änderungen zu übernehmen."/>
+			<button label="Ziel festlegen" label_selected="Ziel festlegen" name="Set Target" tool_tip="Den Ziel-Avatar für das Löschen von Objekten auswählen."/>
+			<text name="target_avatar_name">
+				(kein Ziel)
+			</text>
+			<button label="Geskriptete Objekte des Ziels auf anderen Ländern löschen" label_selected="Geskriptete Objekte des Ziels auf anderen Ländern löschen" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Alle dem Ziel gehörenden geskripteten Objekte auf Land, das dem Ziel nicht gehört, löschen. Objekte (nicht kopierfähig) werden zurückgegeben."/>
+			<button label="Geskriptete Objekte des Ziels auf *allen* Ländern löschen" label_selected="Geskriptete Objekte des Ziels auf *allen* Ländern löschen" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Alle dem Ziel gehörenden geskripteten Objekte in dieser Region löschen. Objekte (nicht kopierfähig) werden zurückgegeben."/>
+			<button label="*ALLE* Objekte des Ziels löschen" label_selected="*ALLE* Objekte des Ziels löschen" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Alle dem Ziel gehörenden Objekte in dieser Region löschen. Objekte (nicht kopierfähig) werden zurückgegeben."/>
+			<button label="Top-Kollisionsobjekte" label_selected="Top-Kollisionsobjekte" name="Get Top Colliders" tool_tip="Zeigt eine Liste der Objekte mit den meisten Callbacks in der nahen Phase an." width="130"/>
+			<button label="Top-Skripts" label_selected="Top-Skripts" name="Get Top Scripts" tool_tip="Zeigt eine Liste der Objekte an, die die meiste Zeit über Skripts ausführen." width="130"/>
+			<button label="Scripting-Übersicht" label_selected="Scripting-Übersicht" name="Scripts digest" tool_tip="Zeigt eine Liste aller Skripts mit Häufigkeit an." width="130"/>
+		</panel>
+		<panel label="Anfrage" name="request">
+			<text name="Destination:">
+				Ziel:
+			</text>
+			<combo_box name="destination">
+				<combo_box.item label="Auswahl" name="item1"/>
+				<combo_box.item label="Avatar-Region" name="item2"/>
+			</combo_box>
+			<text name="Request:">
+				Anfrage:
+			</text>
+			<combo_box name="request">
+				<combo_box.item label="Kollisionsobjekte &lt;Schritte&gt;" name="item1"/>
+				<combo_box.item label="Skripts &lt;Zähler&gt;,&lt;Optionales Muster&gt;" name="item2"/>
+				<combo_box.item label="Objekte &lt;Muster&gt;" name="item3"/>
+				<combo_box.item label="lt;asset_id&gt; erstellen" name="item4"/>
+			</combo_box>
+			<text name="Parameter:">
+				Parameter:
+			</text>
+			<button label="Anfrage" label_selected="Anfrage" name="Make Request"/>
+		</panel>
+	</tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml
index ba2269012fe..2936688254c 100644
--- a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml
@@ -1,28 +1,28 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Hardware Settings Floater" title="HARDWARE-EINSTELLUNGEN">
-	<text name="Filtering:">
-		Filtern:
-	</text>
-	<check_box label="Anisotropische Filterung (langsamer, wenn aktiviert)" name="ani"/>
-	<text name="Antialiasing:">
-		Antialiasing:
-	</text>
-	<combo_box label="Antialiasing" name="fsaa">
-		<combo_box.item label="Deaktiviert" name="FSAADisabled"/>
-		<combo_box.item label="2x" name="2x"/>
-		<combo_box.item label="4x" name="4x"/>
-		<combo_box.item label="8x" name="8x"/>
-		<combo_box.item label="16x" name="16x"/>
-	</combo_box>
-	<spinner label="Gamma:" name="gamma"/>
-	<text name="(brightness, lower is brighter)">
-		(0 = Standard-Helligkeit, weniger = heller)
-	</text>
-	<text name="Enable VBO:">
-		VBO aktivieren:
-	</text>
-	<check_box label="OpenGL Vertex-Buffer-Objekte aktivieren" name="vbo" tool_tip="Wenn Sie über moderne Grafikhardware verfügen, können Sie durch Aktivieren dieser Option die Geschwindigkeit verbessern.  Bei alter Hardware sind die VBO oft schlecht implementiert, was zu Abstürzen führen kann, wenn diese Option aktiviert ist."/>
-	<slider label="Texturspeicher (MB):" name="GrapicsCardTextureMemory" tool_tip="Speicherplatz, der für Texturen zur Verfügung steht. In der Regel handelt es sich um Grafikkartenspeicher. Ein kleinerer Wert kann die Geschwindigkeit erhöhen, aber auch zu Texturunschärfen führen."/>
-	<spinner label="Nebeldistanzverhältnis:" name="fog"/>
-	<button label="OK" label_selected="OK" name="OK"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Hardware Settings Floater" title="HARDWARE-EINSTELLUNGEN">
+	<text name="Filtering:">
+		Filtern:
+	</text>
+	<check_box label="Anisotropische Filterung (langsamer, wenn aktiviert)" name="ani"/>
+	<text name="Antialiasing:">
+		Antialiasing:
+	</text>
+	<combo_box label="Antialiasing" name="fsaa">
+		<combo_box.item label="Deaktiviert" name="FSAADisabled"/>
+		<combo_box.item label="2x" name="2x"/>
+		<combo_box.item label="4x" name="4x"/>
+		<combo_box.item label="8x" name="8x"/>
+		<combo_box.item label="16x" name="16x"/>
+	</combo_box>
+	<spinner label="Gamma:" name="gamma"/>
+	<text name="(brightness, lower is brighter)">
+		(0 = Standard-Helligkeit, weniger = heller)
+	</text>
+	<text name="Enable VBO:">
+		VBO aktivieren:
+	</text>
+	<check_box label="OpenGL Vertex-Buffer-Objekte aktivieren" name="vbo" tool_tip="Wenn Sie über moderne Grafikhardware verfügen, können Sie durch Aktivieren dieser Option die Geschwindigkeit verbessern.  Bei alter Hardware sind die VBO oft schlecht implementiert, was zu Abstürzen führen kann, wenn diese Option aktiviert ist."/>
+	<slider label="Texturspeicher (MB):" name="GrapicsCardTextureMemory" tool_tip="Speicherplatz, der für Texturen zur Verfügung steht. In der Regel handelt es sich um Grafikkartenspeicher. Ein kleinerer Wert kann die Geschwindigkeit erhöhen, aber auch zu Texturunschärfen führen."/>
+	<spinner label="Nebeldistanzverhältnis:" name="fog"/>
+	<button label="OK" label_selected="OK" name="OK"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_image_preview.xml b/indra/newview/skins/default/xui/de/floater_image_preview.xml
index 80c71d41f77..7f66234dab3 100644
--- a/indra/newview/skins/default/xui/de/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/de/floater_image_preview.xml
@@ -1,32 +1,32 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Image Preview" title="">
-	<text name="name_label">
-		Name:
-	</text>
-	<text name="description_label">
-		Beschreibung:
-	</text>
-	<text name="preview_label">
-		Bildvorschau als:
-	</text>
-	<combo_box label="Kleidungstyp" name="clothing_type_combo">
-		<combo_box.item label="Bild" name="Image"/>
-		<combo_box.item label="Haare" name="Hair"/>
-		<combo_box.item label="Kopf (Frau)" name="FemaleHead"/>
-		<combo_box.item label="Oberkörper (Frau)" name="FemaleUpperBody"/>
-		<combo_box.item label="Unterkörper (Frau)" name="FemaleLowerBody"/>
-		<combo_box.item label="Kopf (Mann)" name="MaleHead"/>
-		<combo_box.item label="Oberkörper (Mann)" name="MaleUpperBody"/>
-		<combo_box.item label="Unterkörper (Mann)" name="MaleLowerBody"/>
-		<combo_box.item label="Rock" name="Skirt"/>
-		<combo_box.item label="Geformtes Primitiv" name="SculptedPrim"/>
-	</combo_box>
-	<text name="bad_image_text">
-		Bild kann nicht gelesen werden.
-
-Speichern Sie das Bild als 24 Bit Targa (.tga).
-	</text>
-	<check_box label="Verlustfreie Komprimierung verwenden" name="lossless_check"/>
-	<button label="Abbrechen" name="cancel_btn"/>
-	<button label="Hochladen ([AMOUNT] L$)" name="ok_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Image Preview" title="">
+	<text name="name_label">
+		Name:
+	</text>
+	<text name="description_label">
+		Beschreibung:
+	</text>
+	<text name="preview_label">
+		Bildvorschau als:
+	</text>
+	<combo_box label="Kleidungstyp" name="clothing_type_combo">
+		<combo_box.item label="Bild" name="Image"/>
+		<combo_box.item label="Haare" name="Hair"/>
+		<combo_box.item label="Kopf (Frau)" name="FemaleHead"/>
+		<combo_box.item label="Oberkörper (Frau)" name="FemaleUpperBody"/>
+		<combo_box.item label="Unterkörper (Frau)" name="FemaleLowerBody"/>
+		<combo_box.item label="Kopf (Mann)" name="MaleHead"/>
+		<combo_box.item label="Oberkörper (Mann)" name="MaleUpperBody"/>
+		<combo_box.item label="Unterkörper (Mann)" name="MaleLowerBody"/>
+		<combo_box.item label="Rock" name="Skirt"/>
+		<combo_box.item label="Geformtes Primitiv" name="SculptedPrim"/>
+	</combo_box>
+	<text name="bad_image_text">
+		Bild kann nicht gelesen werden.
+
+Speichern Sie das Bild als 24 Bit Targa (.tga).
+	</text>
+	<check_box label="Verlustfreie Komprimierung verwenden" name="lossless_check"/>
+	<button label="Abbrechen" name="cancel_btn"/>
+	<button label="Hochladen ([AMOUNT] L$)" name="ok_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
index b5e8ed0b6fe..89771a52893 100644
--- a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
@@ -1,67 +1,67 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="INVENTAROBJEKT-EIGENSCHAFTEN">
-	<floater.string name="unknown">
-		(unbekannt)
-	</floater.string>
-	<floater.string name="public">
-		(öffentlich)
-	</floater.string>
-	<floater.string name="you_can">
-		Sie können:
-	</floater.string>
-	<floater.string name="owner_can">
-		Eigentümer kann:
-	</floater.string>
-	<text name="LabelItemNameTitle">
-		Name:
-	</text>
-	<text name="LabelItemDescTitle">
-		Beschreibung:
-	</text>
-	<text name="LabelCreatorTitle">
-		Ersteller:
-	</text>
-	<text name="LabelCreatorName">
-		Nicole Linden
-	</text>
-	<button label="Profil..." label_selected="" name="BtnCreator"/>
-	<text name="LabelOwnerTitle">
-		Eigentümer:
-	</text>
-	<text name="LabelOwnerName">
-		Thrax Linden
-	</text>
-	<button label="Profil..." label_selected="" name="BtnOwner"/>
-	<text name="LabelAcquiredTitle">
-		Erworben:
-	</text>
-	<text name="LabelAcquiredDate">
-		Mittwoch, 24. Mai 2006, 12:50:46
-	</text>
-	<text name="OwnerLabel">
-		Sie:
-	</text>
-	<check_box label="Bearbeiten" name="CheckOwnerModify"/>
-	<check_box label="Kopieren" left_delta="85" name="CheckOwnerCopy"/>
-	<check_box label="Wiederverkaufen" name="CheckOwnerTransfer"/>
-	<text name="AnyoneLabel">
-		Jeder:
-	</text>
-	<check_box label="Kopieren" name="CheckEveryoneCopy"/>
-	<text name="GroupLabel">
-		Gruppe:
-	</text>
-	<check_box label="Teilen" name="CheckShareWithGroup"/>
-	<text name="NextOwnerLabel" width="150">
-		Nächster Eigentümer:
-	</text>
-	<check_box label="Bearbeiten" name="CheckNextOwnerModify"/>
-	<check_box label="Kopieren" left_delta="85" name="CheckNextOwnerCopy"/>
-	<check_box label="Wiederverkaufen" name="CheckNextOwnerTransfer"/>
-	<check_box label="Zum Verkauf" name="CheckPurchase"/>
-	<combo_box name="combobox sale copy">
-		<combo_box.item label="Kopieren" name="Copy"/>
-		<combo_box.item label="Original" name="Original"/>
-	</combo_box>
-	<spinner label="Preis: L$" name="Edit Cost"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="item properties" title="INVENTAROBJEKT-EIGENSCHAFTEN">
+	<floater.string name="unknown">
+		(unbekannt)
+	</floater.string>
+	<floater.string name="public">
+		(öffentlich)
+	</floater.string>
+	<floater.string name="you_can">
+		Sie können:
+	</floater.string>
+	<floater.string name="owner_can">
+		Eigentümer kann:
+	</floater.string>
+	<text name="LabelItemNameTitle">
+		Name:
+	</text>
+	<text name="LabelItemDescTitle">
+		Beschreibung:
+	</text>
+	<text name="LabelCreatorTitle">
+		Ersteller:
+	</text>
+	<text name="LabelCreatorName">
+		Nicole Linden
+	</text>
+	<button label="Profil..." label_selected="" name="BtnCreator"/>
+	<text name="LabelOwnerTitle">
+		Eigentümer:
+	</text>
+	<text name="LabelOwnerName">
+		Thrax Linden
+	</text>
+	<button label="Profil..." label_selected="" name="BtnOwner"/>
+	<text name="LabelAcquiredTitle">
+		Erworben:
+	</text>
+	<text name="LabelAcquiredDate">
+		Mittwoch, 24. Mai 2006, 12:50:46
+	</text>
+	<text name="OwnerLabel">
+		Sie:
+	</text>
+	<check_box label="Bearbeiten" name="CheckOwnerModify"/>
+	<check_box label="Kopieren" left_delta="85" name="CheckOwnerCopy"/>
+	<check_box label="Wiederverkaufen" name="CheckOwnerTransfer"/>
+	<text name="AnyoneLabel">
+		Jeder:
+	</text>
+	<check_box label="Kopieren" name="CheckEveryoneCopy"/>
+	<text name="GroupLabel">
+		Gruppe:
+	</text>
+	<check_box label="Teilen" name="CheckShareWithGroup"/>
+	<text name="NextOwnerLabel" width="150">
+		Nächster Eigentümer:
+	</text>
+	<check_box label="Bearbeiten" name="CheckNextOwnerModify"/>
+	<check_box label="Kopieren" left_delta="85" name="CheckNextOwnerCopy"/>
+	<check_box label="Wiederverkaufen" name="CheckNextOwnerTransfer"/>
+	<check_box label="Zum Verkauf" name="CheckPurchase"/>
+	<combo_box name="combobox sale copy">
+		<combo_box.item label="Kopieren" name="Copy"/>
+		<combo_box.item label="Original" name="Original"/>
+	</combo_box>
+	<spinner label="Preis: L$" name="Edit Cost"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_land_holdings.xml b/indra/newview/skins/default/xui/de/floater_land_holdings.xml
index f258dc2f5d6..c612f21a5bb 100644
--- a/indra/newview/skins/default/xui/de/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/de/floater_land_holdings.xml
@@ -1,40 +1,40 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="land holdings floater" title="MEIN LAND">
-	<scroll_list name="parcel list">
-		<column label="Parzelle" name="name"/>
-		<column label="Region" name="location"/>
-		<column label="Typ" name="type"/>
-		<column label="Gebiet" name="area"/>
-		<column label="" name="hidden"/>
-	</scroll_list>
-	<button label="Teleportieren" label_selected="Teleportieren" name="Teleport" tool_tip="Zum Mittelpunkt dieses Landes teleportieren."/>
-	<button label="Karte" label_selected="Karte" name="Show on Map" tool_tip="Dieses Land auf der Weltkarte anzeigen."/>
-	<text name="contrib_label">
-		Beiträge zu Ihren Gruppen:
-	</text>
-	<scroll_list name="grant list">
-		<column label="Gruppe" name="group"/>
-		<column label="Gebiet" name="area"/>
-	</scroll_list>
-	<text name="allowed_label">
-		Zulässiger Landbesitz bei aktuellem Zahlungsplan:
-	</text>
-	<text name="allowed_text">
-		[AREA] qm
-	</text>
-	<text name="current_label">
-		Aktueller Landbesitz:
-	</text>
-	<text name="current_text">
-		[AREA] qm
-	</text>
-	<text name="available_label">
-		Für Landkäufe verfügbar:
-	</text>
-	<text name="available_text">
-		[AREA] qm
-	</text>
-	<string name="area_string">
-		[AREA] qm
-	</string>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="land holdings floater" title="MEIN LAND">
+	<scroll_list name="parcel list">
+		<column label="Parzelle" name="name"/>
+		<column label="Region" name="location"/>
+		<column label="Typ" name="type"/>
+		<column label="Gebiet" name="area"/>
+		<column label="" name="hidden"/>
+	</scroll_list>
+	<button label="Teleportieren" label_selected="Teleportieren" name="Teleport" tool_tip="Zum Mittelpunkt dieses Landes teleportieren."/>
+	<button label="Karte" label_selected="Karte" name="Show on Map" tool_tip="Dieses Land auf der Weltkarte anzeigen."/>
+	<text name="contrib_label">
+		Beiträge zu Ihren Gruppen:
+	</text>
+	<scroll_list name="grant list">
+		<column label="Gruppe" name="group"/>
+		<column label="Gebiet" name="area"/>
+	</scroll_list>
+	<text name="allowed_label">
+		Zulässiger Landbesitz bei aktuellem Zahlungsplan:
+	</text>
+	<text name="allowed_text">
+		[AREA] qm
+	</text>
+	<text name="current_label">
+		Aktueller Landbesitz:
+	</text>
+	<text name="current_text">
+		[AREA] qm
+	</text>
+	<text name="available_label">
+		Für Landkäufe verfügbar:
+	</text>
+	<text name="available_text">
+		[AREA] qm
+	</text>
+	<string name="area_string">
+		[AREA] qm
+	</string>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml
index 947a435f8ad..52e6dccabac 100644
--- a/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml
@@ -1,15 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script ed float" title="SKRIPT: NEUES SKRIPT">
-	<floater.string name="not_allowed">
-		Dieses Skript kann nicht angezeigt oder bearbeitet werden, da als Berechtigung &quot;kein kopieren&quot; festgelegt wurde. Um ein Skript innerhalb eines Objektes anzuzeigen oder zu bearbeiten, benötigen Sie die vollständige Berechtigung.
-	</floater.string>
-	<floater.string name="script_running">
-		Läuft
-	</floater.string>
-	<floater.string name="Title">
-		Skript: [NAME]
-	</floater.string>
-	<button label="Zurücksetzen" label_selected="Zurücksetzen" name="Reset"/>
-	<check_box initial_value="true" label="Läuft" name="running"/>
-	<check_box initial_value="true" label="Mono" name="mono"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="SKRIPT: NEUES SKRIPT">
+	<floater.string name="not_allowed">
+		Dieses Skript kann nicht angezeigt oder bearbeitet werden, da als Berechtigung &quot;kein kopieren&quot; festgelegt wurde. Um ein Skript innerhalb eines Objektes anzuzeigen oder zu bearbeiten, benötigen Sie die vollständige Berechtigung.
+	</floater.string>
+	<floater.string name="script_running">
+		Läuft
+	</floater.string>
+	<floater.string name="Title">
+		Skript: [NAME]
+	</floater.string>
+	<button label="Zurücksetzen" label_selected="Zurücksetzen" name="Reset"/>
+	<check_box initial_value="true" label="Läuft" name="running"/>
+	<check_box initial_value="true" label="Mono" name="mono"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_map.xml b/indra/newview/skins/default/xui/de/floater_map.xml
index 73737846734..b985d1d1879 100644
--- a/indra/newview/skins/default/xui/de/floater_map.xml
+++ b/indra/newview/skins/default/xui/de/floater_map.xml
@@ -1,54 +1,54 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map">
-	<floater.string name="mini_map_north">
-		N
-	</floater.string>
-	<floater.string name="mini_map_east">
-		O
-	</floater.string>
-	<floater.string name="mini_map_west">
-		W
-	</floater.string>
-	<floater.string name="mini_map_south">
-		S
-	</floater.string>
-	<floater.string name="mini_map_southeast">
-		SO
-	</floater.string>
-	<floater.string name="mini_map_northeast">
-		NO
-	</floater.string>
-	<floater.string name="mini_map_southwest">
-		SW
-	</floater.string>
-	<floater.string name="mini_map_northwest">
-		NW
-	</floater.string>
-	<floater.string name="ToolTipMsg">
-		[AGENT][REGION](Karte mit Doppelklick öffnen)
-	</floater.string>
-	<text label="N" name="floater_map_north" text="N">
-		N
-	</text>
-	<text label="O" name="floater_map_east" text="O">
-		O
-	</text>
-	<text label="W" name="floater_map_west" text="W">
-		W
-	</text>
-	<text label="S" name="floater_map_south" text="S">
-		S
-	</text>
-	<text label="SO" name="floater_map_southeast" text="SO">
-		SO
-	</text>
-	<text label="NO" name="floater_map_northeast" text="NO">
-		NO
-	</text>
-	<text label="SW" name="floater_map_southwest" text="SW">
-		SW
-	</text>
-	<text label="NW" name="floater_map_northwest" text="NW">
-		NW
-	</text>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Map">
+	<floater.string name="mini_map_north">
+		N
+	</floater.string>
+	<floater.string name="mini_map_east">
+		O
+	</floater.string>
+	<floater.string name="mini_map_west">
+		W
+	</floater.string>
+	<floater.string name="mini_map_south">
+		S
+	</floater.string>
+	<floater.string name="mini_map_southeast">
+		SO
+	</floater.string>
+	<floater.string name="mini_map_northeast">
+		NO
+	</floater.string>
+	<floater.string name="mini_map_southwest">
+		SW
+	</floater.string>
+	<floater.string name="mini_map_northwest">
+		NW
+	</floater.string>
+	<floater.string name="ToolTipMsg">
+		[AGENT][REGION](Karte mit Doppelklick öffnen)
+	</floater.string>
+	<text label="N" name="floater_map_north" text="N">
+		N
+	</text>
+	<text label="O" name="floater_map_east" text="O">
+		O
+	</text>
+	<text label="W" name="floater_map_west" text="W">
+		W
+	</text>
+	<text label="S" name="floater_map_south" text="S">
+		S
+	</text>
+	<text label="SO" name="floater_map_southeast" text="SO">
+		SO
+	</text>
+	<text label="NO" name="floater_map_northeast" text="NO">
+		NO
+	</text>
+	<text label="SW" name="floater_map_southwest" text="SW">
+		SW
+	</text>
+	<text label="NW" name="floater_map_northwest" text="NW">
+		NW
+	</text>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_media_browser.xml b/indra/newview/skins/default/xui/de/floater_media_browser.xml
index 21bf7aa5630..1c580aa916d 100644
--- a/indra/newview/skins/default/xui/de/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/de/floater_media_browser.xml
@@ -1,30 +1,30 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="MEDIENBROWSER">
-	<floater.string name="home_page_url">
-		http://www.secondlife.com
-	</floater.string>
-	<floater.string name="support_page_url">
-		http://support.secondlife.com
-	</floater.string>
-	<layout_stack name="stack1">
-		<layout_panel name="nav_controls">
-			<button label="Zurück" name="back"/>
-			<button label="Weiter" name="forward"/>
-			<button label="Neu laden" name="reload"/>
-			<button label="Los" name="go"/>
-		</layout_panel>
-		<layout_panel name="time_controls">
-			<button label="zurückspulen" name="rewind"/>
-			<button label="anhalten" name="stop"/>
-			<button label="vorwärts" name="seek"/>
-		</layout_panel>
-		<layout_panel name="parcel_owner_controls">
-			<button label="Aktuelle URL an Parzelle senden" name="assign"/>
-		</layout_panel>
-		<layout_panel name="external_controls">
-			<button label="In meinem Browser öffnen" name="open_browser"/>
-			<check_box label="Immer in meinem Browser öffnen" name="open_always"/>
-			<button label="Schließen" name="close"/>
-		</layout_panel>
-	</layout_stack>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="MEDIENBROWSER">
+	<floater.string name="home_page_url">
+		http://www.secondlife.com
+	</floater.string>
+	<floater.string name="support_page_url">
+		http://support.secondlife.com
+	</floater.string>
+	<layout_stack name="stack1">
+		<layout_panel name="nav_controls">
+			<button label="Zurück" name="back"/>
+			<button label="Weiter" name="forward"/>
+			<button label="Neu laden" name="reload"/>
+			<button label="Los" name="go"/>
+		</layout_panel>
+		<layout_panel name="time_controls">
+			<button label="zurückspulen" name="rewind"/>
+			<button label="anhalten" name="stop"/>
+			<button label="vorwärts" name="seek"/>
+		</layout_panel>
+		<layout_panel name="parcel_owner_controls">
+			<button label="Aktuelle URL an Parzelle senden" name="assign"/>
+		</layout_panel>
+		<layout_panel name="external_controls">
+			<button label="In meinem Browser öffnen" name="open_browser"/>
+			<check_box label="Immer in meinem Browser öffnen" name="open_always"/>
+			<button label="Schließen" name="close"/>
+		</layout_panel>
+	</layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_mem_leaking.xml b/indra/newview/skins/default/xui/de/floater_mem_leaking.xml
index 72210aa750b..bb40d0b85c0 100644
--- a/indra/newview/skins/default/xui/de/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/de/floater_mem_leaking.xml
@@ -1,18 +1,18 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="MemLeak" title="Speicherverlust simulieren">
-	<spinner label="Verlustgeschwindigkeit (Bytes pro Frame):" name="leak_speed"/>
-	<spinner label="Max. Speicherverlust (MB):" name="max_leak"/>
-	<text name="total_leaked_label">
-		Aktueller Speicherverlust:[SIZE] KB
-	</text>
-	<text name="note_label_1">
-		[NOTE1]
-	</text>
-	<text name="note_label_2">
-		[NOTE2]
-	</text>
-	<button label="Start" name="start_btn"/>
-	<button label="Stopp" name="stop_btn"/>
-	<button label="Freigeben" name="release_btn"/>
-	<button label="Schließen" name="close_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="MemLeak" title="Speicherverlust simulieren">
+	<spinner label="Verlustgeschwindigkeit (Bytes pro Frame):" name="leak_speed"/>
+	<spinner label="Max. Speicherverlust (MB):" name="max_leak"/>
+	<text name="total_leaked_label">
+		Aktueller Speicherverlust:[SIZE] KB
+	</text>
+	<text name="note_label_1">
+		[NOTE1]
+	</text>
+	<text name="note_label_2">
+		[NOTE2]
+	</text>
+	<button label="Start" name="start_btn"/>
+	<button label="Stopp" name="stop_btn"/>
+	<button label="Freigeben" name="release_btn"/>
+	<button label="Schließen" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_moveview.xml b/indra/newview/skins/default/xui/de/floater_moveview.xml
index af133b6bd79..03930c8ed6b 100644
--- a/indra/newview/skins/default/xui/de/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/de/floater_moveview.xml
@@ -1,35 +1,35 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move_floater">
-	<string name="walk_forward_tooltip">
-		Vorwärts gehen (Nach-oben-Pfeil oder W drücken)
-	</string>
-	<string name="walk_back_tooltip">
-		Rückwärts gehen (Nach-Unten-Pfeil oder S drücken)
-	</string>
-	<string name="run_forward_tooltip">
-		Vorwärts rennen (Nach-oben-Pfeil oder W drücken)
-	</string>
-	<string name="run_back_tooltip">
-		Rückwärts rennen (Nach-Unten-Pfeil oder S drücken)
-	</string>
-	<string name="fly_forward_tooltip">
-		Vorwärts fliegen (Nach-oben-Pfeil oder W drücken)
-	</string>
-	<string name="fly_back_tooltip">
-		Rückwärts fliegen (Nach-Unten-Pfeil oder S drücken)
-	</string>
-	<panel name="panel_actions">
-		<button label="" label_selected="" name="turn left btn" tool_tip="Nach links (Links-Pfeil oder A drücken)"/>
-		<button label="" label_selected="" name="turn right btn" tool_tip="Nach rechts (Rechts-Pfeil oder D drücken)"/>
-		<button label="" label_selected="" name="move up btn" tool_tip="Nach oben fliegen, „E&quot; drücken"/>
-		<button label="" label_selected="" name="move down btn" tool_tip="Nach unten fliegen, „C&quot; drücken"/>
-		<joystick_turn name="forward btn" tool_tip="Vorwärts gehen (Nach-oben-Pfeil oder W drücken)"/>
-		<joystick_turn name="backward btn" tool_tip="Rückwärts gehen (Nach-Unten-Pfeil oder S drücken)"/>
-	</panel>
-	<panel name="panel_modes">
-		<button label="" name="mode_walk_btn" tool_tip="Gehen"/>
-		<button label="" name="mode_run_btn" tool_tip="Rennen"/>
-		<button label="" name="mode_fly_btn" tool_tip="Fliegen"/>
-		<button label="Landen" name="stop_fly_btn" tool_tip="Landen"/>
-	</panel>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="move_floater">
+	<string name="walk_forward_tooltip">
+		Vorwärts gehen (Nach-oben-Pfeil oder W drücken)
+	</string>
+	<string name="walk_back_tooltip">
+		Rückwärts gehen (Nach-Unten-Pfeil oder S drücken)
+	</string>
+	<string name="run_forward_tooltip">
+		Vorwärts rennen (Nach-oben-Pfeil oder W drücken)
+	</string>
+	<string name="run_back_tooltip">
+		Rückwärts rennen (Nach-Unten-Pfeil oder S drücken)
+	</string>
+	<string name="fly_forward_tooltip">
+		Vorwärts fliegen (Nach-oben-Pfeil oder W drücken)
+	</string>
+	<string name="fly_back_tooltip">
+		Rückwärts fliegen (Nach-Unten-Pfeil oder S drücken)
+	</string>
+	<panel name="panel_actions">
+		<button label="" label_selected="" name="turn left btn" tool_tip="Nach links (Links-Pfeil oder A drücken)"/>
+		<button label="" label_selected="" name="turn right btn" tool_tip="Nach rechts (Rechts-Pfeil oder D drücken)"/>
+		<button label="" label_selected="" name="move up btn" tool_tip="Nach oben fliegen, „E&quot; drücken"/>
+		<button label="" label_selected="" name="move down btn" tool_tip="Nach unten fliegen, „C&quot; drücken"/>
+		<joystick_turn name="forward btn" tool_tip="Vorwärts gehen (Nach-oben-Pfeil oder W drücken)"/>
+		<joystick_turn name="backward btn" tool_tip="Rückwärts gehen (Nach-Unten-Pfeil oder S drücken)"/>
+	</panel>
+	<panel name="panel_modes">
+		<button label="" name="mode_walk_btn" tool_tip="Gehen"/>
+		<button label="" name="mode_run_btn" tool_tip="Rennen"/>
+		<button label="" name="mode_fly_btn" tool_tip="Fliegen"/>
+		<button label="Landen" name="stop_fly_btn" tool_tip="Landen"/>
+	</panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_pay.xml b/indra/newview/skins/default/xui/de/floater_pay.xml
index c224d85ac19..ad7f4a94ab8 100644
--- a/indra/newview/skins/default/xui/de/floater_pay.xml
+++ b/indra/newview/skins/default/xui/de/floater_pay.xml
@@ -1,19 +1,19 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Give Money" title="">
-	<text name="payee_label" width="130">
-		Zahlen:
-	</text>
-	<icon name="icon_person" tool_tip="Person"/>
-	<text left="130" name="payee_name">
-		[FIRST] [LAST]
-	</text>
-	<button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
-	<button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
-	<button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
-	<button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
-	<text name="amount text">
-		Oder Betrag auswählen:
-	</text>
-	<button label="Zahlen" label_selected="Zahlen" name="pay btn"/>
-	<button label="Abbrechen" label_selected="Abbrechen" name="cancel btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Give Money" title="">
+	<text name="payee_label" width="130">
+		Zahlen:
+	</text>
+	<icon name="icon_person" tool_tip="Person"/>
+	<text left="130" name="payee_name">
+		[FIRST] [LAST]
+	</text>
+	<button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
+	<button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
+	<button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
+	<button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
+	<text name="amount text">
+		Oder Betrag auswählen:
+	</text>
+	<button label="Zahlen" label_selected="Zahlen" name="pay btn"/>
+	<button label="Abbrechen" label_selected="Abbrechen" name="cancel btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_pay_object.xml b/indra/newview/skins/default/xui/de/floater_pay_object.xml
index 32a026f7e89..1bc721aabfd 100644
--- a/indra/newview/skins/default/xui/de/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/de/floater_pay_object.xml
@@ -1,29 +1,29 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Give Money" title="">
-	<string name="payee_group" width="105">
-		Gruppe bezahlen:
-	</string>
-	<string name="payee_resident" width="118">
-		Einwohner bezahlen:
-	</string>
-	<icon name="icon_person" tool_tip="Person"/>
-	<text left="128" name="payee_name" width="168">
-		[FIRST] [LAST]
-	</text>
-	<text halign="left" name="object_name_label">
-		Über Objekt:
-	</text>
-	<icon name="icon_object" tool_tip="Objekte"/>
-	<text left="105" name="object_name_text">
-		...
-	</text>
-	<button label="1 L$" label_selected="1 L$" left="105" name="fastpay 1"/>
-	<button label="5 L$" label_selected="5 L$" left="190" name="fastpay 5"/>
-	<button label="10 L$" label_selected="10 L$" left="105" name="fastpay 10"/>
-	<button label="20 L$" label_selected="20 L$" left="190" name="fastpay 20"/>
-	<text name="amount text">
-		Oder Betrag auswählen:
-	</text>
-	<button label="Zahlen" label_selected="Zahlen" name="pay btn"/>
-	<button label="Abbrechen" label_selected="Abbrechen" name="cancel btn" width="76"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Give Money" title="">
+	<string name="payee_group" width="105">
+		Gruppe bezahlen:
+	</string>
+	<string name="payee_resident" width="118">
+		Einwohner bezahlen:
+	</string>
+	<icon name="icon_person" tool_tip="Person"/>
+	<text left="128" name="payee_name" width="168">
+		[FIRST] [LAST]
+	</text>
+	<text halign="left" name="object_name_label">
+		Über Objekt:
+	</text>
+	<icon name="icon_object" tool_tip="Objekte"/>
+	<text left="105" name="object_name_text">
+		...
+	</text>
+	<button label="1 L$" label_selected="1 L$" left="105" name="fastpay 1"/>
+	<button label="5 L$" label_selected="5 L$" left="190" name="fastpay 5"/>
+	<button label="10 L$" label_selected="10 L$" left="105" name="fastpay 10"/>
+	<button label="20 L$" label_selected="20 L$" left="190" name="fastpay 20"/>
+	<text name="amount text">
+		Oder Betrag auswählen:
+	</text>
+	<button label="Zahlen" label_selected="Zahlen" name="pay btn"/>
+	<button label="Abbrechen" label_selected="Abbrechen" name="cancel btn" width="76"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_animation.xml b/indra/newview/skins/default/xui/de/floater_preview_animation.xml
index c167427da91..ea2e6436016 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_animation.xml
@@ -1,12 +1,12 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview_anim">
-	<floater.string name="Title">
-		Animation: [NAME]
-	</floater.string>
-	<text name="desc txt">
-		Beschreibung:
-	</text>
-	<line_editor left="98" name="desc" width="189"/>
-	<button label="In Welt abspielen" label_selected="Stopp" name="Anim play btn" tool_tip="Gibt diese Animation so wieder, dass andere sie sehen können." width="116"/>
-	<button label="Lokal wiedergeben" label_selected="Stopp" left="171" name="Anim audition btn" tool_tip="Gibt diese Animation so wieder, dass nur Sie sie sehen." width="116"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_anim">
+	<floater.string name="Title">
+		Animation: [NAME]
+	</floater.string>
+	<text name="desc txt">
+		Beschreibung:
+	</text>
+	<line_editor left="98" name="desc" width="189"/>
+	<button label="In Welt abspielen" label_selected="Stopp" name="Anim play btn" tool_tip="Gibt diese Animation so wieder, dass andere sie sehen können." width="116"/>
+	<button label="Lokal wiedergeben" label_selected="Stopp" left="171" name="Anim audition btn" tool_tip="Gibt diese Animation so wieder, dass nur Sie sie sehen." width="116"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_classified.xml b/indra/newview/skins/default/xui/de/floater_preview_classified.xml
index e946f08b141..10f78207ebf 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_classified.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_classified.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="classified_preview" title="VERTRAULICHE INFORMATIONEN">
-	<floater.string name="Title">
-		Anzeige: [NAME]
-	</floater.string>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="classified_preview" title="VERTRAULICHE INFORMATIONEN">
+	<floater.string name="Title">
+		Anzeige: [NAME]
+	</floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_event.xml b/indra/newview/skins/default/xui/de/floater_preview_event.xml
index fffcf7c1cf5..44bccc8a06c 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_event.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_event.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="event_preview" title="EVENT-INFORMATIONEN">
-	<floater.string name="Title">
-		Veranstaltung: [NAME]
-	</floater.string>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="event_preview" title="EVENT-INFORMATIONEN">
+	<floater.string name="Title">
+		Veranstaltung: [NAME]
+	</floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture_info.xml
index 9fbe8d869e6..3b86f4b3def 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_gesture_info.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_gesture_info.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Gesture" title="Gesten-Tastaturbefehl"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="Gesten-Tastaturbefehl"/>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture_steps.xml
index 9fbe8d869e6..3b86f4b3def 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_gesture_steps.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_gesture_steps.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Gesture" title="Gesten-Tastaturbefehl"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="Gesten-Tastaturbefehl"/>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_notecard.xml b/indra/newview/skins/default/xui/de/floater_preview_notecard.xml
index 1887433b617..a02a58ee0e2 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_notecard.xml
@@ -1,22 +1,22 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview notecard" title="HINWEIS:">
-	<floater.string name="no_object">
-		Es wurde kein Objekt gefunden, das diese Notiz enthält.
-	</floater.string>
-	<floater.string name="not_allowed">
-		Ihnen fehlt die Berechtigung zur Anzeige dieser Notizkarte.
-	</floater.string>
-	<floater.string name="Title">
-		Notizkarte: [NAME]
-	</floater.string>
-	<floater.string label="Speichern" label_selected="Speichern" name="Save">
-		Speichern
-	</floater.string>
-	<text name="desc txt">
-		Beschreibung:
-	</text>
-	<text_editor name="Notecard Editor">
-		Wird geladen...
-	</text_editor>
-	<button label="Speichern" label_selected="Speichern" name="Save"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview notecard" title="HINWEIS:">
+	<floater.string name="no_object">
+		Es wurde kein Objekt gefunden, das diese Notiz enthält.
+	</floater.string>
+	<floater.string name="not_allowed">
+		Ihnen fehlt die Berechtigung zur Anzeige dieser Notizkarte.
+	</floater.string>
+	<floater.string name="Title">
+		Notizkarte: [NAME]
+	</floater.string>
+	<floater.string label="Speichern" label_selected="Speichern" name="Save">
+		Speichern
+	</floater.string>
+	<text name="desc txt">
+		Beschreibung:
+	</text>
+	<text_editor name="Notecard Editor">
+		Wird geladen...
+	</text_editor>
+	<button label="Speichern" label_selected="Speichern" name="Save"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_sound.xml b/indra/newview/skins/default/xui/de/floater_preview_sound.xml
index 397b417d44e..17419548bc3 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_sound.xml
@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview_sound">
-	<floater.string name="Title">
-		Sound: [NAME]
-	</floater.string>
-	<text name="desc txt">
-		Beschreibung:
-	</text>
-	<button label="In Welt abspielen" label_selected="In Welt abspielen" name="Sound play btn" tool_tip="Gibt diesen Sound so wieder, dass andere ihn hören können."/>
-	<button label="Lokal wiedergeben" label_selected="Lokal wiedergeben" name="Sound audition btn" tool_tip="Gibt diesen Sound so wieder, dass nur Sie ihn hören."/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_sound">
+	<floater.string name="Title">
+		Sound: [NAME]
+	</floater.string>
+	<text name="desc txt">
+		Beschreibung:
+	</text>
+	<button label="In Welt abspielen" label_selected="In Welt abspielen" name="Sound play btn" tool_tip="Gibt diesen Sound so wieder, dass andere ihn hören können."/>
+	<button label="Lokal wiedergeben" label_selected="Lokal wiedergeben" name="Sound audition btn" tool_tip="Gibt diesen Sound so wieder, dass nur Sie ihn hören."/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_texture.xml b/indra/newview/skins/default/xui/de/floater_preview_texture.xml
index c33e52dac8d..9aa00e71725 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_texture.xml
@@ -1,17 +1,17 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview_texture">
-	<floater.string name="Title">
-		Textur: [NAME]
-	</floater.string>
-	<floater.string name="Copy">
-		In Inventar kopieren
-	</floater.string>
-	<text name="desc txt">
-		Beschreibung:
-	</text>
-	<button label="Speichern" name="Keep"/>
-	<button label="Löschen" name="Discard"/>
-	<text name="dimensions">
-		[WIDTH]px x [HEIGHT]px
-	</text>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_texture">
+	<floater.string name="Title">
+		Textur: [NAME]
+	</floater.string>
+	<floater.string name="Copy">
+		In Inventar kopieren
+	</floater.string>
+	<text name="desc txt">
+		Beschreibung:
+	</text>
+	<button label="Speichern" name="Keep"/>
+	<button label="Löschen" name="Discard"/>
+	<text name="dimensions">
+		[WIDTH]px x [HEIGHT]px
+	</text>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_report_abuse.xml b/indra/newview/skins/default/xui/de/floater_report_abuse.xml
index 1e287268613..84b80e2f6d2 100644
--- a/indra/newview/skins/default/xui/de/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/de/floater_report_abuse.xml
@@ -1,104 +1,104 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_report_abuse" title="MISSBRAUCH MELDEN">
-	<floater.string name="Screenshot">
-		Foto
-	</floater.string>
-	<check_box bottom_delta="-20" label="Dieses Foto verwenden" name="screen_check"/>
-	<text name="reporter_title">
-		Melder:
-	</text>
-	<text name="reporter_field">
-		Loremipsum Dolorsitamut
-	</text>
-	<text name="sim_title">
-		Region:
-	</text>
-	<text name="sim_field">
-		Name der Region
-	</text>
-	<text name="pos_title">
-		Position:
-	</text>
-	<text name="pos_field">
-		{128.1, 128.1, 15.4}
-	</text>
-	<text bottom_delta="-38" height="32" name="select_object_label">
-		Klicken Sie auf die Schaltfläche, dann auf das entsprechende Objekt:
-	</text>
-	<button label="" label_selected="" name="pick_btn" tool_tip="Objektauswahl – Wählen Sie ein Objekt als Thema dieses Berichts aus"/>
-	<text name="object_name_label">
-		Objekt:
-	</text>
-	<text name="object_name">
-		Consetetur Sadipscing
-	</text>
-	<text name="owner_name_label">
-		Eigentümer:
-	</text>
-	<text name="owner_name">
-		Hendrerit Vulputate
-	</text>
-	<combo_box name="category_combo" tool_tip="Kategorie -- wählen Sie die Kategorie aus, die am besten auf diesen Bericht zutrifft">
-		<combo_box.item label="Kategorie auswählen" name="Select_category"/>
-		<combo_box.item label="Alter&gt; Age-Play" name="Age__Age_play"/>
-		<combo_box.item label="Alter&gt; Erwachsener Einwohner in Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
-		<combo_box.item label="Alter &gt; Minderjähriger Einwohner außerhalb Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
-		<combo_box.item label="Angriff&gt; Kampf-Sandbox / unsichere Region" name="Assault__Combat_sandbox___unsafe_area"/>
-		<combo_box.item label="Angriff&gt; Sichere Region" name="Assault__Safe_area"/>
-		<combo_box.item label="Angriff &gt; Sandbox für Waffentest" name="Assault__Weapons_testing_sandbox"/>
-		<combo_box.item label="Handel &gt; Produkt nicht geliefert oder Dienstleistung nicht erbracht" name="Commerce__Failure_to_deliver_product_or_service"/>
-		<combo_box.item label="Offenlegung &gt; Informationen aus realer Welt" name="Disclosure__Real_world_information"/>
-		<combo_box.item label="Offenlegung &gt; Abhören eines Chats aus der Ferne" name="Disclosure__Remotely_monitoring chat"/>
-		<combo_box.item label="Offenlegung &gt; Second Life-Informationen/Chat/IMs" name="Disclosure__Second_Life_information_chat_IMs"/>
-		<combo_box.item label="Ruhestörung &gt; Unfaire Nutzung von Regionsressourcen" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
-		<combo_box.item label="Ruhestörung &gt; Exzessive Nutzung geskripteter Objekte" name="Disturbing_the_peace__Excessive_scripted_objects"/>
-		<combo_box.item label="Ruhestörung &gt; Wildes Erzeugen von Objekten" name="Disturbing_the_peace__Object_littering"/>
-		<combo_box.item label="Ruhestörung &gt; Ständige Spam-Wiederholung" name="Disturbing_the_peace__Repetitive_spam"/>
-		<combo_box.item label="Ruhestörung &gt; Unerwünschte Spam-Werbung" name="Disturbing_the_peace__Unwanted_advert_spam"/>
-		<combo_box.item label="Betrug &gt; L$" name="Fraud__L$"/>
-		<combo_box.item label="Betrug&gt; Land" name="Fraud__Land"/>
-		<combo_box.item label="Betrug &gt; Schneeballsystem oder Kettenbrief" name="Fraud__Pyramid_scheme_or_chain_letter"/>
-		<combo_box.item label="Betrug &gt; US$" name="Fraud__US$"/>
-		<combo_box.item label="Belästigung &gt; Werbefarmen / visueller Spam" name="Harassment__Advert_farms___visual_spam"/>
-		<combo_box.item label="Belästigung &gt; Diffamieren von Einzelpersonen/Gruppen" name="Harassment__Defaming_individuals_or_groups"/>
-		<combo_box.item label="Belästigung &gt; Bewegungseinschränkung" name="Harassment__Impeding_movement"/>
-		<combo_box.item label="Belästigung &gt; Sexuelle Belästigung" name="Harassment__Sexual_harassment"/>
-		<combo_box.item label="Belästigung &gt; Anstiften Dritter zur Missachtung der Nutzungsbedingungen" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
-		<combo_box.item label="Belästigung &gt; Beschimpfung" name="Harassment__Verbal_abuse"/>
-		<combo_box.item label="Unanständigkeit &gt; Anstößige Inhalte oder Handlungen in der Öffentlichkeit" name="Indecency__Broadly_offensive_content_or_conduct"/>
-		<combo_box.item label="Unanständigkeit &gt; Anstößiger Avatarname" name="Indecency__Inappropriate_avatar_name"/>
-		<combo_box.item label="Unanständigkeit &gt; Unangemessener Inhalt oder unangemessenes Verhalten in PG-Region" name="Indecency__Mature_content_in_PG_region"/>
-		<combo_box.item label="Unanständigkeit &gt; Unangemessener Inhalt oder unangemessenes Verhalten in Mature-Region" name="Indecency__Inappropriate_content_in_Mature_region"/>
-		<combo_box.item label="Urheberrechtsverletzung &gt; Entfernen von Inhalten" name="Intellectual_property_infringement_Content_Removal"/>
-		<combo_box.item label="Urheberrechtsverletzung &gt; CopyBot oder Berechtigungs-Exploit" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
-		<combo_box.item label="Intoleranz" name="Intolerance"/>
-		<combo_box.item label="Land &gt; Missbrauch der Sandbox-Ressourcen" name="Land__Abuse_of_sandbox_resources"/>
-		<combo_box.item label="Land &gt; Unbefugte Nutzung &gt; Objekte/Texturen" name="Land__Encroachment__Objects_textures"/>
-		<combo_box.item label="Land &gt; Unbefugte Nutzung &gt; Partikel" name="Land__Encroachment__Particles"/>
-		<combo_box.item label="Land &gt; Unbefugte Nutzung &gt; Bäume/Pflanzen" name="Land__Encroachment__Trees_plants"/>
-		<combo_box.item label="Wetten/Glücksspiel" name="Wagering_gambling"/>
-		<combo_box.item label="Sonstige" name="Other"/>
-	</combo_box>
-	<text name="abuser_name_title">
-		Name des Beschuldigten:
-	</text>
-	<button label="Auswählen" label_selected="" name="select_abuser" tool_tip="Den Namen des Beschuldigten aus einer Liste wählen"/>
-	<text name="abuser_name_title2">
-		Ort des Missbrauchs:
-	</text>
-	<text name="sum_title">
-		Zusammenfassung:
-	</text>
-	<text name="dscr_title">
-		Details:
-	</text>
-	<text name="bug_aviso">
-		Bitte beschreiben Sie so genau wie möglich.
-	</text>
-	<text_editor bottom_delta="-136" height="130" name="details_edit"/>
-	<text bottom_delta="-20" name="incomplete_title">
-		Hinweis: Unvollständige Meldungen werden nicht bearbeitet.
-	</text>
-	<button label="Missbrauch melden" label_selected="Missbrauch melden" name="send_btn"/>
-	<button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_report_abuse" title="MISSBRAUCH MELDEN">
+	<floater.string name="Screenshot">
+		Foto
+	</floater.string>
+	<check_box bottom_delta="-20" label="Dieses Foto verwenden" name="screen_check"/>
+	<text name="reporter_title">
+		Melder:
+	</text>
+	<text name="reporter_field">
+		Loremipsum Dolorsitamut
+	</text>
+	<text name="sim_title">
+		Region:
+	</text>
+	<text name="sim_field">
+		Name der Region
+	</text>
+	<text name="pos_title">
+		Position:
+	</text>
+	<text name="pos_field">
+		{128.1, 128.1, 15.4}
+	</text>
+	<text bottom_delta="-38" height="32" name="select_object_label">
+		Klicken Sie auf die Schaltfläche, dann auf das entsprechende Objekt:
+	</text>
+	<button label="" label_selected="" name="pick_btn" tool_tip="Objektauswahl – Wählen Sie ein Objekt als Thema dieses Berichts aus"/>
+	<text name="object_name_label">
+		Objekt:
+	</text>
+	<text name="object_name">
+		Consetetur Sadipscing
+	</text>
+	<text name="owner_name_label">
+		Eigentümer:
+	</text>
+	<text name="owner_name">
+		Hendrerit Vulputate
+	</text>
+	<combo_box name="category_combo" tool_tip="Kategorie -- wählen Sie die Kategorie aus, die am besten auf diesen Bericht zutrifft">
+		<combo_box.item label="Kategorie auswählen" name="Select_category"/>
+		<combo_box.item label="Alter&gt; Age-Play" name="Age__Age_play"/>
+		<combo_box.item label="Alter&gt; Erwachsener Einwohner in Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
+		<combo_box.item label="Alter &gt; Minderjähriger Einwohner außerhalb Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+		<combo_box.item label="Angriff&gt; Kampf-Sandbox / unsichere Region" name="Assault__Combat_sandbox___unsafe_area"/>
+		<combo_box.item label="Angriff&gt; Sichere Region" name="Assault__Safe_area"/>
+		<combo_box.item label="Angriff &gt; Sandbox für Waffentest" name="Assault__Weapons_testing_sandbox"/>
+		<combo_box.item label="Handel &gt; Produkt nicht geliefert oder Dienstleistung nicht erbracht" name="Commerce__Failure_to_deliver_product_or_service"/>
+		<combo_box.item label="Offenlegung &gt; Informationen aus realer Welt" name="Disclosure__Real_world_information"/>
+		<combo_box.item label="Offenlegung &gt; Abhören eines Chats aus der Ferne" name="Disclosure__Remotely_monitoring chat"/>
+		<combo_box.item label="Offenlegung &gt; Second Life-Informationen/Chat/IMs" name="Disclosure__Second_Life_information_chat_IMs"/>
+		<combo_box.item label="Ruhestörung &gt; Unfaire Nutzung von Regionsressourcen" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+		<combo_box.item label="Ruhestörung &gt; Exzessive Nutzung geskripteter Objekte" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+		<combo_box.item label="Ruhestörung &gt; Wildes Erzeugen von Objekten" name="Disturbing_the_peace__Object_littering"/>
+		<combo_box.item label="Ruhestörung &gt; Ständige Spam-Wiederholung" name="Disturbing_the_peace__Repetitive_spam"/>
+		<combo_box.item label="Ruhestörung &gt; Unerwünschte Spam-Werbung" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+		<combo_box.item label="Betrug &gt; L$" name="Fraud__L$"/>
+		<combo_box.item label="Betrug&gt; Land" name="Fraud__Land"/>
+		<combo_box.item label="Betrug &gt; Schneeballsystem oder Kettenbrief" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+		<combo_box.item label="Betrug &gt; US$" name="Fraud__US$"/>
+		<combo_box.item label="Belästigung &gt; Werbefarmen / visueller Spam" name="Harassment__Advert_farms___visual_spam"/>
+		<combo_box.item label="Belästigung &gt; Diffamieren von Einzelpersonen/Gruppen" name="Harassment__Defaming_individuals_or_groups"/>
+		<combo_box.item label="Belästigung &gt; Bewegungseinschränkung" name="Harassment__Impeding_movement"/>
+		<combo_box.item label="Belästigung &gt; Sexuelle Belästigung" name="Harassment__Sexual_harassment"/>
+		<combo_box.item label="Belästigung &gt; Anstiften Dritter zur Missachtung der Nutzungsbedingungen" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+		<combo_box.item label="Belästigung &gt; Beschimpfung" name="Harassment__Verbal_abuse"/>
+		<combo_box.item label="Unanständigkeit &gt; Anstößige Inhalte oder Handlungen in der Öffentlichkeit" name="Indecency__Broadly_offensive_content_or_conduct"/>
+		<combo_box.item label="Unanständigkeit &gt; Anstößiger Avatarname" name="Indecency__Inappropriate_avatar_name"/>
+		<combo_box.item label="Unanständigkeit &gt; Unangemessener Inhalt oder unangemessenes Verhalten in PG-Region" name="Indecency__Mature_content_in_PG_region"/>
+		<combo_box.item label="Unanständigkeit &gt; Unangemessener Inhalt oder unangemessenes Verhalten in Mature-Region" name="Indecency__Inappropriate_content_in_Mature_region"/>
+		<combo_box.item label="Urheberrechtsverletzung &gt; Entfernen von Inhalten" name="Intellectual_property_infringement_Content_Removal"/>
+		<combo_box.item label="Urheberrechtsverletzung &gt; CopyBot oder Berechtigungs-Exploit" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+		<combo_box.item label="Intoleranz" name="Intolerance"/>
+		<combo_box.item label="Land &gt; Missbrauch der Sandbox-Ressourcen" name="Land__Abuse_of_sandbox_resources"/>
+		<combo_box.item label="Land &gt; Unbefugte Nutzung &gt; Objekte/Texturen" name="Land__Encroachment__Objects_textures"/>
+		<combo_box.item label="Land &gt; Unbefugte Nutzung &gt; Partikel" name="Land__Encroachment__Particles"/>
+		<combo_box.item label="Land &gt; Unbefugte Nutzung &gt; Bäume/Pflanzen" name="Land__Encroachment__Trees_plants"/>
+		<combo_box.item label="Wetten/Glücksspiel" name="Wagering_gambling"/>
+		<combo_box.item label="Sonstige" name="Other"/>
+	</combo_box>
+	<text name="abuser_name_title">
+		Name des Beschuldigten:
+	</text>
+	<button label="Auswählen" label_selected="" name="select_abuser" tool_tip="Den Namen des Beschuldigten aus einer Liste wählen"/>
+	<text name="abuser_name_title2">
+		Ort des Missbrauchs:
+	</text>
+	<text name="sum_title">
+		Zusammenfassung:
+	</text>
+	<text name="dscr_title">
+		Details:
+	</text>
+	<text name="bug_aviso">
+		Bitte beschreiben Sie so genau wie möglich.
+	</text>
+	<text_editor bottom_delta="-136" height="130" name="details_edit"/>
+	<text bottom_delta="-20" name="incomplete_title">
+		Hinweis: Unvollständige Meldungen werden nicht bearbeitet.
+	</text>
+	<button label="Missbrauch melden" label_selected="Missbrauch melden" name="send_btn"/>
+	<button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/de/floater_script_debug_panel.xml
index fc805e879b8..ef021ce7131 100644
--- a/indra/newview/skins/default/xui/de/floater_script_debug_panel.xml
+++ b/indra/newview/skins/default/xui/de/floater_script_debug_panel.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script" short_title="[All scripts]" title="[All scripts]"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script" short_title="[All scripts]" title="[All scripts]"/>
diff --git a/indra/newview/skins/default/xui/de/floater_script_preview.xml b/indra/newview/skins/default/xui/de/floater_script_preview.xml
index 1d6def4602d..a895a32e14c 100644
--- a/indra/newview/skins/default/xui/de/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/de/floater_script_preview.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview lsl text" title="SKRIPT: ROTATIONSSKRIPT">
-	<floater.string name="Title">
-		Skript: [NAME]
-	</floater.string>
-	<text name="desc txt">
-		Beschreibung:
-	</text>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview lsl text" title="SKRIPT: ROTATIONSSKRIPT">
+	<floater.string name="Title">
+		Skript: [NAME]
+	</floater.string>
+	<text name="desc txt">
+		Beschreibung:
+	</text>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_script_queue.xml b/indra/newview/skins/default/xui/de/floater_script_queue.xml
index d5dc7a0fd72..4c82aabd47a 100644
--- a/indra/newview/skins/default/xui/de/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/de/floater_script_queue.xml
@@ -1,19 +1,19 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="queue" title="RÜCKGÄNGIG">
-	<floater.string name="Starting">
-		[START] von [COUNT] Artikeln.
-	</floater.string>
-	<floater.string name="Done">
-		Fertig.
-	</floater.string>
-	<floater.string name="Resetting">
-		Wird zurückgesetzt
-	</floater.string>
-	<floater.string name="Running">
-		Läuft
-	</floater.string>
-	<floater.string name="NotRunning">
-		Läuft nicht
-	</floater.string>
-	<button label="Schließen" label_selected="Schließen" left="215" name="close" width="72"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="queue" title="RÜCKGÄNGIG">
+	<floater.string name="Starting">
+		[START] von [COUNT] Artikeln.
+	</floater.string>
+	<floater.string name="Done">
+		Fertig.
+	</floater.string>
+	<floater.string name="Resetting">
+		Wird zurückgesetzt
+	</floater.string>
+	<floater.string name="Running">
+		Läuft
+	</floater.string>
+	<floater.string name="NotRunning">
+		Läuft nicht
+	</floater.string>
+	<button label="Schließen" label_selected="Schließen" left="215" name="close" width="72"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_sell_land.xml b/indra/newview/skins/default/xui/de/floater_sell_land.xml
index 82da881a54b..6a5f03c6619 100644
--- a/indra/newview/skins/default/xui/de/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_sell_land.xml
@@ -1,67 +1,67 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="sell land" title="LAND VERKAUFEN">
-	<scroll_container name="profile_scroll">
-		<panel name="scroll_content_panel">
-			<text name="info_parcel_label">
-				Parzelle:
-			</text>
-			<text bottom_delta="-5" height="16" name="info_parcel">
-				PARZELLENNAME
-			</text>
-			<text name="info_size_label">
-				Größe:
-			</text>
-			<text bottom_delta="-21" height="32" name="info_size">
-				[AREA] qm
-			</text>
-			<text bottom_delta="-57" height="28" name="info_action">
-				Zum Verkauf
-dieser Parzelle:
-			</text>
-			<icon bottom_delta="-80" name="step_price"/>
-			<text name="price_label">
-				Preis festlegen:
-			</text>
-			<text name="price_text">
-				Einen angemessenen Preis auswählen.
-			</text>
-			<text name="price_ld">
-				L$
-			</text>
-			<text name="price_per_m">
-				([PER_METER] L$ pro Quadratmeter)
-			</text>
-			<icon height="64" left="0" name="step_sell_to" width="64"/>
-			<text bottom_delta="38" left="72" name="sell_to_label" right="-20">
-				Land verkaufen an:
-			</text>
-			<text bottom_delta="-16" height="16" left="72" name="sell_to_text" right="-10">
-				Wählen Sie, ob der Verkauf offen oder auf eine bestimmte Person
-beschränkt ist.
-			</text>
-			<combo_box bottom_delta="-32" height="16" left="72" name="sell_to" width="140">
-				<combo_box.item label="select one --" name="--selectone--"/>
-				<combo_box.item label="Jeder" name="Anyone"/>
-				<combo_box.item label="Bestimmte Person:" name="Specificuser:"/>
-			</combo_box>
-			<button label="Auswählen..." name="sell_to_select_agent"/>
-			<text name="sell_objects_label">
-				Die Objekte mit dem Land verkaufen?
-			</text>
-			<text name="sell_objects_text">
-				Die transferierbaren Landeigentümer-Objekte auf der Parzelle
-wechseln den Eigentümer.
-			</text>
-			<radio_group bottom_delta="-58" name="sell_objects">
-				<radio_item label="Nein, Objekte behalten" name="no"/>
-				<radio_item label="Ja, Objekte mit Land verkaufen" name="yes"/>
-			</radio_group>
-			<button label="Objekte anzeigen" name="show_objects" width="116"/>
-			<text name="nag_message_label">
-				ACHTUNG: Verkäufe sind endgültig.
-			</text>
-			<button label="Land zum Verkauf freigeben" name="sell_btn" width="180"/>
-			<button label="Abbrechen" name="cancel_btn"/>
-		</panel>
-	</scroll_container>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sell land" title="LAND VERKAUFEN">
+	<scroll_container name="profile_scroll">
+		<panel name="scroll_content_panel">
+			<text name="info_parcel_label">
+				Parzelle:
+			</text>
+			<text bottom_delta="-5" height="16" name="info_parcel">
+				PARZELLENNAME
+			</text>
+			<text name="info_size_label">
+				Größe:
+			</text>
+			<text bottom_delta="-21" height="32" name="info_size">
+				[AREA] qm
+			</text>
+			<text bottom_delta="-57" height="28" name="info_action">
+				Zum Verkauf
+dieser Parzelle:
+			</text>
+			<icon bottom_delta="-80" name="step_price"/>
+			<text name="price_label">
+				Preis festlegen:
+			</text>
+			<text name="price_text">
+				Einen angemessenen Preis auswählen.
+			</text>
+			<text name="price_ld">
+				L$
+			</text>
+			<text name="price_per_m">
+				([PER_METER] L$ pro Quadratmeter)
+			</text>
+			<icon height="64" left="0" name="step_sell_to" width="64"/>
+			<text bottom_delta="38" left="72" name="sell_to_label" right="-20">
+				Land verkaufen an:
+			</text>
+			<text bottom_delta="-16" height="16" left="72" name="sell_to_text" right="-10">
+				Wählen Sie, ob der Verkauf offen oder auf eine bestimmte Person
+beschränkt ist.
+			</text>
+			<combo_box bottom_delta="-32" height="16" left="72" name="sell_to" width="140">
+				<combo_box.item label="select one --" name="--selectone--"/>
+				<combo_box.item label="Jeder" name="Anyone"/>
+				<combo_box.item label="Bestimmte Person:" name="Specificuser:"/>
+			</combo_box>
+			<button label="Auswählen..." name="sell_to_select_agent"/>
+			<text name="sell_objects_label">
+				Die Objekte mit dem Land verkaufen?
+			</text>
+			<text name="sell_objects_text">
+				Die transferierbaren Landeigentümer-Objekte auf der Parzelle
+wechseln den Eigentümer.
+			</text>
+			<radio_group bottom_delta="-58" name="sell_objects">
+				<radio_item label="Nein, Objekte behalten" name="no"/>
+				<radio_item label="Ja, Objekte mit Land verkaufen" name="yes"/>
+			</radio_group>
+			<button label="Objekte anzeigen" name="show_objects" width="116"/>
+			<text name="nag_message_label">
+				ACHTUNG: Verkäufe sind endgültig.
+			</text>
+			<button label="Land zum Verkauf freigeben" name="sell_btn" width="180"/>
+			<button label="Abbrechen" name="cancel_btn"/>
+		</panel>
+	</scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_settings_debug.xml b/indra/newview/skins/default/xui/de/floater_settings_debug.xml
index f9a944165fc..004e54a3391 100644
--- a/indra/newview/skins/default/xui/de/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/de/floater_settings_debug.xml
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="settings_debug" title="DEBUG-EINSTELLUNGEN">
-	<combo_box name="boolean_combo">
-		<combo_box.item label="WAHR" name="TRUE"/>
-		<combo_box.item label="FALSCH" name="FALSE"/>
-	</combo_box>
-	<color_swatch label="Farbe" name="val_color_swatch"/>
-	<spinner label="x" name="val_spinner_1"/>
-	<spinner label="x" name="val_spinner_2"/>
-	<spinner label="x" name="val_spinner_3"/>
-	<spinner label="x" name="val_spinner_4"/>
-	<button label="Standard wiederherstellen" name="default_btn" width="170"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="settings_debug" title="DEBUG-EINSTELLUNGEN">
+	<combo_box name="boolean_combo">
+		<combo_box.item label="WAHR" name="TRUE"/>
+		<combo_box.item label="FALSCH" name="FALSE"/>
+	</combo_box>
+	<color_swatch label="Farbe" name="val_color_swatch"/>
+	<spinner label="x" name="val_spinner_1"/>
+	<spinner label="x" name="val_spinner_2"/>
+	<spinner label="x" name="val_spinner_3"/>
+	<spinner label="x" name="val_spinner_4"/>
+	<button label="Standard wiederherstellen" name="default_btn" width="170"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_stats.xml b/indra/newview/skins/default/xui/de/floater_stats.xml
index 38494faf16b..9aa0c028afe 100644
--- a/indra/newview/skins/default/xui/de/floater_stats.xml
+++ b/indra/newview/skins/default/xui/de/floater_stats.xml
@@ -1,71 +1,71 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Statistics" title="Statistik">
-	<scroll_container name="statistics_scroll">
-		<container_view name="statistics_view">
-			<stat_view label="Basic" name="basic">
-				<stat_bar label="FPS" name="fps"/>
-				<stat_bar label="Bandbreite" name="bandwidth"/>
-				<stat_bar label="Paketverlust" name="packet_loss"/>
-				<stat_bar label="Ping Sim" name="ping"/>
-			</stat_view>
-			<stat_view label="Erweitert" name="advanced">
-				<stat_view label="Darstellung" name="render">
-					<stat_bar label="Gezeichnete KTris" name="ktrisframe"/>
-					<stat_bar label="Gezeichnete KTris" name="ktrissec"/>
-					<stat_bar label="Objektanzahl" name="objs"/>
-					<stat_bar label="Neue Objekte" name="newobjs"/>
-				</stat_view>
-				<stat_view label="Textur" name="texture">
-					<stat_bar label="Zählen" name="numimagesstat"/>
-					<stat_bar label="Rohanzahl" name="numrawimagesstat"/>
-					<stat_bar label="GL Sp" name="gltexmemstat"/>
-					<stat_bar label="Formattierter Sp:" name="formattedmemstat"/>
-					<stat_bar label="Rohsp" name="rawmemstat"/>
-					<stat_bar label="Zugeteilter Sp" name="glboundmemstat"/>
-				</stat_view>
-				<stat_view label="Netzwerk" name="network">
-					<stat_bar label="Paketeingang" name="packetsinstat"/>
-					<stat_bar label="Paketausgang" name="packetsoutstat"/>
-					<stat_bar label="Objekte" name="objectkbitstat"/>
-					<stat_bar label="Textur" name="texturekbitstat"/>
-					<stat_bar label="Bestand" name="assetkbitstat"/>
-					<stat_bar label="Ebenen" name="layerskbitstat"/>
-					<stat_bar label="Tatsächlicher Eingang" name="actualinkbitstat"/>
-					<stat_bar label="Tatsächlicher Ausgang" name="actualoutkbitstat"/>
-					<stat_bar label="VFS Ausstehende Ops" name="vfspendingoperations"/>
-				</stat_view>
-			</stat_view>
-			<stat_view label="Simulator" name="sim">
-				<stat_bar label="Zeitdilation" name="simtimedilation"/>
-				<stat_bar label="Sim FPS" name="simfps"/>
-				<stat_bar label="Physik FPS" name="simphysicsfps"/>
-				<stat_view label="Physikdetails" name="physicsdetail">
-					<stat_bar label="Eingerastete Objekte" name="physicspinnedtasks"/>
-					<stat_bar label="Niedrig LOD-Objekte" name="physicslodtasks"/>
-					<stat_bar label="Zugeordneter Speicher" name="physicsmemoryallocated"/>
-					<stat_bar label="Agent Updates/Sek" name="simagentups"/>
-					<stat_bar label="Haupt-Agenten" name="simmainagents"/>
-					<stat_bar label="Child-Agenten" name="simchildagents"/>
-					<stat_bar label="Objekte" name="simobjects"/>
-					<stat_bar label="Aktive Objekte" name="simactiveobjects"/>
-					<stat_bar label="Aktive Skripts" name="simactivescripts"/>
-					<stat_bar label="Skript-Events" name="simscripteps"/>
-					<stat_bar label="Paketeingang" name="siminpps"/>
-					<stat_bar label="Paketausgang" name="simoutpps"/>
-					<stat_bar label="Ausstehende Downloads" name="simpendingdownloads"/>
-					<stat_bar label="Ausstehende Uploads" name="simpendinguploads"/>
-					<stat_bar label="Gesamtanzahl „Unacked&quot; Bytes" name="simtotalunackedbytes"/>
-				</stat_view>
-				<stat_view label="Zeit (ms)" name="simperf">
-					<stat_bar label="Gesamtzeit Frame" name="simframemsec"/>
-					<stat_bar label="Netto-Zeit" name="simnetmsec"/>
-					<stat_bar label="Physik-Zeit" name="simsimphysicsmsec"/>
-					<stat_bar label="Simulationszeit" name="simsimothermsec"/>
-					<stat_bar label="Agent-Zeit" name="simagentmsec"/>
-					<stat_bar label="Bilder-Zeit" name="simimagesmsec"/>
-					<stat_bar label="Skript-Zeit" name="simscriptmsec"/>
-				</stat_view>
-			</stat_view>
-		</container_view>
-	</scroll_container>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="Statistik">
+	<scroll_container name="statistics_scroll">
+		<container_view name="statistics_view">
+			<stat_view label="Basic" name="basic">
+				<stat_bar label="FPS" name="fps"/>
+				<stat_bar label="Bandbreite" name="bandwidth"/>
+				<stat_bar label="Paketverlust" name="packet_loss"/>
+				<stat_bar label="Ping Sim" name="ping"/>
+			</stat_view>
+			<stat_view label="Erweitert" name="advanced">
+				<stat_view label="Darstellung" name="render">
+					<stat_bar label="Gezeichnete KTris" name="ktrisframe"/>
+					<stat_bar label="Gezeichnete KTris" name="ktrissec"/>
+					<stat_bar label="Objektanzahl" name="objs"/>
+					<stat_bar label="Neue Objekte" name="newobjs"/>
+				</stat_view>
+				<stat_view label="Textur" name="texture">
+					<stat_bar label="Zählen" name="numimagesstat"/>
+					<stat_bar label="Rohanzahl" name="numrawimagesstat"/>
+					<stat_bar label="GL Sp" name="gltexmemstat"/>
+					<stat_bar label="Formattierter Sp:" name="formattedmemstat"/>
+					<stat_bar label="Rohsp" name="rawmemstat"/>
+					<stat_bar label="Zugeteilter Sp" name="glboundmemstat"/>
+				</stat_view>
+				<stat_view label="Netzwerk" name="network">
+					<stat_bar label="Paketeingang" name="packetsinstat"/>
+					<stat_bar label="Paketausgang" name="packetsoutstat"/>
+					<stat_bar label="Objekte" name="objectkbitstat"/>
+					<stat_bar label="Textur" name="texturekbitstat"/>
+					<stat_bar label="Bestand" name="assetkbitstat"/>
+					<stat_bar label="Ebenen" name="layerskbitstat"/>
+					<stat_bar label="Tatsächlicher Eingang" name="actualinkbitstat"/>
+					<stat_bar label="Tatsächlicher Ausgang" name="actualoutkbitstat"/>
+					<stat_bar label="VFS Ausstehende Ops" name="vfspendingoperations"/>
+				</stat_view>
+			</stat_view>
+			<stat_view label="Simulator" name="sim">
+				<stat_bar label="Zeitdilation" name="simtimedilation"/>
+				<stat_bar label="Sim FPS" name="simfps"/>
+				<stat_bar label="Physik FPS" name="simphysicsfps"/>
+				<stat_view label="Physikdetails" name="physicsdetail">
+					<stat_bar label="Eingerastete Objekte" name="physicspinnedtasks"/>
+					<stat_bar label="Niedrig LOD-Objekte" name="physicslodtasks"/>
+					<stat_bar label="Zugeordneter Speicher" name="physicsmemoryallocated"/>
+					<stat_bar label="Agent Updates/Sek" name="simagentups"/>
+					<stat_bar label="Haupt-Agenten" name="simmainagents"/>
+					<stat_bar label="Child-Agenten" name="simchildagents"/>
+					<stat_bar label="Objekte" name="simobjects"/>
+					<stat_bar label="Aktive Objekte" name="simactiveobjects"/>
+					<stat_bar label="Aktive Skripts" name="simactivescripts"/>
+					<stat_bar label="Skript-Events" name="simscripteps"/>
+					<stat_bar label="Paketeingang" name="siminpps"/>
+					<stat_bar label="Paketausgang" name="simoutpps"/>
+					<stat_bar label="Ausstehende Downloads" name="simpendingdownloads"/>
+					<stat_bar label="Ausstehende Uploads" name="simpendinguploads"/>
+					<stat_bar label="Gesamtanzahl „Unacked&quot; Bytes" name="simtotalunackedbytes"/>
+				</stat_view>
+				<stat_view label="Zeit (ms)" name="simperf">
+					<stat_bar label="Gesamtzeit Frame" name="simframemsec"/>
+					<stat_bar label="Netto-Zeit" name="simnetmsec"/>
+					<stat_bar label="Physik-Zeit" name="simsimphysicsmsec"/>
+					<stat_bar label="Simulationszeit" name="simsimothermsec"/>
+					<stat_bar label="Agent-Zeit" name="simagentmsec"/>
+					<stat_bar label="Bilder-Zeit" name="simimagesmsec"/>
+					<stat_bar label="Skript-Zeit" name="simscriptmsec"/>
+				</stat_view>
+			</stat_view>
+		</container_view>
+	</scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml
index b458d922ba5..f4d1bb4d54a 100644
--- a/indra/newview/skins/default/xui/de/floater_tools.xml
+++ b/indra/newview/skins/default/xui/de/floater_tools.xml
@@ -1,480 +1,480 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" short_title="Bau-Werkzeuge" title="">
-	<floater.string name="status_rotate">
-		An den farbigen Bändern ziehen, um das Objekt zu drehen
-	</floater.string>
-	<floater.string name="status_scale">
-		Klicken und ziehen, um die ausgewählte Seite zu dehnen
-	</floater.string>
-	<floater.string name="status_move">
-		Maus verschiebt, Umschalt-Taste und Maus kopiert
-	</floater.string>
-	<floater.string name="status_modifyland">
-		Klicken und halten, um das Land zu bearbeiten
-	</floater.string>
-	<floater.string name="status_camera">
-		Klicken und ziehen, um Kamera zu bewegen
-	</floater.string>
-	<floater.string name="status_grab">
-		Ziehen, um Objekte zu verschieben, Strg zum Heben, Strg-Umschalt zum Drehen
-	</floater.string>
-	<floater.string name="status_place">
-		Inworld klicken, um zu bauen.
-	</floater.string>
-	<floater.string name="status_selectland">
-		Klicken und ziehen, um Land auszuwählen
-	</floater.string>
-	<floater.string name="grid_screen_text">
-		Bildschirm
-	</floater.string>
-	<floater.string name="grid_local_text">
-		Lokal
-	</floater.string>
-	<floater.string name="grid_world_text">
-		Welt
-	</floater.string>
-	<floater.string name="grid_reference_text">
-		Referenz
-	</floater.string>
-	<floater.string name="grid_attachment_text">
-		Anhang
-	</floater.string>
-	<button label="" label_selected="" name="button focus" tool_tip="Fokus"/>
-	<button label="" label_selected="" name="button move" tool_tip="Verschieben"/>
-	<button label="" label_selected="" name="button edit" tool_tip="Bearbeiten"/>
-	<button label="" label_selected="" name="button create" tool_tip="Erstellen"/>
-	<button label="" label_selected="" name="button land" tool_tip="Land"/>
-	<text name="text status">
-		Zum Verschieben ziehen, zum Kopieren Umschalttaste-Ziehen
-	</text>
-	<radio_group name="focus_radio_group">
-		<radio_item label="Zoom" name="radio zoom"/>
-		<radio_item label="Orbit (Strg)" name="radio orbit"/>
-		<radio_item label="Schwenken (Strg-Umschalt)" name="radio pan"/>
-	</radio_group>
-	<radio_group name="move_radio_group">
-		<radio_item label="Verschieben" name="radio move"/>
-		<radio_item label="Heben (Strg)" name="radio lift"/>
-		<radio_item label="Rotieren (Strg-Umschalt)" name="radio spin"/>
-	</radio_group>
-	<radio_group name="edit_radio_group">
-		<radio_item label="Bewegen" name="radio position"/>
-		<radio_item label="Drehen (Strg)" name="radio rotate"/>
-		<radio_item label="Dehnen (Strg-Umschalt)" name="radio stretch"/>
-		<radio_item label="Textur auswählen" name="radio select face"/>
-	</radio_group>
-	<check_box label="Verknüpfte Teile bearbeiten" name="checkbox edit linked parts"/>
-	<check_box label="Beide Seiten dehnen" name="checkbox uniform"/>
-	<check_box initial_value="true" label="Texturen dehnen" name="checkbox stretch textures"/>
-	<check_box initial_value="true" label="An Raster ausrichten" name="checkbox snap to grid"/>
-	<combo_box name="combobox grid mode">
-		<combo_box.item label="Welt-Lineal" name="World"/>
-		<combo_box.item label="Lokal-Lineal" name="Local"/>
-		<combo_box.item label="Referenz-Lineal" name="Reference"/>
-	</combo_box>
-	<button label="Optionen..." label_selected="Optionen..." name="Options..." tool_tip="Grid-Optionen einstellen"/>
-	<button label="" label_selected="" name="ToolCube" tool_tip="Würfel"/>
-	<button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/>
-	<button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide"/>
-	<button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tetraeder"/>
-	<button label="" label_selected="" name="ToolCylinder" tool_tip="Zylinder"/>
-	<button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Halbzylinder"/>
-	<button label="" label_selected="" name="ToolCone" tool_tip="Kegel"/>
-	<button label="" label_selected="" name="ToolHemiCone" tool_tip="Halbkegel"/>
-	<button label="" label_selected="" name="ToolSphere" tool_tip="Kugel"/>
-	<button label="" label_selected="" name="ToolHemiSphere" tool_tip="Halbkugel"/>
-	<button label="" label_selected="" name="ToolTorus" tool_tip="Torus"/>
-	<button label="" label_selected="" name="ToolTube" tool_tip="Rohr"/>
-	<button label="" label_selected="" name="ToolRing" tool_tip="Ring"/>
-	<button label="" label_selected="" name="ToolTree" tool_tip="Baum"/>
-	<button label="" label_selected="" name="ToolGrass" tool_tip="Gras"/>
-	<check_box label="Ausgewähltes Werkzeug beibehalten" name="checkbox sticky"/>
-	<check_box label="Auswahl kopieren" name="checkbox copy selection"/>
-	<check_box initial_value="true" label="Kopie zentrieren" name="checkbox copy centers"/>
-	<check_box label="Kopie drehen" name="checkbox copy rotates"/>
-	<radio_group name="land_radio_group">
-		<radio_item label="Land auswählen" name="radio select land"/>
-		<radio_item label="Einebnen" name="radio flatten"/>
-		<radio_item label="Anheben" name="radio raise"/>
-		<radio_item label="Absenken" name="radio lower"/>
-		<radio_item label="Glätten" name="radio smooth"/>
-		<radio_item label="Aufrauen" name="radio noise"/>
-		<radio_item label="Zurücksetzen" name="radio revert"/>
-	</radio_group>
-	<text name="Bulldozer:">
-		Planierraupe:
-	</text>
-	<text name="Dozer Size:">
-		Größe
-	</text>
-	<text name="Strength:">
-		Stärke
-	</text>
-	<button label="Übernehmen" label_selected="Übernehmen" name="button apply to selection" tool_tip="Ausgewähltes Land ändern"/>
-	<text name="obj_count">
-		Objekte: [COUNT]
-	</text>
-	<text name="prim_count">
-		Primitive: [COUNT]
-	</text>
-	<tab_container name="Object Info Tabs">
-		<panel label="Allgemein" name="General">
-			<panel.string name="text deed continued">
-				Übertragung
-			</panel.string>
-			<panel.string name="text deed">
-				Übertragung
-			</panel.string>
-			<panel.string name="text modify info 1">
-				Sie können dieses Objekt ändern
-			</panel.string>
-			<panel.string name="text modify info 2">
-				Sie können diese Objekte ändern
-			</panel.string>
-			<panel.string name="text modify info 3">
-				Sie können dieses Objekt nicht ändern
-			</panel.string>
-			<panel.string name="text modify info 4">
-				Sie können diese Objekte nicht ändern
-			</panel.string>
-			<panel.string name="text modify warning">
-				Gesamtes Objekt wählen, um Berechtigungen festzulegen.
-			</panel.string>
-			<panel.string name="Cost Default">
-				Preis: L$
-			</panel.string>
-			<panel.string name="Cost Total">
-				Summe: L$
-			</panel.string>
-			<panel.string name="Cost Per Unit">
-				Stückpreis: L$
-			</panel.string>
-			<panel.string name="Cost Mixed">
-				Mischpreis
-			</panel.string>
-			<panel.string name="Sale Mixed">
-				Mischverkauf
-			</panel.string>
-			<text name="Name:">
-				Name:
-			</text>
-			<text name="Description:">
-				Beschreibung:
-			</text>
-			<text name="Creator:">
-				Ersteller:
-			</text>
-			<text name="Creator Name">
-				Thrax Linden
-			</text>
-			<text name="Owner:">
-				Eigentümer:
-			</text>
-			<text name="Owner Name">
-				Thrax Linden
-			</text>
-			<text name="Group:">
-				Gruppe:
-			</text>
-			<button label="Festlegen..." label_selected="Festlegen..." name="button set group" tool_tip="Eine Gruppe auswählen, um die Berechtigungen des Objekts zu teilen."/>
-			<name_box initial_value="Wird geladen..." name="Group Name Proxy"/>
-			<button label="Übertragung" label_selected="Übertragung" name="button deed" tool_tip="Eine Übertragung bedeutet, dass das Objekt mit den Berechtigungen „Nächster Eigentümer“ weitergegeben wird. Mit der Gruppe geteilte Objekte können von einem Gruppen-Officer übertragen werden."/>
-			<check_box label="Teilen" name="checkbox share with group" tool_tip="Mit allen Mitgliedern der zugeordneten Gruppe, Ihre Berechtigungen dieses Objekt zu ändern teilen. Sie müssen Übereignen, um Rollenbeschränkungen zu aktivieren."/>
-			<text name="label click action">
-				Bei Linksklick:
-			</text>
-			<combo_box name="clickaction">
-				<combo_box.item label="Berühren (Standard)" name="Touch/grab(default)"/>
-				<combo_box.item label="Auf Objekt sitzen" name="Sitonobject"/>
-				<combo_box.item label="Objekt kaufen" name="Buyobject"/>
-				<combo_box.item label="Objekt bezahlen" name="Payobject"/>
-				<combo_box.item label="Öffnen" name="Open"/>
-			</combo_box>
-			<check_box label="Zum Verkauf:" name="checkbox for sale"/>
-			<combo_box name="sale type">
-				<combo_box.item label="Kopieren" name="Copy"/>
-				<combo_box.item label="Inhalt" name="Contents"/>
-				<combo_box.item label="Original" name="Original"/>
-			</combo_box>
-			<spinner label="Preis: L$" name="Edit Cost"/>
-			<check_box label="In Suche anzeigen" name="search_check" tool_tip="Dieses Objekt in Suchergebnissen anzeigen"/>
-			<panel name="perms_build">
-				<text name="perm_modify">
-					Sie können dieses Objekt bearbeiten.
-				</text>
-				<text name="Anyone can:">
-					Jeder:
-				</text>
-				<check_box label="Kopieren" name="checkbox allow everyone copy"/>
-				<text name="Next owner can:">
-					Nächster Eigentümer:
-				</text>
-				<check_box label="Ändern" name="checkbox next owner can modify"/>
-				<check_box label="Kopieren" name="checkbox next owner can copy"/>
-				<check_box label="Transferieren" name="checkbox next owner can transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/>
-				<text name="B:">
-					B:
-				</text>
-				<text name="O:">
-					O:
-				</text>
-				<text name="G:">
-					G:
-				</text>
-				<text name="E:">
-					E:
-				</text>
-				<text name="N:">
-					N:
-				</text>
-				<text name="F:">
-					F:
-				</text>
-			</panel>
-		</panel>
-		<panel label="Objekt" name="Object">
-			<check_box label="Gesperrt" name="checkbox locked" tool_tip="Verhindert, dass Objekt verschoben oder gelöscht wird. Oft beim Bauen nützlich, um unbeabsichtigte Bearbeitungen zu vermeiden."/>
-			<check_box label="Physisch" name="Physical Checkbox Ctrl" tool_tip="Gestattet, das Objekt geschoben und von Schwerkraft beeinflusst wird"/>
-			<check_box label="Temporär" name="Temporary Checkbox Ctrl" tool_tip="Verursacht, dass Objekt 1 Minute nach Erstellung gelöscht wird."/>
-			<check_box label="Phantom" name="Phantom Checkbox Ctrl" tool_tip="Verursacht, dass Objekt nicht mit anderen Objekten oder Avataren kollidiert"/>
-			<text name="label position">
-				Position (Meter)
-			</text>
-			<spinner label="X" name="Pos X"/>
-			<spinner label="Y" name="Pos Y"/>
-			<spinner label="Z" name="Pos Z"/>
-			<text name="label size">
-				Größe (Meter)
-			</text>
-			<spinner label="X" name="Scale X"/>
-			<spinner label="Y" name="Scale Y"/>
-			<spinner label="Z" name="Scale Z"/>
-			<text name="label rotation">
-				Rotation (Grad)
-			</text>
-			<spinner label="X" name="Rot X"/>
-			<spinner label="Y" name="Rot Y"/>
-			<spinner label="Z" name="Rot Z"/>
-			<combo_box name="comboBaseType">
-				<combo_box.item label="Quader" name="Box"/>
-				<combo_box.item label="Zylinder" name="Cylinder"/>
-				<combo_box.item label="Prisma" name="Prism"/>
-				<combo_box.item label="Kugel" name="Sphere"/>
-				<combo_box.item label="Torus" name="Torus"/>
-				<combo_box.item label="Rohr" name="Tube"/>
-				<combo_box.item label="Ring" name="Ring"/>
-				<combo_box.item label="Geformt" name="Sculpted"/>
-			</combo_box>
-			<combo_box name="material">
-				<combo_box.item label="Stein" name="Stone"/>
-				<combo_box.item label="Metall" name="Metal"/>
-				<combo_box.item label="Glas" name="Glass"/>
-				<combo_box.item label="Holz" name="Wood"/>
-				<combo_box.item label="Fleisch" name="Flesh"/>
-				<combo_box.item label="Kunststoff" name="Plastic"/>
-				<combo_box.item label="Gummi" name="Rubber"/>
-			</combo_box>
-			<text name="text cut">
-				Pfadschnitt (Anfang/Ende)
-			</text>
-			<spinner label="B" name="cut begin"/>
-			<spinner label="E" name="cut end"/>
-			<text name="text hollow">
-				Hohl
-			</text>
-			<text name="text skew">
-				Versatz
-			</text>
-			<spinner name="Scale 1"/>
-			<spinner name="Skew"/>
-			<text name="Hollow Shape">
-				Hohlform
-			</text>
-			<combo_box name="hole">
-				<combo_box.item label="Standard" name="Default"/>
-				<combo_box.item label="Kreis" name="Circle"/>
-				<combo_box.item label="Quadrat" name="Square"/>
-				<combo_box.item label="Dreieck" name="Triangle"/>
-			</combo_box>
-			<text name="text twist">
-				Torsion (Anfang/Ende)
-			</text>
-			<spinner label="B" name="Twist Begin"/>
-			<spinner label="E" name="Twist End"/>
-			<text name="scale_taper">
-				Verjüngung
-			</text>
-			<text name="scale_hole">
-				Lochgröße
-			</text>
-			<spinner label="X" name="Taper Scale X"/>
-			<spinner label="Y" name="Taper Scale Y"/>
-			<text name="text topshear">
-				Verscherung
-			</text>
-			<spinner label="X" name="Shear X"/>
-			<spinner label="Y" name="Shear Y"/>
-			<text name="advanced_cut">
-				Profilschnitt (Anfang/Ende)
-			</text>
-			<text name="advanced_dimple">
-				Vertiefung (Anfang/Ende)
-			</text>
-			<text name="advanced_slice">
-				Abschneiden (Anfang/Ende)
-			</text>
-			<spinner label="B" name="Path Limit Begin"/>
-			<spinner label="E" name="Path Limit End"/>
-			<text name="text taper2">
-				Verjüngung
-			</text>
-			<spinner label="X" name="Taper X"/>
-			<spinner label="Y" name="Taper Y"/>
-			<text name="text radius delta">
-				Radius
-			</text>
-			<text name="text revolutions">
-				Umdrehungen
-			</text>
-			<spinner name="Radius Offset"/>
-			<texture_picker label="Textur für gestaltetes  Primitiv" name="sculpt texture control" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
-			<check_box label="Spiegeln" name="sculpt mirror control" tool_tip="Geformtes Primitiv entlang der X-Achse spiegeln."/>
-			<check_box label="Wenden" name="sculpt invert control" tool_tip="Dreht die Normalen des geformten Primitivs von innen nach außen."/>
-			<text name="label sculpt type">
-				Naht
-			</text>
-			<combo_box name="sculpt type control">
-				<combo_box.item label="(keiner)" name="None"/>
-				<combo_box.item label="Kugel" name="Sphere"/>
-				<combo_box.item label="Torus" name="Torus"/>
-				<combo_box.item label="Fläche" name="Plane"/>
-				<combo_box.item label="Zylinder" name="Cylinder"/>
-			</combo_box>
-		</panel>
-		<panel label="Eigenschaften" name="Features">
-			<text name="select_single">
-				Wählen Sie nur einen einzelnen Baustein aus, um Eigenschaften zu bearbeiten.
-			</text>
-			<text name="edit_object">
-				Objekteigenschaften bearbeiten:
-			</text>
-			<check_box label="Flexibler Weg" name="Flexible1D Checkbox Ctrl" tool_tip="Gestattet, dass Objekt um die Z-Achse gebogen wird. (nur Client-Seite)"/>
-			<spinner label="Weichheit" name="FlexNumSections"/>
-			<spinner label="Schwerkraft" name="FlexGravity"/>
-			<spinner label="Ziehen" name="FlexFriction"/>
-			<spinner label="Wind" name="FlexWind"/>
-			<spinner label="Spannung" name="FlexTension"/>
-			<spinner label="Erzwingen X" name="FlexForceX"/>
-			<spinner label="Erzwingen Y" name="FlexForceY"/>
-			<spinner label="Erzwingen Z" name="FlexForceZ"/>
-			<check_box label="Licht" name="Light Checkbox Ctrl" tool_tip="Verursacht, dass Objekt Licht emittiert"/>
-			<color_swatch label="" name="colorswatch" tool_tip="Klicken, um Farbauswahl zu öffnen"/>
-			<spinner label="Intensität" name="Light Intensity"/>
-			<spinner label="Radius" name="Light Radius"/>
-			<spinner label="Abnehmend" name="Light Falloff"/>
-		</panel>
-		<panel label="Textur" name="Texture">
-			<panel.string name="string repeats per meter">
-				Kacheln pro Meter
-			</panel.string>
-			<panel.string name="string repeats per face">
-				Wiederholungen pro Fläche
-			</panel.string>
-			<texture_picker label="Textur" name="texture control" tool_tip="Klicken, um ein Bild zu wählen"/>
-			<color_swatch label="Farbe" name="colorswatch" tool_tip="Klicken, um Farbauswahl zu öffnen"/>
-			<text name="color trans">
-				Transparenz %
-			</text>
-			<text name="glow label">
-				Leuchten
-			</text>
-			<check_box label="Ganz hell" name="checkbox fullbright"/>
-			<text name="tex gen">
-				Zuordnung
-			</text>
-			<combo_box name="combobox texgen">
-				<combo_box.item label="Standard" name="Default"/>
-				<combo_box.item label="Eben" name="Planar"/>
-			</combo_box>
-			<text name="label shininess">
-				Glanz
-			</text>
-			<combo_box name="combobox shininess">
-				<combo_box.item label="Kein" name="None"/>
-				<combo_box.item label="Niedrig" name="Low"/>
-				<combo_box.item label="Mittel" name="Medium"/>
-				<combo_box.item label="Hoch" name="High"/>
-			</combo_box>
-			<text name="label bumpiness">
-				Holprigkeit
-			</text>
-			<combo_box name="combobox bumpiness">
-				<combo_box.item label="Keine" name="None"/>
-				<combo_box.item label="Helligkeit" name="Brightness"/>
-				<combo_box.item label="Dunkelheit" name="Darkness"/>
-				<combo_box.item label="Holzmaserung" name="woodgrain"/>
-				<combo_box.item label="Rinde" name="bark"/>
-				<combo_box.item label="Ziegel" name="bricks"/>
-				<combo_box.item label="Karo" name="checker"/>
-				<combo_box.item label="Beton" name="concrete"/>
-				<combo_box.item label="verkrustete Fliesen" name="crustytile"/>
-				<combo_box.item label="Steinplatten" name="cutstone"/>
-				<combo_box.item label="Scheiben" name="discs"/>
-				<combo_box.item label="Kies" name="gravel"/>
-				<combo_box.item label="Petrischale" name="petridish"/>
-				<combo_box.item label="Verkleidung" name="siding"/>
-				<combo_box.item label="Steinfliesen" name="stonetile"/>
-				<combo_box.item label="Stuck" name="stucco"/>
-				<combo_box.item label="Saugen" name="suction"/>
-				<combo_box.item label="gewoben" name="weave"/>
-			</combo_box>
-			<text name="tex scale">
-				Wiederholungen
-			</text>
-			<spinner label="Horizontal (U)" name="TexScaleU"/>
-			<check_box label="Umkehren" name="checkbox flip s"/>
-			<spinner label="Vertikal (V)" name="TexScaleV"/>
-			<check_box label="Umkehren" name="checkbox flip t"/>
-			<button label="Übernehmen" label_selected="Übernehmen" name="button apply"/>
-			<text name="tex offset">
-				Texture-Versatz
-			</text>
-			<spinner label="Horizontal (U)" name="TexOffsetU"/>
-			<spinner label="Vertikal (V)" name="TexOffsetV"/>
-		</panel>
-		<panel label="Inhalt" name="Contents">
-			<button label="Neues Skript" label_selected="Neues Skript" name="button new script"/>
-			<button label="Berechtigungen" name="button permissions"/>
-		</panel>
-	</tab_container>
-	<panel name="land info panel">
-		<text name="label_parcel_info">
-			Parzelleninformation
-		</text>
-		<text name="label_area_price">
-			Preis: L$ [PRICE] für [AREA] m²
-		</text>
-		<text name="label_area">
-			Fläche: [AREA] m²
-		</text>
-		<button label="Info zu Land..." label_selected="Info zu Land..." name="button about land"/>
-		<check_box label="Eigentümer anzeigen" name="checkbox show owners" tool_tip="Parzellen nach Eigentümer farbig kennzeichnen: 
-
-Grün = Ihr Land 
-Blau = Das Land Ihrer Gruppe 
-Rot = Im Eigentum anderer 
-Geld = Zum Verkauf 
-Lila = Zur Auktion 
-Grau = Öffentlich"/>
-		<text name="label_parcel_modify">
-			Parzelle ändern
-		</text>
-		<button label="Unterteilen" label_selected="Unterteilen" name="button subdivide land"/>
-		<button label="Zusammenlegen" label_selected="Zusammenlegen" name="button join land"/>
-		<text name="label_parcel_trans">
-			Land-Transaktionen
-		</text>
-		<button label="Land kaufen" label_selected="Land kaufen" name="button buy land"/>
-		<button label="Land aufgeben" label_selected="Land aufgeben" name="button abandon land"/>
-	</panel>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="toolbox floater" short_title="Bau-Werkzeuge" title="">
+	<floater.string name="status_rotate">
+		An den farbigen Bändern ziehen, um das Objekt zu drehen
+	</floater.string>
+	<floater.string name="status_scale">
+		Klicken und ziehen, um die ausgewählte Seite zu dehnen
+	</floater.string>
+	<floater.string name="status_move">
+		Maus verschiebt, Umschalt-Taste und Maus kopiert
+	</floater.string>
+	<floater.string name="status_modifyland">
+		Klicken und halten, um das Land zu bearbeiten
+	</floater.string>
+	<floater.string name="status_camera">
+		Klicken und ziehen, um Kamera zu bewegen
+	</floater.string>
+	<floater.string name="status_grab">
+		Ziehen, um Objekte zu verschieben, Strg zum Heben, Strg-Umschalt zum Drehen
+	</floater.string>
+	<floater.string name="status_place">
+		Inworld klicken, um zu bauen.
+	</floater.string>
+	<floater.string name="status_selectland">
+		Klicken und ziehen, um Land auszuwählen
+	</floater.string>
+	<floater.string name="grid_screen_text">
+		Bildschirm
+	</floater.string>
+	<floater.string name="grid_local_text">
+		Lokal
+	</floater.string>
+	<floater.string name="grid_world_text">
+		Welt
+	</floater.string>
+	<floater.string name="grid_reference_text">
+		Referenz
+	</floater.string>
+	<floater.string name="grid_attachment_text">
+		Anhang
+	</floater.string>
+	<button label="" label_selected="" name="button focus" tool_tip="Fokus"/>
+	<button label="" label_selected="" name="button move" tool_tip="Verschieben"/>
+	<button label="" label_selected="" name="button edit" tool_tip="Bearbeiten"/>
+	<button label="" label_selected="" name="button create" tool_tip="Erstellen"/>
+	<button label="" label_selected="" name="button land" tool_tip="Land"/>
+	<text name="text status">
+		Zum Verschieben ziehen, zum Kopieren Umschalttaste-Ziehen
+	</text>
+	<radio_group name="focus_radio_group">
+		<radio_item label="Zoom" name="radio zoom"/>
+		<radio_item label="Orbit (Strg)" name="radio orbit"/>
+		<radio_item label="Schwenken (Strg-Umschalt)" name="radio pan"/>
+	</radio_group>
+	<radio_group name="move_radio_group">
+		<radio_item label="Verschieben" name="radio move"/>
+		<radio_item label="Heben (Strg)" name="radio lift"/>
+		<radio_item label="Rotieren (Strg-Umschalt)" name="radio spin"/>
+	</radio_group>
+	<radio_group name="edit_radio_group">
+		<radio_item label="Bewegen" name="radio position"/>
+		<radio_item label="Drehen (Strg)" name="radio rotate"/>
+		<radio_item label="Dehnen (Strg-Umschalt)" name="radio stretch"/>
+		<radio_item label="Textur auswählen" name="radio select face"/>
+	</radio_group>
+	<check_box label="Verknüpfte Teile bearbeiten" name="checkbox edit linked parts"/>
+	<check_box label="Beide Seiten dehnen" name="checkbox uniform"/>
+	<check_box initial_value="true" label="Texturen dehnen" name="checkbox stretch textures"/>
+	<check_box initial_value="true" label="An Raster ausrichten" name="checkbox snap to grid"/>
+	<combo_box name="combobox grid mode">
+		<combo_box.item label="Welt-Lineal" name="World"/>
+		<combo_box.item label="Lokal-Lineal" name="Local"/>
+		<combo_box.item label="Referenz-Lineal" name="Reference"/>
+	</combo_box>
+	<button label="Optionen..." label_selected="Optionen..." name="Options..." tool_tip="Grid-Optionen einstellen"/>
+	<button label="" label_selected="" name="ToolCube" tool_tip="Würfel"/>
+	<button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/>
+	<button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide"/>
+	<button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tetraeder"/>
+	<button label="" label_selected="" name="ToolCylinder" tool_tip="Zylinder"/>
+	<button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Halbzylinder"/>
+	<button label="" label_selected="" name="ToolCone" tool_tip="Kegel"/>
+	<button label="" label_selected="" name="ToolHemiCone" tool_tip="Halbkegel"/>
+	<button label="" label_selected="" name="ToolSphere" tool_tip="Kugel"/>
+	<button label="" label_selected="" name="ToolHemiSphere" tool_tip="Halbkugel"/>
+	<button label="" label_selected="" name="ToolTorus" tool_tip="Torus"/>
+	<button label="" label_selected="" name="ToolTube" tool_tip="Rohr"/>
+	<button label="" label_selected="" name="ToolRing" tool_tip="Ring"/>
+	<button label="" label_selected="" name="ToolTree" tool_tip="Baum"/>
+	<button label="" label_selected="" name="ToolGrass" tool_tip="Gras"/>
+	<check_box label="Ausgewähltes Werkzeug beibehalten" name="checkbox sticky"/>
+	<check_box label="Auswahl kopieren" name="checkbox copy selection"/>
+	<check_box initial_value="true" label="Kopie zentrieren" name="checkbox copy centers"/>
+	<check_box label="Kopie drehen" name="checkbox copy rotates"/>
+	<radio_group name="land_radio_group">
+		<radio_item label="Land auswählen" name="radio select land"/>
+		<radio_item label="Einebnen" name="radio flatten"/>
+		<radio_item label="Anheben" name="radio raise"/>
+		<radio_item label="Absenken" name="radio lower"/>
+		<radio_item label="Glätten" name="radio smooth"/>
+		<radio_item label="Aufrauen" name="radio noise"/>
+		<radio_item label="Zurücksetzen" name="radio revert"/>
+	</radio_group>
+	<text name="Bulldozer:">
+		Planierraupe:
+	</text>
+	<text name="Dozer Size:">
+		Größe
+	</text>
+	<text name="Strength:">
+		Stärke
+	</text>
+	<button label="Übernehmen" label_selected="Übernehmen" name="button apply to selection" tool_tip="Ausgewähltes Land ändern"/>
+	<text name="obj_count">
+		Objekte: [COUNT]
+	</text>
+	<text name="prim_count">
+		Primitive: [COUNT]
+	</text>
+	<tab_container name="Object Info Tabs">
+		<panel label="Allgemein" name="General">
+			<panel.string name="text deed continued">
+				Übertragung
+			</panel.string>
+			<panel.string name="text deed">
+				Übertragung
+			</panel.string>
+			<panel.string name="text modify info 1">
+				Sie können dieses Objekt ändern
+			</panel.string>
+			<panel.string name="text modify info 2">
+				Sie können diese Objekte ändern
+			</panel.string>
+			<panel.string name="text modify info 3">
+				Sie können dieses Objekt nicht ändern
+			</panel.string>
+			<panel.string name="text modify info 4">
+				Sie können diese Objekte nicht ändern
+			</panel.string>
+			<panel.string name="text modify warning">
+				Gesamtes Objekt wählen, um Berechtigungen festzulegen.
+			</panel.string>
+			<panel.string name="Cost Default">
+				Preis: L$
+			</panel.string>
+			<panel.string name="Cost Total">
+				Summe: L$
+			</panel.string>
+			<panel.string name="Cost Per Unit">
+				Stückpreis: L$
+			</panel.string>
+			<panel.string name="Cost Mixed">
+				Mischpreis
+			</panel.string>
+			<panel.string name="Sale Mixed">
+				Mischverkauf
+			</panel.string>
+			<text name="Name:">
+				Name:
+			</text>
+			<text name="Description:">
+				Beschreibung:
+			</text>
+			<text name="Creator:">
+				Ersteller:
+			</text>
+			<text name="Creator Name">
+				Thrax Linden
+			</text>
+			<text name="Owner:">
+				Eigentümer:
+			</text>
+			<text name="Owner Name">
+				Thrax Linden
+			</text>
+			<text name="Group:">
+				Gruppe:
+			</text>
+			<button label="Festlegen..." label_selected="Festlegen..." name="button set group" tool_tip="Eine Gruppe auswählen, um die Berechtigungen des Objekts zu teilen."/>
+			<name_box initial_value="Wird geladen..." name="Group Name Proxy"/>
+			<button label="Übertragung" label_selected="Übertragung" name="button deed" tool_tip="Eine Übertragung bedeutet, dass das Objekt mit den Berechtigungen „Nächster Eigentümer“ weitergegeben wird. Mit der Gruppe geteilte Objekte können von einem Gruppen-Officer übertragen werden."/>
+			<check_box label="Teilen" name="checkbox share with group" tool_tip="Mit allen Mitgliedern der zugeordneten Gruppe, Ihre Berechtigungen dieses Objekt zu ändern teilen. Sie müssen Übereignen, um Rollenbeschränkungen zu aktivieren."/>
+			<text name="label click action">
+				Bei Linksklick:
+			</text>
+			<combo_box name="clickaction">
+				<combo_box.item label="Berühren (Standard)" name="Touch/grab(default)"/>
+				<combo_box.item label="Auf Objekt sitzen" name="Sitonobject"/>
+				<combo_box.item label="Objekt kaufen" name="Buyobject"/>
+				<combo_box.item label="Objekt bezahlen" name="Payobject"/>
+				<combo_box.item label="Öffnen" name="Open"/>
+			</combo_box>
+			<check_box label="Zum Verkauf:" name="checkbox for sale"/>
+			<combo_box name="sale type">
+				<combo_box.item label="Kopieren" name="Copy"/>
+				<combo_box.item label="Inhalt" name="Contents"/>
+				<combo_box.item label="Original" name="Original"/>
+			</combo_box>
+			<spinner label="Preis: L$" name="Edit Cost"/>
+			<check_box label="In Suche anzeigen" name="search_check" tool_tip="Dieses Objekt in Suchergebnissen anzeigen"/>
+			<panel name="perms_build">
+				<text name="perm_modify">
+					Sie können dieses Objekt bearbeiten.
+				</text>
+				<text name="Anyone can:">
+					Jeder:
+				</text>
+				<check_box label="Kopieren" name="checkbox allow everyone copy"/>
+				<text name="Next owner can:">
+					Nächster Eigentümer:
+				</text>
+				<check_box label="Ändern" name="checkbox next owner can modify"/>
+				<check_box label="Kopieren" name="checkbox next owner can copy"/>
+				<check_box label="Transferieren" name="checkbox next owner can transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/>
+				<text name="B:">
+					B:
+				</text>
+				<text name="O:">
+					O:
+				</text>
+				<text name="G:">
+					G:
+				</text>
+				<text name="E:">
+					E:
+				</text>
+				<text name="N:">
+					N:
+				</text>
+				<text name="F:">
+					F:
+				</text>
+			</panel>
+		</panel>
+		<panel label="Objekt" name="Object">
+			<check_box label="Gesperrt" name="checkbox locked" tool_tip="Verhindert, dass Objekt verschoben oder gelöscht wird. Oft beim Bauen nützlich, um unbeabsichtigte Bearbeitungen zu vermeiden."/>
+			<check_box label="Physisch" name="Physical Checkbox Ctrl" tool_tip="Gestattet, das Objekt geschoben und von Schwerkraft beeinflusst wird"/>
+			<check_box label="Temporär" name="Temporary Checkbox Ctrl" tool_tip="Verursacht, dass Objekt 1 Minute nach Erstellung gelöscht wird."/>
+			<check_box label="Phantom" name="Phantom Checkbox Ctrl" tool_tip="Verursacht, dass Objekt nicht mit anderen Objekten oder Avataren kollidiert"/>
+			<text name="label position">
+				Position (Meter)
+			</text>
+			<spinner label="X" name="Pos X"/>
+			<spinner label="Y" name="Pos Y"/>
+			<spinner label="Z" name="Pos Z"/>
+			<text name="label size">
+				Größe (Meter)
+			</text>
+			<spinner label="X" name="Scale X"/>
+			<spinner label="Y" name="Scale Y"/>
+			<spinner label="Z" name="Scale Z"/>
+			<text name="label rotation">
+				Rotation (Grad)
+			</text>
+			<spinner label="X" name="Rot X"/>
+			<spinner label="Y" name="Rot Y"/>
+			<spinner label="Z" name="Rot Z"/>
+			<combo_box name="comboBaseType">
+				<combo_box.item label="Quader" name="Box"/>
+				<combo_box.item label="Zylinder" name="Cylinder"/>
+				<combo_box.item label="Prisma" name="Prism"/>
+				<combo_box.item label="Kugel" name="Sphere"/>
+				<combo_box.item label="Torus" name="Torus"/>
+				<combo_box.item label="Rohr" name="Tube"/>
+				<combo_box.item label="Ring" name="Ring"/>
+				<combo_box.item label="Geformt" name="Sculpted"/>
+			</combo_box>
+			<combo_box name="material">
+				<combo_box.item label="Stein" name="Stone"/>
+				<combo_box.item label="Metall" name="Metal"/>
+				<combo_box.item label="Glas" name="Glass"/>
+				<combo_box.item label="Holz" name="Wood"/>
+				<combo_box.item label="Fleisch" name="Flesh"/>
+				<combo_box.item label="Kunststoff" name="Plastic"/>
+				<combo_box.item label="Gummi" name="Rubber"/>
+			</combo_box>
+			<text name="text cut">
+				Pfadschnitt (Anfang/Ende)
+			</text>
+			<spinner label="B" name="cut begin"/>
+			<spinner label="E" name="cut end"/>
+			<text name="text hollow">
+				Hohl
+			</text>
+			<text name="text skew">
+				Versatz
+			</text>
+			<spinner name="Scale 1"/>
+			<spinner name="Skew"/>
+			<text name="Hollow Shape">
+				Hohlform
+			</text>
+			<combo_box name="hole">
+				<combo_box.item label="Standard" name="Default"/>
+				<combo_box.item label="Kreis" name="Circle"/>
+				<combo_box.item label="Quadrat" name="Square"/>
+				<combo_box.item label="Dreieck" name="Triangle"/>
+			</combo_box>
+			<text name="text twist">
+				Torsion (Anfang/Ende)
+			</text>
+			<spinner label="B" name="Twist Begin"/>
+			<spinner label="E" name="Twist End"/>
+			<text name="scale_taper">
+				Verjüngung
+			</text>
+			<text name="scale_hole">
+				Lochgröße
+			</text>
+			<spinner label="X" name="Taper Scale X"/>
+			<spinner label="Y" name="Taper Scale Y"/>
+			<text name="text topshear">
+				Verscherung
+			</text>
+			<spinner label="X" name="Shear X"/>
+			<spinner label="Y" name="Shear Y"/>
+			<text name="advanced_cut">
+				Profilschnitt (Anfang/Ende)
+			</text>
+			<text name="advanced_dimple">
+				Vertiefung (Anfang/Ende)
+			</text>
+			<text name="advanced_slice">
+				Abschneiden (Anfang/Ende)
+			</text>
+			<spinner label="B" name="Path Limit Begin"/>
+			<spinner label="E" name="Path Limit End"/>
+			<text name="text taper2">
+				Verjüngung
+			</text>
+			<spinner label="X" name="Taper X"/>
+			<spinner label="Y" name="Taper Y"/>
+			<text name="text radius delta">
+				Radius
+			</text>
+			<text name="text revolutions">
+				Umdrehungen
+			</text>
+			<spinner name="Radius Offset"/>
+			<texture_picker label="Textur für gestaltetes  Primitiv" name="sculpt texture control" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
+			<check_box label="Spiegeln" name="sculpt mirror control" tool_tip="Geformtes Primitiv entlang der X-Achse spiegeln."/>
+			<check_box label="Wenden" name="sculpt invert control" tool_tip="Dreht die Normalen des geformten Primitivs von innen nach außen."/>
+			<text name="label sculpt type">
+				Naht
+			</text>
+			<combo_box name="sculpt type control">
+				<combo_box.item label="(keiner)" name="None"/>
+				<combo_box.item label="Kugel" name="Sphere"/>
+				<combo_box.item label="Torus" name="Torus"/>
+				<combo_box.item label="Fläche" name="Plane"/>
+				<combo_box.item label="Zylinder" name="Cylinder"/>
+			</combo_box>
+		</panel>
+		<panel label="Eigenschaften" name="Features">
+			<text name="select_single">
+				Wählen Sie nur einen einzelnen Baustein aus, um Eigenschaften zu bearbeiten.
+			</text>
+			<text name="edit_object">
+				Objekteigenschaften bearbeiten:
+			</text>
+			<check_box label="Flexibler Weg" name="Flexible1D Checkbox Ctrl" tool_tip="Gestattet, dass Objekt um die Z-Achse gebogen wird. (nur Client-Seite)"/>
+			<spinner label="Weichheit" name="FlexNumSections"/>
+			<spinner label="Schwerkraft" name="FlexGravity"/>
+			<spinner label="Ziehen" name="FlexFriction"/>
+			<spinner label="Wind" name="FlexWind"/>
+			<spinner label="Spannung" name="FlexTension"/>
+			<spinner label="Erzwingen X" name="FlexForceX"/>
+			<spinner label="Erzwingen Y" name="FlexForceY"/>
+			<spinner label="Erzwingen Z" name="FlexForceZ"/>
+			<check_box label="Licht" name="Light Checkbox Ctrl" tool_tip="Verursacht, dass Objekt Licht emittiert"/>
+			<color_swatch label="" name="colorswatch" tool_tip="Klicken, um Farbauswahl zu öffnen"/>
+			<spinner label="Intensität" name="Light Intensity"/>
+			<spinner label="Radius" name="Light Radius"/>
+			<spinner label="Abnehmend" name="Light Falloff"/>
+		</panel>
+		<panel label="Textur" name="Texture">
+			<panel.string name="string repeats per meter">
+				Kacheln pro Meter
+			</panel.string>
+			<panel.string name="string repeats per face">
+				Wiederholungen pro Fläche
+			</panel.string>
+			<texture_picker label="Textur" name="texture control" tool_tip="Klicken, um ein Bild zu wählen"/>
+			<color_swatch label="Farbe" name="colorswatch" tool_tip="Klicken, um Farbauswahl zu öffnen"/>
+			<text name="color trans">
+				Transparenz %
+			</text>
+			<text name="glow label">
+				Leuchten
+			</text>
+			<check_box label="Ganz hell" name="checkbox fullbright"/>
+			<text name="tex gen">
+				Zuordnung
+			</text>
+			<combo_box name="combobox texgen">
+				<combo_box.item label="Standard" name="Default"/>
+				<combo_box.item label="Eben" name="Planar"/>
+			</combo_box>
+			<text name="label shininess">
+				Glanz
+			</text>
+			<combo_box name="combobox shininess">
+				<combo_box.item label="Kein" name="None"/>
+				<combo_box.item label="Niedrig" name="Low"/>
+				<combo_box.item label="Mittel" name="Medium"/>
+				<combo_box.item label="Hoch" name="High"/>
+			</combo_box>
+			<text name="label bumpiness">
+				Holprigkeit
+			</text>
+			<combo_box name="combobox bumpiness">
+				<combo_box.item label="Keine" name="None"/>
+				<combo_box.item label="Helligkeit" name="Brightness"/>
+				<combo_box.item label="Dunkelheit" name="Darkness"/>
+				<combo_box.item label="Holzmaserung" name="woodgrain"/>
+				<combo_box.item label="Rinde" name="bark"/>
+				<combo_box.item label="Ziegel" name="bricks"/>
+				<combo_box.item label="Karo" name="checker"/>
+				<combo_box.item label="Beton" name="concrete"/>
+				<combo_box.item label="verkrustete Fliesen" name="crustytile"/>
+				<combo_box.item label="Steinplatten" name="cutstone"/>
+				<combo_box.item label="Scheiben" name="discs"/>
+				<combo_box.item label="Kies" name="gravel"/>
+				<combo_box.item label="Petrischale" name="petridish"/>
+				<combo_box.item label="Verkleidung" name="siding"/>
+				<combo_box.item label="Steinfliesen" name="stonetile"/>
+				<combo_box.item label="Stuck" name="stucco"/>
+				<combo_box.item label="Saugen" name="suction"/>
+				<combo_box.item label="gewoben" name="weave"/>
+			</combo_box>
+			<text name="tex scale">
+				Wiederholungen
+			</text>
+			<spinner label="Horizontal (U)" name="TexScaleU"/>
+			<check_box label="Umkehren" name="checkbox flip s"/>
+			<spinner label="Vertikal (V)" name="TexScaleV"/>
+			<check_box label="Umkehren" name="checkbox flip t"/>
+			<button label="Übernehmen" label_selected="Übernehmen" name="button apply"/>
+			<text name="tex offset">
+				Texture-Versatz
+			</text>
+			<spinner label="Horizontal (U)" name="TexOffsetU"/>
+			<spinner label="Vertikal (V)" name="TexOffsetV"/>
+		</panel>
+		<panel label="Inhalt" name="Contents">
+			<button label="Neues Skript" label_selected="Neues Skript" name="button new script"/>
+			<button label="Berechtigungen" name="button permissions"/>
+		</panel>
+	</tab_container>
+	<panel name="land info panel">
+		<text name="label_parcel_info">
+			Parzelleninformation
+		</text>
+		<text name="label_area_price">
+			Preis: L$ [PRICE] für [AREA] m²
+		</text>
+		<text name="label_area">
+			Fläche: [AREA] m²
+		</text>
+		<button label="Info zu Land..." label_selected="Info zu Land..." name="button about land"/>
+		<check_box label="Eigentümer anzeigen" name="checkbox show owners" tool_tip="Parzellen nach Eigentümer farbig kennzeichnen: 
+
+Grün = Ihr Land 
+Blau = Das Land Ihrer Gruppe 
+Rot = Im Eigentum anderer 
+Geld = Zum Verkauf 
+Lila = Zur Auktion 
+Grau = Öffentlich"/>
+		<text name="label_parcel_modify">
+			Parzelle ändern
+		</text>
+		<button label="Unterteilen" label_selected="Unterteilen" name="button subdivide land"/>
+		<button label="Zusammenlegen" label_selected="Zusammenlegen" name="button join land"/>
+		<text name="label_parcel_trans">
+			Land-Transaktionen
+		</text>
+		<button label="Land kaufen" label_selected="Land kaufen" name="button buy land"/>
+		<button label="Land aufgeben" label_selected="Land aufgeben" name="button abandon land"/>
+	</panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/inspect_avatar.xml b/indra/newview/skins/default/xui/de/inspect_avatar.xml
index d2d6d202706..58e0498b05b 100644
--- a/indra/newview/skins/default/xui/de/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/de/inspect_avatar.xml
@@ -1,16 +1,16 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!--
-  Not can_close / no title to avoid window chrome
-  Single instance - only have one at a time, recycle it each spawn
--->
-<floater name="inspect_avatar">
-	<string name="Subtitle">
-		[AGE]
-	</string>
-	<string name="Details">
-		[ACCTTYPE], [PAYMENTINFO]
-Profil: [SL_PROFILE]
-	</string>
-	<slider name="volume_slider" tool_tip="Lautstärke" value="0.5"/>
-	<button label="Freund hinzufügen" name="add_friend_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+  Not can_close / no title to avoid window chrome
+  Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+	<string name="Subtitle">
+		[AGE]
+	</string>
+	<string name="Details">
+		[ACCTTYPE], [PAYMENTINFO]
+Profil: [SL_PROFILE]
+	</string>
+	<slider name="volume_slider" tool_tip="Lautstärke" value="0.5"/>
+	<button label="Freund hinzufügen" name="add_friend_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/menu_avatar_icon.xml b/indra/newview/skins/default/xui/de/menu_avatar_icon.xml
index ae9a70024ae..b1e119c66a9 100644
--- a/indra/newview/skins/default/xui/de/menu_avatar_icon.xml
+++ b/indra/newview/skins/default/xui/de/menu_avatar_icon.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Avatar Icon Menu">
-	<menu_item_call label="Profil anzeigen..." name="Show Profile"/>
-	<menu_item_call label="IM senden..." name="Send IM"/>
-	<menu_item_call label="Freund hinzufügen..." name="Add Friend"/>
-	<menu_item_call label="Freund entfernen..." name="Remove Friend"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+	<menu_item_call label="Profil anzeigen..." name="Show Profile"/>
+	<menu_item_call label="IM senden..." name="Send IM"/>
+	<menu_item_call label="Freund hinzufügen..." name="Add Friend"/>
+	<menu_item_call label="Freund entfernen..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_favorites.xml b/indra/newview/skins/default/xui/de/menu_favorites.xml
index b73010e7b5a..0d0491d2ebc 100644
--- a/indra/newview/skins/default/xui/de/menu_favorites.xml
+++ b/indra/newview/skins/default/xui/de/menu_favorites.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
-	<menu_item_call label="Teleportieren" name="Teleport To Landmark"/>
-	<menu_item_call label="Landmarken anzeigen/bearbeiten" name="Landmark Open"/>
-	<menu_item_call label="SLurl kopieren" name="Copy slurl"/>
-	<menu_item_call label="Auf Karte zeigen" name="Show On Map"/>
-	<menu_item_call label="Kopieren" name="Landmark Copy"/>
-	<menu_item_call label="Einfügen" name="Landmark Paste"/>
-	<menu_item_call label="Löschen" name="Delete"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+	<menu_item_call label="Teleportieren" name="Teleport To Landmark"/>
+	<menu_item_call label="Landmarken anzeigen/bearbeiten" name="Landmark Open"/>
+	<menu_item_call label="SLurl kopieren" name="Copy slurl"/>
+	<menu_item_call label="Auf Karte zeigen" name="Show On Map"/>
+	<menu_item_call label="Kopieren" name="Landmark Copy"/>
+	<menu_item_call label="Einfügen" name="Landmark Paste"/>
+	<menu_item_call label="Löschen" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_group_plus.xml b/indra/newview/skins/default/xui/de/menu_group_plus.xml
index f90fcb04519..583ee793be6 100644
--- a/indra/newview/skins/default/xui/de/menu_group_plus.xml
+++ b/indra/newview/skins/default/xui/de/menu_group_plus.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
-	<menu_item_call label="Werden Sie Mitglied..." name="item_join"/>
-	<menu_item_call label="Neue Gruppe..." name="item_new"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+	<menu_item_call label="Werden Sie Mitglied..." name="item_join"/>
+	<menu_item_call label="Neue Gruppe..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inventory.xml b/indra/newview/skins/default/xui/de/menu_inventory.xml
index 67250fc7328..7b4335a430d 100644
--- a/indra/newview/skins/default/xui/de/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory.xml
@@ -1,76 +1,76 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
-	<menu_item_call label="Kaufen" name="Task Buy"/>
-	<menu_item_call label="Öffnen" name="Task Open"/>
-	<menu_item_call label="Wiedergeben/Abspielen" name="Task Play"/>
-	<menu_item_call label="Eigenschaften" name="Task Properties"/>
-	<menu_item_call label="Umbenennen" name="Task Rename"/>
-	<menu_item_call label="Löschen" name="Task Remove"/>
-	<menu_item_call label="Papierkorb ausleeren" name="Empty Trash"/>
-	<menu_item_call label="Fundstücke ausleeren" name="Empty Lost And Found"/>
-	<menu_item_call label="Neuer Ordner" name="New Folder"/>
-	<menu_item_call label="Neues Skript" name="New Script"/>
-	<menu_item_call label="Neue Notiz" name="New Note"/>
-	<menu_item_call label="Neue Geste" name="New Gesture"/>
-	<menu label="Neue Kleider" name="New Clothes">
-		<menu_item_call label="Neues Hemd" name="New Shirt"/>
-		<menu_item_call label="Neue Hose" name="New Pants"/>
-		<menu_item_call label="Neue Schuhe" name="New Shoes"/>
-		<menu_item_call label="Neue Socken" name="New Socks"/>
-		<menu_item_call label="Neue Jacke" name="New Jacket"/>
-		<menu_item_call label="Neuer Rock" name="New Skirt"/>
-		<menu_item_call label="Neue Handschuhe" name="New Gloves"/>
-		<menu_item_call label="Neues Unterhemd" name="New Undershirt"/>
-		<menu_item_call label="Neue Unterhose" name="New Underpants"/>
-	</menu>
-	<menu label="Neue Körperteile" name="New Body Parts">
-		<menu_item_call label="Neue Form/Gestalt" name="New Shape"/>
-		<menu_item_call label="Neue Haut" name="New Skin"/>
-		<menu_item_call label="Neues Haar" name="New Hair"/>
-		<menu_item_call label="Neue Augen" name="New Eyes"/>
-	</menu>
-	<menu label="Typ ändern" name="Change Type">
-		<menu_item_call label="Standard" name="Default"/>
-		<menu_item_call label="Handschuhe" name="Gloves"/>
-		<menu_item_call label="Jacke" name="Jacket"/>
-		<menu_item_call label="Hose" name="Pants"/>
-		<menu_item_call label="Form" name="Shape"/>
-		<menu_item_call label="Schuhe" name="Shoes"/>
-		<menu_item_call label="Hemd" name="Shirt"/>
-		<menu_item_call label="Rock" name="Skirt"/>
-		<menu_item_call label="Unterhose" name="Underpants"/>
-		<menu_item_call label="Unterhemd" name="Undershirt"/>
-	</menu>
-	<menu_item_call label="Teleportieren" name="Landmark Open"/>
-	<menu_item_call label="Öffnen" name="Animation Open"/>
-	<menu_item_call label="Öffnen" name="Sound Open"/>
-	<menu_item_call label="Objekt löschen" name="Purge Item"/>
-	<menu_item_call label="Objekt wiederherstellen" name="Restore Item"/>
-	<menu_item_call label="Öffnen" name="Open"/>
-	<menu_item_call label="Eigenschaften" name="Properties"/>
-	<menu_item_call label="Umbenennen" name="Rename"/>
-	<menu_item_call label="Asset-UUID kopieren" name="Copy Asset UUID"/>
-	<menu_item_call label="Kopieren" name="Copy"/>
-	<menu_item_call label="Einfügen" name="Paste"/>
-	<menu_item_call label="Löschen" name="Delete"/>
-	<menu_item_call label="Objekte abnehmen" name="Take Off Items"/>
-	<menu_item_call label="Zum Outfit hinzufügen" name="Add To Outfit"/>
-	<menu_item_call label="Outfit ersetzen" name="Replace Outfit"/>
-	<menu_item_call label="Konferenz-Chat starten" name="Conference Chat Folder"/>
-	<menu_item_call label="Wiedergeben/Abspielen" name="Sound Play"/>
-	<menu_item_call label="In Welt abspielen" name="Animation Play"/>
-	<menu_item_call label="Lokal wiedergeben" name="Animation Audition"/>
-	<menu_item_call label="Instant Message senden" name="Send Instant Message"/>
-	<menu_item_call label="Teleport anbieten..." name="Offer Teleport..."/>
-	<menu_item_call label="Konferenz-Chat starten" name="Conference Chat"/>
-	<menu_item_call label="Aktivieren" name="Activate"/>
-	<menu_item_call label="Deaktivieren" name="Deactivate"/>
-	<menu_item_call label="Von Körper abnehmen" name="Detach From Yourself"/>
-	<menu_item_call label="Anziehen" name="Object Wear"/>
-	<menu label="Anhängen an" name="Attach To"/>
-	<menu label="An HUD hängen" name="Attach To HUD"/>
-	<menu_item_call label="Bearbeiten" name="Wearable Edit"/>
-	<menu_item_call label="Anziehen" name="Wearable Wear"/>
-	<menu_item_call label="Ausziehen" name="Take Off"/>
-	<menu_item_call label="--keine Optionen--" name="--no options--"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+	<menu_item_call label="Kaufen" name="Task Buy"/>
+	<menu_item_call label="Öffnen" name="Task Open"/>
+	<menu_item_call label="Wiedergeben/Abspielen" name="Task Play"/>
+	<menu_item_call label="Eigenschaften" name="Task Properties"/>
+	<menu_item_call label="Umbenennen" name="Task Rename"/>
+	<menu_item_call label="Löschen" name="Task Remove"/>
+	<menu_item_call label="Papierkorb ausleeren" name="Empty Trash"/>
+	<menu_item_call label="Fundstücke ausleeren" name="Empty Lost And Found"/>
+	<menu_item_call label="Neuer Ordner" name="New Folder"/>
+	<menu_item_call label="Neues Skript" name="New Script"/>
+	<menu_item_call label="Neue Notiz" name="New Note"/>
+	<menu_item_call label="Neue Geste" name="New Gesture"/>
+	<menu label="Neue Kleider" name="New Clothes">
+		<menu_item_call label="Neues Hemd" name="New Shirt"/>
+		<menu_item_call label="Neue Hose" name="New Pants"/>
+		<menu_item_call label="Neue Schuhe" name="New Shoes"/>
+		<menu_item_call label="Neue Socken" name="New Socks"/>
+		<menu_item_call label="Neue Jacke" name="New Jacket"/>
+		<menu_item_call label="Neuer Rock" name="New Skirt"/>
+		<menu_item_call label="Neue Handschuhe" name="New Gloves"/>
+		<menu_item_call label="Neues Unterhemd" name="New Undershirt"/>
+		<menu_item_call label="Neue Unterhose" name="New Underpants"/>
+	</menu>
+	<menu label="Neue Körperteile" name="New Body Parts">
+		<menu_item_call label="Neue Form/Gestalt" name="New Shape"/>
+		<menu_item_call label="Neue Haut" name="New Skin"/>
+		<menu_item_call label="Neues Haar" name="New Hair"/>
+		<menu_item_call label="Neue Augen" name="New Eyes"/>
+	</menu>
+	<menu label="Typ ändern" name="Change Type">
+		<menu_item_call label="Standard" name="Default"/>
+		<menu_item_call label="Handschuhe" name="Gloves"/>
+		<menu_item_call label="Jacke" name="Jacket"/>
+		<menu_item_call label="Hose" name="Pants"/>
+		<menu_item_call label="Form" name="Shape"/>
+		<menu_item_call label="Schuhe" name="Shoes"/>
+		<menu_item_call label="Hemd" name="Shirt"/>
+		<menu_item_call label="Rock" name="Skirt"/>
+		<menu_item_call label="Unterhose" name="Underpants"/>
+		<menu_item_call label="Unterhemd" name="Undershirt"/>
+	</menu>
+	<menu_item_call label="Teleportieren" name="Landmark Open"/>
+	<menu_item_call label="Öffnen" name="Animation Open"/>
+	<menu_item_call label="Öffnen" name="Sound Open"/>
+	<menu_item_call label="Objekt löschen" name="Purge Item"/>
+	<menu_item_call label="Objekt wiederherstellen" name="Restore Item"/>
+	<menu_item_call label="Öffnen" name="Open"/>
+	<menu_item_call label="Eigenschaften" name="Properties"/>
+	<menu_item_call label="Umbenennen" name="Rename"/>
+	<menu_item_call label="Asset-UUID kopieren" name="Copy Asset UUID"/>
+	<menu_item_call label="Kopieren" name="Copy"/>
+	<menu_item_call label="Einfügen" name="Paste"/>
+	<menu_item_call label="Löschen" name="Delete"/>
+	<menu_item_call label="Objekte abnehmen" name="Take Off Items"/>
+	<menu_item_call label="Zum Outfit hinzufügen" name="Add To Outfit"/>
+	<menu_item_call label="Outfit ersetzen" name="Replace Outfit"/>
+	<menu_item_call label="Konferenz-Chat starten" name="Conference Chat Folder"/>
+	<menu_item_call label="Wiedergeben/Abspielen" name="Sound Play"/>
+	<menu_item_call label="In Welt abspielen" name="Animation Play"/>
+	<menu_item_call label="Lokal wiedergeben" name="Animation Audition"/>
+	<menu_item_call label="Instant Message senden" name="Send Instant Message"/>
+	<menu_item_call label="Teleport anbieten..." name="Offer Teleport..."/>
+	<menu_item_call label="Konferenz-Chat starten" name="Conference Chat"/>
+	<menu_item_call label="Aktivieren" name="Activate"/>
+	<menu_item_call label="Deaktivieren" name="Deactivate"/>
+	<menu_item_call label="Von Körper abnehmen" name="Detach From Yourself"/>
+	<menu_item_call label="Anziehen" name="Object Wear"/>
+	<menu label="Anhängen an" name="Attach To"/>
+	<menu label="An HUD hängen" name="Attach To HUD"/>
+	<menu_item_call label="Bearbeiten" name="Wearable Edit"/>
+	<menu_item_call label="Anziehen" name="Wearable Wear"/>
+	<menu_item_call label="Ausziehen" name="Take Off"/>
+	<menu_item_call label="--keine Optionen--" name="--no options--"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_landmark.xml b/indra/newview/skins/default/xui/de/menu_landmark.xml
index 40b5b67079b..b100ee11d7f 100644
--- a/indra/newview/skins/default/xui/de/menu_landmark.xml
+++ b/indra/newview/skins/default/xui/de/menu_landmark.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="landmark_overflow_menu">
-	<menu_item_call label="SLurl kopieren" name="copy"/>
-	<menu_item_call label="Löschen" name="delete"/>
-	<menu_item_call label="Auswahl erstellen" name="pick"/>
-</toggleable_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+	<menu_item_call label="SLurl kopieren" name="copy"/>
+	<menu_item_call label="Löschen" name="delete"/>
+	<menu_item_call label="Auswahl erstellen" name="pick"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_mini_map.xml b/indra/newview/skins/default/xui/de/menu_mini_map.xml
index 840e7c41b24..a3179b42f82 100644
--- a/indra/newview/skins/default/xui/de/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/de/menu_mini_map.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="popup">
-	<menu_item_call label="Zoom Nah" name="Zoom Close"/>
-	<menu_item_call label="Zoom Mittel" name="Zoom Medium"/>
-	<menu_item_call label="Zoom Weit" name="Zoom Far"/>
-	<menu_item_call label="Verfolgung abschalten" name="Stop Tracking"/>
-	<menu_item_call label="Weltkarte" name="World Map"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="popup">
+	<menu_item_call label="Zoom Nah" name="Zoom Close"/>
+	<menu_item_call label="Zoom Mittel" name="Zoom Medium"/>
+	<menu_item_call label="Zoom Weit" name="Zoom Far"/>
+	<menu_item_call label="Verfolgung abschalten" name="Stop Tracking"/>
+	<menu_item_call label="Weltkarte" name="World Map"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_navbar.xml b/indra/newview/skins/default/xui/de/menu_navbar.xml
index 677de7c116d..6af01ddcc54 100644
--- a/indra/newview/skins/default/xui/de/menu_navbar.xml
+++ b/indra/newview/skins/default/xui/de/menu_navbar.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Navbar Menu">
-	<menu_item_check label="Koordinaten anzeigen" name="Show Coordinates"/>
-	<menu_item_call label="Landmarke" name="Landmark"/>
-	<menu_item_call label="Ausschneiden" name="Cut"/>
-	<menu_item_call label="Kopieren" name="Copy"/>
-	<menu_item_call label="Einfügen" name="Paste"/>
-	<menu_item_call label="Löschen" name="Delete"/>
-	<menu_item_call label="Alle auswählen" name="Select All"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+	<menu_item_check label="Koordinaten anzeigen" name="Show Coordinates"/>
+	<menu_item_call label="Landmarke" name="Landmark"/>
+	<menu_item_call label="Ausschneiden" name="Cut"/>
+	<menu_item_call label="Kopieren" name="Copy"/>
+	<menu_item_call label="Einfügen" name="Paste"/>
+	<menu_item_call label="Löschen" name="Delete"/>
+	<menu_item_call label="Alle auswählen" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_picks.xml b/indra/newview/skins/default/xui/de/menu_picks.xml
index 102dd4cc5d6..9aec4c83b0c 100644
--- a/indra/newview/skins/default/xui/de/menu_picks.xml
+++ b/indra/newview/skins/default/xui/de/menu_picks.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Picks">
-	<menu_item_call label="Info" name="pick_info"/>
-	<menu_item_call label="Bearbeiten" name="pick_edit"/>
-	<menu_item_call label="Teleportieren" name="pick_teleport"/>
-	<menu_item_call label="Karte" name="pick_map"/>
-	<menu_item_call label="Löschen" name="pick_delete"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+	<menu_item_call label="Info" name="pick_info"/>
+	<menu_item_call label="Bearbeiten" name="pick_edit"/>
+	<menu_item_call label="Teleportieren" name="pick_teleport"/>
+	<menu_item_call label="Karte" name="pick_map"/>
+	<menu_item_call label="Löschen" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_place.xml b/indra/newview/skins/default/xui/de/menu_place.xml
index 36cb3377c14..d9c85f5b929 100644
--- a/indra/newview/skins/default/xui/de/menu_place.xml
+++ b/indra/newview/skins/default/xui/de/menu_place.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="place_overflow_menu">
-	<menu_item_call label="Eine Landmarke setzen" name="landmark"/>
-	<menu_item_call label="Auswahl erstellen" name="pick"/>
-	<menu_item_call label="Pass kaufen" name="pass"/>
-	<menu_item_call label="Bearbeiten" name="edit"/>
-</toggleable_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+	<menu_item_call label="Eine Landmarke setzen" name="landmark"/>
+	<menu_item_call label="Auswahl erstellen" name="pick"/>
+	<menu_item_call label="Pass kaufen" name="pass"/>
+	<menu_item_call label="Bearbeiten" name="edit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_slurl.xml b/indra/newview/skins/default/xui/de/menu_slurl.xml
index b379c1ca6a9..b2ec017f9f3 100644
--- a/indra/newview/skins/default/xui/de/menu_slurl.xml
+++ b/indra/newview/skins/default/xui/de/menu_slurl.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
-	<menu_item_call label="URL-Info" name="about_url"/>
-	<menu_item_call label="Zu URL teleportieren" name="teleport_to_url"/>
-	<menu_item_call label="Karte" name="show_on_map"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+	<menu_item_call label="URL-Info" name="about_url"/>
+	<menu_item_call label="Zu URL teleportieren" name="teleport_to_url"/>
+	<menu_item_call label="Karte" name="show_on_map"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_url_agent.xml b/indra/newview/skins/default/xui/de/menu_url_agent.xml
index e9effe0bf26..9a808088fbe 100644
--- a/indra/newview/skins/default/xui/de/menu_url_agent.xml
+++ b/indra/newview/skins/default/xui/de/menu_url_agent.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="Einwohnerprofil anzeigen" name="show_agent"/>
-	<menu_item_call label="Name in Zwischenablage kopieren" name="url_copy_label"/>
-	<menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="Einwohnerprofil anzeigen" name="show_agent"/>
+	<menu_item_call label="Name in Zwischenablage kopieren" name="url_copy_label"/>
+	<menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_url_group.xml b/indra/newview/skins/default/xui/de/menu_url_group.xml
index 78051fe726e..6bd86414bc1 100644
--- a/indra/newview/skins/default/xui/de/menu_url_group.xml
+++ b/indra/newview/skins/default/xui/de/menu_url_group.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="Gruppeninformation anzeigen" name="show_group"/>
-	<menu_item_call label="Gruppe in Zwischenablage kopieren" name="url_copy_label"/>
-	<menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="Gruppeninformation anzeigen" name="show_group"/>
+	<menu_item_call label="Gruppe in Zwischenablage kopieren" name="url_copy_label"/>
+	<menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_url_http.xml b/indra/newview/skins/default/xui/de/menu_url_http.xml
index ae4aaad4803..30eb1668a54 100644
--- a/indra/newview/skins/default/xui/de/menu_url_http.xml
+++ b/indra/newview/skins/default/xui/de/menu_url_http.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="Webseite öffnen" name="url_open"/>
-	<menu_item_call label="Im internen Browser öffnen" name="url_open_internal"/>
-	<menu_item_call label="Im externen Browser öffnen" name="url_open_external"/>
-	<menu_item_call label="URL in Zwischenablage kopieren" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="Webseite öffnen" name="url_open"/>
+	<menu_item_call label="Im internen Browser öffnen" name="url_open_internal"/>
+	<menu_item_call label="Im externen Browser öffnen" name="url_open_external"/>
+	<menu_item_call label="URL in Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_url_objectim.xml b/indra/newview/skins/default/xui/de/menu_url_objectim.xml
index 8bb1822405c..11f242b5409 100644
--- a/indra/newview/skins/default/xui/de/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/de/menu_url_objectim.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="Objektinformationen anzeigen" name="show_object"/>
-	<menu_item_call label="Zu Objekt-Position teleportieren" name="teleport_to_object"/>
-	<menu_item_call label="Objektname in Zwischenablage kopieren" name="url_copy_label"/>
-	<menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="Objektinformationen anzeigen" name="show_object"/>
+	<menu_item_call label="Zu Objekt-Position teleportieren" name="teleport_to_object"/>
+	<menu_item_call label="Objektname in Zwischenablage kopieren" name="url_copy_label"/>
+	<menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_url_parcel.xml b/indra/newview/skins/default/xui/de/menu_url_parcel.xml
index b3117c8fbe8..707079f8cc2 100644
--- a/indra/newview/skins/default/xui/de/menu_url_parcel.xml
+++ b/indra/newview/skins/default/xui/de/menu_url_parcel.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="Parzelleninformationen anzeigen" name="show_parcel"/>
-	<menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="Parzelleninformationen anzeigen" name="show_parcel"/>
+	<menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_url_slurl.xml b/indra/newview/skins/default/xui/de/menu_url_slurl.xml
index b4d15b2c3db..9b6417456c9 100644
--- a/indra/newview/skins/default/xui/de/menu_url_slurl.xml
+++ b/indra/newview/skins/default/xui/de/menu_url_slurl.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="Ortsinformationen anzeigen" name="show_place"/>
-	<menu_item_call label="Zu Position teleportieren" name="teleport_to_location"/>
-	<menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="Ortsinformationen anzeigen" name="show_place"/>
+	<menu_item_call label="Zu Position teleportieren" name="teleport_to_location"/>
+	<menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_url_teleport.xml b/indra/newview/skins/default/xui/de/menu_url_teleport.xml
index 254807295f4..306977574ca 100644
--- a/indra/newview/skins/default/xui/de/menu_url_teleport.xml
+++ b/indra/newview/skins/default/xui/de/menu_url_teleport.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="An diesen Standort teleportieren" name="teleport"/>
-	<menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="An diesen Standort teleportieren" name="teleport"/>
+	<menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index 94bb7582c37..7e3a6aaa932 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -1,2563 +1,2563 @@
-<?xml version="1.0" encoding="utf-8"?>
-<notifications>
-	<global name="skipnexttime">
-		Nicht mehr anzeigen
-	</global>
-	<global name="alwayschoose">
-		Diese Option immer auswählen
-	</global>
-	<global name="implicitclosebutton">
-		Schließen
-	</global>
-	<template name="okbutton">
-		<form>
-			<button name="OK" text="$yestext"/>
-		</form>
-	</template>
-	<template name="okignore"/>
-	<template name="okcancelbuttons">
-		<form>
-			<button name="Cancel" text="$notext"/>
-		</form>
-	</template>
-	<template name="okcancelignore"/>
-	<template name="okhelpbuttons">
-		<form>
-			<button name="Help" text="$helptext"/>
-		</form>
-	</template>
-	<template name="yesnocancelbuttons">
-		<form>
-			<button name="Yes" text="$yestext"/>
-			<button name="No" text="$notext"/>
-		</form>
-	</template>
-	<notification functor="GenericAcknowledge" label="Unbekannter Warnhinweis" name="MissingAlert">
-		Ihre Version von [APP_NAME] kann den gerade empfangenen Warnhinweis nicht anzeigen.  Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben.
-
-Fehlerdetails: Der Warnhinweis &apos;[_NAME]&apos; wurde in notifications.xml nicht gefunden.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="FloaterNotFound">
-		Floater-Fehler: Folgende Steuerelemente wurden nicht gefunden:
-
-[CONTROLS]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="TutorialNotFound">
-		Derzeit ist kein Tutorial verfügbar.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="GenericAlert">
-		[MESSAGE]
-	</notification>
-	<notification name="GenericAlertYesCancel">
-		[MESSAGE]
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/>
-	</notification>
-	<notification name="BadInstallation">
-		Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten.  Bitte laden Sie die aktuellste Version des Viewers herunter. http://get.secondlife.com
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="LoginFailedNoNetwork">
-		Eine Verbindung zum [SECOND_LIFE_GRID] konnte nicht hergestellt werden.
- &apos;[DIAGNOSTIC]&apos;
-Bitte vergewissern Sie sich, dass Ihre Internetverbindung funktioniert.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="MessageTemplateNotFound">
-		Meldungsvorlage [PATH] nicht gefunden.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="WearableSave">
-		Änderung an aktueller Kleidung/Körperteil speichern?
-		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/>
-	</notification>
-	<notification name="CompileQueueSaveText">
-		Der Text für ein Skript konnte aus folgendem Grund nicht hochgeladen werden: [REASON]. Bitte versuchen Sie es erneut.
-	</notification>
-	<notification name="CompileQueueSaveBytecode">
-		Eine kompiliertes Skript konnte aus folgendem Grund nicht hochgeladen werden: [REASON]. Bitte versuchen Sie es erneut.
-	</notification>
-	<notification name="WriteAnimationFail">
-		Fehler beim Schreiben von Animationsdaten.  Bitte versuchen Sie es erneut.
-	</notification>
-	<notification name="UploadAuctionSnapshotFail">
-		Eine Auktions-Screenshot konnte aus folgendem Grund nicht hochgeladen werden: [REASON]
-	</notification>
-	<notification name="UnableToViewContentsMoreThanOne">
-		Es kann nur jeweils der Inhalt von einem Objekt angezeigt werden.
-Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut.
-	</notification>
-	<notification name="SaveClothingBodyChanges">
-		Änderung an Kleidung/Körperteilen speichern?
-		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Alles speichern"/>
-	</notification>
-	<notification name="GrantModifyRights">
-		Die Gewährung von Änderungsrechten an andere Einwohner ermöglicht es diesen, JEDES BELIEBIGE Objekt zu ändern oder an sich zu nehmen, das Sie in der [SECOND_LIFE]-Welt besitzen. Seien Sie SEHR vorsichtig beim Erteilen dieser Erlaubnis.
-Möchten Sie [FIRST_NAME] [LAST_NAME] Änderungsrechte gewähren?
-		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
-	</notification>
-	<notification name="GrantModifyRightsMultiple">
-		Die Gewährung von Änderungsrechten an andere Einwohner ermöglicht es diesen, JEDES BELIEBIGE Objekt zu ändern, das Sie in der [SECOND_LIFE]-Welt besitzen. Seien Sie SEHR vorsichtig beim Erteilen dieser Erlaubnis.
-Möchten Sie den ausgewählten Einwohnern Änderungsrechte gewähren?
-		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
-	</notification>
-	<notification name="RevokeModifyRights">
-		Möchten Sie [FIRST_NAME] [LAST_NAME] die Änderungsrechte entziehen?
-		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
-	</notification>
-	<notification name="RevokeModifyRightsMultiple">
-		Möchten Sie den ausgewählten Einwohnern die Änderungsrechte entziehen?
-		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
-	</notification>
-	<notification name="UnableToCreateGroup">
-		Gruppe konnte nicht erstellt werden.
-[MESSAGE]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="PanelGroupApply">
-		[NEEDS_APPLY_MESSAGE]
-[WANT_APPLY_MESSAGE]
-		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Änderungen verwerfen" yestext="Änderungen übernehmen"/>
-	</notification>
-	<notification name="MustSpecifyGroupNoticeSubject">
-		Geben Sie einen Betreff für die Gruppenmitteilung ein.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="AddGroupOwnerWarning">
-		Sie sind im Begriff, Gruppenmitgliedern die Rolle [ROLE_NAME] zuzuweisen.
-Diese Rolle kann Mitgliedern nicht mehr entzogen werden.
-Sie müssen die Rolle selbst niederlegen.
-Möchten Sie fortfahren?
-		<usetemplate ignoretext="Bestätigen, bevor ich einen neuen Gruppeneigentümer hinzufüge" name="okcancelignore" notext="Nein" yestext="Ja"/>
-	</notification>
-	<notification name="AssignDangerousActionWarning">
-		Sie sind im Begriff, der Rolle „[ROLE_NAME]“ die Fähigkeit „[ACTION_NAME]“ zuzuweisen.
-
- *ACHTUNG*
- Mitglieder in einer Rolle mit dieser Fähigkeit können sich selbst -
- und allen anderen Mitgliedern – Rollen zuweisen, die mehr Rechte
- beinhalten als sie derzeit haben, und damit nahezu
- Eigentümerrechte erreichen. Überlegen Sie sich, wem Sie diese Fähigkeit
- verleihen.
-
-Der Rolle „[ROLE_NAME]“ diese Fähigkeit zuweisen?
-		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
-	</notification>
-	<notification name="AssignDangerousAbilityWarning">
-		Sie sind im Begriff, der Rolle „[ROLE_NAME]“ die Fähigkeit „[ACTION_NAME]“ zuzuweisen.
-
- *ACHTUNG*
- Mitglieder in einer Rolle mit dieser Fähigkeit können sich selbst -
- und allen anderen Mitgliedern – alle Fähigkeiten zuweisen und
- damit fast Eigentümerrechte erreichen.
-
-Der Rolle „[ROLE_NAME]“ diese Fähigkeit zuweisen?
-		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
-	</notification>
-	<notification name="JoinGroupCanAfford">
-		Der Beitritt zu dieser Gruppe kostet [COST] L$.
-Fortfahren?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Beitreten"/>
-	</notification>
-	<notification name="JoinGroupCannotAfford">
-		Der Beitritt zu dieser Gruppe kostet [COST] L$.
-Sie haben nicht genug L$, um dieser Gruppe beizutreten.
-	</notification>
-	<notification name="CreateGroupCost">
-		Die Gründung dieser Gruppe kostet 100 L$.
-Gruppen müssen mehr als ein Mitglied haben oder sie werden gelöscht.
-Bitte laden Sie innerhalb von 48 Stunden Mitglieder in Ihre Gruppe ein.
-		<usetemplate canceltext="Abbrechen" name="okcancelbuttons" notext="Abbrechen" yestext="Gruppe für 100 L$ erstellen"/>
-	</notification>
-	<notification name="LandBuyPass">
-		Sie können dieses Land („[PARCEL_NAME]“) für [COST] L$
-[TIME] Stunden lang betreten.  Pass kaufen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="SalePriceRestriction">
-		Der Verkaufspreis muss beim allgemeinen Verkauf über 0 L$ liegen.
-Wählen Sie eine bestimmte Person aus, wenn Sie für 0 L$ verkaufen.
-	</notification>
-	<notification name="ConfirmLandSaleChange">
-		Die ausgewählten [LAND_SIZE] qm Land werden zum Verkauf freigegeben.
-Der Verkaufspreis beträgt [SALE_PRICE] L$ und wird automatisch für den Verkauf an [NAME] autorisiert.
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmLandSaleToAnyoneChange">
-		ACHTUNG: Wenn Sie auf „An jeden verkaufen“ klicken, kann jeder in [SECOND_LIFE] Ihr Land kaufen, auch Einwohner in anderen Regionen.
-
-Die ausgewählten [LAND_SIZE] qm Land werden zum Verkauf freigegeben.
-Der Verkaufspreis beträgt [SALE_PRICE] L$ und wird automatisch für den Verkauf an [NAME] autorisiert.
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsDeededToGroup">
-		Möchten Sie alle Ihre Objekte auf dieser Parzelle, die der Gruppe „[NAME]“ gehören, zurück in das jeweilige Inventar ihrer vorherigen Eigentümer transferieren?
-
-*WARNUNG* Alle nicht transferierbaren Objekte, die der Gruppe übertragen wurden, werden dabei gelöscht!
-
-Objekte: [N]
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsOwnedByUser">
-		Möchten Sie alle Objekte auf dieser Parzelle, die dem Einwohner „[NAME]“ gehören, in das jeweilige Inventar ihrer Eigentümer transferieren?
-
-Objekte: [N]
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsOwnedBySelf">
-		Möchten Sie alle Objekte auf dieser Parzelle, die Ihnen gehören, zurück in Ihr Inventar transferieren?
-
-Objekte: [N]
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsNotOwnedBySelf">
-		Möchten Sie alle Objekte auf dieser Parzelle, die NICHT Ihnen gehören, in das Inventar ihrer Eigentümer transferieren?
-Transferierbare Objekte, die an eine Gruppe übertragen wurden, werden ihren vorherigen Eigentümern zurückgegeben.
-
-*WARNUNG* Alle nicht transferierbaren Objekte, die der Gruppe übertragen wurden, werden dabei gelöscht!
-
-Objekte: [N]
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsNotOwnedByUser">
-		Möchten Sie alle Objekte auf dieser Parzelle, die NICHT [NAME] gehören, in das Inventar ihrer Eigentümer transferieren?
-Transferierbare Objekte, die an eine Gruppe übertragen wurden, werden ihren vorherigen Eigentümern zurückgegeben.
-
-*WARNUNG* Alle nicht transferierbaren Objekte, die der Gruppe übertragen wurden, werden dabei gelöscht!
-
-Objekte: [N]
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ReturnAllTopObjects">
-		Möchten Sie alle aufgeführten Objekte ihren Eigentümern zurückgeben?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="DisableAllTopObjects">
-		Möchten Sie alle Objekte in dieser Region deaktivieren?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsNotOwnedByGroup">
-		Objekte auf dieser Parzelle, die von der Gruppe [NAME] nicht gemeinsam genutzt werden, an ihre Eigentümer zurückgeben?
-
-Objekte: [N]
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="UnableToDisableOutsideScripts">
-		Skriptdeaktivierung nicht möglich.
-Für die gesamte Region ist Schaden aktiviert.
-Damit Waffen funktionieren, müssen Skripts erlaubt sein.
-	</notification>
-	<notification name="MustBeInParcel">
-		Sie müssen auf einer Landparzelle stehen, um ihren Landepunkt festzulegen.
-	</notification>
-	<notification name="PromptRecipientEmail">
-		Bitte geben Sie für den/die Empfänger eine gültige Email-Adresse ein.
-	</notification>
-	<notification name="PromptSelfEmail">
-		Geben Sie Ihre E-Mail-Adresse ein.
-	</notification>
-	<notification name="PromptMissingSubjMsg">
-		Foto mit Standardbetreff bzw. -nachricht als E-Mail versenden?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ErrorProcessingSnapshot">
-		Fehler beim Verarbeiten der Fotodaten
-	</notification>
-	<notification name="ErrorEncodingSnapshot">
-		Fehler beim Erstellen des Fotos!
-	</notification>
-	<notification name="ErrorUploadingPostcard">
-		Ein Foto konnte aus folgendem Grund nicht gesendet werden: [REASON]
-	</notification>
-	<notification name="ErrorUploadingReportScreenshot">
-		Ein Report-Screenshot konnte aus folgendem Grund nicht hochgeladen werden: [REASON]
-	</notification>
-	<notification name="MustAgreeToLogIn">
-		Bevor Sie sich in [SECOND_LIFE] anmelden können, müssen Sie den Nutzungsbedingungen zustimmen.
-	</notification>
-	<notification name="CouldNotPutOnOutfit">
-		Outfit konnte nicht angezogen werden.
-Der Outfit-Ordner enthält keine Kleidung, Körperteile oder Anhänge.
-	</notification>
-	<notification name="CannotWearTrash">
-		Kleider oder Körperteile im Papierkorb können nicht getragen werden
-	</notification>
-	<notification name="CannotWearInfoNotComplete">
-		Sie können das Objekt nicht anziehen, weil es noch nicht geladen wurde. Warten Sie kurz und versuchen Sie es dann noch einmal.
-	</notification>
-	<notification name="MustHaveAccountToLogIn">
-		Hoppla! Da fehlt noch etwas.
-Geben Sie bitte den Vor- und den Nachnamen Ihres Avatars ein.
-
-Sie benötigen ein Benutzerkonto, um [SECOND_LIFE] betreten zu können. Möchten Sie jetzt ein Benutzerkonto anlegen?
-		<url name="url">
-			https://join.secondlife.com/index.php?lang=de-DE
-		</url>
-		<usetemplate name="okcancelbuttons" notext="Erneut versuchen" yestext="Neues Benutzerkonto anlegen"/>
-	</notification>
-	<notification name="AddClassified">
-		Anzeigen erscheinen für eine Woche unter „Anzeigen“ im Suchverzeichnis. Füllen Sie Ihre Anzeige aus und klicken Sie auf „Veröffentlichen...“, um sie zum Verzeichnis hinzuzufügen. Sie werden gebeten, einen Preis zu bezahlen, wenn Sie auf „Veröffentlichen“ klicken. Wenn Sie mehr bezahlen oder ein Benutzer nach Ihren Suchbegriffen sucht, erscheint Ihre Anzeige weiter oben in der Liste.
-		<usetemplate ignoretext="So wird eine neue Anzeige erstellt" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="DeleteClassified">
-		Anzeige „[NAME]“ löschen?
-Gebühren werden nicht rückerstattet.
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ClassifiedSave">
-		Änderung an Anzeige [NAME] speichern?
-		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/>
-	</notification>
-	<notification name="DeleteAvatarPick">
-		Auswahl [PICK] löschen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="PromptGoToEventsPage">
-		Zur [SECOND_LIFE] Events-Webseite?
-		<url name="url">
-			http://de.secondlife.com/events/
-		</url>
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="SelectProposalToView">
-		Wählen Sie ein Angebot zur Ansicht.
-	</notification>
-	<notification name="SelectHistoryItemToView">
-		Wählen Sie ein Element zur Ansicht.
-	</notification>
-	<notification name="ResetShowNextTimeDialogs">
-		Möchten Sie alle Popups wieder aktivieren, die Sie zuvor auf „Nicht mehr anzeigen“ gesetzt haben?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="SkipShowNextTimeDialogs">
-		Möchten Sie alle Popups, die übersprungen werden können, deaktivieren?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="CacheWillClear">
-		Der Cache wird nach einem Neustart von [APP_NAME] geleert.
-	</notification>
-	<notification name="CacheWillBeMoved">
-		Der Cache wird nach einem Neustart von [APP_NAME] verschoben.
-Hinweis: Der Cache wird dabei gelöscht/geleert.
-	</notification>
-	<notification name="ChangeConnectionPort">
-		Die Port-Einstellungen werden nach einem Neustart von [APP_NAME] wirksam.
-	</notification>
-	<notification name="ChangeSkin">
-		Die neue Benutzeroberfläche wird nach einem Neustart von [APP_NAME] angewendet.
-	</notification>
-	<notification name="GoToAuctionPage">
-		Zur [SECOND_LIFE]-Webseite, um Auktionen anzuzeigen oder ein Gebot abzugeben?
-		<url name="url">
-			http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
-		</url>
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="SaveChanges">
-		Änderungen speichern?
-		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/>
-	</notification>
-	<notification name="GestureSaveFailedTooManySteps">
-		Speichern der Geste fehlgeschlagen.
-Die Geste besteht aus zu vielen Schritten.
-Löschen Sie einige Schritte und versuchen Sie es erneut.
-	</notification>
-	<notification name="GestureSaveFailedTryAgain">
-		Speichern der Geste fehlgeschlagen.  Warten Sie kurz und versuchen Sie es dann noch einmal.
-	</notification>
-	<notification name="GestureSaveFailedObjectNotFound">
-		Geste konnte nicht gespeichert werden, da das Objekt oder das zugehörige Objektinventar nicht gefunden wurden.
-Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht.
-	</notification>
-	<notification name="GestureSaveFailedReason">
-		Eine Geste konnte aus folgendem Grund nicht gespeichert werden: [REASON].  Speichern Sie die Geste bitte später.
-	</notification>
-	<notification name="SaveNotecardFailObjectNotFound">
-		Notizkarte konnte nicht gespeichert werden, da das Objekt oder das zugehörige Objektinventar nicht gefunden wurden.
-Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht.
-	</notification>
-	<notification name="SaveNotecardFailReason">
-		Eine Notizkarte konnte aus folgendem Grund nicht gespeichert werden: [REASON].  Speichern Sie die Notizkarte bitte später.
-	</notification>
-	<notification name="ScriptCannotUndo">
-		Es konnten nicht alle Änderungen in Ihrer Skriptversion rückgängig gemacht werden.
-Möchten Sie die letzte gespeicherte Version vom Server laden?
-(**Warnung** Dieser Vorgang kann nicht rückgängig gemacht werden.)
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="SaveScriptFailReason">
-		Ein Skript konnte aus folgendem Grund nicht gespeichert werden: [REASON].  Speichern Sie das Skript bitte später.
-	</notification>
-	<notification name="SaveScriptFailObjectNotFound">
-		Skript konnte nicht gespeichert werden, weil das zugehörige Objekt nicht gefunden wurde.
-Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht.
-	</notification>
-	<notification name="SaveBytecodeFailReason">
-		Ein kompiliertes Skript konnte aus folgendem Grund nicht gespeichert werden: [REASON].  Speichern Sie das Skript bitte später.
-	</notification>
-	<notification name="StartRegionEmpty">
-		Sie haben keine Start-Region festgelegt. 
-Bitte geben Sie den Namen der Region im Feld „Startposition“ ein oder wählen Sie „Mein letzter Standort“ oder „Mein Heimatort“ als Startposition aus.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="CouldNotStartStopScript">
-		Skript konnte nicht gestartet oder beendet werden, weil das zugehörige Objekt nicht gefunden wurde.
-Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht.
-	</notification>
-	<notification name="CannotDownloadFile">
-		Dateidownload nicht möglich
-	</notification>
-	<notification name="CannotWriteFile">
-		Datei [[FILE]] kann nicht geschrieben werden
-	</notification>
-	<notification name="UnsupportedHardware">
-		Achtung: Ihr System erfüllt nicht die Mindestanforderungen von [APP_NAME]. Dies kann eine schlechte Darstellungsleistung in [APP_NAME] zur Folge haben. Bei nicht unterstützten Systemkonfigurationen kann Ihnen unsere [SUPPORT_SITE] leider nicht helfen.
-
-MINDESTANF.
-Die Seite [_URL] für weitere Informationen öffnen?
-		<url name="url" option="0">
-			http://secondlife.com/support/sysreqs.php?lang=de
-		</url>
-		<usetemplate ignoretext="Meine Hardware wird nicht unterstützt" name="okcancelignore" notext="Nein" yestext="Ja"/>
-	</notification>
-	<notification name="UnknownGPU">
-		Ihr System verwendet eine uns zurzeit unbekannte Grafikkarte.
-Dies passiert dann, wenn die neue Hardware noch nicht mit [APP_NAME] getestet wurde.  [APP_NAME] wird wahrscheinlich korrekt ausgeführt werden, jedoch sollten Sie Ihre Grafikeinstellungen anpassen, um eine bessere Darstellung zu erzielen.
-(Einstellungen &gt; Grafik).
-		<form name="form">
-			<ignore name="ignore" text="Meine Grafikkarte konnte nicht identifiziert werden."/>
-		</form>
-	</notification>
-	<notification name="DisplaySettingsNoShaders">
-		[APP_NAME] ist bei der Initialisierung der Grafiktreiber abgestürzt.
-Die Grafikqualität wird auf eine niedrige Stufe zurückgesetzt, um einige typische Treiberfehler zu vermeiden.
-Einige Grafikfunktionen werden ausgeschaltet.
-Wir empfehlen die Aktualisierung Ihrer Grafikkartentreiber.
-Sie können die Grafikqualität unter „Einstellungen“ &gt; „Grafik“ wieder erhöhen.
-	</notification>
-	<notification name="RegionNoTerraforming">
-		Die Region [REGION] erlaubt kein Terraforming.
-	</notification>
-	<notification name="CannotCopyWarning">
-		Sie sind nicht berechtigt, dieses Objekt zu kopieren und verlieren es aus Ihrem Inventar, wenn Sie es weggeben. Möchten Sie dieses Objekt anbieten?
-		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
-	</notification>
-	<notification name="CannotGiveItem">
-		Inventarobjekt kann nicht übergeben werden.
-	</notification>
-	<notification name="TransactionCancelled">
-		Transaktion abgebrochen.
-	</notification>
-	<notification name="TooManyItems">
-		Es können maximal 42 Objekte auf einmal in das Inventar transferiert werden.
-	</notification>
-	<notification name="NoItems">
-		Sie sind nicht berechtigt, die ausgewählten Objekte zu kopieren.
-	</notification>
-	<notification name="CannotCopyCountItems">
-		Sie sind nicht berechtigt, [COUNT] der ausgewählten Objekte zu kopieren. Diese Objekte werden aus Ihrem Inventar gelöscht.
-Möchten Sie diese Objekte weggeben?
-		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
-	</notification>
-	<notification name="CannotGiveCategory">
-		Sie sind nicht berechtigt, den ausgewählten Ordner zu kopieren.
-	</notification>
-	<notification name="FreezeAvatar">
-		Diesen Avatar einfrieren?
-Der Avatar wird außer Gefecht gesetzt und kann sich nicht mehr bewegen, chatten oder mit der Welt interagieren.
-		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Auftauen" yestext="Einfrieren"/>
-	</notification>
-	<notification name="FreezeAvatarFullname">
-		[AVATAR_NAME] einfrieren?
-Der Avatar wird außer Gefecht gesetzt und kann sich nicht mehr bewegen, chatten oder mit der Welt interagieren.
-		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Auftauen" yestext="Einfrieren"/>
-	</notification>
-	<notification name="EjectAvatarFullname">
-		[AVATAR_NAME] von Ihrem Land werfen?
-		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Ausschließen und Verbannen" yestext="Ausschließen"/>
-	</notification>
-	<notification name="EjectAvatarNoBan">
-		Diesen Avatar aus Ihrem Land werfen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Hinauswerfen"/>
-	</notification>
-	<notification name="EjectAvatarFullnameNoBan">
-		[AVATAR_NAME] aus Ihrem Land werfen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Hinauswerfen"/>
-	</notification>
-	<notification name="AcquireErrorTooManyObjects">
-		FEHLER: Zu viele Objekte ausgewählt.
-	</notification>
-	<notification name="AcquireErrorObjectSpan">
-		FEHLER: Die Objekte überspannen mehrere Regionen.
-Verschieben Sie alle betreffenden Objekte in dieselbe Region.
-	</notification>
-	<notification name="PromptGoToCurrencyPage">
-		[EXTRA]
-
-[_URL] für Informationen zum Kauf von L$ öffnen?
-		<url name="url">
-			http://de.secondlife.com/app/currency/
-		</url>
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="UnableToLinkObjects">
-		Verknüpfung dieser [COUNT] Objekte nicht möglich.
-Sie können maximal [MAX] Objekte verknüpfen.
-	</notification>
-	<notification name="CannotLinkIncompleteSet">
-		Sie können nur vollständige Objektsätze verknüpfen und Sie müssen mehr als ein Objekt auswählen.
-	</notification>
-	<notification name="CannotLinkModify">
-		Verknüpfung nicht möglich, da Sie nicht alle Objekte bearbeiten dürfen.
-
-Stellen Sie sicher, dass kein Objekt gesperrt ist und alle Objekte Ihnen gehören.
-	</notification>
-	<notification name="CannotLinkDifferentOwners">
-		Verknüpfung nicht möglich, da nicht alle Objekte denselben Eigentümer haben.
-
-Stellen Sie sicher, dass alle ausgewählten Objekte Ihnen gehören.
-	</notification>
-	<notification name="NoFileExtension">
-		Kein Dateityp für Datei: „[FILE]“
-
-Vergewissern Sie sich, dass die Datei den richtigen Dateityp hat.
-	</notification>
-	<notification name="InvalidFileExtension">
-		Ungültige Datei-Endung [EXTENSION]
-Erwartet wurde [VALIDS]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="CannotUploadSoundFile">
-		Sounddatei konnte nicht hochgeladen werden:
-[FILE]
-	</notification>
-	<notification name="SoundFileNotRIFF">
-		Die Datei ist anscheinend keine RIFF WAVE-Datei:
-[FILE]
-	</notification>
-	<notification name="SoundFileNotPCM">
-		Die Datei ist anscheinend keine PCM WAVE-Audiodatei:
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidChannelCount">
-		Die Datei hat eine ungültige Anzahl Tonkanäle (muss Mono oder Stereo sein):
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidSampleRate">
-		Die Sample-Rate dieser Datei wird nicht unterstützt (muss 44,1 K sein):
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidWordSize">
-		Die Word-Größe dieser Datei wird nicht unterstützt (muss 8 oder 16 Bit sein):
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidHeader">
-		„Daten“-Chunk in WAV-Header nicht gefunden:
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidTooLong">
-		Audiodatei ist zu lang (max. 10 Sekunden):
-[FILE]
-	</notification>
-	<notification name="ProblemWithFile">
-		Problem mit Datei [FILE]:
-
-[ERROR]
-	</notification>
-	<notification name="CannotOpenTemporarySoundFile">
-		Temporäre komprimierte Sounddatei konnte nicht geöffnet werden: [FILE]
-	</notification>
-	<notification name="UnknownVorbisEncodeFailure">
-		Unbekannter Vorbis-Kodierungsfehler in: [FILE]
-	</notification>
-	<notification name="CannotEncodeFile">
-		Datei konnte nicht kodiert werden: [FILE]
-	</notification>
-	<notification name="CorruptResourceFile">
-		Ressourcendatei beschädigt: [FILE]
-	</notification>
-	<notification name="UnknownResourceFileVersion">
-		Unbekannte Linden-Ressourcenversion in Datei: [FILE]
-	</notification>
-	<notification name="UnableToCreateOutputFile">
-		Ausgabedatei konnte nicht erstellt werden: [FILE]
-	</notification>
-	<notification name="DoNotSupportBulkAnimationUpload">
-		Der Mehrfach-Upload von Animationsdateien wird zurzeit von [APP_NAME] nicht unterstützt.
-	</notification>
-	<notification name="CannotUploadReason">
-		Datei [FILE] kann aus folgendem Grund nicht hochgeladen werden: [REASON]
-Bitte versuchen Sie es erneut.
-	</notification>
-	<notification name="LandmarkCreated">
-		„[LANDMARK_NAME]“ wurde zum Ordner „[FOLDER_NAME]“ hinzugefügt.
-	</notification>
-	<notification name="CannotCreateLandmarkNotOwner">
-		Sie können hier keine Landmarke erstellen, da der Landeigentümer dies verboten hat.
-	</notification>
-	<notification name="CannotRecompileSelectObjectsNoScripts">
-		„Rekompilieren“ nicht möglich.
-Objekt mit Skript wählen.
-	</notification>
-	<notification name="CannotRecompileSelectObjectsNoPermission">
-		„Rekompilieren“ nicht möglich.
-
-Wählen Sie Objekte mit Skripts, die Sie bearbeiten dürfen.
-	</notification>
-	<notification name="CannotResetSelectObjectsNoScripts">
-		„Zurücksetzen“ nicht möglich.
-
-Wählen Sie Objekte mit Skripts.
-	</notification>
-	<notification name="CannotResetSelectObjectsNoPermission">
-		„Zurücksetzen“ nicht möglich.
-
-Wählen Sie Objekte mit Skripts, die Sie bearbeiten dürfen.
-	</notification>
-	<notification name="CannotSetRunningSelectObjectsNoScripts">
-		„Ausführen“ von Skripts nicht möglich.
-
-Wählen Sie Objekte mit Skripts.
-	</notification>
-	<notification name="CannotSetRunningNotSelectObjectsNoScripts">
-		„Deaktivieren“ von Skripts nicht möglich.
-
-Wählen Sie Objekte mit Skripts.
-	</notification>
-	<notification name="NoFrontmostFloater">
-		Kein vorderster Floater zum Speichern.
-	</notification>
-	<notification name="SeachFilteredOnShortWords">
-		Ihre Suchanfrage wurde geändert.
-Zu kurze Begriffe wurden entfernt.
-
-Ihre Suchanfrage: [FINALQUERY]
-	</notification>
-	<notification name="SeachFilteredOnShortWordsEmpty">
-		Ihre Suchbegriffe sind zu kurz.
-Es wurde keine Suche durchgeführt.
-	</notification>
-	<notification name="CouldNotTeleportReason">
-		Teleport fehlgeschlagen.
-[REASON]
-	</notification>
-	<notification name="invalid_tport">
-		Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden.
-Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
-	</notification>
-	<notification name="invalid_region_handoff">
-		Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen sich zum Wechsel der Region eventuell neu anmelden.
-Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
-	</notification>
-	<notification name="blocked_tport">
-		Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal.
-Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab und wieder an.
-	</notification>
-	<notification name="nolandmark_tport">
-		Das System konnte das Landmarken-Ziel nicht finden.
-	</notification>
-	<notification name="timeout_tport">
-		Das System konnte keine Teleport-Verbindung herstellen.
-Versuchen Sie es später noch einmal.
-	</notification>
-	<notification name="noaccess_tport">
-		Sie haben leider keinen Zugang zu diesem Teleport-Ziel.
-	</notification>
-	<notification name="missing_attach_tport">
-		Ihre Anhänge sind noch nicht eingetroffen. Warten Sie kurz oder melden Sie sich ab und wieder an, bevor Sie einen neuen Teleport-Versuch unternehmen.
-	</notification>
-	<notification name="too_many_uploads_tport">
-		Die Asset-Warteschlange in dieser Region ist zurzeit überlastet.
-Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in einigen Minuten erneut oder besuchen Sie eine weniger überfüllte Region.
-	</notification>
-	<notification name="expired_tport">
-		Das System konnte Ihre Teleport-Anfrage nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut.
-	</notification>
-	<notification name="expired_region_handoff">
-		Das System konnte Ihre Anfrage zum Regionswechsel nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut.
-	</notification>
-	<notification name="no_host">
-		Teleport-Ziel wurde nicht gefunden. Das Ziel ist entweder im Moment nicht verfügbar oder existiert nicht mehr. Versuchen Sie es in einigen Minuten erneut.
-	</notification>
-	<notification name="no_inventory_host">
-		Das Inventarsystem ist zurzeit nicht verfügbar.
-	</notification>
-	<notification name="CannotSetLandOwnerNothingSelected">
-		Landeigentümer kann nicht festgelegt werden:
-Keine Parzelle ausgewählt.
-	</notification>
-	<notification name="CannotSetLandOwnerMultipleRegions">
-		Eine erzwungene Landübertragung ist nicht möglich, da die Auswahl mehrere Regionen umfasst. Wählen Sie ein kleineres Gebiet und versuchen Sie es erneut.
-	</notification>
-	<notification name="ForceOwnerAuctionWarning">
-		Diese Parzelle steht zur Auktion. Eine zwangsweise Eigentumsübertragung beendet die Auktion und verärgert womöglich Einwohner, die bereits ein Gebot abgegeben haben. Eigentumsübertragung erzwingen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="CannotContentifyNothingSelected">
-		Inhaltsidentifizierung nicht möglich:
-Keine Parzelle ausgewählt.
-	</notification>
-	<notification name="CannotContentifyNoRegion">
-		Inhaltsidentifizierung nicht möglich:
-Keine Region ausgewählt.
-	</notification>
-	<notification name="CannotReleaseLandNothingSelected">
-		Land kann nicht aufgegeben werden:
-Keine Parzelle ausgewählt.
-	</notification>
-	<notification name="CannotReleaseLandNoRegion">
-		Land kann nicht aufgegeben werden:
-Region nicht gefunden.
-	</notification>
-	<notification name="CannotBuyLandNothingSelected">
-		Land kann nicht gekauft werden:
-Keine Parzelle ausgewählt.
-	</notification>
-	<notification name="CannotBuyLandNoRegion">
-		Land kann nicht gekauft werden:
-Kann die Region nicht finden, in der sich dieses Land befindet.
-	</notification>
-	<notification name="CannotCloseFloaterBuyLand">
-		Das Fenster „Land kaufen“ kann erst geschlossen werden, nachdem [APP_NAME] den Transaktionspreis geschätzt hat.
-	</notification>
-	<notification name="CannotDeedLandNothingSelected">
-		Land kann nicht übertragen werden:
-Keine Parzelle ausgewählt.
-	</notification>
-	<notification name="CannotDeedLandNoGroup">
-		Land kann nicht übertragen werden:
-Keine Gruppe ausgewählt.
-	</notification>
-	<notification name="CannotDeedLandNoRegion">
-		Land kann nicht übertragen werden:
-Kann die Region nicht finden, in der sich dieses Land befindet.
-	</notification>
-	<notification name="CannotDeedLandMultipleSelected">
-		Land kann nicht übertragen werden:
-Mehrere Parzellen ausgewählt.
-
-Wählen Sie eine einzelne Parzelle.
-	</notification>
-	<notification name="ParcelCanPlayMedia">
-		Dieser Ort kann Streaming-Medien abspielen.
-Streaming-Medien erfordern eine schnelle Internet-Verbindung.
-
-Streaming-Medien abspielen, wenn verfügbar?
-(Sie können diese Option später unter „Einstellungen“ &gt; „Audio &amp; Video“ ändern.)
-		<usetemplate name="okcancelbuttons" notext="Deaktivieren" yestext="Medien wiedergeben"/>
-	</notification>
-	<notification name="CannotDeedLandWaitingForServer">
-		Land kann nicht übertragen werden:
-Warte auf Server für Eigentümerinformationen.
-
-Bitte versuchen Sie es erneut.
-	</notification>
-	<notification name="CannotDeedLandNoTransfer">
-		Land kann nicht übertragen werden:
-Die Region [REGION] erlaubt keine Landübertragung.
-	</notification>
-	<notification name="CannotReleaseLandWatingForServer">
-		Land kann nicht aufgegeben werden:
-Server muss Parzelleninformation aktualisieren.
-
-Versuchen Sie es in einigen Sekunden erneut.
-	</notification>
-	<notification name="CannotReleaseLandSelected">
-		Land kann nicht aufgegeben werden:
-Die ausgewählten Parzellen gehören Ihnen nicht.
-
-Wählen Sie eine einzelne Parzelle.
-	</notification>
-	<notification name="CannotReleaseLandDontOwn">
-		Land kann nicht aufgegeben werden:
-Ihnen fehlt die Berechtigung zur Freigabe dieser Parzelle.
-Parzellen, die Ihnen gehören, werden grün dargestellt.
-	</notification>
-	<notification name="CannotReleaseLandRegionNotFound">
-		Land kann nicht aufgegeben werden:
-Kann die Region nicht finden, in der sich dieses Land befindet.
-	</notification>
-	<notification name="CannotReleaseLandNoTransfer">
-		Land kann nicht aufgegeben werden:
-Die Region [REGION] erlaubt keine Landübertragung.
-	</notification>
-	<notification name="CannotReleaseLandPartialSelection">
-		Land kann nicht aufgegeben werden:
-Zum Freigeben müssen Sie eine ganze Parzelle auswählen.
-
-Wählen Sie eine ganze Parzelle oder teilen Sie Ihre Parzelle.
-	</notification>
-	<notification name="ReleaseLandWarning">
-		Sie sind im Begriff, [AREA] qm Land aufzugeben.
-Wenn Sie diese Parzelle aufgeben, wird sie ohne L$-Erstattung von Ihrem Landbesitz entfernt.
-
-Dieses Land aufgeben?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="CannotDivideLandNothingSelected">
-		Land kann nicht aufgeteilt werden:
-
-Keine Parzellen ausgewählt.
-	</notification>
-	<notification name="CannotDivideLandPartialSelection">
-		Land kann nicht aufgeteilt werden:
-
-Sie haben eine ganze Parzelle ausgewählt.
-Wählen Sie einen Parzellenabschnitt aus.
-	</notification>
-	<notification name="LandDivideWarning">
-		Wenn Sie dieses Land teilen, wird diese Parzelle in zwei geteilt, jede mit ihren eigenen Einstellungen. Einige dieser Einstellungen werden aufgrund dieses Vorgangs zurückgesetzt.
-
-Land teilen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="CannotDivideLandNoRegion">
-		Land kann nicht aufgeteilt werden:
-Kann die Region nicht finden, in der sich dieses Land befindet.
-	</notification>
-	<notification name="CannotJoinLandNoRegion">
-		Land kann nicht zusammengelegt werden:
-Kann die Region nicht finden, in der sich dieses Land befindet.
-	</notification>
-	<notification name="CannotJoinLandNothingSelected">
-		Land kann nicht zusammengelegt werden:
-Keine Parzellen ausgewählt.
-	</notification>
-	<notification name="CannotJoinLandEntireParcelSelected">
-		Land kann nicht zusammengelegt werden:
-Sie haben nur eine Parzelle ausgewählt.
-
-Wählen Sie Land auf beiden Parzellen aus.
-	</notification>
-	<notification name="CannotJoinLandSelection">
-		Land kann nicht zusammengelegt werden:
-Sie müssen mehrere Parzellen auswählen.
-
-Wählen Sie Land auf beiden Parzellen aus.
-	</notification>
-	<notification name="JoinLandWarning">
-		Beim Zusammenlegen entsteht aus den vom Auswahlrechteck
-erfassten Parzellen eine große Parzelle.
-Sie müssen der neuen Parzelle einen Namen geben und ihre Optionen festlegen.
-
-Land zusammenlegen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmNotecardSave">
-		Um das Objekt kopieren oder anzeigen zu können, müssen Sie zuerst diese Notizkarte speichern. Notizkarte speichern?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmItemCopy">
-		Dieses Objekt in Ihr Inventar kopieren?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Kopieren"/>
-	</notification>
-	<notification name="ResolutionSwitchFail">
-		Auflösung konnte nicht auf [RESX] x [RESY] gesetzt werden
-	</notification>
-	<notification name="ErrorUndefinedGrasses">
-		Fehler: Nicht definierte Gräser: [SPECIES]
-	</notification>
-	<notification name="ErrorUndefinedTrees">
-		Fehler: Nicht definierte Bäume: [SPECIES]
-	</notification>
-	<notification name="CannotSaveWearableOutOfSpace">
-		„[NAME]“ konnte nicht in Kleidungsdatei gespeichert werden.  Geben Sie Speicherplatz auf dem Computer frei und speichern Sie das Kleidungsstück erneut.
-	</notification>
-	<notification name="CannotSaveToAssetStore">
-		[NAME] kann nicht in Zentral-Asset-Speicher geladen werden.
-Dies ist ein temporärer Fehler. Bitte passen Sie das Kleidungsstück in einigen Minuten noch einmal an und speichern Sie es erneut.
-	</notification>
-	<notification name="YouHaveBeenLoggedOut">
-		Sie wurden von [SECOND_LIFE] abgemeldet:
-            [MESSAGE]
-Klicken Sie auf „IM &amp; Chat anzeigen“, um vorhandene Nachrichten und Chat weiterhin anzuzeigen. Klicken Sie andernfalls auf „Beenden“, um [APP_NAME] sofort zu beenden.
-		<usetemplate name="okcancelbuttons" notext="Beenden" yestext="IM &amp; Chat anzeigen"/>
-	</notification>
-	<notification name="OnlyOfficerCanBuyLand">
-		Landkauf für Gruppe nicht möglich:
-Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen.
-	</notification>
-	<notification label="Freund hinzufügen" name="AddFriend">
-		Freunde können sich gegenseitig die Berechtigung erteilen, sich auf der Karte zu verfolgen und Online-Status Benachrichtigungen zu empfangen.
-
-[NAME] Freundschaft anbieten?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification label="Freund hinzufügen" name="AddFriendWithMessage">
-		Freunde können sich gegenseitig die Berechtigung erteilen, sich auf der Karte zu verfolgen und Online-Status Benachrichtigungen zu empfangen.
-
-[NAME] Freundschaft anbieten?
-		<form name="form">
-			<input name="message">
-				Wollen wir Freunde sein?
-			</input>
-			<button name="Offer" text="OK"/>
-			<button name="Cancel" text="Abbrechen"/>
-		</form>
-	</notification>
-	<notification name="RemoveFromFriends">
-		Möchten Sie [FIRST_NAME] [LAST_NAME] aus Ihrer Freundesliste entfernen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="RemoveMultipleFromFriends">
-		Möchten Sie mehrere Freunde aus Ihrer Freundesliste entfernen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="GodDeleteAllScriptedPublicObjectsByUser">
-		Möchten Sie alle geskripteten Objekte von
-** [AVATAR_NAME] **
-auf allen anderen Ländern in diesem Sim löschen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="GodDeleteAllScriptedObjectsByUser">
-		Möchten Sie ALLE geskripteten Objekte von
-** [AVATAR_NAME] **
-auf ALLEN LÄNDERN in diesem Sim LÖSCHEN?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="GodDeleteAllObjectsByUser">
-		Möchten Sie ALLE Objekte (einschließlich geskriptete) von
-** [AVATAR_NAME] **
-auf ALLEN LÄNDERN in diesem Sim LÖSCHEN?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="BlankClassifiedName">
-		Geben Sie einen Namen für die Anzeige ein.
-	</notification>
-	<notification name="MinClassifiedPrice">
-		Der Mindestbetrag für die Listung ist [MIN_PRICE] L$.
-
-Geben sie einen höheren Betrag ein.
-	</notification>
-	<notification name="ConfirmObjectDeleteLock">
-		Mindestens ein ausgewähltes Objekt ist gesperrt.
-
-Möchten Sie diese Objekte löschen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteNoCopy">
-		Mindestens ein ausgewähltes Objekt kann nicht kopiert werden.
-
-Möchten Sie diese Objekte löschen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteNoOwn">
-		Mindestens eines der ausgewählten Objekt gehört nicht Ihnen.
-
-Möchten Sie diese Objekte löschen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteLockNoCopy">
-		Mindestens ein Objekt ist gesperrt.
-Mindestens ein Objekt kann nicht kopiert werden.
-
-Möchten Sie diese Objekte löschen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteLockNoOwn">
-		Mindestens ein Objekt ist gesperrt.
-Mindestens ein Objekt gehört nicht Ihnen.
-
-Möchten Sie diese Objekte löschen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteNoCopyNoOwn">
-		Mindestens ein Objekt kann nicht kopiert werden.
-Mindestens ein Objekt gehört nicht Ihnen.
-
-Möchten Sie diese Objekte löschen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
-		Mindestens ein Objekt ist gesperrt.
-Mindestens ein Objekt kann nicht kopiert werden.
-Mindestens ein Objekt gehört nicht Ihnen.
-
-Möchten Sie diese Objekte löschen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectTakeLock">
-		Mindestens ein Objekt ist gesperrt.
-
-Möchten Sie diese Objekte nehmen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectTakeNoOwn">
-		Nicht alle Objekte, die Sie aufgenommen haben, gehören Ihnen.
-Wenn Sie fortfahren, werden die Rechte für den nächsten Eigentümer angewandt und Sie können die Objekte möglicherweise nicht bearbeiten oder kopieren.
-
-Möchten Sie diese Objekte nehmen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectTakeLockNoOwn">
-		Mindestens ein Objekt ist gesperrt.
-Nicht alle Objekte, die Sie aufgenommen haben, gehören Ihnen.
-Wenn Sie fortfahren, werden die Rechte für den nächsten Eigentümer abgefragt und Sie können die Objekte möglicherweise nicht bearbeiten oder kopieren.
-Die aktuelle Auswahl können Sie jedoch aufnehmen.
-
-Möchten Sie diese Objekte nehmen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="CantBuyLandAcrossMultipleRegions">
-		Landkauf nicht möglich, da die Auswahl mehrere Regionen umfasst.
-
-Wählen Sie ein kleineres Gebiet und versuchen Sie es erneut.
-	</notification>
-	<notification name="DeedLandToGroup">
-		Die Schenkung dieser Parzelle setzt voraus, dass die Gruppe über ausreichende Landnutzungsrechte verfügt.
-Dem Eigentümer wird der Kaufpreis für das Land nicht rückerstattet. Bei Verkauf der übertragenen Parzelle wird der Erlös zwischen den Gruppenmitgliedern aufgeteilt.
-
-Der Gruppe „[GROUP_NAME]“
- [AREA] m² Land schenken?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="DeedLandToGroupWithContribution">
-		Die Schenkung dieser Parzelle setzt voraus, dass die Gruppe über ausreichende Landnutzungsrechte verfügt.
-Die Schenkung beinhaltet eine Landübertragung an die Gruppe von „[FIRST_NAME] [LAST_NAME]“.
-Dem Eigentümer wird der Kaufpreis für das Land nicht rückerstattet. Bei Verkauf der übertragenen Parzelle wird der Erlös zwischen den Gruppenmitgliedern aufgeteilt.
-
-Der Gruppe „[GROUP_NAME]“
- [AREA] m² Land schenken?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="DisplaySetToSafe">
-		Es wurden sichere Anzeige-Einstellungen gewählt, da die Option -safe verwendet wurde.
-	</notification>
-	<notification name="DisplaySetToRecommended">
-		Es wurden die für Ihre Systemkonfiguration empfohlenen Anzeige-Einstellungen gewählt.
-	</notification>
-	<notification name="ErrorMessage">
-		[ERROR_MESSAGE]
-	</notification>
-	<notification name="AvatarMovedDesired">
-		Ihr gewünschter Zielort ist zurzeit nicht verfügbar.
-Sie wurden zur nächstgelegenen Region teleportiert.
-	</notification>
-	<notification name="AvatarMovedLast">
-		Ihr letzter Standort ist zurzeit nicht verfügbar.
-Sie wurden zur nächstgelegenen Region teleportiert.
-	</notification>
-	<notification name="AvatarMovedHome">
-		Ihr Heimatort ist zurzeit nicht verfügbar.
-Sie wurden zur nächstgelegenen Region teleportiert.
-Sie müssen eventuell einen neuen Heimatort festlegen.
-	</notification>
-	<notification name="ClothingLoading">
-		Ihre Kleidung wird noch heruntergeladen.
-Sie können [SECOND_LIFE] normal verwenden. Andere Benutzer können Sie korrekt dargestellt sehen.
-		<form name="form">
-			<ignore name="ignore" text="Das Herunterladen der Kleidung dauert lange"/>
-		</form>
-	</notification>
-	<notification name="FirstRun">
-		Die Installation von [APP_NAME] ist abgeschlossen.
-
-Wenn Sie [SECOND_LIFE] das erste Mal verwenden, müssen Sie ein Konto anlegen, bevor Sie sich anmelden können.
-Möchten Sie auf www.secondlife.com ein Konto erstellen?
-		<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Neues Konto..."/>
-	</notification>
-	<notification name="LoginPacketNeverReceived">
-		Es gibt Probleme mit der Verbindung. Möglicherweise besteht ein Problem mit Ihrer Internetverbindung oder dem [SECOND_LIFE_GRID].
-
-Überprüfen Sie Ihre Internetverbindung und versuchen Sie es dann erneut, oder klicken Sie auf Hilfe, um zu [SUPPORT_SITE] zu gelangen, oder klicken Sie auf Teleportieren, um nach Hause zu teleportieren.
-		<url name="url">
-			http://de.secondlife.com/support/
-		</url>
-		<form name="form">
-			<button name="OK" text="OK"/>
-			<button name="Help" text="Hilfe"/>
-			<button name="Teleport" text="Teleportieren"/>
-		</form>
-	</notification>
-	<notification name="WelcomeChooseSex">
-		Ihr Avatar erscheint jeden Moment.
-
-Benutzen Sie die Pfeiltasten, um sich fortzubewegen.
-Drücken Sie F1 für Hilfe oder für weitere Informationen über [SECOND_LIFE].
-Bitte wählen Sie einen männlichen oder weiblichen Avatar.
-Sie können sich später noch umentscheiden.
-		<usetemplate name="okcancelbuttons" notext="Weiblich" yestext="Männlich"/>
-	</notification>
-	<notification name="NotEnoughCurrency">
-		[NAME] [PRICE] L$  Sie haben nicht genügend L$, um diese Aktion auszuführen.
-	</notification>
-	<notification name="GrantedModifyRights">
-		[FIRST_NAME] [LAST_NAME] hat Ihnen die Erlaubnis erteilt, ihre/seine Objekte zu bearbeiten.
-	</notification>
-	<notification name="RevokedModifyRights">
-		Ihnen wurden die Änderungsrechte für die Objekte von [FIRST_NAME] [LAST_NAME] entzogen.
-	</notification>
-	<notification name="FlushMapVisibilityCaches">
-		Der Kartencache dieser Region wird geleert.
-Diese Aktion ist nur beim Debugging sinnvoll.
-(Auf dem Produktionssystem warten Sie einfach 5 Minuten. Die Karten werden nach erneuter Anmeldung automatisch aktualisiert.)
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="BuyOneObjectOnly">
-		Sie können jeweils nur ein Objekt kaufen.  Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut.
-	</notification>
-	<notification name="OnlyCopyContentsOfSingleItem">
-		Es kann nur jeweils der Inhalt von einem Objekt kopiert werden.
-Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut.
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="KickUsersFromRegion">
-		Alle Einwohner in dieser Region nach Hause teleportieren?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="EstateObjectReturn">
-		Möchten Sie wirklich alle Objekte zurückgeben, die [USER_NAME] gehören?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="InvalidTerrainBitDepth">
-		Die Regionstexturen konnten nicht festgelegt werden:
-Die Terraintextur [TEXTURE_NUM] hat eine ungültige Bit-Tiefe [TEXTURE_BIT_DEPTH].
-
-Ersetzen Sie die Textur [TEXTURE_NUM] mit einer Bilddatei von maximal 512x512 und 24 Bit und klicken Sie dann erneut auf „Übernehmen“.
-	</notification>
-	<notification name="InvalidTerrainSize">
-		Die Regionstexturen konnten nicht festgelegt werden:
-Die Terraintextur [TEXTURE_NUM] ist mit [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y] zu groß.
-
-Ersetzen Sie die Textur [TEXTURE_NUM] mit einer Bilddatei von maximal 512x512 und 24 Bit und klicken Sie dann erneut auf „Übernehmen“.
-	</notification>
-	<notification name="RawUploadStarted">
-		Hochladen gestartet. Je nach Verbindungsgeschwindigkeit kann der Vorgang bis zu 2 Minuten dauern.
-	</notification>
-	<notification name="ConfirmBakeTerrain">
-		Möchten Sie das aktuelle Terrain formen, es zum Mittelpunkt der oberen und unteren Terraingrenzen und zum Standard des „Zurücksetzen“-Tools machen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="MaxAllowedAgentOnRegion">
-		Es sind maximal [MAX_AGENTS] zulässige Einwohner erlaubt.
-	</notification>
-	<notification name="MaxBannedAgentsOnRegion">
-		Es sind maximal [MAX_BANNED] verbannte Einwohner erlaubt.
-	</notification>
-	<notification name="MaxAgentOnRegionBatch">
-		Fehler beim Versuch, [NUM_ADDED] Agenten hinzuzufügen:
-Überschreitet den Grenzwert [MAX_AGENTS] [LIST_TYPE] um [NUM_EXCESS].
-	</notification>
-	<notification name="MaxAllowedGroupsOnRegion">
-		Es sind maximal [MAX_GROUPS] zulässige Gruppen erlaubt.
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Formen"/>
-	</notification>
-	<notification name="MaxManagersOnRegion">
-		Es sind maximal [MAX_MANAGER]  verbannte Einwohner erlaub.
-	</notification>
-	<notification name="OwnerCanNotBeDenied">
-		Der Eigentümer des Grundstücks kann nicht zur Liste der „Verbannten Einwohner“ hinzugefügt werden.
-	</notification>
-	<notification name="CanNotChangeAppearanceUntilLoaded">
-		Das Aussehen lässt sich erst ändern, wenn Kleider und Form/Gestalt geladen sind.
-	</notification>
-	<notification name="ClassifiedMustBeAlphanumeric">
-		Der Name der Anzeige muss mit einem Buchstaben von A bis Z oder einer Ziffer beginnen.  Satzzeichen sind nicht erlaubt.
-	</notification>
-	<notification name="CantSetBuyObject">
-		„Objekt kaufen“ nicht möglich, da das Objekt nicht zum Verkauf freigegeben ist.
-Geben Sie das Objekt zum Verkauf frei und versuchen Sie es erneut.
-	</notification>
-	<notification name="FinishedRawDownload">
-		Raw-Terrain-Datei wurde heruntergeladen nach:
-[DOWNLOAD_PATH].
-	</notification>
-	<notification name="DownloadWindowsMandatory">
-		Eine neue Version von [APP_NAME] ist verfügbar.
-[MESSAGE]
-Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können.
-		<usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/>
-	</notification>
-	<notification name="DownloadWindows">
-		Eine aktualisierte Version von [APP_NAME] ist verfügbar.
-[MESSAGE]
-Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden.
-		<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/>
-	</notification>
-	<notification name="DownloadWindowsReleaseForDownload">
-		Eine aktualisierte Version von [APP_NAME] ist verfügbar.
-[MESSAGE]
-Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden.
-		<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/>
-	</notification>
-	<notification name="DownloadLinuxMandatory">
-		Eine neue Version von [SUPPORT_SITE] ist verfügbar.
-[MESSAGE]
-Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können.
-		<usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/>
-	</notification>
-	<notification name="DownloadLinux">
-		Eine neue Version von [APP_NAME] ist verfügbar.
-[MESSAGE]
-Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden.
-		<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/>
-	</notification>
-	<notification name="DownloadLinuxReleaseForDownload">
-		Eine neue Version von [APP_NAME] ist verfügbar.
-[MESSAGE]
-Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden.
-		<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/>
-	</notification>
-	<notification name="DownloadMacMandatory">
-		Eine neue Version von [APP_NAME] ist verfügbar.
-[MESSAGE]
-Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können.
-
-In Ihren Anwendungsordner herunterladen?
-		<usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/>
-	</notification>
-	<notification name="DownloadMac">
-		Eine aktualisierte Version von [APP_NAME] ist verfügbar.
-[MESSAGE]
-Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden.
-
-In Ihren Anwendungsordner herunterladen?
-		<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/>
-	</notification>
-	<notification name="DownloadMacReleaseForDownload">
-		Eine aktualisierte Version von [APP_NAME] ist verfügbar.
-[MESSAGE]
-Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden.
-
-In Ihren Anwendungsordner herunterladen?
-		<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/>
-	</notification>
-	<notification name="DeedObjectToGroup">
-		Bei Übertragung dieses Objekts erhält die Gruppe:
-* An das Objekt bezahlte L$
-		<usetemplate ignoretext="Bestätigen, bevor ich ein Objekt an eine Gruppe übertrage" name="okcancelignore" notext="Abbrechen" yestext="Übertragung"/>
-	</notification>
-	<notification name="WebLaunchExternalTarget">
-		Möchten Sie Ihren Internetbrowser öffnen, um diesen Inhalt anzuzeigen?
-		<usetemplate ignoretext="Meinen Browser starten, um eine Webseite anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchJoinNow">
-		de.secondlife.com öffnen, um Ihr Konto zu verwalten?
-		<usetemplate ignoretext="Meinen Browser starten, um mein Konto zu verwalten" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchSecurityIssues">
-		Informieren Sie sich im [SECOND_LIFE] Wiki, wie man Sicherheitsprobleme richtig meldet.
-		<usetemplate ignoretext="Meinen Browser starten, um anzuzeigen, wie ein Sicherheitsproblem gemeldet werden soll" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchQAWiki">
-		Besuchen Sie das [SECOND_LIFE] QA-Wiki.
-		<usetemplate ignoretext="Meinen Browser starten, um das QA-Wiki anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchPublicIssue">
-		Im [SECOND_LIFE] Allgemeine-Fragen-Tracker können Sie Fehler und andere Probleme melden.
-		<usetemplate ignoretext="Meinen Browser starten, um die Datenbank für Fehler und Verbesserungsvorschläge anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/>
-	</notification>
-	<notification name="WebLaunchSupportWiki">
-		Im offiziellen Linden-Blog finden Sie die neuesten Nachrichten und Informationen.
-		<usetemplate ignoretext="Meinen Browser starten, um das Blog anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchLSLGuide">
-		Möchten Sie den Scripting Guide öffnen?
-		<usetemplate ignoretext="Meinen Browser starten, um den Scripting Guide anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchLSLWiki">
-		Möchten Sie das LSL-Portal besuchen?
-		<usetemplate ignoretext="Meinen Browser starten, um das LSL-Portal anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/>
-	</notification>
-	<notification name="ReturnToOwner">
-		Möchten Sie die ausgewählten Objekte an ihre Eigentümer zurückgeben? Transferierbare übertragene Objekte werden ihren früheren Eigentümern zurückgegeben.
-
-*WARNUNG* Nicht transferierbare übertragene Objekte werden dabei gelöscht!
-		<usetemplate ignoretext="Bestätigen, bevor Objekte an Ihre Eigentümer zurückgegeben werden" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="GroupLeaveConfirmMember">
-		Sie sind Mitglied der Gruppe [GROUP].
-Diese Gruppe verlassen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmKick">
-		Möchten Sie WIRKLICH alle Benutzer aus dem Grid werfen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Alle Benutzer hinauswerfen"/>
-	</notification>
-	<notification name="MuteLinden">
-		Lindens können nicht stummgeschaltet werden.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="CannotStartAuctionAlreadyForSale">
-		Eine Parzelle, die bereits zum Verkauf freigegeben ist, kann nicht versteigert werden.  Deaktivieren Sie den Landverkauf, wenn Sie das Land zur Versteigerung freigeben möchten.
-	</notification>
-	<notification label="Objekt nach Name stummschalten fehlgeschlagen" name="MuteByNameFailed">
-		Dieser Name ist bereits stummgeschaltet.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="RemoveItemWarn">
-		Diese Aktion ist zwar erlaubt, aber beim Löschen von Inhalten wird das Objekt beschädigt. Möchten Sie dieses Element löschen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="CantOfferCallingCard">
-		Sie können gerade keine Visitenkarte übergeben. Warten Sie kurz und versuchen Sie es dann noch einmal.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="CantOfferFriendship">
-		Sie können gerade keine Freundschaft anbieten. Warten Sie kurz und versuchen Sie es dann noch einmal.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="BusyModeSet">
-		Beschäftigt-Modus ist aktiviert.
-Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachrichten) erhalten Ihre Beschäftigt-Antwort. Alle Teleport-Angebote werden abgelehnt. Alle Inventar-Angebote werden in Ihren Papierkorb geschoben.
-		<usetemplate ignoretext="Ich ändere meinen Status zu Beschäftigt" name="okignore" yestext="OK"/>
-	</notification>
-	<notification name="JoinedTooManyGroupsMember">
-		Sie haben die maximale Anzahl an Gruppen erreicht. Bitte verlassen Sie eine andere Gruppe, um dieser beitreten zu können oder lehnen Sie das Angebot ab.
-[NAME]  hat Sie eingeladen, einer Gruppe beizutreten.
-[INVITE]
-		<usetemplate name="okcancelbuttons" notext="Ablehnen" yestext="Beitreten"/>
-	</notification>
-	<notification name="KickUser">
-		Beim Hinauswerfen dieses Benutzers welche Meldung anzeigen?
-		<form name="form">
-			<input name="message">
-				Sie wurden von einem Administrator abgemeldet.
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Abbrechen"/>
-		</form>
-	</notification>
-	<notification name="KickAllUsers">
-		Beim Hinauswerfen aller Personen vom Grid welche Meldung anzeigen?
-		<form name="form">
-			<input name="message">
-				Sie wurden von einem Administrator abgemeldet.
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Abbrechen"/>
-		</form>
-	</notification>
-	<notification name="FreezeUser">
-		Beim Einfrieren dieses Benutzers welche Meldung anzeigen?
-		<form name="form">
-			<input name="message">
-				Sie wurden eingefroren. Bewegen oder Chatten ist nicht mehr möglich. Ein Administrator wird sich über IM an Sie wenden
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Abbrechen"/>
-		</form>
-	</notification>
-	<notification name="UnFreezeUser">
-		Beim Auftauen dieses Benutzers welche Meldung anzeigen?
-		<form name="form">
-			<input name="message">
-				Sie sind nicht mehr eingefroren.
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Abbrechen"/>
-		</form>
-	</notification>
-	<notification name="OfferTeleport">
-		Teleport an Ihre Position mit der folgenden Meldung anbieten?
-		<form name="form">
-			<input name="message">
-				Triff mich in [REGION]
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Abbrechen"/>
-		</form>
-	</notification>
-	<notification name="OfferTeleportFromGod">
-		Benutzer an Ihrem Standort herbeirufen?
-		<form name="form">
-			<input name="message">
-				Triff mich in [REGION]
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Abbrechen"/>
-		</form>
-	</notification>
-	<notification name="TeleportFromLandmark">
-		Möchten Sie sich wirklich teleportieren?
-		<usetemplate ignoretext="Bestätigen, dass ich zu einer Landmarke teleportieren möchte" name="okcancelignore" notext="Abbrechen" yestext="Teleportieren"/>
-	</notification>
-	<notification name="TeleportToPick">
-		Nach [PICK] teleportieren?
-		<usetemplate ignoretext="Bestätigen, dass ich zu einer Position in Auswahl teleportieren möchte" name="okcancelignore" notext="Abbrechen" yestext="Teleportieren"/>
-	</notification>
-	<notification label="Nachricht an alle auf diesem Grundstück" name="MessageEstate">
-		Geben Sie eine kurze Nachricht ein, die an jede Person auf Ihrem Grundstück gesendet wird.
-		<form name="form">
-			<input name="message"/>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Abbrechen"/>
-		</form>
-	</notification>
-	<notification label="Linden-Grundstück ändern" name="ChangeLindenEstate">
-		Sie sind im Begriff, ein Grundstück in Linden-Besitz (Mainland, Teen-Raster, Orientierung usw.) zu verändern.
-
-Dies ist ÄUSSERST GEFÄHRLICH, da es grundlegende Auswirkungen auf das Benutzererlebnis hat.  Auf dem Mainland werden tausende Regionen geändert, was den Spaceserver stark belastet.
-
-Fortfahren?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification label="Zugang zu Linden-Grundstück ändern" name="ChangeLindenAccess">
-		Sie sind im Begriff, die Zugangsliste für ein Grundstück in Linden-Besitz (Mainland, Teen-Raster, Orientierung usw.) zu verändern.
-
-Dies ist GEFÄHRLICH und sollte nur erfolgen, um Objekte/L$ per Hack in und aus dem Raster zu entfernen.
-Tausende Regionen werden verändert und der Spaceserver wird dadurch stark belastet.
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification label="Grundstück wählen" name="EstateAllowedAgentAdd">
-		Nur für dieses Grundstück oder für alle [ALL_ESTATES] zur Erlaubnisliste hinzufügen?
-		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
-	</notification>
-	<notification label="Grundstück wählen" name="EstateAllowedAgentRemove">
-		Nur für dieses Grundstück oder für alle [ALL_ESTATES] von Erlaubnisliste entfernen?
-		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
-	</notification>
-	<notification label="Grundstück wählen" name="EstateAllowedGroupAdd">
-		Nur für dieses Grundstück oder für alle [ALL_ESTATES] zur Gruppen-Erlaubnisliste hinzufügen?
-		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
-	</notification>
-	<notification label="Grundstück wählen" name="EstateAllowedGroupRemove">
-		Nur für dieses Grundstück oder für alle [ALL_ESTATES] von Gruppen-Erlaubnisliste entfernen?
-		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
-	</notification>
-	<notification label="Grundstück wählen" name="EstateBannedAgentAdd">
-		Zugang nur für dieses Grundstück oder für [ALL_ESTATES] verweigern?
-		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
-	</notification>
-	<notification label="Grundstück wählen" name="EstateBannedAgentRemove">
-		Einwohner nur für dieses Grundstück oder für alle [ALL_ESTATES] von der Bannliste entfernen?
-		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
-	</notification>
-	<notification label="Grundstück wählen" name="EstateManagerAdd">
-		Verwalter nur für dieses Grundstück oder für [ALL_ESTATES] festlegen?
-		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
-	</notification>
-	<notification label="Grundstück wählen" name="EstateManagerRemove">
-		Verwalter nur für dieses Grundstück oder für [ALL_ESTATES] entfernen?
-		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
-	</notification>
-	<notification label="Rauswurf bestätigen" name="EstateKickUser">
-		Benutzer [EVIL_USER] von diesem Grundstück werfen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="EstateChangeCovenant">
-		Möchten Sie den Grundstücksvertrag wirklich ändern?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="RegionEntryAccessBlocked">
-		Sie dürfen diese Region aufgrund Ihrer Alterseinstufung nicht betreten. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind.
-
-Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben und besuchen Sie unsere Knowledgebase, um mehr über Regionen mit dieser Altereinstufung zu erfahren.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="RegionEntryAccessBlocked_KB">
-		Sie dürfen diese Region aufgrund Ihrer Alterseinstufung nicht betreten.
-
-Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten?
-		<url name="url">
-			http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB)
-		</url>
-		<usetemplate ignoretext="Ich kann diese Region aufgrund der Alterseinstufung nicht betreten" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
-	</notification>
-	<notification name="RegionEntryAccessBlocked_Notify">
-		Aufgrund Ihrer Alterseinstufung dürfen Sie diese Region nicht betreten.
-	</notification>
-	<notification name="RegionEntryAccessBlocked_Change">
-		Sie dürfen diese Region aufgrund der Einstellung Ihrer Alterseinstufung nicht betreten.
-
-Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten &gt; Einstellungen... &gt; Allgemein.
-		<form name="form">
-			<button name="OK" text="Einstellung ändern"/>
-			<button name="Cancel" text="Schließen"/>
-			<ignore name="ignore" text="Meine Alterseinstufung lässt nicht zu, dass ich eine Region betrete."/>
-		</form>
-	</notification>
-	<notification name="LandClaimAccessBlocked">
-		Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind.
-
-Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben und besuchen Sie unsere Knowledgebase, um mehr über Regionen mit dieser Altereinstufung zu erfahren.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="LandClaimAccessBlocked_KB">
-		Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land.
-
-Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten?
-		<url name="url">
-			http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB)
-		</url>
-		<usetemplate ignoretext="Ich habe aufgrund der Alterseinstufung keinen Anspruch auf dieses Land" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
-	</notification>
-	<notification name="LandClaimAccessBlocked_Notify">
-		Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land.
-	</notification>
-	<notification name="LandClaimAccessBlocked_Change">
-		Sie haben aufgrund der Einstellung Ihrer Alterseinstufung keinen Anspruch auf dieses Land.
-
-Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten &gt; Einstellungen... &gt; Allgemein.
-		<usetemplate ignoretext="Meine Alterseinstufung lässt nicht zu, dass ich auf Land Anspruch erhebe" name="okcancelignore" notext="Schließen" yestext="Einstellung ändern"/>
-	</notification>
-	<notification name="LandBuyAccessBlocked">
-		Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind.
-
-Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben und besuchen Sie unsere Knowledgebase, um mehr über Regionen mit dieser Altereinstufung zu erfahren.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="LandBuyAccessBlocked_KB">
-		Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen.
-
-Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten?
-		<url name="url">
-			http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB)
-		</url>
-		<usetemplate ignoretext="Ich kann aufgrund der Alterseinstufung dieses Land nicht kaufen" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
-	</notification>
-	<notification name="LandBuyAccessBlocked_Notify">
-		Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen.
-	</notification>
-	<notification name="LandBuyAccessBlocked_Change">
-		Sie können aufgrund Ihrer Einstellung für Alterseinstufung dieses Land nicht kaufen.
-
-Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten &gt; Einstellungen... &gt; Allgemein.
-		<usetemplate ignoretext="Meine Alterseinstufung lässt nicht zu, dass ich Land kaufe" name="okcancelignore" notext="Schließen" yestext="Einstellung ändern"/>
-	</notification>
-	<notification name="TooManyPrimsSelected">
-		&quot;Zu viele Prims wurden ausgewählt.  Bitte wählen Sie höchstens [MAX_PRIM_COUNT] Prims aus und versuchen Sie es erneut.&quot;
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="ProblemImportingEstateCovenant">
-		Problem beim Import des Grundstückvertrags.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="ProblemAddingEstateManager">
-		Es gibt Probleme beim Hinzufügen eines neuen Grundstücksverwalters.  Bei mindestens einem Grundstück ist die Verwalterliste voll.
-	</notification>
-	<notification name="ProblemAddingEstateGeneric">
-		Problem beim Hinzufügen zu dieser Grundstücksliste.  Bei mindestens einem Grundstück ist die Liste voll.
-	</notification>
-	<notification name="UnableToLoadNotecardAsset">
-		Notizkarten-Asset konnte nicht geladen werden.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="NotAllowedToViewNotecard">
-		Unzureichende Rechte, um die mit der angeforderten Asset-ID verbundene Notizkarte anzuzeigen.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="MissingNotecardAssetID">
-		Asset-ID für Notizkarte fehlt in Datenbank.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="PublishClassified">
-		Hinweis: Anzeigengebühren werden nicht zurückerstattet.
-
-Anzeige für [AMOUNT] L$ veröffentlichen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="SetClassifiedMature">
-		Enthält diese Anzeige Mature-Inhalte?
-		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nein" yestext="Ja"/>
-	</notification>
-	<notification name="SetGroupMature">
-		Beschäftigt sich diese Gruppe mit Mature-Inhalten?
-		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nein" yestext="Ja"/>
-	</notification>
-	<notification label="Neustart bestätigen" name="ConfirmRestart">
-		Möchten Sie diese Region in 2 Minuten neu starten?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification label="Nachricht an alle in dieser Region" name="MessageRegion">
-		Geben Sie eine kurze Nachricht ein, die an jede Person in dieser Region gesendet wird.
-		<form name="form">
-			<input name="message"/>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Abbrechen"/>
-		</form>
-	</notification>
-	<notification label="Alterseinstufung der Region ändern" name="RegionMaturityChange">
-		Die Alterseinstufung dieser Region wurde aktualisiert.
-Es kann eine Weile dauern, bis sich die Änderung auf die Karte auswirkt.
-	</notification>
-	<notification label="Falsche Voice-Version" name="VoiceVersionMismatch">
-		Diese Version von [APP_NAME] mit dem Voice-Chat-Feature in dieser Region nicht kompatibel. Damit Voice-Chat funktioniert, müssen Sie [APP_NAME] aktualisieren.
-	</notification>
-	<notification label="Objekte können nicht gekauft werden" name="BuyObjectOneOwner">
-		Objekte können nicht von mehreren Eigentümern gleichzeitig gekauft werden.
-Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut.
-	</notification>
-	<notification label="Inhalte können nicht gekauft werden" name="BuyContentsOneOnly">
-		Inhalte können jeweils nur für ein Objekt gekauft werden.
-Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut.
-	</notification>
-	<notification label="Inhalte können nicht gekauft werden" name="BuyContentsOneOwner">
-		Objekte können nicht von mehreren Eigentümern gleichzeitig gekauft werden.
-Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut.
-	</notification>
-	<notification name="BuyOriginal">
-		Von [OWNER] Originalobjekt für [PRICE] L$ kaufen?
-Sie werden der Eigentümer dieses Objekts.
-Sie können das Objekt:
- Bearbeiten: [MODIFYPERM]
- Kopieren: [COPYPERM]
- Verkaufen oder weggeben: [RESELLPERM]
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="BuyOriginalNoOwner">
-		Originalobjekt für [PRICE] L$ kaufen?
-Sie werden der Eigentümer dieses Objekts.
-Sie können das Objekt:
- Bearbeiten: [MODIFYPERM]
- Kopieren: [COPYPERM]
- Verkaufen oder weggeben: [RESELLPERM]
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="BuyCopy">
-		Von [OWNER] Kopie für [PRICE] L$ kaufen?
-Das Objekt wird in Ihr Inventar kopiert.
-Sie können das Objekt:
- Bearbeiten: [MODIFYPERM]
- Kopieren: [COPYPERM]
- Verkaufen oder weggeben: [RESELLPERM]
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="BuyCopyNoOwner">
-		Kopie für [PRICE] L$ kaufen?
-Das Objekt wird in Ihr Inventar kopiert.
-Sie können das Objekt:
- Bearbeiten: [MODIFYPERM]
- Kopieren: [COPYPERM]
- Verkaufen oder weggeben: [RESELLPERM]
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="BuyContents">
-		Von [OWNER] Inhalte für [PRICE] L$ kaufen?
-Die Inhalte werden in Ihr Inventar kopiert.
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="BuyContentsNoOwner">
-		Inhalte für [PRICE] L$ kaufen?
-Die Inhalte werden in Ihr Inventar kopiert.
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmPurchase">
-		Transaktion:
-[ACTION]
-
-Möchten Sie diesen Kauf fortsetzen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmPurchasePassword">
-		Transaktion:
-[ACTION]
-
-Möchten Sie diesen Kauf fortsetzen?
-Geben Sie Ihr Kennwort erneut ein und klicken Sie auf OK.
-		<form name="form">
-			<input name="message"/>
-			<button name="ConfirmPurchase" text="OK"/>
-			<button name="Cancel" text="Abbrechen"/>
-		</form>
-	</notification>
-	<notification name="SetPickLocation">
-		Hinweis:
-Sie haben die Position dieser Auswahl aktualisiert, aber die anderen Daten behalten ihre ursprünglichen Werte.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="MoveInventoryFromObject">
-		Sie haben „nicht kopierfähige“ Inventarobjekte ausgewählt.
-Diese Objekte werden nicht kopiert, sondern in Ihr Inventar verschoben.
-
-Inventarobjekt(e) verschieben?
-		<usetemplate ignoretext="Warnhinweis anzeigen, bevor ich nicht kopierbare Artikel aus einem Objekt verschiebe" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="MoveInventoryFromScriptedObject">
-		Sie haben „nicht kopierfähige“ Inventarobjekte ausgewählt.  Diese Objekte werden nicht kopiert, sondern in Ihr Inventar verschoben.
-Da es sich um ein geskriptetes Objekt handelt, geht die Skriptfunktion beim Verschieben in das Inventar möglicherweise verloren.
-
-Inventarobjekt(e) verschieben?
-		<usetemplate ignoretext="Warnhinweis anzeigen, bevor ich nicht-kopierbare Artikel verschiebe, die ein geskriptetes Objekt beschädigen können" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ClickActionNotPayable">
-		Achtung: Die Klickaktion „Objekt bezahlen&quot; wurde eingestellt. Diese funktioniert jedoch nicht, wenn ein Skript mit einer Geldtransaktion () hinzugefügt wird.
-		<form name="form">
-			<ignore name="ignore" text="I habe die Aktion „Objekt bezahlen&quot; eingestellt, während ich ein Objekt gebaut habe, dass kein Geld()-Skript enthält."/>
-		</form>
-	</notification>
-	<notification name="OpenObjectCannotCopy">
-		Sie haben keine Berechtigung zum Kopieren von Elementen in diesem Objekt.
-	</notification>
-	<notification name="WebLaunchAccountHistory">
-		de.secondlife.com öffnen, um Ihre Konto-Statistik anzuzeigen?
-		<usetemplate ignoretext="Meinen Browser starten, um meine Konto-Statistik anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/>
-	</notification>
-	<notification name="ConfirmQuit">
-		Wirklich beenden?
-		<usetemplate ignoretext="Bestätigen, bevor Sitzung beendet wird" name="okcancelignore" notext="Nicht beenden" yestext="Beenden"/>
-	</notification>
-	<notification name="HelpReportAbuseEmailLL">
-		Verwenden Sie dieses Tool, um Verletzungen der Servicebedingungen und Community-Standards zu melden. Siehe:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
-
-Alle gemeldeten Verletzungen der Servicebedingungen und Community-Standards werden geprüft und geklärt Sie können den Prozess im Incident Report (Vorfallsbericht) verfolgen:
-
-http://secondlife.com/support/incidentreport.php
-	</notification>
-	<notification name="HelpReportAbuseEmailEO">
-		WICHTIG: Diese Meldung wird an den Eigentümer der Region gesendet, in der Sie sich gerade befinden, nicht an Linden Lab.
--
-Als besonderen Service für Einwohner und Besucher übernimmt der Eigentümer dieser Region die Bearbeitung aller anfallenden Meldungen. Von diesem Standort aus eingereichte Meldungen werden nicht von Linden Lab bearbeitet. Der Eigentümer der Region bearbeitet Meldungen auf Grundlage der Richtlinien, die im für diese Region geltenden Grundstücksvertrag festgelegt sind.
-(Den Vertrag können Sie unter „Welt“ &gt; „Land-Info“ einsehen.)
--
-Das Resultat, das sich aus dieser Meldung ergibt, betrifft nur diese Region; der Einwohnerzugang zu anderen Bereichen von [SECOND_LIFE] ist davon nicht betroffen. Nur Linden Lab kann den Zugang zu [SECOND_LIFE] beschränken.
-	</notification>
-	<notification name="HelpReportAbuseSelectCategory">
-		Wählen Sie eine Missbrauchskategorie aus.
-Die Angabe einer Kategorie hilft uns bei der Bearbeitung des Berichts.
-	</notification>
-	<notification name="HelpReportAbuseAbuserNameEmpty">
-		Geben Sie den Namen des Täters ein.
-Eine genaue Angabe hilft uns, Fälle von Missbrauch zu ahnden.
-	</notification>
-	<notification name="HelpReportAbuseAbuserLocationEmpty">
-		Bitte geben Sie den Ort an, an dem der Missbrauch stattgefunden hat.
-Eine genaue Angabe hilft uns, Fälle von Missbrauch zu ahnden.
-	</notification>
-	<notification name="HelpReportAbuseSummaryEmpty">
-		Bitte geben Sie eine Zusammenfassung des Vorfalls ein.
-Eine genaue Zusammenfassung hilft uns, Fälle von Missbrauch zu ahnden.
-	</notification>
-	<notification name="HelpReportAbuseDetailsEmpty">
-		Bitte geben Sie eine ausführliche Beschreibung des Vorfalls ein.
-Eine möglichst genaue Beschreibung mit Namen und Einzelheiten hilft uns, Fälle von Missbrauch zu ahnden.
-	</notification>
-	<notification name="HelpReportAbuseContainsCopyright">
-		Sehr geehrte(r) Einwohner(in),
-
-Sie melden eine Urheberrechtsverletzung. Sind Sie wirklich sicher, dass Sie eine Verletzung des Urheberrechts melden möchten?
-
-1. Missbrauch melden. Wenn Sie der Meinung sind, ein Einwohner nutzt das Berechtigungssystem von [SECOND_LIFE] auf unerlaubte Weise zu seinem Vorteil aus, indem er zum Beispiel einen CopyBot oder ähnliche Kopiertools verwendet und damit eine Urheberrechtsverletzung begeht, können Sie diesen Missbrauch melden. Das Missbrauchsteam untersucht etwaige Verstöße gegen die [SECOND_LIFE] Community Standards oder die Nutzungsbedingungen und verhängt entsprechende Strafen. Das Missbrauchsteam ist jedoch nicht dafür zuständig, Inhalte aus der [SECOND_LIFE]-Welt zu entfernen und reagiert auch nicht auf entsprechende Anfragen.
-
-2. Der DMCA oder das Entfernen von Inhalten. Sie können das Entfernen von Inhalten aus [SECOND_LIFE] beantragen. Dazu MÜSSEN Sie eine Urheberrechtsverletzung gemäß den in unserer DMCA-Richtlinie unter http://secondlife.com/corporate/dmca.php dargelegten Anweisungen einreichen.
-
-Wenn Sie mit der Missbrauchmeldung jetzt fortfahren möchten, schließen Sie bitte dieses Fenster und senden Sie Ihren Bericht ein.  Möglicherweise müssen Sie Kategorie „CopyBot oder Berechtigungs-Exploit“ auswählen.
-
-Vielen Dank,
-
-Linden Lab
-	</notification>
-	<notification name="FailedRequirementsCheck">
-		Die folgenden erforderlichen Komponenten fehlen in [FLOATER]:
-[COMPONENTS]
-	</notification>
-	<notification label="Vorhandenen Anhang ersetzen" name="ReplaceAttachment">
-		An dieser Körperstelle ist bereits ein Objekt angebracht.
-Möchten Sie es mit dem ausgewählten Objekt ersetzen?
-		<form name="form">
-			<ignore name="ignore" save_option="true" text="Einen bestehenden Anhang mit dem ausgewählten Artikel ersetzen"/>
-			<button ignore="Automatisch ersetzen" name="Yes" text="OK"/>
-			<button ignore="Nie ersetzen" name="No" text="Abbrechen"/>
-		</form>
-	</notification>
-	<notification label="Beschäftigt-Modus-Warnung" name="BusyModePay">
-		Sie sind im Beschäftigt-Modus, sodass Sie im Austausch für diese Zahlung keine Objekte erhalten können.
-
-Möchten Sie den Bechäftigt-Modus verlassen, bevor Sie diese Transaktion abschließen?
-		<form name="form">
-			<ignore name="ignore" save_option="true" text="Ich bin im Begriff eine Person oder ein Objekt zu bezahlen, während ich im Modus Beschäftigt bin."/>
-			<button ignore="Beschäftigt-Modus immer deaktivieren" name="Yes" text="OK"/>
-			<button ignore="Beschäftigt-Modus aktiviert lassen" name="No" text="Abbrechen"/>
-		</form>
-	</notification>
-	<notification name="ConfirmEmptyTrash">
-		Sind Sie sicher, dass Sie den Inhalt Ihres Papierkorbs löschen möchten?
-		<usetemplate ignoretext="Bestätigen, bevor der Ordner Papierkorb im Inventar geleert wird" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmClearBrowserCache">
-		Sind Sie sicher, dass Sie Ihren Reise-, Internet- und Suchverlauf löschen möchten?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/>
-	</notification>
-	<notification name="ConfirmClearCookies">
-		Sind Sie sicher, dass Sie Ihre Cookies löschen möchten?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/>
-	</notification>
-	<notification name="ConfirmClearMediaUrlList">
-		Die Liste mit gespeicherten URLs wirklich löschen?
-		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/>
-	</notification>
-	<notification name="ConfirmEmptyLostAndFound">
-		Sind Sie sicher, dass Sie den Inhalt Ihres Ordners Fundbüro löschen möchten?
-		<usetemplate ignoretext="Bestätigen, bevor der Ordner Fundbüro im Inventar geleert wird" name="okcancelignore" notext="Nein" yestext="Ja"/>
-	</notification>
-	<notification name="CopySLURL">
-		Die folgende SLurl wurde in die Zwischenablage kopiert:
- [SLURL]
-
-Von einer Webseite zu diesem Formular linken, um anderen leichten Zugang zu dieser Position zu ermöglichen. Oder versuchen Sie es selbst: kopieren Sie die SLurl in die Adressleiste eines Webbrowsers.
-		<form name="form">
-			<ignore name="ignore" text="Slurl wurde in meine Zwischenablage kopiert"/>
-		</form>
-	</notification>
-	<notification name="WLSavePresetAlert">
-		Die gespeicherte Voreinstellung überschreiben?
-		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
-	</notification>
-	<notification name="WLDeletePresetAlert">
-		[SKY] löschen?
-		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
-	</notification>
-	<notification name="WLNoEditDefault">
-		Standardvoreinstellungen können nicht bearbeitet oder gelöscht werden.
-	</notification>
-	<notification name="WLMissingSky">
-		Diese Tageszyklusdatei verweist auf eine fehlende Himmel-Datei: [SKY].
-	</notification>
-	<notification name="PPSaveEffectAlert">
-		Post-Processing-Effekt bereits vorhanden. Möchten Sie ihn überschreiben?
-		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
-	</notification>
-	<notification name="NewSkyPreset">
-		Wählen Sie einen Namen für den neuen Himmel.
-		<form name="form">
-			<input name="message">
-				Neue Voreinstellung
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Abbrechen"/>
-		</form>
-	</notification>
-	<notification name="ExistsSkyPresetAlert">
-		Voreinstellung bereits vorhanden!
-	</notification>
-	<notification name="NewWaterPreset">
-		Wählen Sie einen Namen für die neue Wasservoreinstellung.
-		<form name="form">
-			<input name="message">
-				Neue Voreinstellung
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Abbrechen"/>
-		</form>
-	</notification>
-	<notification name="ExistsWaterPresetAlert">
-		Voreinstellung bereits vorhanden!
-	</notification>
-	<notification name="WaterNoEditDefault">
-		Standardvoreinstellungen können nicht bearbeitet oder gelöscht werden.
-	</notification>
-	<notification name="ChatterBoxSessionStartError">
-		Neue Chat-Sitzung mit [RECIPIENT] konnte nicht gestartet werden.
-[REASON]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="ChatterBoxSessionEventError">
-		[EVENT]
-[REASON]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="ForceCloseChatterBoxSession">
-		Ihre Chat-Sitzung mit [NAME] muss beendet werden.
-[REASON]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="Cannot_Purchase_an_Attachment">
-		Sie können kein Objekt kaufen, während es angehängt ist.
-	</notification>
-	<notification label="Info zur Abfrage der Abbucherlaubnis" name="DebitPermissionDetails">
-		Wenn Sie dieser Anfrage zustimmen, erhält das Skript die Erlaubnis, regelmäßig Linden-Dollar (L$) von Ihrem Konto abzubuchen. Diese Erlaubnis kann nur zurückgezogen werden, wenn der Eigentümer das Objekt löscht oder die Skripts in dem Objekt zurücksetzt.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="AutoWearNewClothing">
-		Möchten Sie das neu erstellte Kleidungsstück automatisch anziehen?
-		<usetemplate ignoretext="Die Kleidung, die während dem Bearbeiten meines Aussehens erstellt wird, sofort anziehen" name="okcancelignore" notext="Nein" yestext="Ja"/>
-	</notification>
-	<notification name="NotAgeVerified">
-		Sie müssen altersüberprüft sein, um diesen Bereich betreten zu können.  Möchten Sie auf der [SECOND_LIFE]-Webseite Ihr Alter verifizieren lassen?
-
-[_URL]
-		<url name="url" option="0">
-			https://secondlife.com/account/verification.php?lang=de
-		</url>
-		<usetemplate ignoretext="Ich habe mein Alter nicht verifizieren lassen" name="okcancelignore" notext="Nein" yestext="Ja"/>
-	</notification>
-	<notification name="Cannot enter parcel: no payment info on file">
-		Um diesen Bereich besuchen zu können, müssen Ihre Zahlungsinformationen gespeichert sein.  Möchten Sie diese Einstellung auf der [SECOND_LIFE]-Webseite einrichten?
-
-[_URL]
-		<url name="url" option="0">
-			https://secondlife.com/account/index.php?lang=de
-		</url>
-		<usetemplate ignoretext="Meine Zahlungsinformation ist nicht gespeichert" name="okcancelignore" notext="Nein" yestext="Ja"/>
-	</notification>
-	<notification name="MissingString">
-		Der String „[STRING_NAME]“ fehlt in strings.xml
-	</notification>
-	<notification name="SystemMessageTip">
-		[MESSAGE]
-	</notification>
-	<notification name="Cancelled">
-		Abgebrochen
-	</notification>
-	<notification name="CancelledSit">
-		Sitzen beendet
-	</notification>
-	<notification name="CancelledAttach">
-		Anhängen abgebrochen
-	</notification>
-	<notification name="ReplacedMissingWearable">
-		Fehlende(s) Kleidung/Körperteil mit Standard ersetzt.
-	</notification>
-	<notification name="GroupNotice">
-		Betreff: [SUBJECT], Nachricht: [MESSAGE]
-	</notification>
-	<notification name="FriendOnline">
-		[FIRST] [LAST] ist online
-	</notification>
-	<notification name="FriendOffline">
-		[FIRST] [LAST] ist offline
-	</notification>
-	<notification name="AddSelfFriend">
-		Obwohl Sie ein sehr netter Mensch sind, können Sie sich nicht selbst als Freund hinzufügen.
-	</notification>
-	<notification name="UploadingAuctionSnapshot">
-		In-Welt- und Website-Fotos werden hochgeladen...
-(Dauert ca. 5 Minuten.)
-	</notification>
-	<notification name="UploadPayment">
-		Sie haben für das Hochladen [AMOUNT] L$ bezahlt.
-	</notification>
-	<notification name="UploadWebSnapshotDone">
-		Das Website-Foto wurde hochgeladen.
-	</notification>
-	<notification name="UploadSnapshotDone">
-		In-Welt-Foto hochgeladen
-	</notification>
-	<notification name="TerrainDownloaded">
-		Terrain.raw heruntergeladen
-	</notification>
-	<notification name="GestureMissing">
-		Geste [NAME] fehlt in Datenbank.
-	</notification>
-	<notification name="UnableToLoadGesture">
-		Geste [NAME] konnte nicht geladen werden.
-Bitte versuchen Sie es erneut.
-	</notification>
-	<notification name="LandmarkMissing">
-		Landmarke fehlt in Datenbank.
-	</notification>
-	<notification name="UnableToLoadLandmark">
-		Landmarke konnte nicht geladen werden.  Bitte versuchen Sie es erneut.
-	</notification>
-	<notification name="CapsKeyOn">
-		Die Umschalttaste ist aktiv.
-Dies kann die Eingabe Ihres Passworts beeinflussen.
-	</notification>
-	<notification name="NotecardMissing">
-		Notizkarte fehlt in Datenbank.
-	</notification>
-	<notification name="NotecardNoPermissions">
-		Ihnen fehlt die Berechtigung zur Anzeige dieser Notizkarte.
-	</notification>
-	<notification name="RezItemNoPermissions">
-		Keine Berechtigung zum Rezzen von Objekten.
-	</notification>
-	<notification name="UnableToLoadNotecard">
-		Notizkarten-Asset konnte nicht geladen werden.
-	</notification>
-	<notification name="ScriptMissing">
-		Skript fehlt in Datenbank.
-	</notification>
-	<notification name="ScriptNoPermissions">
-		Unzureichende Rechte zur Anzeige des Skripts.
-	</notification>
-	<notification name="UnableToLoadScript">
-		Skript konnte nicht geladen werden.  Bitte versuchen Sie es erneut.
-	</notification>
-	<notification name="IncompleteInventory">
-		Die von Ihnen angebotenen Inhalte sind noch nicht vollständig lokal verfügbar. Warten Sie kurz und wiederholen Sie dann das Angebot.
-	</notification>
-	<notification name="CannotModifyProtectedCategories">
-		Geschützte Kategorien können nicht geändert werden.
-	</notification>
-	<notification name="CannotRemoveProtectedCategories">
-		Geschützte Kategorien können nicht entfernt werden.
-	</notification>
-	<notification name="OfferedCard">
-		Sie haben [FIRST] [LAST] eine Visitenkarte angeboten.
-	</notification>
-	<notification name="UnableToBuyWhileDownloading">
-		Kauf nicht möglich. Objektdaten werden noch geladen.
-Bitte versuchen Sie es erneut.
-	</notification>
-	<notification name="UnableToLinkWhileDownloading">
-		Verknüpfung nicht möglich. Objektdaten werden noch geladen.
-Bitte versuchen Sie es erneut.
-	</notification>
-	<notification name="CannotBuyObjectsFromDifferentOwners">
-		Sie können nur von einem Eigentümer auf einmal Objekte kaufen.
-Wählen Sie ein einzelnes Objekt aus.
-	</notification>
-	<notification name="ObjectNotForSale">
-		Dieses Objekt wird nicht verkauft.
-	</notification>
-	<notification name="EnteringGodMode">
-		Gott-Modus aktiviert, Level [LEVEL]
-	</notification>
-	<notification name="LeavingGodMode">
-		Gott-Modus wird nun de-aktiviert, Level [LEVEL]
-	</notification>
-	<notification name="CopyFailed">
-		Ihnen fehlt die Berechtigung zum Kopieren.
-	</notification>
-	<notification name="InventoryAccepted">
-		[NAME] hat Ihr Inventarangebot akzeptiert.
-	</notification>
-	<notification name="InventoryDeclined">
-		[NAME] hat Ihr Inventarangebot abgelehnt.
-	</notification>
-	<notification name="ObjectMessage">
-		[NAME]: [MESSAGE]
-	</notification>
-	<notification name="CallingCardAccepted">
-		Ihre Visitenkarte wurde akzeptiert.
-	</notification>
-	<notification name="CallingCardDeclined">
-		Ihre Visitenkarte wurde abgelehnt.
-	</notification>
-	<notification name="TeleportToLandmark">
-		Jetzt, nachdem Sie das Mainland erreicht haben, können Sie sich an Positionen wie „[NAME]“ teleportieren, indem Sie unten rechts im Fenster auf „Inventar“ klicken und den Ordner „Landmarken“ auswählen.
-Klicken Sie eine Landmarke doppelt an und wählen Sie „Teleportieren“, um an diesen Ort zu gelangen.
-	</notification>
-	<notification name="TeleportToPerson">
-		Jetzt, nachdem Sie das Mainland erreicht haben, können Sie mit Einwohnern wie „[NAME]“ Kontakt aufnehmen, indem Sie unten rechts im Fenster auf „Inventar“ klicken und den Ordner „Visitenkarten“ auswählen.
-Klicken Sie die Karte doppelt an, wählen Sie „Instant Message“ und geben Sie eine Nachricht ein.
-	</notification>
-	<notification name="CantSelectLandFromMultipleRegions">
-		Land kann nicht über Servergrenzen hinweg ausgewählt werden.
-Wählen Sie eine kleinere Landfläche.
-	</notification>
-	<notification name="SearchWordBanned">
-		Einige Begriffe in Ihrer Suchanfrage wurden ausgeschlossen, aufgrund von in den Community Standards definierten Inhaltsbeschränkungen.
-	</notification>
-	<notification name="NoContentToSearch">
-		Bitte wählen Sie mindestens eine Inhaltsart für die Suche aus (PG, Mature oder Adult).
-	</notification>
-	<notification name="GroupVote">
-		[NAME] hat eine Abstimmung vorgeschlagen über:
-[MESSAGE]
-		<form name="form">
-			<button name="VoteNow" text="Abstimmen"/>
-			<button name="Later" text="Später"/>
-		</form>
-	</notification>
-	<notification name="SystemMessage">
-		[MESSAGE]
-	</notification>
-	<notification name="EventNotification">
-		Event-Benachrichtigung:
-
-[NAME]
-[DATE]
-		<form name="form">
-			<button name="Teleport" text="Teleportieren"/>
-			<button name="Description" text="Beschreibung"/>
-			<button name="Cancel" text="Abbrechen"/>
-		</form>
-	</notification>
-	<notification name="TransferObjectsHighlighted">
-		Alle Objekte auf dieser Parzelle, die an den Käufer der Parzelle übertragen werden, sind jetzt markiert.
-
-* Übertragene Bäume und Gräser sind nicht markiert.
-		<form name="form">
-			<button name="Done" text="Fertig"/>
-		</form>
-	</notification>
-	<notification name="DeactivatedGesturesTrigger">
-		Gesten mit demselben Trigger wurden deaktiviert:
-[NAMES]
-	</notification>
-	<notification name="NoQuickTime">
-		Apple QuickTime ist auf Ihrem System anscheinend nicht installiert.
-Laden Sie QuickTime von der QuickTime-Webseite (http://www.apple.com/de/quicktime) herunter, um auf Parzellen, die diese Funktion unterstützen, Streaming-Inhalte wiederzugeben.
-	</notification>
-	<notification name="NoPlugin">
-		Es wurde kein Medien-Plugin gefunden, das &quot;[MIME_TYPE]&quot; ausführen kann.  Medien dieses Dateityps sind nicht verfügbar.
-	</notification>
-	<notification name="MediaPluginFailed">
-		Bei folgendem Plugin ist ein Fehler aufgetreten:
-    [PLUGIN]
-
-Bitte installieren Sie das Plugin erneut. Falls weiterhin Problem auftreten, kontaktieren Sie bitte den Hersteller.
-		<form name="form">
-			<ignore name="ignore" text="Ein Plugin kann nicht ausgeführt werden"/>
-		</form>
-	</notification>
-	<notification name="OwnedObjectsReturned">
-		Ihre Objekte auf der ausgewählten Parzelle wurden in Ihr Inventar transferiert.
-	</notification>
-	<notification name="OtherObjectsReturned">
-		Die Objekte von [FIRST] [LAST] auf dieser Parzelle wurden in das Inventar dieser Person transferiert.
-	</notification>
-	<notification name="OtherObjectsReturned2">
-		Die Objekte von [FIRST] [LAST] auf dieser
-Parzelle von „[NAME]“ wurden an ihren Eigentümer zurückgegeben.
-	</notification>
-	<notification name="GroupObjectsReturned">
-		Die mit der Gruppe [GROUPNAME] gemeinsam genutzten Objekte auf dieser Parzelle wurden in das Inventar ihrer Eigentümer transferiert.
-Transferierbare übertragene Objekte wurden an ihre früheren Eigentümer zurückgegeben.
-Nicht transferierbare an die Gruppe übertragene Objekte wurden gelöscht.
-	</notification>
-	<notification name="UnOwnedObjectsReturned">
-		Alle Objekte auf der ausgewählten Parzelle, die NICHT Ihnen gehören, wurden ihren Eigentümern zurückgegeben.
-	</notification>
-	<notification name="NotSafe">
-		Auf diesem Land ist Schaden aktiviert.
-Verletzungen sind möglich. Wenn Sie sterben, werden Sie zu Ihrem Heimatstandort teleportiert.
-	</notification>
-	<notification name="NoFly">
-		In diesem Bereich ist das Fliegen deaktiviert.
-Fliegen ist hier nicht möglich.
-	</notification>
-	<notification name="PushRestricted">
-		In diesem Bereich ist Stoßen nicht erlaubt.
-Sie können keine anderen Personen stoßen, außer Ihnen gehört das Land.
-	</notification>
-	<notification name="NoVoice">
-		In diesem Bereich ist Voice deaktiviert. Sie werden niemanden sprechen hören.
-	</notification>
-	<notification name="NoBuild">
-		In diesem Bereich ist das Bauen deaktiviert. Sie können keine Objekte bauen oder rezzen.
-	</notification>
-	<notification name="ScriptsStopped">
-		Ein Administrator hat die Skriptausführung in dieser Region vorübergehend deaktiviert.
-	</notification>
-	<notification name="ScriptsNotRunning">
-		In dieser Region werden keine Skipts ausgeführt.
-	</notification>
-	<notification name="NoOutsideScripts">
-		Auf diesem Land sind externe Skripts deaktiviert
-
-Hier funktionieren nur Skripts, die dem Landeigentümer gehören.
-	</notification>
-	<notification name="ClaimPublicLand">
-		Öffentliches Land kann nur in der Region in Besitz genommen werden, in der Sie sich befinden.
-	</notification>
-	<notification name="RegionTPAccessBlocked">
-		Sie dürfen diese Region aufgrund Ihrer Alterseinstufung nicht betreten. Sie müssen eventuell eine Altersüberprüfung vornehmen und/oder den aktuellsten Viewer installieren.
-
-Bitte besuchen Sie unsere Knowledgebase, um mehr Details über Zugang zu Regionen mit dieser Alterseinstufung zu erhalten.
-	</notification>
-	<notification name="URBannedFromRegion">
-		Sie dürfen diese Region nicht betreten.
-	</notification>
-	<notification name="NoTeenGridAccess">
-		Ihr Konto kann keine Verbindung zu dieser Teen Grid-Region herstellen.
-	</notification>
-	<notification name="ImproperPaymentStatus">
-		Die für den Zutritt zu dieser Region erforderlichen Zahlungsinformationen liegen nicht vor.
-	</notification>
-	<notification name="MustGetAgeParcel">
-		Sie müssen alterüberprüft sein, um diese Parzelle betreten zu können.
-	</notification>
-	<notification name="NoDestRegion">
-		Keine Zielregion gefunden.
-	</notification>
-	<notification name="NotAllowedInDest">
-		Der Zutritt wurde Ihnen verweigert.
-	</notification>
-	<notification name="RegionParcelBan">
-		Diese Parzelle ist abgesperrt und kann nicht überquert werden. Versuchen Sie einen anderen Weg.
-	</notification>
-	<notification name="TelehubRedirect">
-		Sie wurden zu einem Telehub umgeleitet.
-	</notification>
-	<notification name="CouldntTPCloser">
-		Ein Teleport näher am Ziel ist leider nicht möglich.
-	</notification>
-	<notification name="TPCancelled">
-		Teleport abgebrochen.
-	</notification>
-	<notification name="FullRegionTryAgain">
-		Die Region, die Sie betreten möchten, ist im Moment voll.
-Versuchen Sie es in einigen Minuten erneut.
-	</notification>
-	<notification name="GeneralFailure">
-		Allgemeiner Fehler.
-	</notification>
-	<notification name="RoutedWrongRegion">
-		In falsche Region umgeleitet.  Bitte versuchen Sie es erneut.
-	</notification>
-	<notification name="NoValidAgentID">
-		Keine gültige Agent ID.
-	</notification>
-	<notification name="NoValidSession">
-		Keine gültige Sitzungs-ID.
-	</notification>
-	<notification name="NoValidCircuit">
-		Kein gültiger Verbindungscode.
-	</notification>
-	<notification name="NoValidTimestamp">
-		Kein gültiger Zeitstempel.
-	</notification>
-	<notification name="NoPendingConnection">
-		Verbindung kann nicht hergestellt werden.
-	</notification>
-	<notification name="InternalUsherError">
-		Interner Fehler beim Versuch, Verbindung mit Agent Usher herzustellen.
-	</notification>
-	<notification name="NoGoodTPDestination">
-		In dieser Region konnte kein gültiges Teleportziel gefunden werden.
-	</notification>
-	<notification name="InternalErrorRegionResolver">
-		Interner Fehler bei Teleport.
-	</notification>
-	<notification name="NoValidLanding">
-		Ein gültiger Landpunkt konnte nicht gefunden werden.
-	</notification>
-	<notification name="NoValidParcel">
-		Es konnte keine gültige Parzelle gefunden werden.
-	</notification>
-	<notification name="ObjectGiveItem">
-		Das Objekt [OBJECTFROMNAME] von [FIRST] [LAST] hat Ihnen Folgendes übergeben: [OBJECTTYPE] ([OBJECTNAME]).
-		<form name="form">
-			<button name="Keep" text="Behalten"/>
-			<button name="Discard" text="Verwerfen"/>
-			<button name="Mute" text="Stummschalten"/>
-		</form>
-	</notification>
-	<notification name="ObjectGiveItemUnknownUser">
-		Das Objekt [OBJECTFROMNAME] von (unbekannt) hat Ihnen Folgendes übergeben: [OBJECTTYPE] ([OBJECTNAME]).
-		<form name="form">
-			<button name="Keep" text="Behalten"/>
-			<button name="Discard" text="Verwerfen"/>
-			<button name="Mute" text="Stummschalten"/>
-		</form>
-	</notification>
-	<notification name="UserGiveItem">
-		[NAME] hat Ihnen ein [OBJECTTYPE] namens „[OBJECTNAME]“ gegeben.
-		<form name="form">
-			<button name="Keep" text="Behalten"/>
-			<button name="Discard" text="Verwerfen"/>
-		</form>
-	</notification>
-	<notification name="GodMessage">
-		[NAME]
-[MESSAGE]
-	</notification>
-	<notification name="JoinGroup">
-		[MESSAGE]
-		<form name="form">
-			<button name="Join" text="Beitreten"/>
-			<button name="Decline" text="Ablehnen"/>
-			<button name="Info" text="Info"/>
-		</form>
-	</notification>
-	<notification name="TeleportOffered">
-		[NAME] hat angeboten, Sie zu ihrem/seinem Standort zu teleportieren:
-
-[MESSAGE]
-		<form name="form">
-			<button name="Teleport" text="Teleportieren"/>
-			<button name="Cancel" text="Abbrechen"/>
-		</form>
-	</notification>
-	<notification name="GotoURL">
-		[MESSAGE]
-[URL]
-		<form name="form">
-			<button name="Later" text="Später"/>
-			<button name="GoNow..." text="Jetzt gehen..."/>
-		</form>
-	</notification>
-	<notification name="OfferFriendship">
-		[NAME] bietet Ihnen die Freundschaft an.
-
-[MESSAGE]
-
-(Standardmäßig werden Sie gegenseitig ihren Online-Status sehen können.)
-		<form name="form">
-			<button name="Accept" text="Akzeptieren"/>
-			<button name="Decline" text="Ablehnen"/>
-		</form>
-	</notification>
-	<notification name="OfferFriendshipNoMessage">
-		[NAME] bietet Ihnen die Freundschaft an.
-
-(Sie werden dadurch den gegenseitigen Online-Status sehen können.)
-		<form name="form">
-			<button name="Accept" text="Akzeptieren"/>
-			<button name="Decline" text="Ablehnen"/>
-		</form>
-	</notification>
-	<notification name="FriendshipAccepted">
-		[NAME] hat Ihr Freundschaftsangebot akzeptiert.
-	</notification>
-	<notification name="FriendshipDeclined">
-		[NAME] hat Ihr Freundschaftsangebot abgelehnt.
-	</notification>
-	<notification name="OfferCallingCard">
-		[FIRST] [LAST] bietet Ihnen eine Visitenkarte an.
-Dies erstellt ein Lesezeichen in Ihrem Inventar, damit Sie diesen Einwohner jederzeit über IM erreichen.
-		<form name="form">
-			<button name="Accept" text="Akzeptieren"/>
-			<button name="Decline" text="Ablehnen"/>
-		</form>
-	</notification>
-	<notification name="RegionRestartMinutes">
-		Region wird in [MINUTES] Minuten neu gestartet.
-Wenn Sie in dieser Region bleiben, werden Sie abgemeldet.
-	</notification>
-	<notification name="RegionRestartSeconds">
-		Diese Region wird in [SECONDS] neu gestartet.
-Wenn Sie in dieser Region bleiben, werden Sie abgemeldet.
-	</notification>
-	<notification name="LoadWebPage">
-		Webseite [URL] laden?
-
-[MESSAGE]
-
-Von Objekt: [OBJECTNAME], Eigentümer: [NAME]?
-		<form name="form">
-			<button name="Gotopage" text="Zur Seite"/>
-			<button name="Cancel" text="Abbrechen"/>
-		</form>
-	</notification>
-	<notification name="FailedToFindWearableUnnamed">
-		[TYPE] nicht in Datenbank.
-	</notification>
-	<notification name="FailedToFindWearable">
-		[TYPE] namens [DESC] nicht in Datenbank.
-	</notification>
-	<notification name="InvalidWearable">
-		Dieser Artikel verwendet eine Funktion, die Ihr Viewer nicht unterstützt. Bitte aktualisieren Sie Ihre Version von [APP_NAME], um diesen Artikel anziehen zu können.
-	</notification>
-	<notification name="ScriptQuestion">
-		Das Objekt „[OBJECTNAME]“, Eigentum von „[NAME]“, möchte:
-
-[QUESTIONS]
-Ist das OK?
-		<form name="form">
-			<button name="Yes" text="Ja"/>
-			<button name="No" text="Nein"/>
-			<button name="Mute" text="Stummschalten"/>
-		</form>
-	</notification>
-	<notification name="ScriptQuestionCaution">
-		Ein Objekt namens „[OBJECTNAME]“ des Eigentümers „[NAME]“ möchte:
-
-[QUESTIONS]
-Wenn Sie diesem Objekt und seinem Ersteller nicht vertrauen, sollten Sie diese Anfrage ablehnen.
-
-Anfrage gestatten?
-		<form name="form">
-			<button name="Grant" text="Gewähren"/>
-			<button name="Deny" text="Verweigern"/>
-			<button name="Details" text="Info..."/>
-		</form>
-	</notification>
-	<notification name="ScriptDialog">
-		[FIRST] [LAST]s „[TITLE]“
-[MESSAGE]
-		<form name="form">
-			<button name="Ignore" text="Ignorieren"/>
-		</form>
-	</notification>
-	<notification name="ScriptDialogGroup">
-		[GROUPNAME]s „[TITLE]“
-[MESSAGE]
-		<form name="form">
-			<button name="Ignore" text="Ignorieren"/>
-		</form>
-	</notification>
-	<notification name="FirstBalanceIncrease">
-		Sie haben gerade [AMOUNT] L$ erhalten.
-Ihr Kontostand wird oben rechts angezeigt.
-	</notification>
-	<notification name="FirstBalanceDecrease">
-		Sie haben gerade [AMOUNT] L$ bezahlt.
-Ihr Kontostand wird oben rechts angezeigt.
-	</notification>
-	<notification name="FirstSit">
-		Sie sitzen.
-Verwenden Sie die Pfeiltasten (oder AWSD-Tasten), um sich umzusehen.
-Um aufzustehen, klicken Sie auf die Schaltfläche „Aufstehen“.
-	</notification>
-	<notification name="FirstMap">
-		Klicken Sie auf die Karte und bewegen Sie die Maus, um sich auf der Karte umzusehen.
-Mit Doppelklick können Sie teleportieren.
-Nutzen Sie die Optionen rechts, um Objekte, Einwohner oder Events anzuzeigen und einen anderen Hintergrund auszuwählen.
-	</notification>
-	<notification name="FirstBuild">
-		Sie haben die Bauwerkzeuge geöffnet. Jedes Objekt, dass Sie sehen wurde mit diesen Werkzeugen gebaut.
-	</notification>
-	<notification name="FirstTeleport">
-		Sie können nur zu bestimmten Bereichen in dieser Region teleportieren. Der Pfeil deutet zu Ihrem Ziel hin. Klicken Sie auf den Pfeil, um diesen auszublenden.
-	</notification>
-	<notification name="FirstOverrideKeys">
-		Ihre Bewegungstasten werden jetzt von einem Objekt gesteuert.
-Probieren Sie die Pfeil- oder WASD-Tasten aus.
-Manche Objekte (wie Waffen) müssen per Mouselook gesteuert werden.
-Drücken Sie dazu „M“.
-	</notification>
-	<notification name="FirstAppearance">
-		Sie bearbeiten gerade Ihr Aussehen.
-Verwenden Sie die Pfeiltasten, um sich umzusehen.
-Klicken Sie auf „Alles speichern“, wenn Sie fertig sind.
-	</notification>
-	<notification name="FirstInventory">
-		Dies ist Ihr Inventar. Es enthält Objekte, die Ihnen gehören.
-
-* Um etwas anzuziehen, ziehen Sie es mit der Maus auf Ihren Avatar.
-* Um etwas inworld zu rezzen, ziehen Sie das Objekt auf den Boden.
-* Zum Lesen einer Notizkarte klicken Sie sie doppelt an.
-	</notification>
-	<notification name="FirstSandbox">
-		Dies ist ein Sandkasten. Hier können Einwohner lernen, wie Objekte gebaut werden. 
-
-Objekte, die Sie hier bauen, werden gelöscht, nachdem Sie den Sandkasten verlassen. Vergessen Sie nicht, Ihr Werk mit einem Rechtsklick und der Auswahl „Nehmen“ in Ihrem Inventar zu speichern.
-	</notification>
-	<notification name="FirstFlexible">
-		Dieses Objekt ist flexibel. Flexible Objekte müssen die Eigenschaft „Phantom“ haben und dürfen nicht „physisch“ sein.
-	</notification>
-	<notification name="FirstDebugMenus">
-		Sie haben das Menü „Erweitert“ geöffnet.
-
-Um dieses Menü zu aktivieren bzw. deaktivieren:
-  Windows Strg-Alt-D
-  Mac ⌘-Opt-D
-	</notification>
-	<notification name="FirstSculptedPrim">
-		Sie bearbeiten ein geformtes Primitiv. Geformte Primitive benötigen eine spezielle Textur, die ihre Form definiert.
-	</notification>
-	<notification name="MaxListSelectMessage">
-		Sie können maximal [MAX_SELECT] Objekte
-von der Liste auswählen.
-	</notification>
-	<notification name="VoiceInviteP2P">
-		[NAME] lädt Sie zu einem Voice-Chat ein.
-Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Anrufer stumm zu schalten.
-		<form name="form">
-			<button name="Accept" text="Akzeptieren"/>
-			<button name="Decline" text="Ablehnen"/>
-			<button name="Mute" text="Stummschalten"/>
-		</form>
-	</notification>
-	<notification name="AutoUnmuteByIM">
-		[FIRST] [LAST] hat eine Instant Message erhalten; die Stummschaltung wurde aufgehoben.
-	</notification>
-	<notification name="AutoUnmuteByMoney">
-		[FIRST] [LAST] hat Geld erhalten; die Stummschaltung wurde aufgehoben.
-	</notification>
-	<notification name="AutoUnmuteByInventory">
-		[FIRST] [LAST] wurde ein Inventarobjekt angeboten; die Stummschaltung wurde aufgehoben.
-	</notification>
-	<notification name="VoiceInviteGroup">
-		[NAME] ist einem Voice-Chat mit der Gruppe [GROUP] beigetreten.
-Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Anrufer stumm zu schalten.
-		<form name="form">
-			<button name="Accept" text="Akzeptieren"/>
-			<button name="Decline" text="Ablehnen"/>
-			<button name="Mute" text="Stummschalten"/>
-		</form>
-	</notification>
-	<notification name="VoiceInviteAdHoc">
-		[NAME] ist einem Voice-Konferenz-Chat beigetreten.
-Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Benutzer stumm zu schalten.
-		<form name="form">
-			<button name="Accept" text="Akzeptieren"/>
-			<button name="Decline" text="Ablehnen"/>
-			<button name="Mute" text="Stummschalten"/>
-		</form>
-	</notification>
-	<notification name="InviteAdHoc">
-		[NAME] lädt Sie zu einem Konferenz-Chat ein.
-Klicken Sie auf „Akzeptieren“, um dem Chat beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Benutzer stumm zu schalten.
-		<form name="form">
-			<button name="Accept" text="Akzeptieren"/>
-			<button name="Decline" text="Ablehnen"/>
-			<button name="Mute" text="Stummschalten"/>
-		</form>
-	</notification>
-	<notification name="VoiceChannelFull">
-		Der Voice-Chat, dem Sie beitreten möchten, [VOICE_CHANNEL_NAME], hat seine maximale Teilnehmerzahl erreicht. Bitte versuchen Sie es erneut.
-	</notification>
-	<notification name="ProximalVoiceChannelFull">
-		Es tut uns Leid.  Dieses Gebiet hat seine maximale Kapazität für Voice-Gespräche erreicht.  Bitte versuchen Sie es in einem anderen Gebiet.
-	</notification>
-	<notification name="VoiceChannelDisconnected">
-		Sie haben [VOICE_CHANNEL_NAME] verlassen.  Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden.
-	</notification>
-	<notification name="VoiceChannelDisconnectedP2P">
-		[VOICE_CHANNEL_NAME] hat das Gespräch beendet.  Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden.
-	</notification>
-	<notification name="P2PCallDeclined">
-		[VOICE_CHANNEL_NAME] hat Ihren Anruf abgelehnt.  Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden.
-	</notification>
-	<notification name="P2PCallNoAnswer">
-		[VOICE_CHANNEL_NAME] ist zurzeit nicht erreichbar.  Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden.
-	</notification>
-	<notification name="VoiceChannelJoinFailed">
-		Verbindung zu [VOICE_CHANNEL_NAME] nicht möglich. Bitte versuchen Sie es später.  Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden.
-	</notification>
-	<notification name="VoiceLoginRetry">
-		Wir erstellen einen Voice-Kanal für Sie. Bitte warten Sie einen Moment.
-	</notification>
-	<notification name="Cannot enter parcel: not a group member">
-		Nur Mitglieder einer bestimmten Gruppe dürfen diesen Bereich betreten.
-	</notification>
-	<notification name="Cannot enter parcel: banned">
-		Zugang zur Parzelle verweigert. Sie wurden verbannt.
-	</notification>
-	<notification name="Cannot enter parcel: not on access list">
-		Zugang zur Parzelle verweigert. Sie stehen nicht auf der Zugangsliste.
-	</notification>
-	<notification name="VoiceNotAllowed">
-		Sie sind nicht berechtigt, einem Voice-Chat in [VOICE_CHANNEL_NAME] beizutreten.
-	</notification>
-	<notification name="VoiceCallGenericError">
-		Fehler beim Versuch, eine Voice-Chat-Verbindung zu [VOICE_CHANNEL_NAME] herzustellen.  Bitte versuchen Sie es erneut.
-	</notification>
-	<notification name="ServerVersionChanged">
-		Sie haben eine Region betreten, die eine andere Server-Version verwendet. Dies kann sich auf die Leistung auswirken. Klicken Sie hier, um die Versionshinweise anzuzeigen.
-	</notification>
-	<notification name="UnsupportedCommandSLURL">
-		Die SLurl, auf die Sie geklickt haben, wird nicht unterstützt.
-	</notification>
-	<notification name="IMToast">
-		<form name="form">
-			<button name="respondbutton" text="Antworten"/>
-		</form>
-	</notification>
-	<notification name="AttachmentSaved">
-		Der Anhang wurde gespeichert.
-	</notification>
-	<notification name="UnableToFindHelpTopic">
-		Hilfethema für dieses Element wurde nicht gefunden.
-	</notification>
-	<global name="UnsupportedCPU">
-		- Ihre CPU-Geschwindigkeit entspricht nicht den Mindestanforderungen.
-	</global>
-	<global name="UnsupportedGLRequirements">
-		Ihr Computer entspricht nicht den Hardwareanforderungen von [APP_NAME]. [APP_NAME] setzt eine OpenGL-Grafikkarte mit Multitextur-Unterstützung voraus. Falls Ihre Grafikkarte diese Funktion unterstützt, installieren Sie die neuesten Treiber sowie die aktuellen Service Packs und Patches für Ihr Betriebssystem.
-
-Sollte das Problem fortbestehen, finden Sie weitere Hilfestellung unter [SUPPORT_SITE].
-	</global>
-	<global name="UnsupportedCPUAmount">
-		796
-	</global>
-	<global name="UnsupportedRAMAmount">
-		510
-	</global>
-	<global name="UnsupportedGPU">
-		- Ihre Grafikkarte entspricht nicht den Mindestanforderungen.
-	</global>
-	<global name="UnsupportedRAM">
-		- Ihr Arbeitsspeicher entspricht nicht den Mindestanforderungen.
-	</global>
-	<global name="PermYes">
-		Ja
-	</global>
-	<global name="PermNo">
-		Nein
-	</global>
-	<global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
-		Wenn Sie ein Stück Land besitzen, können Sie dies als Ihren Heimatort festlegen. 
-Ansonsten können Sie auf der Karte nachsehen und dort Ort suchen, die als „Infohub“ gekennzeichnet sind.
-	</global>
-</notifications>
+<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+	<global name="skipnexttime">
+		Nicht mehr anzeigen
+	</global>
+	<global name="alwayschoose">
+		Diese Option immer auswählen
+	</global>
+	<global name="implicitclosebutton">
+		Schließen
+	</global>
+	<template name="okbutton">
+		<form>
+			<button name="OK" text="$yestext"/>
+		</form>
+	</template>
+	<template name="okignore"/>
+	<template name="okcancelbuttons">
+		<form>
+			<button name="Cancel" text="$notext"/>
+		</form>
+	</template>
+	<template name="okcancelignore"/>
+	<template name="okhelpbuttons">
+		<form>
+			<button name="Help" text="$helptext"/>
+		</form>
+	</template>
+	<template name="yesnocancelbuttons">
+		<form>
+			<button name="Yes" text="$yestext"/>
+			<button name="No" text="$notext"/>
+		</form>
+	</template>
+	<notification functor="GenericAcknowledge" label="Unbekannter Warnhinweis" name="MissingAlert">
+		Ihre Version von [APP_NAME] kann den gerade empfangenen Warnhinweis nicht anzeigen.  Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben.
+
+Fehlerdetails: Der Warnhinweis &apos;[_NAME]&apos; wurde in notifications.xml nicht gefunden.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="FloaterNotFound">
+		Floater-Fehler: Folgende Steuerelemente wurden nicht gefunden:
+
+[CONTROLS]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="TutorialNotFound">
+		Derzeit ist kein Tutorial verfügbar.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="GenericAlert">
+		[MESSAGE]
+	</notification>
+	<notification name="GenericAlertYesCancel">
+		[MESSAGE]
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/>
+	</notification>
+	<notification name="BadInstallation">
+		Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten.  Bitte laden Sie die aktuellste Version des Viewers herunter. http://get.secondlife.com
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="LoginFailedNoNetwork">
+		Eine Verbindung zum [SECOND_LIFE_GRID] konnte nicht hergestellt werden.
+ &apos;[DIAGNOSTIC]&apos;
+Bitte vergewissern Sie sich, dass Ihre Internetverbindung funktioniert.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="MessageTemplateNotFound">
+		Meldungsvorlage [PATH] nicht gefunden.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="WearableSave">
+		Änderung an aktueller Kleidung/Körperteil speichern?
+		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/>
+	</notification>
+	<notification name="CompileQueueSaveText">
+		Der Text für ein Skript konnte aus folgendem Grund nicht hochgeladen werden: [REASON]. Bitte versuchen Sie es erneut.
+	</notification>
+	<notification name="CompileQueueSaveBytecode">
+		Eine kompiliertes Skript konnte aus folgendem Grund nicht hochgeladen werden: [REASON]. Bitte versuchen Sie es erneut.
+	</notification>
+	<notification name="WriteAnimationFail">
+		Fehler beim Schreiben von Animationsdaten.  Bitte versuchen Sie es erneut.
+	</notification>
+	<notification name="UploadAuctionSnapshotFail">
+		Eine Auktions-Screenshot konnte aus folgendem Grund nicht hochgeladen werden: [REASON]
+	</notification>
+	<notification name="UnableToViewContentsMoreThanOne">
+		Es kann nur jeweils der Inhalt von einem Objekt angezeigt werden.
+Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut.
+	</notification>
+	<notification name="SaveClothingBodyChanges">
+		Änderung an Kleidung/Körperteilen speichern?
+		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Alles speichern"/>
+	</notification>
+	<notification name="GrantModifyRights">
+		Die Gewährung von Änderungsrechten an andere Einwohner ermöglicht es diesen, JEDES BELIEBIGE Objekt zu ändern oder an sich zu nehmen, das Sie in der [SECOND_LIFE]-Welt besitzen. Seien Sie SEHR vorsichtig beim Erteilen dieser Erlaubnis.
+Möchten Sie [FIRST_NAME] [LAST_NAME] Änderungsrechte gewähren?
+		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
+	</notification>
+	<notification name="GrantModifyRightsMultiple">
+		Die Gewährung von Änderungsrechten an andere Einwohner ermöglicht es diesen, JEDES BELIEBIGE Objekt zu ändern, das Sie in der [SECOND_LIFE]-Welt besitzen. Seien Sie SEHR vorsichtig beim Erteilen dieser Erlaubnis.
+Möchten Sie den ausgewählten Einwohnern Änderungsrechte gewähren?
+		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
+	</notification>
+	<notification name="RevokeModifyRights">
+		Möchten Sie [FIRST_NAME] [LAST_NAME] die Änderungsrechte entziehen?
+		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
+	</notification>
+	<notification name="RevokeModifyRightsMultiple">
+		Möchten Sie den ausgewählten Einwohnern die Änderungsrechte entziehen?
+		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
+	</notification>
+	<notification name="UnableToCreateGroup">
+		Gruppe konnte nicht erstellt werden.
+[MESSAGE]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="PanelGroupApply">
+		[NEEDS_APPLY_MESSAGE]
+[WANT_APPLY_MESSAGE]
+		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Änderungen verwerfen" yestext="Änderungen übernehmen"/>
+	</notification>
+	<notification name="MustSpecifyGroupNoticeSubject">
+		Geben Sie einen Betreff für die Gruppenmitteilung ein.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="AddGroupOwnerWarning">
+		Sie sind im Begriff, Gruppenmitgliedern die Rolle [ROLE_NAME] zuzuweisen.
+Diese Rolle kann Mitgliedern nicht mehr entzogen werden.
+Sie müssen die Rolle selbst niederlegen.
+Möchten Sie fortfahren?
+		<usetemplate ignoretext="Bestätigen, bevor ich einen neuen Gruppeneigentümer hinzufüge" name="okcancelignore" notext="Nein" yestext="Ja"/>
+	</notification>
+	<notification name="AssignDangerousActionWarning">
+		Sie sind im Begriff, der Rolle „[ROLE_NAME]“ die Fähigkeit „[ACTION_NAME]“ zuzuweisen.
+
+ *ACHTUNG*
+ Mitglieder in einer Rolle mit dieser Fähigkeit können sich selbst -
+ und allen anderen Mitgliedern – Rollen zuweisen, die mehr Rechte
+ beinhalten als sie derzeit haben, und damit nahezu
+ Eigentümerrechte erreichen. Überlegen Sie sich, wem Sie diese Fähigkeit
+ verleihen.
+
+Der Rolle „[ROLE_NAME]“ diese Fähigkeit zuweisen?
+		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
+	</notification>
+	<notification name="AssignDangerousAbilityWarning">
+		Sie sind im Begriff, der Rolle „[ROLE_NAME]“ die Fähigkeit „[ACTION_NAME]“ zuzuweisen.
+
+ *ACHTUNG*
+ Mitglieder in einer Rolle mit dieser Fähigkeit können sich selbst -
+ und allen anderen Mitgliedern – alle Fähigkeiten zuweisen und
+ damit fast Eigentümerrechte erreichen.
+
+Der Rolle „[ROLE_NAME]“ diese Fähigkeit zuweisen?
+		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
+	</notification>
+	<notification name="JoinGroupCanAfford">
+		Der Beitritt zu dieser Gruppe kostet [COST] L$.
+Fortfahren?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Beitreten"/>
+	</notification>
+	<notification name="JoinGroupCannotAfford">
+		Der Beitritt zu dieser Gruppe kostet [COST] L$.
+Sie haben nicht genug L$, um dieser Gruppe beizutreten.
+	</notification>
+	<notification name="CreateGroupCost">
+		Die Gründung dieser Gruppe kostet 100 L$.
+Gruppen müssen mehr als ein Mitglied haben oder sie werden gelöscht.
+Bitte laden Sie innerhalb von 48 Stunden Mitglieder in Ihre Gruppe ein.
+		<usetemplate canceltext="Abbrechen" name="okcancelbuttons" notext="Abbrechen" yestext="Gruppe für 100 L$ erstellen"/>
+	</notification>
+	<notification name="LandBuyPass">
+		Sie können dieses Land („[PARCEL_NAME]“) für [COST] L$
+[TIME] Stunden lang betreten.  Pass kaufen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="SalePriceRestriction">
+		Der Verkaufspreis muss beim allgemeinen Verkauf über 0 L$ liegen.
+Wählen Sie eine bestimmte Person aus, wenn Sie für 0 L$ verkaufen.
+	</notification>
+	<notification name="ConfirmLandSaleChange">
+		Die ausgewählten [LAND_SIZE] qm Land werden zum Verkauf freigegeben.
+Der Verkaufspreis beträgt [SALE_PRICE] L$ und wird automatisch für den Verkauf an [NAME] autorisiert.
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmLandSaleToAnyoneChange">
+		ACHTUNG: Wenn Sie auf „An jeden verkaufen“ klicken, kann jeder in [SECOND_LIFE] Ihr Land kaufen, auch Einwohner in anderen Regionen.
+
+Die ausgewählten [LAND_SIZE] qm Land werden zum Verkauf freigegeben.
+Der Verkaufspreis beträgt [SALE_PRICE] L$ und wird automatisch für den Verkauf an [NAME] autorisiert.
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsDeededToGroup">
+		Möchten Sie alle Ihre Objekte auf dieser Parzelle, die der Gruppe „[NAME]“ gehören, zurück in das jeweilige Inventar ihrer vorherigen Eigentümer transferieren?
+
+*WARNUNG* Alle nicht transferierbaren Objekte, die der Gruppe übertragen wurden, werden dabei gelöscht!
+
+Objekte: [N]
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsOwnedByUser">
+		Möchten Sie alle Objekte auf dieser Parzelle, die dem Einwohner „[NAME]“ gehören, in das jeweilige Inventar ihrer Eigentümer transferieren?
+
+Objekte: [N]
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsOwnedBySelf">
+		Möchten Sie alle Objekte auf dieser Parzelle, die Ihnen gehören, zurück in Ihr Inventar transferieren?
+
+Objekte: [N]
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsNotOwnedBySelf">
+		Möchten Sie alle Objekte auf dieser Parzelle, die NICHT Ihnen gehören, in das Inventar ihrer Eigentümer transferieren?
+Transferierbare Objekte, die an eine Gruppe übertragen wurden, werden ihren vorherigen Eigentümern zurückgegeben.
+
+*WARNUNG* Alle nicht transferierbaren Objekte, die der Gruppe übertragen wurden, werden dabei gelöscht!
+
+Objekte: [N]
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsNotOwnedByUser">
+		Möchten Sie alle Objekte auf dieser Parzelle, die NICHT [NAME] gehören, in das Inventar ihrer Eigentümer transferieren?
+Transferierbare Objekte, die an eine Gruppe übertragen wurden, werden ihren vorherigen Eigentümern zurückgegeben.
+
+*WARNUNG* Alle nicht transferierbaren Objekte, die der Gruppe übertragen wurden, werden dabei gelöscht!
+
+Objekte: [N]
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ReturnAllTopObjects">
+		Möchten Sie alle aufgeführten Objekte ihren Eigentümern zurückgeben?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="DisableAllTopObjects">
+		Möchten Sie alle Objekte in dieser Region deaktivieren?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsNotOwnedByGroup">
+		Objekte auf dieser Parzelle, die von der Gruppe [NAME] nicht gemeinsam genutzt werden, an ihre Eigentümer zurückgeben?
+
+Objekte: [N]
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="UnableToDisableOutsideScripts">
+		Skriptdeaktivierung nicht möglich.
+Für die gesamte Region ist Schaden aktiviert.
+Damit Waffen funktionieren, müssen Skripts erlaubt sein.
+	</notification>
+	<notification name="MustBeInParcel">
+		Sie müssen auf einer Landparzelle stehen, um ihren Landepunkt festzulegen.
+	</notification>
+	<notification name="PromptRecipientEmail">
+		Bitte geben Sie für den/die Empfänger eine gültige Email-Adresse ein.
+	</notification>
+	<notification name="PromptSelfEmail">
+		Geben Sie Ihre E-Mail-Adresse ein.
+	</notification>
+	<notification name="PromptMissingSubjMsg">
+		Foto mit Standardbetreff bzw. -nachricht als E-Mail versenden?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ErrorProcessingSnapshot">
+		Fehler beim Verarbeiten der Fotodaten
+	</notification>
+	<notification name="ErrorEncodingSnapshot">
+		Fehler beim Erstellen des Fotos!
+	</notification>
+	<notification name="ErrorUploadingPostcard">
+		Ein Foto konnte aus folgendem Grund nicht gesendet werden: [REASON]
+	</notification>
+	<notification name="ErrorUploadingReportScreenshot">
+		Ein Report-Screenshot konnte aus folgendem Grund nicht hochgeladen werden: [REASON]
+	</notification>
+	<notification name="MustAgreeToLogIn">
+		Bevor Sie sich in [SECOND_LIFE] anmelden können, müssen Sie den Nutzungsbedingungen zustimmen.
+	</notification>
+	<notification name="CouldNotPutOnOutfit">
+		Outfit konnte nicht angezogen werden.
+Der Outfit-Ordner enthält keine Kleidung, Körperteile oder Anhänge.
+	</notification>
+	<notification name="CannotWearTrash">
+		Kleider oder Körperteile im Papierkorb können nicht getragen werden
+	</notification>
+	<notification name="CannotWearInfoNotComplete">
+		Sie können das Objekt nicht anziehen, weil es noch nicht geladen wurde. Warten Sie kurz und versuchen Sie es dann noch einmal.
+	</notification>
+	<notification name="MustHaveAccountToLogIn">
+		Hoppla! Da fehlt noch etwas.
+Geben Sie bitte den Vor- und den Nachnamen Ihres Avatars ein.
+
+Sie benötigen ein Benutzerkonto, um [SECOND_LIFE] betreten zu können. Möchten Sie jetzt ein Benutzerkonto anlegen?
+		<url name="url">
+			https://join.secondlife.com/index.php?lang=de-DE
+		</url>
+		<usetemplate name="okcancelbuttons" notext="Erneut versuchen" yestext="Neues Benutzerkonto anlegen"/>
+	</notification>
+	<notification name="AddClassified">
+		Anzeigen erscheinen für eine Woche unter „Anzeigen“ im Suchverzeichnis. Füllen Sie Ihre Anzeige aus und klicken Sie auf „Veröffentlichen...“, um sie zum Verzeichnis hinzuzufügen. Sie werden gebeten, einen Preis zu bezahlen, wenn Sie auf „Veröffentlichen“ klicken. Wenn Sie mehr bezahlen oder ein Benutzer nach Ihren Suchbegriffen sucht, erscheint Ihre Anzeige weiter oben in der Liste.
+		<usetemplate ignoretext="So wird eine neue Anzeige erstellt" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="DeleteClassified">
+		Anzeige „[NAME]“ löschen?
+Gebühren werden nicht rückerstattet.
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ClassifiedSave">
+		Änderung an Anzeige [NAME] speichern?
+		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/>
+	</notification>
+	<notification name="DeleteAvatarPick">
+		Auswahl [PICK] löschen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="PromptGoToEventsPage">
+		Zur [SECOND_LIFE] Events-Webseite?
+		<url name="url">
+			http://de.secondlife.com/events/
+		</url>
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="SelectProposalToView">
+		Wählen Sie ein Angebot zur Ansicht.
+	</notification>
+	<notification name="SelectHistoryItemToView">
+		Wählen Sie ein Element zur Ansicht.
+	</notification>
+	<notification name="ResetShowNextTimeDialogs">
+		Möchten Sie alle Popups wieder aktivieren, die Sie zuvor auf „Nicht mehr anzeigen“ gesetzt haben?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="SkipShowNextTimeDialogs">
+		Möchten Sie alle Popups, die übersprungen werden können, deaktivieren?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="CacheWillClear">
+		Der Cache wird nach einem Neustart von [APP_NAME] geleert.
+	</notification>
+	<notification name="CacheWillBeMoved">
+		Der Cache wird nach einem Neustart von [APP_NAME] verschoben.
+Hinweis: Der Cache wird dabei gelöscht/geleert.
+	</notification>
+	<notification name="ChangeConnectionPort">
+		Die Port-Einstellungen werden nach einem Neustart von [APP_NAME] wirksam.
+	</notification>
+	<notification name="ChangeSkin">
+		Die neue Benutzeroberfläche wird nach einem Neustart von [APP_NAME] angewendet.
+	</notification>
+	<notification name="GoToAuctionPage">
+		Zur [SECOND_LIFE]-Webseite, um Auktionen anzuzeigen oder ein Gebot abzugeben?
+		<url name="url">
+			http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
+		</url>
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="SaveChanges">
+		Änderungen speichern?
+		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/>
+	</notification>
+	<notification name="GestureSaveFailedTooManySteps">
+		Speichern der Geste fehlgeschlagen.
+Die Geste besteht aus zu vielen Schritten.
+Löschen Sie einige Schritte und versuchen Sie es erneut.
+	</notification>
+	<notification name="GestureSaveFailedTryAgain">
+		Speichern der Geste fehlgeschlagen.  Warten Sie kurz und versuchen Sie es dann noch einmal.
+	</notification>
+	<notification name="GestureSaveFailedObjectNotFound">
+		Geste konnte nicht gespeichert werden, da das Objekt oder das zugehörige Objektinventar nicht gefunden wurden.
+Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht.
+	</notification>
+	<notification name="GestureSaveFailedReason">
+		Eine Geste konnte aus folgendem Grund nicht gespeichert werden: [REASON].  Speichern Sie die Geste bitte später.
+	</notification>
+	<notification name="SaveNotecardFailObjectNotFound">
+		Notizkarte konnte nicht gespeichert werden, da das Objekt oder das zugehörige Objektinventar nicht gefunden wurden.
+Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht.
+	</notification>
+	<notification name="SaveNotecardFailReason">
+		Eine Notizkarte konnte aus folgendem Grund nicht gespeichert werden: [REASON].  Speichern Sie die Notizkarte bitte später.
+	</notification>
+	<notification name="ScriptCannotUndo">
+		Es konnten nicht alle Änderungen in Ihrer Skriptversion rückgängig gemacht werden.
+Möchten Sie die letzte gespeicherte Version vom Server laden?
+(**Warnung** Dieser Vorgang kann nicht rückgängig gemacht werden.)
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="SaveScriptFailReason">
+		Ein Skript konnte aus folgendem Grund nicht gespeichert werden: [REASON].  Speichern Sie das Skript bitte später.
+	</notification>
+	<notification name="SaveScriptFailObjectNotFound">
+		Skript konnte nicht gespeichert werden, weil das zugehörige Objekt nicht gefunden wurde.
+Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht.
+	</notification>
+	<notification name="SaveBytecodeFailReason">
+		Ein kompiliertes Skript konnte aus folgendem Grund nicht gespeichert werden: [REASON].  Speichern Sie das Skript bitte später.
+	</notification>
+	<notification name="StartRegionEmpty">
+		Sie haben keine Start-Region festgelegt. 
+Bitte geben Sie den Namen der Region im Feld „Startposition“ ein oder wählen Sie „Mein letzter Standort“ oder „Mein Heimatort“ als Startposition aus.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="CouldNotStartStopScript">
+		Skript konnte nicht gestartet oder beendet werden, weil das zugehörige Objekt nicht gefunden wurde.
+Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht.
+	</notification>
+	<notification name="CannotDownloadFile">
+		Dateidownload nicht möglich
+	</notification>
+	<notification name="CannotWriteFile">
+		Datei [[FILE]] kann nicht geschrieben werden
+	</notification>
+	<notification name="UnsupportedHardware">
+		Achtung: Ihr System erfüllt nicht die Mindestanforderungen von [APP_NAME]. Dies kann eine schlechte Darstellungsleistung in [APP_NAME] zur Folge haben. Bei nicht unterstützten Systemkonfigurationen kann Ihnen unsere [SUPPORT_SITE] leider nicht helfen.
+
+MINDESTANF.
+Die Seite [_URL] für weitere Informationen öffnen?
+		<url name="url" option="0">
+			http://secondlife.com/support/sysreqs.php?lang=de
+		</url>
+		<usetemplate ignoretext="Meine Hardware wird nicht unterstützt" name="okcancelignore" notext="Nein" yestext="Ja"/>
+	</notification>
+	<notification name="UnknownGPU">
+		Ihr System verwendet eine uns zurzeit unbekannte Grafikkarte.
+Dies passiert dann, wenn die neue Hardware noch nicht mit [APP_NAME] getestet wurde.  [APP_NAME] wird wahrscheinlich korrekt ausgeführt werden, jedoch sollten Sie Ihre Grafikeinstellungen anpassen, um eine bessere Darstellung zu erzielen.
+(Einstellungen &gt; Grafik).
+		<form name="form">
+			<ignore name="ignore" text="Meine Grafikkarte konnte nicht identifiziert werden."/>
+		</form>
+	</notification>
+	<notification name="DisplaySettingsNoShaders">
+		[APP_NAME] ist bei der Initialisierung der Grafiktreiber abgestürzt.
+Die Grafikqualität wird auf eine niedrige Stufe zurückgesetzt, um einige typische Treiberfehler zu vermeiden.
+Einige Grafikfunktionen werden ausgeschaltet.
+Wir empfehlen die Aktualisierung Ihrer Grafikkartentreiber.
+Sie können die Grafikqualität unter „Einstellungen“ &gt; „Grafik“ wieder erhöhen.
+	</notification>
+	<notification name="RegionNoTerraforming">
+		Die Region [REGION] erlaubt kein Terraforming.
+	</notification>
+	<notification name="CannotCopyWarning">
+		Sie sind nicht berechtigt, dieses Objekt zu kopieren und verlieren es aus Ihrem Inventar, wenn Sie es weggeben. Möchten Sie dieses Objekt anbieten?
+		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
+	</notification>
+	<notification name="CannotGiveItem">
+		Inventarobjekt kann nicht übergeben werden.
+	</notification>
+	<notification name="TransactionCancelled">
+		Transaktion abgebrochen.
+	</notification>
+	<notification name="TooManyItems">
+		Es können maximal 42 Objekte auf einmal in das Inventar transferiert werden.
+	</notification>
+	<notification name="NoItems">
+		Sie sind nicht berechtigt, die ausgewählten Objekte zu kopieren.
+	</notification>
+	<notification name="CannotCopyCountItems">
+		Sie sind nicht berechtigt, [COUNT] der ausgewählten Objekte zu kopieren. Diese Objekte werden aus Ihrem Inventar gelöscht.
+Möchten Sie diese Objekte weggeben?
+		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
+	</notification>
+	<notification name="CannotGiveCategory">
+		Sie sind nicht berechtigt, den ausgewählten Ordner zu kopieren.
+	</notification>
+	<notification name="FreezeAvatar">
+		Diesen Avatar einfrieren?
+Der Avatar wird außer Gefecht gesetzt und kann sich nicht mehr bewegen, chatten oder mit der Welt interagieren.
+		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Auftauen" yestext="Einfrieren"/>
+	</notification>
+	<notification name="FreezeAvatarFullname">
+		[AVATAR_NAME] einfrieren?
+Der Avatar wird außer Gefecht gesetzt und kann sich nicht mehr bewegen, chatten oder mit der Welt interagieren.
+		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Auftauen" yestext="Einfrieren"/>
+	</notification>
+	<notification name="EjectAvatarFullname">
+		[AVATAR_NAME] von Ihrem Land werfen?
+		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Ausschließen und Verbannen" yestext="Ausschließen"/>
+	</notification>
+	<notification name="EjectAvatarNoBan">
+		Diesen Avatar aus Ihrem Land werfen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Hinauswerfen"/>
+	</notification>
+	<notification name="EjectAvatarFullnameNoBan">
+		[AVATAR_NAME] aus Ihrem Land werfen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Hinauswerfen"/>
+	</notification>
+	<notification name="AcquireErrorTooManyObjects">
+		FEHLER: Zu viele Objekte ausgewählt.
+	</notification>
+	<notification name="AcquireErrorObjectSpan">
+		FEHLER: Die Objekte überspannen mehrere Regionen.
+Verschieben Sie alle betreffenden Objekte in dieselbe Region.
+	</notification>
+	<notification name="PromptGoToCurrencyPage">
+		[EXTRA]
+
+[_URL] für Informationen zum Kauf von L$ öffnen?
+		<url name="url">
+			http://de.secondlife.com/app/currency/
+		</url>
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="UnableToLinkObjects">
+		Verknüpfung dieser [COUNT] Objekte nicht möglich.
+Sie können maximal [MAX] Objekte verknüpfen.
+	</notification>
+	<notification name="CannotLinkIncompleteSet">
+		Sie können nur vollständige Objektsätze verknüpfen und Sie müssen mehr als ein Objekt auswählen.
+	</notification>
+	<notification name="CannotLinkModify">
+		Verknüpfung nicht möglich, da Sie nicht alle Objekte bearbeiten dürfen.
+
+Stellen Sie sicher, dass kein Objekt gesperrt ist und alle Objekte Ihnen gehören.
+	</notification>
+	<notification name="CannotLinkDifferentOwners">
+		Verknüpfung nicht möglich, da nicht alle Objekte denselben Eigentümer haben.
+
+Stellen Sie sicher, dass alle ausgewählten Objekte Ihnen gehören.
+	</notification>
+	<notification name="NoFileExtension">
+		Kein Dateityp für Datei: „[FILE]“
+
+Vergewissern Sie sich, dass die Datei den richtigen Dateityp hat.
+	</notification>
+	<notification name="InvalidFileExtension">
+		Ungültige Datei-Endung [EXTENSION]
+Erwartet wurde [VALIDS]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="CannotUploadSoundFile">
+		Sounddatei konnte nicht hochgeladen werden:
+[FILE]
+	</notification>
+	<notification name="SoundFileNotRIFF">
+		Die Datei ist anscheinend keine RIFF WAVE-Datei:
+[FILE]
+	</notification>
+	<notification name="SoundFileNotPCM">
+		Die Datei ist anscheinend keine PCM WAVE-Audiodatei:
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidChannelCount">
+		Die Datei hat eine ungültige Anzahl Tonkanäle (muss Mono oder Stereo sein):
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidSampleRate">
+		Die Sample-Rate dieser Datei wird nicht unterstützt (muss 44,1 K sein):
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidWordSize">
+		Die Word-Größe dieser Datei wird nicht unterstützt (muss 8 oder 16 Bit sein):
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidHeader">
+		„Daten“-Chunk in WAV-Header nicht gefunden:
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidTooLong">
+		Audiodatei ist zu lang (max. 10 Sekunden):
+[FILE]
+	</notification>
+	<notification name="ProblemWithFile">
+		Problem mit Datei [FILE]:
+
+[ERROR]
+	</notification>
+	<notification name="CannotOpenTemporarySoundFile">
+		Temporäre komprimierte Sounddatei konnte nicht geöffnet werden: [FILE]
+	</notification>
+	<notification name="UnknownVorbisEncodeFailure">
+		Unbekannter Vorbis-Kodierungsfehler in: [FILE]
+	</notification>
+	<notification name="CannotEncodeFile">
+		Datei konnte nicht kodiert werden: [FILE]
+	</notification>
+	<notification name="CorruptResourceFile">
+		Ressourcendatei beschädigt: [FILE]
+	</notification>
+	<notification name="UnknownResourceFileVersion">
+		Unbekannte Linden-Ressourcenversion in Datei: [FILE]
+	</notification>
+	<notification name="UnableToCreateOutputFile">
+		Ausgabedatei konnte nicht erstellt werden: [FILE]
+	</notification>
+	<notification name="DoNotSupportBulkAnimationUpload">
+		Der Mehrfach-Upload von Animationsdateien wird zurzeit von [APP_NAME] nicht unterstützt.
+	</notification>
+	<notification name="CannotUploadReason">
+		Datei [FILE] kann aus folgendem Grund nicht hochgeladen werden: [REASON]
+Bitte versuchen Sie es erneut.
+	</notification>
+	<notification name="LandmarkCreated">
+		„[LANDMARK_NAME]“ wurde zum Ordner „[FOLDER_NAME]“ hinzugefügt.
+	</notification>
+	<notification name="CannotCreateLandmarkNotOwner">
+		Sie können hier keine Landmarke erstellen, da der Landeigentümer dies verboten hat.
+	</notification>
+	<notification name="CannotRecompileSelectObjectsNoScripts">
+		„Rekompilieren“ nicht möglich.
+Objekt mit Skript wählen.
+	</notification>
+	<notification name="CannotRecompileSelectObjectsNoPermission">
+		„Rekompilieren“ nicht möglich.
+
+Wählen Sie Objekte mit Skripts, die Sie bearbeiten dürfen.
+	</notification>
+	<notification name="CannotResetSelectObjectsNoScripts">
+		„Zurücksetzen“ nicht möglich.
+
+Wählen Sie Objekte mit Skripts.
+	</notification>
+	<notification name="CannotResetSelectObjectsNoPermission">
+		„Zurücksetzen“ nicht möglich.
+
+Wählen Sie Objekte mit Skripts, die Sie bearbeiten dürfen.
+	</notification>
+	<notification name="CannotSetRunningSelectObjectsNoScripts">
+		„Ausführen“ von Skripts nicht möglich.
+
+Wählen Sie Objekte mit Skripts.
+	</notification>
+	<notification name="CannotSetRunningNotSelectObjectsNoScripts">
+		„Deaktivieren“ von Skripts nicht möglich.
+
+Wählen Sie Objekte mit Skripts.
+	</notification>
+	<notification name="NoFrontmostFloater">
+		Kein vorderster Floater zum Speichern.
+	</notification>
+	<notification name="SeachFilteredOnShortWords">
+		Ihre Suchanfrage wurde geändert.
+Zu kurze Begriffe wurden entfernt.
+
+Ihre Suchanfrage: [FINALQUERY]
+	</notification>
+	<notification name="SeachFilteredOnShortWordsEmpty">
+		Ihre Suchbegriffe sind zu kurz.
+Es wurde keine Suche durchgeführt.
+	</notification>
+	<notification name="CouldNotTeleportReason">
+		Teleport fehlgeschlagen.
+[REASON]
+	</notification>
+	<notification name="invalid_tport">
+		Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden.
+Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
+	</notification>
+	<notification name="invalid_region_handoff">
+		Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen sich zum Wechsel der Region eventuell neu anmelden.
+Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
+	</notification>
+	<notification name="blocked_tport">
+		Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal.
+Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab und wieder an.
+	</notification>
+	<notification name="nolandmark_tport">
+		Das System konnte das Landmarken-Ziel nicht finden.
+	</notification>
+	<notification name="timeout_tport">
+		Das System konnte keine Teleport-Verbindung herstellen.
+Versuchen Sie es später noch einmal.
+	</notification>
+	<notification name="noaccess_tport">
+		Sie haben leider keinen Zugang zu diesem Teleport-Ziel.
+	</notification>
+	<notification name="missing_attach_tport">
+		Ihre Anhänge sind noch nicht eingetroffen. Warten Sie kurz oder melden Sie sich ab und wieder an, bevor Sie einen neuen Teleport-Versuch unternehmen.
+	</notification>
+	<notification name="too_many_uploads_tport">
+		Die Asset-Warteschlange in dieser Region ist zurzeit überlastet.
+Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in einigen Minuten erneut oder besuchen Sie eine weniger überfüllte Region.
+	</notification>
+	<notification name="expired_tport">
+		Das System konnte Ihre Teleport-Anfrage nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut.
+	</notification>
+	<notification name="expired_region_handoff">
+		Das System konnte Ihre Anfrage zum Regionswechsel nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut.
+	</notification>
+	<notification name="no_host">
+		Teleport-Ziel wurde nicht gefunden. Das Ziel ist entweder im Moment nicht verfügbar oder existiert nicht mehr. Versuchen Sie es in einigen Minuten erneut.
+	</notification>
+	<notification name="no_inventory_host">
+		Das Inventarsystem ist zurzeit nicht verfügbar.
+	</notification>
+	<notification name="CannotSetLandOwnerNothingSelected">
+		Landeigentümer kann nicht festgelegt werden:
+Keine Parzelle ausgewählt.
+	</notification>
+	<notification name="CannotSetLandOwnerMultipleRegions">
+		Eine erzwungene Landübertragung ist nicht möglich, da die Auswahl mehrere Regionen umfasst. Wählen Sie ein kleineres Gebiet und versuchen Sie es erneut.
+	</notification>
+	<notification name="ForceOwnerAuctionWarning">
+		Diese Parzelle steht zur Auktion. Eine zwangsweise Eigentumsübertragung beendet die Auktion und verärgert womöglich Einwohner, die bereits ein Gebot abgegeben haben. Eigentumsübertragung erzwingen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="CannotContentifyNothingSelected">
+		Inhaltsidentifizierung nicht möglich:
+Keine Parzelle ausgewählt.
+	</notification>
+	<notification name="CannotContentifyNoRegion">
+		Inhaltsidentifizierung nicht möglich:
+Keine Region ausgewählt.
+	</notification>
+	<notification name="CannotReleaseLandNothingSelected">
+		Land kann nicht aufgegeben werden:
+Keine Parzelle ausgewählt.
+	</notification>
+	<notification name="CannotReleaseLandNoRegion">
+		Land kann nicht aufgegeben werden:
+Region nicht gefunden.
+	</notification>
+	<notification name="CannotBuyLandNothingSelected">
+		Land kann nicht gekauft werden:
+Keine Parzelle ausgewählt.
+	</notification>
+	<notification name="CannotBuyLandNoRegion">
+		Land kann nicht gekauft werden:
+Kann die Region nicht finden, in der sich dieses Land befindet.
+	</notification>
+	<notification name="CannotCloseFloaterBuyLand">
+		Das Fenster „Land kaufen“ kann erst geschlossen werden, nachdem [APP_NAME] den Transaktionspreis geschätzt hat.
+	</notification>
+	<notification name="CannotDeedLandNothingSelected">
+		Land kann nicht übertragen werden:
+Keine Parzelle ausgewählt.
+	</notification>
+	<notification name="CannotDeedLandNoGroup">
+		Land kann nicht übertragen werden:
+Keine Gruppe ausgewählt.
+	</notification>
+	<notification name="CannotDeedLandNoRegion">
+		Land kann nicht übertragen werden:
+Kann die Region nicht finden, in der sich dieses Land befindet.
+	</notification>
+	<notification name="CannotDeedLandMultipleSelected">
+		Land kann nicht übertragen werden:
+Mehrere Parzellen ausgewählt.
+
+Wählen Sie eine einzelne Parzelle.
+	</notification>
+	<notification name="ParcelCanPlayMedia">
+		Dieser Ort kann Streaming-Medien abspielen.
+Streaming-Medien erfordern eine schnelle Internet-Verbindung.
+
+Streaming-Medien abspielen, wenn verfügbar?
+(Sie können diese Option später unter „Einstellungen“ &gt; „Audio &amp; Video“ ändern.)
+		<usetemplate name="okcancelbuttons" notext="Deaktivieren" yestext="Medien wiedergeben"/>
+	</notification>
+	<notification name="CannotDeedLandWaitingForServer">
+		Land kann nicht übertragen werden:
+Warte auf Server für Eigentümerinformationen.
+
+Bitte versuchen Sie es erneut.
+	</notification>
+	<notification name="CannotDeedLandNoTransfer">
+		Land kann nicht übertragen werden:
+Die Region [REGION] erlaubt keine Landübertragung.
+	</notification>
+	<notification name="CannotReleaseLandWatingForServer">
+		Land kann nicht aufgegeben werden:
+Server muss Parzelleninformation aktualisieren.
+
+Versuchen Sie es in einigen Sekunden erneut.
+	</notification>
+	<notification name="CannotReleaseLandSelected">
+		Land kann nicht aufgegeben werden:
+Die ausgewählten Parzellen gehören Ihnen nicht.
+
+Wählen Sie eine einzelne Parzelle.
+	</notification>
+	<notification name="CannotReleaseLandDontOwn">
+		Land kann nicht aufgegeben werden:
+Ihnen fehlt die Berechtigung zur Freigabe dieser Parzelle.
+Parzellen, die Ihnen gehören, werden grün dargestellt.
+	</notification>
+	<notification name="CannotReleaseLandRegionNotFound">
+		Land kann nicht aufgegeben werden:
+Kann die Region nicht finden, in der sich dieses Land befindet.
+	</notification>
+	<notification name="CannotReleaseLandNoTransfer">
+		Land kann nicht aufgegeben werden:
+Die Region [REGION] erlaubt keine Landübertragung.
+	</notification>
+	<notification name="CannotReleaseLandPartialSelection">
+		Land kann nicht aufgegeben werden:
+Zum Freigeben müssen Sie eine ganze Parzelle auswählen.
+
+Wählen Sie eine ganze Parzelle oder teilen Sie Ihre Parzelle.
+	</notification>
+	<notification name="ReleaseLandWarning">
+		Sie sind im Begriff, [AREA] qm Land aufzugeben.
+Wenn Sie diese Parzelle aufgeben, wird sie ohne L$-Erstattung von Ihrem Landbesitz entfernt.
+
+Dieses Land aufgeben?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="CannotDivideLandNothingSelected">
+		Land kann nicht aufgeteilt werden:
+
+Keine Parzellen ausgewählt.
+	</notification>
+	<notification name="CannotDivideLandPartialSelection">
+		Land kann nicht aufgeteilt werden:
+
+Sie haben eine ganze Parzelle ausgewählt.
+Wählen Sie einen Parzellenabschnitt aus.
+	</notification>
+	<notification name="LandDivideWarning">
+		Wenn Sie dieses Land teilen, wird diese Parzelle in zwei geteilt, jede mit ihren eigenen Einstellungen. Einige dieser Einstellungen werden aufgrund dieses Vorgangs zurückgesetzt.
+
+Land teilen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="CannotDivideLandNoRegion">
+		Land kann nicht aufgeteilt werden:
+Kann die Region nicht finden, in der sich dieses Land befindet.
+	</notification>
+	<notification name="CannotJoinLandNoRegion">
+		Land kann nicht zusammengelegt werden:
+Kann die Region nicht finden, in der sich dieses Land befindet.
+	</notification>
+	<notification name="CannotJoinLandNothingSelected">
+		Land kann nicht zusammengelegt werden:
+Keine Parzellen ausgewählt.
+	</notification>
+	<notification name="CannotJoinLandEntireParcelSelected">
+		Land kann nicht zusammengelegt werden:
+Sie haben nur eine Parzelle ausgewählt.
+
+Wählen Sie Land auf beiden Parzellen aus.
+	</notification>
+	<notification name="CannotJoinLandSelection">
+		Land kann nicht zusammengelegt werden:
+Sie müssen mehrere Parzellen auswählen.
+
+Wählen Sie Land auf beiden Parzellen aus.
+	</notification>
+	<notification name="JoinLandWarning">
+		Beim Zusammenlegen entsteht aus den vom Auswahlrechteck
+erfassten Parzellen eine große Parzelle.
+Sie müssen der neuen Parzelle einen Namen geben und ihre Optionen festlegen.
+
+Land zusammenlegen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmNotecardSave">
+		Um das Objekt kopieren oder anzeigen zu können, müssen Sie zuerst diese Notizkarte speichern. Notizkarte speichern?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmItemCopy">
+		Dieses Objekt in Ihr Inventar kopieren?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Kopieren"/>
+	</notification>
+	<notification name="ResolutionSwitchFail">
+		Auflösung konnte nicht auf [RESX] x [RESY] gesetzt werden
+	</notification>
+	<notification name="ErrorUndefinedGrasses">
+		Fehler: Nicht definierte Gräser: [SPECIES]
+	</notification>
+	<notification name="ErrorUndefinedTrees">
+		Fehler: Nicht definierte Bäume: [SPECIES]
+	</notification>
+	<notification name="CannotSaveWearableOutOfSpace">
+		„[NAME]“ konnte nicht in Kleidungsdatei gespeichert werden.  Geben Sie Speicherplatz auf dem Computer frei und speichern Sie das Kleidungsstück erneut.
+	</notification>
+	<notification name="CannotSaveToAssetStore">
+		[NAME] kann nicht in Zentral-Asset-Speicher geladen werden.
+Dies ist ein temporärer Fehler. Bitte passen Sie das Kleidungsstück in einigen Minuten noch einmal an und speichern Sie es erneut.
+	</notification>
+	<notification name="YouHaveBeenLoggedOut">
+		Sie wurden von [SECOND_LIFE] abgemeldet:
+            [MESSAGE]
+Klicken Sie auf „IM &amp; Chat anzeigen“, um vorhandene Nachrichten und Chat weiterhin anzuzeigen. Klicken Sie andernfalls auf „Beenden“, um [APP_NAME] sofort zu beenden.
+		<usetemplate name="okcancelbuttons" notext="Beenden" yestext="IM &amp; Chat anzeigen"/>
+	</notification>
+	<notification name="OnlyOfficerCanBuyLand">
+		Landkauf für Gruppe nicht möglich:
+Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen.
+	</notification>
+	<notification label="Freund hinzufügen" name="AddFriend">
+		Freunde können sich gegenseitig die Berechtigung erteilen, sich auf der Karte zu verfolgen und Online-Status Benachrichtigungen zu empfangen.
+
+[NAME] Freundschaft anbieten?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification label="Freund hinzufügen" name="AddFriendWithMessage">
+		Freunde können sich gegenseitig die Berechtigung erteilen, sich auf der Karte zu verfolgen und Online-Status Benachrichtigungen zu empfangen.
+
+[NAME] Freundschaft anbieten?
+		<form name="form">
+			<input name="message">
+				Wollen wir Freunde sein?
+			</input>
+			<button name="Offer" text="OK"/>
+			<button name="Cancel" text="Abbrechen"/>
+		</form>
+	</notification>
+	<notification name="RemoveFromFriends">
+		Möchten Sie [FIRST_NAME] [LAST_NAME] aus Ihrer Freundesliste entfernen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="RemoveMultipleFromFriends">
+		Möchten Sie mehrere Freunde aus Ihrer Freundesliste entfernen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="GodDeleteAllScriptedPublicObjectsByUser">
+		Möchten Sie alle geskripteten Objekte von
+** [AVATAR_NAME] **
+auf allen anderen Ländern in diesem Sim löschen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="GodDeleteAllScriptedObjectsByUser">
+		Möchten Sie ALLE geskripteten Objekte von
+** [AVATAR_NAME] **
+auf ALLEN LÄNDERN in diesem Sim LÖSCHEN?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="GodDeleteAllObjectsByUser">
+		Möchten Sie ALLE Objekte (einschließlich geskriptete) von
+** [AVATAR_NAME] **
+auf ALLEN LÄNDERN in diesem Sim LÖSCHEN?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="BlankClassifiedName">
+		Geben Sie einen Namen für die Anzeige ein.
+	</notification>
+	<notification name="MinClassifiedPrice">
+		Der Mindestbetrag für die Listung ist [MIN_PRICE] L$.
+
+Geben sie einen höheren Betrag ein.
+	</notification>
+	<notification name="ConfirmObjectDeleteLock">
+		Mindestens ein ausgewähltes Objekt ist gesperrt.
+
+Möchten Sie diese Objekte löschen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteNoCopy">
+		Mindestens ein ausgewähltes Objekt kann nicht kopiert werden.
+
+Möchten Sie diese Objekte löschen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteNoOwn">
+		Mindestens eines der ausgewählten Objekt gehört nicht Ihnen.
+
+Möchten Sie diese Objekte löschen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteLockNoCopy">
+		Mindestens ein Objekt ist gesperrt.
+Mindestens ein Objekt kann nicht kopiert werden.
+
+Möchten Sie diese Objekte löschen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteLockNoOwn">
+		Mindestens ein Objekt ist gesperrt.
+Mindestens ein Objekt gehört nicht Ihnen.
+
+Möchten Sie diese Objekte löschen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteNoCopyNoOwn">
+		Mindestens ein Objekt kann nicht kopiert werden.
+Mindestens ein Objekt gehört nicht Ihnen.
+
+Möchten Sie diese Objekte löschen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
+		Mindestens ein Objekt ist gesperrt.
+Mindestens ein Objekt kann nicht kopiert werden.
+Mindestens ein Objekt gehört nicht Ihnen.
+
+Möchten Sie diese Objekte löschen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectTakeLock">
+		Mindestens ein Objekt ist gesperrt.
+
+Möchten Sie diese Objekte nehmen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectTakeNoOwn">
+		Nicht alle Objekte, die Sie aufgenommen haben, gehören Ihnen.
+Wenn Sie fortfahren, werden die Rechte für den nächsten Eigentümer angewandt und Sie können die Objekte möglicherweise nicht bearbeiten oder kopieren.
+
+Möchten Sie diese Objekte nehmen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectTakeLockNoOwn">
+		Mindestens ein Objekt ist gesperrt.
+Nicht alle Objekte, die Sie aufgenommen haben, gehören Ihnen.
+Wenn Sie fortfahren, werden die Rechte für den nächsten Eigentümer abgefragt und Sie können die Objekte möglicherweise nicht bearbeiten oder kopieren.
+Die aktuelle Auswahl können Sie jedoch aufnehmen.
+
+Möchten Sie diese Objekte nehmen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="CantBuyLandAcrossMultipleRegions">
+		Landkauf nicht möglich, da die Auswahl mehrere Regionen umfasst.
+
+Wählen Sie ein kleineres Gebiet und versuchen Sie es erneut.
+	</notification>
+	<notification name="DeedLandToGroup">
+		Die Schenkung dieser Parzelle setzt voraus, dass die Gruppe über ausreichende Landnutzungsrechte verfügt.
+Dem Eigentümer wird der Kaufpreis für das Land nicht rückerstattet. Bei Verkauf der übertragenen Parzelle wird der Erlös zwischen den Gruppenmitgliedern aufgeteilt.
+
+Der Gruppe „[GROUP_NAME]“
+ [AREA] m² Land schenken?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="DeedLandToGroupWithContribution">
+		Die Schenkung dieser Parzelle setzt voraus, dass die Gruppe über ausreichende Landnutzungsrechte verfügt.
+Die Schenkung beinhaltet eine Landübertragung an die Gruppe von „[FIRST_NAME] [LAST_NAME]“.
+Dem Eigentümer wird der Kaufpreis für das Land nicht rückerstattet. Bei Verkauf der übertragenen Parzelle wird der Erlös zwischen den Gruppenmitgliedern aufgeteilt.
+
+Der Gruppe „[GROUP_NAME]“
+ [AREA] m² Land schenken?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="DisplaySetToSafe">
+		Es wurden sichere Anzeige-Einstellungen gewählt, da die Option -safe verwendet wurde.
+	</notification>
+	<notification name="DisplaySetToRecommended">
+		Es wurden die für Ihre Systemkonfiguration empfohlenen Anzeige-Einstellungen gewählt.
+	</notification>
+	<notification name="ErrorMessage">
+		[ERROR_MESSAGE]
+	</notification>
+	<notification name="AvatarMovedDesired">
+		Ihr gewünschter Zielort ist zurzeit nicht verfügbar.
+Sie wurden zur nächstgelegenen Region teleportiert.
+	</notification>
+	<notification name="AvatarMovedLast">
+		Ihr letzter Standort ist zurzeit nicht verfügbar.
+Sie wurden zur nächstgelegenen Region teleportiert.
+	</notification>
+	<notification name="AvatarMovedHome">
+		Ihr Heimatort ist zurzeit nicht verfügbar.
+Sie wurden zur nächstgelegenen Region teleportiert.
+Sie müssen eventuell einen neuen Heimatort festlegen.
+	</notification>
+	<notification name="ClothingLoading">
+		Ihre Kleidung wird noch heruntergeladen.
+Sie können [SECOND_LIFE] normal verwenden. Andere Benutzer können Sie korrekt dargestellt sehen.
+		<form name="form">
+			<ignore name="ignore" text="Das Herunterladen der Kleidung dauert lange"/>
+		</form>
+	</notification>
+	<notification name="FirstRun">
+		Die Installation von [APP_NAME] ist abgeschlossen.
+
+Wenn Sie [SECOND_LIFE] das erste Mal verwenden, müssen Sie ein Konto anlegen, bevor Sie sich anmelden können.
+Möchten Sie auf www.secondlife.com ein Konto erstellen?
+		<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Neues Konto..."/>
+	</notification>
+	<notification name="LoginPacketNeverReceived">
+		Es gibt Probleme mit der Verbindung. Möglicherweise besteht ein Problem mit Ihrer Internetverbindung oder dem [SECOND_LIFE_GRID].
+
+Überprüfen Sie Ihre Internetverbindung und versuchen Sie es dann erneut, oder klicken Sie auf Hilfe, um zu [SUPPORT_SITE] zu gelangen, oder klicken Sie auf Teleportieren, um nach Hause zu teleportieren.
+		<url name="url">
+			http://de.secondlife.com/support/
+		</url>
+		<form name="form">
+			<button name="OK" text="OK"/>
+			<button name="Help" text="Hilfe"/>
+			<button name="Teleport" text="Teleportieren"/>
+		</form>
+	</notification>
+	<notification name="WelcomeChooseSex">
+		Ihr Avatar erscheint jeden Moment.
+
+Benutzen Sie die Pfeiltasten, um sich fortzubewegen.
+Drücken Sie F1 für Hilfe oder für weitere Informationen über [SECOND_LIFE].
+Bitte wählen Sie einen männlichen oder weiblichen Avatar.
+Sie können sich später noch umentscheiden.
+		<usetemplate name="okcancelbuttons" notext="Weiblich" yestext="Männlich"/>
+	</notification>
+	<notification name="NotEnoughCurrency">
+		[NAME] [PRICE] L$  Sie haben nicht genügend L$, um diese Aktion auszuführen.
+	</notification>
+	<notification name="GrantedModifyRights">
+		[FIRST_NAME] [LAST_NAME] hat Ihnen die Erlaubnis erteilt, ihre/seine Objekte zu bearbeiten.
+	</notification>
+	<notification name="RevokedModifyRights">
+		Ihnen wurden die Änderungsrechte für die Objekte von [FIRST_NAME] [LAST_NAME] entzogen.
+	</notification>
+	<notification name="FlushMapVisibilityCaches">
+		Der Kartencache dieser Region wird geleert.
+Diese Aktion ist nur beim Debugging sinnvoll.
+(Auf dem Produktionssystem warten Sie einfach 5 Minuten. Die Karten werden nach erneuter Anmeldung automatisch aktualisiert.)
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="BuyOneObjectOnly">
+		Sie können jeweils nur ein Objekt kaufen.  Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut.
+	</notification>
+	<notification name="OnlyCopyContentsOfSingleItem">
+		Es kann nur jeweils der Inhalt von einem Objekt kopiert werden.
+Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut.
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="KickUsersFromRegion">
+		Alle Einwohner in dieser Region nach Hause teleportieren?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="EstateObjectReturn">
+		Möchten Sie wirklich alle Objekte zurückgeben, die [USER_NAME] gehören?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="InvalidTerrainBitDepth">
+		Die Regionstexturen konnten nicht festgelegt werden:
+Die Terraintextur [TEXTURE_NUM] hat eine ungültige Bit-Tiefe [TEXTURE_BIT_DEPTH].
+
+Ersetzen Sie die Textur [TEXTURE_NUM] mit einer Bilddatei von maximal 512x512 und 24 Bit und klicken Sie dann erneut auf „Übernehmen“.
+	</notification>
+	<notification name="InvalidTerrainSize">
+		Die Regionstexturen konnten nicht festgelegt werden:
+Die Terraintextur [TEXTURE_NUM] ist mit [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y] zu groß.
+
+Ersetzen Sie die Textur [TEXTURE_NUM] mit einer Bilddatei von maximal 512x512 und 24 Bit und klicken Sie dann erneut auf „Übernehmen“.
+	</notification>
+	<notification name="RawUploadStarted">
+		Hochladen gestartet. Je nach Verbindungsgeschwindigkeit kann der Vorgang bis zu 2 Minuten dauern.
+	</notification>
+	<notification name="ConfirmBakeTerrain">
+		Möchten Sie das aktuelle Terrain formen, es zum Mittelpunkt der oberen und unteren Terraingrenzen und zum Standard des „Zurücksetzen“-Tools machen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="MaxAllowedAgentOnRegion">
+		Es sind maximal [MAX_AGENTS] zulässige Einwohner erlaubt.
+	</notification>
+	<notification name="MaxBannedAgentsOnRegion">
+		Es sind maximal [MAX_BANNED] verbannte Einwohner erlaubt.
+	</notification>
+	<notification name="MaxAgentOnRegionBatch">
+		Fehler beim Versuch, [NUM_ADDED] Agenten hinzuzufügen:
+Überschreitet den Grenzwert [MAX_AGENTS] [LIST_TYPE] um [NUM_EXCESS].
+	</notification>
+	<notification name="MaxAllowedGroupsOnRegion">
+		Es sind maximal [MAX_GROUPS] zulässige Gruppen erlaubt.
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Formen"/>
+	</notification>
+	<notification name="MaxManagersOnRegion">
+		Es sind maximal [MAX_MANAGER]  verbannte Einwohner erlaub.
+	</notification>
+	<notification name="OwnerCanNotBeDenied">
+		Der Eigentümer des Grundstücks kann nicht zur Liste der „Verbannten Einwohner“ hinzugefügt werden.
+	</notification>
+	<notification name="CanNotChangeAppearanceUntilLoaded">
+		Das Aussehen lässt sich erst ändern, wenn Kleider und Form/Gestalt geladen sind.
+	</notification>
+	<notification name="ClassifiedMustBeAlphanumeric">
+		Der Name der Anzeige muss mit einem Buchstaben von A bis Z oder einer Ziffer beginnen.  Satzzeichen sind nicht erlaubt.
+	</notification>
+	<notification name="CantSetBuyObject">
+		„Objekt kaufen“ nicht möglich, da das Objekt nicht zum Verkauf freigegeben ist.
+Geben Sie das Objekt zum Verkauf frei und versuchen Sie es erneut.
+	</notification>
+	<notification name="FinishedRawDownload">
+		Raw-Terrain-Datei wurde heruntergeladen nach:
+[DOWNLOAD_PATH].
+	</notification>
+	<notification name="DownloadWindowsMandatory">
+		Eine neue Version von [APP_NAME] ist verfügbar.
+[MESSAGE]
+Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können.
+		<usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/>
+	</notification>
+	<notification name="DownloadWindows">
+		Eine aktualisierte Version von [APP_NAME] ist verfügbar.
+[MESSAGE]
+Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden.
+		<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/>
+	</notification>
+	<notification name="DownloadWindowsReleaseForDownload">
+		Eine aktualisierte Version von [APP_NAME] ist verfügbar.
+[MESSAGE]
+Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden.
+		<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/>
+	</notification>
+	<notification name="DownloadLinuxMandatory">
+		Eine neue Version von [SUPPORT_SITE] ist verfügbar.
+[MESSAGE]
+Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können.
+		<usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/>
+	</notification>
+	<notification name="DownloadLinux">
+		Eine neue Version von [APP_NAME] ist verfügbar.
+[MESSAGE]
+Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden.
+		<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/>
+	</notification>
+	<notification name="DownloadLinuxReleaseForDownload">
+		Eine neue Version von [APP_NAME] ist verfügbar.
+[MESSAGE]
+Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden.
+		<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/>
+	</notification>
+	<notification name="DownloadMacMandatory">
+		Eine neue Version von [APP_NAME] ist verfügbar.
+[MESSAGE]
+Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können.
+
+In Ihren Anwendungsordner herunterladen?
+		<usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/>
+	</notification>
+	<notification name="DownloadMac">
+		Eine aktualisierte Version von [APP_NAME] ist verfügbar.
+[MESSAGE]
+Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden.
+
+In Ihren Anwendungsordner herunterladen?
+		<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/>
+	</notification>
+	<notification name="DownloadMacReleaseForDownload">
+		Eine aktualisierte Version von [APP_NAME] ist verfügbar.
+[MESSAGE]
+Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden.
+
+In Ihren Anwendungsordner herunterladen?
+		<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/>
+	</notification>
+	<notification name="DeedObjectToGroup">
+		Bei Übertragung dieses Objekts erhält die Gruppe:
+* An das Objekt bezahlte L$
+		<usetemplate ignoretext="Bestätigen, bevor ich ein Objekt an eine Gruppe übertrage" name="okcancelignore" notext="Abbrechen" yestext="Übertragung"/>
+	</notification>
+	<notification name="WebLaunchExternalTarget">
+		Möchten Sie Ihren Internetbrowser öffnen, um diesen Inhalt anzuzeigen?
+		<usetemplate ignoretext="Meinen Browser starten, um eine Webseite anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchJoinNow">
+		de.secondlife.com öffnen, um Ihr Konto zu verwalten?
+		<usetemplate ignoretext="Meinen Browser starten, um mein Konto zu verwalten" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchSecurityIssues">
+		Informieren Sie sich im [SECOND_LIFE] Wiki, wie man Sicherheitsprobleme richtig meldet.
+		<usetemplate ignoretext="Meinen Browser starten, um anzuzeigen, wie ein Sicherheitsproblem gemeldet werden soll" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchQAWiki">
+		Besuchen Sie das [SECOND_LIFE] QA-Wiki.
+		<usetemplate ignoretext="Meinen Browser starten, um das QA-Wiki anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchPublicIssue">
+		Im [SECOND_LIFE] Allgemeine-Fragen-Tracker können Sie Fehler und andere Probleme melden.
+		<usetemplate ignoretext="Meinen Browser starten, um die Datenbank für Fehler und Verbesserungsvorschläge anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/>
+	</notification>
+	<notification name="WebLaunchSupportWiki">
+		Im offiziellen Linden-Blog finden Sie die neuesten Nachrichten und Informationen.
+		<usetemplate ignoretext="Meinen Browser starten, um das Blog anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchLSLGuide">
+		Möchten Sie den Scripting Guide öffnen?
+		<usetemplate ignoretext="Meinen Browser starten, um den Scripting Guide anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchLSLWiki">
+		Möchten Sie das LSL-Portal besuchen?
+		<usetemplate ignoretext="Meinen Browser starten, um das LSL-Portal anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/>
+	</notification>
+	<notification name="ReturnToOwner">
+		Möchten Sie die ausgewählten Objekte an ihre Eigentümer zurückgeben? Transferierbare übertragene Objekte werden ihren früheren Eigentümern zurückgegeben.
+
+*WARNUNG* Nicht transferierbare übertragene Objekte werden dabei gelöscht!
+		<usetemplate ignoretext="Bestätigen, bevor Objekte an Ihre Eigentümer zurückgegeben werden" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="GroupLeaveConfirmMember">
+		Sie sind Mitglied der Gruppe [GROUP].
+Diese Gruppe verlassen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmKick">
+		Möchten Sie WIRKLICH alle Benutzer aus dem Grid werfen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Alle Benutzer hinauswerfen"/>
+	</notification>
+	<notification name="MuteLinden">
+		Lindens können nicht stummgeschaltet werden.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="CannotStartAuctionAlreadyForSale">
+		Eine Parzelle, die bereits zum Verkauf freigegeben ist, kann nicht versteigert werden.  Deaktivieren Sie den Landverkauf, wenn Sie das Land zur Versteigerung freigeben möchten.
+	</notification>
+	<notification label="Objekt nach Name stummschalten fehlgeschlagen" name="MuteByNameFailed">
+		Dieser Name ist bereits stummgeschaltet.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="RemoveItemWarn">
+		Diese Aktion ist zwar erlaubt, aber beim Löschen von Inhalten wird das Objekt beschädigt. Möchten Sie dieses Element löschen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="CantOfferCallingCard">
+		Sie können gerade keine Visitenkarte übergeben. Warten Sie kurz und versuchen Sie es dann noch einmal.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="CantOfferFriendship">
+		Sie können gerade keine Freundschaft anbieten. Warten Sie kurz und versuchen Sie es dann noch einmal.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="BusyModeSet">
+		Beschäftigt-Modus ist aktiviert.
+Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachrichten) erhalten Ihre Beschäftigt-Antwort. Alle Teleport-Angebote werden abgelehnt. Alle Inventar-Angebote werden in Ihren Papierkorb geschoben.
+		<usetemplate ignoretext="Ich ändere meinen Status zu Beschäftigt" name="okignore" yestext="OK"/>
+	</notification>
+	<notification name="JoinedTooManyGroupsMember">
+		Sie haben die maximale Anzahl an Gruppen erreicht. Bitte verlassen Sie eine andere Gruppe, um dieser beitreten zu können oder lehnen Sie das Angebot ab.
+[NAME]  hat Sie eingeladen, einer Gruppe beizutreten.
+[INVITE]
+		<usetemplate name="okcancelbuttons" notext="Ablehnen" yestext="Beitreten"/>
+	</notification>
+	<notification name="KickUser">
+		Beim Hinauswerfen dieses Benutzers welche Meldung anzeigen?
+		<form name="form">
+			<input name="message">
+				Sie wurden von einem Administrator abgemeldet.
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Abbrechen"/>
+		</form>
+	</notification>
+	<notification name="KickAllUsers">
+		Beim Hinauswerfen aller Personen vom Grid welche Meldung anzeigen?
+		<form name="form">
+			<input name="message">
+				Sie wurden von einem Administrator abgemeldet.
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Abbrechen"/>
+		</form>
+	</notification>
+	<notification name="FreezeUser">
+		Beim Einfrieren dieses Benutzers welche Meldung anzeigen?
+		<form name="form">
+			<input name="message">
+				Sie wurden eingefroren. Bewegen oder Chatten ist nicht mehr möglich. Ein Administrator wird sich über IM an Sie wenden
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Abbrechen"/>
+		</form>
+	</notification>
+	<notification name="UnFreezeUser">
+		Beim Auftauen dieses Benutzers welche Meldung anzeigen?
+		<form name="form">
+			<input name="message">
+				Sie sind nicht mehr eingefroren.
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Abbrechen"/>
+		</form>
+	</notification>
+	<notification name="OfferTeleport">
+		Teleport an Ihre Position mit der folgenden Meldung anbieten?
+		<form name="form">
+			<input name="message">
+				Triff mich in [REGION]
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Abbrechen"/>
+		</form>
+	</notification>
+	<notification name="OfferTeleportFromGod">
+		Benutzer an Ihrem Standort herbeirufen?
+		<form name="form">
+			<input name="message">
+				Triff mich in [REGION]
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Abbrechen"/>
+		</form>
+	</notification>
+	<notification name="TeleportFromLandmark">
+		Möchten Sie sich wirklich teleportieren?
+		<usetemplate ignoretext="Bestätigen, dass ich zu einer Landmarke teleportieren möchte" name="okcancelignore" notext="Abbrechen" yestext="Teleportieren"/>
+	</notification>
+	<notification name="TeleportToPick">
+		Nach [PICK] teleportieren?
+		<usetemplate ignoretext="Bestätigen, dass ich zu einer Position in Auswahl teleportieren möchte" name="okcancelignore" notext="Abbrechen" yestext="Teleportieren"/>
+	</notification>
+	<notification label="Nachricht an alle auf diesem Grundstück" name="MessageEstate">
+		Geben Sie eine kurze Nachricht ein, die an jede Person auf Ihrem Grundstück gesendet wird.
+		<form name="form">
+			<input name="message"/>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Abbrechen"/>
+		</form>
+	</notification>
+	<notification label="Linden-Grundstück ändern" name="ChangeLindenEstate">
+		Sie sind im Begriff, ein Grundstück in Linden-Besitz (Mainland, Teen-Raster, Orientierung usw.) zu verändern.
+
+Dies ist ÄUSSERST GEFÄHRLICH, da es grundlegende Auswirkungen auf das Benutzererlebnis hat.  Auf dem Mainland werden tausende Regionen geändert, was den Spaceserver stark belastet.
+
+Fortfahren?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification label="Zugang zu Linden-Grundstück ändern" name="ChangeLindenAccess">
+		Sie sind im Begriff, die Zugangsliste für ein Grundstück in Linden-Besitz (Mainland, Teen-Raster, Orientierung usw.) zu verändern.
+
+Dies ist GEFÄHRLICH und sollte nur erfolgen, um Objekte/L$ per Hack in und aus dem Raster zu entfernen.
+Tausende Regionen werden verändert und der Spaceserver wird dadurch stark belastet.
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification label="Grundstück wählen" name="EstateAllowedAgentAdd">
+		Nur für dieses Grundstück oder für alle [ALL_ESTATES] zur Erlaubnisliste hinzufügen?
+		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
+	</notification>
+	<notification label="Grundstück wählen" name="EstateAllowedAgentRemove">
+		Nur für dieses Grundstück oder für alle [ALL_ESTATES] von Erlaubnisliste entfernen?
+		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
+	</notification>
+	<notification label="Grundstück wählen" name="EstateAllowedGroupAdd">
+		Nur für dieses Grundstück oder für alle [ALL_ESTATES] zur Gruppen-Erlaubnisliste hinzufügen?
+		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
+	</notification>
+	<notification label="Grundstück wählen" name="EstateAllowedGroupRemove">
+		Nur für dieses Grundstück oder für alle [ALL_ESTATES] von Gruppen-Erlaubnisliste entfernen?
+		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
+	</notification>
+	<notification label="Grundstück wählen" name="EstateBannedAgentAdd">
+		Zugang nur für dieses Grundstück oder für [ALL_ESTATES] verweigern?
+		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
+	</notification>
+	<notification label="Grundstück wählen" name="EstateBannedAgentRemove">
+		Einwohner nur für dieses Grundstück oder für alle [ALL_ESTATES] von der Bannliste entfernen?
+		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
+	</notification>
+	<notification label="Grundstück wählen" name="EstateManagerAdd">
+		Verwalter nur für dieses Grundstück oder für [ALL_ESTATES] festlegen?
+		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
+	</notification>
+	<notification label="Grundstück wählen" name="EstateManagerRemove">
+		Verwalter nur für dieses Grundstück oder für [ALL_ESTATES] entfernen?
+		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
+	</notification>
+	<notification label="Rauswurf bestätigen" name="EstateKickUser">
+		Benutzer [EVIL_USER] von diesem Grundstück werfen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="EstateChangeCovenant">
+		Möchten Sie den Grundstücksvertrag wirklich ändern?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="RegionEntryAccessBlocked">
+		Sie dürfen diese Region aufgrund Ihrer Alterseinstufung nicht betreten. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind.
+
+Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben und besuchen Sie unsere Knowledgebase, um mehr über Regionen mit dieser Altereinstufung zu erfahren.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="RegionEntryAccessBlocked_KB">
+		Sie dürfen diese Region aufgrund Ihrer Alterseinstufung nicht betreten.
+
+Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten?
+		<url name="url">
+			http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB)
+		</url>
+		<usetemplate ignoretext="Ich kann diese Region aufgrund der Alterseinstufung nicht betreten" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
+	</notification>
+	<notification name="RegionEntryAccessBlocked_Notify">
+		Aufgrund Ihrer Alterseinstufung dürfen Sie diese Region nicht betreten.
+	</notification>
+	<notification name="RegionEntryAccessBlocked_Change">
+		Sie dürfen diese Region aufgrund der Einstellung Ihrer Alterseinstufung nicht betreten.
+
+Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten &gt; Einstellungen... &gt; Allgemein.
+		<form name="form">
+			<button name="OK" text="Einstellung ändern"/>
+			<button name="Cancel" text="Schließen"/>
+			<ignore name="ignore" text="Meine Alterseinstufung lässt nicht zu, dass ich eine Region betrete."/>
+		</form>
+	</notification>
+	<notification name="LandClaimAccessBlocked">
+		Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind.
+
+Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben und besuchen Sie unsere Knowledgebase, um mehr über Regionen mit dieser Altereinstufung zu erfahren.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="LandClaimAccessBlocked_KB">
+		Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land.
+
+Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten?
+		<url name="url">
+			http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB)
+		</url>
+		<usetemplate ignoretext="Ich habe aufgrund der Alterseinstufung keinen Anspruch auf dieses Land" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
+	</notification>
+	<notification name="LandClaimAccessBlocked_Notify">
+		Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land.
+	</notification>
+	<notification name="LandClaimAccessBlocked_Change">
+		Sie haben aufgrund der Einstellung Ihrer Alterseinstufung keinen Anspruch auf dieses Land.
+
+Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten &gt; Einstellungen... &gt; Allgemein.
+		<usetemplate ignoretext="Meine Alterseinstufung lässt nicht zu, dass ich auf Land Anspruch erhebe" name="okcancelignore" notext="Schließen" yestext="Einstellung ändern"/>
+	</notification>
+	<notification name="LandBuyAccessBlocked">
+		Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind.
+
+Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben und besuchen Sie unsere Knowledgebase, um mehr über Regionen mit dieser Altereinstufung zu erfahren.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="LandBuyAccessBlocked_KB">
+		Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen.
+
+Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten?
+		<url name="url">
+			http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB)
+		</url>
+		<usetemplate ignoretext="Ich kann aufgrund der Alterseinstufung dieses Land nicht kaufen" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
+	</notification>
+	<notification name="LandBuyAccessBlocked_Notify">
+		Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen.
+	</notification>
+	<notification name="LandBuyAccessBlocked_Change">
+		Sie können aufgrund Ihrer Einstellung für Alterseinstufung dieses Land nicht kaufen.
+
+Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten &gt; Einstellungen... &gt; Allgemein.
+		<usetemplate ignoretext="Meine Alterseinstufung lässt nicht zu, dass ich Land kaufe" name="okcancelignore" notext="Schließen" yestext="Einstellung ändern"/>
+	</notification>
+	<notification name="TooManyPrimsSelected">
+		&quot;Zu viele Prims wurden ausgewählt.  Bitte wählen Sie höchstens [MAX_PRIM_COUNT] Prims aus und versuchen Sie es erneut.&quot;
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="ProblemImportingEstateCovenant">
+		Problem beim Import des Grundstückvertrags.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="ProblemAddingEstateManager">
+		Es gibt Probleme beim Hinzufügen eines neuen Grundstücksverwalters.  Bei mindestens einem Grundstück ist die Verwalterliste voll.
+	</notification>
+	<notification name="ProblemAddingEstateGeneric">
+		Problem beim Hinzufügen zu dieser Grundstücksliste.  Bei mindestens einem Grundstück ist die Liste voll.
+	</notification>
+	<notification name="UnableToLoadNotecardAsset">
+		Notizkarten-Asset konnte nicht geladen werden.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="NotAllowedToViewNotecard">
+		Unzureichende Rechte, um die mit der angeforderten Asset-ID verbundene Notizkarte anzuzeigen.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="MissingNotecardAssetID">
+		Asset-ID für Notizkarte fehlt in Datenbank.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="PublishClassified">
+		Hinweis: Anzeigengebühren werden nicht zurückerstattet.
+
+Anzeige für [AMOUNT] L$ veröffentlichen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="SetClassifiedMature">
+		Enthält diese Anzeige Mature-Inhalte?
+		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nein" yestext="Ja"/>
+	</notification>
+	<notification name="SetGroupMature">
+		Beschäftigt sich diese Gruppe mit Mature-Inhalten?
+		<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nein" yestext="Ja"/>
+	</notification>
+	<notification label="Neustart bestätigen" name="ConfirmRestart">
+		Möchten Sie diese Region in 2 Minuten neu starten?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification label="Nachricht an alle in dieser Region" name="MessageRegion">
+		Geben Sie eine kurze Nachricht ein, die an jede Person in dieser Region gesendet wird.
+		<form name="form">
+			<input name="message"/>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Abbrechen"/>
+		</form>
+	</notification>
+	<notification label="Alterseinstufung der Region ändern" name="RegionMaturityChange">
+		Die Alterseinstufung dieser Region wurde aktualisiert.
+Es kann eine Weile dauern, bis sich die Änderung auf die Karte auswirkt.
+	</notification>
+	<notification label="Falsche Voice-Version" name="VoiceVersionMismatch">
+		Diese Version von [APP_NAME] mit dem Voice-Chat-Feature in dieser Region nicht kompatibel. Damit Voice-Chat funktioniert, müssen Sie [APP_NAME] aktualisieren.
+	</notification>
+	<notification label="Objekte können nicht gekauft werden" name="BuyObjectOneOwner">
+		Objekte können nicht von mehreren Eigentümern gleichzeitig gekauft werden.
+Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut.
+	</notification>
+	<notification label="Inhalte können nicht gekauft werden" name="BuyContentsOneOnly">
+		Inhalte können jeweils nur für ein Objekt gekauft werden.
+Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut.
+	</notification>
+	<notification label="Inhalte können nicht gekauft werden" name="BuyContentsOneOwner">
+		Objekte können nicht von mehreren Eigentümern gleichzeitig gekauft werden.
+Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut.
+	</notification>
+	<notification name="BuyOriginal">
+		Von [OWNER] Originalobjekt für [PRICE] L$ kaufen?
+Sie werden der Eigentümer dieses Objekts.
+Sie können das Objekt:
+ Bearbeiten: [MODIFYPERM]
+ Kopieren: [COPYPERM]
+ Verkaufen oder weggeben: [RESELLPERM]
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="BuyOriginalNoOwner">
+		Originalobjekt für [PRICE] L$ kaufen?
+Sie werden der Eigentümer dieses Objekts.
+Sie können das Objekt:
+ Bearbeiten: [MODIFYPERM]
+ Kopieren: [COPYPERM]
+ Verkaufen oder weggeben: [RESELLPERM]
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="BuyCopy">
+		Von [OWNER] Kopie für [PRICE] L$ kaufen?
+Das Objekt wird in Ihr Inventar kopiert.
+Sie können das Objekt:
+ Bearbeiten: [MODIFYPERM]
+ Kopieren: [COPYPERM]
+ Verkaufen oder weggeben: [RESELLPERM]
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="BuyCopyNoOwner">
+		Kopie für [PRICE] L$ kaufen?
+Das Objekt wird in Ihr Inventar kopiert.
+Sie können das Objekt:
+ Bearbeiten: [MODIFYPERM]
+ Kopieren: [COPYPERM]
+ Verkaufen oder weggeben: [RESELLPERM]
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="BuyContents">
+		Von [OWNER] Inhalte für [PRICE] L$ kaufen?
+Die Inhalte werden in Ihr Inventar kopiert.
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="BuyContentsNoOwner">
+		Inhalte für [PRICE] L$ kaufen?
+Die Inhalte werden in Ihr Inventar kopiert.
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmPurchase">
+		Transaktion:
+[ACTION]
+
+Möchten Sie diesen Kauf fortsetzen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmPurchasePassword">
+		Transaktion:
+[ACTION]
+
+Möchten Sie diesen Kauf fortsetzen?
+Geben Sie Ihr Kennwort erneut ein und klicken Sie auf OK.
+		<form name="form">
+			<input name="message"/>
+			<button name="ConfirmPurchase" text="OK"/>
+			<button name="Cancel" text="Abbrechen"/>
+		</form>
+	</notification>
+	<notification name="SetPickLocation">
+		Hinweis:
+Sie haben die Position dieser Auswahl aktualisiert, aber die anderen Daten behalten ihre ursprünglichen Werte.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="MoveInventoryFromObject">
+		Sie haben „nicht kopierfähige“ Inventarobjekte ausgewählt.
+Diese Objekte werden nicht kopiert, sondern in Ihr Inventar verschoben.
+
+Inventarobjekt(e) verschieben?
+		<usetemplate ignoretext="Warnhinweis anzeigen, bevor ich nicht kopierbare Artikel aus einem Objekt verschiebe" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="MoveInventoryFromScriptedObject">
+		Sie haben „nicht kopierfähige“ Inventarobjekte ausgewählt.  Diese Objekte werden nicht kopiert, sondern in Ihr Inventar verschoben.
+Da es sich um ein geskriptetes Objekt handelt, geht die Skriptfunktion beim Verschieben in das Inventar möglicherweise verloren.
+
+Inventarobjekt(e) verschieben?
+		<usetemplate ignoretext="Warnhinweis anzeigen, bevor ich nicht-kopierbare Artikel verschiebe, die ein geskriptetes Objekt beschädigen können" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ClickActionNotPayable">
+		Achtung: Die Klickaktion „Objekt bezahlen&quot; wurde eingestellt. Diese funktioniert jedoch nicht, wenn ein Skript mit einer Geldtransaktion () hinzugefügt wird.
+		<form name="form">
+			<ignore name="ignore" text="I habe die Aktion „Objekt bezahlen&quot; eingestellt, während ich ein Objekt gebaut habe, dass kein Geld()-Skript enthält."/>
+		</form>
+	</notification>
+	<notification name="OpenObjectCannotCopy">
+		Sie haben keine Berechtigung zum Kopieren von Elementen in diesem Objekt.
+	</notification>
+	<notification name="WebLaunchAccountHistory">
+		de.secondlife.com öffnen, um Ihre Konto-Statistik anzuzeigen?
+		<usetemplate ignoretext="Meinen Browser starten, um meine Konto-Statistik anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/>
+	</notification>
+	<notification name="ConfirmQuit">
+		Wirklich beenden?
+		<usetemplate ignoretext="Bestätigen, bevor Sitzung beendet wird" name="okcancelignore" notext="Nicht beenden" yestext="Beenden"/>
+	</notification>
+	<notification name="HelpReportAbuseEmailLL">
+		Verwenden Sie dieses Tool, um Verletzungen der Servicebedingungen und Community-Standards zu melden. Siehe:
+
+http://secondlife.com/corporate/tos.php
+http://secondlife.com/corporate/cs.php
+
+Alle gemeldeten Verletzungen der Servicebedingungen und Community-Standards werden geprüft und geklärt Sie können den Prozess im Incident Report (Vorfallsbericht) verfolgen:
+
+http://secondlife.com/support/incidentreport.php
+	</notification>
+	<notification name="HelpReportAbuseEmailEO">
+		WICHTIG: Diese Meldung wird an den Eigentümer der Region gesendet, in der Sie sich gerade befinden, nicht an Linden Lab.
+-
+Als besonderen Service für Einwohner und Besucher übernimmt der Eigentümer dieser Region die Bearbeitung aller anfallenden Meldungen. Von diesem Standort aus eingereichte Meldungen werden nicht von Linden Lab bearbeitet. Der Eigentümer der Region bearbeitet Meldungen auf Grundlage der Richtlinien, die im für diese Region geltenden Grundstücksvertrag festgelegt sind.
+(Den Vertrag können Sie unter „Welt“ &gt; „Land-Info“ einsehen.)
+-
+Das Resultat, das sich aus dieser Meldung ergibt, betrifft nur diese Region; der Einwohnerzugang zu anderen Bereichen von [SECOND_LIFE] ist davon nicht betroffen. Nur Linden Lab kann den Zugang zu [SECOND_LIFE] beschränken.
+	</notification>
+	<notification name="HelpReportAbuseSelectCategory">
+		Wählen Sie eine Missbrauchskategorie aus.
+Die Angabe einer Kategorie hilft uns bei der Bearbeitung des Berichts.
+	</notification>
+	<notification name="HelpReportAbuseAbuserNameEmpty">
+		Geben Sie den Namen des Täters ein.
+Eine genaue Angabe hilft uns, Fälle von Missbrauch zu ahnden.
+	</notification>
+	<notification name="HelpReportAbuseAbuserLocationEmpty">
+		Bitte geben Sie den Ort an, an dem der Missbrauch stattgefunden hat.
+Eine genaue Angabe hilft uns, Fälle von Missbrauch zu ahnden.
+	</notification>
+	<notification name="HelpReportAbuseSummaryEmpty">
+		Bitte geben Sie eine Zusammenfassung des Vorfalls ein.
+Eine genaue Zusammenfassung hilft uns, Fälle von Missbrauch zu ahnden.
+	</notification>
+	<notification name="HelpReportAbuseDetailsEmpty">
+		Bitte geben Sie eine ausführliche Beschreibung des Vorfalls ein.
+Eine möglichst genaue Beschreibung mit Namen und Einzelheiten hilft uns, Fälle von Missbrauch zu ahnden.
+	</notification>
+	<notification name="HelpReportAbuseContainsCopyright">
+		Sehr geehrte(r) Einwohner(in),
+
+Sie melden eine Urheberrechtsverletzung. Sind Sie wirklich sicher, dass Sie eine Verletzung des Urheberrechts melden möchten?
+
+1. Missbrauch melden. Wenn Sie der Meinung sind, ein Einwohner nutzt das Berechtigungssystem von [SECOND_LIFE] auf unerlaubte Weise zu seinem Vorteil aus, indem er zum Beispiel einen CopyBot oder ähnliche Kopiertools verwendet und damit eine Urheberrechtsverletzung begeht, können Sie diesen Missbrauch melden. Das Missbrauchsteam untersucht etwaige Verstöße gegen die [SECOND_LIFE] Community Standards oder die Nutzungsbedingungen und verhängt entsprechende Strafen. Das Missbrauchsteam ist jedoch nicht dafür zuständig, Inhalte aus der [SECOND_LIFE]-Welt zu entfernen und reagiert auch nicht auf entsprechende Anfragen.
+
+2. Der DMCA oder das Entfernen von Inhalten. Sie können das Entfernen von Inhalten aus [SECOND_LIFE] beantragen. Dazu MÜSSEN Sie eine Urheberrechtsverletzung gemäß den in unserer DMCA-Richtlinie unter http://secondlife.com/corporate/dmca.php dargelegten Anweisungen einreichen.
+
+Wenn Sie mit der Missbrauchmeldung jetzt fortfahren möchten, schließen Sie bitte dieses Fenster und senden Sie Ihren Bericht ein.  Möglicherweise müssen Sie Kategorie „CopyBot oder Berechtigungs-Exploit“ auswählen.
+
+Vielen Dank,
+
+Linden Lab
+	</notification>
+	<notification name="FailedRequirementsCheck">
+		Die folgenden erforderlichen Komponenten fehlen in [FLOATER]:
+[COMPONENTS]
+	</notification>
+	<notification label="Vorhandenen Anhang ersetzen" name="ReplaceAttachment">
+		An dieser Körperstelle ist bereits ein Objekt angebracht.
+Möchten Sie es mit dem ausgewählten Objekt ersetzen?
+		<form name="form">
+			<ignore name="ignore" save_option="true" text="Einen bestehenden Anhang mit dem ausgewählten Artikel ersetzen"/>
+			<button ignore="Automatisch ersetzen" name="Yes" text="OK"/>
+			<button ignore="Nie ersetzen" name="No" text="Abbrechen"/>
+		</form>
+	</notification>
+	<notification label="Beschäftigt-Modus-Warnung" name="BusyModePay">
+		Sie sind im Beschäftigt-Modus, sodass Sie im Austausch für diese Zahlung keine Objekte erhalten können.
+
+Möchten Sie den Bechäftigt-Modus verlassen, bevor Sie diese Transaktion abschließen?
+		<form name="form">
+			<ignore name="ignore" save_option="true" text="Ich bin im Begriff eine Person oder ein Objekt zu bezahlen, während ich im Modus Beschäftigt bin."/>
+			<button ignore="Beschäftigt-Modus immer deaktivieren" name="Yes" text="OK"/>
+			<button ignore="Beschäftigt-Modus aktiviert lassen" name="No" text="Abbrechen"/>
+		</form>
+	</notification>
+	<notification name="ConfirmEmptyTrash">
+		Sind Sie sicher, dass Sie den Inhalt Ihres Papierkorbs löschen möchten?
+		<usetemplate ignoretext="Bestätigen, bevor der Ordner Papierkorb im Inventar geleert wird" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmClearBrowserCache">
+		Sind Sie sicher, dass Sie Ihren Reise-, Internet- und Suchverlauf löschen möchten?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/>
+	</notification>
+	<notification name="ConfirmClearCookies">
+		Sind Sie sicher, dass Sie Ihre Cookies löschen möchten?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/>
+	</notification>
+	<notification name="ConfirmClearMediaUrlList">
+		Die Liste mit gespeicherten URLs wirklich löschen?
+		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/>
+	</notification>
+	<notification name="ConfirmEmptyLostAndFound">
+		Sind Sie sicher, dass Sie den Inhalt Ihres Ordners Fundbüro löschen möchten?
+		<usetemplate ignoretext="Bestätigen, bevor der Ordner Fundbüro im Inventar geleert wird" name="okcancelignore" notext="Nein" yestext="Ja"/>
+	</notification>
+	<notification name="CopySLURL">
+		Die folgende SLurl wurde in die Zwischenablage kopiert:
+ [SLURL]
+
+Von einer Webseite zu diesem Formular linken, um anderen leichten Zugang zu dieser Position zu ermöglichen. Oder versuchen Sie es selbst: kopieren Sie die SLurl in die Adressleiste eines Webbrowsers.
+		<form name="form">
+			<ignore name="ignore" text="Slurl wurde in meine Zwischenablage kopiert"/>
+		</form>
+	</notification>
+	<notification name="WLSavePresetAlert">
+		Die gespeicherte Voreinstellung überschreiben?
+		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
+	</notification>
+	<notification name="WLDeletePresetAlert">
+		[SKY] löschen?
+		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
+	</notification>
+	<notification name="WLNoEditDefault">
+		Standardvoreinstellungen können nicht bearbeitet oder gelöscht werden.
+	</notification>
+	<notification name="WLMissingSky">
+		Diese Tageszyklusdatei verweist auf eine fehlende Himmel-Datei: [SKY].
+	</notification>
+	<notification name="PPSaveEffectAlert">
+		Post-Processing-Effekt bereits vorhanden. Möchten Sie ihn überschreiben?
+		<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
+	</notification>
+	<notification name="NewSkyPreset">
+		Wählen Sie einen Namen für den neuen Himmel.
+		<form name="form">
+			<input name="message">
+				Neue Voreinstellung
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Abbrechen"/>
+		</form>
+	</notification>
+	<notification name="ExistsSkyPresetAlert">
+		Voreinstellung bereits vorhanden!
+	</notification>
+	<notification name="NewWaterPreset">
+		Wählen Sie einen Namen für die neue Wasservoreinstellung.
+		<form name="form">
+			<input name="message">
+				Neue Voreinstellung
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Abbrechen"/>
+		</form>
+	</notification>
+	<notification name="ExistsWaterPresetAlert">
+		Voreinstellung bereits vorhanden!
+	</notification>
+	<notification name="WaterNoEditDefault">
+		Standardvoreinstellungen können nicht bearbeitet oder gelöscht werden.
+	</notification>
+	<notification name="ChatterBoxSessionStartError">
+		Neue Chat-Sitzung mit [RECIPIENT] konnte nicht gestartet werden.
+[REASON]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="ChatterBoxSessionEventError">
+		[EVENT]
+[REASON]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="ForceCloseChatterBoxSession">
+		Ihre Chat-Sitzung mit [NAME] muss beendet werden.
+[REASON]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="Cannot_Purchase_an_Attachment">
+		Sie können kein Objekt kaufen, während es angehängt ist.
+	</notification>
+	<notification label="Info zur Abfrage der Abbucherlaubnis" name="DebitPermissionDetails">
+		Wenn Sie dieser Anfrage zustimmen, erhält das Skript die Erlaubnis, regelmäßig Linden-Dollar (L$) von Ihrem Konto abzubuchen. Diese Erlaubnis kann nur zurückgezogen werden, wenn der Eigentümer das Objekt löscht oder die Skripts in dem Objekt zurücksetzt.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="AutoWearNewClothing">
+		Möchten Sie das neu erstellte Kleidungsstück automatisch anziehen?
+		<usetemplate ignoretext="Die Kleidung, die während dem Bearbeiten meines Aussehens erstellt wird, sofort anziehen" name="okcancelignore" notext="Nein" yestext="Ja"/>
+	</notification>
+	<notification name="NotAgeVerified">
+		Sie müssen altersüberprüft sein, um diesen Bereich betreten zu können.  Möchten Sie auf der [SECOND_LIFE]-Webseite Ihr Alter verifizieren lassen?
+
+[_URL]
+		<url name="url" option="0">
+			https://secondlife.com/account/verification.php?lang=de
+		</url>
+		<usetemplate ignoretext="Ich habe mein Alter nicht verifizieren lassen" name="okcancelignore" notext="Nein" yestext="Ja"/>
+	</notification>
+	<notification name="Cannot enter parcel: no payment info on file">
+		Um diesen Bereich besuchen zu können, müssen Ihre Zahlungsinformationen gespeichert sein.  Möchten Sie diese Einstellung auf der [SECOND_LIFE]-Webseite einrichten?
+
+[_URL]
+		<url name="url" option="0">
+			https://secondlife.com/account/index.php?lang=de
+		</url>
+		<usetemplate ignoretext="Meine Zahlungsinformation ist nicht gespeichert" name="okcancelignore" notext="Nein" yestext="Ja"/>
+	</notification>
+	<notification name="MissingString">
+		Der String „[STRING_NAME]“ fehlt in strings.xml
+	</notification>
+	<notification name="SystemMessageTip">
+		[MESSAGE]
+	</notification>
+	<notification name="Cancelled">
+		Abgebrochen
+	</notification>
+	<notification name="CancelledSit">
+		Sitzen beendet
+	</notification>
+	<notification name="CancelledAttach">
+		Anhängen abgebrochen
+	</notification>
+	<notification name="ReplacedMissingWearable">
+		Fehlende(s) Kleidung/Körperteil mit Standard ersetzt.
+	</notification>
+	<notification name="GroupNotice">
+		Betreff: [SUBJECT], Nachricht: [MESSAGE]
+	</notification>
+	<notification name="FriendOnline">
+		[FIRST] [LAST] ist online
+	</notification>
+	<notification name="FriendOffline">
+		[FIRST] [LAST] ist offline
+	</notification>
+	<notification name="AddSelfFriend">
+		Obwohl Sie ein sehr netter Mensch sind, können Sie sich nicht selbst als Freund hinzufügen.
+	</notification>
+	<notification name="UploadingAuctionSnapshot">
+		In-Welt- und Website-Fotos werden hochgeladen...
+(Dauert ca. 5 Minuten.)
+	</notification>
+	<notification name="UploadPayment">
+		Sie haben für das Hochladen [AMOUNT] L$ bezahlt.
+	</notification>
+	<notification name="UploadWebSnapshotDone">
+		Das Website-Foto wurde hochgeladen.
+	</notification>
+	<notification name="UploadSnapshotDone">
+		In-Welt-Foto hochgeladen
+	</notification>
+	<notification name="TerrainDownloaded">
+		Terrain.raw heruntergeladen
+	</notification>
+	<notification name="GestureMissing">
+		Geste [NAME] fehlt in Datenbank.
+	</notification>
+	<notification name="UnableToLoadGesture">
+		Geste [NAME] konnte nicht geladen werden.
+Bitte versuchen Sie es erneut.
+	</notification>
+	<notification name="LandmarkMissing">
+		Landmarke fehlt in Datenbank.
+	</notification>
+	<notification name="UnableToLoadLandmark">
+		Landmarke konnte nicht geladen werden.  Bitte versuchen Sie es erneut.
+	</notification>
+	<notification name="CapsKeyOn">
+		Die Umschalttaste ist aktiv.
+Dies kann die Eingabe Ihres Passworts beeinflussen.
+	</notification>
+	<notification name="NotecardMissing">
+		Notizkarte fehlt in Datenbank.
+	</notification>
+	<notification name="NotecardNoPermissions">
+		Ihnen fehlt die Berechtigung zur Anzeige dieser Notizkarte.
+	</notification>
+	<notification name="RezItemNoPermissions">
+		Keine Berechtigung zum Rezzen von Objekten.
+	</notification>
+	<notification name="UnableToLoadNotecard">
+		Notizkarten-Asset konnte nicht geladen werden.
+	</notification>
+	<notification name="ScriptMissing">
+		Skript fehlt in Datenbank.
+	</notification>
+	<notification name="ScriptNoPermissions">
+		Unzureichende Rechte zur Anzeige des Skripts.
+	</notification>
+	<notification name="UnableToLoadScript">
+		Skript konnte nicht geladen werden.  Bitte versuchen Sie es erneut.
+	</notification>
+	<notification name="IncompleteInventory">
+		Die von Ihnen angebotenen Inhalte sind noch nicht vollständig lokal verfügbar. Warten Sie kurz und wiederholen Sie dann das Angebot.
+	</notification>
+	<notification name="CannotModifyProtectedCategories">
+		Geschützte Kategorien können nicht geändert werden.
+	</notification>
+	<notification name="CannotRemoveProtectedCategories">
+		Geschützte Kategorien können nicht entfernt werden.
+	</notification>
+	<notification name="OfferedCard">
+		Sie haben [FIRST] [LAST] eine Visitenkarte angeboten.
+	</notification>
+	<notification name="UnableToBuyWhileDownloading">
+		Kauf nicht möglich. Objektdaten werden noch geladen.
+Bitte versuchen Sie es erneut.
+	</notification>
+	<notification name="UnableToLinkWhileDownloading">
+		Verknüpfung nicht möglich. Objektdaten werden noch geladen.
+Bitte versuchen Sie es erneut.
+	</notification>
+	<notification name="CannotBuyObjectsFromDifferentOwners">
+		Sie können nur von einem Eigentümer auf einmal Objekte kaufen.
+Wählen Sie ein einzelnes Objekt aus.
+	</notification>
+	<notification name="ObjectNotForSale">
+		Dieses Objekt wird nicht verkauft.
+	</notification>
+	<notification name="EnteringGodMode">
+		Gott-Modus aktiviert, Level [LEVEL]
+	</notification>
+	<notification name="LeavingGodMode">
+		Gott-Modus wird nun de-aktiviert, Level [LEVEL]
+	</notification>
+	<notification name="CopyFailed">
+		Ihnen fehlt die Berechtigung zum Kopieren.
+	</notification>
+	<notification name="InventoryAccepted">
+		[NAME] hat Ihr Inventarangebot akzeptiert.
+	</notification>
+	<notification name="InventoryDeclined">
+		[NAME] hat Ihr Inventarangebot abgelehnt.
+	</notification>
+	<notification name="ObjectMessage">
+		[NAME]: [MESSAGE]
+	</notification>
+	<notification name="CallingCardAccepted">
+		Ihre Visitenkarte wurde akzeptiert.
+	</notification>
+	<notification name="CallingCardDeclined">
+		Ihre Visitenkarte wurde abgelehnt.
+	</notification>
+	<notification name="TeleportToLandmark">
+		Jetzt, nachdem Sie das Mainland erreicht haben, können Sie sich an Positionen wie „[NAME]“ teleportieren, indem Sie unten rechts im Fenster auf „Inventar“ klicken und den Ordner „Landmarken“ auswählen.
+Klicken Sie eine Landmarke doppelt an und wählen Sie „Teleportieren“, um an diesen Ort zu gelangen.
+	</notification>
+	<notification name="TeleportToPerson">
+		Jetzt, nachdem Sie das Mainland erreicht haben, können Sie mit Einwohnern wie „[NAME]“ Kontakt aufnehmen, indem Sie unten rechts im Fenster auf „Inventar“ klicken und den Ordner „Visitenkarten“ auswählen.
+Klicken Sie die Karte doppelt an, wählen Sie „Instant Message“ und geben Sie eine Nachricht ein.
+	</notification>
+	<notification name="CantSelectLandFromMultipleRegions">
+		Land kann nicht über Servergrenzen hinweg ausgewählt werden.
+Wählen Sie eine kleinere Landfläche.
+	</notification>
+	<notification name="SearchWordBanned">
+		Einige Begriffe in Ihrer Suchanfrage wurden ausgeschlossen, aufgrund von in den Community Standards definierten Inhaltsbeschränkungen.
+	</notification>
+	<notification name="NoContentToSearch">
+		Bitte wählen Sie mindestens eine Inhaltsart für die Suche aus (PG, Mature oder Adult).
+	</notification>
+	<notification name="GroupVote">
+		[NAME] hat eine Abstimmung vorgeschlagen über:
+[MESSAGE]
+		<form name="form">
+			<button name="VoteNow" text="Abstimmen"/>
+			<button name="Later" text="Später"/>
+		</form>
+	</notification>
+	<notification name="SystemMessage">
+		[MESSAGE]
+	</notification>
+	<notification name="EventNotification">
+		Event-Benachrichtigung:
+
+[NAME]
+[DATE]
+		<form name="form">
+			<button name="Teleport" text="Teleportieren"/>
+			<button name="Description" text="Beschreibung"/>
+			<button name="Cancel" text="Abbrechen"/>
+		</form>
+	</notification>
+	<notification name="TransferObjectsHighlighted">
+		Alle Objekte auf dieser Parzelle, die an den Käufer der Parzelle übertragen werden, sind jetzt markiert.
+
+* Übertragene Bäume und Gräser sind nicht markiert.
+		<form name="form">
+			<button name="Done" text="Fertig"/>
+		</form>
+	</notification>
+	<notification name="DeactivatedGesturesTrigger">
+		Gesten mit demselben Trigger wurden deaktiviert:
+[NAMES]
+	</notification>
+	<notification name="NoQuickTime">
+		Apple QuickTime ist auf Ihrem System anscheinend nicht installiert.
+Laden Sie QuickTime von der QuickTime-Webseite (http://www.apple.com/de/quicktime) herunter, um auf Parzellen, die diese Funktion unterstützen, Streaming-Inhalte wiederzugeben.
+	</notification>
+	<notification name="NoPlugin">
+		Es wurde kein Medien-Plugin gefunden, das &quot;[MIME_TYPE]&quot; ausführen kann.  Medien dieses Dateityps sind nicht verfügbar.
+	</notification>
+	<notification name="MediaPluginFailed">
+		Bei folgendem Plugin ist ein Fehler aufgetreten:
+    [PLUGIN]
+
+Bitte installieren Sie das Plugin erneut. Falls weiterhin Problem auftreten, kontaktieren Sie bitte den Hersteller.
+		<form name="form">
+			<ignore name="ignore" text="Ein Plugin kann nicht ausgeführt werden"/>
+		</form>
+	</notification>
+	<notification name="OwnedObjectsReturned">
+		Ihre Objekte auf der ausgewählten Parzelle wurden in Ihr Inventar transferiert.
+	</notification>
+	<notification name="OtherObjectsReturned">
+		Die Objekte von [FIRST] [LAST] auf dieser Parzelle wurden in das Inventar dieser Person transferiert.
+	</notification>
+	<notification name="OtherObjectsReturned2">
+		Die Objekte von [FIRST] [LAST] auf dieser
+Parzelle von „[NAME]“ wurden an ihren Eigentümer zurückgegeben.
+	</notification>
+	<notification name="GroupObjectsReturned">
+		Die mit der Gruppe [GROUPNAME] gemeinsam genutzten Objekte auf dieser Parzelle wurden in das Inventar ihrer Eigentümer transferiert.
+Transferierbare übertragene Objekte wurden an ihre früheren Eigentümer zurückgegeben.
+Nicht transferierbare an die Gruppe übertragene Objekte wurden gelöscht.
+	</notification>
+	<notification name="UnOwnedObjectsReturned">
+		Alle Objekte auf der ausgewählten Parzelle, die NICHT Ihnen gehören, wurden ihren Eigentümern zurückgegeben.
+	</notification>
+	<notification name="NotSafe">
+		Auf diesem Land ist Schaden aktiviert.
+Verletzungen sind möglich. Wenn Sie sterben, werden Sie zu Ihrem Heimatstandort teleportiert.
+	</notification>
+	<notification name="NoFly">
+		In diesem Bereich ist das Fliegen deaktiviert.
+Fliegen ist hier nicht möglich.
+	</notification>
+	<notification name="PushRestricted">
+		In diesem Bereich ist Stoßen nicht erlaubt.
+Sie können keine anderen Personen stoßen, außer Ihnen gehört das Land.
+	</notification>
+	<notification name="NoVoice">
+		In diesem Bereich ist Voice deaktiviert. Sie werden niemanden sprechen hören.
+	</notification>
+	<notification name="NoBuild">
+		In diesem Bereich ist das Bauen deaktiviert. Sie können keine Objekte bauen oder rezzen.
+	</notification>
+	<notification name="ScriptsStopped">
+		Ein Administrator hat die Skriptausführung in dieser Region vorübergehend deaktiviert.
+	</notification>
+	<notification name="ScriptsNotRunning">
+		In dieser Region werden keine Skipts ausgeführt.
+	</notification>
+	<notification name="NoOutsideScripts">
+		Auf diesem Land sind externe Skripts deaktiviert
+
+Hier funktionieren nur Skripts, die dem Landeigentümer gehören.
+	</notification>
+	<notification name="ClaimPublicLand">
+		Öffentliches Land kann nur in der Region in Besitz genommen werden, in der Sie sich befinden.
+	</notification>
+	<notification name="RegionTPAccessBlocked">
+		Sie dürfen diese Region aufgrund Ihrer Alterseinstufung nicht betreten. Sie müssen eventuell eine Altersüberprüfung vornehmen und/oder den aktuellsten Viewer installieren.
+
+Bitte besuchen Sie unsere Knowledgebase, um mehr Details über Zugang zu Regionen mit dieser Alterseinstufung zu erhalten.
+	</notification>
+	<notification name="URBannedFromRegion">
+		Sie dürfen diese Region nicht betreten.
+	</notification>
+	<notification name="NoTeenGridAccess">
+		Ihr Konto kann keine Verbindung zu dieser Teen Grid-Region herstellen.
+	</notification>
+	<notification name="ImproperPaymentStatus">
+		Die für den Zutritt zu dieser Region erforderlichen Zahlungsinformationen liegen nicht vor.
+	</notification>
+	<notification name="MustGetAgeParcel">
+		Sie müssen alterüberprüft sein, um diese Parzelle betreten zu können.
+	</notification>
+	<notification name="NoDestRegion">
+		Keine Zielregion gefunden.
+	</notification>
+	<notification name="NotAllowedInDest">
+		Der Zutritt wurde Ihnen verweigert.
+	</notification>
+	<notification name="RegionParcelBan">
+		Diese Parzelle ist abgesperrt und kann nicht überquert werden. Versuchen Sie einen anderen Weg.
+	</notification>
+	<notification name="TelehubRedirect">
+		Sie wurden zu einem Telehub umgeleitet.
+	</notification>
+	<notification name="CouldntTPCloser">
+		Ein Teleport näher am Ziel ist leider nicht möglich.
+	</notification>
+	<notification name="TPCancelled">
+		Teleport abgebrochen.
+	</notification>
+	<notification name="FullRegionTryAgain">
+		Die Region, die Sie betreten möchten, ist im Moment voll.
+Versuchen Sie es in einigen Minuten erneut.
+	</notification>
+	<notification name="GeneralFailure">
+		Allgemeiner Fehler.
+	</notification>
+	<notification name="RoutedWrongRegion">
+		In falsche Region umgeleitet.  Bitte versuchen Sie es erneut.
+	</notification>
+	<notification name="NoValidAgentID">
+		Keine gültige Agent ID.
+	</notification>
+	<notification name="NoValidSession">
+		Keine gültige Sitzungs-ID.
+	</notification>
+	<notification name="NoValidCircuit">
+		Kein gültiger Verbindungscode.
+	</notification>
+	<notification name="NoValidTimestamp">
+		Kein gültiger Zeitstempel.
+	</notification>
+	<notification name="NoPendingConnection">
+		Verbindung kann nicht hergestellt werden.
+	</notification>
+	<notification name="InternalUsherError">
+		Interner Fehler beim Versuch, Verbindung mit Agent Usher herzustellen.
+	</notification>
+	<notification name="NoGoodTPDestination">
+		In dieser Region konnte kein gültiges Teleportziel gefunden werden.
+	</notification>
+	<notification name="InternalErrorRegionResolver">
+		Interner Fehler bei Teleport.
+	</notification>
+	<notification name="NoValidLanding">
+		Ein gültiger Landpunkt konnte nicht gefunden werden.
+	</notification>
+	<notification name="NoValidParcel">
+		Es konnte keine gültige Parzelle gefunden werden.
+	</notification>
+	<notification name="ObjectGiveItem">
+		Das Objekt [OBJECTFROMNAME] von [FIRST] [LAST] hat Ihnen Folgendes übergeben: [OBJECTTYPE] ([OBJECTNAME]).
+		<form name="form">
+			<button name="Keep" text="Behalten"/>
+			<button name="Discard" text="Verwerfen"/>
+			<button name="Mute" text="Stummschalten"/>
+		</form>
+	</notification>
+	<notification name="ObjectGiveItemUnknownUser">
+		Das Objekt [OBJECTFROMNAME] von (unbekannt) hat Ihnen Folgendes übergeben: [OBJECTTYPE] ([OBJECTNAME]).
+		<form name="form">
+			<button name="Keep" text="Behalten"/>
+			<button name="Discard" text="Verwerfen"/>
+			<button name="Mute" text="Stummschalten"/>
+		</form>
+	</notification>
+	<notification name="UserGiveItem">
+		[NAME] hat Ihnen ein [OBJECTTYPE] namens „[OBJECTNAME]“ gegeben.
+		<form name="form">
+			<button name="Keep" text="Behalten"/>
+			<button name="Discard" text="Verwerfen"/>
+		</form>
+	</notification>
+	<notification name="GodMessage">
+		[NAME]
+[MESSAGE]
+	</notification>
+	<notification name="JoinGroup">
+		[MESSAGE]
+		<form name="form">
+			<button name="Join" text="Beitreten"/>
+			<button name="Decline" text="Ablehnen"/>
+			<button name="Info" text="Info"/>
+		</form>
+	</notification>
+	<notification name="TeleportOffered">
+		[NAME] hat angeboten, Sie zu ihrem/seinem Standort zu teleportieren:
+
+[MESSAGE]
+		<form name="form">
+			<button name="Teleport" text="Teleportieren"/>
+			<button name="Cancel" text="Abbrechen"/>
+		</form>
+	</notification>
+	<notification name="GotoURL">
+		[MESSAGE]
+[URL]
+		<form name="form">
+			<button name="Later" text="Später"/>
+			<button name="GoNow..." text="Jetzt gehen..."/>
+		</form>
+	</notification>
+	<notification name="OfferFriendship">
+		[NAME] bietet Ihnen die Freundschaft an.
+
+[MESSAGE]
+
+(Standardmäßig werden Sie gegenseitig ihren Online-Status sehen können.)
+		<form name="form">
+			<button name="Accept" text="Akzeptieren"/>
+			<button name="Decline" text="Ablehnen"/>
+		</form>
+	</notification>
+	<notification name="OfferFriendshipNoMessage">
+		[NAME] bietet Ihnen die Freundschaft an.
+
+(Sie werden dadurch den gegenseitigen Online-Status sehen können.)
+		<form name="form">
+			<button name="Accept" text="Akzeptieren"/>
+			<button name="Decline" text="Ablehnen"/>
+		</form>
+	</notification>
+	<notification name="FriendshipAccepted">
+		[NAME] hat Ihr Freundschaftsangebot akzeptiert.
+	</notification>
+	<notification name="FriendshipDeclined">
+		[NAME] hat Ihr Freundschaftsangebot abgelehnt.
+	</notification>
+	<notification name="OfferCallingCard">
+		[FIRST] [LAST] bietet Ihnen eine Visitenkarte an.
+Dies erstellt ein Lesezeichen in Ihrem Inventar, damit Sie diesen Einwohner jederzeit über IM erreichen.
+		<form name="form">
+			<button name="Accept" text="Akzeptieren"/>
+			<button name="Decline" text="Ablehnen"/>
+		</form>
+	</notification>
+	<notification name="RegionRestartMinutes">
+		Region wird in [MINUTES] Minuten neu gestartet.
+Wenn Sie in dieser Region bleiben, werden Sie abgemeldet.
+	</notification>
+	<notification name="RegionRestartSeconds">
+		Diese Region wird in [SECONDS] neu gestartet.
+Wenn Sie in dieser Region bleiben, werden Sie abgemeldet.
+	</notification>
+	<notification name="LoadWebPage">
+		Webseite [URL] laden?
+
+[MESSAGE]
+
+Von Objekt: [OBJECTNAME], Eigentümer: [NAME]?
+		<form name="form">
+			<button name="Gotopage" text="Zur Seite"/>
+			<button name="Cancel" text="Abbrechen"/>
+		</form>
+	</notification>
+	<notification name="FailedToFindWearableUnnamed">
+		[TYPE] nicht in Datenbank.
+	</notification>
+	<notification name="FailedToFindWearable">
+		[TYPE] namens [DESC] nicht in Datenbank.
+	</notification>
+	<notification name="InvalidWearable">
+		Dieser Artikel verwendet eine Funktion, die Ihr Viewer nicht unterstützt. Bitte aktualisieren Sie Ihre Version von [APP_NAME], um diesen Artikel anziehen zu können.
+	</notification>
+	<notification name="ScriptQuestion">
+		Das Objekt „[OBJECTNAME]“, Eigentum von „[NAME]“, möchte:
+
+[QUESTIONS]
+Ist das OK?
+		<form name="form">
+			<button name="Yes" text="Ja"/>
+			<button name="No" text="Nein"/>
+			<button name="Mute" text="Stummschalten"/>
+		</form>
+	</notification>
+	<notification name="ScriptQuestionCaution">
+		Ein Objekt namens „[OBJECTNAME]“ des Eigentümers „[NAME]“ möchte:
+
+[QUESTIONS]
+Wenn Sie diesem Objekt und seinem Ersteller nicht vertrauen, sollten Sie diese Anfrage ablehnen.
+
+Anfrage gestatten?
+		<form name="form">
+			<button name="Grant" text="Gewähren"/>
+			<button name="Deny" text="Verweigern"/>
+			<button name="Details" text="Info..."/>
+		</form>
+	</notification>
+	<notification name="ScriptDialog">
+		[FIRST] [LAST]s „[TITLE]“
+[MESSAGE]
+		<form name="form">
+			<button name="Ignore" text="Ignorieren"/>
+		</form>
+	</notification>
+	<notification name="ScriptDialogGroup">
+		[GROUPNAME]s „[TITLE]“
+[MESSAGE]
+		<form name="form">
+			<button name="Ignore" text="Ignorieren"/>
+		</form>
+	</notification>
+	<notification name="FirstBalanceIncrease">
+		Sie haben gerade [AMOUNT] L$ erhalten.
+Ihr Kontostand wird oben rechts angezeigt.
+	</notification>
+	<notification name="FirstBalanceDecrease">
+		Sie haben gerade [AMOUNT] L$ bezahlt.
+Ihr Kontostand wird oben rechts angezeigt.
+	</notification>
+	<notification name="FirstSit">
+		Sie sitzen.
+Verwenden Sie die Pfeiltasten (oder AWSD-Tasten), um sich umzusehen.
+Um aufzustehen, klicken Sie auf die Schaltfläche „Aufstehen“.
+	</notification>
+	<notification name="FirstMap">
+		Klicken Sie auf die Karte und bewegen Sie die Maus, um sich auf der Karte umzusehen.
+Mit Doppelklick können Sie teleportieren.
+Nutzen Sie die Optionen rechts, um Objekte, Einwohner oder Events anzuzeigen und einen anderen Hintergrund auszuwählen.
+	</notification>
+	<notification name="FirstBuild">
+		Sie haben die Bauwerkzeuge geöffnet. Jedes Objekt, dass Sie sehen wurde mit diesen Werkzeugen gebaut.
+	</notification>
+	<notification name="FirstTeleport">
+		Sie können nur zu bestimmten Bereichen in dieser Region teleportieren. Der Pfeil deutet zu Ihrem Ziel hin. Klicken Sie auf den Pfeil, um diesen auszublenden.
+	</notification>
+	<notification name="FirstOverrideKeys">
+		Ihre Bewegungstasten werden jetzt von einem Objekt gesteuert.
+Probieren Sie die Pfeil- oder WASD-Tasten aus.
+Manche Objekte (wie Waffen) müssen per Mouselook gesteuert werden.
+Drücken Sie dazu „M“.
+	</notification>
+	<notification name="FirstAppearance">
+		Sie bearbeiten gerade Ihr Aussehen.
+Verwenden Sie die Pfeiltasten, um sich umzusehen.
+Klicken Sie auf „Alles speichern“, wenn Sie fertig sind.
+	</notification>
+	<notification name="FirstInventory">
+		Dies ist Ihr Inventar. Es enthält Objekte, die Ihnen gehören.
+
+* Um etwas anzuziehen, ziehen Sie es mit der Maus auf Ihren Avatar.
+* Um etwas inworld zu rezzen, ziehen Sie das Objekt auf den Boden.
+* Zum Lesen einer Notizkarte klicken Sie sie doppelt an.
+	</notification>
+	<notification name="FirstSandbox">
+		Dies ist ein Sandkasten. Hier können Einwohner lernen, wie Objekte gebaut werden. 
+
+Objekte, die Sie hier bauen, werden gelöscht, nachdem Sie den Sandkasten verlassen. Vergessen Sie nicht, Ihr Werk mit einem Rechtsklick und der Auswahl „Nehmen“ in Ihrem Inventar zu speichern.
+	</notification>
+	<notification name="FirstFlexible">
+		Dieses Objekt ist flexibel. Flexible Objekte müssen die Eigenschaft „Phantom“ haben und dürfen nicht „physisch“ sein.
+	</notification>
+	<notification name="FirstDebugMenus">
+		Sie haben das Menü „Erweitert“ geöffnet.
+
+Um dieses Menü zu aktivieren bzw. deaktivieren:
+  Windows Strg-Alt-D
+  Mac ⌘-Opt-D
+	</notification>
+	<notification name="FirstSculptedPrim">
+		Sie bearbeiten ein geformtes Primitiv. Geformte Primitive benötigen eine spezielle Textur, die ihre Form definiert.
+	</notification>
+	<notification name="MaxListSelectMessage">
+		Sie können maximal [MAX_SELECT] Objekte
+von der Liste auswählen.
+	</notification>
+	<notification name="VoiceInviteP2P">
+		[NAME] lädt Sie zu einem Voice-Chat ein.
+Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Anrufer stumm zu schalten.
+		<form name="form">
+			<button name="Accept" text="Akzeptieren"/>
+			<button name="Decline" text="Ablehnen"/>
+			<button name="Mute" text="Stummschalten"/>
+		</form>
+	</notification>
+	<notification name="AutoUnmuteByIM">
+		[FIRST] [LAST] hat eine Instant Message erhalten; die Stummschaltung wurde aufgehoben.
+	</notification>
+	<notification name="AutoUnmuteByMoney">
+		[FIRST] [LAST] hat Geld erhalten; die Stummschaltung wurde aufgehoben.
+	</notification>
+	<notification name="AutoUnmuteByInventory">
+		[FIRST] [LAST] wurde ein Inventarobjekt angeboten; die Stummschaltung wurde aufgehoben.
+	</notification>
+	<notification name="VoiceInviteGroup">
+		[NAME] ist einem Voice-Chat mit der Gruppe [GROUP] beigetreten.
+Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Anrufer stumm zu schalten.
+		<form name="form">
+			<button name="Accept" text="Akzeptieren"/>
+			<button name="Decline" text="Ablehnen"/>
+			<button name="Mute" text="Stummschalten"/>
+		</form>
+	</notification>
+	<notification name="VoiceInviteAdHoc">
+		[NAME] ist einem Voice-Konferenz-Chat beigetreten.
+Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Benutzer stumm zu schalten.
+		<form name="form">
+			<button name="Accept" text="Akzeptieren"/>
+			<button name="Decline" text="Ablehnen"/>
+			<button name="Mute" text="Stummschalten"/>
+		</form>
+	</notification>
+	<notification name="InviteAdHoc">
+		[NAME] lädt Sie zu einem Konferenz-Chat ein.
+Klicken Sie auf „Akzeptieren“, um dem Chat beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Benutzer stumm zu schalten.
+		<form name="form">
+			<button name="Accept" text="Akzeptieren"/>
+			<button name="Decline" text="Ablehnen"/>
+			<button name="Mute" text="Stummschalten"/>
+		</form>
+	</notification>
+	<notification name="VoiceChannelFull">
+		Der Voice-Chat, dem Sie beitreten möchten, [VOICE_CHANNEL_NAME], hat seine maximale Teilnehmerzahl erreicht. Bitte versuchen Sie es erneut.
+	</notification>
+	<notification name="ProximalVoiceChannelFull">
+		Es tut uns Leid.  Dieses Gebiet hat seine maximale Kapazität für Voice-Gespräche erreicht.  Bitte versuchen Sie es in einem anderen Gebiet.
+	</notification>
+	<notification name="VoiceChannelDisconnected">
+		Sie haben [VOICE_CHANNEL_NAME] verlassen.  Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden.
+	</notification>
+	<notification name="VoiceChannelDisconnectedP2P">
+		[VOICE_CHANNEL_NAME] hat das Gespräch beendet.  Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden.
+	</notification>
+	<notification name="P2PCallDeclined">
+		[VOICE_CHANNEL_NAME] hat Ihren Anruf abgelehnt.  Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden.
+	</notification>
+	<notification name="P2PCallNoAnswer">
+		[VOICE_CHANNEL_NAME] ist zurzeit nicht erreichbar.  Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden.
+	</notification>
+	<notification name="VoiceChannelJoinFailed">
+		Verbindung zu [VOICE_CHANNEL_NAME] nicht möglich. Bitte versuchen Sie es später.  Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden.
+	</notification>
+	<notification name="VoiceLoginRetry">
+		Wir erstellen einen Voice-Kanal für Sie. Bitte warten Sie einen Moment.
+	</notification>
+	<notification name="Cannot enter parcel: not a group member">
+		Nur Mitglieder einer bestimmten Gruppe dürfen diesen Bereich betreten.
+	</notification>
+	<notification name="Cannot enter parcel: banned">
+		Zugang zur Parzelle verweigert. Sie wurden verbannt.
+	</notification>
+	<notification name="Cannot enter parcel: not on access list">
+		Zugang zur Parzelle verweigert. Sie stehen nicht auf der Zugangsliste.
+	</notification>
+	<notification name="VoiceNotAllowed">
+		Sie sind nicht berechtigt, einem Voice-Chat in [VOICE_CHANNEL_NAME] beizutreten.
+	</notification>
+	<notification name="VoiceCallGenericError">
+		Fehler beim Versuch, eine Voice-Chat-Verbindung zu [VOICE_CHANNEL_NAME] herzustellen.  Bitte versuchen Sie es erneut.
+	</notification>
+	<notification name="ServerVersionChanged">
+		Sie haben eine Region betreten, die eine andere Server-Version verwendet. Dies kann sich auf die Leistung auswirken. Klicken Sie hier, um die Versionshinweise anzuzeigen.
+	</notification>
+	<notification name="UnsupportedCommandSLURL">
+		Die SLurl, auf die Sie geklickt haben, wird nicht unterstützt.
+	</notification>
+	<notification name="IMToast">
+		<form name="form">
+			<button name="respondbutton" text="Antworten"/>
+		</form>
+	</notification>
+	<notification name="AttachmentSaved">
+		Der Anhang wurde gespeichert.
+	</notification>
+	<notification name="UnableToFindHelpTopic">
+		Hilfethema für dieses Element wurde nicht gefunden.
+	</notification>
+	<global name="UnsupportedCPU">
+		- Ihre CPU-Geschwindigkeit entspricht nicht den Mindestanforderungen.
+	</global>
+	<global name="UnsupportedGLRequirements">
+		Ihr Computer entspricht nicht den Hardwareanforderungen von [APP_NAME]. [APP_NAME] setzt eine OpenGL-Grafikkarte mit Multitextur-Unterstützung voraus. Falls Ihre Grafikkarte diese Funktion unterstützt, installieren Sie die neuesten Treiber sowie die aktuellen Service Packs und Patches für Ihr Betriebssystem.
+
+Sollte das Problem fortbestehen, finden Sie weitere Hilfestellung unter [SUPPORT_SITE].
+	</global>
+	<global name="UnsupportedCPUAmount">
+		796
+	</global>
+	<global name="UnsupportedRAMAmount">
+		510
+	</global>
+	<global name="UnsupportedGPU">
+		- Ihre Grafikkarte entspricht nicht den Mindestanforderungen.
+	</global>
+	<global name="UnsupportedRAM">
+		- Ihr Arbeitsspeicher entspricht nicht den Mindestanforderungen.
+	</global>
+	<global name="PermYes">
+		Ja
+	</global>
+	<global name="PermNo">
+		Nein
+	</global>
+	<global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+		Wenn Sie ein Stück Land besitzen, können Sie dies als Ihren Heimatort festlegen. 
+Ansonsten können Sie auf der Karte nachsehen und dort Ort suchen, die als „Infohub“ gekennzeichnet sind.
+	</global>
+</notifications>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_profile.xml b/indra/newview/skins/default/xui/de/panel_edit_profile.xml
index 4a163c317e2..9ddc31aca56 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_profile.xml
@@ -1,38 +1,38 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profile Edit" name="edit_profile_panel">
-	<string name="CaptionTextAcctInfo">
-		[ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-	</string>
-	<string name="AcctTypeResident" value="Einwohner"/>
-	<string name="AcctTypeTrial" value="Test"/>
-	<string name="AcctTypeCharterMember" value="Charta-Mitglied"/>
-	<string name="AcctTypeEmployee" value="Linden Lab-Mitarbeiter"/>
-	<string name="PaymentInfoUsed" value="Zahlungsinfo verwendet"/>
-	<string name="PaymentInfoOnFile" value="Zahlungsinfo archiviert"/>
-	<string name="NoPaymentInfoOnFile" value="Keine Zahlungsinfo archiviert"/>
-	<string name="AgeVerified" value="Altersgeprüft"/>
-	<string name="NotAgeVerified" value="Nicht altersgeprüft"/>
-	<string name="partner_edit_link_url">
-		http://www.secondlife.com/account/partners.php?lang=de
-	</string>
-	<string name="no_partner_text" value="Keiner"/>
-	<scroll_container name="profile_scroll">
-		<panel name="scroll_content_panel">
-			<panel name="data_panel">
-				<panel name="lifes_images_panel">
-					<icon label="" name="2nd_life_edit_icon" tool_tip="Klicken, um ein Bild auszuwählen"/>
-				</panel>
-				<icon label="" name="real_world_edit_icon" tool_tip="Klicken, um ein Bild auszuwählen"/>
-				<text name="title_homepage_text">
-					Webseite:
-				</text>
-				<check_box label="In Suchergebnissen anzeigen" name="show_in_search_checkbox"/>
-				<text name="title_acc_status_text" value="Kontostatus:"/>
-			</panel>
-		</panel>
-	</scroll_container>
-	<panel name="profile_me_buttons_panel">
-		<button label="Änderungen speichern" name="save_btn"/>
-		<button label="Abbrechen" name="cancel_btn"/>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profile Edit" name="edit_profile_panel">
+	<string name="CaptionTextAcctInfo">
+		[ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+	</string>
+	<string name="AcctTypeResident" value="Einwohner"/>
+	<string name="AcctTypeTrial" value="Test"/>
+	<string name="AcctTypeCharterMember" value="Charta-Mitglied"/>
+	<string name="AcctTypeEmployee" value="Linden Lab-Mitarbeiter"/>
+	<string name="PaymentInfoUsed" value="Zahlungsinfo verwendet"/>
+	<string name="PaymentInfoOnFile" value="Zahlungsinfo archiviert"/>
+	<string name="NoPaymentInfoOnFile" value="Keine Zahlungsinfo archiviert"/>
+	<string name="AgeVerified" value="Altersgeprüft"/>
+	<string name="NotAgeVerified" value="Nicht altersgeprüft"/>
+	<string name="partner_edit_link_url">
+		http://www.secondlife.com/account/partners.php?lang=de
+	</string>
+	<string name="no_partner_text" value="Keiner"/>
+	<scroll_container name="profile_scroll">
+		<panel name="scroll_content_panel">
+			<panel name="data_panel">
+				<panel name="lifes_images_panel">
+					<icon label="" name="2nd_life_edit_icon" tool_tip="Klicken, um ein Bild auszuwählen"/>
+				</panel>
+				<icon label="" name="real_world_edit_icon" tool_tip="Klicken, um ein Bild auszuwählen"/>
+				<text name="title_homepage_text">
+					Webseite:
+				</text>
+				<check_box label="In Suchergebnissen anzeigen" name="show_in_search_checkbox"/>
+				<text name="title_acc_status_text" value="Kontostatus:"/>
+			</panel>
+		</panel>
+	</scroll_container>
+	<panel name="profile_me_buttons_panel">
+		<button label="Änderungen speichern" name="save_btn"/>
+		<button label="Abbrechen" name="cancel_btn"/>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_group_invite.xml b/indra/newview/skins/default/xui/de/panel_group_invite.xml
index 81a255a14f3..0712722cb30 100644
--- a/indra/newview/skins/default/xui/de/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_invite.xml
@@ -1,29 +1,29 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Mitglied einladen" name="invite_panel">
-	<panel.string name="confirm_invite_owner_str">
-		Möchten Sie wirklich (einen) neue(n) Eigentümer einladen? Dies kann nicht rückgängig gemacht werden!
-	</panel.string>
-	<panel.string name="loading">
-		(wird geladen...)
-	</panel.string>
-	<panel.string name="already_in_group">
-		Einige Avatare sind bereits Mitglied und wurden nicht eingeladen.
-	</panel.string>
-	<text name="help_text">
-		Sie können mehrere Einwohner in Ihre 
-Gruppe einladen. Klicken Sie hierzu
-auf „Einwohnerliste öffnen“.
-	</text>
-	<button label="Einwohnerliste öffnen" name="add_button" tool_tip=""/>
-	<name_list name="invitee_list" tool_tip="Halten Sie zur Mehrfachauswahl die Strg-Taste gedrückt und klicken Sie auf die Einwohnernamen."/>
-	<button label="Auswahl aus Liste löschen" name="remove_button" tool_tip="Die oben ausgewählten Einwohner von der Einladungsliste entfernen."/>
-	<text name="role_text">
-		Wählen Sie eine Rolle aus:
-	</text>
-	<combo_box name="role_name" tool_tip="Wählen Sie aus der Liste der Rollen, die Sie an Mitglieder vergeben dürfen."/>
-	<button label="Einladungen versenden" name="ok_button"/>
-	<button label="Abbrechen" name="cancel_button"/>
-	<string name="GroupInvitation">
-		Gruppeneinladung
-	</string>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Mitglied einladen" name="invite_panel">
+	<panel.string name="confirm_invite_owner_str">
+		Möchten Sie wirklich (einen) neue(n) Eigentümer einladen? Dies kann nicht rückgängig gemacht werden!
+	</panel.string>
+	<panel.string name="loading">
+		(wird geladen...)
+	</panel.string>
+	<panel.string name="already_in_group">
+		Einige Avatare sind bereits Mitglied und wurden nicht eingeladen.
+	</panel.string>
+	<text name="help_text">
+		Sie können mehrere Einwohner in Ihre 
+Gruppe einladen. Klicken Sie hierzu
+auf „Einwohnerliste öffnen“.
+	</text>
+	<button label="Einwohnerliste öffnen" name="add_button" tool_tip=""/>
+	<name_list name="invitee_list" tool_tip="Halten Sie zur Mehrfachauswahl die Strg-Taste gedrückt und klicken Sie auf die Einwohnernamen."/>
+	<button label="Auswahl aus Liste löschen" name="remove_button" tool_tip="Die oben ausgewählten Einwohner von der Einladungsliste entfernen."/>
+	<text name="role_text">
+		Wählen Sie eine Rolle aus:
+	</text>
+	<combo_box name="role_name" tool_tip="Wählen Sie aus der Liste der Rollen, die Sie an Mitglieder vergeben dürfen."/>
+	<button label="Einladungen versenden" name="ok_button"/>
+	<button label="Abbrechen" name="cancel_button"/>
+	<string name="GroupInvitation">
+		Gruppeneinladung
+	</string>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_group_land_money.xml b/indra/newview/skins/default/xui/de/panel_group_land_money.xml
index fcd8cd358fb..2dd9bf8d5ff 100644
--- a/indra/newview/skins/default/xui/de/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_land_money.xml
@@ -1,170 +1,170 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Land und L$" name="land_money_tab">
-	<string name="help_text">
-		Parzellen in Gruppenbesitz werden zusammen mit Beitragsdetails angezeigt. Ein Warnhinweis wird angezeigt, solange der Wert für das insgesamt verwendete Land gleich oder weniger ist als der Gesamtbeitrag. Die Registerkarten „Planung“, „Details“ und „Verkäufe“ enthalten Informationen über die Gruppenfinanzen.
-	</string>
-	<button label="?" name="help_button"/>
-	<string name="cant_view_group_land_text">
-		Sie sind nicht berechtigt, Landeigentum der Gruppe anzuzeigen.
-	</string>
-	<string name="cant_view_group_accounting_text">
-		Sie sind nicht berechtigt, die Finanzinformationen der Gruppe anzuzeigen.
-	</string>
-	<string name="loading_txt">
-		Wird geladen...
-	</string>
-	<text name="group_land_heading">
-		Land in Gruppenbesitz
-	</text>
-	<scroll_list name="group_parcel_list">
-		<column label="Parzelle" name="name"/>
-		<column label="Region" name="location"/>
-		<column label="Typ" name="type"/>
-		<column label="Gebiet" name="area"/>
-		<column label="" name="hidden"/>
-	</scroll_list>
-	<button label="Karte" label_selected="Karte" name="map_button"/>
-	<text name="total_contributed_land_label">
-		Gesamtbeitrag:
-	</text>
-	<text name="total_contributed_land_value">
-		[AREA] qm
-	</text>
-	<text name="total_land_in_use_label">
-		Insgesamt verwendetes Land:
-	</text>
-	<text name="total_land_in_use_value">
-		[AREA] qm
-	</text>
-	<text name="land_available_label">
-		Land verfügbar:
-	</text>
-	<text name="land_available_value">
-		[AREA] qm
-	</text>
-	<text name="your_contribution_label">
-		Ihr Beitrag:
-	</text>
-	<string name="land_contrib_error">
-		Ihr Landbeitrag kann nicht festgelegt werden.
-	</string>
-	<text name="your_contribution_units">
-		( qm )
-	</text>
-	<text name="your_contribution_max_value">
-		(max. [AMOUNT])
-	</text>
-	<text name="group_over_limit_text">
-		Die Gruppenmitglieder müssen mehr Landnutzungsrechte spenden, damit das verwendete Land gehalten werden kann.
-	</text>
-	<text name="group_money_heading">
-		Gruppen-L$
-	</text>
-	<tab_container name="group_money_tab_container">
-		<panel label="Planung" name="group_money_planning_tab">
-			<text_editor name="group_money_planning_text">
-				Wird berechnet...
-			</text_editor>
-		</panel>
-		<panel label="Details" name="group_money_details_tab">
-			<text_editor name="group_money_details_text">
-				Wird berechnet...
-			</text_editor>
-			<button label="&lt; Früher" label_selected="&lt; Früher" name="earlier_details_button" tool_tip="Zurück in der Zeit"/>
-			<button label="Später &gt;" label_selected="Später &gt;" name="later_details_button" tool_tip="Weiter in der Zeit"/>
-		</panel>
-		<panel label="Verkäufe" name="group_money_sales_tab">
-			<text_editor name="group_money_sales_text">
-				Wird berechnet...
-			</text_editor>
-			<button label="&lt; Früher" label_selected="&lt; Früher" name="earlier_sales_button" tool_tip="Zurück in der Zeit"/>
-			<button label="Später &gt;" label_selected="Später &gt;" name="later_sales_button" tool_tip="Weiter in der Zeit"/>
-		</panel>
-	</tab_container>
-</panel>
-<!--
-
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Land und L$" name="land_money_tab">
-	<string name="help_text">
-		Parzellen in Gruppenbesitz werden zusammen mit Beitragsdetails angezeigt. Ein Warnhinweis wird angezeigt, solange der Wert für das insgesamt verwendete Land gleich oder weniger ist als der Gesamtbeitrag. Die Registerkarten „Planung“, „Details“ und „Verkäufe“ enthalten Informationen über die Gruppenfinanzen.
-	</string>
-	<button label="?" name="help_button"/>
-	<string name="cant_view_group_land_text">
-		Sie sind nicht berechtigt, Landeigentum der Gruppe anzuzeigen.
-	</string>
-	<string name="cant_view_group_accounting_text">
-		Sie sind nicht berechtigt, die Finanzinformationen der Gruppe anzuzeigen.
-	</string>
-	<string name="loading_txt">
-		Wird geladen...
-	</string>
-	<text name="group_land_heading">
-		Land in Gruppenbesitz
-	</text>
-	<scroll_list name="group_parcel_list">
-		<column label="Parzellenname" name="name"/>
-		<column label="Region" name="location"/>
-		<column label="Typ" name="type"/>
-		<column label="Gebiet" name="area"/>
-		<column label="" name="hidden"/>
-	</scroll_list>
-	<button label="Auf Karte" label_selected="Auf Karte" name="map_button"/>
-	<text name="total_contributed_land_label">
-		Gesamtbeitrag:
-	</text>
-	<text name="total_contributed_land_value">
-		[AREA] qm
-	</text>
-	<text name="total_land_in_use_label">
-		Insgesamt verwendetes Land:
-	</text>
-	<text name="total_land_in_use_value">
-		[AREA] qm
-	</text>
-	<text name="land_available_label">
-		Land verfügbar:
-	</text>
-	<text name="land_available_value">
-		[AREA] qm
-	</text>
-	<text name="your_contribution_label">
-		Ihr Beitrag:
-	</text>
-	<string name="land_contrib_error">
-		Ihr Landbeitrag kann nicht festgelegt werden.
-	</string>
-	<text name="your_contribution_max_value">
-		qm (max. [AMOUNT])
-	</text>
-	<text name="group_over_limit_text">
-		Die Gruppenmitglieder müssen mehr Landnutzungsrechte spenden, damit
-das verwendete Land gehalten werden kann.
-	</text>
-	<text name="group_money_heading">
-		Gruppen-L$
-	</text>
-	<tab_container name="group_money_tab_container">
-		<panel label="Planung" name="group_money_planning_tab">
-			<text_editor name="group_money_planning_text">
-				Wird berechnet...
-			</text_editor>
-		</panel>
-		<panel label="Details" name="group_money_details_tab">
-			<text_editor name="group_money_details_text">
-				Wird berechnet...
-			</text_editor>
-			<button label="&lt; Früher" label_selected="&lt; Früher" name="earlier_details_button" tool_tip="Zurück in der Zeit"/>
-			<button label="Später &gt;" label_selected="Später &gt;" name="later_details_button" tool_tip="Weiter in der Zeit"/>
-		</panel>
-		<panel label="Verkäufe" name="group_money_sales_tab">
-			<text_editor name="group_money_sales_text">
-				Wird berechnet...
-			</text_editor>
-			<button label="&lt; Früher" label_selected="&lt; Früher" name="earlier_sales_button" tool_tip="Zurück in der Zeit"/>
-			<button label="Später &gt;" label_selected="Später &gt;" name="later_sales_button" tool_tip="Weiter in der Zeit"/>
-		</panel>
-	</tab_container>
-</panel>
-
--->
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Land und L$" name="land_money_tab">
+	<string name="help_text">
+		Parzellen in Gruppenbesitz werden zusammen mit Beitragsdetails angezeigt. Ein Warnhinweis wird angezeigt, solange der Wert für das insgesamt verwendete Land gleich oder weniger ist als der Gesamtbeitrag. Die Registerkarten „Planung“, „Details“ und „Verkäufe“ enthalten Informationen über die Gruppenfinanzen.
+	</string>
+	<button label="?" name="help_button"/>
+	<string name="cant_view_group_land_text">
+		Sie sind nicht berechtigt, Landeigentum der Gruppe anzuzeigen.
+	</string>
+	<string name="cant_view_group_accounting_text">
+		Sie sind nicht berechtigt, die Finanzinformationen der Gruppe anzuzeigen.
+	</string>
+	<string name="loading_txt">
+		Wird geladen...
+	</string>
+	<text name="group_land_heading">
+		Land in Gruppenbesitz
+	</text>
+	<scroll_list name="group_parcel_list">
+		<column label="Parzelle" name="name"/>
+		<column label="Region" name="location"/>
+		<column label="Typ" name="type"/>
+		<column label="Gebiet" name="area"/>
+		<column label="" name="hidden"/>
+	</scroll_list>
+	<button label="Karte" label_selected="Karte" name="map_button"/>
+	<text name="total_contributed_land_label">
+		Gesamtbeitrag:
+	</text>
+	<text name="total_contributed_land_value">
+		[AREA] qm
+	</text>
+	<text name="total_land_in_use_label">
+		Insgesamt verwendetes Land:
+	</text>
+	<text name="total_land_in_use_value">
+		[AREA] qm
+	</text>
+	<text name="land_available_label">
+		Land verfügbar:
+	</text>
+	<text name="land_available_value">
+		[AREA] qm
+	</text>
+	<text name="your_contribution_label">
+		Ihr Beitrag:
+	</text>
+	<string name="land_contrib_error">
+		Ihr Landbeitrag kann nicht festgelegt werden.
+	</string>
+	<text name="your_contribution_units">
+		( qm )
+	</text>
+	<text name="your_contribution_max_value">
+		(max. [AMOUNT])
+	</text>
+	<text name="group_over_limit_text">
+		Die Gruppenmitglieder müssen mehr Landnutzungsrechte spenden, damit das verwendete Land gehalten werden kann.
+	</text>
+	<text name="group_money_heading">
+		Gruppen-L$
+	</text>
+	<tab_container name="group_money_tab_container">
+		<panel label="Planung" name="group_money_planning_tab">
+			<text_editor name="group_money_planning_text">
+				Wird berechnet...
+			</text_editor>
+		</panel>
+		<panel label="Details" name="group_money_details_tab">
+			<text_editor name="group_money_details_text">
+				Wird berechnet...
+			</text_editor>
+			<button label="&lt; Früher" label_selected="&lt; Früher" name="earlier_details_button" tool_tip="Zurück in der Zeit"/>
+			<button label="Später &gt;" label_selected="Später &gt;" name="later_details_button" tool_tip="Weiter in der Zeit"/>
+		</panel>
+		<panel label="Verkäufe" name="group_money_sales_tab">
+			<text_editor name="group_money_sales_text">
+				Wird berechnet...
+			</text_editor>
+			<button label="&lt; Früher" label_selected="&lt; Früher" name="earlier_sales_button" tool_tip="Zurück in der Zeit"/>
+			<button label="Später &gt;" label_selected="Später &gt;" name="later_sales_button" tool_tip="Weiter in der Zeit"/>
+		</panel>
+	</tab_container>
+</panel>
+<!--
+
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Land und L$" name="land_money_tab">
+	<string name="help_text">
+		Parzellen in Gruppenbesitz werden zusammen mit Beitragsdetails angezeigt. Ein Warnhinweis wird angezeigt, solange der Wert für das insgesamt verwendete Land gleich oder weniger ist als der Gesamtbeitrag. Die Registerkarten „Planung“, „Details“ und „Verkäufe“ enthalten Informationen über die Gruppenfinanzen.
+	</string>
+	<button label="?" name="help_button"/>
+	<string name="cant_view_group_land_text">
+		Sie sind nicht berechtigt, Landeigentum der Gruppe anzuzeigen.
+	</string>
+	<string name="cant_view_group_accounting_text">
+		Sie sind nicht berechtigt, die Finanzinformationen der Gruppe anzuzeigen.
+	</string>
+	<string name="loading_txt">
+		Wird geladen...
+	</string>
+	<text name="group_land_heading">
+		Land in Gruppenbesitz
+	</text>
+	<scroll_list name="group_parcel_list">
+		<column label="Parzellenname" name="name"/>
+		<column label="Region" name="location"/>
+		<column label="Typ" name="type"/>
+		<column label="Gebiet" name="area"/>
+		<column label="" name="hidden"/>
+	</scroll_list>
+	<button label="Auf Karte" label_selected="Auf Karte" name="map_button"/>
+	<text name="total_contributed_land_label">
+		Gesamtbeitrag:
+	</text>
+	<text name="total_contributed_land_value">
+		[AREA] qm
+	</text>
+	<text name="total_land_in_use_label">
+		Insgesamt verwendetes Land:
+	</text>
+	<text name="total_land_in_use_value">
+		[AREA] qm
+	</text>
+	<text name="land_available_label">
+		Land verfügbar:
+	</text>
+	<text name="land_available_value">
+		[AREA] qm
+	</text>
+	<text name="your_contribution_label">
+		Ihr Beitrag:
+	</text>
+	<string name="land_contrib_error">
+		Ihr Landbeitrag kann nicht festgelegt werden.
+	</string>
+	<text name="your_contribution_max_value">
+		qm (max. [AMOUNT])
+	</text>
+	<text name="group_over_limit_text">
+		Die Gruppenmitglieder müssen mehr Landnutzungsrechte spenden, damit
+das verwendete Land gehalten werden kann.
+	</text>
+	<text name="group_money_heading">
+		Gruppen-L$
+	</text>
+	<tab_container name="group_money_tab_container">
+		<panel label="Planung" name="group_money_planning_tab">
+			<text_editor name="group_money_planning_text">
+				Wird berechnet...
+			</text_editor>
+		</panel>
+		<panel label="Details" name="group_money_details_tab">
+			<text_editor name="group_money_details_text">
+				Wird berechnet...
+			</text_editor>
+			<button label="&lt; Früher" label_selected="&lt; Früher" name="earlier_details_button" tool_tip="Zurück in der Zeit"/>
+			<button label="Später &gt;" label_selected="Später &gt;" name="later_details_button" tool_tip="Weiter in der Zeit"/>
+		</panel>
+		<panel label="Verkäufe" name="group_money_sales_tab">
+			<text_editor name="group_money_sales_text">
+				Wird berechnet...
+			</text_editor>
+			<button label="&lt; Früher" label_selected="&lt; Früher" name="earlier_sales_button" tool_tip="Zurück in der Zeit"/>
+			<button label="Später &gt;" label_selected="Später &gt;" name="later_sales_button" tool_tip="Weiter in der Zeit"/>
+		</panel>
+	</tab_container>
+</panel>
+
+-->
diff --git a/indra/newview/skins/default/xui/de/panel_group_notices.xml b/indra/newview/skins/default/xui/de/panel_group_notices.xml
index 137713b7712..27a2caf9f0c 100644
--- a/indra/newview/skins/default/xui/de/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_notices.xml
@@ -1,147 +1,147 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Mitteilungen" name="notices_tab">
-	<text name="help_text">
-		Mitteilungen sind eine schnelle Möglichkeit, 
-Mitglieder auf dem Laufenden zu halten und 
-Objekte im Anhang zu versenden. Mitteilungen werden
-nur an Mitglieder mit einer entsprechenden Rolle 
-gesendet. Mitteilungen können unter 
-„Allgemein“ ausgeschaltet werden.
-	</text>
-	<text name="no_notices_text">
-		Keine älteren Mitteilungen.
-	</text>
-	<button label="?" label_selected="?" name="help_button"/>
-	<text name="lbl">
-		Gruppenmitteilungsarchiv
-	</text>
-	<text name="lbl2">
-		Mitteilungen werden 14 Tage lang aufbewahrt. Eine Mitteilungsliste speichert maximal 200 Mitteilungen pro Gruppe täglich.
-	</text>
-	<scroll_list name="notice_list">
-		<column label="" name="icon"/>
-		<column label="Thema" name="subject"/>
-		<column label="Von" name="from"/>
-		<column label="Datum" name="date"/>
-	</scroll_list>
-	<text name="notice_list_none_found">
-		Nicht gefunden.
-	</text>
-	<button label="Neue Mitteilung" label_selected="Neue Mitteilung" name="create_new_notice"/>
-	<button label="Aktualisieren" label_selected="Liste aktualisieren" name="refresh_notices"/>
-	<panel label="Neue Mitteilung" name="panel_create_new_notice">
-		<text name="lbl">
-			Mitteilung schreiben
-		</text>
-		<text name="lbl2">
-			Sie können ein Objekt zu einer Mitteilung hinzufügen, wenn Sie es aus Ihrem Inventar auf dieses Feld ziehen. Die angehängten Objekte müssen kopier- und übertragbar sein. Ordner können nicht verschickt werden.
-		</text>
-		<text name="lbl3">
-			Betreff:
-		</text>
-		<text name="lbl4">
-			Nachricht:
-		</text>
-		<text name="lbl5">
-			Anhängen:
-		</text>
-		<button label="Anhang entfernen" label_selected="Anhang entfernen" name="remove_attachment"/>
-		<button label="Senden" label_selected="Senden" name="send_notice"/>
-		<panel name="drop_target" tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice."/>
-	</panel>
-	<panel label="Ältere Notiz anzeigen" name="panel_view_past_notice">
-		<text name="lbl">
-			Archivierte Mitteilung
-		</text>
-		<text name="lbl2">
-			Klicken Sie zum Senden einer Mitteilung auf „Neue Mitteilung“.
-		</text>
-		<text name="lbl3">
-			Betreff:
-		</text>
-		<text name="lbl4">
-			Nachricht:
-		</text>
-		<button label="Anlage öffnen" label_selected="Anlage öffnen" name="open_attachment"/>
-	</panel>
-</panel>
-<!-- original file
-
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel label="Mitteilungen" name="notices_tab">
-	<text name="help_text">
-		Mitteilungen sind eine schnelle Möglichkeit, 
-Mitglieder auf dem Laufenden zu halten und 
-Objekte im Anhang zu versenden. Mitteilungen werden
-nur an Mitglieder mit einer entsprechenden Rolle 
-gesendet. Mitteilungen können unter 
-„Allgemein“ ausgeschaltet werden.
-	</text>
-	<text name="no_notices_text">
-		Keine älteren Mitteilungen.
-	</text>
-	<button label="?" label_selected="?" name="help_button" />
-	<text name="lbl">
-		Gruppenmitteilungsarchiv
-	</text>
-	<text name="lbl2">
-		Mitteilungen werden 14 Tage lang aufbewahrt. Klicken Sie auf eine Mitteilung,
-um sie anzuzeigen. Klicken Sie „Aktualisieren“, um neue Mitteilungen zu suchen.
-Eine Mitteilungsliste speichert maximal 200 Mitteilungen pro Gruppe täglich.
-	</text>
-	<scroll_list name="notice_list">
-		<column label="" name="icon" />
-		<column label="Thema" name="subject" />
-		<column label="Von" name="from" />
-		<column label="Datum" name="date" />
-	</scroll_list>
-	<text name="notice_list_none_found">
-		Nicht gefunden.
-	</text>
-	<button label="Neue Mitteilung" label_selected="Neue Mitteilung"
-	     name="create_new_notice" />
-	<button label="Aktualisieren" label_selected="Liste aktualisieren"
-	     name="refresh_notices" />
-	<panel label="Neue Mitteilung" name="panel_create_new_notice">
-		<text name="lbl">
-			Mitteilung schreiben
-		</text>
-		<text name="lbl2">
-			Geben Sie einen Betreff für die Mitteilung ein. Sie können der
-Mitteilung ein Objekt anfügen, indem Sie es aus dem Inventar
-in dieses Feld ziehen. Angehängte Objekte müssen kopier-
-und transferierbar sein. Ordner können nicht gesendet werden.
-		</text>
-		<text name="lbl3">
-			Betreff:
-		</text>
-		<text name="lbl4">
-			Nachricht:
-		</text>
-		<text name="lbl5">
-			Anhängen:
-		</text>
-		<button label="Anhang entfernen" label_selected="Anhang entfernen"
-		     name="remove_attachment" />
-		<button label="Mitteilung senden" label_selected="Mitteilung senden" name="send_notice" />
-		<panel name="drop_target"
-		     tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice." />
-	</panel>
-	<panel label="Ältere Notiz anzeigen" name="panel_view_past_notice">
-		<text name="lbl">
-			Archivierte Mitteilung
-		</text>
-		<text name="lbl2">
-			Klicken Sie zum Senden einer Mitteilung auf „Neue Mitteilung“.
-		</text>
-		<text name="lbl3">
-			Betreff:
-		</text>
-		<text name="lbl4">
-			Nachricht:
-		</text>
-		<button label="Anlage öffnen" label_selected="Anlage öffnen" name="open_attachment" />
-	</panel>
-</panel>
-
--->
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Mitteilungen" name="notices_tab">
+	<text name="help_text">
+		Mitteilungen sind eine schnelle Möglichkeit, 
+Mitglieder auf dem Laufenden zu halten und 
+Objekte im Anhang zu versenden. Mitteilungen werden
+nur an Mitglieder mit einer entsprechenden Rolle 
+gesendet. Mitteilungen können unter 
+„Allgemein“ ausgeschaltet werden.
+	</text>
+	<text name="no_notices_text">
+		Keine älteren Mitteilungen.
+	</text>
+	<button label="?" label_selected="?" name="help_button"/>
+	<text name="lbl">
+		Gruppenmitteilungsarchiv
+	</text>
+	<text name="lbl2">
+		Mitteilungen werden 14 Tage lang aufbewahrt. Eine Mitteilungsliste speichert maximal 200 Mitteilungen pro Gruppe täglich.
+	</text>
+	<scroll_list name="notice_list">
+		<column label="" name="icon"/>
+		<column label="Thema" name="subject"/>
+		<column label="Von" name="from"/>
+		<column label="Datum" name="date"/>
+	</scroll_list>
+	<text name="notice_list_none_found">
+		Nicht gefunden.
+	</text>
+	<button label="Neue Mitteilung" label_selected="Neue Mitteilung" name="create_new_notice"/>
+	<button label="Aktualisieren" label_selected="Liste aktualisieren" name="refresh_notices"/>
+	<panel label="Neue Mitteilung" name="panel_create_new_notice">
+		<text name="lbl">
+			Mitteilung schreiben
+		</text>
+		<text name="lbl2">
+			Sie können ein Objekt zu einer Mitteilung hinzufügen, wenn Sie es aus Ihrem Inventar auf dieses Feld ziehen. Die angehängten Objekte müssen kopier- und übertragbar sein. Ordner können nicht verschickt werden.
+		</text>
+		<text name="lbl3">
+			Betreff:
+		</text>
+		<text name="lbl4">
+			Nachricht:
+		</text>
+		<text name="lbl5">
+			Anhängen:
+		</text>
+		<button label="Anhang entfernen" label_selected="Anhang entfernen" name="remove_attachment"/>
+		<button label="Senden" label_selected="Senden" name="send_notice"/>
+		<panel name="drop_target" tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice."/>
+	</panel>
+	<panel label="Ältere Notiz anzeigen" name="panel_view_past_notice">
+		<text name="lbl">
+			Archivierte Mitteilung
+		</text>
+		<text name="lbl2">
+			Klicken Sie zum Senden einer Mitteilung auf „Neue Mitteilung“.
+		</text>
+		<text name="lbl3">
+			Betreff:
+		</text>
+		<text name="lbl4">
+			Nachricht:
+		</text>
+		<button label="Anlage öffnen" label_selected="Anlage öffnen" name="open_attachment"/>
+	</panel>
+</panel>
+<!-- original file
+
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel label="Mitteilungen" name="notices_tab">
+	<text name="help_text">
+		Mitteilungen sind eine schnelle Möglichkeit, 
+Mitglieder auf dem Laufenden zu halten und 
+Objekte im Anhang zu versenden. Mitteilungen werden
+nur an Mitglieder mit einer entsprechenden Rolle 
+gesendet. Mitteilungen können unter 
+„Allgemein“ ausgeschaltet werden.
+	</text>
+	<text name="no_notices_text">
+		Keine älteren Mitteilungen.
+	</text>
+	<button label="?" label_selected="?" name="help_button" />
+	<text name="lbl">
+		Gruppenmitteilungsarchiv
+	</text>
+	<text name="lbl2">
+		Mitteilungen werden 14 Tage lang aufbewahrt. Klicken Sie auf eine Mitteilung,
+um sie anzuzeigen. Klicken Sie „Aktualisieren“, um neue Mitteilungen zu suchen.
+Eine Mitteilungsliste speichert maximal 200 Mitteilungen pro Gruppe täglich.
+	</text>
+	<scroll_list name="notice_list">
+		<column label="" name="icon" />
+		<column label="Thema" name="subject" />
+		<column label="Von" name="from" />
+		<column label="Datum" name="date" />
+	</scroll_list>
+	<text name="notice_list_none_found">
+		Nicht gefunden.
+	</text>
+	<button label="Neue Mitteilung" label_selected="Neue Mitteilung"
+	     name="create_new_notice" />
+	<button label="Aktualisieren" label_selected="Liste aktualisieren"
+	     name="refresh_notices" />
+	<panel label="Neue Mitteilung" name="panel_create_new_notice">
+		<text name="lbl">
+			Mitteilung schreiben
+		</text>
+		<text name="lbl2">
+			Geben Sie einen Betreff für die Mitteilung ein. Sie können der
+Mitteilung ein Objekt anfügen, indem Sie es aus dem Inventar
+in dieses Feld ziehen. Angehängte Objekte müssen kopier-
+und transferierbar sein. Ordner können nicht gesendet werden.
+		</text>
+		<text name="lbl3">
+			Betreff:
+		</text>
+		<text name="lbl4">
+			Nachricht:
+		</text>
+		<text name="lbl5">
+			Anhängen:
+		</text>
+		<button label="Anhang entfernen" label_selected="Anhang entfernen"
+		     name="remove_attachment" />
+		<button label="Mitteilung senden" label_selected="Mitteilung senden" name="send_notice" />
+		<panel name="drop_target"
+		     tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice." />
+	</panel>
+	<panel label="Ältere Notiz anzeigen" name="panel_view_past_notice">
+		<text name="lbl">
+			Archivierte Mitteilung
+		</text>
+		<text name="lbl2">
+			Klicken Sie zum Senden einer Mitteilung auf „Neue Mitteilung“.
+		</text>
+		<text name="lbl3">
+			Betreff:
+		</text>
+		<text name="lbl4">
+			Nachricht:
+		</text>
+		<button label="Anlage öffnen" label_selected="Anlage öffnen" name="open_attachment" />
+	</panel>
+</panel>
+
+-->
diff --git a/indra/newview/skins/default/xui/de/panel_group_roles.xml b/indra/newview/skins/default/xui/de/panel_group_roles.xml
index a8080afeb3c..4095deb16b0 100644
--- a/indra/newview/skins/default/xui/de/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_roles.xml
@@ -1,118 +1,118 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Mitglieder und Rollen" name="roles_tab">
-	<panel.string name="default_needs_apply_text">
-		Das Unterregister enthält nicht übernommene Änderungen.
-	</panel.string>
-	<panel.string name="want_apply_text">
-		Diese Änderungen übernehmen?
-	</panel.string>
-	<tab_container name="roles_tab_container">
-		<panel label="Mitglieder" name="members_sub_tab" tool_tip="Mitglieder">
-			<panel.string name="help_text">
-				Sie können Mitgliedern Rollen zuweisen und entziehen.
-Drücken Sie die Strg-Taste und klicken Sie auf Namen,
-um mehrere Mitglieder auszuwählen.
-			</panel.string>
-			<filter_editor label="Mitglieder filtern" name="filter_input"/>
-			<name_list name="member_list">
-				<name_list.columns label="Mitglied" name="name"/>
-				<name_list.columns label="Übereignungen" name="donated"/>
-				<name_list.columns label="Online" name="online"/>
-			</name_list>
-			<button label="Einladen" name="member_invite"/>
-			<button label="Hinauswerfen" name="member_eject"/>
-		</panel>
-		<panel label="Rollen" name="roles_sub_tab">
-			<panel.string name="help_text">
-				Rollen haben einen Titel und umfassen bestimmte
-Fähigkeiten. Mitglieder können mehrere 
-Rollen innehaben. Eine Gruppe kann bis zu 10 Rollen
-definieren, darunter „Jeder“ und „Eigentümer“.
-			</panel.string>
-			<panel.string name="cant_delete_role">
-				Die Rollen „Jeder“ und „Eigentümer“ können nicht gelöscht werden.
-			</panel.string>
-			<filter_editor label="Rollen filtern" name="filter_input"/>
-			<scroll_list name="role_list">
-				<scroll_list.columns label="Rolle" name="name"/>
-				<scroll_list.columns label="Titel" name="title"/>
-				<scroll_list.columns label="Mitglieder" name="members"/>
-			</scroll_list>
-			<button label="Rolle hinzufügen" name="role_create"/>
-			<button label="Rolle löschen" name="role_delete"/>
-		</panel>
-		<panel label="Fähigkeiten" name="actions_sub_tab" tool_tip="Sie können Fähigkeiten-Beschreibungen anzeigen und welche Rollen bzw. Mitglieder über diese Fähigkeit verfügen.">
-			<panel.string name="help_text">
-				Fähigkeiten verleihen Mitgliedern in Rollen bestimmte
-Rechte in einer Gruppe. Es gibt viele verschiedene Fähigkeiten.
-			</panel.string>
-			<filter_editor label="Fähigkeiten filtern" name="filter_input"/>
-			<scroll_list name="action_list" tool_tip="Select an Ability to view more details.">
-				<scroll_list.columns label="" name="icon"/>
-				<scroll_list.columns label="" name="action"/>
-			</scroll_list>
-		</panel>
-	</tab_container>
-	<panel name="members_footer">
-		<text name="static">
-			Rollen
-		</text>
-		<scroll_list name="member_assigned_roles">
-			<scroll_list.columns label="" name="checkbox"/>
-			<scroll_list.columns label="" name="role"/>
-		</scroll_list>
-		<text name="static2">
-			Zulässige Fähigkeiten
-		</text>
-		<scroll_list name="member_allowed_actions" tool_tip="Um detaillierte Informationen zu erlaubten Fähigkeiten anzuzeigen, siehe Reiter Fähigkeiten.">
-			<scroll_list.columns label="" name="icon"/>
-			<scroll_list.columns label="" name="action"/>
-		</scroll_list>
-	</panel>
-	<panel name="roles_footer">
-		<text name="static">
-			Name
-		</text>
-		<line_editor name="role_name">
-			Angestellte
-		</line_editor>
-		<text name="static3">
-			Titel
-		</text>
-		<line_editor name="role_title">
-			(wartet)
-		</line_editor>
-		<text name="static2">
-			Beschreibung
-		</text>
-		<text_editor name="role_description">
-			(wartet)
-		</text_editor>
-		<text name="static4">
-			Mitglieder in Rolle
-		</text>
-		<check_box label="Mitglieder sind sichtbar" name="role_visible_in_list" tool_tip="Festlegen, ob Mitglieder in dieser Rolle auf der Registerkarte „Allgemein“ für Personen außerhalb der Gruppe sichtbar sind."/>
-		<text name="static5" tool_tip="Eine Liste der Fähigkeiten der aktuell ausgewählten Rolle.">
-			Zulässige Fähigkeiten
-		</text>
-		<scroll_list name="role_allowed_actions" tool_tip="Um detaillierte Informationen zu erlaubten Fähigkeiten anzuzeigen, siehe Reiter Fähigkeiten.">
-			<scroll_list.columns label="" name="icon"/>
-			<scroll_list.columns label="" name="checkbox"/>
-			<scroll_list.columns label="" name="action"/>
-		</scroll_list>
-	</panel>
-	<panel name="actions_footer">
-		<text name="static">
-			Beschreibung
-		</text>
-		<text_editor name="action_description">
-			Diese Fähigkeit heißt „Mitglieder aus dieser Gruppe werfen“. Eigentümer können nur von anderen Eigentümern hinausgeworfen werden.
-		</text_editor>
-		<text name="static2">
-			Rollen mit Fähigkeit
-		</text>
-		<text name="static3">
-			Mitglieder mit Fähigkeit
-		</text>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Mitglieder und Rollen" name="roles_tab">
+	<panel.string name="default_needs_apply_text">
+		Das Unterregister enthält nicht übernommene Änderungen.
+	</panel.string>
+	<panel.string name="want_apply_text">
+		Diese Änderungen übernehmen?
+	</panel.string>
+	<tab_container name="roles_tab_container">
+		<panel label="Mitglieder" name="members_sub_tab" tool_tip="Mitglieder">
+			<panel.string name="help_text">
+				Sie können Mitgliedern Rollen zuweisen und entziehen.
+Drücken Sie die Strg-Taste und klicken Sie auf Namen,
+um mehrere Mitglieder auszuwählen.
+			</panel.string>
+			<filter_editor label="Mitglieder filtern" name="filter_input"/>
+			<name_list name="member_list">
+				<name_list.columns label="Mitglied" name="name"/>
+				<name_list.columns label="Übereignungen" name="donated"/>
+				<name_list.columns label="Online" name="online"/>
+			</name_list>
+			<button label="Einladen" name="member_invite"/>
+			<button label="Hinauswerfen" name="member_eject"/>
+		</panel>
+		<panel label="Rollen" name="roles_sub_tab">
+			<panel.string name="help_text">
+				Rollen haben einen Titel und umfassen bestimmte
+Fähigkeiten. Mitglieder können mehrere 
+Rollen innehaben. Eine Gruppe kann bis zu 10 Rollen
+definieren, darunter „Jeder“ und „Eigentümer“.
+			</panel.string>
+			<panel.string name="cant_delete_role">
+				Die Rollen „Jeder“ und „Eigentümer“ können nicht gelöscht werden.
+			</panel.string>
+			<filter_editor label="Rollen filtern" name="filter_input"/>
+			<scroll_list name="role_list">
+				<scroll_list.columns label="Rolle" name="name"/>
+				<scroll_list.columns label="Titel" name="title"/>
+				<scroll_list.columns label="Mitglieder" name="members"/>
+			</scroll_list>
+			<button label="Rolle hinzufügen" name="role_create"/>
+			<button label="Rolle löschen" name="role_delete"/>
+		</panel>
+		<panel label="Fähigkeiten" name="actions_sub_tab" tool_tip="Sie können Fähigkeiten-Beschreibungen anzeigen und welche Rollen bzw. Mitglieder über diese Fähigkeit verfügen.">
+			<panel.string name="help_text">
+				Fähigkeiten verleihen Mitgliedern in Rollen bestimmte
+Rechte in einer Gruppe. Es gibt viele verschiedene Fähigkeiten.
+			</panel.string>
+			<filter_editor label="Fähigkeiten filtern" name="filter_input"/>
+			<scroll_list name="action_list" tool_tip="Select an Ability to view more details.">
+				<scroll_list.columns label="" name="icon"/>
+				<scroll_list.columns label="" name="action"/>
+			</scroll_list>
+		</panel>
+	</tab_container>
+	<panel name="members_footer">
+		<text name="static">
+			Rollen
+		</text>
+		<scroll_list name="member_assigned_roles">
+			<scroll_list.columns label="" name="checkbox"/>
+			<scroll_list.columns label="" name="role"/>
+		</scroll_list>
+		<text name="static2">
+			Zulässige Fähigkeiten
+		</text>
+		<scroll_list name="member_allowed_actions" tool_tip="Um detaillierte Informationen zu erlaubten Fähigkeiten anzuzeigen, siehe Reiter Fähigkeiten.">
+			<scroll_list.columns label="" name="icon"/>
+			<scroll_list.columns label="" name="action"/>
+		</scroll_list>
+	</panel>
+	<panel name="roles_footer">
+		<text name="static">
+			Name
+		</text>
+		<line_editor name="role_name">
+			Angestellte
+		</line_editor>
+		<text name="static3">
+			Titel
+		</text>
+		<line_editor name="role_title">
+			(wartet)
+		</line_editor>
+		<text name="static2">
+			Beschreibung
+		</text>
+		<text_editor name="role_description">
+			(wartet)
+		</text_editor>
+		<text name="static4">
+			Mitglieder in Rolle
+		</text>
+		<check_box label="Mitglieder sind sichtbar" name="role_visible_in_list" tool_tip="Festlegen, ob Mitglieder in dieser Rolle auf der Registerkarte „Allgemein“ für Personen außerhalb der Gruppe sichtbar sind."/>
+		<text name="static5" tool_tip="Eine Liste der Fähigkeiten der aktuell ausgewählten Rolle.">
+			Zulässige Fähigkeiten
+		</text>
+		<scroll_list name="role_allowed_actions" tool_tip="Um detaillierte Informationen zu erlaubten Fähigkeiten anzuzeigen, siehe Reiter Fähigkeiten.">
+			<scroll_list.columns label="" name="icon"/>
+			<scroll_list.columns label="" name="checkbox"/>
+			<scroll_list.columns label="" name="action"/>
+		</scroll_list>
+	</panel>
+	<panel name="actions_footer">
+		<text name="static">
+			Beschreibung
+		</text>
+		<text_editor name="action_description">
+			Diese Fähigkeit heißt „Mitglieder aus dieser Gruppe werfen“. Eigentümer können nur von anderen Eigentümern hinausgeworfen werden.
+		</text_editor>
+		<text name="static2">
+			Rollen mit Fähigkeit
+		</text>
+		<text name="static3">
+			Mitglieder mit Fähigkeit
+		</text>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_im_control_panel.xml b/indra/newview/skins/default/xui/de/panel_im_control_panel.xml
index 487eb07b9e4..f84bd24413a 100644
--- a/indra/newview/skins/default/xui/de/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/de/panel_im_control_panel.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
-	<button label="Profil anzeigen" name="view_profile_btn"/>
-	<button label="Freund hinzufügen" name="add_friend_btn"/>
-	<button label="Freigeben" name="share_btn"/>
-	<panel name="panel_call_buttons">
-		<button label="Anrufen" name="call_btn"/>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+	<button label="Profil anzeigen" name="view_profile_btn"/>
+	<button label="Freund hinzufügen" name="add_friend_btn"/>
+	<button label="Freigeben" name="share_btn"/>
+	<panel name="panel_call_buttons">
+		<button label="Anrufen" name="call_btn"/>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml
index dc170ce245f..9a15795cbef 100644
--- a/indra/newview/skins/default/xui/de/panel_login.xml
+++ b/indra/newview/skins/default/xui/de/panel_login.xml
@@ -1,19 +1,19 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_login">
-	<panel.string name="create_account_url">
-		http://de.secondlife.com/registration/
-	</panel.string>
-	<panel.string name="forgot_password_url">
-		http://secondlife.com/account/request.php
-	</panel.string>
-	<panel name="login_widgets">
-		<line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] Vorname"/>
-		<line_editor name="last_name_edit" tool_tip="[SECOND_LIFE] Nachname"/>
-		<text name="start_location_text">
-			Startposition:
-		</text>
-		<text name="create_new_account_text">
-			Neues Konto erstellen
-		</text>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_login">
+	<panel.string name="create_account_url">
+		http://de.secondlife.com/registration/
+	</panel.string>
+	<panel.string name="forgot_password_url">
+		http://secondlife.com/account/request.php
+	</panel.string>
+	<panel name="login_widgets">
+		<line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] Vorname"/>
+		<line_editor name="last_name_edit" tool_tip="[SECOND_LIFE] Nachname"/>
+		<text name="start_location_text">
+			Startposition:
+		</text>
+		<text name="create_new_account_text">
+			Neues Konto erstellen
+		</text>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml
index fb4f3e0f53d..6e5b35b0025 100644
--- a/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="chat_bar">
-	<line_editor label="Zum Chatten hier klicken." name="chat_box" tool_tip="Eingabe drücken, um zu sprechen, Strg-Eingabe drücken, um zu Rufen."/>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chat_bar">
+	<line_editor label="Zum Chatten hier klicken." name="chat_box" tool_tip="Eingabe drücken, um zu sprechen, Strg-Eingabe drücken, um zu Rufen."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_pick_info.xml b/indra/newview/skins/default/xui/de/panel_pick_info.xml
index 8c1de575e92..d8939a8ed15 100644
--- a/indra/newview/skins/default/xui/de/panel_pick_info.xml
+++ b/indra/newview/skins/default/xui/de/panel_pick_info.xml
@@ -1,16 +1,16 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_pick_info">
-	<text name="title" value="Auswahl-Info"/>
-	<scroll_container name="profile_scroll">
-		<panel name="scroll_content_panel">
-			<text name="pick_name" value="[name]"/>
-			<text name="pick_location" value="[wird geladen...]"/>
-			<text name="pick_desc" value="[description]"/>
-		</panel>
-	</scroll_container>
-	<panel name="buttons">
-		<button label="Teleportieren" name="teleport_btn"/>
-		<button label="Karte" name="show_on_map_btn"/>
-		<button label="Bearbeiten" name="edit_btn"/>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+	<text name="title" value="Auswahl-Info"/>
+	<scroll_container name="profile_scroll">
+		<panel name="scroll_content_panel">
+			<text name="pick_name" value="[name]"/>
+			<text name="pick_location" value="[wird geladen...]"/>
+			<text name="pick_desc" value="[description]"/>
+		</panel>
+	</scroll_container>
+	<panel name="buttons">
+		<button label="Teleportieren" name="teleport_btn"/>
+		<button label="Karte" name="show_on_map_btn"/>
+		<button label="Bearbeiten" name="edit_btn"/>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_picks.xml b/indra/newview/skins/default/xui/de/panel_picks.xml
index fb25fe89fdd..e0bc3da88eb 100644
--- a/indra/newview/skins/default/xui/de/panel_picks.xml
+++ b/indra/newview/skins/default/xui/de/panel_picks.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Auswahl" name="panel_picks">
-	<panel label="bottom_panel" name="edit_panel">
-		<button name="new_btn" tool_tip="Aktuellen Standort zur Auswahl hinzufügen"/>
-	</panel>
-	<panel name="buttons_cucks">
-		<button label="Karte" name="show_on_map_btn"/>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Auswahl" name="panel_picks">
+	<panel label="bottom_panel" name="edit_panel">
+		<button name="new_btn" tool_tip="Aktuellen Standort zur Auswahl hinzufügen"/>
+	</panel>
+	<panel name="buttons_cucks">
+		<button label="Karte" name="show_on_map_btn"/>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
index a9526c90149..3fa06b17f7d 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
@@ -1,42 +1,42 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Text-Chat" name="chat">
-	<radio_group name="chat_font_size">
-		<radio_item label="Klein" name="radio"/>
-		<radio_item label="Mittel" name="radio2"/>
-		<radio_item label="Groß" name="radio3"/>
-	</radio_group>
-	<color_swatch label="Sie" name="user"/>
-	<text name="text_box1">
-		Ich
-	</text>
-	<color_swatch label="Andere" name="agent"/>
-	<text name="text_box2">
-		Andere
-	</text>
-	<color_swatch label="IM" name="im"/>
-	<text name="text_box3">
-		IM
-	</text>
-	<color_swatch label="System" name="system"/>
-	<text name="text_box4">
-		System
-	</text>
-	<color_swatch label="Skriptfehler" name="script_error"/>
-	<text name="text_box5">
-		Skriptfehler
-	</text>
-	<color_swatch label="Objekte" name="objects"/>
-	<text name="text_box6">
-		Objekte
-	</text>
-	<color_swatch label="Eigentümer" name="owner"/>
-	<text name="text_box7">
-		Eigentümer
-	</text>
-	<color_swatch label="URLs" name="links"/>
-	<text name="text_box9">
-		URLs
-	</text>
-	<check_box initial_value="true" label="Beim Chatten Tippanimation abspielen" name="play_typing_animation"/>
-	<check_box label="IMs per Email zuschicken, wenn ich offline bin" name="send_im_to_email"/>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Text-Chat" name="chat">
+	<radio_group name="chat_font_size">
+		<radio_item label="Klein" name="radio"/>
+		<radio_item label="Mittel" name="radio2"/>
+		<radio_item label="Groß" name="radio3"/>
+	</radio_group>
+	<color_swatch label="Sie" name="user"/>
+	<text name="text_box1">
+		Ich
+	</text>
+	<color_swatch label="Andere" name="agent"/>
+	<text name="text_box2">
+		Andere
+	</text>
+	<color_swatch label="IM" name="im"/>
+	<text name="text_box3">
+		IM
+	</text>
+	<color_swatch label="System" name="system"/>
+	<text name="text_box4">
+		System
+	</text>
+	<color_swatch label="Skriptfehler" name="script_error"/>
+	<text name="text_box5">
+		Skriptfehler
+	</text>
+	<color_swatch label="Objekte" name="objects"/>
+	<text name="text_box6">
+		Objekte
+	</text>
+	<color_swatch label="Eigentümer" name="owner"/>
+	<text name="text_box7">
+		Eigentümer
+	</text>
+	<color_swatch label="URLs" name="links"/>
+	<text name="text_box9">
+		URLs
+	</text>
+	<check_box initial_value="true" label="Beim Chatten Tippanimation abspielen" name="play_typing_animation"/>
+	<check_box label="IMs per Email zuschicken, wenn ich offline bin" name="send_im_to_email"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
index 7008389dd7f..ce26e3782b9 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
@@ -1,116 +1,116 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Grafik" name="Display panel">
-	<text name="WindowSizeLabel">
-		Fenstergröße:
-	</text>
-	<check_box label="Vollbildmodus verwenden" name="windowed mode"/>
-	<combo_box left="115" name="windowsize combo">
-		<combo_box.item label="640x480" name="640x480"/>
-		<combo_box.item label="800x600" name="800x600"/>
-		<combo_box.item label="720x480 (NTSC)" name="720x480"/>
-		<combo_box.item label="768x576 (PAL)" name="768x576"/>
-		<combo_box.item label="1024x768" name="1024x768"/>
-	</combo_box>
-	<text name="UI Size:">
-		UI-Größe:
-	</text>
-	<text name="QualitySpeed">
-		Qualität und Geschwindigkeit:
-	</text>
-	<text name="FasterText">
-		Schneller
-	</text>
-	<text name="BetterText">
-		Besser
-	</text>
-	<text name="ShadersPrefText">
-		Niedrig
-	</text>
-	<text name="ShadersPrefText2">
-		Mittel
-	</text>
-	<text name="ShadersPrefText3">
-		Hoch
-	</text>
-	<text name="ShadersPrefText4">
-		Ultra
-	</text>
-	<panel label="CustomGraphics" name="CustomGraphics Panel">
-		<text name="ShadersText">
-			Shader:
-		</text>
-		<check_box initial_value="true" label="Bumpmapping und Glanz" name="BumpShiny"/>
-		<check_box initial_value="true" label="Einfache Shader" name="BasicShaders" tool_tip="Deaktivieren Sie diese Option, wenn der Grafikkartentreiber Abstürze verursacht."/>
-		<check_box initial_value="true" label="Atmosphären-Shader" name="WindLightUseAtmosShaders"/>
-		<check_box initial_value="true" label="Wasserreflexionen" name="Reflections"/>
-		<text name="ReflectionDetailText">
-			Spiegelung:
-		</text>
-		<radio_group name="ReflectionDetailRadio">
-			<radio_item label="Terrain und Bäume" name="0"/>
-			<radio_item label="Alle statischen Objekte" name="1"/>
-			<radio_item label="Alle Avatare und Objekte" name="2"/>
-			<radio_item label="Alles" name="3"/>
-		</radio_group>
-		<text name="AvatarRenderingText">
-			Avatar-Darstellung:
-		</text>
-		<check_box initial_value="true" label="Ersatzavatare" name="AvatarImpostors"/>
-		<check_box initial_value="true" label="Hardware-Hautberechnung" name="AvatarVertexProgram"/>
-		<check_box initial_value="true" label="Avatar-Kleidung" name="AvatarCloth"/>
-		<slider label="Sichtweite:" name="DrawDistance"/>
-		<text name="DrawDistanceMeterText2">
-			m
-		</text>
-		<slider label="Max. Partikelzahl:" name="MaxParticleCount"/>
-		<slider label="Post-Processing-Qualität:" name="RenderPostProcess"/>
-		<text name="MeshDetailText">
-			Gitterdetails:
-		</text>
-		<slider label="   Objekte:" name="ObjectMeshDetail"/>
-		<slider label="   Flexiprimitiva:" name="FlexibleMeshDetail"/>
-		<slider label="   Bäume:" name="TreeMeshDetail"/>
-		<slider label="   Avatare:" name="AvatarMeshDetail"/>
-		<slider label="   Terrain:" name="TerrainMeshDetail"/>
-		<slider label="   Himmel:" name="SkyMeshDetail"/>
-		<text name="PostProcessText">
-			Niedrig
-		</text>
-		<text name="ObjectMeshDetailText">
-			Niedrig
-		</text>
-		<text name="FlexibleMeshDetailText">
-			Niedrig
-		</text>
-		<text name="TreeMeshDetailText">
-			Niedrig
-		</text>
-		<text name="AvatarMeshDetailText">
-			Niedrig
-		</text>
-		<text name="TerrainMeshDetailText">
-			Niedrig
-		</text>
-		<text name="SkyMeshDetailText">
-			Niedrig
-		</text>
-		<text name="LightingDetailText">
-			Beleuchtungsdetails:
-		</text>
-		<radio_group name="LightingDetailRadio">
-			<radio_item label="Nur Sonne und Mond" name="SunMoon"/>
-			<radio_item label="Lokale Lichtquellen" name="LocalLights"/>
-		</radio_group>
-		<text name="TerrainDetailText">
-			Terraindetails:
-		</text>
-		<radio_group name="TerrainDetailRadio">
-			<radio_item label="Niedrig" name="0"/>
-			<radio_item label="Hoch" name="2"/>
-		</radio_group>
-	</panel>
-	<button label="Übernehmen" label_selected="Übernehmen" name="Apply"/>
-	<button label="Zurücksetzen" name="Defaults"/>
-	<button label="Erweitert" name="Advanced"/>
-	<button label="Hardware" label_selected="Hardware" name="GraphicsHardwareButton"/>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Grafik" name="Display panel">
+	<text name="WindowSizeLabel">
+		Fenstergröße:
+	</text>
+	<check_box label="Vollbildmodus verwenden" name="windowed mode"/>
+	<combo_box left="115" name="windowsize combo">
+		<combo_box.item label="640x480" name="640x480"/>
+		<combo_box.item label="800x600" name="800x600"/>
+		<combo_box.item label="720x480 (NTSC)" name="720x480"/>
+		<combo_box.item label="768x576 (PAL)" name="768x576"/>
+		<combo_box.item label="1024x768" name="1024x768"/>
+	</combo_box>
+	<text name="UI Size:">
+		UI-Größe:
+	</text>
+	<text name="QualitySpeed">
+		Qualität und Geschwindigkeit:
+	</text>
+	<text name="FasterText">
+		Schneller
+	</text>
+	<text name="BetterText">
+		Besser
+	</text>
+	<text name="ShadersPrefText">
+		Niedrig
+	</text>
+	<text name="ShadersPrefText2">
+		Mittel
+	</text>
+	<text name="ShadersPrefText3">
+		Hoch
+	</text>
+	<text name="ShadersPrefText4">
+		Ultra
+	</text>
+	<panel label="CustomGraphics" name="CustomGraphics Panel">
+		<text name="ShadersText">
+			Shader:
+		</text>
+		<check_box initial_value="true" label="Bumpmapping und Glanz" name="BumpShiny"/>
+		<check_box initial_value="true" label="Einfache Shader" name="BasicShaders" tool_tip="Deaktivieren Sie diese Option, wenn der Grafikkartentreiber Abstürze verursacht."/>
+		<check_box initial_value="true" label="Atmosphären-Shader" name="WindLightUseAtmosShaders"/>
+		<check_box initial_value="true" label="Wasserreflexionen" name="Reflections"/>
+		<text name="ReflectionDetailText">
+			Spiegelung:
+		</text>
+		<radio_group name="ReflectionDetailRadio">
+			<radio_item label="Terrain und Bäume" name="0"/>
+			<radio_item label="Alle statischen Objekte" name="1"/>
+			<radio_item label="Alle Avatare und Objekte" name="2"/>
+			<radio_item label="Alles" name="3"/>
+		</radio_group>
+		<text name="AvatarRenderingText">
+			Avatar-Darstellung:
+		</text>
+		<check_box initial_value="true" label="Ersatzavatare" name="AvatarImpostors"/>
+		<check_box initial_value="true" label="Hardware-Hautberechnung" name="AvatarVertexProgram"/>
+		<check_box initial_value="true" label="Avatar-Kleidung" name="AvatarCloth"/>
+		<slider label="Sichtweite:" name="DrawDistance"/>
+		<text name="DrawDistanceMeterText2">
+			m
+		</text>
+		<slider label="Max. Partikelzahl:" name="MaxParticleCount"/>
+		<slider label="Post-Processing-Qualität:" name="RenderPostProcess"/>
+		<text name="MeshDetailText">
+			Gitterdetails:
+		</text>
+		<slider label="   Objekte:" name="ObjectMeshDetail"/>
+		<slider label="   Flexiprimitiva:" name="FlexibleMeshDetail"/>
+		<slider label="   Bäume:" name="TreeMeshDetail"/>
+		<slider label="   Avatare:" name="AvatarMeshDetail"/>
+		<slider label="   Terrain:" name="TerrainMeshDetail"/>
+		<slider label="   Himmel:" name="SkyMeshDetail"/>
+		<text name="PostProcessText">
+			Niedrig
+		</text>
+		<text name="ObjectMeshDetailText">
+			Niedrig
+		</text>
+		<text name="FlexibleMeshDetailText">
+			Niedrig
+		</text>
+		<text name="TreeMeshDetailText">
+			Niedrig
+		</text>
+		<text name="AvatarMeshDetailText">
+			Niedrig
+		</text>
+		<text name="TerrainMeshDetailText">
+			Niedrig
+		</text>
+		<text name="SkyMeshDetailText">
+			Niedrig
+		</text>
+		<text name="LightingDetailText">
+			Beleuchtungsdetails:
+		</text>
+		<radio_group name="LightingDetailRadio">
+			<radio_item label="Nur Sonne und Mond" name="SunMoon"/>
+			<radio_item label="Lokale Lichtquellen" name="LocalLights"/>
+		</radio_group>
+		<text name="TerrainDetailText">
+			Terraindetails:
+		</text>
+		<radio_group name="TerrainDetailRadio">
+			<radio_item label="Niedrig" name="0"/>
+			<radio_item label="Hoch" name="2"/>
+		</radio_group>
+	</panel>
+	<button label="Übernehmen" label_selected="Übernehmen" name="Apply"/>
+	<button label="Zurücksetzen" name="Defaults"/>
+	<button label="Erweitert" name="Advanced"/>
+	<button label="Hardware" label_selected="Hardware" name="GraphicsHardwareButton"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
index d5305d3cbe3..30083deea84 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
@@ -1,20 +1,20 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Kommunikation" name="im">
-	<panel.string name="log_in_to_change">
-		Zum Ändern anmelden
-	</panel.string>
-	<button label="Cache löschen" name="clear_cache"/>
-	<text name="cache_size_label_l">
-		(Positionen, Bilder, Internet, Suchverlauf)
-	</text>
-	<check_box label="Nur Freunden und Gruppen meinen Online-Status mitteilen" name="online_visibility"/>
-	<check_box label="Nur IMs und Anrufe von Freunden oder Gruppen durchstellen" name="voice_call_friends_only_check"/>
-	<check_box label="Nach Beendigung von Anrufen Mikrofon abschalten." name="auto_disengage_mic_check"/>
-	<check_box label="Cookies annehmen" name="cookies_enabled"/>
-	<check_box label="Protokoll auf meinem Computer speichern" name="log_instant_messages"/>
-	<radio_group name="ChatIMLogs">
-		<radio_item label="Chat" name="radio1"/>
-		<radio_item label="IM" name="radio2"/>
-	</radio_group>
-	<button label="Durchsuchen" label_selected="Durchsuchen" name="log_path_button"/>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Kommunikation" name="im">
+	<panel.string name="log_in_to_change">
+		Zum Ändern anmelden
+	</panel.string>
+	<button label="Cache löschen" name="clear_cache"/>
+	<text name="cache_size_label_l">
+		(Positionen, Bilder, Internet, Suchverlauf)
+	</text>
+	<check_box label="Nur Freunden und Gruppen meinen Online-Status mitteilen" name="online_visibility"/>
+	<check_box label="Nur IMs und Anrufe von Freunden oder Gruppen durchstellen" name="voice_call_friends_only_check"/>
+	<check_box label="Nach Beendigung von Anrufen Mikrofon abschalten." name="auto_disengage_mic_check"/>
+	<check_box label="Cookies annehmen" name="cookies_enabled"/>
+	<check_box label="Protokoll auf meinem Computer speichern" name="log_instant_messages"/>
+	<radio_group name="ChatIMLogs">
+		<radio_item label="Chat" name="radio1"/>
+		<radio_item label="IM" name="radio2"/>
+	</radio_group>
+	<button label="Durchsuchen" label_selected="Durchsuchen" name="log_path_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
index a2c317acbb1..ef28bf4cfed 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
@@ -1,46 +1,46 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Kamera" name="Input panel">
-	<button label="Andere Geräte" name="joystick_setup_button"/>
-	<text name="Mouselook:">
-		Mouselook:
-	</text>
-	<text name=" Mouse Sensitivity">
-		Mausempfindlichkeit:
-	</text>
-	<check_box label="Umkehren" name="invert_mouse"/>
-	<text name="Network:">
-		Netzwerk:
-	</text>
-	<text name="Maximum bandwidth">
-		Maximale Bandbreite
-	</text>
-	<text name="text_box2">
-		kbps
-	</text>
-	<check_box label="Benutzerdefinierter Port" name="connection_port_enabled"/>
-	<spinner label="Port-Nummer:" name="web_proxy_port"/>
-	<text name="cache_size_label_l">
-		Cache
-	</text>
-	<text name="text_box5">
-		MB
-	</text>
-	<button label="Durchsuchen" label_selected="Durchsuchen" name="set_cache"/>
-	<button label="Zurücksetzen" label_selected="Festlegen" name="reset_cache"/>
-	<text name="Cache location">
-		Cache-Ordner
-	</text>
-	<text name="Web:">
-		Internet:
-	</text>
-	<radio_group name="use_external_browser">
-		<radio_item label="Integrierten Browser verwenden" name="internal" tool_tip="Den integrierten Browser für Hilfe, Internetlinks, usw. verwenden. Der Browser wird als eigenständiges Fenster in [APP_NAME] geöffnet."/>
-		<radio_item label="Meinen Browser verwenden (IE, Firefox)" name="external" tool_tip="Standard-Browser für Hilfe, Weblinks usw. verwenden. Im Vollbildmodus nicht empfohlen."/>
-	</radio_group>
-	<check_box initial_value="false" label="Web-Proxy:" name="web_proxy_enabled"/>
-	<line_editor name="web_proxy_editor" tool_tip="Name oder IP-Adresse des Proxys"/>
-	<button label="Durchsuchen" label_selected="Durchsuchen" name="set_proxy"/>
-	<text name="Proxy location">
-		Proxy-Standort
-	</text>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Kamera" name="Input panel">
+	<button label="Andere Geräte" name="joystick_setup_button"/>
+	<text name="Mouselook:">
+		Mouselook:
+	</text>
+	<text name=" Mouse Sensitivity">
+		Mausempfindlichkeit:
+	</text>
+	<check_box label="Umkehren" name="invert_mouse"/>
+	<text name="Network:">
+		Netzwerk:
+	</text>
+	<text name="Maximum bandwidth">
+		Maximale Bandbreite
+	</text>
+	<text name="text_box2">
+		kbps
+	</text>
+	<check_box label="Benutzerdefinierter Port" name="connection_port_enabled"/>
+	<spinner label="Port-Nummer:" name="web_proxy_port"/>
+	<text name="cache_size_label_l">
+		Cache
+	</text>
+	<text name="text_box5">
+		MB
+	</text>
+	<button label="Durchsuchen" label_selected="Durchsuchen" name="set_cache"/>
+	<button label="Zurücksetzen" label_selected="Festlegen" name="reset_cache"/>
+	<text name="Cache location">
+		Cache-Ordner
+	</text>
+	<text name="Web:">
+		Internet:
+	</text>
+	<radio_group name="use_external_browser">
+		<radio_item label="Integrierten Browser verwenden" name="internal" tool_tip="Den integrierten Browser für Hilfe, Internetlinks, usw. verwenden. Der Browser wird als eigenständiges Fenster in [APP_NAME] geöffnet."/>
+		<radio_item label="Meinen Browser verwenden (IE, Firefox)" name="external" tool_tip="Standard-Browser für Hilfe, Weblinks usw. verwenden. Im Vollbildmodus nicht empfohlen."/>
+	</radio_group>
+	<check_box initial_value="false" label="Web-Proxy:" name="web_proxy_enabled"/>
+	<line_editor name="web_proxy_editor" tool_tip="Name oder IP-Adresse des Proxys"/>
+	<button label="Durchsuchen" label_selected="Durchsuchen" name="set_proxy"/>
+	<text name="Proxy location">
+		Proxy-Standort
+	</text>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_profile.xml b/indra/newview/skins/default/xui/de/panel_profile.xml
index 907803b32f0..b5fb2329c57 100644
--- a/indra/newview/skins/default/xui/de/panel_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_profile.xml
@@ -1,41 +1,41 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profil" name="panel_profile">
-	<string name="CaptionTextAcctInfo">
-		[ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-	</string>
-	<string name="payment_update_link_url">
-		http://www.secondlife.com/account/billing.php?lang=de-DE
-	</string>
-	<string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=de-DE"/>
-	<string name="no_partner_text" value="Keiner"/>
-	<scroll_container name="profile_scroll">
-		<panel name="scroll_content_panel">
-			<panel name="second_life_image_panel">
-				<text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
-			</panel>
-			<panel name="first_life_image_panel">
-				<text name="title_rw_descr_text" value="Echtes Leben:"/>
-			</panel>
-			<text name="me_homepage_text">
-				Webseite:
-			</text>
-			<text name="title_member_text" value="Mitglied seit:"/>
-			<text name="title_acc_status_text" value="Kontostatus:"/>
-			<text name="title_partner_text" value="Partner:"/>
-			<panel name="partner_data_panel">
-				<text name="partner_text" value="[FIRST] [LAST]"/>
-			</panel>
-			<text name="title_groups_text" value="Gruppen:"/>
-		</panel>
-	</scroll_container>
-	<panel name="profile_buttons_panel">
-		<button label="Freund hinzufügen" name="add_friend"/>
-		<button label="IM" name="im"/>
-		<button label="Anrufen" name="call"/>
-		<button label="Teleportieren" name="teleport"/>
-	</panel>
-	<panel name="profile_me_buttons_panel">
-		<button label="Profil bearbeiten" name="edit_profile_btn"/>
-		<button label="Aussehen bearbeiten" name="edit_appearance_btn"/>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profil" name="panel_profile">
+	<string name="CaptionTextAcctInfo">
+		[ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+	</string>
+	<string name="payment_update_link_url">
+		http://www.secondlife.com/account/billing.php?lang=de-DE
+	</string>
+	<string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=de-DE"/>
+	<string name="no_partner_text" value="Keiner"/>
+	<scroll_container name="profile_scroll">
+		<panel name="scroll_content_panel">
+			<panel name="second_life_image_panel">
+				<text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+			</panel>
+			<panel name="first_life_image_panel">
+				<text name="title_rw_descr_text" value="Echtes Leben:"/>
+			</panel>
+			<text name="me_homepage_text">
+				Webseite:
+			</text>
+			<text name="title_member_text" value="Mitglied seit:"/>
+			<text name="title_acc_status_text" value="Kontostatus:"/>
+			<text name="title_partner_text" value="Partner:"/>
+			<panel name="partner_data_panel">
+				<text name="partner_text" value="[FIRST] [LAST]"/>
+			</panel>
+			<text name="title_groups_text" value="Gruppen:"/>
+		</panel>
+	</scroll_container>
+	<panel name="profile_buttons_panel">
+		<button label="Freund hinzufügen" name="add_friend"/>
+		<button label="IM" name="im"/>
+		<button label="Anrufen" name="call"/>
+		<button label="Teleportieren" name="teleport"/>
+	</panel>
+	<panel name="profile_me_buttons_panel">
+		<button label="Profil bearbeiten" name="edit_profile_btn"/>
+		<button label="Aussehen bearbeiten" name="edit_appearance_btn"/>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_profile_view.xml b/indra/newview/skins/default/xui/de/panel_profile_view.xml
index 4ae27907aa0..84e1a20bf75 100644
--- a/indra/newview/skins/default/xui/de/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/de/panel_profile_view.xml
@@ -1,15 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
-	<string name="status_online">
-		Online
-	</string>
-	<string name="status_offline">
-		Offline
-	</string>
-	<text name="user_name" value="(wird geladen...)"/>
-	<text name="status" value="Online"/>
-	<tab_container name="tabs">
-		<panel label="Profil" name="panel_profile"/>
-		<panel label="Auswahl" name="panel_picks"/>
-	</tab_container>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_target_profile">
+	<string name="status_online">
+		Online
+	</string>
+	<string name="status_offline">
+		Offline
+	</string>
+	<text name="user_name" value="(wird geladen...)"/>
+	<text name="status" value="Online"/>
+	<tab_container name="tabs">
+		<panel label="Profil" name="panel_profile"/>
+		<panel label="Auswahl" name="panel_picks"/>
+	</tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_script_ed.xml b/indra/newview/skins/default/xui/de/panel_script_ed.xml
index c1208f19cf5..17970cf2613 100644
--- a/indra/newview/skins/default/xui/de/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/de/panel_script_ed.xml
@@ -1,43 +1,43 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="script panel">
-	<panel.string name="loading">
-		Wird geladen...
-	</panel.string>
-	<panel.string name="can_not_view">
-		Dieses Skript kann nicht angezeigt oder bearbeitet werden, da als Berechtigung „kein kopieren&quot; festgelegt wurde. Um ein Skript innerhalb eines Objektes anzuzeigen oder zu bearbeiten, benötigen Sie die vollständige Berechtigung.
-	</panel.string>
-	<panel.string name="public_objects_can_not_run">
-		Öffentliche Objekte können keine Skripts ausführen
-	</panel.string>
-	<panel.string name="script_running">
-		Läuft
-	</panel.string>
-	<panel.string name="Title">
-		Skript: [NAME]
-	</panel.string>
-	<text_editor name="Script Editor">
-		Wird geladen...
-	</text_editor>
-	<button label="Speichern" label_selected="Speichern" name="Save_btn"/>
-	<combo_box label="Einfügen..." name="Insert..."/>
-	<menu_bar name="script_menu">
-		<menu label="Datei" name="File">
-			<menu_item_call label="Speichern" name="Save"/>
-			<menu_item_call label="Alle Änderungen zurücksetzen" name="Revert All Changes"/>
-		</menu>
-		<menu label="Bearbeiten" name="Edit">
-			<menu_item_call label="Rückgängig" name="Undo"/>
-			<menu_item_call label="Wiederherstellen" name="Redo"/>
-			<menu_item_call label="Ausschneiden" name="Cut"/>
-			<menu_item_call label="Kopieren" name="Copy"/>
-			<menu_item_call label="Einfügen" name="Paste"/>
-			<menu_item_call label="Alle auswählen" name="Select All"/>
-			<menu_item_call label="Auswahl aufheben" name="Deselect"/>
-			<menu_item_call label="Suchen / Ersetzen..." name="Search / Replace..."/>
-		</menu>
-		<menu label="Hilfe" name="Help">
-			<menu_item_call label="Hilfe..." name="Help..."/>
-			<menu_item_call label="Schlüsselwort-Hilfe" name="Keyword Help..."/>
-		</menu>
-	</menu_bar>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="script panel">
+	<panel.string name="loading">
+		Wird geladen...
+	</panel.string>
+	<panel.string name="can_not_view">
+		Dieses Skript kann nicht angezeigt oder bearbeitet werden, da als Berechtigung „kein kopieren&quot; festgelegt wurde. Um ein Skript innerhalb eines Objektes anzuzeigen oder zu bearbeiten, benötigen Sie die vollständige Berechtigung.
+	</panel.string>
+	<panel.string name="public_objects_can_not_run">
+		Öffentliche Objekte können keine Skripts ausführen
+	</panel.string>
+	<panel.string name="script_running">
+		Läuft
+	</panel.string>
+	<panel.string name="Title">
+		Skript: [NAME]
+	</panel.string>
+	<text_editor name="Script Editor">
+		Wird geladen...
+	</text_editor>
+	<button label="Speichern" label_selected="Speichern" name="Save_btn"/>
+	<combo_box label="Einfügen..." name="Insert..."/>
+	<menu_bar name="script_menu">
+		<menu label="Datei" name="File">
+			<menu_item_call label="Speichern" name="Save"/>
+			<menu_item_call label="Alle Änderungen zurücksetzen" name="Revert All Changes"/>
+		</menu>
+		<menu label="Bearbeiten" name="Edit">
+			<menu_item_call label="Rückgängig" name="Undo"/>
+			<menu_item_call label="Wiederherstellen" name="Redo"/>
+			<menu_item_call label="Ausschneiden" name="Cut"/>
+			<menu_item_call label="Kopieren" name="Copy"/>
+			<menu_item_call label="Einfügen" name="Paste"/>
+			<menu_item_call label="Alle auswählen" name="Select All"/>
+			<menu_item_call label="Auswahl aufheben" name="Deselect"/>
+			<menu_item_call label="Suchen / Ersetzen..." name="Search / Replace..."/>
+		</menu>
+		<menu label="Hilfe" name="Help">
+			<menu_item_call label="Hilfe..." name="Help..."/>
+			<menu_item_call label="Schlüsselwort-Hilfe" name="Keyword Help..."/>
+		</menu>
+	</menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml
index 59fee002b8b..5b8137af4ad 100644
--- a/indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml
+++ b/indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
-<panel name="panel_stand_stop_flying">
-	<button label="Stehen" name="stand_btn" tool_tip="Klicken Sie hier, um aufzustehen."/>
-	<button label="Landen" name="stop_fly_btn" tool_tip="Landen"/>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
+<panel name="panel_stand_stop_flying">
+	<button label="Stehen" name="stand_btn" tool_tip="Klicken Sie hier, um aufzustehen."/>
+	<button label="Landen" name="stop_fly_btn" tool_tip="Landen"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_status_bar.xml b/indra/newview/skins/default/xui/de/panel_status_bar.xml
index 0ca050c81f2..4ba867e1185 100644
--- a/indra/newview/skins/default/xui/de/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/de/panel_status_bar.xml
@@ -1,22 +1,22 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="status">
-	<panel.string name="StatBarDaysOfWeek">
-		Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag
-	</panel.string>
-	<panel.string name="StatBarMonthsOfYear">
-		Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember
-	</panel.string>
-	<panel.string name="packet_loss_tooltip">
-		Paketverlust
-	</panel.string>
-	<panel.string name="bandwidth_tooltip">
-		Bandbreite
-	</panel.string>
-	<panel.string name="buycurrencylabel">
-		[AMT] L$
-	</panel.string>
-	<button label="" label_selected="" name="buycurrency" tool_tip="Mein Kontostand: Hier klicken, um mehr L$ zu kaufen"/>
-	<text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)">
-		12:00
-	</text>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="status">
+	<panel.string name="StatBarDaysOfWeek">
+		Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag
+	</panel.string>
+	<panel.string name="StatBarMonthsOfYear">
+		Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember
+	</panel.string>
+	<panel.string name="packet_loss_tooltip">
+		Paketverlust
+	</panel.string>
+	<panel.string name="bandwidth_tooltip">
+		Bandbreite
+	</panel.string>
+	<panel.string name="buycurrencylabel">
+		[AMT] L$
+	</panel.string>
+	<button label="" label_selected="" name="buycurrency" tool_tip="Mein Kontostand: Hier klicken, um mehr L$ zu kaufen"/>
+	<text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)">
+		12:00
+	</text>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_world_map.xml b/indra/newview/skins/default/xui/de/panel_world_map.xml
index d83d32a9525..f7454dd6341 100644
--- a/indra/newview/skins/default/xui/de/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/de/panel_world_map.xml
@@ -1,57 +1,57 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="world_map">
-	<panel.string name="Loading">
-		Wird geladen...
-	</panel.string>
-	<panel.string name="InvalidLocation">
-		Ungültige Position
-	</panel.string>
-	<panel.string name="world_map_north">
-		N
-	</panel.string>
-	<panel.string name="world_map_east">
-		O
-	</panel.string>
-	<panel.string name="world_map_west">
-		W
-	</panel.string>
-	<panel.string name="world_map_south">
-		S
-	</panel.string>
-	<panel.string name="world_map_southeast">
-		SO
-	</panel.string>
-	<panel.string name="world_map_northeast">
-		NO
-	</panel.string>
-	<panel.string name="world_map_southwest">
-		SW
-	</panel.string>
-	<panel.string name="world_map_northwest">
-		NW
-	</panel.string>
-	<text label="N" name="floater_map_north" text="N">
-		N
-	</text>
-	<text label="O" name="floater_map_east" text="O">
-		O
-	</text>
-	<text label="W" name="floater_map_west" text="W">
-		W
-	</text>
-	<text label="S" name="floater_map_south" text="S">
-		S
-	</text>
-	<text label="SO" name="floater_map_southeast" text="SO">
-		SO
-	</text>
-	<text label="NO" name="floater_map_northeast" text="NO">
-		NO
-	</text>
-	<text label="SW" name="floater_map_southwest" text="SW">
-		SW
-	</text>
-	<text label="NW" name="floater_map_northwest" text="NW">
-		NW
-	</text>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="world_map">
+	<panel.string name="Loading">
+		Wird geladen...
+	</panel.string>
+	<panel.string name="InvalidLocation">
+		Ungültige Position
+	</panel.string>
+	<panel.string name="world_map_north">
+		N
+	</panel.string>
+	<panel.string name="world_map_east">
+		O
+	</panel.string>
+	<panel.string name="world_map_west">
+		W
+	</panel.string>
+	<panel.string name="world_map_south">
+		S
+	</panel.string>
+	<panel.string name="world_map_southeast">
+		SO
+	</panel.string>
+	<panel.string name="world_map_northeast">
+		NO
+	</panel.string>
+	<panel.string name="world_map_southwest">
+		SW
+	</panel.string>
+	<panel.string name="world_map_northwest">
+		NW
+	</panel.string>
+	<text label="N" name="floater_map_north" text="N">
+		N
+	</text>
+	<text label="O" name="floater_map_east" text="O">
+		O
+	</text>
+	<text label="W" name="floater_map_west" text="W">
+		W
+	</text>
+	<text label="S" name="floater_map_south" text="S">
+		S
+	</text>
+	<text label="SO" name="floater_map_southeast" text="SO">
+		SO
+	</text>
+	<text label="NO" name="floater_map_northeast" text="NO">
+		NO
+	</text>
+	<text label="SW" name="floater_map_southwest" text="SW">
+		SW
+	</text>
+	<text label="NW" name="floater_map_northwest" text="NW">
+		NW
+	</text>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index e1ba2025cdd..9a0f5021d81 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -1,3149 +1,3149 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- This file contains strings that used to be hardcoded in the source.
-     It is only for those strings which do not belong in a floater.
-     For example, the strings used in avatar chat bubbles, and strings 
-     that are returned from one component and may appear in many places-->
-<strings>
-	<string name="SECOND_LIFE">
-		Second Life
-	</string>
-	<string name="APP_NAME">
-		Second Life
-	</string>
-	<string name="SECOND_LIFE_GRID">
-		Second Life-Grid:
-	</string>
-	<string name="SUPPORT_SITE">
-		Second Life Support-Portal
-	</string>
-	<string name="StartupDetectingHardware">
-		Hardware wird erfasst...
-	</string>
-	<string name="StartupLoading">
-		Wird geladen
-	</string>
-	<string name="Fullbright">
-		Fullbright (Legacy)
-	</string>
-	<string name="LoginInProgress">
-		Anmeldevorgang gestartet. [APP_NAME] reagiert möglicherweise nicht.  Bitte warten.
-	</string>
-	<string name="LoginInProgressNoFrozen">
-		Anmeldung erfolgt...
-	</string>
-	<string name="LoginAuthenticating">
-		Authentifizierung
-	</string>
-	<string name="LoginMaintenance">
-		Account wird aktualisiert...
-	</string>
-	<string name="LoginAttempt">
-		Ein früherer Anmeldeversuch ist fehlgeschlagen. Anmeldung, Versuch [NUMBER]
-	</string>
-	<string name="LoginPrecaching">
-		Welt wird geladen...
-	</string>
-	<string name="LoginInitializingBrowser">
-		Integrierter Webbrowser wird initialisiert...
-	</string>
-	<string name="LoginInitializingMultimedia">
-		Multimedia wird initialisiert...
-	</string>
-	<string name="LoginVerifyingCache">
-		Cache-Dateien werden überprüft (dauert 60-90 Sekunden)...
-	</string>
-	<string name="LoginProcessingResponse">
-		Antwort wird verarbeitet...
-	</string>
-	<string name="LoginInitializingWorld">
-		Welt wird initialisiert...
-	</string>
-	<string name="LoginDecodingImages">
-		Bilder werden entpackt...
-	</string>
-	<string name="LoginInitializingQuicktime">
-		QuickTime wird initialisiert...
-	</string>
-	<string name="LoginQuicktimeNotFound">
-		QuickTime nicht gefunden - Initialisierung nicht möglich.
-	</string>
-	<string name="LoginQuicktimeOK">
-		QuickTime wurde initialisiert.
-	</string>
-	<string name="LoginWaitingForRegionHandshake">
-		Region-Handshake...
-	</string>
-	<string name="LoginConnectingToRegion">
-		Region-Verbindung...
-	</string>
-	<string name="LoginDownloadingClothing">
-		Kleidung wird geladen...
-	</string>
-	<string name="AgentLostConnection">
-		In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung.
-	</string>
-	<string name="TooltipPerson">
-		Person
-	</string>
-	<string name="TooltipNoName">
-		(namenlos)
-	</string>
-	<string name="TooltipOwner">
-		Eigentümer:
-	</string>
-	<string name="TooltipPublic">
-		Öffentlich
-	</string>
-	<string name="TooltipIsGroup">
-		(Gruppe)
-	</string>
-	<string name="TooltipForSaleL$">
-		Zum Verkauf: [AMOUNT] L$
-	</string>
-	<string name="TooltipFlagGroupBuild">
-		Gruppenbau
-	</string>
-	<string name="TooltipFlagNoBuild">
-		Bauen aus
-	</string>
-	<string name="TooltipFlagNoEdit">
-		Gruppenbau
-	</string>
-	<string name="TooltipFlagNotSafe">
-		Unsicher
-	</string>
-	<string name="TooltipFlagNoFly">
-		Fliegen aus
-	</string>
-	<string name="TooltipFlagGroupScripts">
-		Gruppenskripte
-	</string>
-	<string name="TooltipFlagNoScripts">
-		Skripte aus
-	</string>
-	<string name="TooltipLand">
-		Land:
-	</string>
-	<string name="TooltipMustSingleDrop">
-		Sie können nur ein einzelnes Objekt hierher ziehen
-	</string>
-	<string name="TooltipHttpUrl">
-		Anklicken, um Webseite anzuzeigen
-	</string>
-	<string name="TooltipSLURL">
-		Anklicken, um Informationen zu diesem Standort anzuzeigen
-	</string>
-	<string name="TooltipAgentUrl">
-		Anklicken, um das Profil dieses Einwohners anzuzeigen
-	</string>
-	<string name="TooltipGroupUrl">
-		Anklicken, um Beschreibung der Gruppe anzuzeigen
-	</string>
-	<string name="TooltipEventUrl">
-		Anklicken, um Beschreibung der Veranstaltung anzuzeigen
-	</string>
-	<string name="TooltipClassifiedUrl">
-		Anklicken, um diese Anzeige anzuzeigen
-	</string>
-	<string name="TooltipParcelUrl">
-		Anklicken, um Beschreibung der Parzelle anzuzeigen
-	</string>
-	<string name="TooltipTeleportUrl">
-		Anklicken, um zu diesem Standort zu teleportieren
-	</string>
-	<string name="TooltipObjectIMUrl">
-		Anklicken, um Beschreibung des Objekts anzuzeigen
-	</string>
-	<string name="TooltipSLAPP">
-		Anklicken, um Befehl secondlife:// auszuführen
-	</string>
-	<string name="BUTTON_CLOSE_DARWIN">
-		Schließen (⌘-W)
-	</string>
-	<string name="BUTTON_CLOSE_WIN">
-		Schließen (Strg+W)
-	</string>
-	<string name="BUTTON_RESTORE">
-		Wiederherstellen
-	</string>
-	<string name="BUTTON_MINIMIZE">
-		Minimieren
-	</string>
-	<string name="BUTTON_TEAR_OFF">
-		Abnehmen
-	</string>
-	<string name="BUTTON_DOCK">
-		Andocken
-	</string>
-	<string name="BUTTON_UNDOCK">
-		Abkoppeln
-	</string>
-	<string name="BUTTON_HELP">
-		Hilfe anzeigen
-	</string>
-	<string name="RetrievingData">
-		Laden...
-	</string>
-	<string name="ReleaseNotes">
-		Versionshinweise
-	</string>
-	<string name="LoadingData">
-		Wird geladen...
-	</string>
-	<string name="AvatarNameNobody">
-		(niemand)
-	</string>
-	<string name="AvatarNameWaiting">
-		(wartet)
-	</string>
-	<string name="AvatarNameHippos">
-		(hippos)
-	</string>
-	<string name="GroupNameNone">
-		(keiner)
-	</string>
-	<string name="AssetErrorNone">
-		Kein Fehler
-	</string>
-	<string name="AssetErrorRequestFailed">
-		Asset-Anforderung: fehlgeschlagen
-	</string>
-	<string name="AssetErrorNonexistentFile">
-		Asset-Anforderung: Datei existiert nicht
-	</string>
-	<string name="AssetErrorNotInDatabase">
-		Asset-Anforderung: Asset in Datenbank nicht gefunden
-	</string>
-	<string name="AssetErrorEOF">
-		Ende der Datei
-	</string>
-	<string name="AssetErrorCannotOpenFile">
-		Datei kann nicht geöffnet werden
-	</string>
-	<string name="AssetErrorFileNotFound">
-		Datei nicht gefunden
-	</string>
-	<string name="AssetErrorTCPTimeout">
-		Zeitüberschreitung bei Dateiübertragung
-	</string>
-	<string name="AssetErrorCircuitGone">
-		Verbindung verloren
-	</string>
-	<string name="AssetErrorPriceMismatch">
-		Viewer und Server sind sich nicht über Preis einig
-	</string>
-	<string name="AssetErrorUnknownStatus">
-		Status unbekannt
-	</string>
-	<string name="texture">
-		Textur
-	</string>
-	<string name="sound">
-		Sound
-	</string>
-	<string name="calling card">
-		Visitenkarte
-	</string>
-	<string name="landmark">
-		Landmarke
-	</string>
-	<string name="legacy script">
-		Skript (veraltet)
-	</string>
-	<string name="clothing">
-		Kleidung
-	</string>
-	<string name="object">
-		Objekt
-	</string>
-	<string name="note card">
-		Notizkarte
-	</string>
-	<string name="folder">
-		Ordner
-	</string>
-	<string name="root">
-		Hauptverzeichnis
-	</string>
-	<string name="lsl2 script">
-		LSL2 Skript
-	</string>
-	<string name="lsl bytecode">
-		LSL Bytecode
-	</string>
-	<string name="tga texture">
-		tga-Textur
-	</string>
-	<string name="body part">
-		Körperteil
-	</string>
-	<string name="snapshot">
-		Foto
-	</string>
-	<string name="lost and found">
-		Fundbüro
-	</string>
-	<string name="targa image">
-		targa-Bild
-	</string>
-	<string name="trash">
-		Papierkorb
-	</string>
-	<string name="jpeg image">
-		jpeg-Bild
-	</string>
-	<string name="animation">
-		Animation
-	</string>
-	<string name="gesture">
-		Geste
-	</string>
-	<string name="simstate">
-		simstate
-	</string>
-	<string name="favorite">
-		Favoriten
-	</string>
-	<string name="symbolic link">
-		Link
-	</string>
-	<string name="AvatarAway">
-		Abwesend
-	</string>
-	<string name="AvatarBusy">
-		Beschäftigt
-	</string>
-	<string name="AvatarMuted">
-		Stummgeschaltet
-	</string>
-	<string name="anim_express_afraid">
-		Ängstlich
-	</string>
-	<string name="anim_express_anger">
-		Verärgert
-	</string>
-	<string name="anim_away">
-		Abwesend
-	</string>
-	<string name="anim_backflip">
-		Rückwärtssalto
-	</string>
-	<string name="anim_express_laugh">
-		Lachkrampf
-	</string>
-	<string name="anim_express_toothsmile">
-		Grinsen
-	</string>
-	<string name="anim_blowkiss">
-		Kusshand
-	</string>
-	<string name="anim_express_bored">
-		Gelangweilt
-	</string>
-	<string name="anim_bow">
-		Verbeugen
-	</string>
-	<string name="anim_clap">
-		Klatschen
-	</string>
-	<string name="anim_courtbow">
-		Diener
-	</string>
-	<string name="anim_express_cry">
-		Weinen
-	</string>
-	<string name="anim_dance1">
-		Tanz 1
-	</string>
-	<string name="anim_dance2">
-		Tanz 2
-	</string>
-	<string name="anim_dance3">
-		Tanz 3
-	</string>
-	<string name="anim_dance4">
-		Tanz 4
-	</string>
-	<string name="anim_dance5">
-		Tanz 5
-	</string>
-	<string name="anim_dance6">
-		Tanz 6
-	</string>
-	<string name="anim_dance7">
-		Tanz 7
-	</string>
-	<string name="anim_dance8">
-		Tanz 8
-	</string>
-	<string name="anim_express_disdain">
-		Verachten
-	</string>
-	<string name="anim_drink">
-		Trinken
-	</string>
-	<string name="anim_express_embarrased">
-		Verlegen
-	</string>
-	<string name="anim_angry_fingerwag">
-		Drohen
-	</string>
-	<string name="anim_fist_pump">
-		Faust pumpen
-	</string>
-	<string name="anim_yoga_float">
-		Yogaflieger
-	</string>
-	<string name="anim_express_frown">
-		Stirnrunzeln
-	</string>
-	<string name="anim_impatient">
-		Ungeduldig
-	</string>
-	<string name="anim_jumpforjoy">
-		Freudensprung
-	</string>
-	<string name="anim_kissmybutt">
-		LMA
-	</string>
-	<string name="anim_express_kiss">
-		Küssen
-	</string>
-	<string name="anim_laugh_short">
-		Lachen
-	</string>
-	<string name="anim_musclebeach">
-		Posen
-	</string>
-	<string name="anim_no_unhappy">
-		Nein (Bedauernd)
-	</string>
-	<string name="anim_no_head">
-		Nein
-	</string>
-	<string name="anim_nyanya">
-		Ällabätsch
-	</string>
-	<string name="anim_punch_onetwo">
-		Eins-Zwei-Punch
-	</string>
-	<string name="anim_express_open_mouth">
-		Mund offen
-	</string>
-	<string name="anim_peace">
-		Friede
-	</string>
-	<string name="anim_point_you">
-		Auf anderen zeigen
-	</string>
-	<string name="anim_point_me">
-		Auf mich zeigen
-	</string>
-	<string name="anim_punch_l">
-		Linker Haken
-	</string>
-	<string name="anim_punch_r">
-		Rechter Haken
-	</string>
-	<string name="anim_rps_countdown">
-		SSP zählen
-	</string>
-	<string name="anim_rps_paper">
-		SSP Papier
-	</string>
-	<string name="anim_rps_rock">
-		SSP Stein
-	</string>
-	<string name="anim_rps_scissors">
-		SSP Schere
-	</string>
-	<string name="anim_express_repulsed">
-		Angewidert
-	</string>
-	<string name="anim_kick_roundhouse_r">
-		Rundkick
-	</string>
-	<string name="anim_express_sad">
-		Traurig
-	</string>
-	<string name="anim_salute">
-		Salutieren
-	</string>
-	<string name="anim_shout">
-		Rufen
-	</string>
-	<string name="anim_express_shrug">
-		Schulterzucken
-	</string>
-	<string name="anim_express_smile">
-		Lächeln
-	</string>
-	<string name="anim_smoke_idle">
-		Zigarette halten
-	</string>
-	<string name="anim_smoke_inhale">
-		Rauchen
-	</string>
-	<string name="anim_smoke_throw_down">
-		Zigarette wegwerfen
-	</string>
-	<string name="anim_express_surprise">
-		Überraschung
-	</string>
-	<string name="anim_sword_strike_r">
-		Schwerthieb
-	</string>
-	<string name="anim_angry_tantrum">
-		Wutanfall
-	</string>
-	<string name="anim_express_tongue_out">
-		Zunge rausstrecken
-	</string>
-	<string name="anim_hello">
-		Winken
-	</string>
-	<string name="anim_whisper">
-		Flüstern
-	</string>
-	<string name="anim_whistle">
-		Pfeifen
-	</string>
-	<string name="anim_express_wink">
-		Zwinkern
-	</string>
-	<string name="anim_wink_hollywood">
-		Zwinkern (Hollywood)
-	</string>
-	<string name="anim_express_worry">
-		Sorgenvoll
-	</string>
-	<string name="anim_yes_happy">
-		Ja (Erfreut)
-	</string>
-	<string name="anim_yes_head">
-		Ja
-	</string>
-	<string name="texture_loading">
-		Wird geladen...
-	</string>
-	<string name="worldmap_offline">
-		Offline
-	</string>
-	<string name="Ok">
-		OK
-	</string>
-	<string name="Premature end of file">
-		Unvollständige Datei
-	</string>
-	<string name="ST_NO_JOINT">
-		HAUPTVERZEICHNIS oder VERBINDUNG nicht gefunden.
-	</string>
-	<string name="whisper">
-		flüstert:
-	</string>
-	<string name="shout">
-		ruft:
-	</string>
-	<string name="ringing">
-		Verbindung mit In-Welt-Voice-Chat...
-	</string>
-	<string name="connected">
-		Verbunden
-	</string>
-	<string name="unavailable">
-		Der aktuelle Standort unterstützt keine Voice-Kommunikation
-	</string>
-	<string name="hang_up">
-		Verbindung mit In-Welt-Voice-Chat getrennt
-	</string>
-	<string name="ScriptQuestionCautionChatGranted">
-		Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung erteilt: [PERMISSIONS].
-	</string>
-	<string name="ScriptQuestionCautionChatDenied">
-		Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung verweigert: [PERMISSIONS].
-	</string>
-	<string name="ScriptTakeMoney">
-		Linden-Dollar (L$) von Ihnen nehmen
-	</string>
-	<string name="ActOnControlInputs">
-		Steuerung festlegen
-	</string>
-	<string name="RemapControlInputs">
-		Steuerung neu zuweisen
-	</string>
-	<string name="AnimateYourAvatar">
-		Avatar animieren
-	</string>
-	<string name="AttachToYourAvatar">
-		An Avatar anhängen
-	</string>
-	<string name="ReleaseOwnership">
-		Eigentum aufgeben und öffentlich machen
-	</string>
-	<string name="LinkAndDelink">
-		Mit Objekten verknüpfen und davon trennen
-	</string>
-	<string name="AddAndRemoveJoints">
-		Verbindungen zu anderen Objekten hinzufügen und entfernen
-	</string>
-	<string name="ChangePermissions">
-		Berechtigungen ändern
-	</string>
-	<string name="TrackYourCamera">
-		Kameraverfolgung
-	</string>
-	<string name="ControlYourCamera">
-		Kamerasteuerung
-	</string>
-	<string name="SIM_ACCESS_PG">
-		PG
-	</string>
-	<string name="SIM_ACCESS_MATURE">
-		Mature
-	</string>
-	<string name="SIM_ACCESS_ADULT">
-		Adult
-	</string>
-	<string name="SIM_ACCESS_DOWN">
-		Offline
-	</string>
-	<string name="SIM_ACCESS_MIN">
-		Unbekannt
-	</string>
-	<string name="land_type_unknown">
-		(unbekannt)
-	</string>
-	<string name="all_files">
-		Alle Dateien
-	</string>
-	<string name="sound_files">
-		Sounds
-	</string>
-	<string name="animation_files">
-		Animationen
-	</string>
-	<string name="image_files">
-		Bilder
-	</string>
-	<string name="save_file_verb">
-		Speichern
-	</string>
-	<string name="load_file_verb">
-		Laden
-	</string>
-	<string name="targa_image_files">
-		Targa-Bilder
-	</string>
-	<string name="bitmap_image_files">
-		Bitmap-Bilder
-	</string>
-	<string name="avi_movie_file">
-		AVI-Filmdatei
-	</string>
-	<string name="xaf_animation_file">
-		XAF Anim-Datei
-	</string>
-	<string name="xml_file">
-		XML-Datei
-	</string>
-	<string name="dot_raw_file">
-		RAW-Datei
-	</string>
-	<string name="compressed_image_files">
-		Komprimierte Bilder
-	</string>
-	<string name="load_files">
-		Dateien laden
-	</string>
-	<string name="choose_the_directory">
-		Verzeichnis auswählen
-	</string>
-	<string name="AvatarSetNotAway">
-		Als anwesend anzeigen
-	</string>
-	<string name="AvatarSetAway">
-		Als abwesend anzeigen
-	</string>
-	<string name="AvatarSetNotBusy">
-		Als nicht beschäftigt anzeigen
-	</string>
-	<string name="AvatarSetBusy">
-		Als beschäftigt anzeigen
-	</string>
-	<string name="shape">
-		Form
-	</string>
-	<string name="skin">
-		Haut
-	</string>
-	<string name="hair">
-		Haare
-	</string>
-	<string name="eyes">
-		Augen
-	</string>
-	<string name="shirt">
-		Hemd
-	</string>
-	<string name="pants">
-		Hose
-	</string>
-	<string name="shoes">
-		Schuhe
-	</string>
-	<string name="socks">
-		Socken
-	</string>
-	<string name="jacket">
-		Jacke
-	</string>
-	<string name="gloves">
-		Handschuhe
-	</string>
-	<string name="undershirt">
-		Unterhemd
-	</string>
-	<string name="underpants">
-		Unterhose
-	</string>
-	<string name="skirt">
-		Rock
-	</string>
-	<string name="invalid">
-		ungültig
-	</string>
-	<string name="BodyPartsRightArm">
-		Rechter Arm
-	</string>
-	<string name="BodyPartsHead">
-		Kopf
-	</string>
-	<string name="BodyPartsLeftArm">
-		Linker Arm
-	</string>
-	<string name="BodyPartsLeftLeg">
-		Linkes Bein
-	</string>
-	<string name="BodyPartsTorso">
-		Oberkörper
-	</string>
-	<string name="BodyPartsRightLeg">
-		Rechtes Bein
-	</string>
-	<string name="GraphicsQualityLow">
-		Niedrig
-	</string>
-	<string name="GraphicsQualityMid">
-		Mittel
-	</string>
-	<string name="GraphicsQualityHigh">
-		Hoch
-	</string>
-	<string name="LeaveMouselook">
-		ESC drücken, um zur Normalansicht zurückzukehren
-	</string>
-	<string name="InventoryNoMatchingItems">
-		Im Inventar wurden keine passenden Artikel gefunden.
-	</string>
-	<string name="InventoryNoTexture">
-		Sie haben keine Kopie dieser Textur in Ihrem Inventar.
-	</string>
-	<string name="LoadingContents">
-		Inhalte werden geladen...
-	</string>
-	<string name="NoContents">
-		Keine Inhalte
-	</string>
-	<string name="InvFolder My Inventory">
-		Mein Inventar
-	</string>
-	<string name="InvFolder My Favorites">
-		Meine Favoriten
-	</string>
-	<string name="InvFolder Library">
-		Bibliothek
-	</string>
-	<string name="InvFolder Textures">
-		Texturen
-	</string>
-	<string name="InvFolder Sounds">
-		Sounds
-	</string>
-	<string name="InvFolder Calling Cards">
-		Visitenkarten
-	</string>
-	<string name="InvFolder Landmarks">
-		Landmarken
-	</string>
-	<string name="InvFolder Scripts">
-		Skripts
-	</string>
-	<string name="InvFolder Clothing">
-		Kleidung
-	</string>
-	<string name="InvFolder Objects">
-		Objekte
-	</string>
-	<string name="InvFolder Notecards">
-		Notizkarten
-	</string>
-	<string name="InvFolder New Folder">
-		Neuer Ordner
-	</string>
-	<string name="InvFolder Inventory">
-		Inventar
-	</string>
-	<string name="InvFolder Uncompressed Images">
-		Nicht-Komprimierte Bilder
-	</string>
-	<string name="InvFolder Body Parts">
-		Körperteile
-	</string>
-	<string name="InvFolder Trash">
-		Papierkorb
-	</string>
-	<string name="InvFolder Photo Album">
-		Fotoalbum
-	</string>
-	<string name="InvFolder Lost And Found">
-		Fundbüro
-	</string>
-	<string name="InvFolder Uncompressed Sounds">
-		Nicht-Komprimierte Sounds
-	</string>
-	<string name="InvFolder Animations">
-		Animationen
-	</string>
-	<string name="InvFolder Gestures">
-		Gesten
-	</string>
-	<string name="InvFolder favorite">
-		Favoriten
-	</string>
-	<string name="InvFolder Current Outfit">
-		Aktuelles Outfit
-	</string>
-	<string name="InvFolder My Outfits">
-		Meine Outfits
-	</string>
-	<string name="InvFolder Friends">
-		Freunde
-	</string>
-	<string name="InvFolder All">
-		Alle
-	</string>
-	<string name="Buy">
-		Kaufen
-	</string>
-	<string name="BuyforL$">
-		Kaufen für L$
-	</string>
-	<string name="Stone">
-		Stein
-	</string>
-	<string name="Metal">
-		Metall
-	</string>
-	<string name="Glass">
-		Glas
-	</string>
-	<string name="Wood">
-		Holz
-	</string>
-	<string name="Flesh">
-		Fleisch
-	</string>
-	<string name="Plastic">
-		Plastik
-	</string>
-	<string name="Rubber">
-		Gummi
-	</string>
-	<string name="Light">
-		Licht
-	</string>
-	<string name="KBShift">
-		Umschalt-Taste
-	</string>
-	<string name="KBCtrl">
-		Strg
-	</string>
-	<string name="Chest">
-		Brust
-	</string>
-	<string name="Skull">
-		Schädel
-	</string>
-	<string name="Left Shoulder">
-		Linke Schulter
-	</string>
-	<string name="Right Shoulder">
-		Rechte Schulter
-	</string>
-	<string name="Left Hand">
-		Linke Hand
-	</string>
-	<string name="Right Hand">
-		Rechte Hand
-	</string>
-	<string name="Left Foot">
-		Linker Fuß
-	</string>
-	<string name="Right Foot">
-		Rechter Fuß
-	</string>
-	<string name="Spine">
-		Wirbelsäule
-	</string>
-	<string name="Pelvis">
-		Becken
-	</string>
-	<string name="Mouth">
-		Mund
-	</string>
-	<string name="Chin">
-		Kinn
-	</string>
-	<string name="Left Ear">
-		Linkes Ohr
-	</string>
-	<string name="Right Ear">
-		Rechtes Ohr
-	</string>
-	<string name="Left Eyeball">
-		Linker Augapfel
-	</string>
-	<string name="Right Eyeball">
-		Rechter Augapfel
-	</string>
-	<string name="Nose">
-		Nase
-	</string>
-	<string name="R Upper Arm">
-		R Oberarm
-	</string>
-	<string name="R Forearm">
-		R Unterarm
-	</string>
-	<string name="L Upper Arm">
-		L Oberarm
-	</string>
-	<string name="L Forearm">
-		L Unterarm
-	</string>
-	<string name="Right Hip">
-		Rechte Hüfte
-	</string>
-	<string name="R Upper Leg">
-		R Oberschenkel
-	</string>
-	<string name="R Lower Leg">
-		R Unterschenkel
-	</string>
-	<string name="Left Hip">
-		Linke Hüfte
-	</string>
-	<string name="L Upper Leg">
-		L Oberschenkel
-	</string>
-	<string name="L Lower Leg">
-		L Unterschenkel
-	</string>
-	<string name="Stomach">
-		Bauch
-	</string>
-	<string name="Left Pec">
-		Linke Brust
-	</string>
-	<string name="Right Pec">
-		Rechts
-	</string>
-	<string name="YearsMonthsOld">
-		[AGEYEARS] [AGEMONTHS] alt
-	</string>
-	<string name="YearsOld">
-		[AGEYEARS] alt
-	</string>
-	<string name="MonthsOld">
-		[AGEMONTHS] alt
-	</string>
-	<string name="WeeksOld">
-		[AGEWEEKS] alt
-	</string>
-	<string name="DaysOld">
-		[AGEDAYS] alt
-	</string>
-	<string name="TodayOld">
-		Seit heute Mitglied
-	</string>
-	<string name="AgeYearsA">
-		[COUNT] Jahr
-	</string>
-	<string name="AgeYearsB">
-		[COUNT] Jahre
-	</string>
-	<string name="AgeYearsC">
-		[COUNT] Jahre
-	</string>
-	<string name="AgeMonthsA">
-		[COUNT] Monat
-	</string>
-	<string name="AgeMonthsB">
-		[COUNT] Monate
-	</string>
-	<string name="AgeMonthsC">
-		[COUNT] Monate
-	</string>
-	<string name="AgeWeeksA">
-		[COUNT] Woche
-	</string>
-	<string name="AgeWeeksB">
-		[COUNT] Wochen
-	</string>
-	<string name="AgeWeeksC">
-		[COUNT] Wochen
-	</string>
-	<string name="AgeDaysA">
-		[COUNT] Tag
-	</string>
-	<string name="AgeDaysB">
-		[COUNT] Tage
-	</string>
-	<string name="AgeDaysC">
-		[COUNT] Tage
-	</string>
-	<string name="AcctTypeResident">
-		Einwohner
-	</string>
-	<string name="AcctTypeTrial">
-		Test
-	</string>
-	<string name="AcctTypeCharterMember">
-		Charta-Mitglied
-	</string>
-	<string name="AcctTypeEmployee">
-		Linden Lab-Mitarbeiter
-	</string>
-	<string name="PaymentInfoUsed">
-		Zahlungsinfo verwendet
-	</string>
-	<string name="PaymentInfoOnFile">
-		Zahlungsinfo archiviert
-	</string>
-	<string name="NoPaymentInfoOnFile">
-		Keine Zahlungsinfo archiviert
-	</string>
-	<string name="AgeVerified">
-		Altersgeprüft
-	</string>
-	<string name="NotAgeVerified">
-		Nicht altersgeprüft
-	</string>
-	<string name="Center 2">
-		Mitte 2
-	</string>
-	<string name="Top Right">
-		Oben rechts
-	</string>
-	<string name="Top">
-		Oben
-	</string>
-	<string name="Top Left">
-		Oben links
-	</string>
-	<string name="Center">
-		Zentrieren
-	</string>
-	<string name="Bottom Left">
-		Unten links
-	</string>
-	<string name="Bottom">
-		Unten
-	</string>
-	<string name="Bottom Right">
-		Unten rechts
-	</string>
-	<string name="CompileQueueDownloadedCompiling">
-		Heruntergeladen, wird kompiliert
-	</string>
-	<string name="CompileQueueScriptNotFound">
-		Skript wurde auf Server nicht gefunden.
-	</string>
-	<string name="CompileQueueProblemDownloading">
-		Beim Herunterladen ist ein Problem aufgetreten
-	</string>
-	<string name="CompileQueueInsufficientPermDownload">
-		Unzureichende Rechte zum Herunterladen eines Skripts.
-	</string>
-	<string name="CompileQueueInsufficientPermFor">
-		Unzureichende Berechtigungen für
-	</string>
-	<string name="CompileQueueUnknownFailure">
-		Unbekannter Fehler beim Herunterladen
-	</string>
-	<string name="CompileQueueTitle">
-		Rekompilierung
-	</string>
-	<string name="CompileQueueStart">
-		rekompilieren
-	</string>
-	<string name="ResetQueueTitle">
-		Zurücksetzen
-	</string>
-	<string name="ResetQueueStart">
-		Zurücksetzen
-	</string>
-	<string name="RunQueueTitle">
-		Skript ausführen
-	</string>
-	<string name="RunQueueStart">
-		Skript ausführen
-	</string>
-	<string name="NotRunQueueTitle">
-		Skript anhalten
-	</string>
-	<string name="NotRunQueueStart">
-		Skript anhalten
-	</string>
-	<string name="CompileSuccessful">
-		Kompilieren erfolgreich abgeschlossen!
-	</string>
-	<string name="CompileSuccessfulSaving">
-		Kompilieren erfolgreich abgeschlossen, speichern...
-	</string>
-	<string name="SaveComplete">
-		Speichervorgang abgeschlossen.
-	</string>
-	<string name="ObjectOutOfRange">
-		Skript (Objekt außerhalb des Bereichs)
-	</string>
-	<string name="GodToolsObjectOwnedBy">
-		Objekt [OBJECT], Besitzer [OWNER]
-	</string>
-	<string name="GroupsNone">
-		keine
-	</string>
-	<string name="Unknown">
-		(unbekannt)
-	</string>
-	<string name="Balance">
-		Kontostand
-	</string>
-	<string name="Credits">
-		Danksagung
-	</string>
-	<string name="Debits">
-		Soll
-	</string>
-	<string name="Total">
-		Gesamtbetrag
-	</string>
-	<string name="NoGroupDataFound">
-		Für Gruppe wurden keine Gruppendaten gefunden
-	</string>
-	<string name="IMParentEstate">
-		parent estate
-	</string>
-	<string name="IMMainland">
-		Mainland
-	</string>
-	<string name="IMTeen">
-		Teen
-	</string>
-	<string name="RegionInfoError">
-		Fehler
-	</string>
-	<string name="RegionInfoAllEstatesOwnedBy">
-		alle Grundstücke gehören [OWNER]
-	</string>
-	<string name="RegionInfoAllEstatesYouOwn">
-		alle Grundstücke, die Ihnen gehört haben
-	</string>
-	<string name="RegionInfoAllEstatesYouManage">
-		alle Grundstücke, die Sie für [OWNER] verwaltet haben
-	</string>
-	<string name="RegionInfoAllowedResidents">
-		Zulässige Einwohner: ([ALLOWEDAGENTS], max [MAXACCESS])
-	</string>
-	<string name="RegionInfoAllowedGroups">
-		Zulässige Gruppen: ([ALLOWEDGROUPS], max [MAXACCESS])
-	</string>
-	<string name="CursorPos">
-		Zeile [LINE], Spalte [COLUMN]
-	</string>
-	<string name="PanelDirCountFound">
-		[COUNT] gefunden
-	</string>
-	<string name="PanelContentsNewScript">
-		Neues Skript
-	</string>
-	<string name="MuteByName">
-		(nach Namen)
-	</string>
-	<string name="MuteAgent">
-		(Einwohner)
-	</string>
-	<string name="MuteObject">
-		(Objekt)
-	</string>
-	<string name="MuteGroup">
-		(Gruppe)
-	</string>
-	<string name="RegionNoCovenant">
-		Für dieses Grundstück liegt kein Vertrag vor.
-	</string>
-	<string name="RegionNoCovenantOtherOwner">
-		Für dieses Grundstück liegt kein Vertrag vor. Das Land auf diesem Grundstück wird vom Grundstückseigentümer und nicht von Linden Lab verkauft.  Für Informationen zum Verkauf setzen Sie sich bitte mit dem Grundstückseigentümer in Verbindung.
-	</string>
-	<string name="covenant_last_modified">
-		Zuletzt geändert:
-	</string>
-	<string name="GroupOwned">
-		In Gruppenbesitz
-	</string>
-	<string name="Public">
-		Öffentlich
-	</string>
-	<string name="ClassifiedClicksTxt">
-		Klicks: [TELEPORT] teleportieren, [MAP] Karte, [PROFILE] Profil
-	</string>
-	<string name="ClassifiedUpdateAfterPublish">
-		(wird nach Veröffentlichung aktualisiert)
-	</string>
-	<string name="GroupVoteYes">
-		Ja
-	</string>
-	<string name="GroupVoteNo">
-		Nein
-	</string>
-	<string name="GroupVoteNoActiveProposals">
-		Zurzeit sind keine Umfragen aktiv
-	</string>
-	<string name="GroupVoteNoArchivedProposals">
-		Zurzeit sind keine Umfragen aktiv
-	</string>
-	<string name="GroupVoteRetrievingArchivedProposals">
-		Archivierte Umfragen werden geladen
-	</string>
-	<string name="GroupVoteRetrievingActiveProposals">
-		Aktive Umfragen werden geladen
-	</string>
-	<string name="MultiPreviewTitle">
-		Vorschau
-	</string>
-	<string name="MultiPropertiesTitle">
-		Eigenschaften
-	</string>
-	<string name="InvOfferAnObjectNamed">
-		Ein Objekt namens
-	</string>
-	<string name="InvOfferOwnedByGroup">
-		im Besitz der Gruppe
-	</string>
-	<string name="InvOfferOwnedByUnknownGroup">
-		im Besitz einer unbekannten Gruppe
-	</string>
-	<string name="InvOfferOwnedBy">
-		im Besitz von
-	</string>
-	<string name="InvOfferOwnedByUnknownUser">
-		im Besitz eines unbekannten Einwohners
-	</string>
-	<string name="InvOfferGaveYou">
-		hat Ihnen folgendes übergeben
-	</string>
-	<string name="InvOfferYouDecline">
-		Sie lehnen folgendes ab:
-	</string>
-	<string name="InvOfferFrom">
-		von
-	</string>
-	<string name="GroupMoneyTotal">
-		Gesamtbetrag
-	</string>
-	<string name="GroupMoneyBought">
-		gekauft
-	</string>
-	<string name="GroupMoneyPaidYou">
-		bezahlte Ihnen
-	</string>
-	<string name="GroupMoneyPaidInto">
-		bezahlte an
-	</string>
-	<string name="GroupMoneyBoughtPassTo">
-		kaufte Pass für
-	</string>
-	<string name="GroupMoneyPaidFeeForEvent">
-		bezahlte Gebühr für Event
-	</string>
-	<string name="GroupMoneyPaidPrizeForEvent">
-		bezahlte Preis für Event
-	</string>
-	<string name="GroupMoneyBalance">
-		Kontostand
-	</string>
-	<string name="GroupMoneyCredits">
-		Danksagung
-	</string>
-	<string name="GroupMoneyDebits">
-		Soll
-	</string>
-	<string name="ViewerObjectContents">
-		Inhalte
-	</string>
-	<string name="AcquiredItems">
-		Erworbene Artikel
-	</string>
-	<string name="Cancel">
-		Abbrechen
-	</string>
-	<string name="UploadingCosts">
-		Hochladen von %s kostet
-	</string>
-	<string name="UnknownFileExtension">
-		Unbekanntes Dateiformat .%s
-Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh
-	</string>
-	<string name="AddLandmarkNavBarMenu">
-		Landmarke hinzufügen...
-	</string>
-	<string name="EditLandmarkNavBarMenu">
-		Landmarke bearbeiten...
-	</string>
-	<string name="accel-mac-control">
-		⌃
-	</string>
-	<string name="accel-mac-command">
-		⌘
-	</string>
-	<string name="accel-mac-option">
-		⌥
-	</string>
-	<string name="accel-mac-shift">
-		⇧
-	</string>
-	<string name="accel-win-control">
-		Strg+
-	</string>
-	<string name="accel-win-alt">
-		Alt+
-	</string>
-	<string name="accel-win-shift">
-		Umschalt+
-	</string>
-	<string name="FileSaved">
-		Datei wurde gespeichert
-	</string>
-	<string name="Receiving">
-		Daten werden empfangen
-	</string>
-	<string name="AM">
-		Uhr
-	</string>
-	<string name="PM">
-		Uhr
-	</string>
-	<string name="PST">
-		PST
-	</string>
-	<string name="PDT">
-		PDT
-	</string>
-	<string name="Forward">
-		Vorwärts
-	</string>
-	<string name="Left">
-		Links
-	</string>
-	<string name="Right">
-		Rechts
-	</string>
-	<string name="Back">
-		Zurück
-	</string>
-	<string name="North">
-		Norden
-	</string>
-	<string name="South">
-		Süden
-	</string>
-	<string name="West">
-		Westen
-	</string>
-	<string name="East">
-		Osten
-	</string>
-	<string name="Up">
-		Nach oben
-	</string>
-	<string name="Down">
-		Nach unten
-	</string>
-	<string name="Any Category">
-		Alle Kategorien
-	</string>
-	<string name="Shopping">
-		Shopping
-	</string>
-	<string name="Land Rental">
-		Land mieten
-	</string>
-	<string name="Property Rental">
-		Immobilie mieten
-	</string>
-	<string name="Special Attraction">
-		Attraktionen
-	</string>
-	<string name="New Products">
-		Neue Produkte
-	</string>
-	<string name="Employment">
-		Stellenangebote
-	</string>
-	<string name="Wanted">
-		Gesucht
-	</string>
-	<string name="Service">
-		Dienstleistungen
-	</string>
-	<string name="Personal">
-		Verschiedenes
-	</string>
-	<string name="None">
-		Keiner
-	</string>
-	<string name="Linden Location">
-		Lindenort
-	</string>
-	<string name="Adult">
-		Adult
-	</string>
-	<string name="Arts&amp;Culture">
-		Kunst &amp; Kultur
-	</string>
-	<string name="Business">
-		Business
-	</string>
-	<string name="Educational">
-		Bildung
-	</string>
-	<string name="Gaming">
-		Spielen
-	</string>
-	<string name="Hangout">
-		Treffpunkt
-	</string>
-	<string name="Newcomer Friendly">
-		Anfängergerecht
-	</string>
-	<string name="Parks&amp;Nature">
-		Parks und Natur
-	</string>
-	<string name="Residential">
-		Wohngebiet
-	</string>
-	<string name="Stage">
-		Phase
-	</string>
-	<string name="Other">
-		Sonstige
-	</string>
-	<string name="Any">
-		Alle
-	</string>
-	<string name="You">
-		Sie
-	</string>
-	<string name=":">
-		:
-	</string>
-	<string name=",">
-		,
-	</string>
-	<string name="...">
-		...
-	</string>
-	<string name="***">
-		***
-	</string>
-	<string name="(">
-		(
-	</string>
-	<string name=")">
-		)
-	</string>
-	<string name=".">
-		.
-	</string>
-	<string name="&apos;">
-		&apos;
-	</string>
-	<string name="---">
-		---
-	</string>
-	<string name="MBCmdLineError">
-		Beim Parsen der Befehlszeile wurde ein Fehler festgestellt.
-Weitere Informationen: http://wiki.secondlife.com/wiki/Client_parameters (EN)
-Fehler:
-	</string>
-	<string name="MBCmdLineUsg">
-		[APP_NAME] Verwendung in Befehlszeile:
-	</string>
-	<string name="MBUnableToAccessFile">
-		[APP_NAME] kann auf die erforderliche Datei nicht zugreifen.
-
-Grund hierfür ist, dass Sie entweder mehrere Instanzen gleichzeitig ausführen oder dass Ihr System denkt, eine Datei sei geöffnet.
-Falls diese Nachricht erneut angezeigt wird, starten Sie bitte Ihren Computer neu und probieren Sie es noch einmal.
-Falls der Fehler dann weiterhin auftritt, müssen Sie [APP_NAME] von Ihrem System de-installieren und erneut installieren.
-	</string>
-	<string name="MBFatalError">
-		Unbehebbarer Fehler
-	</string>
-	<string name="MBRequiresAltiVec">
-		[APP_NAME] erfordert einen Prozessor mit AltiVec (G4 oder später).
-	</string>
-	<string name="MBAlreadyRunning">
-		[APP_NAME] läuft bereits.
-Bitte sehen Sie in Ihrer Menüleiste nach, dort sollte ein Symbol für das Programm angezeigt werden.
-Falls diese Nachricht erneut angezeigt wird, starten Sie Ihren Computer bitte neu.
-	</string>
-	<string name="MBFrozenCrashed">
-		[APP_NAME] scheint eingefroren zu sein oder ist abgestürzt.
-Möchten Sie einen Absturz-Bericht einschicken?
-	</string>
-	<string name="MBAlert">
-		Alarm
-	</string>
-	<string name="MBNoDirectX">
-		[APP_NAME] kann DirectX 9.0b oder höher nicht feststellen.
-[APP_NAME] verwendet DirectX, um nach Hardware und/oder veralteten Treibern zu suchen, die zu Problemen mit der Stabilität, Leistung und Abstürzen führen können.  Sie können [APP_NAME] auch so ausführen, wir empfehlen jedoch, dass DirectX 9.0b vorhanden ist und ausgeführt wird.
-
-Möchten Sie fortfahren?
-	</string>
-	<string name="MBWarning">
-		Hinweis
-	</string>
-	<string name="MBNoAutoUpdate">
-		Für Linux ist zur Zeit noch kein automatisches Aktualisieren möglich.
-Bitte laden Sie die aktuellste Version von www.secondlife.com herunter.
-	</string>
-	<string name="MBRegClassFailed">
-		RegisterClass fehlgeschlagen
-	</string>
-	<string name="MBError">
-		Fehler
-	</string>
-	<string name="MBFullScreenErr">
-		Vollbildschirm mit [WIDTH] x [HEIGHT] kann nicht ausgeführt werden.
-Ausführung erfolgt in Fenster.
-	</string>
-	<string name="MBDestroyWinFailed">
-		Fehler beim Herunterfahren während Fenster geschlossen wurde (DestroyWindow() fehlgeschlagen)
-	</string>
-	<string name="MBShutdownErr">
-		Fehler beim Herunterfahren
-	</string>
-	<string name="MBDevContextErr">
-		Kann keinen Kontext für GL-Gerät erstellen
-	</string>
-	<string name="MBPixelFmtErr">
-		Passendes Pixelformat wurde nicht gefunden
-	</string>
-	<string name="MBPixelFmtDescErr">
-		Beschreibung für Pixelformat nicht verfügbar
-	</string>
-	<string name="MBTrueColorWindow">
-		Um [APP_NAME] in einem Fenster auszuführen, ist True Color (32-bit) erforderlich.
-Klicken Sie auf Systemsteuerung &gt; Anzeige &gt; Einstellungen und stellen Sie den Bildschirm auf 32-bit Farbe ein.
-Wenn Sie die Anwendung im Modus Vollbildschirm ausführen möchten, dann wird [APP_NAME] den Bildschirm automatisch während der Ausführung anpassen.
-	</string>
-	<string name="MBAlpha">
-		[APP_NAME] kann nicht ausgeführt werden, da kein 8-Bit-Alpha-Kanal verfügbar ist.  Dies geschieht normalerweise bei Problemen mit dem Treiber der Video-Karte.
-Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für Ihre Videokarte installiert haben.
-Vergewissern Sie sich außerdem, dass Ihr Bildschirm auf True Color (32-Bit) eingestellt ist (Systemsteuerung &gt; Anzeige &gt; Einstellungen).
-Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
-	</string>
-	<string name="MBPixelFmtSetErr">
-		Pixel-Format kann nicht eingestellt werden.
-	</string>
-	<string name="MBGLContextErr">
-		Kann keinen Kontext für GL-Gerät erstellen
-	</string>
-	<string name="MBGLContextActErr">
-		Kann keinen Kontext für GL-Gerät aktivieren
-	</string>
-	<string name="MBVideoDrvErr">
-		[APP_NAME] kann nicht ausgeführt werden, da die Treiber Ihrer Videokarte entweder nicht richtig installiert oder veraltet sind, oder die entsprechende Hardware nicht unterstützt wird. Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für die Videokarte installiert haben. Falls Sie die aktuellsten Treiber bereits installiert haben, installieren Sie diese bitte erneut.
-
-Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
-	</string>
-	<string name="5 O&apos;Clock Shadow">
-		Bartschatten
-	</string>
-	<string name="All White">
-		Ganz weiß
-	</string>
-	<string name="Anime Eyes">
-		Anime-Augen
-	</string>
-	<string name="Arced">
-		Gewölbt
-	</string>
-	<string name="Arm Length">
-		Armlänge
-	</string>
-	<string name="Attached">
-		Angewachsen
-	</string>
-	<string name="Attached Earlobes">
-		Angewachsene Ohrläppchen
-	</string>
-	<string name="Back Bangs">
-		Nackenhaar
-	</string>
-	<string name="Back Bangs Down">
-		Lang
-	</string>
-	<string name="Back Bangs Up">
-		Kurz
-	</string>
-	<string name="Back Fringe">
-		Nackenfransen
-	</string>
-	<string name="Back Hair">
-		Hinterkopfhaar
-	</string>
-	<string name="Back Hair Down">
-		lang
-	</string>
-	<string name="Back Hair Up">
-		kurz
-	</string>
-	<string name="Baggy">
-		Tränensäcke
-	</string>
-	<string name="Bangs">
-		Pony
-	</string>
-	<string name="Bangs Down">
-		Pony lang
-	</string>
-	<string name="Bangs Up">
-		Pony kurz
-	</string>
-	<string name="Beady Eyes">
-		Knopfaugen
-	</string>
-	<string name="Belly Size">
-		Bauchgröße
-	</string>
-	<string name="Big">
-		Groß
-	</string>
-	<string name="Big Butt">
-		Großer Hintern
-	</string>
-	<string name="Big Eyeball">
-		Großer Augapfel
-	</string>
-	<string name="Big Hair Back">
-		Volumen: Hinten
-	</string>
-	<string name="Big Hair Front">
-		Volumen: Vorne
-	</string>
-	<string name="Big Hair Top">
-		Volumen: Oben
-	</string>
-	<string name="Big Head">
-		Großer Kopf
-	</string>
-	<string name="Big Pectorals">
-		Große Brustmuskeln
-	</string>
-	<string name="Big Spikes">
-		Große Stacheln
-	</string>
-	<string name="Black">
-		Schwarz
-	</string>
-	<string name="Blonde">
-		Blond
-	</string>
-	<string name="Blonde Hair">
-		Blondes Haar
-	</string>
-	<string name="Blush">
-		Rouge
-	</string>
-	<string name="Blush Color">
-		Rougefarbe
-	</string>
-	<string name="Blush Opacity">
-		Rouge Deckkraft
-	</string>
-	<string name="Body Definition">
-		Körperkonturen
-	</string>
-	<string name="Body Fat">
-		Körperfett
-	</string>
-	<string name="Body Freckles">
-		Sommersprossen
-	</string>
-	<string name="Body Thick">
-		Körper - breit
-	</string>
-	<string name="Body Thickness">
-		Körperbreite
-	</string>
-	<string name="Body Thin">
-		Körper - schmal
-	</string>
-	<string name="Bow Legged">
-		o-beinig
-	</string>
-	<string name="Breast Buoyancy">
-		Brust, Straffheit
-	</string>
-	<string name="Breast Cleavage">
-		Dekolleté
-	</string>
-	<string name="Breast Size">
-		Brustgröße
-	</string>
-	<string name="Bridge Width">
-		Rückenbreite
-	</string>
-	<string name="Broad">
-		Breit
-	</string>
-	<string name="Brow Size">
-		Brauengröße
-	</string>
-	<string name="Bug Eyes">
-		Glubschaugen
-	</string>
-	<string name="Bugged Eyes">
-		Hervortretend
-	</string>
-	<string name="Bulbous">
-		Knollennase
-	</string>
-	<string name="Bulbous Nose">
-		Knollennase
-	</string>
-	<string name="Bushy Eyebrows">
-		Buschige Augenbrauen
-	</string>
-	<string name="Bushy Hair">
-		Buschiges Haar
-	</string>
-	<string name="Butt Size">
-		Hintern, Größe
-	</string>
-	<string name="bustle skirt">
-		Tournürenrock
-	</string>
-	<string name="no bustle">
-		Ohne
-	</string>
-	<string name="more bustle">
-		Mit
-	</string>
-	<string name="Chaplin">
-		Chaplin
-	</string>
-	<string name="Cheek Bones">
-		Wangenknochen
-	</string>
-	<string name="Chest Size">
-		Brustgröße
-	</string>
-	<string name="Chin Angle">
-		Kinnwinkel
-	</string>
-	<string name="Chin Cleft">
-		Kinnspalte
-	</string>
-	<string name="Chin Curtains">
-		Schifferfräse
-	</string>
-	<string name="Chin Depth">
-		Kinnlänge
-	</string>
-	<string name="Chin Heavy">
-		Kinn ausgeprägt
-	</string>
-	<string name="Chin In">
-		Kinn zurück
-	</string>
-	<string name="Chin Out">
-		Kinn nach vorne
-	</string>
-	<string name="Chin-Neck">
-		Kinn-Hals
-	</string>
-	<string name="Clear">
-		Löschen
-	</string>
-	<string name="Cleft">
-		Spalte
-	</string>
-	<string name="Close Set Eyes">
-		Eng stehende Augen
-	</string>
-	<string name="Closed">
-		Geschlossen
-	</string>
-	<string name="Closed Back">
-		Hinten geschlossen
-	</string>
-	<string name="Closed Front">
-		Vorne geschlossen
-	</string>
-	<string name="Closed Left">
-		Links geschlossen
-	</string>
-	<string name="Closed Right">
-		Rechts geschlossen
-	</string>
-	<string name="Coin Purse">
-		Klein
-	</string>
-	<string name="Collar Back">
-		Kragen hinten
-	</string>
-	<string name="Collar Front">
-		Kragen vorne
-	</string>
-	<string name="Corner Down">
-		Nach unten
-	</string>
-	<string name="Corner Normal">
-		Normal
-	</string>
-	<string name="Corner Up">
-		Nach oben
-	</string>
-	<string name="Creased">
-		Schlupflid
-	</string>
-	<string name="Crooked Nose">
-		Krumme Nase
-	</string>
-	<string name="Cropped Hair">
-		Kurze Haare
-	</string>
-	<string name="Cuff Flare">
-		Hosenaufschlag
-	</string>
-	<string name="Dark">
-		Dunkel
-	</string>
-	<string name="Dark Green">
-		Dunkelgrün
-	</string>
-	<string name="Darker">
-		Dunkler
-	</string>
-	<string name="Deep">
-		Tief
-	</string>
-	<string name="Default Heels">
-		Standardabsätze
-	</string>
-	<string name="Default Toe">
-		Standardspitze
-	</string>
-	<string name="Dense">
-		Dicht
-	</string>
-	<string name="Dense hair">
-		Dichtes Haar
-	</string>
-	<string name="Double Chin">
-		Doppelkinn
-	</string>
-	<string name="Downturned">
-		Nach unten
-	</string>
-	<string name="Duffle Bag">
-		Groß
-	</string>
-	<string name="Ear Angle">
-		Ohrenwinkel
-	</string>
-	<string name="Ear Size">
-		Ohrengröße
-	</string>
-	<string name="Ear Tips">
-		Ohrenspitzen
-	</string>
-	<string name="Egg Head">
-		Eierkopf
-	</string>
-	<string name="Eye Bags">
-		Augenränder
-	</string>
-	<string name="Eye Color">
-		Augenfarbe
-	</string>
-	<string name="Eye Depth">
-		Augentiefe
-	</string>
-	<string name="Eye Lightness">
-		Helligkeit
-	</string>
-	<string name="Eye Opening">
-		Öffnung
-	</string>
-	<string name="Eye Pop">
-		Symmetrie
-	</string>
-	<string name="Eye Size">
-		Augengröße
-	</string>
-	<string name="Eye Spacing">
-		Augenstand
-	</string>
-	<string name="Eyeball Size">
-		Größe des Augapfels
-	</string>
-	<string name="Eyebrow Arc">
-		Brauenbogen
-	</string>
-	<string name="Eyebrow Density">
-		Brauendichte
-	</string>
-	<string name="Eyebrow Height">
-		Brauenhöhe
-	</string>
-	<string name="Eyebrow Points">
-		Brauenenden
-	</string>
-	<string name="Eyebrow Size">
-		Brauengröße
-	</string>
-	<string name="Eyelash Length">
-		Wimpernlänge
-	</string>
-	<string name="Eyeliner">
-		Eyeliner
-	</string>
-	<string name="Eyeliner Color">
-		Farbe des Eyeliners
-	</string>
-	<string name="Eyes Back">
-		Augen zurück
-	</string>
-	<string name="Eyes Bugged">
-		Glubschaugen
-	</string>
-	<string name="Eyes Forward">
-		Augen nach vorne
-	</string>
-	<string name="Eyes Long Head">
-		Augen langer Kopf
-	</string>
-	<string name="Eyes Shear Left Up">
-		Augen Verzerrung links hoch
-	</string>
-	<string name="Eyes Shear Right Up">
-		Augen Verzerrung rechts hoch
-	</string>
-	<string name="Eyes Short Head">
-		Augen kurzer Kopf
-	</string>
-	<string name="Eyes Spread">
-		Augen auseinander
-	</string>
-	<string name="Eyes Sunken">
-		eingesunkene Augen
-	</string>
-	<string name="Eyes Together">
-		Augen zusammen
-	</string>
-	<string name="Face Shear">
-		Gesichtsverzerrung
-	</string>
-	<string name="Facial Definition">
-		Gesichtskonturen
-	</string>
-	<string name="Far Set Eyes">
-		Weit auseinander
-	</string>
-	<string name="Fat">
-		Dick
-	</string>
-	<string name="Fat Head">
-		Dicker Kopf
-	</string>
-	<string name="Fat Lips">
-		Volle Lippen
-	</string>
-	<string name="Fat Lower">
-		Volle Unterlippe
-	</string>
-	<string name="Fat Lower Lip">
-		Volle Unterlippe
-	</string>
-	<string name="Fat Torso">
-		Dicker Körper
-	</string>
-	<string name="Fat Upper">
-		Volle Oberlippe
-	</string>
-	<string name="Fat Upper Lip">
-		Volle Oberlippe
-	</string>
-	<string name="Female">
-		weiblich
-	</string>
-	<string name="Fingerless">
-		Ohne Finger
-	</string>
-	<string name="Fingers">
-		Finger
-	</string>
-	<string name="Flared Cuffs">
-		Ausgestellt
-	</string>
-	<string name="Flat">
-		Flach
-	</string>
-	<string name="Flat Butt">
-		Flacher Hintern
-	</string>
-	<string name="Flat Head">
-		Flacher Kopf
-	</string>
-	<string name="Flat Toe">
-		Flache Spitze
-	</string>
-	<string name="Foot Size">
-		Fußgröße
-	</string>
-	<string name="Forehead Angle">
-		Stirnwinkel
-	</string>
-	<string name="Forehead Heavy">
-		Stirn ausgeprägt
-	</string>
-	<string name="Freckles">
-		Sommersprossen
-	</string>
-	<string name="Front Bangs Down">
-		Langer Pony
-	</string>
-	<string name="Front Bangs Up">
-		Kurzer Pony
-	</string>
-	<string name="Front Fringe">
-		Fransen, vorne
-	</string>
-	<string name="Front Hair">
-		Vorderhaar
-	</string>
-	<string name="Front Hair Down">
-		langes Vorderhaar
-	</string>
-	<string name="Front Hair Up">
-		Kurzes Vorderhaar
-	</string>
-	<string name="Full Back">
-		Hinten volles Haar
-	</string>
-	<string name="Full Eyeliner">
-		Starker Eyeliner
-	</string>
-	<string name="Full Front">
-		Vorne volles Haar
-	</string>
-	<string name="Full Hair Sides">
-		Seitlich volles Haar
-	</string>
-	<string name="Full Sides">
-		Volle Seiten
-	</string>
-	<string name="Glossy">
-		Glänzend
-	</string>
-	<string name="Glove Fingers">
-		Handschuhfinger
-	</string>
-	<string name="Glove Length">
-		Handschuhlänge
-	</string>
-	<string name="Hair">
-		Haare
-	</string>
-	<string name="Hair Back">
-		Haare: Hinten
-	</string>
-	<string name="Hair Front">
-		Haare: Vorne
-	</string>
-	<string name="Hair Sides">
-		Haare: Seiten
-	</string>
-	<string name="Hair Sweep">
-		Haartolle
-	</string>
-	<string name="Hair Thickess">
-		Haardicke
-	</string>
-	<string name="Hair Thickness">
-		Haardicke
-	</string>
-	<string name="Hair Tilt">
-		Haarneigung
-	</string>
-	<string name="Hair Tilted Left">
-		Nach links
-	</string>
-	<string name="Hair Tilted Right">
-		Nach rechts
-	</string>
-	<string name="Hair Volume">
-		Haare: Volumen
-	</string>
-	<string name="Hand Size">
-		Handgröße
-	</string>
-	<string name="Handlebars">
-		Zwirbelbart
-	</string>
-	<string name="Head Length">
-		Kopflänge
-	</string>
-	<string name="Head Shape">
-		Kopfform
-	</string>
-	<string name="Head Size">
-		Kopfgröße
-	</string>
-	<string name="Head Stretch">
-		Kopfstreckung
-	</string>
-	<string name="Heel Height">
-		Absatzhöhe
-	</string>
-	<string name="Heel Shape">
-		Absatzform
-	</string>
-	<string name="Height">
-		Höhe
-	</string>
-	<string name="High">
-		Hoch
-	</string>
-	<string name="High Heels">
-		Hohe Absätze
-	</string>
-	<string name="High Jaw">
-		Hoch
-	</string>
-	<string name="High Platforms">
-		Hohe Plattformsohlen
-	</string>
-	<string name="High and Tight">
-		Hoch und eng
-	</string>
-	<string name="Higher">
-		Höhere
-	</string>
-	<string name="Hip Length">
-		Länge der Hüfte
-	</string>
-	<string name="Hip Width">
-		Breite der Hüfte
-	</string>
-	<string name="In">
-		In
-	</string>
-	<string name="In Shdw Color">
-		Farbe Innenseite
-	</string>
-	<string name="In Shdw Opacity">
-		Deckkraft: innerer Lidschatten
-	</string>
-	<string name="Inner Eye Corner">
-		Ecke: Nasenseite
-	</string>
-	<string name="Inner Eye Shadow">
-		Innerer Lidschatten
-	</string>
-	<string name="Inner Shadow">
-		Innerer Lidschatten
-	</string>
-	<string name="Jacket Length">
-		Jackenlänge
-	</string>
-	<string name="Jacket Wrinkles">
-		Jackenfalten
-	</string>
-	<string name="Jaw Angle">
-		Kinnansatz
-	</string>
-	<string name="Jaw Jut">
-		Kinnposition
-	</string>
-	<string name="Jaw Shape">
-		Kinnform
-	</string>
-	<string name="Join">
-		Zusammen
-	</string>
-	<string name="Jowls">
-		Hängebacken
-	</string>
-	<string name="Knee Angle">
-		Kniewinkel
-	</string>
-	<string name="Knock Kneed">
-		X-beinig
-	</string>
-	<string name="Large">
-		Groß
-	</string>
-	<string name="Large Hands">
-		Große Hände
-	</string>
-	<string name="Left Part">
-		Linksscheitel
-	</string>
-	<string name="Leg Length">
-		Beinlänge
-	</string>
-	<string name="Leg Muscles">
-		Beinmuskeln
-	</string>
-	<string name="Less">
-		Weniger
-	</string>
-	<string name="Less Body Fat">
-		Weniger Speck
-	</string>
-	<string name="Less Curtains">
-		Weniger
-	</string>
-	<string name="Less Freckles">
-		Weniger
-	</string>
-	<string name="Less Full">
-		Weniger
-	</string>
-	<string name="Less Gravity">
-		Weniger
-	</string>
-	<string name="Less Love">
-		Weniger
-	</string>
-	<string name="Less Muscles">
-		Weniger
-	</string>
-	<string name="Less Muscular">
-		Weniger
-	</string>
-	<string name="Less Rosy">
-		Weniger
-	</string>
-	<string name="Less Round">
-		Weniger
-	</string>
-	<string name="Less Saddle">
-		Weniger
-	</string>
-	<string name="Less Square">
-		Weniger
-	</string>
-	<string name="Less Volume">
-		Weniger
-	</string>
-	<string name="Less soul">
-		Weniger
-	</string>
-	<string name="Lighter">
-		Heller
-	</string>
-	<string name="Lip Cleft">
-		Amorbogen
-	</string>
-	<string name="Lip Cleft Depth">
-		Tiefe: Amorbogen
-	</string>
-	<string name="Lip Fullness">
-		Fülle
-	</string>
-	<string name="Lip Pinkness">
-		Pinkton
-	</string>
-	<string name="Lip Ratio">
-		Lippenproportionen
-	</string>
-	<string name="Lip Thickness">
-		Lippendicke
-	</string>
-	<string name="Lip Width">
-		Mundbreite
-	</string>
-	<string name="Lipgloss">
-		Lipgloss
-	</string>
-	<string name="Lipstick">
-		Lippenstift
-	</string>
-	<string name="Lipstick Color">
-		Farbe
-	</string>
-	<string name="Long">
-		Lang
-	</string>
-	<string name="Long Head">
-		Langer Kopf
-	</string>
-	<string name="Long Hips">
-		Lange Hüften
-	</string>
-	<string name="Long Legs">
-		Lange Beine
-	</string>
-	<string name="Long Neck">
-		Langer Hals
-	</string>
-	<string name="Long Pigtails">
-		Lange Zöpfe
-	</string>
-	<string name="Long Ponytail">
-		Langer Pferdeschwanz
-	</string>
-	<string name="Long Torso">
-		Langer Oberkörper
-	</string>
-	<string name="Long arms">
-		Lange Arme
-	</string>
-	<string name="Longcuffs">
-		Manschetten
-	</string>
-	<string name="Loose Pants">
-		Weite Hosen
-	</string>
-	<string name="Loose Shirt">
-		Weites Hemd
-	</string>
-	<string name="Loose Sleeves">
-		Weite Ärmel
-	</string>
-	<string name="Love Handles">
-		Fettpölsterchen
-	</string>
-	<string name="Low">
-		Niedrig
-	</string>
-	<string name="Low Heels">
-		Niedrig
-	</string>
-	<string name="Low Jaw">
-		Niedrig
-	</string>
-	<string name="Low Platforms">
-		Niedrig
-	</string>
-	<string name="Low and Loose">
-		Weit
-	</string>
-	<string name="Lower">
-		Absenken
-	</string>
-	<string name="Lower Bridge">
-		Brücke, Unterer Teil
-	</string>
-	<string name="Lower Cheeks">
-		Wangen, unterer Bereich
-	</string>
-	<string name="Male">
-		Männlich
-	</string>
-	<string name="Middle Part">
-		Mittelscheitel
-	</string>
-	<string name="More">
-		Mehr
-	</string>
-	<string name="More Blush">
-		Mehr
-	</string>
-	<string name="More Body Fat">
-		Mehr Speck
-	</string>
-	<string name="More Curtains">
-		Mehr
-	</string>
-	<string name="More Eyeshadow">
-		Mehr
-	</string>
-	<string name="More Freckles">
-		Mehr
-	</string>
-	<string name="More Full">
-		Voller
-	</string>
-	<string name="More Gravity">
-		Mehr
-	</string>
-	<string name="More Lipstick">
-		Mehr
-	</string>
-	<string name="More Love">
-		Mehr
-	</string>
-	<string name="More Lower Lip">
-		Größer
-	</string>
-	<string name="More Muscles">
-		Mehr
-	</string>
-	<string name="More Muscular">
-		Mehr
-	</string>
-	<string name="More Rosy">
-		Mehr
-	</string>
-	<string name="More Round">
-		Runder
-	</string>
-	<string name="More Saddle">
-		Mehr
-	</string>
-	<string name="More Sloped">
-		Mehr
-	</string>
-	<string name="More Square">
-		Mehr
-	</string>
-	<string name="More Upper Lip">
-		Mehr
-	</string>
-	<string name="More Vertical">
-		Mehr
-	</string>
-	<string name="More Volume">
-		Mehr
-	</string>
-	<string name="More soul">
-		Mehr
-	</string>
-	<string name="Moustache">
-		Schnauzer
-	</string>
-	<string name="Mouth Corner">
-		Mundwinkel
-	</string>
-	<string name="Mouth Position">
-		Mundposition
-	</string>
-	<string name="Mowhawk">
-		Irokese
-	</string>
-	<string name="Muscular">
-		Muskulös
-	</string>
-	<string name="Mutton Chops">
-		Koteletten
-	</string>
-	<string name="Nail Polish">
-		Nagellack
-	</string>
-	<string name="Nail Polish Color">
-		Farbe
-	</string>
-	<string name="Narrow">
-		Schmal
-	</string>
-	<string name="Narrow Back">
-		Wenig
-	</string>
-	<string name="Narrow Front">
-		Wenig
-	</string>
-	<string name="Narrow Lips">
-		Schmale Lippen
-	</string>
-	<string name="Natural">
-		Natürlich
-	</string>
-	<string name="Neck Length">
-		Halslänge
-	</string>
-	<string name="Neck Thickness">
-		Halsdicke
-	</string>
-	<string name="No Blush">
-		Kein Rouge
-	</string>
-	<string name="No Eyeliner">
-		Kein Eyeliner
-	</string>
-	<string name="No Eyeshadow">
-		Kein Lidschatten
-	</string>
-	<string name="No Heels">
-		Keine Absätze
-	</string>
-	<string name="No Lipgloss">
-		Kein Lipgloss
-	</string>
-	<string name="No Lipstick">
-		Kein Lippenstift
-	</string>
-	<string name="No Part">
-		Kein Scheitel
-	</string>
-	<string name="No Polish">
-		Kein Nagellack
-	</string>
-	<string name="No Red">
-		Nicht rot
-	</string>
-	<string name="No Spikes">
-		Keine Stachel
-	</string>
-	<string name="No White">
-		Kein Weiß
-	</string>
-	<string name="No Wrinkles">
-		Keine Falten
-	</string>
-	<string name="Normal Lower">
-		Normal unten
-	</string>
-	<string name="Normal Upper">
-		Normal oben
-	</string>
-	<string name="Nose Left">
-		Links
-	</string>
-	<string name="Nose Right">
-		Rechts
-	</string>
-	<string name="Nose Size">
-		Größe
-	</string>
-	<string name="Nose Thickness">
-		Dicke
-	</string>
-	<string name="Nose Tip Angle">
-		Nasenspitze
-	</string>
-	<string name="Nose Tip Shape">
-		Nasenspitze
-	</string>
-	<string name="Nose Width">
-		Nasenbreite
-	</string>
-	<string name="Nostril Division">
-		Teilung
-	</string>
-	<string name="Nostril Width">
-		Größe
-	</string>
-	<string name="Old">
-		Alt
-	</string>
-	<string name="Opaque">
-		Deckend
-	</string>
-	<string name="Open">
-		Öffnen
-	</string>
-	<string name="Open Back">
-		Hinten offen
-	</string>
-	<string name="Open Front">
-		Vorne offen
-	</string>
-	<string name="Open Left">
-		Links offen
-	</string>
-	<string name="Open Right">
-		Rechts offen
-	</string>
-	<string name="Orange">
-		Orange
-	</string>
-	<string name="Out">
-		Aus
-	</string>
-	<string name="Out Shdw Color">
-		Farbe: Oberer Lidschatten
-	</string>
-	<string name="Out Shdw Opacity">
-		Deckkraft: Oberer Lidschatten
-	</string>
-	<string name="Outer Eye Corner">
-		Äußerer Augenwinkel
-	</string>
-	<string name="Outer Eye Shadow">
-		Lidschatten: Oben
-	</string>
-	<string name="Outer Shadow">
-		Lidschatten: Oben
-	</string>
-	<string name="Overbite">
-		Überbiss
-	</string>
-	<string name="Package">
-		Ausbeulung
-	</string>
-	<string name="Painted Nails">
-		Lackierte Nägel
-	</string>
-	<string name="Pale">
-		Blass
-	</string>
-	<string name="Pants Crotch">
-		Schritt
-	</string>
-	<string name="Pants Fit">
-		Passform
-	</string>
-	<string name="Pants Length">
-		Hosenlänge
-	</string>
-	<string name="Pants Waist">
-		Hüfte
-	</string>
-	<string name="Pants Wrinkles">
-		Falten
-	</string>
-	<string name="Part">
-		Scheitel
-	</string>
-	<string name="Part Bangs">
-		Pony scheiteln
-	</string>
-	<string name="Pectorals">
-		Brustmuskel
-	</string>
-	<string name="Pigment">
-		Pigmentierung
-	</string>
-	<string name="Pigtails">
-		Zöpfe
-	</string>
-	<string name="Pink">
-		Pink
-	</string>
-	<string name="Pinker">
-		Mehr Pink
-	</string>
-	<string name="Platform Height">
-		Höhe
-	</string>
-	<string name="Platform Width">
-		Breite
-	</string>
-	<string name="Pointy">
-		Spitz
-	</string>
-	<string name="Pointy Heels">
-		Pfennigabsätze
-	</string>
-	<string name="Pointy Toe">
-		Spitz
-	</string>
-	<string name="Ponytail">
-		Pferdeschwanz
-	</string>
-	<string name="Poofy Skirt">
-		Weit ausgestellt
-	</string>
-	<string name="Pop Left Eye">
-		Linkes Auge größer
-	</string>
-	<string name="Pop Right Eye">
-		Rechtes Auge größer
-	</string>
-	<string name="Puffy">
-		Geschwollen
-	</string>
-	<string name="Puffy Eyelids">
-		Geschwollene Lider
-	</string>
-	<string name="Rainbow Color">
-		Regenbogenfarben
-	</string>
-	<string name="Red Hair">
-		Rote Haare
-	</string>
-	<string name="Red Skin">
-		Rote Haut
-	</string>
-	<string name="Regular">
-		Normal
-	</string>
-	<string name="Regular Muscles">
-		Normal muskulös
-	</string>
-	<string name="Right Part">
-		Scheitel rechts
-	</string>
-	<string name="Rosy Complexion">
-		Rosiger Teint
-	</string>
-	<string name="Round">
-		Rund
-	</string>
-	<string name="Round Forehead">
-		Runde Stirn
-	</string>
-	<string name="Ruddiness">
-		Röte
-	</string>
-	<string name="Ruddy">
-		Rötlich
-	</string>
-	<string name="Rumpled Hair">
-		Zerzauste Haare
-	</string>
-	<string name="Saddle Bags">
-		Hüftspeck
-	</string>
-	<string name="Saddlebags">
-		Hüftspeck
-	</string>
-	<string name="Scrawny">
-		Dürr
-	</string>
-	<string name="Scrawny Leg">
-		Dürres Bein
-	</string>
-	<string name="Separate">
-		Auseinander
-	</string>
-	<string name="Shading">
-		Schattierung
-	</string>
-	<string name="Shadow hair">
-		Schattenhaar
-	</string>
-	<string name="Shallow">
-		Flach
-	</string>
-	<string name="Shear Back">
-		Hinterkopf rasiert
-	</string>
-	<string name="Shear Face">
-		Gesicht verzerren
-	</string>
-	<string name="Shear Front">
-		Vorne rasiert
-	</string>
-	<string name="Shear Left">
-		Links
-	</string>
-	<string name="Shear Left Up">
-		Links
-	</string>
-	<string name="Shear Right">
-		Rechts
-	</string>
-	<string name="Shear Right Up">
-		Rechts
-	</string>
-	<string name="Sheared Back">
-		Hinterkopf rasiert
-	</string>
-	<string name="Sheared Front">
-		Vorne rasiert
-	</string>
-	<string name="Shift Left">
-		Nach links
-	</string>
-	<string name="Shift Mouth">
-		Mund verschieben
-	</string>
-	<string name="Shift Right">
-		Nach rechts
-	</string>
-	<string name="Shirt Bottom">
-		Hemdlänge
-	</string>
-	<string name="Shirt Fit">
-		Passform
-	</string>
-	<string name="Shirt Wrinkles">
-		Falten
-	</string>
-	<string name="Shoe Height">
-		Höhe
-	</string>
-	<string name="Short">
-		Kurz
-	</string>
-	<string name="Short Arms">
-		Kurze Arme
-	</string>
-	<string name="Short Legs">
-		Kurze Beine
-	</string>
-	<string name="Short Neck">
-		Kurzer Hals
-	</string>
-	<string name="Short Pigtails">
-		Kurze Zöpfe
-	</string>
-	<string name="Short Ponytail">
-		Kurzer Pferdeschwanz
-	</string>
-	<string name="Short Sideburns">
-		Kurze Koteletten
-	</string>
-	<string name="Short Torso">
-		Kurzer Oberkörper
-	</string>
-	<string name="Short hips">
-		Kurze Hüften
-	</string>
-	<string name="Shoulders">
-		Schultern
-	</string>
-	<string name="Side Bangs">
-		Seitlicher Pony
-	</string>
-	<string name="Side Bangs Down">
-		Lang
-	</string>
-	<string name="Side Bangs Up">
-		Kurz
-	</string>
-	<string name="Side Fringe">
-		Seitliche Fransen
-	</string>
-	<string name="Sideburns">
-		Koteletten
-	</string>
-	<string name="Sides Hair">
-		Seitliches Haar
-	</string>
-	<string name="Sides Hair Down">
-		Lang
-	</string>
-	<string name="Sides Hair Up">
-		Kurz
-	</string>
-	<string name="Skinny">
-		Dünn
-	</string>
-	<string name="Skinny Neck">
-		Dünner Hals
-	</string>
-	<string name="Skirt Fit">
-		Passform
-	</string>
-	<string name="Skirt Length">
-		Rocklänge
-	</string>
-	<string name="Slanted Forehead">
-		Fliehende Stirn
-	</string>
-	<string name="Sleeve Length">
-		Ärmellänge
-	</string>
-	<string name="Sleeve Looseness">
-		Passform Ärmel
-	</string>
-	<string name="Slit Back">
-		Schlitz: Hinten
-	</string>
-	<string name="Slit Front">
-		Schlitz: Vorne
-	</string>
-	<string name="Slit Left">
-		Schlitz: Links
-	</string>
-	<string name="Slit Right">
-		Schlitz: Rechts
-	</string>
-	<string name="Small">
-		Klein
-	</string>
-	<string name="Small Hands">
-		Kleine Hände
-	</string>
-	<string name="Small Head">
-		Kleiner Kopf
-	</string>
-	<string name="Smooth">
-		Glätten
-	</string>
-	<string name="Smooth Hair">
-		Glattes Haar
-	</string>
-	<string name="Socks Length">
-		Strumpflänge
-	</string>
-	<string name="Some">
-		Etwas
-	</string>
-	<string name="Soulpatch">
-		Unterlippenbart
-	</string>
-	<string name="Sparse">
-		Wenig
-	</string>
-	<string name="Spiked Hair">
-		Stachelhaare
-	</string>
-	<string name="Square">
-		Rechteck
-	</string>
-	<string name="Square Toe">
-		Eckig
-	</string>
-	<string name="Squash Head">
-		Gestaucht
-	</string>
-	<string name="Squash/Stretch Head">
-		Gestretcht/Gestaucht
-	</string>
-	<string name="Stretch Head">
-		Gestreckt
-	</string>
-	<string name="Sunken">
-		Eingefallen
-	</string>
-	<string name="Sunken Chest">
-		Trichterbrust
-	</string>
-	<string name="Sunken Eyes">
-		Eingesunkene Augen
-	</string>
-	<string name="Sweep Back">
-		Nach hinten
-	</string>
-	<string name="Sweep Forward">
-		Nach vorne
-	</string>
-	<string name="Swept Back">
-		Nach hinten
-	</string>
-	<string name="Swept Back Hair">
-		Haar nach hinten
-	</string>
-	<string name="Swept Forward">
-		Haare nach vorne
-	</string>
-	<string name="Swept Forward Hair">
-		Haare nach vorne
-	</string>
-	<string name="Tall">
-		Groß
-	</string>
-	<string name="Taper Back">
-		Ansatzbreite hinten
-	</string>
-	<string name="Taper Front">
-		Ansatzbreite vorne
-	</string>
-	<string name="Thick Heels">
-		Dicke Absätze
-	</string>
-	<string name="Thick Neck">
-		Dicker Hals
-	</string>
-	<string name="Thick Toe">
-		Dick
-	</string>
-	<string name="Thickness">
-		Dicke
-	</string>
-	<string name="Thin">
-		Dünn
-	</string>
-	<string name="Thin Eyebrows">
-		Dünne Augenbrauen
-	</string>
-	<string name="Thin Lips">
-		Dünne Lippen
-	</string>
-	<string name="Thin Nose">
-		Dünne Nase
-	</string>
-	<string name="Tight Chin">
-		Straffes Kinn
-	</string>
-	<string name="Tight Cuffs">
-		Eng
-	</string>
-	<string name="Tight Pants">
-		Enge Hosen
-	</string>
-	<string name="Tight Shirt">
-		Enges Hemd
-	</string>
-	<string name="Tight Skirt">
-		Enger Rock
-	</string>
-	<string name="Tight Sleeves">
-		Enge Ärmel
-	</string>
-	<string name="Tilt Left">
-		Nach links
-	</string>
-	<string name="Tilt Right">
-		Nach rechts
-	</string>
-	<string name="Toe Shape">
-		Spitze
-	</string>
-	<string name="Toe Thickness">
-		Dicke
-	</string>
-	<string name="Torso Length">
-		Länge des Oberkörpers
-	</string>
-	<string name="Torso Muscles">
-		Muskeln
-	</string>
-	<string name="Torso Scrawny">
-		Dürr
-	</string>
-	<string name="Unattached">
-		Frei
-	</string>
-	<string name="Uncreased">
-		Straffes Lid
-	</string>
-	<string name="Underbite">
-		Unterbiss
-	</string>
-	<string name="Unnatural">
-		Unnatürlich
-	</string>
-	<string name="Upper Bridge">
-		Brücke, oberer Teil
-	</string>
-	<string name="Upper Cheeks">
-		Obere Wangen
-	</string>
-	<string name="Upper Chin Cleft">
-		Obere Kinnspalte
-	</string>
-	<string name="Upper Eyelid Fold">
-		Obere Lidfalte
-	</string>
-	<string name="Upturned">
-		Stupsnase
-	</string>
-	<string name="Very Red">
-		Sehr rot
-	</string>
-	<string name="Waist Height">
-		Bund
-	</string>
-	<string name="Well-Fed">
-		Gut genährt
-	</string>
-	<string name="White Hair">
-		Weiße Haare
-	</string>
-	<string name="Wide">
-		Breit
-	</string>
-	<string name="Wide Back">
-		Breit
-	</string>
-	<string name="Wide Front">
-		Breit
-	</string>
-	<string name="Wide Lips">
-		Breit
-	</string>
-	<string name="Wild">
-		Wild
-	</string>
-	<string name="Wrinkles">
-		Falten
-	</string>
-	<string name="LocationCtrlAddLandmarkTooltip">
-		Zu meinen Landmarken hinzufügen
-	</string>
-	<string name="LocationCtrlEditLandmarkTooltip">
-		Meine Landmarken bearbeiten
-	</string>
-	<string name="UpdaterWindowTitle">
-		[APP_NAME] Aktualisierung
-	</string>
-	<string name="UpdaterNowUpdating">
-		[APP_NAME] wird aktualisiert...
-	</string>
-	<string name="UpdaterNowInstalling">
-		[APP_NAME] wird installiert...
-	</string>
-	<string name="UpdaterUpdatingDescriptive">
-		Ihr [APP_NAME]-Viewer wird aktualisiert.  Dies kann einen Moment dauern. Wir bitten um Ihr Verständnis.
-	</string>
-	<string name="UpdaterProgressBarTextWithEllipses">
-		Aktualisierung wird heruntergeladen...
-	</string>
-	<string name="UpdaterProgressBarText">
-		Aktualisierung wird heruntergeladen
-	</string>
-	<string name="UpdaterFailDownloadTitle">
-		Herunterladen ist fehlgeschlagen
-	</string>
-	<string name="UpdaterFailUpdateDescriptive">
-		Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte laden Sie die aktuellste Version von www.secondlife.com herunter.
-	</string>
-	<string name="UpdaterFailInstallTitle">
-		Aktualisierung konnte nicht installiert werden
-	</string>
-	<string name="UpdaterFailStartTitle">
-		Viewer konnte nicht gestartet werden
-	</string>
-	<string name="only_user_message">
-		Sie sind der einzige Benutzer in dieser Sitzung.
-	</string>
-	<string name="offline_message">
-		[FIRST] [LAST] ist offline.
-	</string>
-	<string name="invite_message">
-		Klicken Sie auf [BUTTON NAME], um eine Verbindung zu diesem Voice-Chat herzustellen.
-	</string>
-	<string name="generic_request_error">
-		Fehler bei Anfrage, bitte versuchen Sie es später.
-	</string>
-	<string name="insufficient_perms_error">
-		Sie sind dazu nicht berechtigt.
-	</string>
-	<string name="session_does_not_exist_error">
-		Die Sitzung ist abgelaufen
-	</string>
-	<string name="no_ability_error">
-		Sie besitzen diese Fähigkeit nicht.
-	</string>
-	<string name="no_ability">
-		Sie besitzen diese Fähigkeit nicht.
-	</string>
-	<string name="not_a_mod_error">
-		Sie sind kein Sitzungsmoderator.
-	</string>
-	<string name="muted_error">
-		Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert.
-	</string>
-	<string name="add_session_event">
-		Es konnten keine Benutzer zur Chat-Sitzung mit [RECIPIENT] hinzugefügt werden.
-	</string>
-	<string name="message_session_event">
-		Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden.
-	</string>
-	<string name="removed_from_group">
-		Sie wurden von der Gruppe ausgeschlossen.
-	</string>
-	<string name="close_on_no_ability">
-		Sie haben nicht mehr die Berechtigung an der Chat-Sitzung teilzunehmen.
-	</string>
-</strings>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- This file contains strings that used to be hardcoded in the source.
+     It is only for those strings which do not belong in a floater.
+     For example, the strings used in avatar chat bubbles, and strings 
+     that are returned from one component and may appear in many places-->
+<strings>
+	<string name="SECOND_LIFE">
+		Second Life
+	</string>
+	<string name="APP_NAME">
+		Second Life
+	</string>
+	<string name="SECOND_LIFE_GRID">
+		Second Life-Grid:
+	</string>
+	<string name="SUPPORT_SITE">
+		Second Life Support-Portal
+	</string>
+	<string name="StartupDetectingHardware">
+		Hardware wird erfasst...
+	</string>
+	<string name="StartupLoading">
+		Wird geladen
+	</string>
+	<string name="Fullbright">
+		Fullbright (Legacy)
+	</string>
+	<string name="LoginInProgress">
+		Anmeldevorgang gestartet. [APP_NAME] reagiert möglicherweise nicht.  Bitte warten.
+	</string>
+	<string name="LoginInProgressNoFrozen">
+		Anmeldung erfolgt...
+	</string>
+	<string name="LoginAuthenticating">
+		Authentifizierung
+	</string>
+	<string name="LoginMaintenance">
+		Account wird aktualisiert...
+	</string>
+	<string name="LoginAttempt">
+		Ein früherer Anmeldeversuch ist fehlgeschlagen. Anmeldung, Versuch [NUMBER]
+	</string>
+	<string name="LoginPrecaching">
+		Welt wird geladen...
+	</string>
+	<string name="LoginInitializingBrowser">
+		Integrierter Webbrowser wird initialisiert...
+	</string>
+	<string name="LoginInitializingMultimedia">
+		Multimedia wird initialisiert...
+	</string>
+	<string name="LoginVerifyingCache">
+		Cache-Dateien werden überprüft (dauert 60-90 Sekunden)...
+	</string>
+	<string name="LoginProcessingResponse">
+		Antwort wird verarbeitet...
+	</string>
+	<string name="LoginInitializingWorld">
+		Welt wird initialisiert...
+	</string>
+	<string name="LoginDecodingImages">
+		Bilder werden entpackt...
+	</string>
+	<string name="LoginInitializingQuicktime">
+		QuickTime wird initialisiert...
+	</string>
+	<string name="LoginQuicktimeNotFound">
+		QuickTime nicht gefunden - Initialisierung nicht möglich.
+	</string>
+	<string name="LoginQuicktimeOK">
+		QuickTime wurde initialisiert.
+	</string>
+	<string name="LoginWaitingForRegionHandshake">
+		Region-Handshake...
+	</string>
+	<string name="LoginConnectingToRegion">
+		Region-Verbindung...
+	</string>
+	<string name="LoginDownloadingClothing">
+		Kleidung wird geladen...
+	</string>
+	<string name="AgentLostConnection">
+		In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung.
+	</string>
+	<string name="TooltipPerson">
+		Person
+	</string>
+	<string name="TooltipNoName">
+		(namenlos)
+	</string>
+	<string name="TooltipOwner">
+		Eigentümer:
+	</string>
+	<string name="TooltipPublic">
+		Öffentlich
+	</string>
+	<string name="TooltipIsGroup">
+		(Gruppe)
+	</string>
+	<string name="TooltipForSaleL$">
+		Zum Verkauf: [AMOUNT] L$
+	</string>
+	<string name="TooltipFlagGroupBuild">
+		Gruppenbau
+	</string>
+	<string name="TooltipFlagNoBuild">
+		Bauen aus
+	</string>
+	<string name="TooltipFlagNoEdit">
+		Gruppenbau
+	</string>
+	<string name="TooltipFlagNotSafe">
+		Unsicher
+	</string>
+	<string name="TooltipFlagNoFly">
+		Fliegen aus
+	</string>
+	<string name="TooltipFlagGroupScripts">
+		Gruppenskripte
+	</string>
+	<string name="TooltipFlagNoScripts">
+		Skripte aus
+	</string>
+	<string name="TooltipLand">
+		Land:
+	</string>
+	<string name="TooltipMustSingleDrop">
+		Sie können nur ein einzelnes Objekt hierher ziehen
+	</string>
+	<string name="TooltipHttpUrl">
+		Anklicken, um Webseite anzuzeigen
+	</string>
+	<string name="TooltipSLURL">
+		Anklicken, um Informationen zu diesem Standort anzuzeigen
+	</string>
+	<string name="TooltipAgentUrl">
+		Anklicken, um das Profil dieses Einwohners anzuzeigen
+	</string>
+	<string name="TooltipGroupUrl">
+		Anklicken, um Beschreibung der Gruppe anzuzeigen
+	</string>
+	<string name="TooltipEventUrl">
+		Anklicken, um Beschreibung der Veranstaltung anzuzeigen
+	</string>
+	<string name="TooltipClassifiedUrl">
+		Anklicken, um diese Anzeige anzuzeigen
+	</string>
+	<string name="TooltipParcelUrl">
+		Anklicken, um Beschreibung der Parzelle anzuzeigen
+	</string>
+	<string name="TooltipTeleportUrl">
+		Anklicken, um zu diesem Standort zu teleportieren
+	</string>
+	<string name="TooltipObjectIMUrl">
+		Anklicken, um Beschreibung des Objekts anzuzeigen
+	</string>
+	<string name="TooltipSLAPP">
+		Anklicken, um Befehl secondlife:// auszuführen
+	</string>
+	<string name="BUTTON_CLOSE_DARWIN">
+		Schließen (⌘-W)
+	</string>
+	<string name="BUTTON_CLOSE_WIN">
+		Schließen (Strg+W)
+	</string>
+	<string name="BUTTON_RESTORE">
+		Wiederherstellen
+	</string>
+	<string name="BUTTON_MINIMIZE">
+		Minimieren
+	</string>
+	<string name="BUTTON_TEAR_OFF">
+		Abnehmen
+	</string>
+	<string name="BUTTON_DOCK">
+		Andocken
+	</string>
+	<string name="BUTTON_UNDOCK">
+		Abkoppeln
+	</string>
+	<string name="BUTTON_HELP">
+		Hilfe anzeigen
+	</string>
+	<string name="RetrievingData">
+		Laden...
+	</string>
+	<string name="ReleaseNotes">
+		Versionshinweise
+	</string>
+	<string name="LoadingData">
+		Wird geladen...
+	</string>
+	<string name="AvatarNameNobody">
+		(niemand)
+	</string>
+	<string name="AvatarNameWaiting">
+		(wartet)
+	</string>
+	<string name="AvatarNameHippos">
+		(hippos)
+	</string>
+	<string name="GroupNameNone">
+		(keiner)
+	</string>
+	<string name="AssetErrorNone">
+		Kein Fehler
+	</string>
+	<string name="AssetErrorRequestFailed">
+		Asset-Anforderung: fehlgeschlagen
+	</string>
+	<string name="AssetErrorNonexistentFile">
+		Asset-Anforderung: Datei existiert nicht
+	</string>
+	<string name="AssetErrorNotInDatabase">
+		Asset-Anforderung: Asset in Datenbank nicht gefunden
+	</string>
+	<string name="AssetErrorEOF">
+		Ende der Datei
+	</string>
+	<string name="AssetErrorCannotOpenFile">
+		Datei kann nicht geöffnet werden
+	</string>
+	<string name="AssetErrorFileNotFound">
+		Datei nicht gefunden
+	</string>
+	<string name="AssetErrorTCPTimeout">
+		Zeitüberschreitung bei Dateiübertragung
+	</string>
+	<string name="AssetErrorCircuitGone">
+		Verbindung verloren
+	</string>
+	<string name="AssetErrorPriceMismatch">
+		Viewer und Server sind sich nicht über Preis einig
+	</string>
+	<string name="AssetErrorUnknownStatus">
+		Status unbekannt
+	</string>
+	<string name="texture">
+		Textur
+	</string>
+	<string name="sound">
+		Sound
+	</string>
+	<string name="calling card">
+		Visitenkarte
+	</string>
+	<string name="landmark">
+		Landmarke
+	</string>
+	<string name="legacy script">
+		Skript (veraltet)
+	</string>
+	<string name="clothing">
+		Kleidung
+	</string>
+	<string name="object">
+		Objekt
+	</string>
+	<string name="note card">
+		Notizkarte
+	</string>
+	<string name="folder">
+		Ordner
+	</string>
+	<string name="root">
+		Hauptverzeichnis
+	</string>
+	<string name="lsl2 script">
+		LSL2 Skript
+	</string>
+	<string name="lsl bytecode">
+		LSL Bytecode
+	</string>
+	<string name="tga texture">
+		tga-Textur
+	</string>
+	<string name="body part">
+		Körperteil
+	</string>
+	<string name="snapshot">
+		Foto
+	</string>
+	<string name="lost and found">
+		Fundbüro
+	</string>
+	<string name="targa image">
+		targa-Bild
+	</string>
+	<string name="trash">
+		Papierkorb
+	</string>
+	<string name="jpeg image">
+		jpeg-Bild
+	</string>
+	<string name="animation">
+		Animation
+	</string>
+	<string name="gesture">
+		Geste
+	</string>
+	<string name="simstate">
+		simstate
+	</string>
+	<string name="favorite">
+		Favoriten
+	</string>
+	<string name="symbolic link">
+		Link
+	</string>
+	<string name="AvatarAway">
+		Abwesend
+	</string>
+	<string name="AvatarBusy">
+		Beschäftigt
+	</string>
+	<string name="AvatarMuted">
+		Stummgeschaltet
+	</string>
+	<string name="anim_express_afraid">
+		Ängstlich
+	</string>
+	<string name="anim_express_anger">
+		Verärgert
+	</string>
+	<string name="anim_away">
+		Abwesend
+	</string>
+	<string name="anim_backflip">
+		Rückwärtssalto
+	</string>
+	<string name="anim_express_laugh">
+		Lachkrampf
+	</string>
+	<string name="anim_express_toothsmile">
+		Grinsen
+	</string>
+	<string name="anim_blowkiss">
+		Kusshand
+	</string>
+	<string name="anim_express_bored">
+		Gelangweilt
+	</string>
+	<string name="anim_bow">
+		Verbeugen
+	</string>
+	<string name="anim_clap">
+		Klatschen
+	</string>
+	<string name="anim_courtbow">
+		Diener
+	</string>
+	<string name="anim_express_cry">
+		Weinen
+	</string>
+	<string name="anim_dance1">
+		Tanz 1
+	</string>
+	<string name="anim_dance2">
+		Tanz 2
+	</string>
+	<string name="anim_dance3">
+		Tanz 3
+	</string>
+	<string name="anim_dance4">
+		Tanz 4
+	</string>
+	<string name="anim_dance5">
+		Tanz 5
+	</string>
+	<string name="anim_dance6">
+		Tanz 6
+	</string>
+	<string name="anim_dance7">
+		Tanz 7
+	</string>
+	<string name="anim_dance8">
+		Tanz 8
+	</string>
+	<string name="anim_express_disdain">
+		Verachten
+	</string>
+	<string name="anim_drink">
+		Trinken
+	</string>
+	<string name="anim_express_embarrased">
+		Verlegen
+	</string>
+	<string name="anim_angry_fingerwag">
+		Drohen
+	</string>
+	<string name="anim_fist_pump">
+		Faust pumpen
+	</string>
+	<string name="anim_yoga_float">
+		Yogaflieger
+	</string>
+	<string name="anim_express_frown">
+		Stirnrunzeln
+	</string>
+	<string name="anim_impatient">
+		Ungeduldig
+	</string>
+	<string name="anim_jumpforjoy">
+		Freudensprung
+	</string>
+	<string name="anim_kissmybutt">
+		LMA
+	</string>
+	<string name="anim_express_kiss">
+		Küssen
+	</string>
+	<string name="anim_laugh_short">
+		Lachen
+	</string>
+	<string name="anim_musclebeach">
+		Posen
+	</string>
+	<string name="anim_no_unhappy">
+		Nein (Bedauernd)
+	</string>
+	<string name="anim_no_head">
+		Nein
+	</string>
+	<string name="anim_nyanya">
+		Ällabätsch
+	</string>
+	<string name="anim_punch_onetwo">
+		Eins-Zwei-Punch
+	</string>
+	<string name="anim_express_open_mouth">
+		Mund offen
+	</string>
+	<string name="anim_peace">
+		Friede
+	</string>
+	<string name="anim_point_you">
+		Auf anderen zeigen
+	</string>
+	<string name="anim_point_me">
+		Auf mich zeigen
+	</string>
+	<string name="anim_punch_l">
+		Linker Haken
+	</string>
+	<string name="anim_punch_r">
+		Rechter Haken
+	</string>
+	<string name="anim_rps_countdown">
+		SSP zählen
+	</string>
+	<string name="anim_rps_paper">
+		SSP Papier
+	</string>
+	<string name="anim_rps_rock">
+		SSP Stein
+	</string>
+	<string name="anim_rps_scissors">
+		SSP Schere
+	</string>
+	<string name="anim_express_repulsed">
+		Angewidert
+	</string>
+	<string name="anim_kick_roundhouse_r">
+		Rundkick
+	</string>
+	<string name="anim_express_sad">
+		Traurig
+	</string>
+	<string name="anim_salute">
+		Salutieren
+	</string>
+	<string name="anim_shout">
+		Rufen
+	</string>
+	<string name="anim_express_shrug">
+		Schulterzucken
+	</string>
+	<string name="anim_express_smile">
+		Lächeln
+	</string>
+	<string name="anim_smoke_idle">
+		Zigarette halten
+	</string>
+	<string name="anim_smoke_inhale">
+		Rauchen
+	</string>
+	<string name="anim_smoke_throw_down">
+		Zigarette wegwerfen
+	</string>
+	<string name="anim_express_surprise">
+		Überraschung
+	</string>
+	<string name="anim_sword_strike_r">
+		Schwerthieb
+	</string>
+	<string name="anim_angry_tantrum">
+		Wutanfall
+	</string>
+	<string name="anim_express_tongue_out">
+		Zunge rausstrecken
+	</string>
+	<string name="anim_hello">
+		Winken
+	</string>
+	<string name="anim_whisper">
+		Flüstern
+	</string>
+	<string name="anim_whistle">
+		Pfeifen
+	</string>
+	<string name="anim_express_wink">
+		Zwinkern
+	</string>
+	<string name="anim_wink_hollywood">
+		Zwinkern (Hollywood)
+	</string>
+	<string name="anim_express_worry">
+		Sorgenvoll
+	</string>
+	<string name="anim_yes_happy">
+		Ja (Erfreut)
+	</string>
+	<string name="anim_yes_head">
+		Ja
+	</string>
+	<string name="texture_loading">
+		Wird geladen...
+	</string>
+	<string name="worldmap_offline">
+		Offline
+	</string>
+	<string name="Ok">
+		OK
+	</string>
+	<string name="Premature end of file">
+		Unvollständige Datei
+	</string>
+	<string name="ST_NO_JOINT">
+		HAUPTVERZEICHNIS oder VERBINDUNG nicht gefunden.
+	</string>
+	<string name="whisper">
+		flüstert:
+	</string>
+	<string name="shout">
+		ruft:
+	</string>
+	<string name="ringing">
+		Verbindung mit In-Welt-Voice-Chat...
+	</string>
+	<string name="connected">
+		Verbunden
+	</string>
+	<string name="unavailable">
+		Der aktuelle Standort unterstützt keine Voice-Kommunikation
+	</string>
+	<string name="hang_up">
+		Verbindung mit In-Welt-Voice-Chat getrennt
+	</string>
+	<string name="ScriptQuestionCautionChatGranted">
+		Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung erteilt: [PERMISSIONS].
+	</string>
+	<string name="ScriptQuestionCautionChatDenied">
+		Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung verweigert: [PERMISSIONS].
+	</string>
+	<string name="ScriptTakeMoney">
+		Linden-Dollar (L$) von Ihnen nehmen
+	</string>
+	<string name="ActOnControlInputs">
+		Steuerung festlegen
+	</string>
+	<string name="RemapControlInputs">
+		Steuerung neu zuweisen
+	</string>
+	<string name="AnimateYourAvatar">
+		Avatar animieren
+	</string>
+	<string name="AttachToYourAvatar">
+		An Avatar anhängen
+	</string>
+	<string name="ReleaseOwnership">
+		Eigentum aufgeben und öffentlich machen
+	</string>
+	<string name="LinkAndDelink">
+		Mit Objekten verknüpfen und davon trennen
+	</string>
+	<string name="AddAndRemoveJoints">
+		Verbindungen zu anderen Objekten hinzufügen und entfernen
+	</string>
+	<string name="ChangePermissions">
+		Berechtigungen ändern
+	</string>
+	<string name="TrackYourCamera">
+		Kameraverfolgung
+	</string>
+	<string name="ControlYourCamera">
+		Kamerasteuerung
+	</string>
+	<string name="SIM_ACCESS_PG">
+		PG
+	</string>
+	<string name="SIM_ACCESS_MATURE">
+		Mature
+	</string>
+	<string name="SIM_ACCESS_ADULT">
+		Adult
+	</string>
+	<string name="SIM_ACCESS_DOWN">
+		Offline
+	</string>
+	<string name="SIM_ACCESS_MIN">
+		Unbekannt
+	</string>
+	<string name="land_type_unknown">
+		(unbekannt)
+	</string>
+	<string name="all_files">
+		Alle Dateien
+	</string>
+	<string name="sound_files">
+		Sounds
+	</string>
+	<string name="animation_files">
+		Animationen
+	</string>
+	<string name="image_files">
+		Bilder
+	</string>
+	<string name="save_file_verb">
+		Speichern
+	</string>
+	<string name="load_file_verb">
+		Laden
+	</string>
+	<string name="targa_image_files">
+		Targa-Bilder
+	</string>
+	<string name="bitmap_image_files">
+		Bitmap-Bilder
+	</string>
+	<string name="avi_movie_file">
+		AVI-Filmdatei
+	</string>
+	<string name="xaf_animation_file">
+		XAF Anim-Datei
+	</string>
+	<string name="xml_file">
+		XML-Datei
+	</string>
+	<string name="dot_raw_file">
+		RAW-Datei
+	</string>
+	<string name="compressed_image_files">
+		Komprimierte Bilder
+	</string>
+	<string name="load_files">
+		Dateien laden
+	</string>
+	<string name="choose_the_directory">
+		Verzeichnis auswählen
+	</string>
+	<string name="AvatarSetNotAway">
+		Als anwesend anzeigen
+	</string>
+	<string name="AvatarSetAway">
+		Als abwesend anzeigen
+	</string>
+	<string name="AvatarSetNotBusy">
+		Als nicht beschäftigt anzeigen
+	</string>
+	<string name="AvatarSetBusy">
+		Als beschäftigt anzeigen
+	</string>
+	<string name="shape">
+		Form
+	</string>
+	<string name="skin">
+		Haut
+	</string>
+	<string name="hair">
+		Haare
+	</string>
+	<string name="eyes">
+		Augen
+	</string>
+	<string name="shirt">
+		Hemd
+	</string>
+	<string name="pants">
+		Hose
+	</string>
+	<string name="shoes">
+		Schuhe
+	</string>
+	<string name="socks">
+		Socken
+	</string>
+	<string name="jacket">
+		Jacke
+	</string>
+	<string name="gloves">
+		Handschuhe
+	</string>
+	<string name="undershirt">
+		Unterhemd
+	</string>
+	<string name="underpants">
+		Unterhose
+	</string>
+	<string name="skirt">
+		Rock
+	</string>
+	<string name="invalid">
+		ungültig
+	</string>
+	<string name="BodyPartsRightArm">
+		Rechter Arm
+	</string>
+	<string name="BodyPartsHead">
+		Kopf
+	</string>
+	<string name="BodyPartsLeftArm">
+		Linker Arm
+	</string>
+	<string name="BodyPartsLeftLeg">
+		Linkes Bein
+	</string>
+	<string name="BodyPartsTorso">
+		Oberkörper
+	</string>
+	<string name="BodyPartsRightLeg">
+		Rechtes Bein
+	</string>
+	<string name="GraphicsQualityLow">
+		Niedrig
+	</string>
+	<string name="GraphicsQualityMid">
+		Mittel
+	</string>
+	<string name="GraphicsQualityHigh">
+		Hoch
+	</string>
+	<string name="LeaveMouselook">
+		ESC drücken, um zur Normalansicht zurückzukehren
+	</string>
+	<string name="InventoryNoMatchingItems">
+		Im Inventar wurden keine passenden Artikel gefunden.
+	</string>
+	<string name="InventoryNoTexture">
+		Sie haben keine Kopie dieser Textur in Ihrem Inventar.
+	</string>
+	<string name="LoadingContents">
+		Inhalte werden geladen...
+	</string>
+	<string name="NoContents">
+		Keine Inhalte
+	</string>
+	<string name="InvFolder My Inventory">
+		Mein Inventar
+	</string>
+	<string name="InvFolder My Favorites">
+		Meine Favoriten
+	</string>
+	<string name="InvFolder Library">
+		Bibliothek
+	</string>
+	<string name="InvFolder Textures">
+		Texturen
+	</string>
+	<string name="InvFolder Sounds">
+		Sounds
+	</string>
+	<string name="InvFolder Calling Cards">
+		Visitenkarten
+	</string>
+	<string name="InvFolder Landmarks">
+		Landmarken
+	</string>
+	<string name="InvFolder Scripts">
+		Skripts
+	</string>
+	<string name="InvFolder Clothing">
+		Kleidung
+	</string>
+	<string name="InvFolder Objects">
+		Objekte
+	</string>
+	<string name="InvFolder Notecards">
+		Notizkarten
+	</string>
+	<string name="InvFolder New Folder">
+		Neuer Ordner
+	</string>
+	<string name="InvFolder Inventory">
+		Inventar
+	</string>
+	<string name="InvFolder Uncompressed Images">
+		Nicht-Komprimierte Bilder
+	</string>
+	<string name="InvFolder Body Parts">
+		Körperteile
+	</string>
+	<string name="InvFolder Trash">
+		Papierkorb
+	</string>
+	<string name="InvFolder Photo Album">
+		Fotoalbum
+	</string>
+	<string name="InvFolder Lost And Found">
+		Fundbüro
+	</string>
+	<string name="InvFolder Uncompressed Sounds">
+		Nicht-Komprimierte Sounds
+	</string>
+	<string name="InvFolder Animations">
+		Animationen
+	</string>
+	<string name="InvFolder Gestures">
+		Gesten
+	</string>
+	<string name="InvFolder favorite">
+		Favoriten
+	</string>
+	<string name="InvFolder Current Outfit">
+		Aktuelles Outfit
+	</string>
+	<string name="InvFolder My Outfits">
+		Meine Outfits
+	</string>
+	<string name="InvFolder Friends">
+		Freunde
+	</string>
+	<string name="InvFolder All">
+		Alle
+	</string>
+	<string name="Buy">
+		Kaufen
+	</string>
+	<string name="BuyforL$">
+		Kaufen für L$
+	</string>
+	<string name="Stone">
+		Stein
+	</string>
+	<string name="Metal">
+		Metall
+	</string>
+	<string name="Glass">
+		Glas
+	</string>
+	<string name="Wood">
+		Holz
+	</string>
+	<string name="Flesh">
+		Fleisch
+	</string>
+	<string name="Plastic">
+		Plastik
+	</string>
+	<string name="Rubber">
+		Gummi
+	</string>
+	<string name="Light">
+		Licht
+	</string>
+	<string name="KBShift">
+		Umschalt-Taste
+	</string>
+	<string name="KBCtrl">
+		Strg
+	</string>
+	<string name="Chest">
+		Brust
+	</string>
+	<string name="Skull">
+		Schädel
+	</string>
+	<string name="Left Shoulder">
+		Linke Schulter
+	</string>
+	<string name="Right Shoulder">
+		Rechte Schulter
+	</string>
+	<string name="Left Hand">
+		Linke Hand
+	</string>
+	<string name="Right Hand">
+		Rechte Hand
+	</string>
+	<string name="Left Foot">
+		Linker Fuß
+	</string>
+	<string name="Right Foot">
+		Rechter Fuß
+	</string>
+	<string name="Spine">
+		Wirbelsäule
+	</string>
+	<string name="Pelvis">
+		Becken
+	</string>
+	<string name="Mouth">
+		Mund
+	</string>
+	<string name="Chin">
+		Kinn
+	</string>
+	<string name="Left Ear">
+		Linkes Ohr
+	</string>
+	<string name="Right Ear">
+		Rechtes Ohr
+	</string>
+	<string name="Left Eyeball">
+		Linker Augapfel
+	</string>
+	<string name="Right Eyeball">
+		Rechter Augapfel
+	</string>
+	<string name="Nose">
+		Nase
+	</string>
+	<string name="R Upper Arm">
+		R Oberarm
+	</string>
+	<string name="R Forearm">
+		R Unterarm
+	</string>
+	<string name="L Upper Arm">
+		L Oberarm
+	</string>
+	<string name="L Forearm">
+		L Unterarm
+	</string>
+	<string name="Right Hip">
+		Rechte Hüfte
+	</string>
+	<string name="R Upper Leg">
+		R Oberschenkel
+	</string>
+	<string name="R Lower Leg">
+		R Unterschenkel
+	</string>
+	<string name="Left Hip">
+		Linke Hüfte
+	</string>
+	<string name="L Upper Leg">
+		L Oberschenkel
+	</string>
+	<string name="L Lower Leg">
+		L Unterschenkel
+	</string>
+	<string name="Stomach">
+		Bauch
+	</string>
+	<string name="Left Pec">
+		Linke Brust
+	</string>
+	<string name="Right Pec">
+		Rechts
+	</string>
+	<string name="YearsMonthsOld">
+		[AGEYEARS] [AGEMONTHS] alt
+	</string>
+	<string name="YearsOld">
+		[AGEYEARS] alt
+	</string>
+	<string name="MonthsOld">
+		[AGEMONTHS] alt
+	</string>
+	<string name="WeeksOld">
+		[AGEWEEKS] alt
+	</string>
+	<string name="DaysOld">
+		[AGEDAYS] alt
+	</string>
+	<string name="TodayOld">
+		Seit heute Mitglied
+	</string>
+	<string name="AgeYearsA">
+		[COUNT] Jahr
+	</string>
+	<string name="AgeYearsB">
+		[COUNT] Jahre
+	</string>
+	<string name="AgeYearsC">
+		[COUNT] Jahre
+	</string>
+	<string name="AgeMonthsA">
+		[COUNT] Monat
+	</string>
+	<string name="AgeMonthsB">
+		[COUNT] Monate
+	</string>
+	<string name="AgeMonthsC">
+		[COUNT] Monate
+	</string>
+	<string name="AgeWeeksA">
+		[COUNT] Woche
+	</string>
+	<string name="AgeWeeksB">
+		[COUNT] Wochen
+	</string>
+	<string name="AgeWeeksC">
+		[COUNT] Wochen
+	</string>
+	<string name="AgeDaysA">
+		[COUNT] Tag
+	</string>
+	<string name="AgeDaysB">
+		[COUNT] Tage
+	</string>
+	<string name="AgeDaysC">
+		[COUNT] Tage
+	</string>
+	<string name="AcctTypeResident">
+		Einwohner
+	</string>
+	<string name="AcctTypeTrial">
+		Test
+	</string>
+	<string name="AcctTypeCharterMember">
+		Charta-Mitglied
+	</string>
+	<string name="AcctTypeEmployee">
+		Linden Lab-Mitarbeiter
+	</string>
+	<string name="PaymentInfoUsed">
+		Zahlungsinfo verwendet
+	</string>
+	<string name="PaymentInfoOnFile">
+		Zahlungsinfo archiviert
+	</string>
+	<string name="NoPaymentInfoOnFile">
+		Keine Zahlungsinfo archiviert
+	</string>
+	<string name="AgeVerified">
+		Altersgeprüft
+	</string>
+	<string name="NotAgeVerified">
+		Nicht altersgeprüft
+	</string>
+	<string name="Center 2">
+		Mitte 2
+	</string>
+	<string name="Top Right">
+		Oben rechts
+	</string>
+	<string name="Top">
+		Oben
+	</string>
+	<string name="Top Left">
+		Oben links
+	</string>
+	<string name="Center">
+		Zentrieren
+	</string>
+	<string name="Bottom Left">
+		Unten links
+	</string>
+	<string name="Bottom">
+		Unten
+	</string>
+	<string name="Bottom Right">
+		Unten rechts
+	</string>
+	<string name="CompileQueueDownloadedCompiling">
+		Heruntergeladen, wird kompiliert
+	</string>
+	<string name="CompileQueueScriptNotFound">
+		Skript wurde auf Server nicht gefunden.
+	</string>
+	<string name="CompileQueueProblemDownloading">
+		Beim Herunterladen ist ein Problem aufgetreten
+	</string>
+	<string name="CompileQueueInsufficientPermDownload">
+		Unzureichende Rechte zum Herunterladen eines Skripts.
+	</string>
+	<string name="CompileQueueInsufficientPermFor">
+		Unzureichende Berechtigungen für
+	</string>
+	<string name="CompileQueueUnknownFailure">
+		Unbekannter Fehler beim Herunterladen
+	</string>
+	<string name="CompileQueueTitle">
+		Rekompilierung
+	</string>
+	<string name="CompileQueueStart">
+		rekompilieren
+	</string>
+	<string name="ResetQueueTitle">
+		Zurücksetzen
+	</string>
+	<string name="ResetQueueStart">
+		Zurücksetzen
+	</string>
+	<string name="RunQueueTitle">
+		Skript ausführen
+	</string>
+	<string name="RunQueueStart">
+		Skript ausführen
+	</string>
+	<string name="NotRunQueueTitle">
+		Skript anhalten
+	</string>
+	<string name="NotRunQueueStart">
+		Skript anhalten
+	</string>
+	<string name="CompileSuccessful">
+		Kompilieren erfolgreich abgeschlossen!
+	</string>
+	<string name="CompileSuccessfulSaving">
+		Kompilieren erfolgreich abgeschlossen, speichern...
+	</string>
+	<string name="SaveComplete">
+		Speichervorgang abgeschlossen.
+	</string>
+	<string name="ObjectOutOfRange">
+		Skript (Objekt außerhalb des Bereichs)
+	</string>
+	<string name="GodToolsObjectOwnedBy">
+		Objekt [OBJECT], Besitzer [OWNER]
+	</string>
+	<string name="GroupsNone">
+		keine
+	</string>
+	<string name="Unknown">
+		(unbekannt)
+	</string>
+	<string name="Balance">
+		Kontostand
+	</string>
+	<string name="Credits">
+		Danksagung
+	</string>
+	<string name="Debits">
+		Soll
+	</string>
+	<string name="Total">
+		Gesamtbetrag
+	</string>
+	<string name="NoGroupDataFound">
+		Für Gruppe wurden keine Gruppendaten gefunden
+	</string>
+	<string name="IMParentEstate">
+		parent estate
+	</string>
+	<string name="IMMainland">
+		Mainland
+	</string>
+	<string name="IMTeen">
+		Teen
+	</string>
+	<string name="RegionInfoError">
+		Fehler
+	</string>
+	<string name="RegionInfoAllEstatesOwnedBy">
+		alle Grundstücke gehören [OWNER]
+	</string>
+	<string name="RegionInfoAllEstatesYouOwn">
+		alle Grundstücke, die Ihnen gehört haben
+	</string>
+	<string name="RegionInfoAllEstatesYouManage">
+		alle Grundstücke, die Sie für [OWNER] verwaltet haben
+	</string>
+	<string name="RegionInfoAllowedResidents">
+		Zulässige Einwohner: ([ALLOWEDAGENTS], max [MAXACCESS])
+	</string>
+	<string name="RegionInfoAllowedGroups">
+		Zulässige Gruppen: ([ALLOWEDGROUPS], max [MAXACCESS])
+	</string>
+	<string name="CursorPos">
+		Zeile [LINE], Spalte [COLUMN]
+	</string>
+	<string name="PanelDirCountFound">
+		[COUNT] gefunden
+	</string>
+	<string name="PanelContentsNewScript">
+		Neues Skript
+	</string>
+	<string name="MuteByName">
+		(nach Namen)
+	</string>
+	<string name="MuteAgent">
+		(Einwohner)
+	</string>
+	<string name="MuteObject">
+		(Objekt)
+	</string>
+	<string name="MuteGroup">
+		(Gruppe)
+	</string>
+	<string name="RegionNoCovenant">
+		Für dieses Grundstück liegt kein Vertrag vor.
+	</string>
+	<string name="RegionNoCovenantOtherOwner">
+		Für dieses Grundstück liegt kein Vertrag vor. Das Land auf diesem Grundstück wird vom Grundstückseigentümer und nicht von Linden Lab verkauft.  Für Informationen zum Verkauf setzen Sie sich bitte mit dem Grundstückseigentümer in Verbindung.
+	</string>
+	<string name="covenant_last_modified">
+		Zuletzt geändert:
+	</string>
+	<string name="GroupOwned">
+		In Gruppenbesitz
+	</string>
+	<string name="Public">
+		Öffentlich
+	</string>
+	<string name="ClassifiedClicksTxt">
+		Klicks: [TELEPORT] teleportieren, [MAP] Karte, [PROFILE] Profil
+	</string>
+	<string name="ClassifiedUpdateAfterPublish">
+		(wird nach Veröffentlichung aktualisiert)
+	</string>
+	<string name="GroupVoteYes">
+		Ja
+	</string>
+	<string name="GroupVoteNo">
+		Nein
+	</string>
+	<string name="GroupVoteNoActiveProposals">
+		Zurzeit sind keine Umfragen aktiv
+	</string>
+	<string name="GroupVoteNoArchivedProposals">
+		Zurzeit sind keine Umfragen aktiv
+	</string>
+	<string name="GroupVoteRetrievingArchivedProposals">
+		Archivierte Umfragen werden geladen
+	</string>
+	<string name="GroupVoteRetrievingActiveProposals">
+		Aktive Umfragen werden geladen
+	</string>
+	<string name="MultiPreviewTitle">
+		Vorschau
+	</string>
+	<string name="MultiPropertiesTitle">
+		Eigenschaften
+	</string>
+	<string name="InvOfferAnObjectNamed">
+		Ein Objekt namens
+	</string>
+	<string name="InvOfferOwnedByGroup">
+		im Besitz der Gruppe
+	</string>
+	<string name="InvOfferOwnedByUnknownGroup">
+		im Besitz einer unbekannten Gruppe
+	</string>
+	<string name="InvOfferOwnedBy">
+		im Besitz von
+	</string>
+	<string name="InvOfferOwnedByUnknownUser">
+		im Besitz eines unbekannten Einwohners
+	</string>
+	<string name="InvOfferGaveYou">
+		hat Ihnen folgendes übergeben
+	</string>
+	<string name="InvOfferYouDecline">
+		Sie lehnen folgendes ab:
+	</string>
+	<string name="InvOfferFrom">
+		von
+	</string>
+	<string name="GroupMoneyTotal">
+		Gesamtbetrag
+	</string>
+	<string name="GroupMoneyBought">
+		gekauft
+	</string>
+	<string name="GroupMoneyPaidYou">
+		bezahlte Ihnen
+	</string>
+	<string name="GroupMoneyPaidInto">
+		bezahlte an
+	</string>
+	<string name="GroupMoneyBoughtPassTo">
+		kaufte Pass für
+	</string>
+	<string name="GroupMoneyPaidFeeForEvent">
+		bezahlte Gebühr für Event
+	</string>
+	<string name="GroupMoneyPaidPrizeForEvent">
+		bezahlte Preis für Event
+	</string>
+	<string name="GroupMoneyBalance">
+		Kontostand
+	</string>
+	<string name="GroupMoneyCredits">
+		Danksagung
+	</string>
+	<string name="GroupMoneyDebits">
+		Soll
+	</string>
+	<string name="ViewerObjectContents">
+		Inhalte
+	</string>
+	<string name="AcquiredItems">
+		Erworbene Artikel
+	</string>
+	<string name="Cancel">
+		Abbrechen
+	</string>
+	<string name="UploadingCosts">
+		Hochladen von %s kostet
+	</string>
+	<string name="UnknownFileExtension">
+		Unbekanntes Dateiformat .%s
+Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh
+	</string>
+	<string name="AddLandmarkNavBarMenu">
+		Landmarke hinzufügen...
+	</string>
+	<string name="EditLandmarkNavBarMenu">
+		Landmarke bearbeiten...
+	</string>
+	<string name="accel-mac-control">
+		⌃
+	</string>
+	<string name="accel-mac-command">
+		⌘
+	</string>
+	<string name="accel-mac-option">
+		⌥
+	</string>
+	<string name="accel-mac-shift">
+		⇧
+	</string>
+	<string name="accel-win-control">
+		Strg+
+	</string>
+	<string name="accel-win-alt">
+		Alt+
+	</string>
+	<string name="accel-win-shift">
+		Umschalt+
+	</string>
+	<string name="FileSaved">
+		Datei wurde gespeichert
+	</string>
+	<string name="Receiving">
+		Daten werden empfangen
+	</string>
+	<string name="AM">
+		Uhr
+	</string>
+	<string name="PM">
+		Uhr
+	</string>
+	<string name="PST">
+		PST
+	</string>
+	<string name="PDT">
+		PDT
+	</string>
+	<string name="Forward">
+		Vorwärts
+	</string>
+	<string name="Left">
+		Links
+	</string>
+	<string name="Right">
+		Rechts
+	</string>
+	<string name="Back">
+		Zurück
+	</string>
+	<string name="North">
+		Norden
+	</string>
+	<string name="South">
+		Süden
+	</string>
+	<string name="West">
+		Westen
+	</string>
+	<string name="East">
+		Osten
+	</string>
+	<string name="Up">
+		Nach oben
+	</string>
+	<string name="Down">
+		Nach unten
+	</string>
+	<string name="Any Category">
+		Alle Kategorien
+	</string>
+	<string name="Shopping">
+		Shopping
+	</string>
+	<string name="Land Rental">
+		Land mieten
+	</string>
+	<string name="Property Rental">
+		Immobilie mieten
+	</string>
+	<string name="Special Attraction">
+		Attraktionen
+	</string>
+	<string name="New Products">
+		Neue Produkte
+	</string>
+	<string name="Employment">
+		Stellenangebote
+	</string>
+	<string name="Wanted">
+		Gesucht
+	</string>
+	<string name="Service">
+		Dienstleistungen
+	</string>
+	<string name="Personal">
+		Verschiedenes
+	</string>
+	<string name="None">
+		Keiner
+	</string>
+	<string name="Linden Location">
+		Lindenort
+	</string>
+	<string name="Adult">
+		Adult
+	</string>
+	<string name="Arts&amp;Culture">
+		Kunst &amp; Kultur
+	</string>
+	<string name="Business">
+		Business
+	</string>
+	<string name="Educational">
+		Bildung
+	</string>
+	<string name="Gaming">
+		Spielen
+	</string>
+	<string name="Hangout">
+		Treffpunkt
+	</string>
+	<string name="Newcomer Friendly">
+		Anfängergerecht
+	</string>
+	<string name="Parks&amp;Nature">
+		Parks und Natur
+	</string>
+	<string name="Residential">
+		Wohngebiet
+	</string>
+	<string name="Stage">
+		Phase
+	</string>
+	<string name="Other">
+		Sonstige
+	</string>
+	<string name="Any">
+		Alle
+	</string>
+	<string name="You">
+		Sie
+	</string>
+	<string name=":">
+		:
+	</string>
+	<string name=",">
+		,
+	</string>
+	<string name="...">
+		...
+	</string>
+	<string name="***">
+		***
+	</string>
+	<string name="(">
+		(
+	</string>
+	<string name=")">
+		)
+	</string>
+	<string name=".">
+		.
+	</string>
+	<string name="&apos;">
+		&apos;
+	</string>
+	<string name="---">
+		---
+	</string>
+	<string name="MBCmdLineError">
+		Beim Parsen der Befehlszeile wurde ein Fehler festgestellt.
+Weitere Informationen: http://wiki.secondlife.com/wiki/Client_parameters (EN)
+Fehler:
+	</string>
+	<string name="MBCmdLineUsg">
+		[APP_NAME] Verwendung in Befehlszeile:
+	</string>
+	<string name="MBUnableToAccessFile">
+		[APP_NAME] kann auf die erforderliche Datei nicht zugreifen.
+
+Grund hierfür ist, dass Sie entweder mehrere Instanzen gleichzeitig ausführen oder dass Ihr System denkt, eine Datei sei geöffnet.
+Falls diese Nachricht erneut angezeigt wird, starten Sie bitte Ihren Computer neu und probieren Sie es noch einmal.
+Falls der Fehler dann weiterhin auftritt, müssen Sie [APP_NAME] von Ihrem System de-installieren und erneut installieren.
+	</string>
+	<string name="MBFatalError">
+		Unbehebbarer Fehler
+	</string>
+	<string name="MBRequiresAltiVec">
+		[APP_NAME] erfordert einen Prozessor mit AltiVec (G4 oder später).
+	</string>
+	<string name="MBAlreadyRunning">
+		[APP_NAME] läuft bereits.
+Bitte sehen Sie in Ihrer Menüleiste nach, dort sollte ein Symbol für das Programm angezeigt werden.
+Falls diese Nachricht erneut angezeigt wird, starten Sie Ihren Computer bitte neu.
+	</string>
+	<string name="MBFrozenCrashed">
+		[APP_NAME] scheint eingefroren zu sein oder ist abgestürzt.
+Möchten Sie einen Absturz-Bericht einschicken?
+	</string>
+	<string name="MBAlert">
+		Alarm
+	</string>
+	<string name="MBNoDirectX">
+		[APP_NAME] kann DirectX 9.0b oder höher nicht feststellen.
+[APP_NAME] verwendet DirectX, um nach Hardware und/oder veralteten Treibern zu suchen, die zu Problemen mit der Stabilität, Leistung und Abstürzen führen können.  Sie können [APP_NAME] auch so ausführen, wir empfehlen jedoch, dass DirectX 9.0b vorhanden ist und ausgeführt wird.
+
+Möchten Sie fortfahren?
+	</string>
+	<string name="MBWarning">
+		Hinweis
+	</string>
+	<string name="MBNoAutoUpdate">
+		Für Linux ist zur Zeit noch kein automatisches Aktualisieren möglich.
+Bitte laden Sie die aktuellste Version von www.secondlife.com herunter.
+	</string>
+	<string name="MBRegClassFailed">
+		RegisterClass fehlgeschlagen
+	</string>
+	<string name="MBError">
+		Fehler
+	</string>
+	<string name="MBFullScreenErr">
+		Vollbildschirm mit [WIDTH] x [HEIGHT] kann nicht ausgeführt werden.
+Ausführung erfolgt in Fenster.
+	</string>
+	<string name="MBDestroyWinFailed">
+		Fehler beim Herunterfahren während Fenster geschlossen wurde (DestroyWindow() fehlgeschlagen)
+	</string>
+	<string name="MBShutdownErr">
+		Fehler beim Herunterfahren
+	</string>
+	<string name="MBDevContextErr">
+		Kann keinen Kontext für GL-Gerät erstellen
+	</string>
+	<string name="MBPixelFmtErr">
+		Passendes Pixelformat wurde nicht gefunden
+	</string>
+	<string name="MBPixelFmtDescErr">
+		Beschreibung für Pixelformat nicht verfügbar
+	</string>
+	<string name="MBTrueColorWindow">
+		Um [APP_NAME] in einem Fenster auszuführen, ist True Color (32-bit) erforderlich.
+Klicken Sie auf Systemsteuerung &gt; Anzeige &gt; Einstellungen und stellen Sie den Bildschirm auf 32-bit Farbe ein.
+Wenn Sie die Anwendung im Modus Vollbildschirm ausführen möchten, dann wird [APP_NAME] den Bildschirm automatisch während der Ausführung anpassen.
+	</string>
+	<string name="MBAlpha">
+		[APP_NAME] kann nicht ausgeführt werden, da kein 8-Bit-Alpha-Kanal verfügbar ist.  Dies geschieht normalerweise bei Problemen mit dem Treiber der Video-Karte.
+Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für Ihre Videokarte installiert haben.
+Vergewissern Sie sich außerdem, dass Ihr Bildschirm auf True Color (32-Bit) eingestellt ist (Systemsteuerung &gt; Anzeige &gt; Einstellungen).
+Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
+	</string>
+	<string name="MBPixelFmtSetErr">
+		Pixel-Format kann nicht eingestellt werden.
+	</string>
+	<string name="MBGLContextErr">
+		Kann keinen Kontext für GL-Gerät erstellen
+	</string>
+	<string name="MBGLContextActErr">
+		Kann keinen Kontext für GL-Gerät aktivieren
+	</string>
+	<string name="MBVideoDrvErr">
+		[APP_NAME] kann nicht ausgeführt werden, da die Treiber Ihrer Videokarte entweder nicht richtig installiert oder veraltet sind, oder die entsprechende Hardware nicht unterstützt wird. Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für die Videokarte installiert haben. Falls Sie die aktuellsten Treiber bereits installiert haben, installieren Sie diese bitte erneut.
+
+Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
+	</string>
+	<string name="5 O&apos;Clock Shadow">
+		Bartschatten
+	</string>
+	<string name="All White">
+		Ganz weiß
+	</string>
+	<string name="Anime Eyes">
+		Anime-Augen
+	</string>
+	<string name="Arced">
+		Gewölbt
+	</string>
+	<string name="Arm Length">
+		Armlänge
+	</string>
+	<string name="Attached">
+		Angewachsen
+	</string>
+	<string name="Attached Earlobes">
+		Angewachsene Ohrläppchen
+	</string>
+	<string name="Back Bangs">
+		Nackenhaar
+	</string>
+	<string name="Back Bangs Down">
+		Lang
+	</string>
+	<string name="Back Bangs Up">
+		Kurz
+	</string>
+	<string name="Back Fringe">
+		Nackenfransen
+	</string>
+	<string name="Back Hair">
+		Hinterkopfhaar
+	</string>
+	<string name="Back Hair Down">
+		lang
+	</string>
+	<string name="Back Hair Up">
+		kurz
+	</string>
+	<string name="Baggy">
+		Tränensäcke
+	</string>
+	<string name="Bangs">
+		Pony
+	</string>
+	<string name="Bangs Down">
+		Pony lang
+	</string>
+	<string name="Bangs Up">
+		Pony kurz
+	</string>
+	<string name="Beady Eyes">
+		Knopfaugen
+	</string>
+	<string name="Belly Size">
+		Bauchgröße
+	</string>
+	<string name="Big">
+		Groß
+	</string>
+	<string name="Big Butt">
+		Großer Hintern
+	</string>
+	<string name="Big Eyeball">
+		Großer Augapfel
+	</string>
+	<string name="Big Hair Back">
+		Volumen: Hinten
+	</string>
+	<string name="Big Hair Front">
+		Volumen: Vorne
+	</string>
+	<string name="Big Hair Top">
+		Volumen: Oben
+	</string>
+	<string name="Big Head">
+		Großer Kopf
+	</string>
+	<string name="Big Pectorals">
+		Große Brustmuskeln
+	</string>
+	<string name="Big Spikes">
+		Große Stacheln
+	</string>
+	<string name="Black">
+		Schwarz
+	</string>
+	<string name="Blonde">
+		Blond
+	</string>
+	<string name="Blonde Hair">
+		Blondes Haar
+	</string>
+	<string name="Blush">
+		Rouge
+	</string>
+	<string name="Blush Color">
+		Rougefarbe
+	</string>
+	<string name="Blush Opacity">
+		Rouge Deckkraft
+	</string>
+	<string name="Body Definition">
+		Körperkonturen
+	</string>
+	<string name="Body Fat">
+		Körperfett
+	</string>
+	<string name="Body Freckles">
+		Sommersprossen
+	</string>
+	<string name="Body Thick">
+		Körper - breit
+	</string>
+	<string name="Body Thickness">
+		Körperbreite
+	</string>
+	<string name="Body Thin">
+		Körper - schmal
+	</string>
+	<string name="Bow Legged">
+		o-beinig
+	</string>
+	<string name="Breast Buoyancy">
+		Brust, Straffheit
+	</string>
+	<string name="Breast Cleavage">
+		Dekolleté
+	</string>
+	<string name="Breast Size">
+		Brustgröße
+	</string>
+	<string name="Bridge Width">
+		Rückenbreite
+	</string>
+	<string name="Broad">
+		Breit
+	</string>
+	<string name="Brow Size">
+		Brauengröße
+	</string>
+	<string name="Bug Eyes">
+		Glubschaugen
+	</string>
+	<string name="Bugged Eyes">
+		Hervortretend
+	</string>
+	<string name="Bulbous">
+		Knollennase
+	</string>
+	<string name="Bulbous Nose">
+		Knollennase
+	</string>
+	<string name="Bushy Eyebrows">
+		Buschige Augenbrauen
+	</string>
+	<string name="Bushy Hair">
+		Buschiges Haar
+	</string>
+	<string name="Butt Size">
+		Hintern, Größe
+	</string>
+	<string name="bustle skirt">
+		Tournürenrock
+	</string>
+	<string name="no bustle">
+		Ohne
+	</string>
+	<string name="more bustle">
+		Mit
+	</string>
+	<string name="Chaplin">
+		Chaplin
+	</string>
+	<string name="Cheek Bones">
+		Wangenknochen
+	</string>
+	<string name="Chest Size">
+		Brustgröße
+	</string>
+	<string name="Chin Angle">
+		Kinnwinkel
+	</string>
+	<string name="Chin Cleft">
+		Kinnspalte
+	</string>
+	<string name="Chin Curtains">
+		Schifferfräse
+	</string>
+	<string name="Chin Depth">
+		Kinnlänge
+	</string>
+	<string name="Chin Heavy">
+		Kinn ausgeprägt
+	</string>
+	<string name="Chin In">
+		Kinn zurück
+	</string>
+	<string name="Chin Out">
+		Kinn nach vorne
+	</string>
+	<string name="Chin-Neck">
+		Kinn-Hals
+	</string>
+	<string name="Clear">
+		Löschen
+	</string>
+	<string name="Cleft">
+		Spalte
+	</string>
+	<string name="Close Set Eyes">
+		Eng stehende Augen
+	</string>
+	<string name="Closed">
+		Geschlossen
+	</string>
+	<string name="Closed Back">
+		Hinten geschlossen
+	</string>
+	<string name="Closed Front">
+		Vorne geschlossen
+	</string>
+	<string name="Closed Left">
+		Links geschlossen
+	</string>
+	<string name="Closed Right">
+		Rechts geschlossen
+	</string>
+	<string name="Coin Purse">
+		Klein
+	</string>
+	<string name="Collar Back">
+		Kragen hinten
+	</string>
+	<string name="Collar Front">
+		Kragen vorne
+	</string>
+	<string name="Corner Down">
+		Nach unten
+	</string>
+	<string name="Corner Normal">
+		Normal
+	</string>
+	<string name="Corner Up">
+		Nach oben
+	</string>
+	<string name="Creased">
+		Schlupflid
+	</string>
+	<string name="Crooked Nose">
+		Krumme Nase
+	</string>
+	<string name="Cropped Hair">
+		Kurze Haare
+	</string>
+	<string name="Cuff Flare">
+		Hosenaufschlag
+	</string>
+	<string name="Dark">
+		Dunkel
+	</string>
+	<string name="Dark Green">
+		Dunkelgrün
+	</string>
+	<string name="Darker">
+		Dunkler
+	</string>
+	<string name="Deep">
+		Tief
+	</string>
+	<string name="Default Heels">
+		Standardabsätze
+	</string>
+	<string name="Default Toe">
+		Standardspitze
+	</string>
+	<string name="Dense">
+		Dicht
+	</string>
+	<string name="Dense hair">
+		Dichtes Haar
+	</string>
+	<string name="Double Chin">
+		Doppelkinn
+	</string>
+	<string name="Downturned">
+		Nach unten
+	</string>
+	<string name="Duffle Bag">
+		Groß
+	</string>
+	<string name="Ear Angle">
+		Ohrenwinkel
+	</string>
+	<string name="Ear Size">
+		Ohrengröße
+	</string>
+	<string name="Ear Tips">
+		Ohrenspitzen
+	</string>
+	<string name="Egg Head">
+		Eierkopf
+	</string>
+	<string name="Eye Bags">
+		Augenränder
+	</string>
+	<string name="Eye Color">
+		Augenfarbe
+	</string>
+	<string name="Eye Depth">
+		Augentiefe
+	</string>
+	<string name="Eye Lightness">
+		Helligkeit
+	</string>
+	<string name="Eye Opening">
+		Öffnung
+	</string>
+	<string name="Eye Pop">
+		Symmetrie
+	</string>
+	<string name="Eye Size">
+		Augengröße
+	</string>
+	<string name="Eye Spacing">
+		Augenstand
+	</string>
+	<string name="Eyeball Size">
+		Größe des Augapfels
+	</string>
+	<string name="Eyebrow Arc">
+		Brauenbogen
+	</string>
+	<string name="Eyebrow Density">
+		Brauendichte
+	</string>
+	<string name="Eyebrow Height">
+		Brauenhöhe
+	</string>
+	<string name="Eyebrow Points">
+		Brauenenden
+	</string>
+	<string name="Eyebrow Size">
+		Brauengröße
+	</string>
+	<string name="Eyelash Length">
+		Wimpernlänge
+	</string>
+	<string name="Eyeliner">
+		Eyeliner
+	</string>
+	<string name="Eyeliner Color">
+		Farbe des Eyeliners
+	</string>
+	<string name="Eyes Back">
+		Augen zurück
+	</string>
+	<string name="Eyes Bugged">
+		Glubschaugen
+	</string>
+	<string name="Eyes Forward">
+		Augen nach vorne
+	</string>
+	<string name="Eyes Long Head">
+		Augen langer Kopf
+	</string>
+	<string name="Eyes Shear Left Up">
+		Augen Verzerrung links hoch
+	</string>
+	<string name="Eyes Shear Right Up">
+		Augen Verzerrung rechts hoch
+	</string>
+	<string name="Eyes Short Head">
+		Augen kurzer Kopf
+	</string>
+	<string name="Eyes Spread">
+		Augen auseinander
+	</string>
+	<string name="Eyes Sunken">
+		eingesunkene Augen
+	</string>
+	<string name="Eyes Together">
+		Augen zusammen
+	</string>
+	<string name="Face Shear">
+		Gesichtsverzerrung
+	</string>
+	<string name="Facial Definition">
+		Gesichtskonturen
+	</string>
+	<string name="Far Set Eyes">
+		Weit auseinander
+	</string>
+	<string name="Fat">
+		Dick
+	</string>
+	<string name="Fat Head">
+		Dicker Kopf
+	</string>
+	<string name="Fat Lips">
+		Volle Lippen
+	</string>
+	<string name="Fat Lower">
+		Volle Unterlippe
+	</string>
+	<string name="Fat Lower Lip">
+		Volle Unterlippe
+	</string>
+	<string name="Fat Torso">
+		Dicker Körper
+	</string>
+	<string name="Fat Upper">
+		Volle Oberlippe
+	</string>
+	<string name="Fat Upper Lip">
+		Volle Oberlippe
+	</string>
+	<string name="Female">
+		weiblich
+	</string>
+	<string name="Fingerless">
+		Ohne Finger
+	</string>
+	<string name="Fingers">
+		Finger
+	</string>
+	<string name="Flared Cuffs">
+		Ausgestellt
+	</string>
+	<string name="Flat">
+		Flach
+	</string>
+	<string name="Flat Butt">
+		Flacher Hintern
+	</string>
+	<string name="Flat Head">
+		Flacher Kopf
+	</string>
+	<string name="Flat Toe">
+		Flache Spitze
+	</string>
+	<string name="Foot Size">
+		Fußgröße
+	</string>
+	<string name="Forehead Angle">
+		Stirnwinkel
+	</string>
+	<string name="Forehead Heavy">
+		Stirn ausgeprägt
+	</string>
+	<string name="Freckles">
+		Sommersprossen
+	</string>
+	<string name="Front Bangs Down">
+		Langer Pony
+	</string>
+	<string name="Front Bangs Up">
+		Kurzer Pony
+	</string>
+	<string name="Front Fringe">
+		Fransen, vorne
+	</string>
+	<string name="Front Hair">
+		Vorderhaar
+	</string>
+	<string name="Front Hair Down">
+		langes Vorderhaar
+	</string>
+	<string name="Front Hair Up">
+		Kurzes Vorderhaar
+	</string>
+	<string name="Full Back">
+		Hinten volles Haar
+	</string>
+	<string name="Full Eyeliner">
+		Starker Eyeliner
+	</string>
+	<string name="Full Front">
+		Vorne volles Haar
+	</string>
+	<string name="Full Hair Sides">
+		Seitlich volles Haar
+	</string>
+	<string name="Full Sides">
+		Volle Seiten
+	</string>
+	<string name="Glossy">
+		Glänzend
+	</string>
+	<string name="Glove Fingers">
+		Handschuhfinger
+	</string>
+	<string name="Glove Length">
+		Handschuhlänge
+	</string>
+	<string name="Hair">
+		Haare
+	</string>
+	<string name="Hair Back">
+		Haare: Hinten
+	</string>
+	<string name="Hair Front">
+		Haare: Vorne
+	</string>
+	<string name="Hair Sides">
+		Haare: Seiten
+	</string>
+	<string name="Hair Sweep">
+		Haartolle
+	</string>
+	<string name="Hair Thickess">
+		Haardicke
+	</string>
+	<string name="Hair Thickness">
+		Haardicke
+	</string>
+	<string name="Hair Tilt">
+		Haarneigung
+	</string>
+	<string name="Hair Tilted Left">
+		Nach links
+	</string>
+	<string name="Hair Tilted Right">
+		Nach rechts
+	</string>
+	<string name="Hair Volume">
+		Haare: Volumen
+	</string>
+	<string name="Hand Size">
+		Handgröße
+	</string>
+	<string name="Handlebars">
+		Zwirbelbart
+	</string>
+	<string name="Head Length">
+		Kopflänge
+	</string>
+	<string name="Head Shape">
+		Kopfform
+	</string>
+	<string name="Head Size">
+		Kopfgröße
+	</string>
+	<string name="Head Stretch">
+		Kopfstreckung
+	</string>
+	<string name="Heel Height">
+		Absatzhöhe
+	</string>
+	<string name="Heel Shape">
+		Absatzform
+	</string>
+	<string name="Height">
+		Höhe
+	</string>
+	<string name="High">
+		Hoch
+	</string>
+	<string name="High Heels">
+		Hohe Absätze
+	</string>
+	<string name="High Jaw">
+		Hoch
+	</string>
+	<string name="High Platforms">
+		Hohe Plattformsohlen
+	</string>
+	<string name="High and Tight">
+		Hoch und eng
+	</string>
+	<string name="Higher">
+		Höhere
+	</string>
+	<string name="Hip Length">
+		Länge der Hüfte
+	</string>
+	<string name="Hip Width">
+		Breite der Hüfte
+	</string>
+	<string name="In">
+		In
+	</string>
+	<string name="In Shdw Color">
+		Farbe Innenseite
+	</string>
+	<string name="In Shdw Opacity">
+		Deckkraft: innerer Lidschatten
+	</string>
+	<string name="Inner Eye Corner">
+		Ecke: Nasenseite
+	</string>
+	<string name="Inner Eye Shadow">
+		Innerer Lidschatten
+	</string>
+	<string name="Inner Shadow">
+		Innerer Lidschatten
+	</string>
+	<string name="Jacket Length">
+		Jackenlänge
+	</string>
+	<string name="Jacket Wrinkles">
+		Jackenfalten
+	</string>
+	<string name="Jaw Angle">
+		Kinnansatz
+	</string>
+	<string name="Jaw Jut">
+		Kinnposition
+	</string>
+	<string name="Jaw Shape">
+		Kinnform
+	</string>
+	<string name="Join">
+		Zusammen
+	</string>
+	<string name="Jowls">
+		Hängebacken
+	</string>
+	<string name="Knee Angle">
+		Kniewinkel
+	</string>
+	<string name="Knock Kneed">
+		X-beinig
+	</string>
+	<string name="Large">
+		Groß
+	</string>
+	<string name="Large Hands">
+		Große Hände
+	</string>
+	<string name="Left Part">
+		Linksscheitel
+	</string>
+	<string name="Leg Length">
+		Beinlänge
+	</string>
+	<string name="Leg Muscles">
+		Beinmuskeln
+	</string>
+	<string name="Less">
+		Weniger
+	</string>
+	<string name="Less Body Fat">
+		Weniger Speck
+	</string>
+	<string name="Less Curtains">
+		Weniger
+	</string>
+	<string name="Less Freckles">
+		Weniger
+	</string>
+	<string name="Less Full">
+		Weniger
+	</string>
+	<string name="Less Gravity">
+		Weniger
+	</string>
+	<string name="Less Love">
+		Weniger
+	</string>
+	<string name="Less Muscles">
+		Weniger
+	</string>
+	<string name="Less Muscular">
+		Weniger
+	</string>
+	<string name="Less Rosy">
+		Weniger
+	</string>
+	<string name="Less Round">
+		Weniger
+	</string>
+	<string name="Less Saddle">
+		Weniger
+	</string>
+	<string name="Less Square">
+		Weniger
+	</string>
+	<string name="Less Volume">
+		Weniger
+	</string>
+	<string name="Less soul">
+		Weniger
+	</string>
+	<string name="Lighter">
+		Heller
+	</string>
+	<string name="Lip Cleft">
+		Amorbogen
+	</string>
+	<string name="Lip Cleft Depth">
+		Tiefe: Amorbogen
+	</string>
+	<string name="Lip Fullness">
+		Fülle
+	</string>
+	<string name="Lip Pinkness">
+		Pinkton
+	</string>
+	<string name="Lip Ratio">
+		Lippenproportionen
+	</string>
+	<string name="Lip Thickness">
+		Lippendicke
+	</string>
+	<string name="Lip Width">
+		Mundbreite
+	</string>
+	<string name="Lipgloss">
+		Lipgloss
+	</string>
+	<string name="Lipstick">
+		Lippenstift
+	</string>
+	<string name="Lipstick Color">
+		Farbe
+	</string>
+	<string name="Long">
+		Lang
+	</string>
+	<string name="Long Head">
+		Langer Kopf
+	</string>
+	<string name="Long Hips">
+		Lange Hüften
+	</string>
+	<string name="Long Legs">
+		Lange Beine
+	</string>
+	<string name="Long Neck">
+		Langer Hals
+	</string>
+	<string name="Long Pigtails">
+		Lange Zöpfe
+	</string>
+	<string name="Long Ponytail">
+		Langer Pferdeschwanz
+	</string>
+	<string name="Long Torso">
+		Langer Oberkörper
+	</string>
+	<string name="Long arms">
+		Lange Arme
+	</string>
+	<string name="Longcuffs">
+		Manschetten
+	</string>
+	<string name="Loose Pants">
+		Weite Hosen
+	</string>
+	<string name="Loose Shirt">
+		Weites Hemd
+	</string>
+	<string name="Loose Sleeves">
+		Weite Ärmel
+	</string>
+	<string name="Love Handles">
+		Fettpölsterchen
+	</string>
+	<string name="Low">
+		Niedrig
+	</string>
+	<string name="Low Heels">
+		Niedrig
+	</string>
+	<string name="Low Jaw">
+		Niedrig
+	</string>
+	<string name="Low Platforms">
+		Niedrig
+	</string>
+	<string name="Low and Loose">
+		Weit
+	</string>
+	<string name="Lower">
+		Absenken
+	</string>
+	<string name="Lower Bridge">
+		Brücke, Unterer Teil
+	</string>
+	<string name="Lower Cheeks">
+		Wangen, unterer Bereich
+	</string>
+	<string name="Male">
+		Männlich
+	</string>
+	<string name="Middle Part">
+		Mittelscheitel
+	</string>
+	<string name="More">
+		Mehr
+	</string>
+	<string name="More Blush">
+		Mehr
+	</string>
+	<string name="More Body Fat">
+		Mehr Speck
+	</string>
+	<string name="More Curtains">
+		Mehr
+	</string>
+	<string name="More Eyeshadow">
+		Mehr
+	</string>
+	<string name="More Freckles">
+		Mehr
+	</string>
+	<string name="More Full">
+		Voller
+	</string>
+	<string name="More Gravity">
+		Mehr
+	</string>
+	<string name="More Lipstick">
+		Mehr
+	</string>
+	<string name="More Love">
+		Mehr
+	</string>
+	<string name="More Lower Lip">
+		Größer
+	</string>
+	<string name="More Muscles">
+		Mehr
+	</string>
+	<string name="More Muscular">
+		Mehr
+	</string>
+	<string name="More Rosy">
+		Mehr
+	</string>
+	<string name="More Round">
+		Runder
+	</string>
+	<string name="More Saddle">
+		Mehr
+	</string>
+	<string name="More Sloped">
+		Mehr
+	</string>
+	<string name="More Square">
+		Mehr
+	</string>
+	<string name="More Upper Lip">
+		Mehr
+	</string>
+	<string name="More Vertical">
+		Mehr
+	</string>
+	<string name="More Volume">
+		Mehr
+	</string>
+	<string name="More soul">
+		Mehr
+	</string>
+	<string name="Moustache">
+		Schnauzer
+	</string>
+	<string name="Mouth Corner">
+		Mundwinkel
+	</string>
+	<string name="Mouth Position">
+		Mundposition
+	</string>
+	<string name="Mowhawk">
+		Irokese
+	</string>
+	<string name="Muscular">
+		Muskulös
+	</string>
+	<string name="Mutton Chops">
+		Koteletten
+	</string>
+	<string name="Nail Polish">
+		Nagellack
+	</string>
+	<string name="Nail Polish Color">
+		Farbe
+	</string>
+	<string name="Narrow">
+		Schmal
+	</string>
+	<string name="Narrow Back">
+		Wenig
+	</string>
+	<string name="Narrow Front">
+		Wenig
+	</string>
+	<string name="Narrow Lips">
+		Schmale Lippen
+	</string>
+	<string name="Natural">
+		Natürlich
+	</string>
+	<string name="Neck Length">
+		Halslänge
+	</string>
+	<string name="Neck Thickness">
+		Halsdicke
+	</string>
+	<string name="No Blush">
+		Kein Rouge
+	</string>
+	<string name="No Eyeliner">
+		Kein Eyeliner
+	</string>
+	<string name="No Eyeshadow">
+		Kein Lidschatten
+	</string>
+	<string name="No Heels">
+		Keine Absätze
+	</string>
+	<string name="No Lipgloss">
+		Kein Lipgloss
+	</string>
+	<string name="No Lipstick">
+		Kein Lippenstift
+	</string>
+	<string name="No Part">
+		Kein Scheitel
+	</string>
+	<string name="No Polish">
+		Kein Nagellack
+	</string>
+	<string name="No Red">
+		Nicht rot
+	</string>
+	<string name="No Spikes">
+		Keine Stachel
+	</string>
+	<string name="No White">
+		Kein Weiß
+	</string>
+	<string name="No Wrinkles">
+		Keine Falten
+	</string>
+	<string name="Normal Lower">
+		Normal unten
+	</string>
+	<string name="Normal Upper">
+		Normal oben
+	</string>
+	<string name="Nose Left">
+		Links
+	</string>
+	<string name="Nose Right">
+		Rechts
+	</string>
+	<string name="Nose Size">
+		Größe
+	</string>
+	<string name="Nose Thickness">
+		Dicke
+	</string>
+	<string name="Nose Tip Angle">
+		Nasenspitze
+	</string>
+	<string name="Nose Tip Shape">
+		Nasenspitze
+	</string>
+	<string name="Nose Width">
+		Nasenbreite
+	</string>
+	<string name="Nostril Division">
+		Teilung
+	</string>
+	<string name="Nostril Width">
+		Größe
+	</string>
+	<string name="Old">
+		Alt
+	</string>
+	<string name="Opaque">
+		Deckend
+	</string>
+	<string name="Open">
+		Öffnen
+	</string>
+	<string name="Open Back">
+		Hinten offen
+	</string>
+	<string name="Open Front">
+		Vorne offen
+	</string>
+	<string name="Open Left">
+		Links offen
+	</string>
+	<string name="Open Right">
+		Rechts offen
+	</string>
+	<string name="Orange">
+		Orange
+	</string>
+	<string name="Out">
+		Aus
+	</string>
+	<string name="Out Shdw Color">
+		Farbe: Oberer Lidschatten
+	</string>
+	<string name="Out Shdw Opacity">
+		Deckkraft: Oberer Lidschatten
+	</string>
+	<string name="Outer Eye Corner">
+		Äußerer Augenwinkel
+	</string>
+	<string name="Outer Eye Shadow">
+		Lidschatten: Oben
+	</string>
+	<string name="Outer Shadow">
+		Lidschatten: Oben
+	</string>
+	<string name="Overbite">
+		Überbiss
+	</string>
+	<string name="Package">
+		Ausbeulung
+	</string>
+	<string name="Painted Nails">
+		Lackierte Nägel
+	</string>
+	<string name="Pale">
+		Blass
+	</string>
+	<string name="Pants Crotch">
+		Schritt
+	</string>
+	<string name="Pants Fit">
+		Passform
+	</string>
+	<string name="Pants Length">
+		Hosenlänge
+	</string>
+	<string name="Pants Waist">
+		Hüfte
+	</string>
+	<string name="Pants Wrinkles">
+		Falten
+	</string>
+	<string name="Part">
+		Scheitel
+	</string>
+	<string name="Part Bangs">
+		Pony scheiteln
+	</string>
+	<string name="Pectorals">
+		Brustmuskel
+	</string>
+	<string name="Pigment">
+		Pigmentierung
+	</string>
+	<string name="Pigtails">
+		Zöpfe
+	</string>
+	<string name="Pink">
+		Pink
+	</string>
+	<string name="Pinker">
+		Mehr Pink
+	</string>
+	<string name="Platform Height">
+		Höhe
+	</string>
+	<string name="Platform Width">
+		Breite
+	</string>
+	<string name="Pointy">
+		Spitz
+	</string>
+	<string name="Pointy Heels">
+		Pfennigabsätze
+	</string>
+	<string name="Pointy Toe">
+		Spitz
+	</string>
+	<string name="Ponytail">
+		Pferdeschwanz
+	</string>
+	<string name="Poofy Skirt">
+		Weit ausgestellt
+	</string>
+	<string name="Pop Left Eye">
+		Linkes Auge größer
+	</string>
+	<string name="Pop Right Eye">
+		Rechtes Auge größer
+	</string>
+	<string name="Puffy">
+		Geschwollen
+	</string>
+	<string name="Puffy Eyelids">
+		Geschwollene Lider
+	</string>
+	<string name="Rainbow Color">
+		Regenbogenfarben
+	</string>
+	<string name="Red Hair">
+		Rote Haare
+	</string>
+	<string name="Red Skin">
+		Rote Haut
+	</string>
+	<string name="Regular">
+		Normal
+	</string>
+	<string name="Regular Muscles">
+		Normal muskulös
+	</string>
+	<string name="Right Part">
+		Scheitel rechts
+	</string>
+	<string name="Rosy Complexion">
+		Rosiger Teint
+	</string>
+	<string name="Round">
+		Rund
+	</string>
+	<string name="Round Forehead">
+		Runde Stirn
+	</string>
+	<string name="Ruddiness">
+		Röte
+	</string>
+	<string name="Ruddy">
+		Rötlich
+	</string>
+	<string name="Rumpled Hair">
+		Zerzauste Haare
+	</string>
+	<string name="Saddle Bags">
+		Hüftspeck
+	</string>
+	<string name="Saddlebags">
+		Hüftspeck
+	</string>
+	<string name="Scrawny">
+		Dürr
+	</string>
+	<string name="Scrawny Leg">
+		Dürres Bein
+	</string>
+	<string name="Separate">
+		Auseinander
+	</string>
+	<string name="Shading">
+		Schattierung
+	</string>
+	<string name="Shadow hair">
+		Schattenhaar
+	</string>
+	<string name="Shallow">
+		Flach
+	</string>
+	<string name="Shear Back">
+		Hinterkopf rasiert
+	</string>
+	<string name="Shear Face">
+		Gesicht verzerren
+	</string>
+	<string name="Shear Front">
+		Vorne rasiert
+	</string>
+	<string name="Shear Left">
+		Links
+	</string>
+	<string name="Shear Left Up">
+		Links
+	</string>
+	<string name="Shear Right">
+		Rechts
+	</string>
+	<string name="Shear Right Up">
+		Rechts
+	</string>
+	<string name="Sheared Back">
+		Hinterkopf rasiert
+	</string>
+	<string name="Sheared Front">
+		Vorne rasiert
+	</string>
+	<string name="Shift Left">
+		Nach links
+	</string>
+	<string name="Shift Mouth">
+		Mund verschieben
+	</string>
+	<string name="Shift Right">
+		Nach rechts
+	</string>
+	<string name="Shirt Bottom">
+		Hemdlänge
+	</string>
+	<string name="Shirt Fit">
+		Passform
+	</string>
+	<string name="Shirt Wrinkles">
+		Falten
+	</string>
+	<string name="Shoe Height">
+		Höhe
+	</string>
+	<string name="Short">
+		Kurz
+	</string>
+	<string name="Short Arms">
+		Kurze Arme
+	</string>
+	<string name="Short Legs">
+		Kurze Beine
+	</string>
+	<string name="Short Neck">
+		Kurzer Hals
+	</string>
+	<string name="Short Pigtails">
+		Kurze Zöpfe
+	</string>
+	<string name="Short Ponytail">
+		Kurzer Pferdeschwanz
+	</string>
+	<string name="Short Sideburns">
+		Kurze Koteletten
+	</string>
+	<string name="Short Torso">
+		Kurzer Oberkörper
+	</string>
+	<string name="Short hips">
+		Kurze Hüften
+	</string>
+	<string name="Shoulders">
+		Schultern
+	</string>
+	<string name="Side Bangs">
+		Seitlicher Pony
+	</string>
+	<string name="Side Bangs Down">
+		Lang
+	</string>
+	<string name="Side Bangs Up">
+		Kurz
+	</string>
+	<string name="Side Fringe">
+		Seitliche Fransen
+	</string>
+	<string name="Sideburns">
+		Koteletten
+	</string>
+	<string name="Sides Hair">
+		Seitliches Haar
+	</string>
+	<string name="Sides Hair Down">
+		Lang
+	</string>
+	<string name="Sides Hair Up">
+		Kurz
+	</string>
+	<string name="Skinny">
+		Dünn
+	</string>
+	<string name="Skinny Neck">
+		Dünner Hals
+	</string>
+	<string name="Skirt Fit">
+		Passform
+	</string>
+	<string name="Skirt Length">
+		Rocklänge
+	</string>
+	<string name="Slanted Forehead">
+		Fliehende Stirn
+	</string>
+	<string name="Sleeve Length">
+		Ärmellänge
+	</string>
+	<string name="Sleeve Looseness">
+		Passform Ärmel
+	</string>
+	<string name="Slit Back">
+		Schlitz: Hinten
+	</string>
+	<string name="Slit Front">
+		Schlitz: Vorne
+	</string>
+	<string name="Slit Left">
+		Schlitz: Links
+	</string>
+	<string name="Slit Right">
+		Schlitz: Rechts
+	</string>
+	<string name="Small">
+		Klein
+	</string>
+	<string name="Small Hands">
+		Kleine Hände
+	</string>
+	<string name="Small Head">
+		Kleiner Kopf
+	</string>
+	<string name="Smooth">
+		Glätten
+	</string>
+	<string name="Smooth Hair">
+		Glattes Haar
+	</string>
+	<string name="Socks Length">
+		Strumpflänge
+	</string>
+	<string name="Some">
+		Etwas
+	</string>
+	<string name="Soulpatch">
+		Unterlippenbart
+	</string>
+	<string name="Sparse">
+		Wenig
+	</string>
+	<string name="Spiked Hair">
+		Stachelhaare
+	</string>
+	<string name="Square">
+		Rechteck
+	</string>
+	<string name="Square Toe">
+		Eckig
+	</string>
+	<string name="Squash Head">
+		Gestaucht
+	</string>
+	<string name="Squash/Stretch Head">
+		Gestretcht/Gestaucht
+	</string>
+	<string name="Stretch Head">
+		Gestreckt
+	</string>
+	<string name="Sunken">
+		Eingefallen
+	</string>
+	<string name="Sunken Chest">
+		Trichterbrust
+	</string>
+	<string name="Sunken Eyes">
+		Eingesunkene Augen
+	</string>
+	<string name="Sweep Back">
+		Nach hinten
+	</string>
+	<string name="Sweep Forward">
+		Nach vorne
+	</string>
+	<string name="Swept Back">
+		Nach hinten
+	</string>
+	<string name="Swept Back Hair">
+		Haar nach hinten
+	</string>
+	<string name="Swept Forward">
+		Haare nach vorne
+	</string>
+	<string name="Swept Forward Hair">
+		Haare nach vorne
+	</string>
+	<string name="Tall">
+		Groß
+	</string>
+	<string name="Taper Back">
+		Ansatzbreite hinten
+	</string>
+	<string name="Taper Front">
+		Ansatzbreite vorne
+	</string>
+	<string name="Thick Heels">
+		Dicke Absätze
+	</string>
+	<string name="Thick Neck">
+		Dicker Hals
+	</string>
+	<string name="Thick Toe">
+		Dick
+	</string>
+	<string name="Thickness">
+		Dicke
+	</string>
+	<string name="Thin">
+		Dünn
+	</string>
+	<string name="Thin Eyebrows">
+		Dünne Augenbrauen
+	</string>
+	<string name="Thin Lips">
+		Dünne Lippen
+	</string>
+	<string name="Thin Nose">
+		Dünne Nase
+	</string>
+	<string name="Tight Chin">
+		Straffes Kinn
+	</string>
+	<string name="Tight Cuffs">
+		Eng
+	</string>
+	<string name="Tight Pants">
+		Enge Hosen
+	</string>
+	<string name="Tight Shirt">
+		Enges Hemd
+	</string>
+	<string name="Tight Skirt">
+		Enger Rock
+	</string>
+	<string name="Tight Sleeves">
+		Enge Ärmel
+	</string>
+	<string name="Tilt Left">
+		Nach links
+	</string>
+	<string name="Tilt Right">
+		Nach rechts
+	</string>
+	<string name="Toe Shape">
+		Spitze
+	</string>
+	<string name="Toe Thickness">
+		Dicke
+	</string>
+	<string name="Torso Length">
+		Länge des Oberkörpers
+	</string>
+	<string name="Torso Muscles">
+		Muskeln
+	</string>
+	<string name="Torso Scrawny">
+		Dürr
+	</string>
+	<string name="Unattached">
+		Frei
+	</string>
+	<string name="Uncreased">
+		Straffes Lid
+	</string>
+	<string name="Underbite">
+		Unterbiss
+	</string>
+	<string name="Unnatural">
+		Unnatürlich
+	</string>
+	<string name="Upper Bridge">
+		Brücke, oberer Teil
+	</string>
+	<string name="Upper Cheeks">
+		Obere Wangen
+	</string>
+	<string name="Upper Chin Cleft">
+		Obere Kinnspalte
+	</string>
+	<string name="Upper Eyelid Fold">
+		Obere Lidfalte
+	</string>
+	<string name="Upturned">
+		Stupsnase
+	</string>
+	<string name="Very Red">
+		Sehr rot
+	</string>
+	<string name="Waist Height">
+		Bund
+	</string>
+	<string name="Well-Fed">
+		Gut genährt
+	</string>
+	<string name="White Hair">
+		Weiße Haare
+	</string>
+	<string name="Wide">
+		Breit
+	</string>
+	<string name="Wide Back">
+		Breit
+	</string>
+	<string name="Wide Front">
+		Breit
+	</string>
+	<string name="Wide Lips">
+		Breit
+	</string>
+	<string name="Wild">
+		Wild
+	</string>
+	<string name="Wrinkles">
+		Falten
+	</string>
+	<string name="LocationCtrlAddLandmarkTooltip">
+		Zu meinen Landmarken hinzufügen
+	</string>
+	<string name="LocationCtrlEditLandmarkTooltip">
+		Meine Landmarken bearbeiten
+	</string>
+	<string name="UpdaterWindowTitle">
+		[APP_NAME] Aktualisierung
+	</string>
+	<string name="UpdaterNowUpdating">
+		[APP_NAME] wird aktualisiert...
+	</string>
+	<string name="UpdaterNowInstalling">
+		[APP_NAME] wird installiert...
+	</string>
+	<string name="UpdaterUpdatingDescriptive">
+		Ihr [APP_NAME]-Viewer wird aktualisiert.  Dies kann einen Moment dauern. Wir bitten um Ihr Verständnis.
+	</string>
+	<string name="UpdaterProgressBarTextWithEllipses">
+		Aktualisierung wird heruntergeladen...
+	</string>
+	<string name="UpdaterProgressBarText">
+		Aktualisierung wird heruntergeladen
+	</string>
+	<string name="UpdaterFailDownloadTitle">
+		Herunterladen ist fehlgeschlagen
+	</string>
+	<string name="UpdaterFailUpdateDescriptive">
+		Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte laden Sie die aktuellste Version von www.secondlife.com herunter.
+	</string>
+	<string name="UpdaterFailInstallTitle">
+		Aktualisierung konnte nicht installiert werden
+	</string>
+	<string name="UpdaterFailStartTitle">
+		Viewer konnte nicht gestartet werden
+	</string>
+	<string name="only_user_message">
+		Sie sind der einzige Benutzer in dieser Sitzung.
+	</string>
+	<string name="offline_message">
+		[FIRST] [LAST] ist offline.
+	</string>
+	<string name="invite_message">
+		Klicken Sie auf [BUTTON NAME], um eine Verbindung zu diesem Voice-Chat herzustellen.
+	</string>
+	<string name="generic_request_error">
+		Fehler bei Anfrage, bitte versuchen Sie es später.
+	</string>
+	<string name="insufficient_perms_error">
+		Sie sind dazu nicht berechtigt.
+	</string>
+	<string name="session_does_not_exist_error">
+		Die Sitzung ist abgelaufen
+	</string>
+	<string name="no_ability_error">
+		Sie besitzen diese Fähigkeit nicht.
+	</string>
+	<string name="no_ability">
+		Sie besitzen diese Fähigkeit nicht.
+	</string>
+	<string name="not_a_mod_error">
+		Sie sind kein Sitzungsmoderator.
+	</string>
+	<string name="muted_error">
+		Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert.
+	</string>
+	<string name="add_session_event">
+		Es konnten keine Benutzer zur Chat-Sitzung mit [RECIPIENT] hinzugefügt werden.
+	</string>
+	<string name="message_session_event">
+		Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden.
+	</string>
+	<string name="removed_from_group">
+		Sie wurden von der Gruppe ausgeschlossen.
+	</string>
+	<string name="close_on_no_ability">
+		Sie haben nicht mehr die Berechtigung an der Chat-Sitzung teilzunehmen.
+	</string>
+</strings>
diff --git a/indra/newview/skins/default/xui/de/teleport_strings.xml b/indra/newview/skins/default/xui/de/teleport_strings.xml
index 231798c6a6f..2c56eff0a31 100644
--- a/indra/newview/skins/default/xui/de/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/de/teleport_strings.xml
@@ -1,78 +1,78 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<teleport_messages name="">
-	<message_set name="errors">
-		<message name="invalid_tport">
-			Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden.
-Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
-		</message>
-		<message name="invalid_region_handoff">
-			Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen eventuell neu anmelden, um die Region wechseln zu können.
-Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
-		</message>
-		<message name="blocked_tport">
-			Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal.
-Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab und wieder an.
-		</message>
-		<message name="nolandmark_tport">
-			Das System konnte das Landmarken-Ziel nicht finden.
-		</message>
-		<message name="timeout_tport">
-			Das System konnte keine Teleport-Verbindung herstellen.
-Versuchen Sie es später noch einmal.
-		</message>
-		<message name="noaccess_tport">
-			Sie haben leider keinen Zugang zu diesem Teleport-Ziel.
-		</message>
-		<message name="missing_attach_tport">
-			Ihre Anhänge sind noch nicht eingetroffen. Warten Sie kurz oder melden Sie sich ab und wieder an, bevor Sie einen neuen Teleport-Versuch unternehmen.
-		</message>
-		<message name="too_many_uploads_tport">
-			Die Asset-Warteschlange in dieser Region ist zurzeit überlastet.
-Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in einigen Minuten erneut oder besuchen Sie eine weniger überfüllte Region.
-		</message>
-		<message name="expired_tport">
-			Das System konnte Ihre Teleport-Anfrage nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut.
-		</message>
-		<message name="expired_region_handoff">
-			Das System konnte Ihre Anfrage zum Regionswechsel nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut.
-		</message>
-		<message name="no_host">
-			Teleport-Ziel wurde nicht gefunden. Das Ziel ist entweder im Moment nicht verfügbar oder existiert nicht mehr. Versuchen Sie es in einigen Minuten erneut.
-		</message>
-		<message name="no_inventory_host">
-			Das Inventarsystem ist zurzeit nicht verfügbar.
-		</message>
-	</message_set>
-	<message_set name="progress">
-		<message name="sending_dest">
-			Transport zum Ziel.
-		</message>
-		<message name="redirecting">
-			Weiterleitung an anderes Ziel.
-		</message>
-		<message name="relaying">
-			Weiterleitung zum Ziel.
-		</message>
-		<message name="sending_home">
-			Zuhause-Position wird ermittelt.
-		</message>
-		<message name="sending_landmark">
-			Landmarken-Position wird ermittelt.
-		</message>
-		<message name="completing">
-			Teleport wird abgeschlossen.
-		</message>
-		<message name="resolving">
-			Ziel wird ermittelt.
-		</message>
-		<message name="contacting">
-			Verbindung zu neuer Region.
-		</message>
-		<message name="arriving">
-			Ziel erreicht...
-		</message>
-		<message name="requesting">
-			Teleport wird initialisiert...
-		</message>
-	</message_set>
-</teleport_messages>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<teleport_messages name="">
+	<message_set name="errors">
+		<message name="invalid_tport">
+			Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden.
+Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
+		</message>
+		<message name="invalid_region_handoff">
+			Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen eventuell neu anmelden, um die Region wechseln zu können.
+Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
+		</message>
+		<message name="blocked_tport">
+			Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal.
+Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab und wieder an.
+		</message>
+		<message name="nolandmark_tport">
+			Das System konnte das Landmarken-Ziel nicht finden.
+		</message>
+		<message name="timeout_tport">
+			Das System konnte keine Teleport-Verbindung herstellen.
+Versuchen Sie es später noch einmal.
+		</message>
+		<message name="noaccess_tport">
+			Sie haben leider keinen Zugang zu diesem Teleport-Ziel.
+		</message>
+		<message name="missing_attach_tport">
+			Ihre Anhänge sind noch nicht eingetroffen. Warten Sie kurz oder melden Sie sich ab und wieder an, bevor Sie einen neuen Teleport-Versuch unternehmen.
+		</message>
+		<message name="too_many_uploads_tport">
+			Die Asset-Warteschlange in dieser Region ist zurzeit überlastet.
+Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in einigen Minuten erneut oder besuchen Sie eine weniger überfüllte Region.
+		</message>
+		<message name="expired_tport">
+			Das System konnte Ihre Teleport-Anfrage nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut.
+		</message>
+		<message name="expired_region_handoff">
+			Das System konnte Ihre Anfrage zum Regionswechsel nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut.
+		</message>
+		<message name="no_host">
+			Teleport-Ziel wurde nicht gefunden. Das Ziel ist entweder im Moment nicht verfügbar oder existiert nicht mehr. Versuchen Sie es in einigen Minuten erneut.
+		</message>
+		<message name="no_inventory_host">
+			Das Inventarsystem ist zurzeit nicht verfügbar.
+		</message>
+	</message_set>
+	<message_set name="progress">
+		<message name="sending_dest">
+			Transport zum Ziel.
+		</message>
+		<message name="redirecting">
+			Weiterleitung an anderes Ziel.
+		</message>
+		<message name="relaying">
+			Weiterleitung zum Ziel.
+		</message>
+		<message name="sending_home">
+			Zuhause-Position wird ermittelt.
+		</message>
+		<message name="sending_landmark">
+			Landmarken-Position wird ermittelt.
+		</message>
+		<message name="completing">
+			Teleport wird abgeschlossen.
+		</message>
+		<message name="resolving">
+			Ziel wird ermittelt.
+		</message>
+		<message name="contacting">
+			Verbindung zu neuer Region.
+		</message>
+		<message name="arriving">
+			Ziel erreicht...
+		</message>
+		<message name="requesting">
+			Teleport wird initialisiert...
+		</message>
+	</message_set>
+</teleport_messages>
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
index a731996a1a2..ef0bf72058b 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
@@ -1,105 +1,105 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu
-         create_jump_keys="true"
-         layout="topleft"
-         mouse_opaque="false"
-         visible="false"
-         name="Gear Menu">
-  <menu_item_call
-   label="View Profile"
-   enabled="true" 
-   name="view_profile">
-    <menu_item_call.on_click
-     function="InspectAvatar.ViewProfile"/>
-  </menu_item_call>
-  <menu_item_call
-   label="Add Friend"
-   name="add_friend">
-    <menu_item_call.on_click
-     function="InspectAvatar.AddFriend"/>
-    <menu_item_call.on_enable
-     function="InspectAvatar.Gear.Enable"/>
-  </menu_item_call>
-  <menu_item_call
-   label="IM"
-   name="im">
-    <menu_item_call.on_click
-     function="InspectAvatar.IM"/>
-  </menu_item_call>
-  <menu_item_call
-   label="Call"
-   enabled="true"
-   name="call">
-  </menu_item_call>
-  <menu_item_call
-   label="Teleport"
-   name="teleport">
-    <menu_item_call.on_click
-     function="InspectAvatar.Teleport"/>
-  </menu_item_call>
-  <menu_item_call
-   label="Invite to Group"
-   name="invite_to_group">
-    <menu_item_call.on_click
-     function="InspectAvatar.InviteToGroup"/>
-  </menu_item_call>
-  <menu_item_separator />
-  <menu_item_call
-   label="Block"
-   name="block">
-    <menu_item_call.on_click
-     function="InspectAvatar.Block"/>
-  </menu_item_call>
-  <menu_item_call
-   label="Report"
-   name="report">
-    <menu_item_call.on_click
-     function="InspectAvatar.Report"/>
-  </menu_item_call>  
-  <menu_item_call
-   label="Freeze"
-   name="freeze">
-    <menu_item_call.on_click
-     function="InspectAvatar.Freeze"/>
-    <menu_item_call.on_visible
-     function="InspectAvatar.VisibleFreezeEject"/>
-  </menu_item_call>
-  <menu_item_call
-   label="Eject"
-   name="eject">
-    <menu_item_call.on_click
-     function="InspectAvatar.Eject"/>
-    <menu_item_call.on_visible
-     function="InspectAvatar.VisibleFreezeEject"/>
-  </menu_item_call>
-  <menu_item_call
-   label="Debug"
-   name="debug">
-    <menu_item_call.on_click
-     function="Avatar.Debug"/>
-    <menu_item_call.on_visible
-     function="IsGodCustomerService"/>
-  </menu_item_call>
-  <menu_item_call
-   label="Find On Map"
-   name="find_on_map">
-    <menu_item_call.on_click
-     function="InspectAvatar.FindOnMap"/>
-    <menu_item_call.on_visible
-     function="InspectAvatar.VisibleFindOnMap"/>
-  </menu_item_call>
-  <menu_item_call
-   label="Zoom In"
-   name="zoom_in">
-    <menu_item_call.on_click
-     function="InspectAvatar.ZoomIn"/>
-    <menu_item_call.on_visible
-     function="InspectAvatar.VisibleZoomIn"/>
-  </menu_item_call>  
-  <menu_item_call
-   label="Pay"
-   name="pay">
-    <menu_item_call.on_click
-     function="InspectAvatar.Pay"/>
-  </menu_item_call>
-</menu>
+<?xml version="1.0" encoding="utf-8"?>
+<menu
+         create_jump_keys="true"
+         layout="topleft"
+         mouse_opaque="false"
+         visible="false"
+         name="Gear Menu">
+  <menu_item_call
+   label="View Profile"
+   enabled="true" 
+   name="view_profile">
+    <menu_item_call.on_click
+     function="InspectAvatar.ViewProfile"/>
+  </menu_item_call>
+  <menu_item_call
+   label="Add Friend"
+   name="add_friend">
+    <menu_item_call.on_click
+     function="InspectAvatar.AddFriend"/>
+    <menu_item_call.on_enable
+     function="InspectAvatar.Gear.Enable"/>
+  </menu_item_call>
+  <menu_item_call
+   label="IM"
+   name="im">
+    <menu_item_call.on_click
+     function="InspectAvatar.IM"/>
+  </menu_item_call>
+  <menu_item_call
+   label="Call"
+   enabled="true"
+   name="call">
+  </menu_item_call>
+  <menu_item_call
+   label="Teleport"
+   name="teleport">
+    <menu_item_call.on_click
+     function="InspectAvatar.Teleport"/>
+  </menu_item_call>
+  <menu_item_call
+   label="Invite to Group"
+   name="invite_to_group">
+    <menu_item_call.on_click
+     function="InspectAvatar.InviteToGroup"/>
+  </menu_item_call>
+  <menu_item_separator />
+  <menu_item_call
+   label="Block"
+   name="block">
+    <menu_item_call.on_click
+     function="InspectAvatar.Block"/>
+  </menu_item_call>
+  <menu_item_call
+   label="Report"
+   name="report">
+    <menu_item_call.on_click
+     function="InspectAvatar.Report"/>
+  </menu_item_call>  
+  <menu_item_call
+   label="Freeze"
+   name="freeze">
+    <menu_item_call.on_click
+     function="InspectAvatar.Freeze"/>
+    <menu_item_call.on_visible
+     function="InspectAvatar.VisibleFreezeEject"/>
+  </menu_item_call>
+  <menu_item_call
+   label="Eject"
+   name="eject">
+    <menu_item_call.on_click
+     function="InspectAvatar.Eject"/>
+    <menu_item_call.on_visible
+     function="InspectAvatar.VisibleFreezeEject"/>
+  </menu_item_call>
+  <menu_item_call
+   label="Debug"
+   name="debug">
+    <menu_item_call.on_click
+     function="Avatar.Debug"/>
+    <menu_item_call.on_visible
+     function="IsGodCustomerService"/>
+  </menu_item_call>
+  <menu_item_call
+   label="Find On Map"
+   name="find_on_map">
+    <menu_item_call.on_click
+     function="InspectAvatar.FindOnMap"/>
+    <menu_item_call.on_visible
+     function="InspectAvatar.VisibleFindOnMap"/>
+  </menu_item_call>
+  <menu_item_call
+   label="Zoom In"
+   name="zoom_in">
+    <menu_item_call.on_click
+     function="InspectAvatar.ZoomIn"/>
+    <menu_item_call.on_visible
+     function="InspectAvatar.VisibleZoomIn"/>
+  </menu_item_call>  
+  <menu_item_call
+   label="Pay"
+   name="pay">
+    <menu_item_call.on_click
+     function="InspectAvatar.Pay"/>
+  </menu_item_call>
+</menu>
diff --git a/indra/newview/skins/default/xui/en/panel_group_notify.xml b/indra/newview/skins/default/xui/en/panel_group_notify.xml
index d22d58329c4..2e4df92da45 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notify.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notify.xml
@@ -1,105 +1,105 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- background_visible="true"
- bevel_style="in"
- bg_alpha_color="0 0 0 0"
- height="90"
- label="instant_message"
- layout="topleft"
- left="0"
- name="panel_group_notify"
- top="0"
- width="305">
-    <string
-     name="message_max_lines_count"
-     value="7" />
-    <string
-     name="subject_font"
-     value="SANSSERIF_BIG" />
-    <string
-     name="date_font"
-     value="SANSSERIF" />
-    <panel
-     background_visible="true"
-     bevel_style="in"
-     bg_alpha_color="black"
-     follows="top"
-     height="30"
-     label="header"
-     layout="topleft"
-     left="0"
-     name="header"
-     top="0"
-     width="305">
-        <icon
-         follows="left|top|right|bottom"
-         height="20"
-         layout="topleft"
-         left="5"
-         mouse_opaque="true"
-         name="group_icon"
-         top="5"
-         width="20" />
-        <text
-         follows="left|top|right|bottom"
-         font="SansSerifBigBold"
-         height="20"
-         layout="topleft"
-         left_pad="10"
-         name="title"
-         text_color="GroupNotifyTextColor"
-         top="5"
-         use_ellipses="true"
-         value="Sender Name / Group Name"
-         width="230" />
-    </panel>
-    <text_editor
-     allow_html="true"
-     enabled="true"
-     follows="left|top|bottom|right"
-     height="0"
-     layout="topleft"
-     left="25"
-     max_length="2147483647"
-     name="message"
-     parse_highlights="true"
-     read_only="true"
-     text_color="GroupNotifyTextColor"
-     top="40"
-     type="string"
-     use_ellipses="true"
-     value="message"
-     width="270" 
-	 word_wrap="true" >
-    </text_editor>
-    <icon
-     bottom="60"
-     follows="left|bottom|right"
-     height="15"
-     layout="topleft"
-     left="25"
-     mouse_opaque="true"
-     name="attachment_icon"
-     width="15" />
-    <text
-     bottom="60"
-     follows="left|bottom|right"
-     font="SansSerif"
-     height="15"
-     layout="topleft"
-     left="45"
-     name="attachment"
-     text_color="GroupNotifyTextColor"
-     value="Attachment"
-     use_ellipses="true"
-     width="250" />
-    <button
-     bottom="85"
-     follows="bottom"
-     height="20"
-     label="OK"
-     layout="topleft"
-     left="25"
-     name="btn_ok"
-     width="70" />
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ bevel_style="in"
+ bg_alpha_color="0 0 0 0"
+ height="90"
+ label="instant_message"
+ layout="topleft"
+ left="0"
+ name="panel_group_notify"
+ top="0"
+ width="305">
+    <string
+     name="message_max_lines_count"
+     value="7" />
+    <string
+     name="subject_font"
+     value="SANSSERIF_BIG" />
+    <string
+     name="date_font"
+     value="SANSSERIF" />
+    <panel
+     background_visible="true"
+     bevel_style="in"
+     bg_alpha_color="black"
+     follows="top"
+     height="30"
+     label="header"
+     layout="topleft"
+     left="0"
+     name="header"
+     top="0"
+     width="305">
+        <icon
+         follows="left|top|right|bottom"
+         height="20"
+         layout="topleft"
+         left="5"
+         mouse_opaque="true"
+         name="group_icon"
+         top="5"
+         width="20" />
+        <text
+         follows="left|top|right|bottom"
+         font="SansSerifBigBold"
+         height="20"
+         layout="topleft"
+         left_pad="10"
+         name="title"
+         text_color="GroupNotifyTextColor"
+         top="5"
+         use_ellipses="true"
+         value="Sender Name / Group Name"
+         width="230" />
+    </panel>
+    <text_editor
+     allow_html="true"
+     enabled="true"
+     follows="left|top|bottom|right"
+     height="0"
+     layout="topleft"
+     left="25"
+     max_length="2147483647"
+     name="message"
+     parse_highlights="true"
+     read_only="true"
+     text_color="GroupNotifyTextColor"
+     top="40"
+     type="string"
+     use_ellipses="true"
+     value="message"
+     width="270" 
+	 word_wrap="true" >
+    </text_editor>
+    <icon
+     bottom="60"
+     follows="left|bottom|right"
+     height="15"
+     layout="topleft"
+     left="25"
+     mouse_opaque="true"
+     name="attachment_icon"
+     width="15" />
+    <text
+     bottom="60"
+     follows="left|bottom|right"
+     font="SansSerif"
+     height="15"
+     layout="topleft"
+     left="45"
+     name="attachment"
+     text_color="GroupNotifyTextColor"
+     value="Attachment"
+     use_ellipses="true"
+     width="250" />
+    <button
+     bottom="85"
+     follows="bottom"
+     height="20"
+     label="OK"
+     layout="topleft"
+     left="25"
+     name="btn_ok"
+     width="70" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index fcee0ef9538..a4149c174f1 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -1,467 +1,467 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- background_visible="true"
- follows="all"
- height="400"
- label="Things"
- layout="topleft"
- min_height="350"
- min_width="240"
- name="main inventory panel"
- width="330">
-    <panel.string
-     name="Title">
-        Things
-    </panel.string>
-    <filter_editor
-     text_pad_left="12"
-     follows="left|top|right"
-	 font="SanSerif"
-     height="20"
-     label="Filter"
-     layout="topleft"
-     left="15"
-     name="inventory search editor"
-     top="34"
-     width="300" />
-    <tab_container
-     follows="left|top|right|bottom"
-     height="300"
-     layout="topleft"
-     left_delta="-4"
-     name="inventory filter tabs"
-     tab_position="top"
-     top_pad="4"
-     width="305">
-        <inventory_panel
-         follows="left|top|right|bottom"
-         height="295"
-         label="All Items"
-         layout="topleft"
-         left="1"
-         name="All Items"
-         top="16"
-         width="290" />
-        <inventory_panel
-         follows="left|top|right|bottom"
-         height="295"
-         label="Recent Items"
-         layout="topleft"
-         left_delta="0"
-         name="Recent Items"
-         top_delta="0"
-         width="290" />
-    </tab_container>
-
-    <panel
-     background_visible="true"
-     bevel_style="none"
-     bottom="0"
-     follows="left|right|bottom"
-     height="30"
-     layout="bottomleft"
-     left="0"
-	 visible="true"
-     name="bottom_panel"
-     width="330">
-        <button
-         follows="bottom|left"
-         tool_tip="Show additional options"
-         height="18"
-         image_disabled="OptionsMenu_Disabled"
-         image_selected="OptionsMenu_Press"
-         image_unselected="OptionsMenu_Off"
-         layout="topleft"
-         left="10"
-         name="options_gear_btn"
-         picture_style="true"
-         top="6"
-         width="18" />
-        <button
-         follows="bottom|left"
-         height="18"
-         image_selected="AddItem_Press"
-         image_unselected="AddItem_Off"
-         image_disabled="AddItem_Disabled"
-         layout="topleft"
-         left_pad="5"
-         name="add_btn"
-         picture_style="true"
-         tool_tip="Add new item"
-         width="18" />
-        <dnd_button
-         follows="bottom|right"
-         height="18"
-         image_selected="TrashItem_Press"
-         image_unselected="TrashItem_Off"
-         layout="topleft"
-         right="-5"
-         name="trash_btn"
-         picture_style="true"
-         tool_tip="Remove selected item"
-         top="6"
-         width="18" />
-    </panel>
-
-    <menu_bar
-     bg_visible="false"
-     follows="left|top|right"
-     height="18"
-     layout="topleft"
-     left_delta="0"
-     mouse_opaque="false"
-     name="Inventory Menu"
-     top="15"
-	 visible="true"
-     width="290">
-        <menu
-         height="101"
-         label="File"
-         layout="topleft"
-         left="0"
-         mouse_opaque="false"
-         name="File"
-         tear_off="true"
-         top="-117"
-         width="128">
-            <menu_item_call
-             label="Open"
-             layout="topleft"
-             name="Open">
-                <menu_item_call.on_click
-                 function="Inventory.DoToSelected"
-                 parameter="open" />
-            </menu_item_call>
-            <menu
-             create_jump_keys="true"
-             label="Upload"
-             layout="topleft"
-             name="upload"
-             tear_off="true">
-                <menu_item_call
-                 label="Image (L$[COST])..."
-                 layout="topleft"
-                 name="Upload Image"
-                 shortcut="control|U">
-                    <menu_item_call.on_click
-                     function="File.UploadImage"
-                     parameter="" />
-                    <menu_item_call.on_enable
-                     function="File.EnableUpload" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Sound (L$[COST])..."
-                 layout="topleft"
-                 name="Upload Sound">
-                    <menu_item_call.on_click
-                     function="File.UploadSound"
-                     parameter="" />
-                    <menu_item_call.on_enable
-                     function="File.EnableUpload" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Animation (L$[COST])..."
-                 layout="topleft"
-                 name="Upload Animation">
-                    <menu_item_call.on_click
-                     function="File.UploadAnim"
-                     parameter="" />
-                    <menu_item_call.on_enable
-                     function="File.EnableUpload" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Bulk (L$[COST] per file)..."
-                 layout="topleft"
-                 name="Bulk Upload">
-                    <menu_item_call.on_click
-                     function="File.UploadBulk"
-                     parameter="" />
-                </menu_item_call>
-                <menu_item_separator
-                 layout="topleft" />
-            </menu>
-            <menu_item_separator
-             layout="topleft" />
-            <menu_item_call
-             label="New Window"
-             layout="topleft"
-             name="New Window">
-                <menu_item_call.on_click
-                 function="Inventory.NewWindow" />
-            </menu_item_call>
-            <menu_item_separator
-             layout="topleft"
-             name="separator2" />
-            <menu_item_call
-             label="Show Filters"
-             layout="topleft"
-             name="Show Filters">
-                <menu_item_call.on_click
-                 function="Inventory.ShowFilters" />
-            </menu_item_call>
-            <menu_item_call
-             label="Reset Filters"
-             layout="topleft"
-             name="Reset Current">
-                <menu_item_call.on_click
-                 function="Inventory.ResetFilter" />
-            </menu_item_call>
-            <menu_item_call
-             label="Close All Folders"
-             layout="topleft"
-             name="Close All Folders">
-                <menu_item_call.on_click
-                 function="Inventory.CloseAllFolders" />
-            </menu_item_call>
-            <menu_item_separator
-             layout="topleft"
-             name="separator3" />
-            <menu_item_call
-             label="Empty Trash"
-             layout="topleft"
-             name="Empty Trash">
-                <menu_item_call.on_click
-                 function="Inventory.EmptyTrash" />
-            </menu_item_call>
-            <menu_item_call
-             label="Empty Lost And Found"
-             layout="topleft"
-             name="Empty Lost And Found">
-                <menu_item_call.on_click
-                 function="Inventory.EmptyLostAndFound" />
-            </menu_item_call>
-        </menu>
-        <menu
-         height="121"
-         label="Create"
-         layout="topleft"
-         left="0"
-         mouse_opaque="false"
-         name="Create"
-         tear_off="true"
-         top="-201"
-         width="121">
-            <menu_item_call
-             label="New Folder"
-             layout="topleft"
-             name="New Folder">
-                <menu_item_call.on_click
-                 function="Inventory.DoCreate"
-                 parameter="category" />
-            </menu_item_call>
-            <menu_item_call
-             label="New Script"
-             layout="topleft"
-             name="New Script">
-                <menu_item_call.on_click
-                 function="Inventory.DoCreate"
-                 parameter="lsl" />
-            </menu_item_call>
-            <menu_item_call
-             label="New Note"
-             layout="topleft"
-             name="New Note">
-                <menu_item_call.on_click
-                 function="Inventory.DoCreate"
-                 parameter="notecard" />
-            </menu_item_call>
-            <menu_item_call
-             label="New Gesture"
-             layout="topleft"
-             name="New Gesture">
-                <menu_item_call.on_click
-                 function="Inventory.DoCreate"
-                 parameter="gesture" />
-            </menu_item_call>
-            <menu
-             height="175"
-             label="New Clothes"
-             layout="topleft"
-             left_delta="0"
-             mouse_opaque="false"
-             name="New Clothes"
-             top_pad="514"
-             width="125">
-                <menu_item_call
-                 label="New Shirt"
-                 layout="topleft"
-                 name="New Shirt">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="shirt" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Pants"
-                 layout="topleft"
-                 name="New Pants">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="pants" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Shoes"
-                 layout="topleft"
-                 name="New Shoes">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="shoes" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Socks"
-                 layout="topleft"
-                 name="New Socks">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="socks" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Jacket"
-                 layout="topleft"
-                 name="New Jacket">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="jacket" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Skirt"
-                 layout="topleft"
-                 name="New Skirt">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="skirt" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Gloves"
-                 layout="topleft"
-                 name="New Gloves">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="gloves" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Undershirt"
-                 layout="topleft"
-                 name="New Undershirt">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="undershirt" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Underpants"
-                 layout="topleft"
-                 name="New Underpants">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="underpants" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Alpha"
-                 layout="topleft"
-                 name="New Alpha">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="alpha" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Tattoo"
-                 layout="topleft"
-                 name="New Tattoo">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="tattoo" />
-                </menu_item_call>
-            </menu>
-            <menu
-             height="85"
-             label="New Body Parts"
-             layout="topleft"
-             left_delta="0"
-             mouse_opaque="false"
-             name="New Body Parts"
-             top_pad="514"
-             width="118">
-                <menu_item_call
-                 label="New Shape"
-                 layout="topleft"
-                 name="New Shape">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="shape" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Skin"
-                 layout="topleft"
-                 name="New Skin">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="skin" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Hair"
-                 layout="topleft"
-                 name="New Hair">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="hair" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Eyes"
-                 layout="topleft"
-                 name="New Eyes">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="eyes" />
-                </menu_item_call>
-            </menu>
-        </menu>
-        <menu
-         height="49"
-         label="Sort"
-         layout="topleft"
-         left="0"
-         mouse_opaque="false"
-         name="Sort"
-         tear_off="true"
-         top="-113"
-         width="118">
-            <menu_item_check
-             control_name="Inventory.SortByName"
-             label="By Name"
-             layout="topleft"
-             name="By Name">
-                <menu_item_check.on_click
-                 function="Inventory.SetSortBy"
-                 parameter="name" />
-            </menu_item_check>
-            <menu_item_check
-             control_name="Inventory.SortByDate"
-             label="By Date"
-             layout="topleft"
-             name="By Date">
-                <menu_item_check.on_click
-                 function="Inventory.SetSortBy"
-                 parameter="date" />
-            </menu_item_check>
-            <menu_item_separator
-             layout="topleft" />
-            <menu_item_check
-             control_name="Inventory.FoldersAlwaysByName"
-             label="Folders Always By Name"
-             layout="topleft"
-             name="Folders Always By Name">
-                <menu_item_check.on_click
-                 function="Inventory.SetSortBy"
-                 parameter="foldersalwaysbyname" />
-            </menu_item_check>
-            <menu_item_check
-             control_name="Inventory.SystemFoldersToTop"
-             label="System Folders To Top"
-             layout="topleft"
-             name="System Folders To Top">
-                <menu_item_check.on_click
-                 function="Inventory.SetSortBy"
-                 parameter="systemfolderstotop" />
-            </menu_item_check>
-        </menu>
-    </menu_bar>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ follows="all"
+ height="400"
+ label="Things"
+ layout="topleft"
+ min_height="350"
+ min_width="240"
+ name="main inventory panel"
+ width="330">
+    <panel.string
+     name="Title">
+        Things
+    </panel.string>
+    <filter_editor
+     text_pad_left="12"
+     follows="left|top|right"
+	 font="SanSerif"
+     height="20"
+     label="Filter"
+     layout="topleft"
+     left="15"
+     name="inventory search editor"
+     top="34"
+     width="300" />
+    <tab_container
+     follows="left|top|right|bottom"
+     height="300"
+     layout="topleft"
+     left_delta="-4"
+     name="inventory filter tabs"
+     tab_position="top"
+     top_pad="4"
+     width="305">
+        <inventory_panel
+         follows="left|top|right|bottom"
+         height="295"
+         label="All Items"
+         layout="topleft"
+         left="1"
+         name="All Items"
+         top="16"
+         width="290" />
+        <inventory_panel
+         follows="left|top|right|bottom"
+         height="295"
+         label="Recent Items"
+         layout="topleft"
+         left_delta="0"
+         name="Recent Items"
+         top_delta="0"
+         width="290" />
+    </tab_container>
+
+    <panel
+     background_visible="true"
+     bevel_style="none"
+     bottom="0"
+     follows="left|right|bottom"
+     height="30"
+     layout="bottomleft"
+     left="0"
+	 visible="true"
+     name="bottom_panel"
+     width="330">
+        <button
+         follows="bottom|left"
+         tool_tip="Show additional options"
+         height="18"
+         image_disabled="OptionsMenu_Disabled"
+         image_selected="OptionsMenu_Press"
+         image_unselected="OptionsMenu_Off"
+         layout="topleft"
+         left="10"
+         name="options_gear_btn"
+         picture_style="true"
+         top="6"
+         width="18" />
+        <button
+         follows="bottom|left"
+         height="18"
+         image_selected="AddItem_Press"
+         image_unselected="AddItem_Off"
+         image_disabled="AddItem_Disabled"
+         layout="topleft"
+         left_pad="5"
+         name="add_btn"
+         picture_style="true"
+         tool_tip="Add new item"
+         width="18" />
+        <dnd_button
+         follows="bottom|right"
+         height="18"
+         image_selected="TrashItem_Press"
+         image_unselected="TrashItem_Off"
+         layout="topleft"
+         right="-5"
+         name="trash_btn"
+         picture_style="true"
+         tool_tip="Remove selected item"
+         top="6"
+         width="18" />
+    </panel>
+
+    <menu_bar
+     bg_visible="false"
+     follows="left|top|right"
+     height="18"
+     layout="topleft"
+     left_delta="0"
+     mouse_opaque="false"
+     name="Inventory Menu"
+     top="15"
+	 visible="true"
+     width="290">
+        <menu
+         height="101"
+         label="File"
+         layout="topleft"
+         left="0"
+         mouse_opaque="false"
+         name="File"
+         tear_off="true"
+         top="-117"
+         width="128">
+            <menu_item_call
+             label="Open"
+             layout="topleft"
+             name="Open">
+                <menu_item_call.on_click
+                 function="Inventory.DoToSelected"
+                 parameter="open" />
+            </menu_item_call>
+            <menu
+             create_jump_keys="true"
+             label="Upload"
+             layout="topleft"
+             name="upload"
+             tear_off="true">
+                <menu_item_call
+                 label="Image (L$[COST])..."
+                 layout="topleft"
+                 name="Upload Image"
+                 shortcut="control|U">
+                    <menu_item_call.on_click
+                     function="File.UploadImage"
+                     parameter="" />
+                    <menu_item_call.on_enable
+                     function="File.EnableUpload" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Sound (L$[COST])..."
+                 layout="topleft"
+                 name="Upload Sound">
+                    <menu_item_call.on_click
+                     function="File.UploadSound"
+                     parameter="" />
+                    <menu_item_call.on_enable
+                     function="File.EnableUpload" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Animation (L$[COST])..."
+                 layout="topleft"
+                 name="Upload Animation">
+                    <menu_item_call.on_click
+                     function="File.UploadAnim"
+                     parameter="" />
+                    <menu_item_call.on_enable
+                     function="File.EnableUpload" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Bulk (L$[COST] per file)..."
+                 layout="topleft"
+                 name="Bulk Upload">
+                    <menu_item_call.on_click
+                     function="File.UploadBulk"
+                     parameter="" />
+                </menu_item_call>
+                <menu_item_separator
+                 layout="topleft" />
+            </menu>
+            <menu_item_separator
+             layout="topleft" />
+            <menu_item_call
+             label="New Window"
+             layout="topleft"
+             name="New Window">
+                <menu_item_call.on_click
+                 function="Inventory.NewWindow" />
+            </menu_item_call>
+            <menu_item_separator
+             layout="topleft"
+             name="separator2" />
+            <menu_item_call
+             label="Show Filters"
+             layout="topleft"
+             name="Show Filters">
+                <menu_item_call.on_click
+                 function="Inventory.ShowFilters" />
+            </menu_item_call>
+            <menu_item_call
+             label="Reset Filters"
+             layout="topleft"
+             name="Reset Current">
+                <menu_item_call.on_click
+                 function="Inventory.ResetFilter" />
+            </menu_item_call>
+            <menu_item_call
+             label="Close All Folders"
+             layout="topleft"
+             name="Close All Folders">
+                <menu_item_call.on_click
+                 function="Inventory.CloseAllFolders" />
+            </menu_item_call>
+            <menu_item_separator
+             layout="topleft"
+             name="separator3" />
+            <menu_item_call
+             label="Empty Trash"
+             layout="topleft"
+             name="Empty Trash">
+                <menu_item_call.on_click
+                 function="Inventory.EmptyTrash" />
+            </menu_item_call>
+            <menu_item_call
+             label="Empty Lost And Found"
+             layout="topleft"
+             name="Empty Lost And Found">
+                <menu_item_call.on_click
+                 function="Inventory.EmptyLostAndFound" />
+            </menu_item_call>
+        </menu>
+        <menu
+         height="121"
+         label="Create"
+         layout="topleft"
+         left="0"
+         mouse_opaque="false"
+         name="Create"
+         tear_off="true"
+         top="-201"
+         width="121">
+            <menu_item_call
+             label="New Folder"
+             layout="topleft"
+             name="New Folder">
+                <menu_item_call.on_click
+                 function="Inventory.DoCreate"
+                 parameter="category" />
+            </menu_item_call>
+            <menu_item_call
+             label="New Script"
+             layout="topleft"
+             name="New Script">
+                <menu_item_call.on_click
+                 function="Inventory.DoCreate"
+                 parameter="lsl" />
+            </menu_item_call>
+            <menu_item_call
+             label="New Note"
+             layout="topleft"
+             name="New Note">
+                <menu_item_call.on_click
+                 function="Inventory.DoCreate"
+                 parameter="notecard" />
+            </menu_item_call>
+            <menu_item_call
+             label="New Gesture"
+             layout="topleft"
+             name="New Gesture">
+                <menu_item_call.on_click
+                 function="Inventory.DoCreate"
+                 parameter="gesture" />
+            </menu_item_call>
+            <menu
+             height="175"
+             label="New Clothes"
+             layout="topleft"
+             left_delta="0"
+             mouse_opaque="false"
+             name="New Clothes"
+             top_pad="514"
+             width="125">
+                <menu_item_call
+                 label="New Shirt"
+                 layout="topleft"
+                 name="New Shirt">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="shirt" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Pants"
+                 layout="topleft"
+                 name="New Pants">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="pants" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Shoes"
+                 layout="topleft"
+                 name="New Shoes">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="shoes" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Socks"
+                 layout="topleft"
+                 name="New Socks">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="socks" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Jacket"
+                 layout="topleft"
+                 name="New Jacket">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="jacket" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Skirt"
+                 layout="topleft"
+                 name="New Skirt">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="skirt" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Gloves"
+                 layout="topleft"
+                 name="New Gloves">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="gloves" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Undershirt"
+                 layout="topleft"
+                 name="New Undershirt">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="undershirt" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Underpants"
+                 layout="topleft"
+                 name="New Underpants">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="underpants" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Alpha"
+                 layout="topleft"
+                 name="New Alpha">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="alpha" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Tattoo"
+                 layout="topleft"
+                 name="New Tattoo">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="tattoo" />
+                </menu_item_call>
+            </menu>
+            <menu
+             height="85"
+             label="New Body Parts"
+             layout="topleft"
+             left_delta="0"
+             mouse_opaque="false"
+             name="New Body Parts"
+             top_pad="514"
+             width="118">
+                <menu_item_call
+                 label="New Shape"
+                 layout="topleft"
+                 name="New Shape">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="shape" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Skin"
+                 layout="topleft"
+                 name="New Skin">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="skin" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Hair"
+                 layout="topleft"
+                 name="New Hair">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="hair" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Eyes"
+                 layout="topleft"
+                 name="New Eyes">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="eyes" />
+                </menu_item_call>
+            </menu>
+        </menu>
+        <menu
+         height="49"
+         label="Sort"
+         layout="topleft"
+         left="0"
+         mouse_opaque="false"
+         name="Sort"
+         tear_off="true"
+         top="-113"
+         width="118">
+            <menu_item_check
+             control_name="Inventory.SortByName"
+             label="By Name"
+             layout="topleft"
+             name="By Name">
+                <menu_item_check.on_click
+                 function="Inventory.SetSortBy"
+                 parameter="name" />
+            </menu_item_check>
+            <menu_item_check
+             control_name="Inventory.SortByDate"
+             label="By Date"
+             layout="topleft"
+             name="By Date">
+                <menu_item_check.on_click
+                 function="Inventory.SetSortBy"
+                 parameter="date" />
+            </menu_item_check>
+            <menu_item_separator
+             layout="topleft" />
+            <menu_item_check
+             control_name="Inventory.FoldersAlwaysByName"
+             label="Folders Always By Name"
+             layout="topleft"
+             name="Folders Always By Name">
+                <menu_item_check.on_click
+                 function="Inventory.SetSortBy"
+                 parameter="foldersalwaysbyname" />
+            </menu_item_check>
+            <menu_item_check
+             control_name="Inventory.SystemFoldersToTop"
+             label="System Folders To Top"
+             layout="topleft"
+             name="System Folders To Top">
+                <menu_item_check.on_click
+                 function="Inventory.SetSortBy"
+                 parameter="systemfolderstotop" />
+            </menu_item_check>
+        </menu>
+    </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
index 377d34cdcc0..b8b3d993bd1 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -1,127 +1,127 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
-	  background_visible="true"
-	  follows="all"
-	  height="570"
-	  label="Things"
-	  layout="topleft"
-	  min_height="350"
-	  min_width="240"
-	  name="objects panel"
-	  width="333">
-	 <panel
-		 follows="all"
-		 layout="topleft"
-		 left="0"
-		 name="sidepanel__inventory_panel"
-		 top="0"
-		 label=""
-		 height="570"
-		 visible="true"
-		 width="330">
-		<panel
-			 class="panel_main_inventory"
-			 filename="panel_main_inventory.xml"
-			 follows="all"
-			 layout="topleft"
-			 left="0"
-			 name="panel_main_inventory"
-			 top="0"
-			 label=""
-			 height="500"
-			 width="330" />
-		<panel
-			 height="25"
-			 layout="bottomright"
-			 help_topic="item_button_tab"
-			 name="button_panel"
-			 left="5"
-			 bottom="5"
-			 width="313">
-			<button
-				 enabled="true"
-				 follows="bottom|left"
-				 font="SansSerifSmall"
-				 height="25"
-				 label="Info"
-				 layout="topleft"
-				 left="0"
-				 name="info_btn"
-				 top="0"
-				 width="60" />
-			<button
-				 enabled="true"
-				 follows="bottom|left"
-				 font="SansSerifSmall"
-				 height="25"
-				 label="Share"
-				 layout="topleft"
-				 left_pad="5"
-				 name="share_btn"
-				 top="0"
-				 width="60" />
-			<button
-				 enabled="false"
-				 follows="bottom|left"
-				 font="SansSerifSmall"
-				 height="25"
-				 label="Wear"
-				 layout="topleft"
-				 left="130"
-				 name="wear_btn"
-				 top="0"
-				 width="60" />
-			<button
-				 enabled="false"
-				 follows="bottom|left"
-				 font="SansSerifSmall"
-				 height="25"
-				 label="Play"
-				 layout="topleft"
-				 name="play_btn"
-				 left="130"
-				 top="0"
-				 width="50" />
-			<button
-				 enabled="false"
-				 follows="bottom|left"
-				 font="SansSerifSmall"
-				 height="25"
-				 label="Teleport"
-				 layout="topleft"
-				 left="130"
-				 name="teleport_btn"
-				 top="0"
-				 width="77" />
-		</panel>
-	</panel>
-
-	<panel
-		 follows="all"
-		 layout="topleft"
-		 left="0"
-		 class="sidepanel_item_info"
-		 filename="sidepanel_item_info.xml"
-		 name="sidepanel__item_panel"
-		 top="0"
-		 label=""
-		 height="570"
-		 visible="false"
-		 width="330">
-	</panel>
-
-	<panel
-		 follows="all"
-		 layout="topleft"
-		 left="0"
-		 class="sidepanel_task_info"
-		 filename="sidepanel_task_info.xml"
-		 name="sidepanel__task_panel"
-		 top="0"
-		 label=""
-		 height="570"
-		 visible="false"
-		 width="330">
-	</panel>
-
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+	  background_visible="true"
+	  follows="all"
+	  height="570"
+	  label="Things"
+	  layout="topleft"
+	  min_height="350"
+	  min_width="240"
+	  name="objects panel"
+	  width="333">
+	 <panel
+		 follows="all"
+		 layout="topleft"
+		 left="0"
+		 name="sidepanel__inventory_panel"
+		 top="0"
+		 label=""
+		 height="570"
+		 visible="true"
+		 width="330">
+		<panel
+			 class="panel_main_inventory"
+			 filename="panel_main_inventory.xml"
+			 follows="all"
+			 layout="topleft"
+			 left="0"
+			 name="panel_main_inventory"
+			 top="0"
+			 label=""
+			 height="500"
+			 width="330" />
+		<panel
+			 height="25"
+			 layout="bottomright"
+			 help_topic="item_button_tab"
+			 name="button_panel"
+			 left="5"
+			 bottom="5"
+			 width="313">
+			<button
+				 enabled="true"
+				 follows="bottom|left"
+				 font="SansSerifSmall"
+				 height="25"
+				 label="Info"
+				 layout="topleft"
+				 left="0"
+				 name="info_btn"
+				 top="0"
+				 width="60" />
+			<button
+				 enabled="true"
+				 follows="bottom|left"
+				 font="SansSerifSmall"
+				 height="25"
+				 label="Share"
+				 layout="topleft"
+				 left_pad="5"
+				 name="share_btn"
+				 top="0"
+				 width="60" />
+			<button
+				 enabled="false"
+				 follows="bottom|left"
+				 font="SansSerifSmall"
+				 height="25"
+				 label="Wear"
+				 layout="topleft"
+				 left="130"
+				 name="wear_btn"
+				 top="0"
+				 width="60" />
+			<button
+				 enabled="false"
+				 follows="bottom|left"
+				 font="SansSerifSmall"
+				 height="25"
+				 label="Play"
+				 layout="topleft"
+				 name="play_btn"
+				 left="130"
+				 top="0"
+				 width="50" />
+			<button
+				 enabled="false"
+				 follows="bottom|left"
+				 font="SansSerifSmall"
+				 height="25"
+				 label="Teleport"
+				 layout="topleft"
+				 left="130"
+				 name="teleport_btn"
+				 top="0"
+				 width="77" />
+		</panel>
+	</panel>
+
+	<panel
+		 follows="all"
+		 layout="topleft"
+		 left="0"
+		 class="sidepanel_item_info"
+		 filename="sidepanel_item_info.xml"
+		 name="sidepanel__item_panel"
+		 top="0"
+		 label=""
+		 height="570"
+		 visible="false"
+		 width="330">
+	</panel>
+
+	<panel
+		 follows="all"
+		 layout="topleft"
+		 left="0"
+		 class="sidepanel_task_info"
+		 filename="sidepanel_task_info.xml"
+		 name="sidepanel__task_panel"
+		 top="0"
+		 label=""
+		 height="570"
+		 visible="false"
+		 width="330">
+	</panel>
+
+</panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index 0c605650fc9..6ae24773041 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -1,511 +1,511 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
-	 auto_tile="true"
-	 height="570"
-	 layout="topleft"
-	 name="item properties"
-	 help_topic="item_properties"
-	 save_rect="true"
-	 title="Inventory Item Properties"
-	 width="333">
-	<panel.string
-		 name="unknown">
-        (unknown)
-	</panel.string>
-	<panel.string
-		 name="public">
-        (public)
-    </panel.string>
-	<panel.string
-    	 name="you_can">
-        You can:
-    </panel.string>
-	<panel.string
-    	 name="owner_can">
-        Owner can:
-    </panel.string>
-	<panel.string
-    	 name="acquiredDate">
-        [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
-	</panel.string>
-	<icon
-     	 follows="top|right"
-     	 height="18"
-     	 image_name="Lock"
-	     layout="topleft"
-		 right="-50"
-	     mouse_opaque="true"
-	     name="IconLocked"
-	     top="4"
-	     width="18" />
-    <button
-	     follows="top|right"
-	     height="25"
-	     image_overlay="BackArrow_Off"
-	     layout="topleft"
-	     name="back_btn"
-	     picture_style="true"
-	     right="-5"
-	     tab_stop="false"
-	     top="0"
-	     width="25" />
-	<panel
-         follows="all"
-         height="500"
-         label=""
-         layout="topleft"
-         left="5"
-         help_topic=""
-         top="30"
-		 border="1"
-         width="313">
-	    <text	 	 	 
-		     type="string"
-		     length="1"
-		     follows="left|top"
-		     height="10"
-		     layout="topleft"
-		     left="5"
-		     name="LabelItemNameTitle"
-		     top="5"
-		     width="78">
-	        Name:
-	    </text>
-    	<line_editor
-		     border_style="line"
-		     border_thickness="1"
-	    	 follows="left|top|right"
-		     height="16"
-		     layout="topleft"
-	    	 left_delta="78"
-		     max_length="63"
-		     name="LabelItemName"
-	    	 top_delta="0"
-		     width="225" />
-	    <text
-		     type="string"
-		     length="1"
-	    	 follows="left|top"
-	    	 height="10"
-		     layout="topleft"
-    		 left="5"
-		     name="LabelItemDescTitle"
-    		 top_delta="20"
-	    	 width="78">
-	        Description:
-	    </text>
-	    <line_editor
-		     border_style="line"
-    		 border_thickness="1"
-	    	 follows="left|top|right"
-	    	 height="16"
-		     layout="topleft"
-    		 left_delta="78"
-		     max_length="127"
-    		 name="LabelItemDesc"
-	    	 top_delta="0"
-	    	 width="225" />
-	    <text
-		     type="string"
-		     length="1"
-		     follows="left|top"
-		     height="16"
-		     layout="topleft"
-		     left="10"
-		     name="LabelCreatorTitle"
-		     top="65"
-		     width="78">
-	        Creator:
-    	</text>
-	    <text
-		     type="string"
-		     length="1"
-		     follows="left|top"
-		     height="16"
-		     layout="topleft"
-		     left_delta="78"
-		     name="LabelCreatorName"
-		     top_delta="0"
-		     width="200">
-	        Nicole Linden
-	     </text>
-	     <button
-			 follows="top|right"
-			 font="SansSerifSmall"
-			 height="16"
-			 label="Profile..."
-			 layout="topleft"
-			 left_delta="144"
-			 name="BtnCreator"
-			 top_delta="0"
-			 width="78" />
-	     <text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="16"
-			 layout="topleft"
-			 left="10"
-			 name="LabelOwnerTitle"
-			 top="85"
-			 width="78">
-			    Owner:
-	     </text>
-	     <text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="16"
-			 layout="topleft"
-			 left_delta="78"
-			 name="LabelOwnerName"
-			 top_delta="0"
-			 width="200">
-			    Thrax Linden
-	     </text>
-	     <button
-			 follows="top|right"
-			 font="SansSerifSmall"
-			 height="16"
-			 label="Profile..."
-			 layout="topleft"
-			 left_delta="144"
-			 name="BtnOwner"
-			 top_delta="0"
-			 width="78" />
-	     <text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="16"
-			 layout="topleft"
-			 left="10"
-			 name="LabelAcquiredTitle"
-			 top="105"
-			 width="78">
-			Acquired:
-	     </text>
-	     <text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="16"
-			 layout="topleft"
-			 left_delta="78"
-			 name="LabelAcquiredDate"
-			 top_delta="0"
-			 width="252">
-			Wed May 24 12:50:46 2006
-	    </text>
-	    <text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="10"
-			 layout="topleft"
-			 left="10"
-			 name="OwnerLabel"
-			 top="125"
-			 width="78">
-			You:
-	    </text>
-	    <check_box
-			 height="16"
-			 label="Edit"
-			 layout="topleft"
-			 left_pad="5"
-			 name="CheckOwnerModify"
-			 top_delta="0"
-			 width="78" />
-	    <check_box
-			 height="16"
-			 label="Copy"
-			 layout="topleft"
-			 left_delta="0"
-			 name="CheckOwnerCopy"
-			 top_pad="5"
-			 width="88" />
-	    <check_box
-			 height="16"
-			 label="Resell"
-			 layout="topleft"
-			 left_delta="0"
-			 name="CheckOwnerTransfer"
-			 top_pad="5"
-			 width="106" />
-	    <text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="10"
-			 layout="topleft"
-			 left="10"
-			 name="AnyoneLabel"
-			 top_pad="5"
-			 width="78">
-			Anyone:
-	    </text>
-	    <check_box
-			 height="16"
-			 label="Copy"
-			 layout="topleft"
-			 left_pad="5"
-			 name="CheckEveryoneCopy"
-			 top_delta="0"
-			 width="130" />
-    	<text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="10"
-			 layout="topleft"
-			 left="10"
-			 name="GroupLabel"
-			 top_pad="5"
-			 width="78">
-			Group:
-    	</text>
-	    <check_box
-			 height="16"
-			 label="Share"
-			 layout="topleft"
-			 left_pad="5"
-			 name="CheckShareWithGroup"
-			 top_delta="5"
-			 width="106" />
-	    <text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="10"
-			 layout="topleft"
-			 left="10"
-			 name="NextOwnerLabel"
-			 top_pad="5"
-			 width="78">
-			Next owner:
-	    </text>
-	    <check_box
-			 height="16"
-			 label="Edit"
-			 layout="topleft"
-			 left_pad="5"
-			 name="CheckNextOwnerModify"
-			 top_delta="0"
-			 width="78" />
-	    <check_box
-			 height="16"
-			 label="Copy"
-			 layout="topleft"
-			 left_delta="0"
-			 name="CheckNextOwnerCopy"
-			 top_pad="5"
-			 width="88" />
-	    <check_box
-			 height="16"
-			 label="Resell"
-			 layout="topleft"
-			 left_delta="0"
-			 name="CheckNextOwnerTransfer"
-			 top_pad="5"
-			 width="106" />
-	    <check_box
-			 height="16"
-			 label="For Sale"
-			 layout="topleft"
-			 left="10"
-			 name="CheckPurchase"
-			 top_pad="5"
-			 width="78" />
-		<combo_box
-			 height="19"
-			 left_pad="5"
-			 layout="topleft"
-			 follows="left|top"
-			 name="combobox sale copy"
-			 width="90">
-			<combo_box.item
-			     label="Copy"
-			     name="Copy"
-			     value="Copy" />
-			<combo_box.item
-			     label="Original"
-			     name="Original"
-			     value="Original" />
-	    </combo_box>
-	    <spinner
-			    follows="left|top"
-			    decimal_digits="0"
-			    increment="1"
-			    control_name="Edit Cost"
-			    name="Edit Cost"
-			    label="Price: L$"
-			    label_width="60"
-			    left="10"
-			    width="180"
-			    min_val="1"
-			    height="19"
-			    max_val="999999999"
-			    top_pad="5"/>
-	    <!--line_editor
-			 border_style="line"
-			 border_thickness="1"
-			 follows="left|top|right"
-			 height="16"
-			 layout="topleft"
-			 left_pad="5"
-			 max_length="25"
-			 name="EditPrice"
-			 top_delta="0"
-			 width="242" /-->
-	    <!--text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="10"
-			 layout="topleft"
-			 left="10"
-			 name="BaseMaskDebug"
-			 top="155"
-			 width="330">
-			B:
-	    </text>
-	    <text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="10"
-			 layout="topleft"
-			 left_delta="60"
-			 name="OwnerMaskDebug"
-			 top_delta="0"
-			 width="270">
-			O:
-	    </text>
-	    <text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="10"
-			 layout="topleft"
-			 left_delta="60"
-			 name="GroupMaskDebug"
-			 top_delta="0"
-			 width="210">
-			G:
-	    </text>
-	    <text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="10"
-			 layout="topleft"
-			 left_delta="60"
-			 name="EveryoneMaskDebug"
-			 top_delta="0"
-			 width="150">
-			E:
-	    </text>
-	    <text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="10"
-			 layout="topleft"
-			 left_delta="60"
-			 name="NextMaskDebug"
-			 top_delta="0"
-			 width="90">
-			N:
-	    </text-->
-			    <!--text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="10"
-			 layout="topleft"
-			 left="10"
-			 name="SaleLabel"
-			 top_pad="5"
-			 width="330">
-			Mark Item:
-	    </text-->
-	    <!--radio_group
-			 draw_border="false"
-			 follows="left|top|right"
-			 height="16"
-			 layout="topleft"
-			 left_delta="78"
-			 name="RadioSaleType"
-			 top_delta="0"
-			 width="252">
-			    <radio_item
-			     height="16"
-			     label="Original"
-			     layout="topleft"
-			     left="0"
-			     name="radio"
-			     top="0"
-			     width="70" />
-			    <radio_item
-			     height="16"
-			     label="Copy"
-			     layout="topleft"
-			     left_delta="60"
-			     name="radio2"
-			     top_delta="0"
-			     width="70" />
-	    </radio_group-->
-	    <!--text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="16"
-			 layout="topleft"
-			 left="10"
-			 name="TextPrice"
-			 top_pad="5"
-			 width="78">
-			Price: L$
-	    </text-->
-	</panel>
-    <panel
-		 height="25"
-		 layout="bottomright"
-		 help_topic="button_tab"
-		 name="button_panel"
-		 left="5"
-		 bottom="5"
-		 width="313">
-	    <button
-		     follows="bottom|left"
-		     font="SansSerifSmall"
-		     height="25"
-		     label="Edit"
-		     layout="topleft"
-		     left="0"
-		     name="edit_btn"
-		     top="0"
-		     width="50" />
-	    <button
-		     follows="bottom|right"
-		     font="SansSerifSmall"
-		     height="25"
-		     label="Cancel"
-		     layout="topleft"
-		     name="cancel_btn"
-		     right="-1"
-		     top="0"
-		     width="70" />
-	    <button
-		     follows="bottom|right"
-		     font="SansSerifSmall"
-		     height="25"
-		     label="Save"
-		     layout="topleft"
-		     name="save_btn"
-		     left_pad="-135"
-		     top="0"
-		     width="60" />
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+	 auto_tile="true"
+	 height="570"
+	 layout="topleft"
+	 name="item properties"
+	 help_topic="item_properties"
+	 save_rect="true"
+	 title="Inventory Item Properties"
+	 width="333">
+	<panel.string
+		 name="unknown">
+        (unknown)
+	</panel.string>
+	<panel.string
+		 name="public">
+        (public)
+    </panel.string>
+	<panel.string
+    	 name="you_can">
+        You can:
+    </panel.string>
+	<panel.string
+    	 name="owner_can">
+        Owner can:
+    </panel.string>
+	<panel.string
+    	 name="acquiredDate">
+        [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+	</panel.string>
+	<icon
+     	 follows="top|right"
+     	 height="18"
+     	 image_name="Lock"
+	     layout="topleft"
+		 right="-50"
+	     mouse_opaque="true"
+	     name="IconLocked"
+	     top="4"
+	     width="18" />
+    <button
+	     follows="top|right"
+	     height="25"
+	     image_overlay="BackArrow_Off"
+	     layout="topleft"
+	     name="back_btn"
+	     picture_style="true"
+	     right="-5"
+	     tab_stop="false"
+	     top="0"
+	     width="25" />
+	<panel
+         follows="all"
+         height="500"
+         label=""
+         layout="topleft"
+         left="5"
+         help_topic=""
+         top="30"
+		 border="1"
+         width="313">
+	    <text	 	 	 
+		     type="string"
+		     length="1"
+		     follows="left|top"
+		     height="10"
+		     layout="topleft"
+		     left="5"
+		     name="LabelItemNameTitle"
+		     top="5"
+		     width="78">
+	        Name:
+	    </text>
+    	<line_editor
+		     border_style="line"
+		     border_thickness="1"
+	    	 follows="left|top|right"
+		     height="16"
+		     layout="topleft"
+	    	 left_delta="78"
+		     max_length="63"
+		     name="LabelItemName"
+	    	 top_delta="0"
+		     width="225" />
+	    <text
+		     type="string"
+		     length="1"
+	    	 follows="left|top"
+	    	 height="10"
+		     layout="topleft"
+    		 left="5"
+		     name="LabelItemDescTitle"
+    		 top_delta="20"
+	    	 width="78">
+	        Description:
+	    </text>
+	    <line_editor
+		     border_style="line"
+    		 border_thickness="1"
+	    	 follows="left|top|right"
+	    	 height="16"
+		     layout="topleft"
+    		 left_delta="78"
+		     max_length="127"
+    		 name="LabelItemDesc"
+	    	 top_delta="0"
+	    	 width="225" />
+	    <text
+		     type="string"
+		     length="1"
+		     follows="left|top"
+		     height="16"
+		     layout="topleft"
+		     left="10"
+		     name="LabelCreatorTitle"
+		     top="65"
+		     width="78">
+	        Creator:
+    	</text>
+	    <text
+		     type="string"
+		     length="1"
+		     follows="left|top"
+		     height="16"
+		     layout="topleft"
+		     left_delta="78"
+		     name="LabelCreatorName"
+		     top_delta="0"
+		     width="200">
+	        Nicole Linden
+	     </text>
+	     <button
+			 follows="top|right"
+			 font="SansSerifSmall"
+			 height="16"
+			 label="Profile..."
+			 layout="topleft"
+			 left_delta="144"
+			 name="BtnCreator"
+			 top_delta="0"
+			 width="78" />
+	     <text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="16"
+			 layout="topleft"
+			 left="10"
+			 name="LabelOwnerTitle"
+			 top="85"
+			 width="78">
+			    Owner:
+	     </text>
+	     <text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="16"
+			 layout="topleft"
+			 left_delta="78"
+			 name="LabelOwnerName"
+			 top_delta="0"
+			 width="200">
+			    Thrax Linden
+	     </text>
+	     <button
+			 follows="top|right"
+			 font="SansSerifSmall"
+			 height="16"
+			 label="Profile..."
+			 layout="topleft"
+			 left_delta="144"
+			 name="BtnOwner"
+			 top_delta="0"
+			 width="78" />
+	     <text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="16"
+			 layout="topleft"
+			 left="10"
+			 name="LabelAcquiredTitle"
+			 top="105"
+			 width="78">
+			Acquired:
+	     </text>
+	     <text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="16"
+			 layout="topleft"
+			 left_delta="78"
+			 name="LabelAcquiredDate"
+			 top_delta="0"
+			 width="252">
+			Wed May 24 12:50:46 2006
+	    </text>
+	    <text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="10"
+			 layout="topleft"
+			 left="10"
+			 name="OwnerLabel"
+			 top="125"
+			 width="78">
+			You:
+	    </text>
+	    <check_box
+			 height="16"
+			 label="Edit"
+			 layout="topleft"
+			 left_pad="5"
+			 name="CheckOwnerModify"
+			 top_delta="0"
+			 width="78" />
+	    <check_box
+			 height="16"
+			 label="Copy"
+			 layout="topleft"
+			 left_delta="0"
+			 name="CheckOwnerCopy"
+			 top_pad="5"
+			 width="88" />
+	    <check_box
+			 height="16"
+			 label="Resell"
+			 layout="topleft"
+			 left_delta="0"
+			 name="CheckOwnerTransfer"
+			 top_pad="5"
+			 width="106" />
+	    <text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="10"
+			 layout="topleft"
+			 left="10"
+			 name="AnyoneLabel"
+			 top_pad="5"
+			 width="78">
+			Anyone:
+	    </text>
+	    <check_box
+			 height="16"
+			 label="Copy"
+			 layout="topleft"
+			 left_pad="5"
+			 name="CheckEveryoneCopy"
+			 top_delta="0"
+			 width="130" />
+    	<text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="10"
+			 layout="topleft"
+			 left="10"
+			 name="GroupLabel"
+			 top_pad="5"
+			 width="78">
+			Group:
+    	</text>
+	    <check_box
+			 height="16"
+			 label="Share"
+			 layout="topleft"
+			 left_pad="5"
+			 name="CheckShareWithGroup"
+			 top_delta="5"
+			 width="106" />
+	    <text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="10"
+			 layout="topleft"
+			 left="10"
+			 name="NextOwnerLabel"
+			 top_pad="5"
+			 width="78">
+			Next owner:
+	    </text>
+	    <check_box
+			 height="16"
+			 label="Edit"
+			 layout="topleft"
+			 left_pad="5"
+			 name="CheckNextOwnerModify"
+			 top_delta="0"
+			 width="78" />
+	    <check_box
+			 height="16"
+			 label="Copy"
+			 layout="topleft"
+			 left_delta="0"
+			 name="CheckNextOwnerCopy"
+			 top_pad="5"
+			 width="88" />
+	    <check_box
+			 height="16"
+			 label="Resell"
+			 layout="topleft"
+			 left_delta="0"
+			 name="CheckNextOwnerTransfer"
+			 top_pad="5"
+			 width="106" />
+	    <check_box
+			 height="16"
+			 label="For Sale"
+			 layout="topleft"
+			 left="10"
+			 name="CheckPurchase"
+			 top_pad="5"
+			 width="78" />
+		<combo_box
+			 height="19"
+			 left_pad="5"
+			 layout="topleft"
+			 follows="left|top"
+			 name="combobox sale copy"
+			 width="90">
+			<combo_box.item
+			     label="Copy"
+			     name="Copy"
+			     value="Copy" />
+			<combo_box.item
+			     label="Original"
+			     name="Original"
+			     value="Original" />
+	    </combo_box>
+	    <spinner
+			    follows="left|top"
+			    decimal_digits="0"
+			    increment="1"
+			    control_name="Edit Cost"
+			    name="Edit Cost"
+			    label="Price: L$"
+			    label_width="60"
+			    left="10"
+			    width="180"
+			    min_val="1"
+			    height="19"
+			    max_val="999999999"
+			    top_pad="5"/>
+	    <!--line_editor
+			 border_style="line"
+			 border_thickness="1"
+			 follows="left|top|right"
+			 height="16"
+			 layout="topleft"
+			 left_pad="5"
+			 max_length="25"
+			 name="EditPrice"
+			 top_delta="0"
+			 width="242" /-->
+	    <!--text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="10"
+			 layout="topleft"
+			 left="10"
+			 name="BaseMaskDebug"
+			 top="155"
+			 width="330">
+			B:
+	    </text>
+	    <text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="10"
+			 layout="topleft"
+			 left_delta="60"
+			 name="OwnerMaskDebug"
+			 top_delta="0"
+			 width="270">
+			O:
+	    </text>
+	    <text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="10"
+			 layout="topleft"
+			 left_delta="60"
+			 name="GroupMaskDebug"
+			 top_delta="0"
+			 width="210">
+			G:
+	    </text>
+	    <text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="10"
+			 layout="topleft"
+			 left_delta="60"
+			 name="EveryoneMaskDebug"
+			 top_delta="0"
+			 width="150">
+			E:
+	    </text>
+	    <text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="10"
+			 layout="topleft"
+			 left_delta="60"
+			 name="NextMaskDebug"
+			 top_delta="0"
+			 width="90">
+			N:
+	    </text-->
+			    <!--text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="10"
+			 layout="topleft"
+			 left="10"
+			 name="SaleLabel"
+			 top_pad="5"
+			 width="330">
+			Mark Item:
+	    </text-->
+	    <!--radio_group
+			 draw_border="false"
+			 follows="left|top|right"
+			 height="16"
+			 layout="topleft"
+			 left_delta="78"
+			 name="RadioSaleType"
+			 top_delta="0"
+			 width="252">
+			    <radio_item
+			     height="16"
+			     label="Original"
+			     layout="topleft"
+			     left="0"
+			     name="radio"
+			     top="0"
+			     width="70" />
+			    <radio_item
+			     height="16"
+			     label="Copy"
+			     layout="topleft"
+			     left_delta="60"
+			     name="radio2"
+			     top_delta="0"
+			     width="70" />
+	    </radio_group-->
+	    <!--text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="16"
+			 layout="topleft"
+			 left="10"
+			 name="TextPrice"
+			 top_pad="5"
+			 width="78">
+			Price: L$
+	    </text-->
+	</panel>
+    <panel
+		 height="25"
+		 layout="bottomright"
+		 help_topic="button_tab"
+		 name="button_panel"
+		 left="5"
+		 bottom="5"
+		 width="313">
+	    <button
+		     follows="bottom|left"
+		     font="SansSerifSmall"
+		     height="25"
+		     label="Edit"
+		     layout="topleft"
+		     left="0"
+		     name="edit_btn"
+		     top="0"
+		     width="50" />
+	    <button
+		     follows="bottom|right"
+		     font="SansSerifSmall"
+		     height="25"
+		     label="Cancel"
+		     layout="topleft"
+		     name="cancel_btn"
+		     right="-1"
+		     top="0"
+		     width="70" />
+	    <button
+		     follows="bottom|right"
+		     font="SansSerifSmall"
+		     height="25"
+		     label="Save"
+		     layout="topleft"
+		     name="save_btn"
+		     left_pad="-135"
+		     top="0"
+		     width="60" />
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_profile.xml b/indra/newview/skins/default/xui/es/panel_edit_profile.xml
index bcf4128e01f..c12dd8d58c1 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_profile.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
-   <string name="CaptionTextAcctInfo">
-       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-   </string>
-   <string name="AcctTypeResident"
-    value="Residente" />
-   <string name="AcctTypeTrial"
-    value="Prueba" />
-   <string name="AcctTypeCharterMember"
-    value="Miembro fundador" />
-   <string name="AcctTypeEmployee"
-    value="Empleado de Linden Lab" />
-   <string name="PaymentInfoUsed"
-    value="Ha usado una forma de pago" />
-   <string name="PaymentInfoOnFile"
-    value="Hay infor. de la forma de pago" />
-   <string name="NoPaymentInfoOnFile"
-    value="Sin infor. de la forma de pago" />
-   <string name="AgeVerified"
-    value="Edad verificada" />
-   <string name="NotAgeVerified"
-    value="Edad no verificada" />
-   <string name="partner_edit_link_url">
-       http://www.secondlife.com/account/partners.php?lang=es
-   </string>
-    <panel name="scroll_content_panel">
-    <panel name="data_panel" >
-     <panel name="lifes_images_panel">
-          <panel name="second_life_image_panel">
-              <text name="second_life_photo_title_text">
-			[SECOND_LIFE]:
-              </text>
-          </panel>
-      </panel>
-        <text name="title_partner_text" value="Compañero/a:"/>
-        <panel name="partner_data_panel">
-            <text name="partner_text" value="[FIRST] [LAST]"/>
-         </panel>
-      <text name="text_box3">
-	Mensaje en el estado ocupado:
-      </text>
-    </panel>
-    </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="edit_profile_panel">
+   <string name="CaptionTextAcctInfo">
+       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+   </string>
+   <string name="AcctTypeResident"
+    value="Residente" />
+   <string name="AcctTypeTrial"
+    value="Prueba" />
+   <string name="AcctTypeCharterMember"
+    value="Miembro fundador" />
+   <string name="AcctTypeEmployee"
+    value="Empleado de Linden Lab" />
+   <string name="PaymentInfoUsed"
+    value="Ha usado una forma de pago" />
+   <string name="PaymentInfoOnFile"
+    value="Hay infor. de la forma de pago" />
+   <string name="NoPaymentInfoOnFile"
+    value="Sin infor. de la forma de pago" />
+   <string name="AgeVerified"
+    value="Edad verificada" />
+   <string name="NotAgeVerified"
+    value="Edad no verificada" />
+   <string name="partner_edit_link_url">
+       http://www.secondlife.com/account/partners.php?lang=es
+   </string>
+    <panel name="scroll_content_panel">
+    <panel name="data_panel" >
+     <panel name="lifes_images_panel">
+          <panel name="second_life_image_panel">
+              <text name="second_life_photo_title_text">
+			[SECOND_LIFE]:
+              </text>
+          </panel>
+      </panel>
+        <text name="title_partner_text" value="Compañero/a:"/>
+        <panel name="partner_data_panel">
+            <text name="partner_text" value="[FIRST] [LAST]"/>
+         </panel>
+      <text name="text_box3">
+	Mensaje en el estado ocupado:
+      </text>
+    </panel>
+    </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/floater_about.xml b/indra/newview/skins/default/xui/fr/floater_about.xml
index 8cd1ec4e09a..e442d09e4d2 100644
--- a/indra/newview/skins/default/xui/fr/floater_about.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about.xml
@@ -1,40 +1,40 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="A PROPOS DE [APP_NAME]">
-	<tab_container name="about_tab">
-		<panel label="Remerciements" name="credits_panel">
-			<text_editor name="credits_editor">
-				Second Life existe grâce aux efforts de Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl et de nombreuses autres personnes.
-
-  Tous nos remerciements aux résidents suivants pour avoir testé cette version (la meilleure qui soit jusqu&apos;à présent) :  able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
-
-
-
-  Pour réussir dans les affaires, soyez audacieux, créatif et différent. - Henry Marchant
-			</text_editor>
-		</panel>
-		<panel label="Licences" name="licenses_panel">
-			<text_editor name="credits_editor">
-				3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
-  APR Copyright (C) 2000-2004 The Apache Software Foundation
-  cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
-  expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
-  FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
-  GL Copyright (C) 1999-2004 Brian Paul.
-  Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
-  jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
-  jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
-  ogg/vorbis Copyright (C) 2001, Xiphophorus
-  OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
-  SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
-  SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-  xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-  zlib Copyright (C) 1995-2002 Jean-loup Gailly et Mark Adler.
-  google-perftools Copyright (c) 2005, Google Inc.
-  
-  Tous droits réservés.  Voir licenses.txt pour plus de détails.
-
-  Codage Audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
-			</text_editor>
-		</panel>
-	</tab_container>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="A PROPOS DE [APP_NAME]">
+	<tab_container name="about_tab">
+		<panel label="Remerciements" name="credits_panel">
+			<text_editor name="credits_editor">
+				Second Life existe grâce aux efforts de Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl et de nombreuses autres personnes.
+
+  Tous nos remerciements aux résidents suivants pour avoir testé cette version (la meilleure qui soit jusqu&apos;à présent) :  able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
+
+
+
+  Pour réussir dans les affaires, soyez audacieux, créatif et différent. - Henry Marchant
+			</text_editor>
+		</panel>
+		<panel label="Licences" name="licenses_panel">
+			<text_editor name="credits_editor">
+				3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
+  APR Copyright (C) 2000-2004 The Apache Software Foundation
+  cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
+  expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
+  FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
+  GL Copyright (C) 1999-2004 Brian Paul.
+  Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
+  jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
+  jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
+  ogg/vorbis Copyright (C) 2001, Xiphophorus
+  OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
+  SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+  SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+  xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+  zlib Copyright (C) 1995-2002 Jean-loup Gailly et Mark Adler.
+  google-perftools Copyright (c) 2005, Google Inc.
+  
+  Tous droits réservés.  Voir licenses.txt pour plus de détails.
+
+  Codage Audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+			</text_editor>
+		</panel>
+	</tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_about_land.xml b/indra/newview/skins/default/xui/fr/floater_about_land.xml
index d1aea074e6a..e2a567ff288 100644
--- a/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -1,480 +1,480 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterland" title="À PROPOS DU TERRAIN">
-	<floater.string name="Minutes">
-		[MINUTES] minutes
-	</floater.string>
-	<floater.string name="Minute">
-		minute
-	</floater.string>
-	<floater.string name="Seconds">
-		[SECONDS] secondes
-	</floater.string>
-	<tab_container name="landtab">
-		<panel label="Général" name="land_general_panel">
-			<panel.string name="new users only">
-				Nouveaux utilisateurs uniquement
-			</panel.string>
-			<panel.string name="anyone">
-				Tout le monde
-			</panel.string>
-			<panel.string name="area_text">
-				Surface
-			</panel.string>
-			<panel.string name="area_size_text">
-				[AREA] m²
-			</panel.string>
-			<panel.string name="auction_id_text">
-				Code de l&apos;enchère : [ID]
-			</panel.string>
-			<panel.string name="need_tier_to_modify">
-				Pour modifier ce terrain, vous devez approuver votre achat.
-			</panel.string>
-			<panel.string name="group_owned_text">
-				(propriété du groupe)
-			</panel.string>
-			<panel.string name="profile_text">
-				Profil...
-			</panel.string>
-			<panel.string name="info_text">
-				Infos...
-			</panel.string>
-			<panel.string name="public_text">
-				(public)
-			</panel.string>
-			<panel.string name="none_text">
-				(aucun)
-			</panel.string>
-			<panel.string name="sale_pending_text">
-				(vente en cours)
-			</panel.string>
-			<panel.string name="no_selection_text">
-				Aucune parcelle sélectionnée.
-Allez dans le menu Monde &gt; À propos du terrain ou sélectionnez une autre parcelle pour en afficher les détails.
-			</panel.string>
-			<text name="Name:">
-				Nom :
-			</text>
-			<line_editor name="Name"/>
-			<text name="Description:">
-				Description :
-			</text>
-			<text_editor name="Description"/>
-			<text name="LandType">
-				Type :
-			</text>
-			<text name="LandTypeText">
-				Continent / Homestead
-			</text>
-			<text name="ContentRating">
-				Catégorie :
-			</text>
-			<text name="ContentRatingText">
-				Adult
-			</text>
-			<text name="Owner:">
-				Propriétaire :
-			</text>
-			<text name="OwnerText">
-				Leyla Linden
-			</text>
-			<button label="Profil..." label_selected="Profil..." name="Profile..."/>
-			<text name="Group:">
-				Groupe :
-			</text>
-			<text name="GroupText"/>
-			<button label="Définir..." label_selected="Définir..." name="Set..."/>
-			<check_box label="Autoriser la cession au groupe" name="check deed" tool_tip="Un officier peut céder ce terrain au groupe. Il viendra alors s&apos;ajouter au patrimoine du groupe."/>
-			<button label="Céder..." label_selected="Céder..." name="Deed..." tool_tip="Vous ne pouvez céder le terrain que si vous avez un rôle d&apos;officier dans le groupe sélectionné."/>
-			<check_box label="Le propriétaire contribue en cédant du terrain" name="check contrib" tool_tip="Lorsqu&apos;un terrain est cédé au groupe, l&apos;ancien propriétaire fait également un don de terrain suffisant."/>
-			<text name="For Sale:">
-				À vendre :
-			</text>
-			<text name="Not for sale.">
-				Pas à vendre
-			</text>
-			<text name="For Sale: Price L$[PRICE].">
-				Prix : [PRICE] L$ ([PRICE_PER_SQM] L$/m²).
-			</text>
-			<text name="SalePending"/>
-			<button label="Vendre le terrain..." label_selected="Vendre le terrain..." name="Sell Land..."/>
-			<text name="For sale to">
-				À vendre à : [BUYER]
-			</text>
-			<text name="Sell with landowners objects in parcel.">
-				Objets inclus dans la vente.
-			</text>
-			<text name="Selling with no objects in parcel.">
-				Objets non inclus dans la vente.
-			</text>
-			<button label="Annuler la vente du terrain" label_selected="Annuler la vente du terrain" left="275" name="Cancel Land Sale" width="165"/>
-			<text name="Claimed:">
-				Acquis :
-			</text>
-			<text name="DateClaimText">
-				Tue Aug 15 13:47:25 2006
-			</text>
-			<text name="PriceLabel">
-				Superficie :
-			</text>
-			<text name="PriceText">
-				4048 m²
-			</text>
-			<text name="Traffic:">
-				Trafic :
-			</text>
-			<text name="DwellText">
-				0
-			</text>
-			<button label="Acheter le terrain..." label_selected="Acheter le terrain..." left="130" name="Buy Land..." width="125"/>
-			<button label="Acheter pour le groupe..." label_selected="Acheter pour le groupe..." name="Buy For Group..."/>
-			<button label="Acheter un pass..." label_selected="Acheter un pass..." left="130" name="Buy Pass..." tool_tip="Un pass vous donne un accès temporaire à ce terrain." width="125"/>
-			<button label="Abandonner le terrain..." label_selected="Abandonner le terrain..." name="Abandon Land..."/>
-			<button label="Redemander le terrain..." label_selected="Redemander le terrain…" name="Reclaim Land..."/>
-			<button label="Vente Linden..." label_selected="Vente Linden..." name="Linden Sale..." tool_tip="Le terrain doit être la propriété d&apos;un résident, avoir un contenu défini et ne pas être aux enchères."/>
-		</panel>
-		<panel label="Règlement" name="land_covenant_panel">
-			<panel.string name="can_resell">
-				Le terrain acheté dans cette région peut être revendu.
-			</panel.string>
-			<panel.string name="can_not_resell">
-				Le terrain acheté dans cette région ne peut pas être revendu.
-			</panel.string>
-			<panel.string name="can_change">
-				Le terrain acheté dans cette région peut être fusionné
-ou divisé.
-			</panel.string>
-			<panel.string name="can_not_change">
-				Le terrain acheté dans cette région ne peut pas être fusionné
-ou divisé.
-			</panel.string>
-			<text name="estate_section_lbl">
-				Domaine :
-			</text>
-			<text name="estate_name_lbl">
-				Nom :
-			</text>
-			<text name="estate_name_text">
-				continent
-			</text>
-			<text name="estate_owner_lbl">
-				Propriétaire :
-			</text>
-			<text name="estate_owner_text">
-				(aucun)
-			</text>
-			<text_editor name="covenant_editor">
-				Il n&apos;y a aucun règlement pour ce domaine.
-			</text_editor>
-			<text name="covenant_timestamp_text">
-				Last Modified Wed Dec 31 16:00:00 1969
-			</text>
-			<text name="region_section_lbl">
-				Région :
-			</text>
-			<text name="region_name_lbl">
-				Nom :
-			</text>
-			<text name="region_name_text">
-				leyla
-			</text>
-			<text name="region_landtype_lbl">
-				Type :
-			</text>
-			<text name="region_landtype_text">
-				Continent / Homestead
-			</text>
-			<text name="region_maturity_lbl">
-				Catégorie :
-			</text>
-			<text name="region_maturity_text">
-				Adult
-			</text>
-			<text name="resellable_lbl">
-				Revendre :
-			</text>
-			<text name="resellable_clause">
-				Le terrain dans cette région ne peut être revendu.
-			</text>
-			<text name="changeable_lbl">
-				Sous-diviser :
-			</text>
-			<text name="changeable_clause">
-				Le terrain dans cette région ne peut être fusionné/divisé.
-			</text>
-		</panel>
-		<panel label="Objets" name="land_objects_panel">
-			<panel.string name="objects_available_text">
-				[COUNT] sur [MAX] ([AVAILABLE] disponibles)
-			</panel.string>
-			<panel.string name="objects_deleted_text">
-				[COUNT] sur [MAX] ([DELETED] seront supprimés)
-			</panel.string>
-			<text name="parcel_object_bonus">
-				Facteur Bonus Objets : [BONUS]
-			</text>
-			<text name="Simulator primitive usage:">
-				Prims utilisées sur la parcelle :
-			</text>
-			<text left="214" name="objects_available" width="230">
-				[COUNT] sur [MAX] ([AVAILABLE] disponibles)
-			</text>
-			<text name="Primitives parcel supports:" width="200">
-				Prims max. sur la parcelle :
-			</text>
-			<text left="214" name="object_contrib_text" width="152">
-				[COUNT]
-			</text>
-			<text name="Primitives on parcel:">
-				Prims sur la parcelle :
-			</text>
-			<text left="214" name="total_objects_text" width="48">
-				[COUNT]
-			</text>
-			<text left="14" name="Owned by parcel owner:" width="180">
-				Appartenant au propriétaire :
-			</text>
-			<text left="214" name="owner_objects_text" width="48">
-				[COUNT]
-			</text>
-			<button label="Afficher" label_selected="Afficher" name="ShowOwner" right="-135" width="60"/>
-			<button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOwner..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/>
-			<text left="14" name="Set to group:" width="180">
-				Données au groupe :
-			</text>
-			<text left="214" name="group_objects_text" width="48">
-				[COUNT]
-			</text>
-			<button label="Afficher" label_selected="Afficher" name="ShowGroup" right="-135" width="60"/>
-			<button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnGroup..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/>
-			<text left="14" name="Owned by others:" width="128">
-				Appartenant à d&apos;autres :
-			</text>
-			<text left="214" name="other_objects_text" width="48">
-				[COUNT]
-			</text>
-			<button label="Afficher" label_selected="Afficher" name="ShowOther" right="-135" width="60"/>
-			<button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOther..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/>
-			<text left="14" name="Selected / sat upon:" width="193">
-				Sélectionnées/où quelqu&apos;un est assis :
-			</text>
-			<text left="214" name="selected_objects_text" width="48">
-				[COUNT]
-			</text>
-			<text left="4" name="Autoreturn" width="412">
-				Renvoi automatique des objets des autres résidents (min., 0 pour désactiver) :
-			</text>
-			<line_editor name="clean other time" right="-6" width="36"/>
-			<text name="Object Owners:">
-				Propriétaires :
-			</text>
-			<button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh List"/>
-			<button label="Renvoyer les objets..." label_selected="Renvoyer les objets..." name="Return objects..."/>
-			<name_list label="Plus récents" name="owner list">
-				<name_list.columns label="Type" name="type"/>
-				<name_list.columns name="online_status"/>
-				<name_list.columns label="Nom" name="name"/>
-				<name_list.columns label="Nombre" name="count"/>
-				<name_list.columns label="Plus récents" name="mostrecent"/>
-			</name_list>
-		</panel>
-		<panel label="Options" name="land_options_panel">
-			<panel.string name="search_enabled_tooltip">
-				Permettre aux autres résidents de voir cette parcelle dans les résultats de recherche
-			</panel.string>
-			<panel.string name="search_disabled_small_tooltip">
-				Cette option est désactivée car la superficie de cette parcelle est inférieure ou égale à 128 m².
-Seules les parcelles de grande taille peuvent apparaître dans la recherche.
-			</panel.string>
-			<panel.string name="search_disabled_permissions_tooltip">
-				Cette option est désactivée car vous ne pouvez pas modifier les options de cette parcelle.
-			</panel.string>
-			<panel.string name="mature_check_mature">
-				Contenu Mature
-			</panel.string>
-			<panel.string name="mature_check_adult">
-				Contenu Adult
-			</panel.string>
-			<panel.string name="mature_check_mature_tooltip">
-				Les informations ou contenu de votre parcelle sont classés Mature.
-			</panel.string>
-			<panel.string name="mature_check_adult_tooltip">
-				Les informations ou contenu de votre parcelle sont classés Adult.
-			</panel.string>
-			<panel.string name="landing_point_none">
-				(aucun)
-			</panel.string>
-			<panel.string name="push_restrict_text">
-				Pas de bousculades
-			</panel.string>
-			<panel.string name="push_restrict_region_text">
-				Pas de bousculades (les règles de la région priment)
-			</panel.string>
-			<text name="allow_label">
-				Autoriser les autres résidents à :
-			</text>
-			<check_box label="Modifier le terrain" name="edit land check" tool_tip="Si cette option est cochée, n&apos;importe qui peut terraformer votre terrain. Il vaut mieux ne pas cocher cette option pour toujours pouvoir modifer votre propre terrain."/>
-			<check_box label="Voler" name="check fly" tool_tip="Si cette option est cochée, les résidents peuvent voler sur votre terrain. Si elle n&apos;est pas cochée, ils ne pourront voler que lorsqu&apos;ils arrivent et passent au dessus de votre terrain."/>
-			<text left="152" name="allow_label2">
-				Créer des objets :
-			</text>
-			<check_box label="Tous les résidents" left="285" name="edit objects check"/>
-			<check_box label="Groupe" left="395" name="edit group objects check"/>
-			<text left="152" name="allow_label3" width="134">
-				Laisser entrer des objets :
-			</text>
-			<check_box label="Tous les résidents" left="285" name="all object entry check"/>
-			<check_box label="Groupe" left="395" name="group object entry check"/>
-			<text left="152" name="allow_label4">
-				Exécuter des scripts :
-			</text>
-			<check_box label="Tous les résidents" left="285" name="check other scripts"/>
-			<check_box label="Groupe" left="395" name="check group scripts"/>
-			<text name="land_options_label">
-				Options du terrain :
-			</text>
-			<check_box label="Sécurisé (pas de dégâts)" name="check safe" tool_tip="Si cette option est cochée, le terrain est sécurisé et il n&apos;y pas de risques de dommages causés par des combats. Si elle est décochée, des dommages causés par les combats peuvent avoir lieu."/>
-			<check_box bottom="-140" label="Pas de bousculades" left="14" name="PushRestrictCheck" tool_tip="Empêche l&apos;utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/>
-			<check_box bottom="-160" label="Afficher dans la recherche (30 L$/semaine) sous" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/>
-			<combo_box bottom="-160" left="286" name="land category with adult" width="146">
-				<combo_box.item label="Toutes catégories" name="item0"/>
-				<combo_box.item label="Appartenant aux Lindens" name="item1"/>
-				<combo_box.item label="Adult" name="item2"/>
-				<combo_box.item label="Art et Culture" name="item3"/>
-				<combo_box.item label="Affaires" name="item4"/>
-				<combo_box.item label="Éducation" name="item5"/>
-				<combo_box.item label="Jeux" name="item6"/>
-				<combo_box.item label="Favoris" name="item7"/>
-				<combo_box.item label="Accueil pour les nouveaux" name="item8"/>
-				<combo_box.item label="Parcs et Nature" name="item9"/>
-				<combo_box.item label="Résidentiel" name="item10"/>
-				<combo_box.item label="Shopping" name="item11"/>
-				<combo_box.item label="Autre" name="item12"/>
-			</combo_box>
-			<combo_box bottom="-160" left="286" name="land category" width="146">
-				<combo_box.item label="Toutes catégories" name="item0"/>
-				<combo_box.item label="Appartenant aux Lindens" name="item1"/>
-				<combo_box.item label="Art et Culture" name="item3"/>
-				<combo_box.item label="Affaires" name="item4"/>
-				<combo_box.item label="Éducation" name="item5"/>
-				<combo_box.item label="Jeux" name="item6"/>
-				<combo_box.item label="Favoris" name="item7"/>
-				<combo_box.item label="Accueil pour les nouveaux" name="item8"/>
-				<combo_box.item label="Parcs et Nature" name="item9"/>
-				<combo_box.item label="Résidentiel" name="item10"/>
-				<combo_box.item label="Shopping" name="item11"/>
-				<combo_box.item label="Autre" name="item12"/>
-			</combo_box>
-			<check_box bottom="-180" label="Contenu Mature" name="MatureCheck" tool_tip=""/>
-			<text bottom="-200" name="Snapshot:">
-				Photo :
-			</text>
-			<texture_picker bottom="-319" label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/>
-			<text bottom="-323" name="landing_point">
-				Lieu d&apos;arrivée : [LANDING]
-			</text>
-			<button bottom="-323" label="Définir" label_selected="Définir" name="Set" tool_tip="Définit le point d&apos;arrivée des visiteurs. Définit l&apos;emplacement de votre avatar sur ce terrain."/>
-			<button bottom="-323" label="Annuler" label_selected="Annuler" name="Clear" tool_tip="Libérer le lieu d&apos;arrivée."/>
-			<text bottom="-343" name="Teleport Routing: ">
-				Règles de téléportation :
-			</text>
-			<combo_box bottom="-343" left="140" name="landing type" tool_tip="Vous permet de paramétrer les téléportations sur votre terrain." width="140">
-				<combo_box.item label="Bloqué" name="Blocked"/>
-				<combo_box.item label="Lieu d&apos;arrivée fixe" name="LandingPoint"/>
-				<combo_box.item label="Lieu d&apos;arrivée libre" name="Anywhere"/>
-			</combo_box>
-		</panel>
-		<panel label="Médias" name="land_media_panel">
-			<text name="with media:" width="85">
-				Type :
-			</text>
-			<combo_box left="97" name="media type" tool_tip="Indiquez s&apos;il s&apos;agit de l&apos;URL d&apos;un film, d&apos;une page web ou autre"/>
-			<text name="mime_type"/>
-			<text name="at URL:" width="85">
-				URL du domicile :
-			</text>
-			<line_editor left="97" name="media_url"/>
-			<button label="Définir..." label_selected="Définir..." name="set_media_url"/>
-			<text name="CurrentURL:">
-				URL actuelle :
-			</text>
-			<button label="Réinitialiser..." label_selected="Réinitialiser..." name="reset_media_url"/>
-			<check_box label="Masquer l&apos;URL" left="97" name="hide_media_url" tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l&apos;URL du média. Cette option n&apos;est pas disponible pour les fichiers HTML."/>
-			<text name="Description:">
-				Description :
-			</text>
-			<line_editor left="97" name="url_description" tool_tip="Texte affiché à côté du bouton Jouer/Charger"/>
-			<text name="Media texture:">
-				Remplacer
-la texture :
-			</text>
-			<texture_picker label="" left="97" name="media texture" tool_tip="Cliquez pour sélectionner une image"/>
-			<text name="replace_texture_help">
-				Les objets avec cette texture affichent le film ou la page web quand vous cliquez sur la flèche Jouer.
-
-Sélectionnez l&apos;image miniature pour choisir une texture différente.
-			</text>
-			<check_box label="Échelle automatique" left="97" name="media_auto_scale" tool_tip="Si vous sélectionnez cette option, le contenu de cette parcelle sera automatiquement mis à l&apos;échelle. La qualité visuelle sera peut-être amoindrie mais vous n&apos;aurez à faire aucune autre mise à l&apos;échelle ou alignement."/>
-			<text left="102" name="media_size" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut." width="105">
-				Taille :
-			</text>
-			<spinner left_delta="89" name="media_size_width" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
-			<spinner name="media_size_height" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
-			<text name="pixels">
-				pixels
-			</text>
-			<text name="Options:">
-				Options :
-			</text>
-			<check_box label="En boucle" name="media_loop" tool_tip="Jouer le média en boucle. Lorsque le média aura fini de jouer, il recommencera."/>
-		</panel>
-		<panel label="Audio" name="land_audio_panel">
-			<text name="MusicURL:">
-				URL de la musique :
-			</text>
-			<text name="Sound:">
-				Son :
-			</text>
-			<check_box label="Limiter les gestes et sons d&apos;objet à cette parcelle" name="check sound local"/>
-			<text name="Voice settings:">
-				Voix :
-			</text>
-			<check_box label="Activer le chat vocal" name="parcel_enable_voice_channel"/>
-			<check_box label="Activer la voix (contrôlé par le domaine)" name="parcel_enable_voice_channel_is_estate_disabled"/>
-			<check_box label="Limiter le chat vocal à cette parcelle" name="parcel_enable_voice_channel_parcel"/>
-		</panel>
-		<panel label="Accès" name="land_access_panel">
-			<panel.string name="estate_override">
-				Au moins une de ces options est définie au niveau du domaine.
-			</panel.string>
-			<text name="Limit access to this parcel to:">
-				Accès à cette parcelle
-			</text>
-			<check_box label="Autoriser l&apos;accès public" name="public_access"/>
-			<text name="Only Allow">
-				Bloquer l&apos;accès aux résidents :
-			</text>
-			<check_box label="Qui n&apos;ont pas fourni leurs informations de paiement à Linden Lab" name="limit_payment" tool_tip="Aux résidents non identifés"/>
-			<check_box label="Dont l&apos;âge n&apos;a pas été vérifié" name="limit_age_verified" tool_tip="Interdire les résidents qui n&apos;ont pas vérifié leur âge. Consultez la page [SUPPORT_SITE] pour plus d&apos;informations."/>
-			<check_box label="Autoriser l&apos;accès au groupe : [GROUP]" name="GroupCheck" tool_tip="Définir le groupe à l&apos;onglet Général."/>
-			<check_box label="Vendre des pass à :" name="PassCheck" tool_tip="Autoriser un accès temporaire à cette parcelle"/>
-			<combo_box name="pass_combo">
-				<combo_box.item label="Tout le monde" name="Anyone"/>
-				<combo_box.item label="Groupe" name="Group"/>
-			</combo_box>
-			<spinner label="Prix en L$ :" name="PriceSpin"/>
-			<spinner label="Durée en heures :" name="HoursSpin"/>
-			<text label="Toujours autoriser" name="AllowedText">
-				Résidents autorisés
-			</text>
-			<name_list name="AccessList" tool_tip="([LISTED] listés, [MAX] max)"/>
-			<button label="Ajouter..." label_selected="Ajouter..." name="add_allowed"/>
-			<button label="Supprimer" label_selected="Supprimer" name="remove_allowed"/>
-			<text label="Bannir" name="BanCheck">
-				Résidents bannis
-			</text>
-			<name_list name="BannedList" tool_tip="([LISTED] listés, [MAX] max)"/>
-			<button label="Ajouter..." label_selected="Ajouter..." name="add_banned"/>
-			<button label="Supprimer" label_selected="Supprimer" name="remove_banned"/>
-		</panel>
-	</tab_container>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterland" title="À PROPOS DU TERRAIN">
+	<floater.string name="Minutes">
+		[MINUTES] minutes
+	</floater.string>
+	<floater.string name="Minute">
+		minute
+	</floater.string>
+	<floater.string name="Seconds">
+		[SECONDS] secondes
+	</floater.string>
+	<tab_container name="landtab">
+		<panel label="Général" name="land_general_panel">
+			<panel.string name="new users only">
+				Nouveaux utilisateurs uniquement
+			</panel.string>
+			<panel.string name="anyone">
+				Tout le monde
+			</panel.string>
+			<panel.string name="area_text">
+				Surface
+			</panel.string>
+			<panel.string name="area_size_text">
+				[AREA] m²
+			</panel.string>
+			<panel.string name="auction_id_text">
+				Code de l&apos;enchère : [ID]
+			</panel.string>
+			<panel.string name="need_tier_to_modify">
+				Pour modifier ce terrain, vous devez approuver votre achat.
+			</panel.string>
+			<panel.string name="group_owned_text">
+				(propriété du groupe)
+			</panel.string>
+			<panel.string name="profile_text">
+				Profil...
+			</panel.string>
+			<panel.string name="info_text">
+				Infos...
+			</panel.string>
+			<panel.string name="public_text">
+				(public)
+			</panel.string>
+			<panel.string name="none_text">
+				(aucun)
+			</panel.string>
+			<panel.string name="sale_pending_text">
+				(vente en cours)
+			</panel.string>
+			<panel.string name="no_selection_text">
+				Aucune parcelle sélectionnée.
+Allez dans le menu Monde &gt; À propos du terrain ou sélectionnez une autre parcelle pour en afficher les détails.
+			</panel.string>
+			<text name="Name:">
+				Nom :
+			</text>
+			<line_editor name="Name"/>
+			<text name="Description:">
+				Description :
+			</text>
+			<text_editor name="Description"/>
+			<text name="LandType">
+				Type :
+			</text>
+			<text name="LandTypeText">
+				Continent / Homestead
+			</text>
+			<text name="ContentRating">
+				Catégorie :
+			</text>
+			<text name="ContentRatingText">
+				Adult
+			</text>
+			<text name="Owner:">
+				Propriétaire :
+			</text>
+			<text name="OwnerText">
+				Leyla Linden
+			</text>
+			<button label="Profil..." label_selected="Profil..." name="Profile..."/>
+			<text name="Group:">
+				Groupe :
+			</text>
+			<text name="GroupText"/>
+			<button label="Définir..." label_selected="Définir..." name="Set..."/>
+			<check_box label="Autoriser la cession au groupe" name="check deed" tool_tip="Un officier peut céder ce terrain au groupe. Il viendra alors s&apos;ajouter au patrimoine du groupe."/>
+			<button label="Céder..." label_selected="Céder..." name="Deed..." tool_tip="Vous ne pouvez céder le terrain que si vous avez un rôle d&apos;officier dans le groupe sélectionné."/>
+			<check_box label="Le propriétaire contribue en cédant du terrain" name="check contrib" tool_tip="Lorsqu&apos;un terrain est cédé au groupe, l&apos;ancien propriétaire fait également un don de terrain suffisant."/>
+			<text name="For Sale:">
+				À vendre :
+			</text>
+			<text name="Not for sale.">
+				Pas à vendre
+			</text>
+			<text name="For Sale: Price L$[PRICE].">
+				Prix : [PRICE] L$ ([PRICE_PER_SQM] L$/m²).
+			</text>
+			<text name="SalePending"/>
+			<button label="Vendre le terrain..." label_selected="Vendre le terrain..." name="Sell Land..."/>
+			<text name="For sale to">
+				À vendre à : [BUYER]
+			</text>
+			<text name="Sell with landowners objects in parcel.">
+				Objets inclus dans la vente.
+			</text>
+			<text name="Selling with no objects in parcel.">
+				Objets non inclus dans la vente.
+			</text>
+			<button label="Annuler la vente du terrain" label_selected="Annuler la vente du terrain" left="275" name="Cancel Land Sale" width="165"/>
+			<text name="Claimed:">
+				Acquis :
+			</text>
+			<text name="DateClaimText">
+				Tue Aug 15 13:47:25 2006
+			</text>
+			<text name="PriceLabel">
+				Superficie :
+			</text>
+			<text name="PriceText">
+				4048 m²
+			</text>
+			<text name="Traffic:">
+				Trafic :
+			</text>
+			<text name="DwellText">
+				0
+			</text>
+			<button label="Acheter le terrain..." label_selected="Acheter le terrain..." left="130" name="Buy Land..." width="125"/>
+			<button label="Acheter pour le groupe..." label_selected="Acheter pour le groupe..." name="Buy For Group..."/>
+			<button label="Acheter un pass..." label_selected="Acheter un pass..." left="130" name="Buy Pass..." tool_tip="Un pass vous donne un accès temporaire à ce terrain." width="125"/>
+			<button label="Abandonner le terrain..." label_selected="Abandonner le terrain..." name="Abandon Land..."/>
+			<button label="Redemander le terrain..." label_selected="Redemander le terrain…" name="Reclaim Land..."/>
+			<button label="Vente Linden..." label_selected="Vente Linden..." name="Linden Sale..." tool_tip="Le terrain doit être la propriété d&apos;un résident, avoir un contenu défini et ne pas être aux enchères."/>
+		</panel>
+		<panel label="Règlement" name="land_covenant_panel">
+			<panel.string name="can_resell">
+				Le terrain acheté dans cette région peut être revendu.
+			</panel.string>
+			<panel.string name="can_not_resell">
+				Le terrain acheté dans cette région ne peut pas être revendu.
+			</panel.string>
+			<panel.string name="can_change">
+				Le terrain acheté dans cette région peut être fusionné
+ou divisé.
+			</panel.string>
+			<panel.string name="can_not_change">
+				Le terrain acheté dans cette région ne peut pas être fusionné
+ou divisé.
+			</panel.string>
+			<text name="estate_section_lbl">
+				Domaine :
+			</text>
+			<text name="estate_name_lbl">
+				Nom :
+			</text>
+			<text name="estate_name_text">
+				continent
+			</text>
+			<text name="estate_owner_lbl">
+				Propriétaire :
+			</text>
+			<text name="estate_owner_text">
+				(aucun)
+			</text>
+			<text_editor name="covenant_editor">
+				Il n&apos;y a aucun règlement pour ce domaine.
+			</text_editor>
+			<text name="covenant_timestamp_text">
+				Last Modified Wed Dec 31 16:00:00 1969
+			</text>
+			<text name="region_section_lbl">
+				Région :
+			</text>
+			<text name="region_name_lbl">
+				Nom :
+			</text>
+			<text name="region_name_text">
+				leyla
+			</text>
+			<text name="region_landtype_lbl">
+				Type :
+			</text>
+			<text name="region_landtype_text">
+				Continent / Homestead
+			</text>
+			<text name="region_maturity_lbl">
+				Catégorie :
+			</text>
+			<text name="region_maturity_text">
+				Adult
+			</text>
+			<text name="resellable_lbl">
+				Revendre :
+			</text>
+			<text name="resellable_clause">
+				Le terrain dans cette région ne peut être revendu.
+			</text>
+			<text name="changeable_lbl">
+				Sous-diviser :
+			</text>
+			<text name="changeable_clause">
+				Le terrain dans cette région ne peut être fusionné/divisé.
+			</text>
+		</panel>
+		<panel label="Objets" name="land_objects_panel">
+			<panel.string name="objects_available_text">
+				[COUNT] sur [MAX] ([AVAILABLE] disponibles)
+			</panel.string>
+			<panel.string name="objects_deleted_text">
+				[COUNT] sur [MAX] ([DELETED] seront supprimés)
+			</panel.string>
+			<text name="parcel_object_bonus">
+				Facteur Bonus Objets : [BONUS]
+			</text>
+			<text name="Simulator primitive usage:">
+				Prims utilisées sur la parcelle :
+			</text>
+			<text left="214" name="objects_available" width="230">
+				[COUNT] sur [MAX] ([AVAILABLE] disponibles)
+			</text>
+			<text name="Primitives parcel supports:" width="200">
+				Prims max. sur la parcelle :
+			</text>
+			<text left="214" name="object_contrib_text" width="152">
+				[COUNT]
+			</text>
+			<text name="Primitives on parcel:">
+				Prims sur la parcelle :
+			</text>
+			<text left="214" name="total_objects_text" width="48">
+				[COUNT]
+			</text>
+			<text left="14" name="Owned by parcel owner:" width="180">
+				Appartenant au propriétaire :
+			</text>
+			<text left="214" name="owner_objects_text" width="48">
+				[COUNT]
+			</text>
+			<button label="Afficher" label_selected="Afficher" name="ShowOwner" right="-135" width="60"/>
+			<button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOwner..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/>
+			<text left="14" name="Set to group:" width="180">
+				Données au groupe :
+			</text>
+			<text left="214" name="group_objects_text" width="48">
+				[COUNT]
+			</text>
+			<button label="Afficher" label_selected="Afficher" name="ShowGroup" right="-135" width="60"/>
+			<button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnGroup..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/>
+			<text left="14" name="Owned by others:" width="128">
+				Appartenant à d&apos;autres :
+			</text>
+			<text left="214" name="other_objects_text" width="48">
+				[COUNT]
+			</text>
+			<button label="Afficher" label_selected="Afficher" name="ShowOther" right="-135" width="60"/>
+			<button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOther..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/>
+			<text left="14" name="Selected / sat upon:" width="193">
+				Sélectionnées/où quelqu&apos;un est assis :
+			</text>
+			<text left="214" name="selected_objects_text" width="48">
+				[COUNT]
+			</text>
+			<text left="4" name="Autoreturn" width="412">
+				Renvoi automatique des objets des autres résidents (min., 0 pour désactiver) :
+			</text>
+			<line_editor name="clean other time" right="-6" width="36"/>
+			<text name="Object Owners:">
+				Propriétaires :
+			</text>
+			<button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh List"/>
+			<button label="Renvoyer les objets..." label_selected="Renvoyer les objets..." name="Return objects..."/>
+			<name_list label="Plus récents" name="owner list">
+				<name_list.columns label="Type" name="type"/>
+				<name_list.columns name="online_status"/>
+				<name_list.columns label="Nom" name="name"/>
+				<name_list.columns label="Nombre" name="count"/>
+				<name_list.columns label="Plus récents" name="mostrecent"/>
+			</name_list>
+		</panel>
+		<panel label="Options" name="land_options_panel">
+			<panel.string name="search_enabled_tooltip">
+				Permettre aux autres résidents de voir cette parcelle dans les résultats de recherche
+			</panel.string>
+			<panel.string name="search_disabled_small_tooltip">
+				Cette option est désactivée car la superficie de cette parcelle est inférieure ou égale à 128 m².
+Seules les parcelles de grande taille peuvent apparaître dans la recherche.
+			</panel.string>
+			<panel.string name="search_disabled_permissions_tooltip">
+				Cette option est désactivée car vous ne pouvez pas modifier les options de cette parcelle.
+			</panel.string>
+			<panel.string name="mature_check_mature">
+				Contenu Mature
+			</panel.string>
+			<panel.string name="mature_check_adult">
+				Contenu Adult
+			</panel.string>
+			<panel.string name="mature_check_mature_tooltip">
+				Les informations ou contenu de votre parcelle sont classés Mature.
+			</panel.string>
+			<panel.string name="mature_check_adult_tooltip">
+				Les informations ou contenu de votre parcelle sont classés Adult.
+			</panel.string>
+			<panel.string name="landing_point_none">
+				(aucun)
+			</panel.string>
+			<panel.string name="push_restrict_text">
+				Pas de bousculades
+			</panel.string>
+			<panel.string name="push_restrict_region_text">
+				Pas de bousculades (les règles de la région priment)
+			</panel.string>
+			<text name="allow_label">
+				Autoriser les autres résidents à :
+			</text>
+			<check_box label="Modifier le terrain" name="edit land check" tool_tip="Si cette option est cochée, n&apos;importe qui peut terraformer votre terrain. Il vaut mieux ne pas cocher cette option pour toujours pouvoir modifer votre propre terrain."/>
+			<check_box label="Voler" name="check fly" tool_tip="Si cette option est cochée, les résidents peuvent voler sur votre terrain. Si elle n&apos;est pas cochée, ils ne pourront voler que lorsqu&apos;ils arrivent et passent au dessus de votre terrain."/>
+			<text left="152" name="allow_label2">
+				Créer des objets :
+			</text>
+			<check_box label="Tous les résidents" left="285" name="edit objects check"/>
+			<check_box label="Groupe" left="395" name="edit group objects check"/>
+			<text left="152" name="allow_label3" width="134">
+				Laisser entrer des objets :
+			</text>
+			<check_box label="Tous les résidents" left="285" name="all object entry check"/>
+			<check_box label="Groupe" left="395" name="group object entry check"/>
+			<text left="152" name="allow_label4">
+				Exécuter des scripts :
+			</text>
+			<check_box label="Tous les résidents" left="285" name="check other scripts"/>
+			<check_box label="Groupe" left="395" name="check group scripts"/>
+			<text name="land_options_label">
+				Options du terrain :
+			</text>
+			<check_box label="Sécurisé (pas de dégâts)" name="check safe" tool_tip="Si cette option est cochée, le terrain est sécurisé et il n&apos;y pas de risques de dommages causés par des combats. Si elle est décochée, des dommages causés par les combats peuvent avoir lieu."/>
+			<check_box bottom="-140" label="Pas de bousculades" left="14" name="PushRestrictCheck" tool_tip="Empêche l&apos;utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/>
+			<check_box bottom="-160" label="Afficher dans la recherche (30 L$/semaine) sous" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/>
+			<combo_box bottom="-160" left="286" name="land category with adult" width="146">
+				<combo_box.item label="Toutes catégories" name="item0"/>
+				<combo_box.item label="Appartenant aux Lindens" name="item1"/>
+				<combo_box.item label="Adult" name="item2"/>
+				<combo_box.item label="Art et Culture" name="item3"/>
+				<combo_box.item label="Affaires" name="item4"/>
+				<combo_box.item label="Éducation" name="item5"/>
+				<combo_box.item label="Jeux" name="item6"/>
+				<combo_box.item label="Favoris" name="item7"/>
+				<combo_box.item label="Accueil pour les nouveaux" name="item8"/>
+				<combo_box.item label="Parcs et Nature" name="item9"/>
+				<combo_box.item label="Résidentiel" name="item10"/>
+				<combo_box.item label="Shopping" name="item11"/>
+				<combo_box.item label="Autre" name="item12"/>
+			</combo_box>
+			<combo_box bottom="-160" left="286" name="land category" width="146">
+				<combo_box.item label="Toutes catégories" name="item0"/>
+				<combo_box.item label="Appartenant aux Lindens" name="item1"/>
+				<combo_box.item label="Art et Culture" name="item3"/>
+				<combo_box.item label="Affaires" name="item4"/>
+				<combo_box.item label="Éducation" name="item5"/>
+				<combo_box.item label="Jeux" name="item6"/>
+				<combo_box.item label="Favoris" name="item7"/>
+				<combo_box.item label="Accueil pour les nouveaux" name="item8"/>
+				<combo_box.item label="Parcs et Nature" name="item9"/>
+				<combo_box.item label="Résidentiel" name="item10"/>
+				<combo_box.item label="Shopping" name="item11"/>
+				<combo_box.item label="Autre" name="item12"/>
+			</combo_box>
+			<check_box bottom="-180" label="Contenu Mature" name="MatureCheck" tool_tip=""/>
+			<text bottom="-200" name="Snapshot:">
+				Photo :
+			</text>
+			<texture_picker bottom="-319" label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/>
+			<text bottom="-323" name="landing_point">
+				Lieu d&apos;arrivée : [LANDING]
+			</text>
+			<button bottom="-323" label="Définir" label_selected="Définir" name="Set" tool_tip="Définit le point d&apos;arrivée des visiteurs. Définit l&apos;emplacement de votre avatar sur ce terrain."/>
+			<button bottom="-323" label="Annuler" label_selected="Annuler" name="Clear" tool_tip="Libérer le lieu d&apos;arrivée."/>
+			<text bottom="-343" name="Teleport Routing: ">
+				Règles de téléportation :
+			</text>
+			<combo_box bottom="-343" left="140" name="landing type" tool_tip="Vous permet de paramétrer les téléportations sur votre terrain." width="140">
+				<combo_box.item label="Bloqué" name="Blocked"/>
+				<combo_box.item label="Lieu d&apos;arrivée fixe" name="LandingPoint"/>
+				<combo_box.item label="Lieu d&apos;arrivée libre" name="Anywhere"/>
+			</combo_box>
+		</panel>
+		<panel label="Médias" name="land_media_panel">
+			<text name="with media:" width="85">
+				Type :
+			</text>
+			<combo_box left="97" name="media type" tool_tip="Indiquez s&apos;il s&apos;agit de l&apos;URL d&apos;un film, d&apos;une page web ou autre"/>
+			<text name="mime_type"/>
+			<text name="at URL:" width="85">
+				URL du domicile :
+			</text>
+			<line_editor left="97" name="media_url"/>
+			<button label="Définir..." label_selected="Définir..." name="set_media_url"/>
+			<text name="CurrentURL:">
+				URL actuelle :
+			</text>
+			<button label="Réinitialiser..." label_selected="Réinitialiser..." name="reset_media_url"/>
+			<check_box label="Masquer l&apos;URL" left="97" name="hide_media_url" tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l&apos;URL du média. Cette option n&apos;est pas disponible pour les fichiers HTML."/>
+			<text name="Description:">
+				Description :
+			</text>
+			<line_editor left="97" name="url_description" tool_tip="Texte affiché à côté du bouton Jouer/Charger"/>
+			<text name="Media texture:">
+				Remplacer
+la texture :
+			</text>
+			<texture_picker label="" left="97" name="media texture" tool_tip="Cliquez pour sélectionner une image"/>
+			<text name="replace_texture_help">
+				Les objets avec cette texture affichent le film ou la page web quand vous cliquez sur la flèche Jouer.
+
+Sélectionnez l&apos;image miniature pour choisir une texture différente.
+			</text>
+			<check_box label="Échelle automatique" left="97" name="media_auto_scale" tool_tip="Si vous sélectionnez cette option, le contenu de cette parcelle sera automatiquement mis à l&apos;échelle. La qualité visuelle sera peut-être amoindrie mais vous n&apos;aurez à faire aucune autre mise à l&apos;échelle ou alignement."/>
+			<text left="102" name="media_size" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut." width="105">
+				Taille :
+			</text>
+			<spinner left_delta="89" name="media_size_width" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
+			<spinner name="media_size_height" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
+			<text name="pixels">
+				pixels
+			</text>
+			<text name="Options:">
+				Options :
+			</text>
+			<check_box label="En boucle" name="media_loop" tool_tip="Jouer le média en boucle. Lorsque le média aura fini de jouer, il recommencera."/>
+		</panel>
+		<panel label="Audio" name="land_audio_panel">
+			<text name="MusicURL:">
+				URL de la musique :
+			</text>
+			<text name="Sound:">
+				Son :
+			</text>
+			<check_box label="Limiter les gestes et sons d&apos;objet à cette parcelle" name="check sound local"/>
+			<text name="Voice settings:">
+				Voix :
+			</text>
+			<check_box label="Activer le chat vocal" name="parcel_enable_voice_channel"/>
+			<check_box label="Activer la voix (contrôlé par le domaine)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+			<check_box label="Limiter le chat vocal à cette parcelle" name="parcel_enable_voice_channel_parcel"/>
+		</panel>
+		<panel label="Accès" name="land_access_panel">
+			<panel.string name="estate_override">
+				Au moins une de ces options est définie au niveau du domaine.
+			</panel.string>
+			<text name="Limit access to this parcel to:">
+				Accès à cette parcelle
+			</text>
+			<check_box label="Autoriser l&apos;accès public" name="public_access"/>
+			<text name="Only Allow">
+				Bloquer l&apos;accès aux résidents :
+			</text>
+			<check_box label="Qui n&apos;ont pas fourni leurs informations de paiement à Linden Lab" name="limit_payment" tool_tip="Aux résidents non identifés"/>
+			<check_box label="Dont l&apos;âge n&apos;a pas été vérifié" name="limit_age_verified" tool_tip="Interdire les résidents qui n&apos;ont pas vérifié leur âge. Consultez la page [SUPPORT_SITE] pour plus d&apos;informations."/>
+			<check_box label="Autoriser l&apos;accès au groupe : [GROUP]" name="GroupCheck" tool_tip="Définir le groupe à l&apos;onglet Général."/>
+			<check_box label="Vendre des pass à :" name="PassCheck" tool_tip="Autoriser un accès temporaire à cette parcelle"/>
+			<combo_box name="pass_combo">
+				<combo_box.item label="Tout le monde" name="Anyone"/>
+				<combo_box.item label="Groupe" name="Group"/>
+			</combo_box>
+			<spinner label="Prix en L$ :" name="PriceSpin"/>
+			<spinner label="Durée en heures :" name="HoursSpin"/>
+			<text label="Toujours autoriser" name="AllowedText">
+				Résidents autorisés
+			</text>
+			<name_list name="AccessList" tool_tip="([LISTED] listés, [MAX] max)"/>
+			<button label="Ajouter..." label_selected="Ajouter..." name="add_allowed"/>
+			<button label="Supprimer" label_selected="Supprimer" name="remove_allowed"/>
+			<text label="Bannir" name="BanCheck">
+				Résidents bannis
+			</text>
+			<name_list name="BannedList" tool_tip="([LISTED] listés, [MAX] max)"/>
+			<button label="Ajouter..." label_selected="Ajouter..." name="add_banned"/>
+			<button label="Supprimer" label_selected="Supprimer" name="remove_banned"/>
+		</panel>
+	</tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
index 00ab29703ff..4417006fc6d 100644
--- a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
@@ -1,186 +1,186 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Animation Preview" title="">
-	<floater.string name="failed_to_initialize">
-		Echec de l&apos;initialisation du mouvement
-	</floater.string>
-	<floater.string name="anim_too_long">
-		Le fichier d&apos;animation fait [LENGTH] secondes.
-
-La longueur maximale est de [MAX_LENGTH] secondes.
-	</floater.string>
-	<floater.string name="failed_file_read">
-		Impossible de lire le fichier d&apos;animation.
-
-[STATUS]
-	</floater.string>
-	<floater.string name="E_ST_OK">
-		Ok
-	</floater.string>
-	<floater.string name="E_ST_EOF">
-		Fichier incomplet.
-	</floater.string>
-	<floater.string name="E_ST_NO_CONSTRAINT">
-		Impossible de lire la définition des contraintes.
-	</floater.string>
-	<floater.string name="E_ST_NO_FILE">
-		Impossible d&apos;ouvrir le fichier BVH.
-	</floater.string>
-	<floater.string name="E_ST_NO_HIER">
-		En-tête HIERARCHY non valide.
-	</floater.string>
-	<floater.string name="E_ST_NO_JOINT">
-		Impossible de trouver ROOT ou JOINT.
-	</floater.string>
-	<floater.string name="E_ST_NO_NAME">
-		Impossible de trouver le nom JOINT.
-	</floater.string>
-	<floater.string name="E_ST_NO_OFFSET">
-		Impossible de trouver OFFSET.
-	</floater.string>
-	<floater.string name="E_ST_NO_CHANNELS">
-		Impossible se trouver les CHANNELS.
-	</floater.string>
-	<floater.string name="E_ST_NO_ROTATION">
-		Impossible d&apos;obtenir l&apos;ordre de rotation.
-	</floater.string>
-	<floater.string name="E_ST_NO_AXIS">
-		Impossible d&apos;obtenir l&apos;axe de rotation.
-	</floater.string>
-	<floater.string name="E_ST_NO_MOTION">
-		Impossible de trouver MOTION.
-	</floater.string>
-	<floater.string name="E_ST_NO_FRAMES">
-		Impossible d&apos;obtenir le nombre de cadres.
-	</floater.string>
-	<floater.string name="E_ST_NO_FRAME_TIME">
-		Impossible d&apos;obtenir le temps du cadre.
-	</floater.string>
-	<floater.string name="E_ST_NO_POS">
-		Impossible de trouver les valeurs de la position.
-	</floater.string>
-	<floater.string name="E_ST_NO_ROT">
-		Impossible de trouver les valeurs de rotation.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_FILE">
-		Impossible d&apos;ouvrir le fichier de traduction.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_HEADER">
-		Impossible de lire l&apos;en-tête de traduction.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_NAME">
-		Impossible de lire la traduction.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_IGNORE">
-		Impossible de lire la traduction.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_RELATIVE">
-		Impossible de lire la valeur de traduction relative.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_OUTNAME">
-		Impossible de lire la traduction.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_MATRIX">
-		Impossible de lire la matrice de traduction.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_MERGECHILD">
-		Impossible de trouver le nom mergechild.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_MERGEPARENT">
-		Impossible de trouver le nom mergeparent.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_PRIORITY">
-		Impossible de définir la valeur de la priorité.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_LOOP">
-		Impossible de définir la valeur de la boucle
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_EASEIN">
-		Impossible de trouver les valeurs easeln.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_EASEOUT">
-		Impossible de trouver les valeurs easeOut.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_HAND">
-		Impossible d&apos;obtenir la valeur hand morph.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_EMOTE">
-		Impossible de lire le nom emote.
-	</floater.string>
-	<text name="name_label">
-		Nom :
-	</text>
-	<text name="description_label">
-		Description :
-	</text>
-	<spinner label="Priorité" name="priority" tool_tip="Contrôle quelles animations peuvent êtres écrasées par cette animation."/>
-	<check_box label="Boucle" left="6" name="loop_check" tool_tip="Joue cette animation en boucle."/>
-	<spinner label="Début (%)" label_width="55" left="76" name="loop_in_point" tool_tip="Définit le moment de l&apos;animation où la boucle repart." width="105"/>
-	<spinner label="Fin (%)" left="195" name="loop_out_point" tool_tip="Définit le moment de l&apos;animation où la boucle finit."/>
-	<text name="hand_label" width="110">
-		Mouvement de main
-	</text>
-	<combo_box label="" left_delta="116" name="hand_pose_combo" tool_tip="Contrôle le mouvement des mains au cours de l&apos;animation" width="124">
-		<combo_box.item label="Doigts écartés" name="Spread"/>
-		<combo_box.item label="Détendues" name="Relaxed"/>
-		<combo_box.item label="Pointer (les deux)" name="PointBoth"/>
-		<combo_box.item label="Poing" name="Fist"/>
-		<combo_box.item label="Détendue (gauche)" name="RelaxedLeft"/>
-		<combo_box.item label="Pointer (gauche)" name="PointLeft"/>
-		<combo_box.item label="Poing (gauche)" name="FistLeft"/>
-		<combo_box.item label="Détendue (droite)" name="RelaxedRight"/>
-		<combo_box.item label="Pointer (droite)" name="PointRight"/>
-		<combo_box.item label="Poing (droite)" name="FistRight"/>
-		<combo_box.item label="Saluer (droite)" name="SaluteRight"/>
-		<combo_box.item label="Taper" name="Typing"/>
-		<combo_box.item label="Paix (main droite)" name="PeaceRight"/>
-	</combo_box>
-	<text name="emote_label">
-		Expression
-	</text>
-	<combo_box label="" left_delta="116" name="emote_combo" tool_tip="Contrôle l&apos;expression du visage au cours de l&apos;animation." width="124">
-		<combo_box.item label="None]" name="[None]"/>
-		<combo_box.item label="Aaaaah" name="Aaaaah"/>
-		<combo_box.item label="Effrayé" name="Afraid"/>
-		<combo_box.item label="En colère" name="Angry"/>
-		<combo_box.item label="Grand sourire" name="BigSmile"/>
-		<combo_box.item label="Ennui" name="Bored"/>
-		<combo_box.item label="Pleurer" name="Cry"/>
-		<combo_box.item label="Mépris" name="Disdain"/>
-		<combo_box.item label="Gêne" name="Embarrassed"/>
-		<combo_box.item label="Froncer les sourcils" name="Frown"/>
-		<combo_box.item label="Embrasser" name="Kiss"/>
-		<combo_box.item label="Rire" name="Laugh"/>
-		<combo_box.item label="Plllppt" name="Plllppt"/>
-		<combo_box.item label="Dégoût" name="Repulsed"/>
-		<combo_box.item label="Triste" name="Sad"/>
-		<combo_box.item label="Hausser les épaules" name="Shrug"/>
-		<combo_box.item label="Sourire" name="Smile"/>
-		<combo_box.item label="Surprise" name="Surprise"/>
-		<combo_box.item label="Clin d&apos;œil" name="Wink"/>
-		<combo_box.item label="Soucis" name="Worry"/>
-	</combo_box>
-	<text name="preview_label" width="110">
-		Prévisualiser pendant
-	</text>
-	<combo_box label="" left_delta="116" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales." width="124">
-		<combo_box.item label="Debout" name="Standing"/>
-		<combo_box.item label="En train de marcher" name="Walking"/>
-		<combo_box.item label="Assis" name="Sitting"/>
-		<combo_box.item label="En train de voler" name="Flying"/>
-	</combo_box>
-	<spinner label="Transition 
-début (s)" label_width="65" name="ease_in_time" tool_tip="Durée (en secondes) pendant laquelle l&apos;animation s&apos;intègre au mouvement."/>
-	<spinner label="Transition 
-fin (s)" label_width="65" left="160" name="ease_out_time" tool_tip="Durée (en secondes) pendant laquelle l&apos;animation disparaît du mouvement." width="125"/>
-	<button bottom_delta="-48" label="" name="play_btn" tool_tip="Jouer/Arrêter votre animation."/>
-	<button label="" name="stop_btn" tool_tip="Arrêter le playback"/>
-	<slider label="" name="playback_slider"/>
-	<text name="bad_animation_text">
-		Impossible de lire le fichier d&apos;animation.
-
-Nous recommandons les fichiers BVH extraits de
-Poser 4.
-	</text>
-	<button label="Annuler" name="cancel_btn"/>
-	<button label="Charger ([AMOUNT] L$)" name="ok_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Animation Preview" title="">
+	<floater.string name="failed_to_initialize">
+		Echec de l&apos;initialisation du mouvement
+	</floater.string>
+	<floater.string name="anim_too_long">
+		Le fichier d&apos;animation fait [LENGTH] secondes.
+
+La longueur maximale est de [MAX_LENGTH] secondes.
+	</floater.string>
+	<floater.string name="failed_file_read">
+		Impossible de lire le fichier d&apos;animation.
+
+[STATUS]
+	</floater.string>
+	<floater.string name="E_ST_OK">
+		Ok
+	</floater.string>
+	<floater.string name="E_ST_EOF">
+		Fichier incomplet.
+	</floater.string>
+	<floater.string name="E_ST_NO_CONSTRAINT">
+		Impossible de lire la définition des contraintes.
+	</floater.string>
+	<floater.string name="E_ST_NO_FILE">
+		Impossible d&apos;ouvrir le fichier BVH.
+	</floater.string>
+	<floater.string name="E_ST_NO_HIER">
+		En-tête HIERARCHY non valide.
+	</floater.string>
+	<floater.string name="E_ST_NO_JOINT">
+		Impossible de trouver ROOT ou JOINT.
+	</floater.string>
+	<floater.string name="E_ST_NO_NAME">
+		Impossible de trouver le nom JOINT.
+	</floater.string>
+	<floater.string name="E_ST_NO_OFFSET">
+		Impossible de trouver OFFSET.
+	</floater.string>
+	<floater.string name="E_ST_NO_CHANNELS">
+		Impossible se trouver les CHANNELS.
+	</floater.string>
+	<floater.string name="E_ST_NO_ROTATION">
+		Impossible d&apos;obtenir l&apos;ordre de rotation.
+	</floater.string>
+	<floater.string name="E_ST_NO_AXIS">
+		Impossible d&apos;obtenir l&apos;axe de rotation.
+	</floater.string>
+	<floater.string name="E_ST_NO_MOTION">
+		Impossible de trouver MOTION.
+	</floater.string>
+	<floater.string name="E_ST_NO_FRAMES">
+		Impossible d&apos;obtenir le nombre de cadres.
+	</floater.string>
+	<floater.string name="E_ST_NO_FRAME_TIME">
+		Impossible d&apos;obtenir le temps du cadre.
+	</floater.string>
+	<floater.string name="E_ST_NO_POS">
+		Impossible de trouver les valeurs de la position.
+	</floater.string>
+	<floater.string name="E_ST_NO_ROT">
+		Impossible de trouver les valeurs de rotation.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_FILE">
+		Impossible d&apos;ouvrir le fichier de traduction.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_HEADER">
+		Impossible de lire l&apos;en-tête de traduction.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_NAME">
+		Impossible de lire la traduction.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_IGNORE">
+		Impossible de lire la traduction.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_RELATIVE">
+		Impossible de lire la valeur de traduction relative.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_OUTNAME">
+		Impossible de lire la traduction.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_MATRIX">
+		Impossible de lire la matrice de traduction.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_MERGECHILD">
+		Impossible de trouver le nom mergechild.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_MERGEPARENT">
+		Impossible de trouver le nom mergeparent.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_PRIORITY">
+		Impossible de définir la valeur de la priorité.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_LOOP">
+		Impossible de définir la valeur de la boucle
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_EASEIN">
+		Impossible de trouver les valeurs easeln.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_EASEOUT">
+		Impossible de trouver les valeurs easeOut.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_HAND">
+		Impossible d&apos;obtenir la valeur hand morph.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_EMOTE">
+		Impossible de lire le nom emote.
+	</floater.string>
+	<text name="name_label">
+		Nom :
+	</text>
+	<text name="description_label">
+		Description :
+	</text>
+	<spinner label="Priorité" name="priority" tool_tip="Contrôle quelles animations peuvent êtres écrasées par cette animation."/>
+	<check_box label="Boucle" left="6" name="loop_check" tool_tip="Joue cette animation en boucle."/>
+	<spinner label="Début (%)" label_width="55" left="76" name="loop_in_point" tool_tip="Définit le moment de l&apos;animation où la boucle repart." width="105"/>
+	<spinner label="Fin (%)" left="195" name="loop_out_point" tool_tip="Définit le moment de l&apos;animation où la boucle finit."/>
+	<text name="hand_label" width="110">
+		Mouvement de main
+	</text>
+	<combo_box label="" left_delta="116" name="hand_pose_combo" tool_tip="Contrôle le mouvement des mains au cours de l&apos;animation" width="124">
+		<combo_box.item label="Doigts écartés" name="Spread"/>
+		<combo_box.item label="Détendues" name="Relaxed"/>
+		<combo_box.item label="Pointer (les deux)" name="PointBoth"/>
+		<combo_box.item label="Poing" name="Fist"/>
+		<combo_box.item label="Détendue (gauche)" name="RelaxedLeft"/>
+		<combo_box.item label="Pointer (gauche)" name="PointLeft"/>
+		<combo_box.item label="Poing (gauche)" name="FistLeft"/>
+		<combo_box.item label="Détendue (droite)" name="RelaxedRight"/>
+		<combo_box.item label="Pointer (droite)" name="PointRight"/>
+		<combo_box.item label="Poing (droite)" name="FistRight"/>
+		<combo_box.item label="Saluer (droite)" name="SaluteRight"/>
+		<combo_box.item label="Taper" name="Typing"/>
+		<combo_box.item label="Paix (main droite)" name="PeaceRight"/>
+	</combo_box>
+	<text name="emote_label">
+		Expression
+	</text>
+	<combo_box label="" left_delta="116" name="emote_combo" tool_tip="Contrôle l&apos;expression du visage au cours de l&apos;animation." width="124">
+		<combo_box.item label="None]" name="[None]"/>
+		<combo_box.item label="Aaaaah" name="Aaaaah"/>
+		<combo_box.item label="Effrayé" name="Afraid"/>
+		<combo_box.item label="En colère" name="Angry"/>
+		<combo_box.item label="Grand sourire" name="BigSmile"/>
+		<combo_box.item label="Ennui" name="Bored"/>
+		<combo_box.item label="Pleurer" name="Cry"/>
+		<combo_box.item label="Mépris" name="Disdain"/>
+		<combo_box.item label="Gêne" name="Embarrassed"/>
+		<combo_box.item label="Froncer les sourcils" name="Frown"/>
+		<combo_box.item label="Embrasser" name="Kiss"/>
+		<combo_box.item label="Rire" name="Laugh"/>
+		<combo_box.item label="Plllppt" name="Plllppt"/>
+		<combo_box.item label="Dégoût" name="Repulsed"/>
+		<combo_box.item label="Triste" name="Sad"/>
+		<combo_box.item label="Hausser les épaules" name="Shrug"/>
+		<combo_box.item label="Sourire" name="Smile"/>
+		<combo_box.item label="Surprise" name="Surprise"/>
+		<combo_box.item label="Clin d&apos;œil" name="Wink"/>
+		<combo_box.item label="Soucis" name="Worry"/>
+	</combo_box>
+	<text name="preview_label" width="110">
+		Prévisualiser pendant
+	</text>
+	<combo_box label="" left_delta="116" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales." width="124">
+		<combo_box.item label="Debout" name="Standing"/>
+		<combo_box.item label="En train de marcher" name="Walking"/>
+		<combo_box.item label="Assis" name="Sitting"/>
+		<combo_box.item label="En train de voler" name="Flying"/>
+	</combo_box>
+	<spinner label="Transition 
+début (s)" label_width="65" name="ease_in_time" tool_tip="Durée (en secondes) pendant laquelle l&apos;animation s&apos;intègre au mouvement."/>
+	<spinner label="Transition 
+fin (s)" label_width="65" left="160" name="ease_out_time" tool_tip="Durée (en secondes) pendant laquelle l&apos;animation disparaît du mouvement." width="125"/>
+	<button bottom_delta="-48" label="" name="play_btn" tool_tip="Jouer/Arrêter votre animation."/>
+	<button label="" name="stop_btn" tool_tip="Arrêter le playback"/>
+	<slider label="" name="playback_slider"/>
+	<text name="bad_animation_text">
+		Impossible de lire le fichier d&apos;animation.
+
+Nous recommandons les fichiers BVH extraits de
+Poser 4.
+	</text>
+	<button label="Annuler" name="cancel_btn"/>
+	<button label="Charger ([AMOUNT] L$)" name="ok_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml b/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml
index 5742b0af04b..7ff2b6b4258 100644
--- a/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml
@@ -1,41 +1,41 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatarpicker" title="CHOISIR LE RÉSIDENT">
-	<tab_container name="ResidentChooserTabs">
-		<panel label="Rechercher" name="SearchPanel">
-			<text name="InstructSearchResidentName">
-				Saisissez une partie du nom du résident :
-			</text>
-			<button label="OK" label_selected="OK" name="Find"/>
-		</panel>
-		<panel label="Cartes de visite" name="CallingCardsPanel">
-			<text name="InstructSelectCallingCard">
-				Sélectionnez une carte de visite :
-			</text>
-		</panel>
-		<panel label="Près de moi" name="NearMePanel">
-			<text name="InstructSelectResident">
-				Sélectionner une personne près de vous :
-			</text>
-			<button font="SansSerifSmall" label="Rafraîchir la liste" label_selected="Rafraîchir la liste" left_delta="10" name="Refresh" width="105"/>
-			<slider bottom_delta="-36" label="Distance" name="near_me_range"/>
-			<text name="meters">
-				mètres
-			</text>
-			<scroll_list bottom_delta="-169" height="159" name="NearMe"/>
-		</panel>
-	</tab_container>
-	<button label="OK" label_selected="OK" name="Select"/>
-	<button label="Annuler" label_selected="Annuler" name="Cancel"/>
-	<string name="not_found">
-		&apos;[TEXT]&apos; introuvable
-	</string>
-	<string name="no_one_near">
-		Il n&apos;y a personne près de vous
-	</string>
-	<string name="no_results">
-		Aucun résultat
-	</string>
-	<string name="searching">
-		Recherche...
-	</string>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="avatarpicker" title="CHOISIR LE RÉSIDENT">
+	<tab_container name="ResidentChooserTabs">
+		<panel label="Rechercher" name="SearchPanel">
+			<text name="InstructSearchResidentName">
+				Saisissez une partie du nom du résident :
+			</text>
+			<button label="OK" label_selected="OK" name="Find"/>
+		</panel>
+		<panel label="Cartes de visite" name="CallingCardsPanel">
+			<text name="InstructSelectCallingCard">
+				Sélectionnez une carte de visite :
+			</text>
+		</panel>
+		<panel label="Près de moi" name="NearMePanel">
+			<text name="InstructSelectResident">
+				Sélectionner une personne près de vous :
+			</text>
+			<button font="SansSerifSmall" label="Rafraîchir la liste" label_selected="Rafraîchir la liste" left_delta="10" name="Refresh" width="105"/>
+			<slider bottom_delta="-36" label="Distance" name="near_me_range"/>
+			<text name="meters">
+				mètres
+			</text>
+			<scroll_list bottom_delta="-169" height="159" name="NearMe"/>
+		</panel>
+	</tab_container>
+	<button label="OK" label_selected="OK" name="Select"/>
+	<button label="Annuler" label_selected="Annuler" name="Cancel"/>
+	<string name="not_found">
+		&apos;[TEXT]&apos; introuvable
+	</string>
+	<string name="no_one_near">
+		Il n&apos;y a personne près de vous
+	</string>
+	<string name="no_results">
+		Aucun résultat
+	</string>
+	<string name="searching">
+		Recherche...
+	</string>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_beacons.xml b/indra/newview/skins/default/xui/fr/floater_beacons.xml
index a7476898830..fd9cd057e99 100644
--- a/indra/newview/skins/default/xui/fr/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/fr/floater_beacons.xml
@@ -1,21 +1,21 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="beacons" title="BALISES">
-	<panel name="beacons_panel">
-		<text name="label_show">
-			Afficher :
-		</text>
-		<check_box label="Balises" name="beacons"/>
-		<check_box label="Surbrillances" name="highlights"/>
-		<text name="beacon_width_label" tool_tip="Largeur de la balise">
-			Largeur :
-		</text>
-		<text name="label_objects">
-			Pour ces objets :
-		</text>
-		<check_box label="Physique" name="physical"/>
-		<check_box label="Scripté" name="scripted"/>
-		<check_box label="Toucher uniquement" name="touch_only"/>
-		<check_box label="Sources sonores" name="sounds"/>
-		<check_box label="Sources des particules" name="particles"/>
-	</panel>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="beacons" title="BALISES">
+	<panel name="beacons_panel">
+		<text name="label_show">
+			Afficher :
+		</text>
+		<check_box label="Balises" name="beacons"/>
+		<check_box label="Surbrillances" name="highlights"/>
+		<text name="beacon_width_label" tool_tip="Largeur de la balise">
+			Largeur :
+		</text>
+		<text name="label_objects">
+			Pour ces objets :
+		</text>
+		<check_box label="Physique" name="physical"/>
+		<check_box label="Scripté" name="scripted"/>
+		<check_box label="Toucher uniquement" name="touch_only"/>
+		<check_box label="Sources sonores" name="sounds"/>
+		<check_box label="Sources des particules" name="particles"/>
+	</panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_build_options.xml b/indra/newview/skins/default/xui/fr/floater_build_options.xml
index e8e6a59dc4f..997ca9d27be 100644
--- a/indra/newview/skins/default/xui/fr/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/fr/floater_build_options.xml
@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="build options floater" title="OPTIONS DE LA GRILLE">
-	<spinner label="Unités (mètres)" name="GridResolution"/>
-	<spinner label="Mesures (mètres)" name="GridDrawSize"/>
-	<check_box label="Fixation des sous-unités" name="GridSubUnit"/>
-	<check_box label="Afficher les sections transversales" name="GridCrossSection"/>
-	<text name="grid_opacity_label" tool_tip="Opacité de la grille">
-		Opacité :
-	</text>
-	<slider label="Opacité de la grille" name="GridOpacity"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="build options floater" title="OPTIONS DE LA GRILLE">
+	<spinner label="Unités (mètres)" name="GridResolution"/>
+	<spinner label="Mesures (mètres)" name="GridDrawSize"/>
+	<check_box label="Fixation des sous-unités" name="GridSubUnit"/>
+	<check_box label="Afficher les sections transversales" name="GridCrossSection"/>
+	<text name="grid_opacity_label" tool_tip="Opacité de la grille">
+		Opacité :
+	</text>
+	<slider label="Opacité de la grille" name="GridOpacity"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml
index 212ee2504a8..b2cef62e248 100644
--- a/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml
@@ -1,53 +1,53 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="Modifier les droits relatifs au contenu">
-	<floater.string name="nothing_to_modify_text">
-		La sélection contient des contenus non modifiables.
-	</floater.string>
-	<floater.string name="status_text">
-		Permissions paramétrées sur [NAME]
-	</floater.string>
-	<floater.string name="start_text">
-		Demande de changement des droits lancée...
-	</floater.string>
-	<floater.string name="done_text">
-		Demande de changement des droits finie.
-	</floater.string>
-	<check_box label="Animation" name="check_animation"/>
-	<icon name="icon_animation" tool_tip="Animation"/>
-	<check_box label="Parties du corps" name="check_bodypart"/>
-	<icon name="icon_bodypart" tool_tip="Parties du corps"/>
-	<check_box label="Habits" name="check_clothing"/>
-	<icon name="icon_clothing" tool_tip="Habits"/>
-	<check_box label="Gestes" name="check_gesture"/>
-	<icon name="icon_gesture" tool_tip="Gestes"/>
-	<check_box label="Notes" name="check_notecard"/>
-	<icon name="icon_notecard" tool_tip="Notes"/>
-	<check_box label="Objets" name="check_object"/>
-	<icon name="icon_object" tool_tip="Objets"/>
-	<check_box label="Scripts" name="check_script"/>
-	<icon name="icon_script" tool_tip="Scripts"/>
-	<check_box label="Sons" name="check_sound"/>
-	<icon name="icon_sound" tool_tip="Sons"/>
-	<check_box label="Textures" name="check_texture"/>
-	<button label="√ Tout" label_selected="Tout" name="check_all"/>
-	<button label="Effacer" label_selected="Aucun" name="check_none"/>
-	<text name="newperms">
-		Nouvelles permissions relatives au contenu
-	</text>
-	<text name="GroupLabel">
-		Groupe :
-	</text>
-	<check_box label="Partager" name="share_with_group"/>
-	<text name="AnyoneLabel">
-		N&apos;importe qui :
-	</text>
-	<check_box label="Copier" name="everyone_copy"/>
-	<text name="NextOwnerLabel">
-		Le prochain propriétaire :
-	</text>
-	<check_box label="Modifier" name="next_owner_modify"/>
-	<check_box label="Copier" name="next_owner_copy"/>
-	<check_box initial_value="true" label="Transférer" name="next_owner_transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/>
-	<button label="OK" name="apply"/>
-	<button label="Annuler" name="close"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterbulkperms" title="Modifier les droits relatifs au contenu">
+	<floater.string name="nothing_to_modify_text">
+		La sélection contient des contenus non modifiables.
+	</floater.string>
+	<floater.string name="status_text">
+		Permissions paramétrées sur [NAME]
+	</floater.string>
+	<floater.string name="start_text">
+		Demande de changement des droits lancée...
+	</floater.string>
+	<floater.string name="done_text">
+		Demande de changement des droits finie.
+	</floater.string>
+	<check_box label="Animation" name="check_animation"/>
+	<icon name="icon_animation" tool_tip="Animation"/>
+	<check_box label="Parties du corps" name="check_bodypart"/>
+	<icon name="icon_bodypart" tool_tip="Parties du corps"/>
+	<check_box label="Habits" name="check_clothing"/>
+	<icon name="icon_clothing" tool_tip="Habits"/>
+	<check_box label="Gestes" name="check_gesture"/>
+	<icon name="icon_gesture" tool_tip="Gestes"/>
+	<check_box label="Notes" name="check_notecard"/>
+	<icon name="icon_notecard" tool_tip="Notes"/>
+	<check_box label="Objets" name="check_object"/>
+	<icon name="icon_object" tool_tip="Objets"/>
+	<check_box label="Scripts" name="check_script"/>
+	<icon name="icon_script" tool_tip="Scripts"/>
+	<check_box label="Sons" name="check_sound"/>
+	<icon name="icon_sound" tool_tip="Sons"/>
+	<check_box label="Textures" name="check_texture"/>
+	<button label="√ Tout" label_selected="Tout" name="check_all"/>
+	<button label="Effacer" label_selected="Aucun" name="check_none"/>
+	<text name="newperms">
+		Nouvelles permissions relatives au contenu
+	</text>
+	<text name="GroupLabel">
+		Groupe :
+	</text>
+	<check_box label="Partager" name="share_with_group"/>
+	<text name="AnyoneLabel">
+		N&apos;importe qui :
+	</text>
+	<check_box label="Copier" name="everyone_copy"/>
+	<text name="NextOwnerLabel">
+		Le prochain propriétaire :
+	</text>
+	<check_box label="Modifier" name="next_owner_modify"/>
+	<check_box label="Copier" name="next_owner_copy"/>
+	<check_box initial_value="true" label="Transférer" name="next_owner_transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/>
+	<button label="OK" name="apply"/>
+	<button label="Annuler" name="close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_object.xml b/indra/newview/skins/default/xui/fr/floater_buy_object.xml
index 86b67ad491d..0bfc4e90e5c 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_object.xml
@@ -1,26 +1,26 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="ACHETER UNE COPIE DE L&apos;OBJET">
-	<text name="contents_text">
-		Contient :
-	</text>
-	<text name="buy_text">
-		Acheter pour [AMOUNT] L$ à [NAME] ?
-	</text>
-	<button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
-	<button label="Acheter" label_selected="Acheter" name="buy_btn"/>
-	<string name="title_buy_text">
-		Acheter
-	</string>
-	<string name="title_buy_copy_text">
-		Acheter une copie
-	</string>
-	<string name="no_copy_text">
-		(pas de copie)
-	</string>
-	<string name="no_modify_text">
-		(pas de modification)
-	</string>
-	<string name="no_transfer_text">
-		(pas de transfert)
-	</string>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="ACHETER UNE COPIE DE L&apos;OBJET">
+	<text name="contents_text">
+		Contient :
+	</text>
+	<text name="buy_text">
+		Acheter pour [AMOUNT] L$ à [NAME] ?
+	</text>
+	<button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
+	<button label="Acheter" label_selected="Acheter" name="buy_btn"/>
+	<string name="title_buy_text">
+		Acheter
+	</string>
+	<string name="title_buy_copy_text">
+		Acheter une copie
+	</string>
+	<string name="no_copy_text">
+		(pas de copie)
+	</string>
+	<string name="no_modify_text">
+		(pas de modification)
+	</string>
+	<string name="no_transfer_text">
+		(pas de transfert)
+	</string>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_camera.xml b/indra/newview/skins/default/xui/fr/floater_camera.xml
index 2fc01b9f171..b2a280d8549 100644
--- a/indra/newview/skins/default/xui/fr/floater_camera.xml
+++ b/indra/newview/skins/default/xui/fr/floater_camera.xml
@@ -1,23 +1,23 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater">
-	<floater.string name="rotate_tooltip">
-		Faire tourner la caméra autour du point central
-	</floater.string>
-	<floater.string name="zoom_tooltip">
-		Zoomer en direction du point central
-	</floater.string>
-	<floater.string name="move_tooltip">
-		Déplacer la caméra vers le haut et le bas, la gauche et la droite
-	</floater.string>
-	<panel name="controls">
-		<joystick_track name="cam_track_stick" tool_tip="Déplacer la caméra vers le haut et le bas, la gauche et la droite"/>
-		<joystick_zoom name="zoom" tool_tip="Zoomer en direction du point central"/>
-		<joystick_rotate name="cam_rotate_stick" tool_tip="Faire tourner la caméra autour du point central"/>
-	</panel>
-	<panel name="buttons">
-		<button label="" name="orbit_btn" tool_tip="Faire tourner la caméra"/>
-		<button label="" name="pan_btn" tool_tip="Vue panoramique"/>
-		<button label="" name="avatarview_btn" tool_tip="Vue subjective"/>
-		<button label="" name="freecamera_btn" tool_tip="Voir l&apos;objet"/>
-	</panel>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="camera_floater">
+	<floater.string name="rotate_tooltip">
+		Faire tourner la caméra autour du point central
+	</floater.string>
+	<floater.string name="zoom_tooltip">
+		Zoomer en direction du point central
+	</floater.string>
+	<floater.string name="move_tooltip">
+		Déplacer la caméra vers le haut et le bas, la gauche et la droite
+	</floater.string>
+	<panel name="controls">
+		<joystick_track name="cam_track_stick" tool_tip="Déplacer la caméra vers le haut et le bas, la gauche et la droite"/>
+		<joystick_zoom name="zoom" tool_tip="Zoomer en direction du point central"/>
+		<joystick_rotate name="cam_rotate_stick" tool_tip="Faire tourner la caméra autour du point central"/>
+	</panel>
+	<panel name="buttons">
+		<button label="" name="orbit_btn" tool_tip="Faire tourner la caméra"/>
+		<button label="" name="pan_btn" tool_tip="Vue panoramique"/>
+		<button label="" name="avatarview_btn" tool_tip="Vue subjective"/>
+		<button label="" name="freecamera_btn" tool_tip="Voir l&apos;objet"/>
+	</panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_color_picker.xml b/indra/newview/skins/default/xui/fr/floater_color_picker.xml
index 111e4d3e5e1..8ce65744217 100644
--- a/indra/newview/skins/default/xui/fr/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/fr/floater_color_picker.xml
@@ -1,32 +1,32 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="ColorPicker" title="CHOIX DE TEXTURE ET DE COULEUR">
-	<text name="r_val_text">
-		Rouge :
-	</text>
-	<text name="g_val_text">
-		Vert :
-	</text>
-	<text name="b_val_text">
-		Bleu :
-	</text>
-	<text name="h_val_text">
-		Teinte :
-	</text>
-	<text name="s_val_text">
-		Sat :
-	</text>
-	<text name="l_val_text">
-		Lum :
-	</text>
-	<check_box label="Appliquer maintenant" left="4" name="apply_immediate" width="108"/>
-	<button label="" label_selected="" left_delta="138" name="color_pipette"/>
-	<button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
-	<button label="OK" label_selected="Sélectionner" name="select_btn"/>
-	<text left="8" name="Current color:">
-		Couleur actuelle :
-	</text>
-	<text left="8" name="(Drag below to save.)" width="114">
-		(Faire glisser dessous
-pour enregistrer)
-	</text>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="ColorPicker" title="CHOIX DE TEXTURE ET DE COULEUR">
+	<text name="r_val_text">
+		Rouge :
+	</text>
+	<text name="g_val_text">
+		Vert :
+	</text>
+	<text name="b_val_text">
+		Bleu :
+	</text>
+	<text name="h_val_text">
+		Teinte :
+	</text>
+	<text name="s_val_text">
+		Sat :
+	</text>
+	<text name="l_val_text">
+		Lum :
+	</text>
+	<check_box label="Appliquer maintenant" left="4" name="apply_immediate" width="108"/>
+	<button label="" label_selected="" left_delta="138" name="color_pipette"/>
+	<button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
+	<button label="OK" label_selected="Sélectionner" name="select_btn"/>
+	<text left="8" name="Current color:">
+		Couleur actuelle :
+	</text>
+	<text left="8" name="(Drag below to save.)" width="114">
+		(Faire glisser dessous
+pour enregistrer)
+	</text>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_god_tools.xml b/indra/newview/skins/default/xui/fr/floater_god_tools.xml
index f670fa9965e..2bf0b9e2f39 100644
--- a/indra/newview/skins/default/xui/fr/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/fr/floater_god_tools.xml
@@ -1,106 +1,106 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="godtools floater" title="OUTILS DIVINS">
-	<tab_container name="GodTools Tabs">
-		<panel label="Grille" name="grid">
-			<button label="Éjecter tous" label_selected="Éjecter tous" name="Kick all users" width="175"/>
-			<button label="Vider le cache cartographique de la région" label_selected="Vider le cache cartographique de la région" name="Flush This Region&apos;s Map Visibility Caches" width="285"/>
-		</panel>
-		<panel label="Région" name="region">
-			<text name="Sim Name:" width="70">
-				Nom du sim :
-			</text>
-			<line_editor left="85" name="region name" width="198"/>
-			<check_box label="Initiation" name="check prelude" tool_tip="Définir cette région comme zone d&apos;initiation."/>
-			<check_box label="Soleil fixe" name="check fixed sun" tool_tip="Définir la position du soleil (comme dans Région et Domaine &gt; Terrain.)"/>
-			<check_box height="32" label="Réinitialiser le domicile 
-à la téléportation" name="check reset home" tool_tip="Lorsqu&apos;un résident se téléporte à l&apos;extérieur, réinitialise son domicile à la position de sa destination."/>
-			<check_box bottom_delta="-32" label="Visible" name="check visible" tool_tip="Cochez pour rendre la région visible aux non-admins."/>
-			<check_box label="Dégâts" name="check damage" tool_tip="Cochez pour activer les dégâts dans cette région."/>
-			<check_box label="Bloquer le suivi de trafic" name="block dwell" tool_tip="Cochez pour que la région ne comptabilise pas le trafic."/>
-			<check_box label="Interdire le terraformage" name="block terraform" tool_tip="Cochez pour empêcher les personnes de terraformer leur terrain"/>
-			<check_box label="Bac à sable" name="is sandbox" tool_tip="Basculer cette région en bac à sable."/>
-			<button label="Figer le terrain" label_selected="Figer le terrain" name="Bake Terrain" tool_tip="Enregistrer le terrain actuel comme terrain par défaut." width="118"/>
-			<button label="Rétablir le terrain" label_selected="Rétablir le terrain" name="Revert Terrain" tool_tip="Remplacer le terrain actuel avec le terrain par défaut." width="118"/>
-			<button label="Échanger le terrain" label_selected="Échanger le terrain" name="Swap Terrain" tool_tip="Échangez le terrain actuel avec le terrain par défaut." width="118"/>
-			<text name="estate id">
-				ID du domaine :
-			</text>
-			<text name="parent id">
-				ID parent :
-			</text>
-			<line_editor name="parentestate" tool_tip="Il s&apos;agit du domaine parent de cette région"/>
-			<text name="Grid Pos: ">
-				Position sur la grille :
-			</text>
-			<line_editor left_delta="120" name="gridposx" tool_tip="Position x de cette région sur la grille" width="35"/>
-			<line_editor left_delta="40" name="gridposy" tool_tip="Position y de cette région sur la grille" width="35"/>
-			<text name="Redirect to Grid: ">
-				Rediriger vers la grille :
-			</text>
-			<line_editor left_delta="120" name="redirectx" width="35"/>
-			<line_editor left_delta="40" name="redirecty" width="35"/>
-			<text font="SansSerifSmall" left_delta="-120" name="billable factor text" width="120">
-				Facteur de facturation :
-			</text>
-			<spinner left="320" name="billable factor" width="70"/>
-			<text left_delta="-120" name="land cost text">
-				L$ par m² :
-			</text>
-			<spinner left="320" name="land cost" width="70"/>
-			<button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh" tool_tip="Cliquez ici pour rafraîchir les informations ci-dessus."/>
-			<button label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus."/>
-			<button label="Sélectionner une région" label_selected="Sélectionner une région" left="136" name="Select Region" tool_tip="Sélectionnez une région entière à l&apos;aide de l&apos;outil Terrain." width="140"/>
-			<button label="Sauvegarde automatique" label_selected="Sauvegarde automatique" left="136" name="Autosave now" tool_tip="Sauvegarde automatique au format gzip." width="140"/>
-		</panel>
-		<panel label="Objets" name="objects">
-			<panel.string name="no_target">
-				(aucune cible)
-			</panel.string>
-			<text name="Sim Name:" width="70">
-				Nom du sim :
-			</text>
-			<text left_delta="75" name="region name">
-				Welsh
-			</text>
-			<check_box label="Désactiver les 
-scripts" name="disable scripts" tool_tip="Cochez pour désactiver tous les scripts dans cette région"/>
-			<check_box label="Désactiver les 
-collisions" name="disable collisions" tool_tip="Cochez pour désactiver les collisions entre non-avatars dans cette région"/>
-			<check_box label="Désactiver la 
-physique" name="disable physics" tool_tip="Cochez pour désactiver tous les effets liés à la physique dans cette région"/>
-			<button bottom="-85" label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus."/>
-			<button label="Définir la cible" label_selected="Définir la cible" name="Set Target" tool_tip="Définir l&apos;avatar cible pour la suppression de l&apos;objet."/>
-			<text name="target_avatar_name">
-				(aucune cible)
-			</text>
-			<button label="Supprimer tous les objets scriptés de la cible sur les terrains des autres" label_selected="Supprimer tous les objets scriptés de la cible sur les terrains des autres" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Supprimer tous les objets scriptés appartenant à la cible sur les terrains ne lui appartenant pas. Les objets non copiables seront renvoyés."/>
-			<button label="Supprimer les objets scriptés de la cible sur *tous* les terrains" label_selected="Supprimer les objets scriptés de la cible sur *tous* les terrains" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Supprimer les objets scriptés appartenant à la cible dans cette région. Les objets non copiables seront renvoyés."/>
-			<button label="Supprimer *tous* les objets de la cible" label_selected="Supprimer *tous* les objets de la cible" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Supprimer tous les objets appartenant à la cible dans cette région. Les objets non copiables seront renvoyés."/>
-			<button label="Afficher les collisions les plus consommatrices" label_selected="Afficher les collisions les plus consommatrices" name="Get Top Colliders" tool_tip="Dresse une liste des objets avec les callbacks les plus fréquents. " width="300"/>
-			<button label="Afficher les objets scriptés les plus consommateurs" label_selected="Afficher les objets scriptés les plus consommateurs" name="Get Top Scripts" tool_tip="Dresse une liste des objets qui passent le plus de temps à exécuter des scripts." width="300"/>
-			<button label="Résumé des scripts" label_selected="Résumé des scripts" name="Scripts digest" tool_tip="Dresse une liste des scripts et de leurs occurrences." width="300"/>
-		</panel>
-		<panel label="Requête" name="request">
-			<text name="Destination:">
-				Destination :
-			</text>
-			<combo_box name="destination">
-				<combo_box.item label="Sélection" name="item1"/>
-				<combo_box.item label="Région de l&apos;avatar" name="item2"/>
-			</combo_box>
-			<text name="Request:">
-				Requête :
-			</text>
-			<combo_box name="request">
-				<combo_box.item label="Objets responsables de collisions : étapes" name="item1"/>
-				<combo_box.item label="Nombre de scripts et schéma optionnel" name="item2"/>
-				<combo_box.item label="Schéma des objets" name="item3"/>
-				<combo_box.item label="rezzer &lt;asset_id&gt;" name="item4"/>
-			</combo_box>
-			<text name="Parameter:">
-				Paramètre :
-			</text>
-			<button label="Effectuer la requête" label_selected="Effectuer la requête" name="Make Request" width="140"/>
-		</panel>
-	</tab_container>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="godtools floater" title="OUTILS DIVINS">
+	<tab_container name="GodTools Tabs">
+		<panel label="Grille" name="grid">
+			<button label="Éjecter tous" label_selected="Éjecter tous" name="Kick all users" width="175"/>
+			<button label="Vider le cache cartographique de la région" label_selected="Vider le cache cartographique de la région" name="Flush This Region&apos;s Map Visibility Caches" width="285"/>
+		</panel>
+		<panel label="Région" name="region">
+			<text name="Sim Name:" width="70">
+				Nom du sim :
+			</text>
+			<line_editor left="85" name="region name" width="198"/>
+			<check_box label="Initiation" name="check prelude" tool_tip="Définir cette région comme zone d&apos;initiation."/>
+			<check_box label="Soleil fixe" name="check fixed sun" tool_tip="Définir la position du soleil (comme dans Région et Domaine &gt; Terrain.)"/>
+			<check_box height="32" label="Réinitialiser le domicile 
+à la téléportation" name="check reset home" tool_tip="Lorsqu&apos;un résident se téléporte à l&apos;extérieur, réinitialise son domicile à la position de sa destination."/>
+			<check_box bottom_delta="-32" label="Visible" name="check visible" tool_tip="Cochez pour rendre la région visible aux non-admins."/>
+			<check_box label="Dégâts" name="check damage" tool_tip="Cochez pour activer les dégâts dans cette région."/>
+			<check_box label="Bloquer le suivi de trafic" name="block dwell" tool_tip="Cochez pour que la région ne comptabilise pas le trafic."/>
+			<check_box label="Interdire le terraformage" name="block terraform" tool_tip="Cochez pour empêcher les personnes de terraformer leur terrain"/>
+			<check_box label="Bac à sable" name="is sandbox" tool_tip="Basculer cette région en bac à sable."/>
+			<button label="Figer le terrain" label_selected="Figer le terrain" name="Bake Terrain" tool_tip="Enregistrer le terrain actuel comme terrain par défaut." width="118"/>
+			<button label="Rétablir le terrain" label_selected="Rétablir le terrain" name="Revert Terrain" tool_tip="Remplacer le terrain actuel avec le terrain par défaut." width="118"/>
+			<button label="Échanger le terrain" label_selected="Échanger le terrain" name="Swap Terrain" tool_tip="Échangez le terrain actuel avec le terrain par défaut." width="118"/>
+			<text name="estate id">
+				ID du domaine :
+			</text>
+			<text name="parent id">
+				ID parent :
+			</text>
+			<line_editor name="parentestate" tool_tip="Il s&apos;agit du domaine parent de cette région"/>
+			<text name="Grid Pos: ">
+				Position sur la grille :
+			</text>
+			<line_editor left_delta="120" name="gridposx" tool_tip="Position x de cette région sur la grille" width="35"/>
+			<line_editor left_delta="40" name="gridposy" tool_tip="Position y de cette région sur la grille" width="35"/>
+			<text name="Redirect to Grid: ">
+				Rediriger vers la grille :
+			</text>
+			<line_editor left_delta="120" name="redirectx" width="35"/>
+			<line_editor left_delta="40" name="redirecty" width="35"/>
+			<text font="SansSerifSmall" left_delta="-120" name="billable factor text" width="120">
+				Facteur de facturation :
+			</text>
+			<spinner left="320" name="billable factor" width="70"/>
+			<text left_delta="-120" name="land cost text">
+				L$ par m² :
+			</text>
+			<spinner left="320" name="land cost" width="70"/>
+			<button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh" tool_tip="Cliquez ici pour rafraîchir les informations ci-dessus."/>
+			<button label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus."/>
+			<button label="Sélectionner une région" label_selected="Sélectionner une région" left="136" name="Select Region" tool_tip="Sélectionnez une région entière à l&apos;aide de l&apos;outil Terrain." width="140"/>
+			<button label="Sauvegarde automatique" label_selected="Sauvegarde automatique" left="136" name="Autosave now" tool_tip="Sauvegarde automatique au format gzip." width="140"/>
+		</panel>
+		<panel label="Objets" name="objects">
+			<panel.string name="no_target">
+				(aucune cible)
+			</panel.string>
+			<text name="Sim Name:" width="70">
+				Nom du sim :
+			</text>
+			<text left_delta="75" name="region name">
+				Welsh
+			</text>
+			<check_box label="Désactiver les 
+scripts" name="disable scripts" tool_tip="Cochez pour désactiver tous les scripts dans cette région"/>
+			<check_box label="Désactiver les 
+collisions" name="disable collisions" tool_tip="Cochez pour désactiver les collisions entre non-avatars dans cette région"/>
+			<check_box label="Désactiver la 
+physique" name="disable physics" tool_tip="Cochez pour désactiver tous les effets liés à la physique dans cette région"/>
+			<button bottom="-85" label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus."/>
+			<button label="Définir la cible" label_selected="Définir la cible" name="Set Target" tool_tip="Définir l&apos;avatar cible pour la suppression de l&apos;objet."/>
+			<text name="target_avatar_name">
+				(aucune cible)
+			</text>
+			<button label="Supprimer tous les objets scriptés de la cible sur les terrains des autres" label_selected="Supprimer tous les objets scriptés de la cible sur les terrains des autres" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Supprimer tous les objets scriptés appartenant à la cible sur les terrains ne lui appartenant pas. Les objets non copiables seront renvoyés."/>
+			<button label="Supprimer les objets scriptés de la cible sur *tous* les terrains" label_selected="Supprimer les objets scriptés de la cible sur *tous* les terrains" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Supprimer les objets scriptés appartenant à la cible dans cette région. Les objets non copiables seront renvoyés."/>
+			<button label="Supprimer *tous* les objets de la cible" label_selected="Supprimer *tous* les objets de la cible" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Supprimer tous les objets appartenant à la cible dans cette région. Les objets non copiables seront renvoyés."/>
+			<button label="Afficher les collisions les plus consommatrices" label_selected="Afficher les collisions les plus consommatrices" name="Get Top Colliders" tool_tip="Dresse une liste des objets avec les callbacks les plus fréquents. " width="300"/>
+			<button label="Afficher les objets scriptés les plus consommateurs" label_selected="Afficher les objets scriptés les plus consommateurs" name="Get Top Scripts" tool_tip="Dresse une liste des objets qui passent le plus de temps à exécuter des scripts." width="300"/>
+			<button label="Résumé des scripts" label_selected="Résumé des scripts" name="Scripts digest" tool_tip="Dresse une liste des scripts et de leurs occurrences." width="300"/>
+		</panel>
+		<panel label="Requête" name="request">
+			<text name="Destination:">
+				Destination :
+			</text>
+			<combo_box name="destination">
+				<combo_box.item label="Sélection" name="item1"/>
+				<combo_box.item label="Région de l&apos;avatar" name="item2"/>
+			</combo_box>
+			<text name="Request:">
+				Requête :
+			</text>
+			<combo_box name="request">
+				<combo_box.item label="Objets responsables de collisions : étapes" name="item1"/>
+				<combo_box.item label="Nombre de scripts et schéma optionnel" name="item2"/>
+				<combo_box.item label="Schéma des objets" name="item3"/>
+				<combo_box.item label="rezzer &lt;asset_id&gt;" name="item4"/>
+			</combo_box>
+			<text name="Parameter:">
+				Paramètre :
+			</text>
+			<button label="Effectuer la requête" label_selected="Effectuer la requête" name="Make Request" width="140"/>
+		</panel>
+	</tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
index 018c0d81cf2..e9d5ea62f2b 100644
--- a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
@@ -1,28 +1,28 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Hardware Settings Floater" title="CONFIGURATION DU MATÉRIEL">
-	<text name="Filtering:">
-		Filtres :
-	</text>
-	<check_box label="Filtre anisotrope (plus lent si activé)" name="ani"/>
-	<text name="Antialiasing:">
-		Anti-aliasing :
-	</text>
-	<combo_box label="Anti-aliasing" name="fsaa" width="84">
-		<combo_box.item label="Désactivé" name="FSAADisabled"/>
-		<combo_box.item label="2x" name="2x"/>
-		<combo_box.item label="4x" name="4x"/>
-		<combo_box.item label="8x" name="8x"/>
-		<combo_box.item label="16x" name="16x"/>
-	</combo_box>
-	<spinner label="Gamma :" name="gamma"/>
-	<text left="217" name="(brightness, lower is brighter)">
-		(0 = défaut, valeur faible = plus lumineux)
-	</text>
-	<text name="Enable VBO:">
-		Activer le VBO :
-	</text>
-	<check_box label="Activer OpenGL Vertex Buffer Objects" name="vbo" tool_tip="Sur un matériel moderne, cette option permet une meilleure performance. Par contre, sur un matériel plus ancien, les VBO sont souvent mal implémentés et peuvent causer des crashs lorsqu&apos;ils sont activés."/>
-	<slider label="Mémoire vidéo (Mo) :" name="GrapicsCardTextureMemory" tool_tip="Total de la mémoire alloué aux textures. Mémoire de la carte vidéo par défaut. En réduisant cette valeur, vous pouvez accroître la performance mais les textures risquent de devenir floues."/>
-	<spinner label="Indice du brouillard :" name="fog"/>
-	<button label="OK" label_selected="OK" name="OK"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Hardware Settings Floater" title="CONFIGURATION DU MATÉRIEL">
+	<text name="Filtering:">
+		Filtres :
+	</text>
+	<check_box label="Filtre anisotrope (plus lent si activé)" name="ani"/>
+	<text name="Antialiasing:">
+		Anti-aliasing :
+	</text>
+	<combo_box label="Anti-aliasing" name="fsaa" width="84">
+		<combo_box.item label="Désactivé" name="FSAADisabled"/>
+		<combo_box.item label="2x" name="2x"/>
+		<combo_box.item label="4x" name="4x"/>
+		<combo_box.item label="8x" name="8x"/>
+		<combo_box.item label="16x" name="16x"/>
+	</combo_box>
+	<spinner label="Gamma :" name="gamma"/>
+	<text left="217" name="(brightness, lower is brighter)">
+		(0 = défaut, valeur faible = plus lumineux)
+	</text>
+	<text name="Enable VBO:">
+		Activer le VBO :
+	</text>
+	<check_box label="Activer OpenGL Vertex Buffer Objects" name="vbo" tool_tip="Sur un matériel moderne, cette option permet une meilleure performance. Par contre, sur un matériel plus ancien, les VBO sont souvent mal implémentés et peuvent causer des crashs lorsqu&apos;ils sont activés."/>
+	<slider label="Mémoire vidéo (Mo) :" name="GrapicsCardTextureMemory" tool_tip="Total de la mémoire alloué aux textures. Mémoire de la carte vidéo par défaut. En réduisant cette valeur, vous pouvez accroître la performance mais les textures risquent de devenir floues."/>
+	<spinner label="Indice du brouillard :" name="fog"/>
+	<button label="OK" label_selected="OK" name="OK"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_image_preview.xml b/indra/newview/skins/default/xui/fr/floater_image_preview.xml
index 57b60a28bf5..a28e0bd7d5f 100644
--- a/indra/newview/skins/default/xui/fr/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_image_preview.xml
@@ -1,32 +1,32 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Image Preview" title="">
-	<text name="name_label">
-		Nom :
-	</text>
-	<text name="description_label">
-		Description :
-	</text>
-	<text name="preview_label">
-		Prévisualiser comme :
-	</text>
-	<combo_box label="Habits" left="126" name="clothing_type_combo">
-		<combo_box.item label="Image" name="Image"/>
-		<combo_box.item label="Cheveux" name="Hair"/>
-		<combo_box.item label="Tête de femme" name="FemaleHead"/>
-		<combo_box.item label="Corps de femme (haut)" name="FemaleUpperBody"/>
-		<combo_box.item label="Corps de femme (bas)" name="FemaleLowerBody"/>
-		<combo_box.item label="Tête d&apos;homme" name="MaleHead"/>
-		<combo_box.item label="Corps d&apos;homme (haut)" name="MaleUpperBody"/>
-		<combo_box.item label="Corps d&apos;homme (bas)" name="MaleLowerBody"/>
-		<combo_box.item label="Jupe" name="Skirt"/>
-		<combo_box.item label="Sculptie" name="SculptedPrim"/>
-	</combo_box>
-	<text name="bad_image_text">
-		Impossible de lire l&apos;image.
-
-Sauvegardez en Targa 24 bit (.tga).
-	</text>
-	<check_box label="Utiliser une compression sans perte" name="lossless_check"/>
-	<button label="Annuler" name="cancel_btn"/>
-	<button label="Charger ([AMOUNT] L$)" name="ok_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Image Preview" title="">
+	<text name="name_label">
+		Nom :
+	</text>
+	<text name="description_label">
+		Description :
+	</text>
+	<text name="preview_label">
+		Prévisualiser comme :
+	</text>
+	<combo_box label="Habits" left="126" name="clothing_type_combo">
+		<combo_box.item label="Image" name="Image"/>
+		<combo_box.item label="Cheveux" name="Hair"/>
+		<combo_box.item label="Tête de femme" name="FemaleHead"/>
+		<combo_box.item label="Corps de femme (haut)" name="FemaleUpperBody"/>
+		<combo_box.item label="Corps de femme (bas)" name="FemaleLowerBody"/>
+		<combo_box.item label="Tête d&apos;homme" name="MaleHead"/>
+		<combo_box.item label="Corps d&apos;homme (haut)" name="MaleUpperBody"/>
+		<combo_box.item label="Corps d&apos;homme (bas)" name="MaleLowerBody"/>
+		<combo_box.item label="Jupe" name="Skirt"/>
+		<combo_box.item label="Sculptie" name="SculptedPrim"/>
+	</combo_box>
+	<text name="bad_image_text">
+		Impossible de lire l&apos;image.
+
+Sauvegardez en Targa 24 bit (.tga).
+	</text>
+	<check_box label="Utiliser une compression sans perte" name="lossless_check"/>
+	<button label="Annuler" name="cancel_btn"/>
+	<button label="Charger ([AMOUNT] L$)" name="ok_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
index 2e982305bf2..44d420d8655 100644
--- a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
@@ -1,67 +1,67 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="PROPRIÉTÉS DE L&apos;OBJET DE L&apos;INVENTAIRE">
-	<floater.string name="unknown">
-		(inconnu)
-	</floater.string>
-	<floater.string name="public">
-		(public)
-	</floater.string>
-	<floater.string name="you_can">
-		Vous pouvez :
-	</floater.string>
-	<floater.string name="owner_can">
-		Le propriétaire peut :
-	</floater.string>
-	<text name="LabelItemNameTitle">
-		Nom :
-	</text>
-	<text name="LabelItemDescTitle">
-		Description :
-	</text>
-	<text name="LabelCreatorTitle">
-		Créateur :
-	</text>
-	<text name="LabelCreatorName">
-		Nicole Linden
-	</text>
-	<button label="Profil..." label_selected="" name="BtnCreator"/>
-	<text name="LabelOwnerTitle">
-		Propriétaire :
-	</text>
-	<text name="LabelOwnerName">
-		Thrax Linden
-	</text>
-	<button label="Profil..." label_selected="" name="BtnOwner"/>
-	<text name="LabelAcquiredTitle">
-		Acquis :
-	</text>
-	<text name="LabelAcquiredDate">
-		Wed May 24 12:50:46 2006
-	</text>
-	<text name="OwnerLabel">
-		Vous :
-	</text>
-	<check_box label="Éditer" name="CheckOwnerModify"/>
-	<check_box label="Copier" name="CheckOwnerCopy"/>
-	<check_box label="Revendre" name="CheckOwnerTransfer"/>
-	<text name="AnyoneLabel">
-		N&apos;importe qui :
-	</text>
-	<check_box label="Copier" name="CheckEveryoneCopy"/>
-	<text name="GroupLabel">
-		Groupe :
-	</text>
-	<check_box label="Partager" name="CheckShareWithGroup"/>
-	<text name="NextOwnerLabel" width="192">
-		Le prochain propriétaire :
-	</text>
-	<check_box label="Éditer" name="CheckNextOwnerModify"/>
-	<check_box label="Copier" name="CheckNextOwnerCopy"/>
-	<check_box label="Revendre" name="CheckNextOwnerTransfer"/>
-	<check_box label="À vendre" name="CheckPurchase"/>
-	<combo_box name="combobox sale copy">
-		<combo_box.item label="Copier" name="Copy"/>
-		<combo_box.item label="Original" name="Original"/>
-	</combo_box>
-	<spinner label="Prix : L$" name="Edit Cost"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="item properties" title="PROPRIÉTÉS DE L&apos;OBJET DE L&apos;INVENTAIRE">
+	<floater.string name="unknown">
+		(inconnu)
+	</floater.string>
+	<floater.string name="public">
+		(public)
+	</floater.string>
+	<floater.string name="you_can">
+		Vous pouvez :
+	</floater.string>
+	<floater.string name="owner_can">
+		Le propriétaire peut :
+	</floater.string>
+	<text name="LabelItemNameTitle">
+		Nom :
+	</text>
+	<text name="LabelItemDescTitle">
+		Description :
+	</text>
+	<text name="LabelCreatorTitle">
+		Créateur :
+	</text>
+	<text name="LabelCreatorName">
+		Nicole Linden
+	</text>
+	<button label="Profil..." label_selected="" name="BtnCreator"/>
+	<text name="LabelOwnerTitle">
+		Propriétaire :
+	</text>
+	<text name="LabelOwnerName">
+		Thrax Linden
+	</text>
+	<button label="Profil..." label_selected="" name="BtnOwner"/>
+	<text name="LabelAcquiredTitle">
+		Acquis :
+	</text>
+	<text name="LabelAcquiredDate">
+		Wed May 24 12:50:46 2006
+	</text>
+	<text name="OwnerLabel">
+		Vous :
+	</text>
+	<check_box label="Éditer" name="CheckOwnerModify"/>
+	<check_box label="Copier" name="CheckOwnerCopy"/>
+	<check_box label="Revendre" name="CheckOwnerTransfer"/>
+	<text name="AnyoneLabel">
+		N&apos;importe qui :
+	</text>
+	<check_box label="Copier" name="CheckEveryoneCopy"/>
+	<text name="GroupLabel">
+		Groupe :
+	</text>
+	<check_box label="Partager" name="CheckShareWithGroup"/>
+	<text name="NextOwnerLabel" width="192">
+		Le prochain propriétaire :
+	</text>
+	<check_box label="Éditer" name="CheckNextOwnerModify"/>
+	<check_box label="Copier" name="CheckNextOwnerCopy"/>
+	<check_box label="Revendre" name="CheckNextOwnerTransfer"/>
+	<check_box label="À vendre" name="CheckPurchase"/>
+	<combo_box name="combobox sale copy">
+		<combo_box.item label="Copier" name="Copy"/>
+		<combo_box.item label="Original" name="Original"/>
+	</combo_box>
+	<spinner label="Prix : L$" name="Edit Cost"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_land_holdings.xml b/indra/newview/skins/default/xui/fr/floater_land_holdings.xml
index 87fe2a8352e..1b3127c35d5 100644
--- a/indra/newview/skins/default/xui/fr/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/fr/floater_land_holdings.xml
@@ -1,40 +1,40 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="land holdings floater" title="MES TERRAINS">
-	<scroll_list name="parcel list">
-		<column label="Parcelle" name="name"/>
-		<column label="Région" name="location"/>
-		<column label="Type" name="type"/>
-		<column label="Surface" name="area"/>
-		<column label="" name="hidden"/>
-	</scroll_list>
-	<button label="Téléporter" label_selected="Téléporter" name="Teleport" tool_tip="Téléportez-vous au milieu de ce terrain."/>
-	<button label="Carte" label_selected="Carte" name="Show on Map" tool_tip="Affichez ce terrain sur la carte du monde."/>
-	<text name="contrib_label">
-		Vos contributions :
-	</text>
-	<scroll_list name="grant list">
-		<column label="Groupe" name="group"/>
-		<column label="Surface" name="area"/>
-	</scroll_list>
-	<text name="allowed_label">
-		Surface de terrain autorisée avec votre compte :
-	</text>
-	<text name="allowed_text">
-		[AREA] m²
-	</text>
-	<text name="current_label">
-		Surface occupée actuellement :
-	</text>
-	<text name="current_text">
-		[AREA] m²
-	</text>
-	<text name="available_label">
-		Disponible à l&apos;achat :
-	</text>
-	<text name="available_text">
-		[AREA] m²
-	</text>
-	<string name="area_string">
-		[AREA] m²
-	</string>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="land holdings floater" title="MES TERRAINS">
+	<scroll_list name="parcel list">
+		<column label="Parcelle" name="name"/>
+		<column label="Région" name="location"/>
+		<column label="Type" name="type"/>
+		<column label="Surface" name="area"/>
+		<column label="" name="hidden"/>
+	</scroll_list>
+	<button label="Téléporter" label_selected="Téléporter" name="Teleport" tool_tip="Téléportez-vous au milieu de ce terrain."/>
+	<button label="Carte" label_selected="Carte" name="Show on Map" tool_tip="Affichez ce terrain sur la carte du monde."/>
+	<text name="contrib_label">
+		Vos contributions :
+	</text>
+	<scroll_list name="grant list">
+		<column label="Groupe" name="group"/>
+		<column label="Surface" name="area"/>
+	</scroll_list>
+	<text name="allowed_label">
+		Surface de terrain autorisée avec votre compte :
+	</text>
+	<text name="allowed_text">
+		[AREA] m²
+	</text>
+	<text name="current_label">
+		Surface occupée actuellement :
+	</text>
+	<text name="current_text">
+		[AREA] m²
+	</text>
+	<text name="available_label">
+		Disponible à l&apos;achat :
+	</text>
+	<text name="available_text">
+		[AREA] m²
+	</text>
+	<string name="area_string">
+		[AREA] m²
+	</string>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml
index 4879327acee..2231d503b28 100644
--- a/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml
@@ -1,15 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script ed float" title="SCRIPT : NOUVEAU SCRIPT">
-	<floater.string name="not_allowed">
-		Ce scipt ne peut pas être copié, visualisé ou modifié.  Pour visualiser ou modifier un script à l&apos;intérieur d&apos;un objet, vous devez avoir les permissions requises.
-	</floater.string>
-	<floater.string name="script_running">
-		Exécution en cours
-	</floater.string>
-	<floater.string name="Title">
-		Script : [NAME]
-	</floater.string>
-	<button label="Réinitialiser" label_selected="Réinitialiser" left="390" name="Reset" width="100"/>
-	<check_box initial_value="true" label="Exécution en cours" left="4" name="running"/>
-	<check_box initial_value="true" label="Mono" left="130" name="mono"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="SCRIPT : NOUVEAU SCRIPT">
+	<floater.string name="not_allowed">
+		Ce scipt ne peut pas être copié, visualisé ou modifié.  Pour visualiser ou modifier un script à l&apos;intérieur d&apos;un objet, vous devez avoir les permissions requises.
+	</floater.string>
+	<floater.string name="script_running">
+		Exécution en cours
+	</floater.string>
+	<floater.string name="Title">
+		Script : [NAME]
+	</floater.string>
+	<button label="Réinitialiser" label_selected="Réinitialiser" left="390" name="Reset" width="100"/>
+	<check_box initial_value="true" label="Exécution en cours" left="4" name="running"/>
+	<check_box initial_value="true" label="Mono" left="130" name="mono"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_map.xml b/indra/newview/skins/default/xui/fr/floater_map.xml
index de5b707ee49..aeef4b0e915 100644
--- a/indra/newview/skins/default/xui/fr/floater_map.xml
+++ b/indra/newview/skins/default/xui/fr/floater_map.xml
@@ -1,54 +1,54 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map">
-	<floater.string name="mini_map_north">
-		N
-	</floater.string>
-	<floater.string name="mini_map_east">
-		E
-	</floater.string>
-	<floater.string name="mini_map_west">
-		O
-	</floater.string>
-	<floater.string name="mini_map_south">
-		S
-	</floater.string>
-	<floater.string name="mini_map_southeast">
-		SE
-	</floater.string>
-	<floater.string name="mini_map_northeast">
-		NE
-	</floater.string>
-	<floater.string name="mini_map_southwest">
-		SO
-	</floater.string>
-	<floater.string name="mini_map_northwest">
-		NO
-	</floater.string>
-	<floater.string name="ToolTipMsg">
-		[AGENT][REGION](Double-cliquez pour ouvrir la carte)
-	</floater.string>
-	<text label="N" name="floater_map_north" text="N">
-		N
-	</text>
-	<text label="E" name="floater_map_east" text="E">
-		E
-	</text>
-	<text label="O" name="floater_map_west" text="O">
-		O
-	</text>
-	<text label="S" name="floater_map_south" text="S">
-		S
-	</text>
-	<text label="SE" name="floater_map_southeast" text="SE">
-		SE
-	</text>
-	<text label="NE" name="floater_map_northeast" text="NE">
-		NE
-	</text>
-	<text label="SO" name="floater_map_southwest" text="SO">
-		SO
-	</text>
-	<text label="NO" name="floater_map_northwest" text="NO">
-		NO
-	</text>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Map">
+	<floater.string name="mini_map_north">
+		N
+	</floater.string>
+	<floater.string name="mini_map_east">
+		E
+	</floater.string>
+	<floater.string name="mini_map_west">
+		O
+	</floater.string>
+	<floater.string name="mini_map_south">
+		S
+	</floater.string>
+	<floater.string name="mini_map_southeast">
+		SE
+	</floater.string>
+	<floater.string name="mini_map_northeast">
+		NE
+	</floater.string>
+	<floater.string name="mini_map_southwest">
+		SO
+	</floater.string>
+	<floater.string name="mini_map_northwest">
+		NO
+	</floater.string>
+	<floater.string name="ToolTipMsg">
+		[AGENT][REGION](Double-cliquez pour ouvrir la carte)
+	</floater.string>
+	<text label="N" name="floater_map_north" text="N">
+		N
+	</text>
+	<text label="E" name="floater_map_east" text="E">
+		E
+	</text>
+	<text label="O" name="floater_map_west" text="O">
+		O
+	</text>
+	<text label="S" name="floater_map_south" text="S">
+		S
+	</text>
+	<text label="SE" name="floater_map_southeast" text="SE">
+		SE
+	</text>
+	<text label="NE" name="floater_map_northeast" text="NE">
+		NE
+	</text>
+	<text label="SO" name="floater_map_southwest" text="SO">
+		SO
+	</text>
+	<text label="NO" name="floater_map_northwest" text="NO">
+		NO
+	</text>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_media_browser.xml b/indra/newview/skins/default/xui/fr/floater_media_browser.xml
index 377b80f847d..44ab075271b 100644
--- a/indra/newview/skins/default/xui/fr/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/fr/floater_media_browser.xml
@@ -1,31 +1,31 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="NAVIGATEUR">
-	<floater.string name="home_page_url">
-		http://www.secondlife.com
-	</floater.string>
-	<floater.string name="support_page_url">
-		http://support.secondlife.com
-	</floater.string>
-	<layout_stack name="stack1">
-		<layout_panel name="nav_controls">
-			<button label="Précédente" name="back" width="75"/>
-			<button label="Suivante" left_delta="75" name="forward" width="70"/>
-			<button label="Rafraîchir" left_delta="75" name="reload"/>
-			<combo_box left_delta="75" name="address" width="510"/>
-			<button label="OK" left_delta="515" name="go"/>
-		</layout_panel>
-		<layout_panel name="time_controls">
-			<button label="en arrière" name="rewind"/>
-			<button label="stop" name="stop"/>
-			<button label="en avant" name="seek"/>
-		</layout_panel>
-		<layout_panel name="parcel_owner_controls">
-			<button label="Envoyer l&apos;URL sur la parcelle" name="assign"/>
-		</layout_panel>
-		<layout_panel name="external_controls">
-			<button label="Ouvrir dans mon navigateur web" name="open_browser" width="196"/>
-			<check_box label="Toujours ouvrir dans mon navigateur web" left_delta="201" name="open_always"/>
-			<button label="Fermer" name="close"/>
-		</layout_panel>
-	</layout_stack>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="NAVIGATEUR">
+	<floater.string name="home_page_url">
+		http://www.secondlife.com
+	</floater.string>
+	<floater.string name="support_page_url">
+		http://support.secondlife.com
+	</floater.string>
+	<layout_stack name="stack1">
+		<layout_panel name="nav_controls">
+			<button label="Précédente" name="back" width="75"/>
+			<button label="Suivante" left_delta="75" name="forward" width="70"/>
+			<button label="Rafraîchir" left_delta="75" name="reload"/>
+			<combo_box left_delta="75" name="address" width="510"/>
+			<button label="OK" left_delta="515" name="go"/>
+		</layout_panel>
+		<layout_panel name="time_controls">
+			<button label="en arrière" name="rewind"/>
+			<button label="stop" name="stop"/>
+			<button label="en avant" name="seek"/>
+		</layout_panel>
+		<layout_panel name="parcel_owner_controls">
+			<button label="Envoyer l&apos;URL sur la parcelle" name="assign"/>
+		</layout_panel>
+		<layout_panel name="external_controls">
+			<button label="Ouvrir dans mon navigateur web" name="open_browser" width="196"/>
+			<check_box label="Toujours ouvrir dans mon navigateur web" left_delta="201" name="open_always"/>
+			<button label="Fermer" name="close"/>
+		</layout_panel>
+	</layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml b/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml
index aadf16ab8ae..eb0f0e64ce2 100644
--- a/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml
@@ -1,18 +1,18 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="MemLeak" title="Simuler une fuite de mémoire">
-	<spinner label="Vitesse de la fuite (octets) :" name="leak_speed"/>
-	<spinner label="Max mémoire perdue (Mo) :" name="max_leak"/>
-	<text name="total_leaked_label">
-		Mémoire perdue actuelle : [SIZE] Ko
-	</text>
-	<text name="note_label_1">
-		[NOTE1]
-	</text>
-	<text name="note_label_2">
-		[NOTE2]
-	</text>
-	<button label="Commencer" name="start_btn" width="85"/>
-	<button label="Stop" left="100" name="stop_btn"/>
-	<button label="Libérer" left="177" name="release_btn"/>
-	<button label="Fermer" name="close_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="MemLeak" title="Simuler une fuite de mémoire">
+	<spinner label="Vitesse de la fuite (octets) :" name="leak_speed"/>
+	<spinner label="Max mémoire perdue (Mo) :" name="max_leak"/>
+	<text name="total_leaked_label">
+		Mémoire perdue actuelle : [SIZE] Ko
+	</text>
+	<text name="note_label_1">
+		[NOTE1]
+	</text>
+	<text name="note_label_2">
+		[NOTE2]
+	</text>
+	<button label="Commencer" name="start_btn" width="85"/>
+	<button label="Stop" left="100" name="stop_btn"/>
+	<button label="Libérer" left="177" name="release_btn"/>
+	<button label="Fermer" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_moveview.xml b/indra/newview/skins/default/xui/fr/floater_moveview.xml
index 7e7dc53c6c8..528fa309eb4 100644
--- a/indra/newview/skins/default/xui/fr/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_moveview.xml
@@ -1,35 +1,35 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move_floater">
-	<string name="walk_forward_tooltip">
-		Vous déplacer vers l&apos;avant (appuyer sur la flèche vers le haut ou W)
-	</string>
-	<string name="walk_back_tooltip">
-		Marcher en arrière (appuyer sur la flèche vers le bas ou S)
-	</string>
-	<string name="run_forward_tooltip">
-		Courir vers l&apos;avant (appuyer sur la flèche vers le haut ou W)
-	</string>
-	<string name="run_back_tooltip">
-		Courir en arrière (appuyer sur la flèche vers le bas ou S)
-	</string>
-	<string name="fly_forward_tooltip">
-		Voler vers l&apos;avant (appuyer sur la flèche vers le haut ou W)
-	</string>
-	<string name="fly_back_tooltip">
-		Voler vers l&apos;arrière (appuyer sur la flèche vers le bas ou S)
-	</string>
-	<panel name="panel_actions">
-		<button label="" label_selected="" name="turn left btn" tool_tip="Tourner à gauche (appuyer sur la flèche de gauche ou sur A)"/>
-		<button label="" label_selected="" name="turn right btn" tool_tip="Tourner à droite (appuyer sur la flèche de droite ou sur D)"/>
-		<button label="" label_selected="" name="move up btn" tool_tip="Vous envoler, appuyer sur E"/>
-		<button label="" label_selected="" name="move down btn" tool_tip="Atterrir, appuyer sur C"/>
-		<joystick_turn name="forward btn" tool_tip="Vous déplacer vers l&apos;avant (appuyer sur la flèche vers le haut ou W)"/>
-		<joystick_turn name="backward btn" tool_tip="Marcher en arrière (appuyer sur la flèche vers le bas ou S)"/>
-	</panel>
-	<panel name="panel_modes">
-		<button label="" name="mode_walk_btn" tool_tip="Mode marche"/>
-		<button label="" name="mode_run_btn" tool_tip="Mode courir"/>
-		<button label="" name="mode_fly_btn" tool_tip="Mode voler"/>
-		<button label="Atterrir" name="stop_fly_btn" tool_tip="Atterrir"/>
-	</panel>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="move_floater">
+	<string name="walk_forward_tooltip">
+		Vous déplacer vers l&apos;avant (appuyer sur la flèche vers le haut ou W)
+	</string>
+	<string name="walk_back_tooltip">
+		Marcher en arrière (appuyer sur la flèche vers le bas ou S)
+	</string>
+	<string name="run_forward_tooltip">
+		Courir vers l&apos;avant (appuyer sur la flèche vers le haut ou W)
+	</string>
+	<string name="run_back_tooltip">
+		Courir en arrière (appuyer sur la flèche vers le bas ou S)
+	</string>
+	<string name="fly_forward_tooltip">
+		Voler vers l&apos;avant (appuyer sur la flèche vers le haut ou W)
+	</string>
+	<string name="fly_back_tooltip">
+		Voler vers l&apos;arrière (appuyer sur la flèche vers le bas ou S)
+	</string>
+	<panel name="panel_actions">
+		<button label="" label_selected="" name="turn left btn" tool_tip="Tourner à gauche (appuyer sur la flèche de gauche ou sur A)"/>
+		<button label="" label_selected="" name="turn right btn" tool_tip="Tourner à droite (appuyer sur la flèche de droite ou sur D)"/>
+		<button label="" label_selected="" name="move up btn" tool_tip="Vous envoler, appuyer sur E"/>
+		<button label="" label_selected="" name="move down btn" tool_tip="Atterrir, appuyer sur C"/>
+		<joystick_turn name="forward btn" tool_tip="Vous déplacer vers l&apos;avant (appuyer sur la flèche vers le haut ou W)"/>
+		<joystick_turn name="backward btn" tool_tip="Marcher en arrière (appuyer sur la flèche vers le bas ou S)"/>
+	</panel>
+	<panel name="panel_modes">
+		<button label="" name="mode_walk_btn" tool_tip="Mode marche"/>
+		<button label="" name="mode_run_btn" tool_tip="Mode courir"/>
+		<button label="" name="mode_fly_btn" tool_tip="Mode voler"/>
+		<button label="Atterrir" name="stop_fly_btn" tool_tip="Atterrir"/>
+	</panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_pay.xml b/indra/newview/skins/default/xui/fr/floater_pay.xml
index 5432cb27d0a..50d7049bba2 100644
--- a/indra/newview/skins/default/xui/fr/floater_pay.xml
+++ b/indra/newview/skins/default/xui/fr/floater_pay.xml
@@ -1,20 +1,20 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Give Money" title="">
-	<text left="5" name="payee_label">
-		Payer :
-	</text>
-	<icon name="icon_person" tool_tip="Résident"/>
-	<text name="payee_name">
-		[FIRST] [LAST]
-	</text>
-	<button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
-	<button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
-	<button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
-	<button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
-	<text left="4" name="amount text">
-		Ou choisissez un montant :
-	</text>
-	<line_editor left="60" name="amount" width="55"/>
-	<button label="Payer" label_selected="Payer" name="pay btn"/>
-	<button label="Annuler" label_selected="Annuler" name="cancel btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Give Money" title="">
+	<text left="5" name="payee_label">
+		Payer :
+	</text>
+	<icon name="icon_person" tool_tip="Résident"/>
+	<text name="payee_name">
+		[FIRST] [LAST]
+	</text>
+	<button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
+	<button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
+	<button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
+	<button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
+	<text left="4" name="amount text">
+		Ou choisissez un montant :
+	</text>
+	<line_editor left="60" name="amount" width="55"/>
+	<button label="Payer" label_selected="Payer" name="pay btn"/>
+	<button label="Annuler" label_selected="Annuler" name="cancel btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_pay_object.xml b/indra/newview/skins/default/xui/fr/floater_pay_object.xml
index 04511f5ba02..a8cac0b566b 100644
--- a/indra/newview/skins/default/xui/fr/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/fr/floater_pay_object.xml
@@ -1,30 +1,30 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Give Money" title="">
-	<string name="payee_group" width="95">
-		Payer le groupe :
-	</string>
-	<string halign="left" name="payee_resident" width="100">
-		Payer le résident :
-	</string>
-	<icon name="icon_person" tool_tip="Résident"/>
-	<text left="105" name="payee_name">
-		[FIRST] [LAST]
-	</text>
-	<text left="25" name="object_name_label">
-		Via un objet :
-	</text>
-	<icon name="icon_object" tool_tip="Objets"/>
-	<text left="105" name="object_name_text">
-		...
-	</text>
-	<button label="1 L$" label_selected="1 L$" left="105" name="fastpay 1"/>
-	<button label="5 L$" label_selected="5 L$" left="190" name="fastpay 5"/>
-	<button label="10 L$" label_selected="10 L$" left="105" name="fastpay 10"/>
-	<button label="20 L$" label_selected="20 L$" left="190" name="fastpay 20"/>
-	<text halign="left" left="5" name="amount text">
-		Ou choisissez un montant :
-	</text>
-	<line_editor left="65" name="amount" width="50"/>
-	<button label="Payer" label_selected="Payer" name="pay btn"/>
-	<button label="Annuler" label_selected="Annuler" name="cancel btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Give Money" title="">
+	<string name="payee_group" width="95">
+		Payer le groupe :
+	</string>
+	<string halign="left" name="payee_resident" width="100">
+		Payer le résident :
+	</string>
+	<icon name="icon_person" tool_tip="Résident"/>
+	<text left="105" name="payee_name">
+		[FIRST] [LAST]
+	</text>
+	<text left="25" name="object_name_label">
+		Via un objet :
+	</text>
+	<icon name="icon_object" tool_tip="Objets"/>
+	<text left="105" name="object_name_text">
+		...
+	</text>
+	<button label="1 L$" label_selected="1 L$" left="105" name="fastpay 1"/>
+	<button label="5 L$" label_selected="5 L$" left="190" name="fastpay 5"/>
+	<button label="10 L$" label_selected="10 L$" left="105" name="fastpay 10"/>
+	<button label="20 L$" label_selected="20 L$" left="190" name="fastpay 20"/>
+	<text halign="left" left="5" name="amount text">
+		Ou choisissez un montant :
+	</text>
+	<line_editor left="65" name="amount" width="50"/>
+	<button label="Payer" label_selected="Payer" name="pay btn"/>
+	<button label="Annuler" label_selected="Annuler" name="cancel btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_animation.xml b/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
index b7d3eb0a799..4811760bbfd 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview_anim">
-	<floater.string name="Title">
-		Animation : [NAME]
-	</floater.string>
-	<text name="desc txt">
-		Description :
-	</text>
-	<button label="Jouer dans le Monde" label_selected="Stop" left="20" name="Anim play btn" tool_tip="Jouer cette animation et partagez-la avec d&apos;autres." width="131"/>
-	<button label="Jouer localement" label_selected="Stop" left="162" name="Anim audition btn" tool_tip="Jouer cette animation et soyez le seul à la voir." width="125"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_anim">
+	<floater.string name="Title">
+		Animation : [NAME]
+	</floater.string>
+	<text name="desc txt">
+		Description :
+	</text>
+	<button label="Jouer dans le Monde" label_selected="Stop" left="20" name="Anim play btn" tool_tip="Jouer cette animation et partagez-la avec d&apos;autres." width="131"/>
+	<button label="Jouer localement" label_selected="Stop" left="162" name="Anim audition btn" tool_tip="Jouer cette animation et soyez le seul à la voir." width="125"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_classified.xml b/indra/newview/skins/default/xui/fr/floater_preview_classified.xml
index a50a4057f8d..f7a70db96e9 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_classified.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_classified.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="classified_preview" title="INFORMATIONS SUR LA PETITE ANNONCE">
-	<floater.string name="Title">
-		Petite annonce : [NAME]
-	</floater.string>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="classified_preview" title="INFORMATIONS SUR LA PETITE ANNONCE">
+	<floater.string name="Title">
+		Petite annonce : [NAME]
+	</floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_event.xml b/indra/newview/skins/default/xui/fr/floater_preview_event.xml
index b901751eecf..30e6a218cb5 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_event.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_event.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="event_preview" title="INFORMATIONS SUR L&apos;ÉVÉNEMENT">
-	<floater.string name="Title">
-		Événement : [NAME]
-	</floater.string>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="event_preview" title="INFORMATIONS SUR L&apos;ÉVÉNEMENT">
+	<floater.string name="Title">
+		Événement : [NAME]
+	</floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture_info.xml
index e6a4514460b..4bdd52f14a2 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_gesture_info.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture_info.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Gesture" title="Raccourci du geste"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="Raccourci du geste"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture_steps.xml
index e6a4514460b..4bdd52f14a2 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_gesture_steps.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture_steps.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Gesture" title="Raccourci du geste"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="Raccourci du geste"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml b/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml
index 1039760623e..d5d984238a3 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml
@@ -1,22 +1,22 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview notecard" title="REMARQUE :">
-	<floater.string name="no_object">
-		Impossible de trouver l&apos;objet contenant cette note.
-	</floater.string>
-	<floater.string name="not_allowed">
-		Vous n&apos;avez pas le droit de voir cette note.
-	</floater.string>
-	<floater.string name="Title">
-		Note : [NAME]
-	</floater.string>
-	<floater.string label="Enregistrer" label_selected="Enregistrer" name="Save">
-		Enregistrer
-	</floater.string>
-	<text name="desc txt">
-		Description :
-	</text>
-	<text_editor name="Notecard Editor">
-		Chargement...
-	</text_editor>
-	<button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview notecard" title="REMARQUE :">
+	<floater.string name="no_object">
+		Impossible de trouver l&apos;objet contenant cette note.
+	</floater.string>
+	<floater.string name="not_allowed">
+		Vous n&apos;avez pas le droit de voir cette note.
+	</floater.string>
+	<floater.string name="Title">
+		Note : [NAME]
+	</floater.string>
+	<floater.string label="Enregistrer" label_selected="Enregistrer" name="Save">
+		Enregistrer
+	</floater.string>
+	<text name="desc txt">
+		Description :
+	</text>
+	<text_editor name="Notecard Editor">
+		Chargement...
+	</text_editor>
+	<button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_sound.xml b/indra/newview/skins/default/xui/fr/floater_preview_sound.xml
index d1729ac8dfe..9d9b067a8df 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_sound.xml
@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview_sound">
-	<floater.string name="Title">
-		Son : [NAME]
-	</floater.string>
-	<text name="desc txt">
-		Description :
-	</text>
-	<button label="Jouer dans le Monde" label_selected="Jouer dans le Monde" left_delta="-142" name="Sound play btn" tool_tip="Jouer ce son et partagez-le avec d&apos;autres." width="131"/>
-	<button label="Jouer localement" label_selected="Jouer localement" left="162" name="Sound audition btn" tool_tip="Jouer ce son et soyez le seul à l&apos;entendre." width="125"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_sound">
+	<floater.string name="Title">
+		Son : [NAME]
+	</floater.string>
+	<text name="desc txt">
+		Description :
+	</text>
+	<button label="Jouer dans le Monde" label_selected="Jouer dans le Monde" left_delta="-142" name="Sound play btn" tool_tip="Jouer ce son et partagez-le avec d&apos;autres." width="131"/>
+	<button label="Jouer localement" label_selected="Jouer localement" left="162" name="Sound audition btn" tool_tip="Jouer ce son et soyez le seul à l&apos;entendre." width="125"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_texture.xml b/indra/newview/skins/default/xui/fr/floater_preview_texture.xml
index beebebfd4da..a2653143a6a 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_texture.xml
@@ -1,17 +1,17 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview_texture">
-	<floater.string name="Title">
-		Texture : [NAME]
-	</floater.string>
-	<floater.string name="Copy">
-		Copier dans l&apos;inventaire
-	</floater.string>
-	<text name="desc txt">
-		Description :
-	</text>
-	<button label="Enregistrer" name="Keep"/>
-	<button label="Supprimer" name="Discard"/>
-	<text name="dimensions">
-		[WIDTH]px x [HEIGHT]px
-	</text>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_texture">
+	<floater.string name="Title">
+		Texture : [NAME]
+	</floater.string>
+	<floater.string name="Copy">
+		Copier dans l&apos;inventaire
+	</floater.string>
+	<text name="desc txt">
+		Description :
+	</text>
+	<button label="Enregistrer" name="Keep"/>
+	<button label="Supprimer" name="Discard"/>
+	<text name="dimensions">
+		[WIDTH]px x [HEIGHT]px
+	</text>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_report_abuse.xml b/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
index 6335e41babb..77d2b37ebaf 100644
--- a/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
@@ -1,104 +1,104 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_report_abuse" title="SIGNALER UNE INFRACTION">
-	<floater.string name="Screenshot">
-		Capture d&apos;écran
-	</floater.string>
-	<check_box label="Utiliser cette capture d&apos;écran" name="screen_check"/>
-	<text name="reporter_title" width="60">
-		Déposant :
-	</text>
-	<text name="reporter_field">
-		Loremipsum Dolorsitamut
-	</text>
-	<text name="sim_title">
-		Région :
-	</text>
-	<text name="sim_field">
-		Nom de la région
-	</text>
-	<text name="pos_title">
-		Position :
-	</text>
-	<text name="pos_field">
-		{128.1, 128.1, 15.4}
-	</text>
-	<text name="select_object_label">
-		Cliquez sur le bouton puis l&apos;objet responsable :
-	</text>
-	<button label="" label_selected="" name="pick_btn" tool_tip="Le sélecteur d&apos;objet vous permet d&apos;identifier un objet comme sujet du rapport."/>
-	<text name="object_name_label">
-		Objet :
-	</text>
-	<text left_delta="70" name="object_name" width="105">
-		Consetetur Sadipscing
-	</text>
-	<text name="owner_name_label" width="66">
-		Propriétaire :
-	</text>
-	<text left_delta="70" name="owner_name" width="105">
-		Hendrerit Vulputate
-	</text>
-	<combo_box name="category_combo" tool_tip="Choisissez la catégorie qui décrit le mieux ce rapport">
-		<combo_box.item label="Sélectionnez une catégorie" name="Select_category"/>
-		<combo_box.item label="Âge &gt; « Age play »" name="Age__Age_play"/>
-		<combo_box.item label="Âge &gt; Résident adulte sur Second Life pour adolescents" name="Age__Adult_resident_on_Teen_Second_Life"/>
-		<combo_box.item label="Âge &gt; Resident mineur en dehors de Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
-		<combo_box.item label="Assaut &gt; Bac à sable utilisé pour des combats/zone non sécurisée" name="Assault__Combat_sandbox___unsafe_area"/>
-		<combo_box.item label="Assaut &gt; Zone sécurisée" name="Assault__Safe_area"/>
-		<combo_box.item label="Assaut &gt; Bac à sable pour tests d&apos;armes à feu" name="Assault__Weapons_testing_sandbox"/>
-		<combo_box.item label="Commerce &gt; Incapacité à fournir un produit ou service" name="Commerce__Failure_to_deliver_product_or_service"/>
-		<combo_box.item label="Divulgation &gt; Informations sur la vie réelle" name="Disclosure__Real_world_information"/>
-		<combo_box.item label="Divulgation &gt; Écoute d&apos;un chat à distance" name="Disclosure__Remotely_monitoring chat"/>
-		<combo_box.item label="Divulgation &gt; Informations sur Second Life/chat/IM" name="Disclosure__Second_Life_information_chat_IMs"/>
-		<combo_box.item label="Trouble de la paix &gt; Utilisation inadéquate des ressources de la région" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
-		<combo_box.item label="Trouble de la paix &gt; Nombre d&apos;objets scriptés excessif" name="Disturbing_the_peace__Excessive_scripted_objects"/>
-		<combo_box.item label="Trouble de la paix &gt; Abandon d&apos;objets" name="Disturbing_the_peace__Object_littering"/>
-		<combo_box.item label="Trouble de la paix &gt; Spam à répétition" name="Disturbing_the_peace__Repetitive_spam"/>
-		<combo_box.item label="Trouble de la paix &gt; Spam à caractère commercial" name="Disturbing_the_peace__Unwanted_advert_spam"/>
-		<combo_box.item label="Fraude &gt; L$" name="Fraud__L$"/>
-		<combo_box.item label="Fraude &gt; Terrain" name="Fraud__Land"/>
-		<combo_box.item label="Fraude &gt; Vente pyramidale ou lettre-chaîne" name="Fraud__Pyramid_scheme_or_chain_letter"/>
-		<combo_box.item label="Fraude &gt; US$" name="Fraud__US$"/>
-		<combo_box.item label="Harcèlement &gt; Spam visuel" name="Harassment__Advert_farms___visual_spam"/>
-		<combo_box.item label="Harcèlement &gt; Diffamation envers des individus ou des groupes" name="Harassment__Defaming_individuals_or_groups"/>
-		<combo_box.item label="Harcèlement &gt; Immobilisation" name="Harassment__Impeding_movement"/>
-		<combo_box.item label="Harcèlement &gt;  Harcèlement sexuel" name="Harassment__Sexual_harassment"/>
-		<combo_box.item label="Harcèlement &gt; Incitation à enfreindre les Conditions d&apos;utilisation" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
-		<combo_box.item label="Harcèlement &gt; Abus verbal" name="Harassment__Verbal_abuse"/>
-		<combo_box.item label="Indécence &gt; Contenu ou comportement offensifs" name="Indecency__Broadly_offensive_content_or_conduct"/>
-		<combo_box.item label="Indécence &gt; Nom d&apos;avatar inapproprié" name="Indecency__Inappropriate_avatar_name"/>
-		<combo_box.item label="Indécence &gt; Contenu ou conduite inappropriés dans une région PG" name="Indecency__Mature_content_in_PG_region"/>
-		<combo_box.item label="Indécence &gt; Contenu ou conduite inappropriés dans une région Mature" name="Indecency__Inappropriate_content_in_Mature_region"/>
-		<combo_box.item label="Violation de droits de propriété intellectuelle &gt; Suppression de contenu" name="Intellectual_property_infringement_Content_Removal"/>
-		<combo_box.item label="Violation de droits de propriété intellectuelle &gt; CopyBot ou exploitation abusive des droits" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
-		<combo_box.item label="Intolérance" name="Intolerance"/>
-		<combo_box.item label="Terrain &gt; Utilisation abusive des ressources du bac à sable" name="Land__Abuse_of_sandbox_resources"/>
-		<combo_box.item label="Terrain &gt; Empiètement &gt; Objets/textures" name="Land__Encroachment__Objects_textures"/>
-		<combo_box.item label="Terrain &gt; Empiètement &gt; Particules" name="Land__Encroachment__Particles"/>
-		<combo_box.item label="Terrain &gt; Empiètement &gt; Arbres/plantes" name="Land__Encroachment__Trees_plants"/>
-		<combo_box.item label="Paris/jeux d&apos;argent" name="Wagering_gambling"/>
-		<combo_box.item label="Autre" name="Other"/>
-	</combo_box>
-	<text name="abuser_name_title">
-		Nom du contrevenant :
-	</text>
-	<button label="Choisir" label_selected="" name="select_abuser" tool_tip="Sélectionnez le nom du résident dans une liste"/>
-	<text name="abuser_name_title2">
-		Indiquez où l&apos;infraction a eu lieu :
-	</text>
-	<text name="sum_title">
-		Récapitulatif :
-	</text>
-	<text name="dscr_title">
-		Détails :
-	</text>
-	<text name="bug_aviso">
-		Soyez aussi spécifique que possible
-	</text>
-	<text bottom_delta="-16" name="incomplete_title">
-		Remarque : les rapports incomplets ne feront pas l&apos;objet d&apos;une
-enquête.
-	</text>
-	<button label="Signaler une infraction" label_selected="Signaler une infraction" name="send_btn"/>
-	<button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_report_abuse" title="SIGNALER UNE INFRACTION">
+	<floater.string name="Screenshot">
+		Capture d&apos;écran
+	</floater.string>
+	<check_box label="Utiliser cette capture d&apos;écran" name="screen_check"/>
+	<text name="reporter_title" width="60">
+		Déposant :
+	</text>
+	<text name="reporter_field">
+		Loremipsum Dolorsitamut
+	</text>
+	<text name="sim_title">
+		Région :
+	</text>
+	<text name="sim_field">
+		Nom de la région
+	</text>
+	<text name="pos_title">
+		Position :
+	</text>
+	<text name="pos_field">
+		{128.1, 128.1, 15.4}
+	</text>
+	<text name="select_object_label">
+		Cliquez sur le bouton puis l&apos;objet responsable :
+	</text>
+	<button label="" label_selected="" name="pick_btn" tool_tip="Le sélecteur d&apos;objet vous permet d&apos;identifier un objet comme sujet du rapport."/>
+	<text name="object_name_label">
+		Objet :
+	</text>
+	<text left_delta="70" name="object_name" width="105">
+		Consetetur Sadipscing
+	</text>
+	<text name="owner_name_label" width="66">
+		Propriétaire :
+	</text>
+	<text left_delta="70" name="owner_name" width="105">
+		Hendrerit Vulputate
+	</text>
+	<combo_box name="category_combo" tool_tip="Choisissez la catégorie qui décrit le mieux ce rapport">
+		<combo_box.item label="Sélectionnez une catégorie" name="Select_category"/>
+		<combo_box.item label="Âge &gt; « Age play »" name="Age__Age_play"/>
+		<combo_box.item label="Âge &gt; Résident adulte sur Second Life pour adolescents" name="Age__Adult_resident_on_Teen_Second_Life"/>
+		<combo_box.item label="Âge &gt; Resident mineur en dehors de Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+		<combo_box.item label="Assaut &gt; Bac à sable utilisé pour des combats/zone non sécurisée" name="Assault__Combat_sandbox___unsafe_area"/>
+		<combo_box.item label="Assaut &gt; Zone sécurisée" name="Assault__Safe_area"/>
+		<combo_box.item label="Assaut &gt; Bac à sable pour tests d&apos;armes à feu" name="Assault__Weapons_testing_sandbox"/>
+		<combo_box.item label="Commerce &gt; Incapacité à fournir un produit ou service" name="Commerce__Failure_to_deliver_product_or_service"/>
+		<combo_box.item label="Divulgation &gt; Informations sur la vie réelle" name="Disclosure__Real_world_information"/>
+		<combo_box.item label="Divulgation &gt; Écoute d&apos;un chat à distance" name="Disclosure__Remotely_monitoring chat"/>
+		<combo_box.item label="Divulgation &gt; Informations sur Second Life/chat/IM" name="Disclosure__Second_Life_information_chat_IMs"/>
+		<combo_box.item label="Trouble de la paix &gt; Utilisation inadéquate des ressources de la région" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+		<combo_box.item label="Trouble de la paix &gt; Nombre d&apos;objets scriptés excessif" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+		<combo_box.item label="Trouble de la paix &gt; Abandon d&apos;objets" name="Disturbing_the_peace__Object_littering"/>
+		<combo_box.item label="Trouble de la paix &gt; Spam à répétition" name="Disturbing_the_peace__Repetitive_spam"/>
+		<combo_box.item label="Trouble de la paix &gt; Spam à caractère commercial" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+		<combo_box.item label="Fraude &gt; L$" name="Fraud__L$"/>
+		<combo_box.item label="Fraude &gt; Terrain" name="Fraud__Land"/>
+		<combo_box.item label="Fraude &gt; Vente pyramidale ou lettre-chaîne" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+		<combo_box.item label="Fraude &gt; US$" name="Fraud__US$"/>
+		<combo_box.item label="Harcèlement &gt; Spam visuel" name="Harassment__Advert_farms___visual_spam"/>
+		<combo_box.item label="Harcèlement &gt; Diffamation envers des individus ou des groupes" name="Harassment__Defaming_individuals_or_groups"/>
+		<combo_box.item label="Harcèlement &gt; Immobilisation" name="Harassment__Impeding_movement"/>
+		<combo_box.item label="Harcèlement &gt;  Harcèlement sexuel" name="Harassment__Sexual_harassment"/>
+		<combo_box.item label="Harcèlement &gt; Incitation à enfreindre les Conditions d&apos;utilisation" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+		<combo_box.item label="Harcèlement &gt; Abus verbal" name="Harassment__Verbal_abuse"/>
+		<combo_box.item label="Indécence &gt; Contenu ou comportement offensifs" name="Indecency__Broadly_offensive_content_or_conduct"/>
+		<combo_box.item label="Indécence &gt; Nom d&apos;avatar inapproprié" name="Indecency__Inappropriate_avatar_name"/>
+		<combo_box.item label="Indécence &gt; Contenu ou conduite inappropriés dans une région PG" name="Indecency__Mature_content_in_PG_region"/>
+		<combo_box.item label="Indécence &gt; Contenu ou conduite inappropriés dans une région Mature" name="Indecency__Inappropriate_content_in_Mature_region"/>
+		<combo_box.item label="Violation de droits de propriété intellectuelle &gt; Suppression de contenu" name="Intellectual_property_infringement_Content_Removal"/>
+		<combo_box.item label="Violation de droits de propriété intellectuelle &gt; CopyBot ou exploitation abusive des droits" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+		<combo_box.item label="Intolérance" name="Intolerance"/>
+		<combo_box.item label="Terrain &gt; Utilisation abusive des ressources du bac à sable" name="Land__Abuse_of_sandbox_resources"/>
+		<combo_box.item label="Terrain &gt; Empiètement &gt; Objets/textures" name="Land__Encroachment__Objects_textures"/>
+		<combo_box.item label="Terrain &gt; Empiètement &gt; Particules" name="Land__Encroachment__Particles"/>
+		<combo_box.item label="Terrain &gt; Empiètement &gt; Arbres/plantes" name="Land__Encroachment__Trees_plants"/>
+		<combo_box.item label="Paris/jeux d&apos;argent" name="Wagering_gambling"/>
+		<combo_box.item label="Autre" name="Other"/>
+	</combo_box>
+	<text name="abuser_name_title">
+		Nom du contrevenant :
+	</text>
+	<button label="Choisir" label_selected="" name="select_abuser" tool_tip="Sélectionnez le nom du résident dans une liste"/>
+	<text name="abuser_name_title2">
+		Indiquez où l&apos;infraction a eu lieu :
+	</text>
+	<text name="sum_title">
+		Récapitulatif :
+	</text>
+	<text name="dscr_title">
+		Détails :
+	</text>
+	<text name="bug_aviso">
+		Soyez aussi spécifique que possible
+	</text>
+	<text bottom_delta="-16" name="incomplete_title">
+		Remarque : les rapports incomplets ne feront pas l&apos;objet d&apos;une
+enquête.
+	</text>
+	<button label="Signaler une infraction" label_selected="Signaler une infraction" name="send_btn"/>
+	<button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/fr/floater_script_debug_panel.xml
index fc805e879b8..ef021ce7131 100644
--- a/indra/newview/skins/default/xui/fr/floater_script_debug_panel.xml
+++ b/indra/newview/skins/default/xui/fr/floater_script_debug_panel.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script" short_title="[All scripts]" title="[All scripts]"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script" short_title="[All scripts]" title="[All scripts]"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_script_preview.xml b/indra/newview/skins/default/xui/fr/floater_script_preview.xml
index dbd3558c190..d699011f325 100644
--- a/indra/newview/skins/default/xui/fr/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_script_preview.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview lsl text" title="SCRIPT : SCRIPT DE ROTATION">
-	<floater.string name="Title">
-		Script : [NAME]
-	</floater.string>
-	<text name="desc txt">
-		Description :
-	</text>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview lsl text" title="SCRIPT : SCRIPT DE ROTATION">
+	<floater.string name="Title">
+		Script : [NAME]
+	</floater.string>
+	<text name="desc txt">
+		Description :
+	</text>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_script_queue.xml b/indra/newview/skins/default/xui/fr/floater_script_queue.xml
index dbbe2539dc7..7d4afdf8181 100644
--- a/indra/newview/skins/default/xui/fr/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/fr/floater_script_queue.xml
@@ -1,19 +1,19 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="queue" title="RÉINITIALISER PROGRESSION">
-	<floater.string name="Starting">
-		Début du [START] sur [COUNT] objets.
-	</floater.string>
-	<floater.string name="Done">
-		Fini.
-	</floater.string>
-	<floater.string name="Resetting">
-		Réinitialisation
-	</floater.string>
-	<floater.string name="Running">
-		Exécution en cours
-	</floater.string>
-	<floater.string name="NotRunning">
-		Arrêt
-	</floater.string>
-	<button label="Fermer" label_selected="Fermer" name="close"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="queue" title="RÉINITIALISER PROGRESSION">
+	<floater.string name="Starting">
+		Début du [START] sur [COUNT] objets.
+	</floater.string>
+	<floater.string name="Done">
+		Fini.
+	</floater.string>
+	<floater.string name="Resetting">
+		Réinitialisation
+	</floater.string>
+	<floater.string name="Running">
+		Exécution en cours
+	</floater.string>
+	<floater.string name="NotRunning">
+		Arrêt
+	</floater.string>
+	<button label="Fermer" label_selected="Fermer" name="close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_sell_land.xml b/indra/newview/skins/default/xui/fr/floater_sell_land.xml
index 2ded68309c5..86c6a52f8c2 100644
--- a/indra/newview/skins/default/xui/fr/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_sell_land.xml
@@ -1,66 +1,66 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="sell land" title="VENDRE TERRAIN">
-	<scroll_container name="profile_scroll">
-		<panel name="scroll_content_panel">
-			<text name="info_parcel_label">
-				Parcelle :
-			</text>
-			<text name="info_parcel">
-				PARCEL NAME
-			</text>
-			<text name="info_size_label">
-				Taille :
-			</text>
-			<text name="info_size">
-				[AREA] m²
-			</text>
-			<text bottom_delta="-60" name="info_action">
-				Pour vendre cette
-parcelle :
-			</text>
-			<icon bottom_delta="-86" name="step_price"/>
-			<text name="price_label">
-				Votre prix de vente :
-			</text>
-			<text name="price_text">
-				Fixez un prix convenable.
-			</text>
-			<text name="price_ld">
-				L$
-			</text>
-			<text name="price_per_m">
-				([PER_METER] L$ par mètre carré)
-			</text>
-			<text name="sell_to_label">
-				Vos acheteurs :
-			</text>
-			<text name="sell_to_text">
-				Vendez votre terrain à n&apos;importe qui ou uniquement à un acheteur
-spécifique.
-			</text>
-			<combo_box bottom_delta="-32" name="sell_to">
-				<combo_box.item label="Sélectionnez --" name="--selectone--"/>
-				<combo_box.item label="N&apos;importe qui" name="Anyone"/>
-				<combo_box.item label="Personne spécifique :" name="Specificuser:"/>
-			</combo_box>
-			<button label="Sélectionner..." name="sell_to_select_agent" width="100"/>
-			<text name="sell_objects_label">
-				Vendez-vous des objets avec ce terrain ?
-			</text>
-			<text name="sell_objects_text">
-				Les objets transférables se trouvant sur la parcelle changeront
-de propriétaire.
-			</text>
-			<radio_group bottom_delta="-54" name="sell_objects" right="430">
-				<radio_item label="Non, rester le propriétaire des objets" name="no"/>
-				<radio_item label="Oui, vendre les objets avec le terrain" name="yes"/>
-			</radio_group>
-			<button label="Afficher les objets" name="show_objects" right="420" width="120"/>
-			<text bottom_delta="-30" name="nag_message_label">
-				Rappel : toute vente est définitive.
-			</text>
-			<button label="Mettre le terrain en vente" name="sell_btn" width="165"/>
-			<button label="Annuler" name="cancel_btn"/>
-		</panel>
-	</scroll_container>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sell land" title="VENDRE TERRAIN">
+	<scroll_container name="profile_scroll">
+		<panel name="scroll_content_panel">
+			<text name="info_parcel_label">
+				Parcelle :
+			</text>
+			<text name="info_parcel">
+				PARCEL NAME
+			</text>
+			<text name="info_size_label">
+				Taille :
+			</text>
+			<text name="info_size">
+				[AREA] m²
+			</text>
+			<text bottom_delta="-60" name="info_action">
+				Pour vendre cette
+parcelle :
+			</text>
+			<icon bottom_delta="-86" name="step_price"/>
+			<text name="price_label">
+				Votre prix de vente :
+			</text>
+			<text name="price_text">
+				Fixez un prix convenable.
+			</text>
+			<text name="price_ld">
+				L$
+			</text>
+			<text name="price_per_m">
+				([PER_METER] L$ par mètre carré)
+			</text>
+			<text name="sell_to_label">
+				Vos acheteurs :
+			</text>
+			<text name="sell_to_text">
+				Vendez votre terrain à n&apos;importe qui ou uniquement à un acheteur
+spécifique.
+			</text>
+			<combo_box bottom_delta="-32" name="sell_to">
+				<combo_box.item label="Sélectionnez --" name="--selectone--"/>
+				<combo_box.item label="N&apos;importe qui" name="Anyone"/>
+				<combo_box.item label="Personne spécifique :" name="Specificuser:"/>
+			</combo_box>
+			<button label="Sélectionner..." name="sell_to_select_agent" width="100"/>
+			<text name="sell_objects_label">
+				Vendez-vous des objets avec ce terrain ?
+			</text>
+			<text name="sell_objects_text">
+				Les objets transférables se trouvant sur la parcelle changeront
+de propriétaire.
+			</text>
+			<radio_group bottom_delta="-54" name="sell_objects" right="430">
+				<radio_item label="Non, rester le propriétaire des objets" name="no"/>
+				<radio_item label="Oui, vendre les objets avec le terrain" name="yes"/>
+			</radio_group>
+			<button label="Afficher les objets" name="show_objects" right="420" width="120"/>
+			<text bottom_delta="-30" name="nag_message_label">
+				Rappel : toute vente est définitive.
+			</text>
+			<button label="Mettre le terrain en vente" name="sell_btn" width="165"/>
+			<button label="Annuler" name="cancel_btn"/>
+		</panel>
+	</scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_settings_debug.xml b/indra/newview/skins/default/xui/fr/floater_settings_debug.xml
index 3550d8c86f6..ee076119aa8 100644
--- a/indra/newview/skins/default/xui/fr/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/fr/floater_settings_debug.xml
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="settings_debug" title="PARAMÉTRAGES DU MODE DEBUG">
-	<combo_box name="boolean_combo">
-		<combo_box.item label="TRUE" name="TRUE"/>
-		<combo_box.item label="FALSE" name="FALSE"/>
-	</combo_box>
-	<color_swatch label="Couleur" name="val_color_swatch"/>
-	<spinner label="x" name="val_spinner_1"/>
-	<spinner label="x" name="val_spinner_2"/>
-	<spinner label="x" name="val_spinner_3"/>
-	<spinner label="x" name="val_spinner_4"/>
-	<button label="Paramètres par défaut" name="default_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="settings_debug" title="PARAMÉTRAGES DU MODE DEBUG">
+	<combo_box name="boolean_combo">
+		<combo_box.item label="TRUE" name="TRUE"/>
+		<combo_box.item label="FALSE" name="FALSE"/>
+	</combo_box>
+	<color_swatch label="Couleur" name="val_color_swatch"/>
+	<spinner label="x" name="val_spinner_1"/>
+	<spinner label="x" name="val_spinner_2"/>
+	<spinner label="x" name="val_spinner_3"/>
+	<spinner label="x" name="val_spinner_4"/>
+	<button label="Paramètres par défaut" name="default_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_stats.xml b/indra/newview/skins/default/xui/fr/floater_stats.xml
index 5d5e3213ca2..26443e634b0 100644
--- a/indra/newview/skins/default/xui/fr/floater_stats.xml
+++ b/indra/newview/skins/default/xui/fr/floater_stats.xml
@@ -1,71 +1,71 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Statistics" title="Statistiques">
-	<scroll_container name="statistics_scroll">
-		<container_view name="statistics_view">
-			<stat_view label="Basic" name="basic">
-				<stat_bar label="FPS" name="fps"/>
-				<stat_bar label="Bandwidth" name="bandwidth"/>
-				<stat_bar label="Packet Loss" name="packet_loss"/>
-				<stat_bar label="Ping Sim" name="ping"/>
-			</stat_view>
-			<stat_view label="Advanced" name="advanced">
-				<stat_view label="Render" name="render">
-					<stat_bar label="KTris Drawn" name="ktrisframe"/>
-					<stat_bar label="KTris Drawn" name="ktrissec"/>
-					<stat_bar label="Total Objects" name="objs"/>
-					<stat_bar label="New Objects" name="newobjs"/>
-				</stat_view>
-				<stat_view label="Texture" name="texture">
-					<stat_bar label="Count" name="numimagesstat"/>
-					<stat_bar label="Raw Count" name="numrawimagesstat"/>
-					<stat_bar label="GL Mem" name="gltexmemstat"/>
-					<stat_bar label="Formatted Mem" name="formattedmemstat"/>
-					<stat_bar label="Raw Mem" name="rawmemstat"/>
-					<stat_bar label="Bound Mem" name="glboundmemstat"/>
-				</stat_view>
-				<stat_view label="Network" name="network">
-					<stat_bar label="Packets In" name="packetsinstat"/>
-					<stat_bar label="Packets Out" name="packetsoutstat"/>
-					<stat_bar label="Objects" name="objectkbitstat"/>
-					<stat_bar label="Texture" name="texturekbitstat"/>
-					<stat_bar label="Asset" name="assetkbitstat"/>
-					<stat_bar label="Layers" name="layerskbitstat"/>
-					<stat_bar label="Actual In" name="actualinkbitstat"/>
-					<stat_bar label="Actual Out" name="actualoutkbitstat"/>
-					<stat_bar label="VFS Pending Ops" name="vfspendingoperations"/>
-				</stat_view>
-			</stat_view>
-			<stat_view label="Simulator" name="sim">
-				<stat_bar label="Time Dilation" name="simtimedilation"/>
-				<stat_bar label="Sim FPS" name="simfps"/>
-				<stat_bar label="Physics FPS" name="simphysicsfps"/>
-				<stat_view label="Physics Details" name="physicsdetail">
-					<stat_bar label="Pinned Objects" name="physicspinnedtasks"/>
-					<stat_bar label="Low LOD Objects" name="physicslodtasks"/>
-					<stat_bar label="Memory Allocated" name="physicsmemoryallocated"/>
-					<stat_bar label="Agent Updates/Sec" name="simagentups"/>
-					<stat_bar label="Main Agents" name="simmainagents"/>
-					<stat_bar label="Child Agents" name="simchildagents"/>
-					<stat_bar label="Objets" name="simobjects"/>
-					<stat_bar label="Active Objects" name="simactiveobjects"/>
-					<stat_bar label="Active Scripts" name="simactivescripts"/>
-					<stat_bar label="Script Events" name="simscripteps"/>
-					<stat_bar label="Packets In" name="siminpps"/>
-					<stat_bar label="Packets Out" name="simoutpps"/>
-					<stat_bar label="Pending Downloads" name="simpendingdownloads"/>
-					<stat_bar label="Pending Uploads" name="simpendinguploads"/>
-					<stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/>
-				</stat_view>
-				<stat_view label="Time (ms)" name="simperf">
-					<stat_bar label="Total Frame Time" name="simframemsec"/>
-					<stat_bar label="Net Time" name="simnetmsec"/>
-					<stat_bar label="Physics Time" name="simsimphysicsmsec"/>
-					<stat_bar label="Simulation Time" name="simsimothermsec"/>
-					<stat_bar label="Agent Time" name="simagentmsec"/>
-					<stat_bar label="Images Time" name="simimagesmsec"/>
-					<stat_bar label="Script Time" name="simscriptmsec"/>
-				</stat_view>
-			</stat_view>
-		</container_view>
-	</scroll_container>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="Statistiques">
+	<scroll_container name="statistics_scroll">
+		<container_view name="statistics_view">
+			<stat_view label="Basic" name="basic">
+				<stat_bar label="FPS" name="fps"/>
+				<stat_bar label="Bandwidth" name="bandwidth"/>
+				<stat_bar label="Packet Loss" name="packet_loss"/>
+				<stat_bar label="Ping Sim" name="ping"/>
+			</stat_view>
+			<stat_view label="Advanced" name="advanced">
+				<stat_view label="Render" name="render">
+					<stat_bar label="KTris Drawn" name="ktrisframe"/>
+					<stat_bar label="KTris Drawn" name="ktrissec"/>
+					<stat_bar label="Total Objects" name="objs"/>
+					<stat_bar label="New Objects" name="newobjs"/>
+				</stat_view>
+				<stat_view label="Texture" name="texture">
+					<stat_bar label="Count" name="numimagesstat"/>
+					<stat_bar label="Raw Count" name="numrawimagesstat"/>
+					<stat_bar label="GL Mem" name="gltexmemstat"/>
+					<stat_bar label="Formatted Mem" name="formattedmemstat"/>
+					<stat_bar label="Raw Mem" name="rawmemstat"/>
+					<stat_bar label="Bound Mem" name="glboundmemstat"/>
+				</stat_view>
+				<stat_view label="Network" name="network">
+					<stat_bar label="Packets In" name="packetsinstat"/>
+					<stat_bar label="Packets Out" name="packetsoutstat"/>
+					<stat_bar label="Objects" name="objectkbitstat"/>
+					<stat_bar label="Texture" name="texturekbitstat"/>
+					<stat_bar label="Asset" name="assetkbitstat"/>
+					<stat_bar label="Layers" name="layerskbitstat"/>
+					<stat_bar label="Actual In" name="actualinkbitstat"/>
+					<stat_bar label="Actual Out" name="actualoutkbitstat"/>
+					<stat_bar label="VFS Pending Ops" name="vfspendingoperations"/>
+				</stat_view>
+			</stat_view>
+			<stat_view label="Simulator" name="sim">
+				<stat_bar label="Time Dilation" name="simtimedilation"/>
+				<stat_bar label="Sim FPS" name="simfps"/>
+				<stat_bar label="Physics FPS" name="simphysicsfps"/>
+				<stat_view label="Physics Details" name="physicsdetail">
+					<stat_bar label="Pinned Objects" name="physicspinnedtasks"/>
+					<stat_bar label="Low LOD Objects" name="physicslodtasks"/>
+					<stat_bar label="Memory Allocated" name="physicsmemoryallocated"/>
+					<stat_bar label="Agent Updates/Sec" name="simagentups"/>
+					<stat_bar label="Main Agents" name="simmainagents"/>
+					<stat_bar label="Child Agents" name="simchildagents"/>
+					<stat_bar label="Objets" name="simobjects"/>
+					<stat_bar label="Active Objects" name="simactiveobjects"/>
+					<stat_bar label="Active Scripts" name="simactivescripts"/>
+					<stat_bar label="Script Events" name="simscripteps"/>
+					<stat_bar label="Packets In" name="siminpps"/>
+					<stat_bar label="Packets Out" name="simoutpps"/>
+					<stat_bar label="Pending Downloads" name="simpendingdownloads"/>
+					<stat_bar label="Pending Uploads" name="simpendinguploads"/>
+					<stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/>
+				</stat_view>
+				<stat_view label="Time (ms)" name="simperf">
+					<stat_bar label="Total Frame Time" name="simframemsec"/>
+					<stat_bar label="Net Time" name="simnetmsec"/>
+					<stat_bar label="Physics Time" name="simsimphysicsmsec"/>
+					<stat_bar label="Simulation Time" name="simsimothermsec"/>
+					<stat_bar label="Agent Time" name="simagentmsec"/>
+					<stat_bar label="Images Time" name="simimagesmsec"/>
+					<stat_bar label="Script Time" name="simscriptmsec"/>
+				</stat_view>
+			</stat_view>
+		</container_view>
+	</scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml
index 5ded9a1de4e..32706344017 100644
--- a/indra/newview/skins/default/xui/fr/floater_tools.xml
+++ b/indra/newview/skins/default/xui/fr/floater_tools.xml
@@ -1,479 +1,479 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" short_title="Outils de construction" title="">
-	<floater.string name="status_rotate">
-		Pour faire tourner l&apos;objet, faîtes glisser les bandes de couleur.
-	</floater.string>
-	<floater.string name="status_scale">
-		Pour étirer le côté sélectionné, cliquez et faites glisser.
-	</floater.string>
-	<floater.string name="status_move">
-		Glissez pour déplacer, Maj-glissez pour copier.
-	</floater.string>
-	<floater.string name="status_modifyland">
-		Cliquez et maintenez pour modifier le terrain.
-	</floater.string>
-	<floater.string name="status_camera">
-		Cliquez et faîtes glisser pour bouger la caméra
-	</floater.string>
-	<floater.string name="status_grab">
-		Glisser pour déplacer, Ctrl pour soulever, Crtl-Maj pour pivoter.
-	</floater.string>
-	<floater.string name="status_place">
-		Cliquez dans le monde pour construire.
-	</floater.string>
-	<floater.string name="status_selectland">
-		Cliquez et faites glisser pour sélectionner le terrain.
-	</floater.string>
-	<floater.string name="grid_screen_text">
-		Écran
-	</floater.string>
-	<floater.string name="grid_local_text">
-		Local
-	</floater.string>
-	<floater.string name="grid_world_text">
-		Monde
-	</floater.string>
-	<floater.string name="grid_reference_text">
-		Référence
-	</floater.string>
-	<floater.string name="grid_attachment_text">
-		Pièce-jointe
-	</floater.string>
-	<button label="" label_selected="" name="button focus" tool_tip="Mise au point"/>
-	<button label="" label_selected="" name="button move" tool_tip="Déplacer"/>
-	<button label="" label_selected="" name="button edit" tool_tip="Modifier"/>
-	<button label="" label_selected="" name="button create" tool_tip="Créer"/>
-	<button label="" label_selected="" name="button land" tool_tip="Terrain"/>
-	<text name="text status">
-		Glissez pour déplacer, Maj-glissez pour copier.
-	</text>
-	<radio_group name="focus_radio_group">
-		<radio_item label="Zoom" name="radio zoom"/>
-		<radio_item label="Orbite (Ctrl)" name="radio orbit"/>
-		<radio_item label="Panoramique (Ctrl-Maj)" name="radio pan"/>
-	</radio_group>
-	<radio_group name="move_radio_group">
-		<radio_item label="Déplacer" name="radio move"/>
-		<radio_item label="Orbite (Ctrl)" name="radio lift"/>
-		<radio_item label="Faire tourner (Ctrl-Maj)" name="radio spin"/>
-	</radio_group>
-	<radio_group name="edit_radio_group">
-		<radio_item label="Bouger" name="radio position"/>
-		<radio_item label="Pivoter (Ctrl)" name="radio rotate"/>
-		<radio_item label="Étirer (Ctrl-Maj)" name="radio stretch"/>
-		<radio_item label="Sélectionner une face" name="radio select face"/>
-	</radio_group>
-	<check_box label="Modification liée" name="checkbox edit linked parts"/>
-	<check_box label="Étirer les deux côtés" name="checkbox uniform"/>
-	<check_box initial_value="true" label="Étirer les textures" name="checkbox stretch textures"/>
-	<check_box initial_value="true" label="Fixer sur la grille" name="checkbox snap to grid"/>
-	<combo_box name="combobox grid mode">
-		<combo_box.item label="Axe du monde" name="World"/>
-		<combo_box.item label="Axe local" name="Local"/>
-		<combo_box.item label="Axe de référence" name="Reference"/>
-	</combo_box>
-	<button label="Options..." label_selected="Options..." name="Options..." tool_tip="Définir les options de la grille"/>
-	<button label="" label_selected="" name="ToolCube" tool_tip="Cube"/>
-	<button label="" label_selected="" name="ToolPrism" tool_tip="Prisme droit"/>
-	<button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide"/>
-	<button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tétraèdre"/>
-	<button label="" label_selected="" name="ToolCylinder" tool_tip="Cylindre"/>
-	<button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Demi-cylindre"/>
-	<button label="" label_selected="" name="ToolCone" tool_tip="Cône"/>
-	<button label="" label_selected="" name="ToolHemiCone" tool_tip="Demi-cône"/>
-	<button label="" label_selected="" name="ToolSphere" tool_tip="Sphère"/>
-	<button label="" label_selected="" name="ToolHemiSphere" tool_tip="Demi-sphère"/>
-	<button label="" label_selected="" name="ToolTorus" tool_tip="Tore"/>
-	<button label="" label_selected="" name="ToolTube" tool_tip="Tube"/>
-	<button label="" label_selected="" name="ToolRing" tool_tip="Anneau"/>
-	<button label="" label_selected="" name="ToolTree" tool_tip="Arbre"/>
-	<button label="" label_selected="" name="ToolGrass" tool_tip="Herbe"/>
-	<check_box label="Maintenir l&apos;outil sélectionné" name="checkbox sticky"/>
-	<check_box label="Copier la sélection" name="checkbox copy selection"/>
-	<check_box initial_value="true" label="Centrer" name="checkbox copy centers"/>
-	<check_box label="Pivoter" name="checkbox copy rotates"/>
-	<radio_group name="land_radio_group">
-		<radio_item label="Sélectionner le terrain" name="radio select land"/>
-		<radio_item label="Aplatir" name="radio flatten"/>
-		<radio_item label="Élever" name="radio raise"/>
-		<radio_item label="Abaisser" name="radio lower"/>
-		<radio_item label="Lisser" name="radio smooth"/>
-		<radio_item label="Bosseler" name="radio noise"/>
-		<radio_item label="Annuler modification" name="radio revert"/>
-	</radio_group>
-	<text name="Bulldozer:">
-		Bulldozer :
-	</text>
-	<text name="Dozer Size:">
-		Taille
-	</text>
-	<text name="Strength:">
-		Force
-	</text>
-	<button label="Appliquer" label_selected="Appliquer" left="176" name="button apply to selection" tool_tip="Modifier le terrain sélectionné"/>
-	<text name="obj_count">
-		Objets : [COUNT]
-	</text>
-	<text name="prim_count">
-		Prims : [COUNT]
-	</text>
-	<tab_container name="Object Info Tabs">
-		<panel label="Général" name="General">
-			<panel.string name="text deed continued">
-				Céder
-			</panel.string>
-			<panel.string name="text deed">
-				Transférer
-			</panel.string>
-			<panel.string name="text modify info 1">
-				Vous pouvez modifier cet objet
-			</panel.string>
-			<panel.string name="text modify info 2">
-				Vous pouvez modifier ces objets
-			</panel.string>
-			<panel.string name="text modify info 3">
-				Vous ne pouvez pas modifier cet objet
-			</panel.string>
-			<panel.string name="text modify info 4">
-				Vous ne pouvez pas modifier ces objets
-			</panel.string>
-			<panel.string name="text modify warning">
-				Sélectionnez l&apos;objet en entier
-			</panel.string>
-			<panel.string name="Cost Default">
-				Prix : L$
-			</panel.string>
-			<panel.string name="Cost Total">
-				Prix total : L$
-			</panel.string>
-			<panel.string name="Cost Per Unit">
-				Prix par : L$
-			</panel.string>
-			<panel.string name="Cost Mixed">
-				Prix mixte
-			</panel.string>
-			<panel.string name="Sale Mixed">
-				Vente mixte
-			</panel.string>
-			<text name="Name:">
-				Nom :
-			</text>
-			<text name="Description:">
-				Description :
-			</text>
-			<text name="Creator:">
-				Créateur :
-			</text>
-			<text name="Creator Name">
-				Thrax Linden
-			</text>
-			<text name="Owner:">
-				Propriétaire :
-			</text>
-			<text name="Owner Name">
-				Thrax Linden
-			</text>
-			<text name="Group:">
-				Groupe :
-			</text>
-			<button label="Définir..." label_selected="Définir..." name="button set group" tool_tip="Choisissez un groupe pour partager les permissions de cet objet"/>
-			<name_box initial_value="Chargement…" name="Group Name Proxy"/>
-			<button label="Céder" label_selected="Céder" name="button deed" tool_tip="En cédant un objet, vous donnez aussi les permissions au prochain propriétaire. Seul un officier peut céder les objets d&apos;un groupe."/>
-			<check_box label="Partager" name="checkbox share with group" tool_tip="Autorisez tous les membres du groupe choisi à utiliser et à partager vos droits pour cet objet. Pour activer les restrictions de rôles, vous devez d&apos;abord cliquer sur Transférer."/>
-			<text name="label click action">
-				Cliquer pour :
-			</text>
-			<combo_box name="clickaction" width="178">
-				<combo_box.item label="Toucher (défaut)" name="Touch/grab(default)"/>
-				<combo_box.item label="S&apos;asseoir sur l&apos;objet" name="Sitonobject"/>
-				<combo_box.item label="Acheter l&apos;objet" name="Buyobject"/>
-				<combo_box.item label="Payer l&apos;objet" name="Payobject"/>
-				<combo_box.item label="Ouvrir" name="Open"/>
-			</combo_box>
-			<check_box label="À vendre :" name="checkbox for sale"/>
-			<combo_box name="sale type">
-				<combo_box.item label="Copie" name="Copy"/>
-				<combo_box.item label="Contenus" name="Contents"/>
-				<combo_box.item label="Original" name="Original"/>
-			</combo_box>
-			<spinner label="Prix : L$" name="Edit Cost"/>
-			<check_box label="Afficher dans la recherche" name="search_check" tool_tip="Afficher l&apos;objet dans les résultats de recherche"/>
-			<panel name="perms_build">
-				<text name="perm_modify">
-					Vous pouvez modifier cet objet
-				</text>
-				<text name="Anyone can:">
-					N&apos;importe qui :
-				</text>
-				<check_box label="Copier" name="checkbox allow everyone copy"/>
-				<text name="Next owner can:">
-					Le prochain propriétaire :
-				</text>
-				<check_box label="Modifier" name="checkbox next owner can modify"/>
-				<check_box label="Copier" left_delta="66" name="checkbox next owner can copy"/>
-				<check_box label="Transférer" name="checkbox next owner can transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/>
-				<text name="B:">
-					B :
-				</text>
-				<text name="O:">
-					O :
-				</text>
-				<text name="G:">
-					G :
-				</text>
-				<text name="E:">
-					E :
-				</text>
-				<text name="N:">
-					N :
-				</text>
-				<text name="F:">
-					F :
-				</text>
-			</panel>
-		</panel>
-		<panel label="Objet" name="Object">
-			<check_box label="Verrouillé" name="checkbox locked" tool_tip="Empêche l&apos;objet d&apos;être déplacé ou supprimé. Utile pendant la construction pour éviter les modifications involontaires."/>
-			<check_box label="Physique" name="Physical Checkbox Ctrl" tool_tip="Permet à l&apos;objet d&apos;être poussé et affecté par la gravité"/>
-			<check_box label="Temporaire" name="Temporary Checkbox Ctrl" tool_tip="L&apos;objet est supprimé 1 mn après sa création."/>
-			<check_box label="Fantôme" name="Phantom Checkbox Ctrl" tool_tip="Permet à l&apos;objet de ne pas entrer en collision avec d&apos;autres objets ou avatars."/>
-			<text name="label position">
-				Position (mètres)
-			</text>
-			<spinner label="X" name="Pos X"/>
-			<spinner label="Y" name="Pos Y"/>
-			<spinner label="Z" name="Pos Z"/>
-			<text name="label size">
-				Taille (mètres)
-			</text>
-			<spinner label="X" name="Scale X"/>
-			<spinner label="Y" name="Scale Y"/>
-			<spinner label="Z" name="Scale Z"/>
-			<text name="label rotation">
-				Rotation (degrés)
-			</text>
-			<spinner label="X" name="Rot X"/>
-			<spinner label="Y" name="Rot Y"/>
-			<spinner label="Z" name="Rot Z"/>
-			<combo_box name="comboBaseType">
-				<combo_box.item label="Boîte" name="Box"/>
-				<combo_box.item label="Cylindre" name="Cylinder"/>
-				<combo_box.item label="Prisme" name="Prism"/>
-				<combo_box.item label="Sphère" name="Sphere"/>
-				<combo_box.item label="Tore" name="Torus"/>
-				<combo_box.item label="Tube" name="Tube"/>
-				<combo_box.item label="Anneau" name="Ring"/>
-				<combo_box.item label="Sculptie" name="Sculpted"/>
-			</combo_box>
-			<combo_box name="material">
-				<combo_box.item label="Pierre" name="Stone"/>
-				<combo_box.item label="Métal" name="Metal"/>
-				<combo_box.item label="Verre" name="Glass"/>
-				<combo_box.item label="Bois" name="Wood"/>
-				<combo_box.item label="Chair" name="Flesh"/>
-				<combo_box.item label="Plastique" name="Plastic"/>
-				<combo_box.item label="Caoutchouc" name="Rubber"/>
-			</combo_box>
-			<text name="text cut">
-				Découpe du tracé (début/fin)
-			</text>
-			<spinner label="D" name="cut begin"/>
-			<spinner label="F" name="cut end"/>
-			<text name="text hollow">
-				Creux
-			</text>
-			<text name="text skew">
-				Biais
-			</text>
-			<text name="Hollow Shape">
-				Forme du creux
-			</text>
-			<combo_box name="hole">
-				<combo_box.item label="Défaut" name="Default"/>
-				<combo_box.item label="Cercle" name="Circle"/>
-				<combo_box.item label="Carré" name="Square"/>
-				<combo_box.item label="Triangle" name="Triangle"/>
-			</combo_box>
-			<text name="text twist">
-				Vrille (début/fin)
-			</text>
-			<spinner label="D" name="Twist Begin"/>
-			<spinner label="F" name="Twist End"/>
-			<text name="scale_taper">
-				Biseautage
-			</text>
-			<text name="scale_hole">
-				Taille du trou
-			</text>
-			<spinner label="X" name="Taper Scale X"/>
-			<spinner label="Y" name="Taper Scale Y"/>
-			<text name="text topshear">
-				Inclinaison
-			</text>
-			<spinner label="X" name="Shear X"/>
-			<spinner label="Y" name="Shear Y"/>
-			<text name="advanced_cut">
-				Découpe du profilé (début/fin)
-			</text>
-			<text name="advanced_dimple">
-				Creux (début/fin)
-			</text>
-			<text name="advanced_slice">
-				Tranche (début/fin)
-			</text>
-			<spinner label="D" name="Path Limit Begin"/>
-			<spinner label="F" name="Path Limit End"/>
-			<text name="text taper2">
-				Biseautage
-			</text>
-			<spinner label="X" name="Taper X"/>
-			<spinner label="Y" name="Taper Y"/>
-			<text name="text radius delta">
-				Rayon
-			</text>
-			<text name="text revolutions">
-				Révolutions
-			</text>
-			<texture_picker label="Texture du sculptie" name="sculpt texture control" tool_tip="Cliquez pour sélectionner une image"/>
-			<check_box label="Mirroir" name="sculpt mirror control" tool_tip="Retourne le sculptie le long de l&apos;axe des X."/>
-			<check_box label="A l&apos;envers" name="sculpt invert control" tool_tip="Inverse les valeurs normales d&apos;un sculptie et le fait apparaître à l&apos;envers."/>
-			<text name="label sculpt type">
-				Type de raccord
-			</text>
-			<combo_box name="sculpt type control">
-				<combo_box.item label="(aucun)" name="None"/>
-				<combo_box.item label="Sphère" name="Sphere"/>
-				<combo_box.item label="Tore" name="Torus"/>
-				<combo_box.item label="Plan" name="Plane"/>
-				<combo_box.item label="Cylindre" name="Cylinder"/>
-			</combo_box>
-		</panel>
-		<panel label="Attributs" name="Features">
-			<text name="select_single">
-				Sélectionnez un prim pour modifier les attributs.
-			</text>
-			<text name="edit_object">
-				Modifier les attributs de l&apos;objet :
-			</text>
-			<check_box label="Flexibilité" name="Flexible1D Checkbox Ctrl" tool_tip="Donne à l&apos;objet de la souplesse sur l&apos;axe des Z (côté client uniquement)."/>
-			<spinner label="Souplesse" name="FlexNumSections"/>
-			<spinner label="Gravité" name="FlexGravity"/>
-			<spinner label="Élasticité" name="FlexFriction"/>
-			<spinner label="Vent" name="FlexWind"/>
-			<spinner label="Tension" name="FlexTension"/>
-			<spinner label="Force X" name="FlexForceX"/>
-			<spinner label="Force Y" name="FlexForceY"/>
-			<spinner label="Force Z" name="FlexForceZ"/>
-			<check_box label="Lumière" name="Light Checkbox Ctrl" tool_tip="Permet aux objets d&apos;émettre de la lumière"/>
-			<color_swatch label="" name="colorswatch" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
-			<spinner label="Intensité" name="Light Intensity"/>
-			<spinner label="Portée" name="Light Radius"/>
-			<spinner label="Atténuation" name="Light Falloff"/>
-		</panel>
-		<panel label="Texture" name="Texture">
-			<panel.string name="string repeats per meter">
-				Répétitions au mètre
-			</panel.string>
-			<panel.string name="string repeats per face">
-				Répétitions par face
-			</panel.string>
-			<texture_picker label="Texture" name="texture control" tool_tip="Cliquez pour sélectionner une image"/>
-			<color_swatch label="Couleur" name="colorswatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/>
-			<text name="color trans" width="88">
-				Transparence
-			</text>
-			<text name="glow label">
-				Rayonnement
-			</text>
-			<check_box label="Lumineux" name="checkbox fullbright"/>
-			<text name="tex gen">
-				Application
-			</text>
-			<combo_box name="combobox texgen">
-				<combo_box.item label="Défaut" name="Default"/>
-				<combo_box.item label="Planar" name="Planar"/>
-			</combo_box>
-			<text name="label shininess">
-				Brillance
-			</text>
-			<combo_box name="combobox shininess">
-				<combo_box.item label="Aucune" name="None"/>
-				<combo_box.item label="Faible" name="Low"/>
-				<combo_box.item label="Moyenne" name="Medium"/>
-				<combo_box.item label="Élevée" name="High"/>
-			</combo_box>
-			<text name="label bumpiness">
-				Relief
-			</text>
-			<combo_box name="combobox bumpiness">
-				<combo_box.item label="Aucun" name="None"/>
-				<combo_box.item label="Luminosité" name="Brightness"/>
-				<combo_box.item label="Obscurité" name="Darkness"/>
-				<combo_box.item label="Aggloméré" name="woodgrain"/>
-				<combo_box.item label="Écorce" name="bark"/>
-				<combo_box.item label="Briques" name="bricks"/>
-				<combo_box.item label="Damier" name="checker"/>
-				<combo_box.item label="Béton" name="concrete"/>
-				<combo_box.item label="Carrelage" name="crustytile"/>
-				<combo_box.item label="Pierre de taille" name="cutstone"/>
-				<combo_box.item label="Disques" name="discs"/>
-				<combo_box.item label="Gravier" name="gravel"/>
-				<combo_box.item label="Boîte de Petri" name="petridish"/>
-				<combo_box.item label="Lattes" name="siding"/>
-				<combo_box.item label="Carreaux" name="stonetile"/>
-				<combo_box.item label="Stuc" name="stucco"/>
-				<combo_box.item label="Ventouses" name="suction"/>
-				<combo_box.item label="Tissage" name="weave"/>
-			</combo_box>
-			<text name="tex scale">
-				Répétitions par face
-			</text>
-			<spinner label="Horizontal (U)" name="TexScaleU"/>
-			<check_box label="Inverser" name="checkbox flip s"/>
-			<spinner label="Vertical (V)" name="TexScaleV"/>
-			<check_box label="Inverser" name="checkbox flip t"/>
-			<spinner label="RotationËš" left="122" name="TexRot" width="58"/>
-			<spinner label="Repeats / Meter" left="122" name="rptctrl" width="58"/>
-			<button label="Appliquer" label_selected="Appliquer" left_delta="68" name="button apply" width="75"/>
-			<text name="tex offset">
-				Décalage de la texture
-			</text>
-			<spinner label="Horizontal (U)" name="TexOffsetU"/>
-			<spinner label="Vertical (V)" name="TexOffsetV"/>
-		</panel>
-		<panel label="Contenu" name="Contents">
-			<button label="Nouveau script" label_selected="Nouveau script" name="button new script"/>
-			<button label="Droits" name="button permissions"/>
-		</panel>
-	</tab_container>
-	<panel name="land info panel">
-		<text name="label_parcel_info">
-			Informations sur la parcelle
-		</text>
-		<text name="label_area_price">
-			Prix : [PRICE] L$ pour [AREA] m².
-		</text>
-		<text name="label_area">
-			Surface : [AREA] m²
-		</text>
-		<button label="À propos du terrain..." label_selected="À propos du terrain..." name="button about land" width="142"/>
-		<check_box label="Afficher les propriétaires" name="checkbox show owners" tool_tip="Colorie les parcelles en fonction de leur propriétaire : 
-
-Vert = votre terrain 
-Turquoise = le terrain de votre groupe 
-Rouge = appartenant à d&apos;autres 
-Jaune = en vente 
-Mauve = aux enchères 
-Gris = public"/>
-		<text name="label_parcel_modify">
-			Modifier la parcelle
-		</text>
-		<button label="Diviser" label_selected="Diviser" name="button subdivide land" width="142"/>
-		<button label="Fusionner" label_selected="Fusionner" name="button join land" width="142"/>
-		<text name="label_parcel_trans">
-			Transactions
-		</text>
-		<button label="Acheter le terrain" label_selected="Acheter le terrain" name="button buy land" width="142"/>
-		<button label="Abandonner le terrain" label_selected="Abandonner le terrain" name="button abandon land" width="142"/>
-	</panel>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="toolbox floater" short_title="Outils de construction" title="">
+	<floater.string name="status_rotate">
+		Pour faire tourner l&apos;objet, faîtes glisser les bandes de couleur.
+	</floater.string>
+	<floater.string name="status_scale">
+		Pour étirer le côté sélectionné, cliquez et faites glisser.
+	</floater.string>
+	<floater.string name="status_move">
+		Glissez pour déplacer, Maj-glissez pour copier.
+	</floater.string>
+	<floater.string name="status_modifyland">
+		Cliquez et maintenez pour modifier le terrain.
+	</floater.string>
+	<floater.string name="status_camera">
+		Cliquez et faîtes glisser pour bouger la caméra
+	</floater.string>
+	<floater.string name="status_grab">
+		Glisser pour déplacer, Ctrl pour soulever, Crtl-Maj pour pivoter.
+	</floater.string>
+	<floater.string name="status_place">
+		Cliquez dans le monde pour construire.
+	</floater.string>
+	<floater.string name="status_selectland">
+		Cliquez et faites glisser pour sélectionner le terrain.
+	</floater.string>
+	<floater.string name="grid_screen_text">
+		Écran
+	</floater.string>
+	<floater.string name="grid_local_text">
+		Local
+	</floater.string>
+	<floater.string name="grid_world_text">
+		Monde
+	</floater.string>
+	<floater.string name="grid_reference_text">
+		Référence
+	</floater.string>
+	<floater.string name="grid_attachment_text">
+		Pièce-jointe
+	</floater.string>
+	<button label="" label_selected="" name="button focus" tool_tip="Mise au point"/>
+	<button label="" label_selected="" name="button move" tool_tip="Déplacer"/>
+	<button label="" label_selected="" name="button edit" tool_tip="Modifier"/>
+	<button label="" label_selected="" name="button create" tool_tip="Créer"/>
+	<button label="" label_selected="" name="button land" tool_tip="Terrain"/>
+	<text name="text status">
+		Glissez pour déplacer, Maj-glissez pour copier.
+	</text>
+	<radio_group name="focus_radio_group">
+		<radio_item label="Zoom" name="radio zoom"/>
+		<radio_item label="Orbite (Ctrl)" name="radio orbit"/>
+		<radio_item label="Panoramique (Ctrl-Maj)" name="radio pan"/>
+	</radio_group>
+	<radio_group name="move_radio_group">
+		<radio_item label="Déplacer" name="radio move"/>
+		<radio_item label="Orbite (Ctrl)" name="radio lift"/>
+		<radio_item label="Faire tourner (Ctrl-Maj)" name="radio spin"/>
+	</radio_group>
+	<radio_group name="edit_radio_group">
+		<radio_item label="Bouger" name="radio position"/>
+		<radio_item label="Pivoter (Ctrl)" name="radio rotate"/>
+		<radio_item label="Étirer (Ctrl-Maj)" name="radio stretch"/>
+		<radio_item label="Sélectionner une face" name="radio select face"/>
+	</radio_group>
+	<check_box label="Modification liée" name="checkbox edit linked parts"/>
+	<check_box label="Étirer les deux côtés" name="checkbox uniform"/>
+	<check_box initial_value="true" label="Étirer les textures" name="checkbox stretch textures"/>
+	<check_box initial_value="true" label="Fixer sur la grille" name="checkbox snap to grid"/>
+	<combo_box name="combobox grid mode">
+		<combo_box.item label="Axe du monde" name="World"/>
+		<combo_box.item label="Axe local" name="Local"/>
+		<combo_box.item label="Axe de référence" name="Reference"/>
+	</combo_box>
+	<button label="Options..." label_selected="Options..." name="Options..." tool_tip="Définir les options de la grille"/>
+	<button label="" label_selected="" name="ToolCube" tool_tip="Cube"/>
+	<button label="" label_selected="" name="ToolPrism" tool_tip="Prisme droit"/>
+	<button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide"/>
+	<button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tétraèdre"/>
+	<button label="" label_selected="" name="ToolCylinder" tool_tip="Cylindre"/>
+	<button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Demi-cylindre"/>
+	<button label="" label_selected="" name="ToolCone" tool_tip="Cône"/>
+	<button label="" label_selected="" name="ToolHemiCone" tool_tip="Demi-cône"/>
+	<button label="" label_selected="" name="ToolSphere" tool_tip="Sphère"/>
+	<button label="" label_selected="" name="ToolHemiSphere" tool_tip="Demi-sphère"/>
+	<button label="" label_selected="" name="ToolTorus" tool_tip="Tore"/>
+	<button label="" label_selected="" name="ToolTube" tool_tip="Tube"/>
+	<button label="" label_selected="" name="ToolRing" tool_tip="Anneau"/>
+	<button label="" label_selected="" name="ToolTree" tool_tip="Arbre"/>
+	<button label="" label_selected="" name="ToolGrass" tool_tip="Herbe"/>
+	<check_box label="Maintenir l&apos;outil sélectionné" name="checkbox sticky"/>
+	<check_box label="Copier la sélection" name="checkbox copy selection"/>
+	<check_box initial_value="true" label="Centrer" name="checkbox copy centers"/>
+	<check_box label="Pivoter" name="checkbox copy rotates"/>
+	<radio_group name="land_radio_group">
+		<radio_item label="Sélectionner le terrain" name="radio select land"/>
+		<radio_item label="Aplatir" name="radio flatten"/>
+		<radio_item label="Élever" name="radio raise"/>
+		<radio_item label="Abaisser" name="radio lower"/>
+		<radio_item label="Lisser" name="radio smooth"/>
+		<radio_item label="Bosseler" name="radio noise"/>
+		<radio_item label="Annuler modification" name="radio revert"/>
+	</radio_group>
+	<text name="Bulldozer:">
+		Bulldozer :
+	</text>
+	<text name="Dozer Size:">
+		Taille
+	</text>
+	<text name="Strength:">
+		Force
+	</text>
+	<button label="Appliquer" label_selected="Appliquer" left="176" name="button apply to selection" tool_tip="Modifier le terrain sélectionné"/>
+	<text name="obj_count">
+		Objets : [COUNT]
+	</text>
+	<text name="prim_count">
+		Prims : [COUNT]
+	</text>
+	<tab_container name="Object Info Tabs">
+		<panel label="Général" name="General">
+			<panel.string name="text deed continued">
+				Céder
+			</panel.string>
+			<panel.string name="text deed">
+				Transférer
+			</panel.string>
+			<panel.string name="text modify info 1">
+				Vous pouvez modifier cet objet
+			</panel.string>
+			<panel.string name="text modify info 2">
+				Vous pouvez modifier ces objets
+			</panel.string>
+			<panel.string name="text modify info 3">
+				Vous ne pouvez pas modifier cet objet
+			</panel.string>
+			<panel.string name="text modify info 4">
+				Vous ne pouvez pas modifier ces objets
+			</panel.string>
+			<panel.string name="text modify warning">
+				Sélectionnez l&apos;objet en entier
+			</panel.string>
+			<panel.string name="Cost Default">
+				Prix : L$
+			</panel.string>
+			<panel.string name="Cost Total">
+				Prix total : L$
+			</panel.string>
+			<panel.string name="Cost Per Unit">
+				Prix par : L$
+			</panel.string>
+			<panel.string name="Cost Mixed">
+				Prix mixte
+			</panel.string>
+			<panel.string name="Sale Mixed">
+				Vente mixte
+			</panel.string>
+			<text name="Name:">
+				Nom :
+			</text>
+			<text name="Description:">
+				Description :
+			</text>
+			<text name="Creator:">
+				Créateur :
+			</text>
+			<text name="Creator Name">
+				Thrax Linden
+			</text>
+			<text name="Owner:">
+				Propriétaire :
+			</text>
+			<text name="Owner Name">
+				Thrax Linden
+			</text>
+			<text name="Group:">
+				Groupe :
+			</text>
+			<button label="Définir..." label_selected="Définir..." name="button set group" tool_tip="Choisissez un groupe pour partager les permissions de cet objet"/>
+			<name_box initial_value="Chargement…" name="Group Name Proxy"/>
+			<button label="Céder" label_selected="Céder" name="button deed" tool_tip="En cédant un objet, vous donnez aussi les permissions au prochain propriétaire. Seul un officier peut céder les objets d&apos;un groupe."/>
+			<check_box label="Partager" name="checkbox share with group" tool_tip="Autorisez tous les membres du groupe choisi à utiliser et à partager vos droits pour cet objet. Pour activer les restrictions de rôles, vous devez d&apos;abord cliquer sur Transférer."/>
+			<text name="label click action">
+				Cliquer pour :
+			</text>
+			<combo_box name="clickaction" width="178">
+				<combo_box.item label="Toucher (défaut)" name="Touch/grab(default)"/>
+				<combo_box.item label="S&apos;asseoir sur l&apos;objet" name="Sitonobject"/>
+				<combo_box.item label="Acheter l&apos;objet" name="Buyobject"/>
+				<combo_box.item label="Payer l&apos;objet" name="Payobject"/>
+				<combo_box.item label="Ouvrir" name="Open"/>
+			</combo_box>
+			<check_box label="À vendre :" name="checkbox for sale"/>
+			<combo_box name="sale type">
+				<combo_box.item label="Copie" name="Copy"/>
+				<combo_box.item label="Contenus" name="Contents"/>
+				<combo_box.item label="Original" name="Original"/>
+			</combo_box>
+			<spinner label="Prix : L$" name="Edit Cost"/>
+			<check_box label="Afficher dans la recherche" name="search_check" tool_tip="Afficher l&apos;objet dans les résultats de recherche"/>
+			<panel name="perms_build">
+				<text name="perm_modify">
+					Vous pouvez modifier cet objet
+				</text>
+				<text name="Anyone can:">
+					N&apos;importe qui :
+				</text>
+				<check_box label="Copier" name="checkbox allow everyone copy"/>
+				<text name="Next owner can:">
+					Le prochain propriétaire :
+				</text>
+				<check_box label="Modifier" name="checkbox next owner can modify"/>
+				<check_box label="Copier" left_delta="66" name="checkbox next owner can copy"/>
+				<check_box label="Transférer" name="checkbox next owner can transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/>
+				<text name="B:">
+					B :
+				</text>
+				<text name="O:">
+					O :
+				</text>
+				<text name="G:">
+					G :
+				</text>
+				<text name="E:">
+					E :
+				</text>
+				<text name="N:">
+					N :
+				</text>
+				<text name="F:">
+					F :
+				</text>
+			</panel>
+		</panel>
+		<panel label="Objet" name="Object">
+			<check_box label="Verrouillé" name="checkbox locked" tool_tip="Empêche l&apos;objet d&apos;être déplacé ou supprimé. Utile pendant la construction pour éviter les modifications involontaires."/>
+			<check_box label="Physique" name="Physical Checkbox Ctrl" tool_tip="Permet à l&apos;objet d&apos;être poussé et affecté par la gravité"/>
+			<check_box label="Temporaire" name="Temporary Checkbox Ctrl" tool_tip="L&apos;objet est supprimé 1 mn après sa création."/>
+			<check_box label="Fantôme" name="Phantom Checkbox Ctrl" tool_tip="Permet à l&apos;objet de ne pas entrer en collision avec d&apos;autres objets ou avatars."/>
+			<text name="label position">
+				Position (mètres)
+			</text>
+			<spinner label="X" name="Pos X"/>
+			<spinner label="Y" name="Pos Y"/>
+			<spinner label="Z" name="Pos Z"/>
+			<text name="label size">
+				Taille (mètres)
+			</text>
+			<spinner label="X" name="Scale X"/>
+			<spinner label="Y" name="Scale Y"/>
+			<spinner label="Z" name="Scale Z"/>
+			<text name="label rotation">
+				Rotation (degrés)
+			</text>
+			<spinner label="X" name="Rot X"/>
+			<spinner label="Y" name="Rot Y"/>
+			<spinner label="Z" name="Rot Z"/>
+			<combo_box name="comboBaseType">
+				<combo_box.item label="Boîte" name="Box"/>
+				<combo_box.item label="Cylindre" name="Cylinder"/>
+				<combo_box.item label="Prisme" name="Prism"/>
+				<combo_box.item label="Sphère" name="Sphere"/>
+				<combo_box.item label="Tore" name="Torus"/>
+				<combo_box.item label="Tube" name="Tube"/>
+				<combo_box.item label="Anneau" name="Ring"/>
+				<combo_box.item label="Sculptie" name="Sculpted"/>
+			</combo_box>
+			<combo_box name="material">
+				<combo_box.item label="Pierre" name="Stone"/>
+				<combo_box.item label="Métal" name="Metal"/>
+				<combo_box.item label="Verre" name="Glass"/>
+				<combo_box.item label="Bois" name="Wood"/>
+				<combo_box.item label="Chair" name="Flesh"/>
+				<combo_box.item label="Plastique" name="Plastic"/>
+				<combo_box.item label="Caoutchouc" name="Rubber"/>
+			</combo_box>
+			<text name="text cut">
+				Découpe du tracé (début/fin)
+			</text>
+			<spinner label="D" name="cut begin"/>
+			<spinner label="F" name="cut end"/>
+			<text name="text hollow">
+				Creux
+			</text>
+			<text name="text skew">
+				Biais
+			</text>
+			<text name="Hollow Shape">
+				Forme du creux
+			</text>
+			<combo_box name="hole">
+				<combo_box.item label="Défaut" name="Default"/>
+				<combo_box.item label="Cercle" name="Circle"/>
+				<combo_box.item label="Carré" name="Square"/>
+				<combo_box.item label="Triangle" name="Triangle"/>
+			</combo_box>
+			<text name="text twist">
+				Vrille (début/fin)
+			</text>
+			<spinner label="D" name="Twist Begin"/>
+			<spinner label="F" name="Twist End"/>
+			<text name="scale_taper">
+				Biseautage
+			</text>
+			<text name="scale_hole">
+				Taille du trou
+			</text>
+			<spinner label="X" name="Taper Scale X"/>
+			<spinner label="Y" name="Taper Scale Y"/>
+			<text name="text topshear">
+				Inclinaison
+			</text>
+			<spinner label="X" name="Shear X"/>
+			<spinner label="Y" name="Shear Y"/>
+			<text name="advanced_cut">
+				Découpe du profilé (début/fin)
+			</text>
+			<text name="advanced_dimple">
+				Creux (début/fin)
+			</text>
+			<text name="advanced_slice">
+				Tranche (début/fin)
+			</text>
+			<spinner label="D" name="Path Limit Begin"/>
+			<spinner label="F" name="Path Limit End"/>
+			<text name="text taper2">
+				Biseautage
+			</text>
+			<spinner label="X" name="Taper X"/>
+			<spinner label="Y" name="Taper Y"/>
+			<text name="text radius delta">
+				Rayon
+			</text>
+			<text name="text revolutions">
+				Révolutions
+			</text>
+			<texture_picker label="Texture du sculptie" name="sculpt texture control" tool_tip="Cliquez pour sélectionner une image"/>
+			<check_box label="Mirroir" name="sculpt mirror control" tool_tip="Retourne le sculptie le long de l&apos;axe des X."/>
+			<check_box label="A l&apos;envers" name="sculpt invert control" tool_tip="Inverse les valeurs normales d&apos;un sculptie et le fait apparaître à l&apos;envers."/>
+			<text name="label sculpt type">
+				Type de raccord
+			</text>
+			<combo_box name="sculpt type control">
+				<combo_box.item label="(aucun)" name="None"/>
+				<combo_box.item label="Sphère" name="Sphere"/>
+				<combo_box.item label="Tore" name="Torus"/>
+				<combo_box.item label="Plan" name="Plane"/>
+				<combo_box.item label="Cylindre" name="Cylinder"/>
+			</combo_box>
+		</panel>
+		<panel label="Attributs" name="Features">
+			<text name="select_single">
+				Sélectionnez un prim pour modifier les attributs.
+			</text>
+			<text name="edit_object">
+				Modifier les attributs de l&apos;objet :
+			</text>
+			<check_box label="Flexibilité" name="Flexible1D Checkbox Ctrl" tool_tip="Donne à l&apos;objet de la souplesse sur l&apos;axe des Z (côté client uniquement)."/>
+			<spinner label="Souplesse" name="FlexNumSections"/>
+			<spinner label="Gravité" name="FlexGravity"/>
+			<spinner label="Élasticité" name="FlexFriction"/>
+			<spinner label="Vent" name="FlexWind"/>
+			<spinner label="Tension" name="FlexTension"/>
+			<spinner label="Force X" name="FlexForceX"/>
+			<spinner label="Force Y" name="FlexForceY"/>
+			<spinner label="Force Z" name="FlexForceZ"/>
+			<check_box label="Lumière" name="Light Checkbox Ctrl" tool_tip="Permet aux objets d&apos;émettre de la lumière"/>
+			<color_swatch label="" name="colorswatch" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+			<spinner label="Intensité" name="Light Intensity"/>
+			<spinner label="Portée" name="Light Radius"/>
+			<spinner label="Atténuation" name="Light Falloff"/>
+		</panel>
+		<panel label="Texture" name="Texture">
+			<panel.string name="string repeats per meter">
+				Répétitions au mètre
+			</panel.string>
+			<panel.string name="string repeats per face">
+				Répétitions par face
+			</panel.string>
+			<texture_picker label="Texture" name="texture control" tool_tip="Cliquez pour sélectionner une image"/>
+			<color_swatch label="Couleur" name="colorswatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/>
+			<text name="color trans" width="88">
+				Transparence
+			</text>
+			<text name="glow label">
+				Rayonnement
+			</text>
+			<check_box label="Lumineux" name="checkbox fullbright"/>
+			<text name="tex gen">
+				Application
+			</text>
+			<combo_box name="combobox texgen">
+				<combo_box.item label="Défaut" name="Default"/>
+				<combo_box.item label="Planar" name="Planar"/>
+			</combo_box>
+			<text name="label shininess">
+				Brillance
+			</text>
+			<combo_box name="combobox shininess">
+				<combo_box.item label="Aucune" name="None"/>
+				<combo_box.item label="Faible" name="Low"/>
+				<combo_box.item label="Moyenne" name="Medium"/>
+				<combo_box.item label="Élevée" name="High"/>
+			</combo_box>
+			<text name="label bumpiness">
+				Relief
+			</text>
+			<combo_box name="combobox bumpiness">
+				<combo_box.item label="Aucun" name="None"/>
+				<combo_box.item label="Luminosité" name="Brightness"/>
+				<combo_box.item label="Obscurité" name="Darkness"/>
+				<combo_box.item label="Aggloméré" name="woodgrain"/>
+				<combo_box.item label="Écorce" name="bark"/>
+				<combo_box.item label="Briques" name="bricks"/>
+				<combo_box.item label="Damier" name="checker"/>
+				<combo_box.item label="Béton" name="concrete"/>
+				<combo_box.item label="Carrelage" name="crustytile"/>
+				<combo_box.item label="Pierre de taille" name="cutstone"/>
+				<combo_box.item label="Disques" name="discs"/>
+				<combo_box.item label="Gravier" name="gravel"/>
+				<combo_box.item label="Boîte de Petri" name="petridish"/>
+				<combo_box.item label="Lattes" name="siding"/>
+				<combo_box.item label="Carreaux" name="stonetile"/>
+				<combo_box.item label="Stuc" name="stucco"/>
+				<combo_box.item label="Ventouses" name="suction"/>
+				<combo_box.item label="Tissage" name="weave"/>
+			</combo_box>
+			<text name="tex scale">
+				Répétitions par face
+			</text>
+			<spinner label="Horizontal (U)" name="TexScaleU"/>
+			<check_box label="Inverser" name="checkbox flip s"/>
+			<spinner label="Vertical (V)" name="TexScaleV"/>
+			<check_box label="Inverser" name="checkbox flip t"/>
+			<spinner label="RotationËš" left="122" name="TexRot" width="58"/>
+			<spinner label="Repeats / Meter" left="122" name="rptctrl" width="58"/>
+			<button label="Appliquer" label_selected="Appliquer" left_delta="68" name="button apply" width="75"/>
+			<text name="tex offset">
+				Décalage de la texture
+			</text>
+			<spinner label="Horizontal (U)" name="TexOffsetU"/>
+			<spinner label="Vertical (V)" name="TexOffsetV"/>
+		</panel>
+		<panel label="Contenu" name="Contents">
+			<button label="Nouveau script" label_selected="Nouveau script" name="button new script"/>
+			<button label="Droits" name="button permissions"/>
+		</panel>
+	</tab_container>
+	<panel name="land info panel">
+		<text name="label_parcel_info">
+			Informations sur la parcelle
+		</text>
+		<text name="label_area_price">
+			Prix : [PRICE] L$ pour [AREA] m².
+		</text>
+		<text name="label_area">
+			Surface : [AREA] m²
+		</text>
+		<button label="À propos du terrain..." label_selected="À propos du terrain..." name="button about land" width="142"/>
+		<check_box label="Afficher les propriétaires" name="checkbox show owners" tool_tip="Colorie les parcelles en fonction de leur propriétaire : 
+
+Vert = votre terrain 
+Turquoise = le terrain de votre groupe 
+Rouge = appartenant à d&apos;autres 
+Jaune = en vente 
+Mauve = aux enchères 
+Gris = public"/>
+		<text name="label_parcel_modify">
+			Modifier la parcelle
+		</text>
+		<button label="Diviser" label_selected="Diviser" name="button subdivide land" width="142"/>
+		<button label="Fusionner" label_selected="Fusionner" name="button join land" width="142"/>
+		<text name="label_parcel_trans">
+			Transactions
+		</text>
+		<button label="Acheter le terrain" label_selected="Acheter le terrain" name="button buy land" width="142"/>
+		<button label="Abandonner le terrain" label_selected="Abandonner le terrain" name="button abandon land" width="142"/>
+	</panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/inspect_avatar.xml b/indra/newview/skins/default/xui/fr/inspect_avatar.xml
index 993f2bd5e43..7ee3ce957ac 100644
--- a/indra/newview/skins/default/xui/fr/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/fr/inspect_avatar.xml
@@ -1,16 +1,16 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!--
-  Not can_close / no title to avoid window chrome
-  Single instance - only have one at a time, recycle it each spawn
--->
-<floater name="inspect_avatar">
-	<string name="Subtitle">
-		[AGE]
-	</string>
-	<string name="Details">
-		[ACCTTYPE], [PAYMENTINFO]
-Profil : [SL_PROFILE]
-	</string>
-	<slider name="volume_slider" tool_tip="Volume de la voix" value="0.5"/>
-	<button label="Devenir amis" name="add_friend_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+  Not can_close / no title to avoid window chrome
+  Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+	<string name="Subtitle">
+		[AGE]
+	</string>
+	<string name="Details">
+		[ACCTTYPE], [PAYMENTINFO]
+Profil : [SL_PROFILE]
+	</string>
+	<slider name="volume_slider" tool_tip="Volume de la voix" value="0.5"/>
+	<button label="Devenir amis" name="add_friend_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/menu_avatar_icon.xml b/indra/newview/skins/default/xui/fr/menu_avatar_icon.xml
index ba2559a9a11..8f3dfae86ec 100644
--- a/indra/newview/skins/default/xui/fr/menu_avatar_icon.xml
+++ b/indra/newview/skins/default/xui/fr/menu_avatar_icon.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Avatar Icon Menu">
-	<menu_item_call label="Voir le profil..." name="Show Profile"/>
-	<menu_item_call label="Envoyer IM..." name="Send IM"/>
-	<menu_item_call label="Devenir amis..." name="Add Friend"/>
-	<menu_item_call label="Supprimer cet ami..." name="Remove Friend"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+	<menu_item_call label="Voir le profil..." name="Show Profile"/>
+	<menu_item_call label="Envoyer IM..." name="Send IM"/>
+	<menu_item_call label="Devenir amis..." name="Add Friend"/>
+	<menu_item_call label="Supprimer cet ami..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_favorites.xml b/indra/newview/skins/default/xui/fr/menu_favorites.xml
index 663df9449ac..5f1545fde7f 100644
--- a/indra/newview/skins/default/xui/fr/menu_favorites.xml
+++ b/indra/newview/skins/default/xui/fr/menu_favorites.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
-	<menu_item_call label="Téléporter" name="Teleport To Landmark"/>
-	<menu_item_call label="Voir/Modifier le repère" name="Landmark Open"/>
-	<menu_item_call label="Copier la SLurl" name="Copy slurl"/>
-	<menu_item_call label="Voir sur la carte" name="Show On Map"/>
-	<menu_item_call label="Copier" name="Landmark Copy"/>
-	<menu_item_call label="Coller" name="Landmark Paste"/>
-	<menu_item_call label="Supprimer" name="Delete"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+	<menu_item_call label="Téléporter" name="Teleport To Landmark"/>
+	<menu_item_call label="Voir/Modifier le repère" name="Landmark Open"/>
+	<menu_item_call label="Copier la SLurl" name="Copy slurl"/>
+	<menu_item_call label="Voir sur la carte" name="Show On Map"/>
+	<menu_item_call label="Copier" name="Landmark Copy"/>
+	<menu_item_call label="Coller" name="Landmark Paste"/>
+	<menu_item_call label="Supprimer" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_group_plus.xml b/indra/newview/skins/default/xui/fr/menu_group_plus.xml
index e4ad89751f5..f5882261b08 100644
--- a/indra/newview/skins/default/xui/fr/menu_group_plus.xml
+++ b/indra/newview/skins/default/xui/fr/menu_group_plus.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
-	<menu_item_call label="Rejoignez des groupes..." name="item_join"/>
-	<menu_item_call label="Nouveau groupe..." name="item_new"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+	<menu_item_call label="Rejoignez des groupes..." name="item_join"/>
+	<menu_item_call label="Nouveau groupe..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory.xml b/indra/newview/skins/default/xui/fr/menu_inventory.xml
index c3c931ad5c3..4e2cb044989 100644
--- a/indra/newview/skins/default/xui/fr/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inventory.xml
@@ -1,76 +1,76 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
-	<menu_item_call label="Acheter" name="Task Buy"/>
-	<menu_item_call label="Ouvrir" name="Task Open"/>
-	<menu_item_call label="Jouer" name="Task Play"/>
-	<menu_item_call label="Propriétés" name="Task Properties"/>
-	<menu_item_call label="Renommer" name="Task Rename"/>
-	<menu_item_call label="Supprimer" name="Task Remove"/>
-	<menu_item_call label="Vider la corbeille" name="Empty Trash"/>
-	<menu_item_call label="Vider les objets trouvés" name="Empty Lost And Found"/>
-	<menu_item_call label="Nouveau dossier" name="New Folder"/>
-	<menu_item_call label="Nouveau script" name="New Script"/>
-	<menu_item_call label="Nouvelle note" name="New Note"/>
-	<menu_item_call label="Nouveau geste" name="New Gesture"/>
-	<menu label="Nouveaux habits" name="New Clothes">
-		<menu_item_call label="Nouvelle chemise" name="New Shirt"/>
-		<menu_item_call label="Nouveau pantalon" name="New Pants"/>
-		<menu_item_call label="Nouvelles chaussures" name="New Shoes"/>
-		<menu_item_call label="Nouvelles chaussettes" name="New Socks"/>
-		<menu_item_call label="Nouvelle veste" name="New Jacket"/>
-		<menu_item_call label="Nouvelle jupe" name="New Skirt"/>
-		<menu_item_call label="Nouveaux gants" name="New Gloves"/>
-		<menu_item_call label="Nouveau tricot" name="New Undershirt"/>
-		<menu_item_call label="Nouveaux sous-vêtements" name="New Underpants"/>
-	</menu>
-	<menu label="Nouvelles parties du corps" name="New Body Parts">
-		<menu_item_call label="Nouvelle silhouette" name="New Shape"/>
-		<menu_item_call label="Nouvelle peau" name="New Skin"/>
-		<menu_item_call label="Nouveaux cheveux" name="New Hair"/>
-		<menu_item_call label="Nouveaux yeux" name="New Eyes"/>
-	</menu>
-	<menu label="Changer de type" name="Change Type">
-		<menu_item_call label="Défaut" name="Default"/>
-		<menu_item_call label="Gants" name="Gloves"/>
-		<menu_item_call label="Veste" name="Jacket"/>
-		<menu_item_call label="Pantalon" name="Pants"/>
-		<menu_item_call label="Silhouette" name="Shape"/>
-		<menu_item_call label="Chaussures" name="Shoes"/>
-		<menu_item_call label="Chemise" name="Shirt"/>
-		<menu_item_call label="Jupe" name="Skirt"/>
-		<menu_item_call label="Sous-vêtements (femme)" name="Underpants"/>
-		<menu_item_call label="Sous-vêtements (homme)" name="Undershirt"/>
-	</menu>
-	<menu_item_call label="Téléporter" name="Landmark Open"/>
-	<menu_item_call label="Ouvrir" name="Animation Open"/>
-	<menu_item_call label="Ouvrir" name="Sound Open"/>
-	<menu_item_call label="Purger l&apos;objet" name="Purge Item"/>
-	<menu_item_call label="Restaurer l&apos;objet" name="Restore Item"/>
-	<menu_item_call label="Ouvrir" name="Open"/>
-	<menu_item_call label="Propriétés" name="Properties"/>
-	<menu_item_call label="Renommer" name="Rename"/>
-	<menu_item_call label="Copier l&apos;UUID (identifiant universel unique)" name="Copy Asset UUID"/>
-	<menu_item_call label="Copier" name="Copy"/>
-	<menu_item_call label="Coller" name="Paste"/>
-	<menu_item_call label="Supprimer" name="Delete"/>
-	<menu_item_call label="Enlever les objets" name="Take Off Items"/>
-	<menu_item_call label="Ajouter à l&apos;ensemble" name="Add To Outfit"/>
-	<menu_item_call label="Remplacer l&apos;ensemble" name="Replace Outfit"/>
-	<menu_item_call label="Démarrer le chat conférence" name="Conference Chat Folder"/>
-	<menu_item_call label="Jouer" name="Sound Play"/>
-	<menu_item_call label="Jouer dans le Monde" name="Animation Play"/>
-	<menu_item_call label="Jouer localement" name="Animation Audition"/>
-	<menu_item_call label="Envoyer un message instantané" name="Send Instant Message"/>
-	<menu_item_call label="Offrir de téléporter..." name="Offer Teleport..."/>
-	<menu_item_call label="Démarrer le chat conférence" name="Conference Chat"/>
-	<menu_item_call label="Activer" name="Activate"/>
-	<menu_item_call label="Désactiver" name="Deactivate"/>
-	<menu_item_call label="Détacher de vous" name="Detach From Yourself"/>
-	<menu_item_call label="Porter" name="Object Wear"/>
-	<menu label="Attacher à" name="Attach To"/>
-	<menu label="Attacher au HUD " name="Attach To HUD"/>
-	<menu_item_call label="Éditer" name="Wearable Edit"/>
-	<menu_item_call label="Porter" name="Wearable Wear"/>
-	<menu_item_call label="Enlever" name="Take Off"/>
-	<menu_item_call label="--aucune option--" name="--no options--"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+	<menu_item_call label="Acheter" name="Task Buy"/>
+	<menu_item_call label="Ouvrir" name="Task Open"/>
+	<menu_item_call label="Jouer" name="Task Play"/>
+	<menu_item_call label="Propriétés" name="Task Properties"/>
+	<menu_item_call label="Renommer" name="Task Rename"/>
+	<menu_item_call label="Supprimer" name="Task Remove"/>
+	<menu_item_call label="Vider la corbeille" name="Empty Trash"/>
+	<menu_item_call label="Vider les objets trouvés" name="Empty Lost And Found"/>
+	<menu_item_call label="Nouveau dossier" name="New Folder"/>
+	<menu_item_call label="Nouveau script" name="New Script"/>
+	<menu_item_call label="Nouvelle note" name="New Note"/>
+	<menu_item_call label="Nouveau geste" name="New Gesture"/>
+	<menu label="Nouveaux habits" name="New Clothes">
+		<menu_item_call label="Nouvelle chemise" name="New Shirt"/>
+		<menu_item_call label="Nouveau pantalon" name="New Pants"/>
+		<menu_item_call label="Nouvelles chaussures" name="New Shoes"/>
+		<menu_item_call label="Nouvelles chaussettes" name="New Socks"/>
+		<menu_item_call label="Nouvelle veste" name="New Jacket"/>
+		<menu_item_call label="Nouvelle jupe" name="New Skirt"/>
+		<menu_item_call label="Nouveaux gants" name="New Gloves"/>
+		<menu_item_call label="Nouveau tricot" name="New Undershirt"/>
+		<menu_item_call label="Nouveaux sous-vêtements" name="New Underpants"/>
+	</menu>
+	<menu label="Nouvelles parties du corps" name="New Body Parts">
+		<menu_item_call label="Nouvelle silhouette" name="New Shape"/>
+		<menu_item_call label="Nouvelle peau" name="New Skin"/>
+		<menu_item_call label="Nouveaux cheveux" name="New Hair"/>
+		<menu_item_call label="Nouveaux yeux" name="New Eyes"/>
+	</menu>
+	<menu label="Changer de type" name="Change Type">
+		<menu_item_call label="Défaut" name="Default"/>
+		<menu_item_call label="Gants" name="Gloves"/>
+		<menu_item_call label="Veste" name="Jacket"/>
+		<menu_item_call label="Pantalon" name="Pants"/>
+		<menu_item_call label="Silhouette" name="Shape"/>
+		<menu_item_call label="Chaussures" name="Shoes"/>
+		<menu_item_call label="Chemise" name="Shirt"/>
+		<menu_item_call label="Jupe" name="Skirt"/>
+		<menu_item_call label="Sous-vêtements (femme)" name="Underpants"/>
+		<menu_item_call label="Sous-vêtements (homme)" name="Undershirt"/>
+	</menu>
+	<menu_item_call label="Téléporter" name="Landmark Open"/>
+	<menu_item_call label="Ouvrir" name="Animation Open"/>
+	<menu_item_call label="Ouvrir" name="Sound Open"/>
+	<menu_item_call label="Purger l&apos;objet" name="Purge Item"/>
+	<menu_item_call label="Restaurer l&apos;objet" name="Restore Item"/>
+	<menu_item_call label="Ouvrir" name="Open"/>
+	<menu_item_call label="Propriétés" name="Properties"/>
+	<menu_item_call label="Renommer" name="Rename"/>
+	<menu_item_call label="Copier l&apos;UUID (identifiant universel unique)" name="Copy Asset UUID"/>
+	<menu_item_call label="Copier" name="Copy"/>
+	<menu_item_call label="Coller" name="Paste"/>
+	<menu_item_call label="Supprimer" name="Delete"/>
+	<menu_item_call label="Enlever les objets" name="Take Off Items"/>
+	<menu_item_call label="Ajouter à l&apos;ensemble" name="Add To Outfit"/>
+	<menu_item_call label="Remplacer l&apos;ensemble" name="Replace Outfit"/>
+	<menu_item_call label="Démarrer le chat conférence" name="Conference Chat Folder"/>
+	<menu_item_call label="Jouer" name="Sound Play"/>
+	<menu_item_call label="Jouer dans le Monde" name="Animation Play"/>
+	<menu_item_call label="Jouer localement" name="Animation Audition"/>
+	<menu_item_call label="Envoyer un message instantané" name="Send Instant Message"/>
+	<menu_item_call label="Offrir de téléporter..." name="Offer Teleport..."/>
+	<menu_item_call label="Démarrer le chat conférence" name="Conference Chat"/>
+	<menu_item_call label="Activer" name="Activate"/>
+	<menu_item_call label="Désactiver" name="Deactivate"/>
+	<menu_item_call label="Détacher de vous" name="Detach From Yourself"/>
+	<menu_item_call label="Porter" name="Object Wear"/>
+	<menu label="Attacher à" name="Attach To"/>
+	<menu label="Attacher au HUD " name="Attach To HUD"/>
+	<menu_item_call label="Éditer" name="Wearable Edit"/>
+	<menu_item_call label="Porter" name="Wearable Wear"/>
+	<menu_item_call label="Enlever" name="Take Off"/>
+	<menu_item_call label="--aucune option--" name="--no options--"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_landmark.xml b/indra/newview/skins/default/xui/fr/menu_landmark.xml
index d887fb0f399..dfa794960e4 100644
--- a/indra/newview/skins/default/xui/fr/menu_landmark.xml
+++ b/indra/newview/skins/default/xui/fr/menu_landmark.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="landmark_overflow_menu">
-	<menu_item_call label="Copier la SLurl" name="copy"/>
-	<menu_item_call label="Supprimer" name="delete"/>
-	<menu_item_call label="Créer un Favori" name="pick"/>
-</toggleable_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+	<menu_item_call label="Copier la SLurl" name="copy"/>
+	<menu_item_call label="Supprimer" name="delete"/>
+	<menu_item_call label="Créer un Favori" name="pick"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_mini_map.xml b/indra/newview/skins/default/xui/fr/menu_mini_map.xml
index 5ab5f56ec59..219eb4ad4cd 100644
--- a/indra/newview/skins/default/xui/fr/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/fr/menu_mini_map.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="popup">
-	<menu_item_call label="Zoom rapproché" name="Zoom Close"/>
-	<menu_item_call label="Zoom moyen" name="Zoom Medium"/>
-	<menu_item_call label="Zoom éloigné" name="Zoom Far"/>
-	<menu_item_call label="Arrêter de suivre" name="Stop Tracking"/>
-	<menu_item_call label="Carte du monde" name="World Map"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="popup">
+	<menu_item_call label="Zoom rapproché" name="Zoom Close"/>
+	<menu_item_call label="Zoom moyen" name="Zoom Medium"/>
+	<menu_item_call label="Zoom éloigné" name="Zoom Far"/>
+	<menu_item_call label="Arrêter de suivre" name="Stop Tracking"/>
+	<menu_item_call label="Carte du monde" name="World Map"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_navbar.xml b/indra/newview/skins/default/xui/fr/menu_navbar.xml
index ce48f8e6171..1b11dcbb0cf 100644
--- a/indra/newview/skins/default/xui/fr/menu_navbar.xml
+++ b/indra/newview/skins/default/xui/fr/menu_navbar.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Navbar Menu">
-	<menu_item_check label="Voir les coordonnées" name="Show Coordinates"/>
-	<menu_item_call label="Repère" name="Landmark"/>
-	<menu_item_call label="Couper" name="Cut"/>
-	<menu_item_call label="Copier" name="Copy"/>
-	<menu_item_call label="Coller" name="Paste"/>
-	<menu_item_call label="Supprimer" name="Delete"/>
-	<menu_item_call label="Tout sélectionner" name="Select All"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+	<menu_item_check label="Voir les coordonnées" name="Show Coordinates"/>
+	<menu_item_call label="Repère" name="Landmark"/>
+	<menu_item_call label="Couper" name="Cut"/>
+	<menu_item_call label="Copier" name="Copy"/>
+	<menu_item_call label="Coller" name="Paste"/>
+	<menu_item_call label="Supprimer" name="Delete"/>
+	<menu_item_call label="Tout sélectionner" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_picks.xml b/indra/newview/skins/default/xui/fr/menu_picks.xml
index 6fcb8570540..adb1cec8f56 100644
--- a/indra/newview/skins/default/xui/fr/menu_picks.xml
+++ b/indra/newview/skins/default/xui/fr/menu_picks.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Picks">
-	<menu_item_call label="Infos" name="pick_info"/>
-	<menu_item_call label="Éditer" name="pick_edit"/>
-	<menu_item_call label="Téléporter" name="pick_teleport"/>
-	<menu_item_call label="Carte" name="pick_map"/>
-	<menu_item_call label="Supprimer" name="pick_delete"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+	<menu_item_call label="Infos" name="pick_info"/>
+	<menu_item_call label="Éditer" name="pick_edit"/>
+	<menu_item_call label="Téléporter" name="pick_teleport"/>
+	<menu_item_call label="Carte" name="pick_map"/>
+	<menu_item_call label="Supprimer" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_place.xml b/indra/newview/skins/default/xui/fr/menu_place.xml
index 85d8d339826..9928e302a01 100644
--- a/indra/newview/skins/default/xui/fr/menu_place.xml
+++ b/indra/newview/skins/default/xui/fr/menu_place.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="place_overflow_menu">
-	<menu_item_call label="Enregistrer comme repère" name="landmark"/>
-	<menu_item_call label="Créer un Favori" name="pick"/>
-	<menu_item_call label="Acheter un pass" name="pass"/>
-	<menu_item_call label="Éditer" name="edit"/>
-</toggleable_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+	<menu_item_call label="Enregistrer comme repère" name="landmark"/>
+	<menu_item_call label="Créer un Favori" name="pick"/>
+	<menu_item_call label="Acheter un pass" name="pass"/>
+	<menu_item_call label="Éditer" name="edit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_slurl.xml b/indra/newview/skins/default/xui/fr/menu_slurl.xml
index 055be714cf3..ddfa5c0849c 100644
--- a/indra/newview/skins/default/xui/fr/menu_slurl.xml
+++ b/indra/newview/skins/default/xui/fr/menu_slurl.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
-	<menu_item_call label="À propos de l&apos;URL" name="about_url"/>
-	<menu_item_call label="Téléporter vers l&apos;URL" name="teleport_to_url"/>
-	<menu_item_call label="Carte" name="show_on_map"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+	<menu_item_call label="À propos de l&apos;URL" name="about_url"/>
+	<menu_item_call label="Téléporter vers l&apos;URL" name="teleport_to_url"/>
+	<menu_item_call label="Carte" name="show_on_map"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_url_agent.xml b/indra/newview/skins/default/xui/fr/menu_url_agent.xml
index 76a573cfd57..816070cf3a2 100644
--- a/indra/newview/skins/default/xui/fr/menu_url_agent.xml
+++ b/indra/newview/skins/default/xui/fr/menu_url_agent.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="Voir le profil du résident" name="show_agent"/>
-	<menu_item_call label="Copier le nom dans le presse-papier" name="url_copy_label"/>
-	<menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="Voir le profil du résident" name="show_agent"/>
+	<menu_item_call label="Copier le nom dans le presse-papier" name="url_copy_label"/>
+	<menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_url_group.xml b/indra/newview/skins/default/xui/fr/menu_url_group.xml
index 4615ad0939b..f16a91cf7b9 100644
--- a/indra/newview/skins/default/xui/fr/menu_url_group.xml
+++ b/indra/newview/skins/default/xui/fr/menu_url_group.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="Voir le profil du groupe" name="show_group"/>
-	<menu_item_call label="Copier le groupe dans le presse-papier" name="url_copy_label"/>
-	<menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="Voir le profil du groupe" name="show_group"/>
+	<menu_item_call label="Copier le groupe dans le presse-papier" name="url_copy_label"/>
+	<menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_url_http.xml b/indra/newview/skins/default/xui/fr/menu_url_http.xml
index 27bcb91f7e9..15db7900b32 100644
--- a/indra/newview/skins/default/xui/fr/menu_url_http.xml
+++ b/indra/newview/skins/default/xui/fr/menu_url_http.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="Ouvrir la page Web" name="url_open"/>
-	<menu_item_call label="Ouvrir dans un navigateur interne" name="url_open_internal"/>
-	<menu_item_call label="Ouvrir dans un navigateur externe" name="url_open_external"/>
-	<menu_item_call label="Copier l&apos;URL dans le presse-papier" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="Ouvrir la page Web" name="url_open"/>
+	<menu_item_call label="Ouvrir dans un navigateur interne" name="url_open_internal"/>
+	<menu_item_call label="Ouvrir dans un navigateur externe" name="url_open_external"/>
+	<menu_item_call label="Copier l&apos;URL dans le presse-papier" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_url_objectim.xml b/indra/newview/skins/default/xui/fr/menu_url_objectim.xml
index 50bd5b4f747..69449538d87 100644
--- a/indra/newview/skins/default/xui/fr/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/fr/menu_url_objectim.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="Afficher les informations sur l&apos;objet" name="show_object"/>
-	<menu_item_call label="Me téléporter à l&apos;endroit de l&apos;objet" name="teleport_to_object"/>
-	<menu_item_call label="Copier le nom de l&apos;objet dans le presse-papier" name="url_copy_label"/>
-	<menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="Afficher les informations sur l&apos;objet" name="show_object"/>
+	<menu_item_call label="Me téléporter à l&apos;endroit de l&apos;objet" name="teleport_to_object"/>
+	<menu_item_call label="Copier le nom de l&apos;objet dans le presse-papier" name="url_copy_label"/>
+	<menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_url_parcel.xml b/indra/newview/skins/default/xui/fr/menu_url_parcel.xml
index 1f30203a434..7d77b35036f 100644
--- a/indra/newview/skins/default/xui/fr/menu_url_parcel.xml
+++ b/indra/newview/skins/default/xui/fr/menu_url_parcel.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="Afficher les informations sur la parcelle" name="show_parcel"/>
-	<menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="Afficher les informations sur la parcelle" name="show_parcel"/>
+	<menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_url_slurl.xml b/indra/newview/skins/default/xui/fr/menu_url_slurl.xml
index 143da035330..70564a67688 100644
--- a/indra/newview/skins/default/xui/fr/menu_url_slurl.xml
+++ b/indra/newview/skins/default/xui/fr/menu_url_slurl.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="Afficher les informations sur ce lieu" name="show_place"/>
-	<menu_item_call label="Me téléporter à cet endroit" name="teleport_to_location"/>
-	<menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="Afficher les informations sur ce lieu" name="show_place"/>
+	<menu_item_call label="Me téléporter à cet endroit" name="teleport_to_location"/>
+	<menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_url_teleport.xml b/indra/newview/skins/default/xui/fr/menu_url_teleport.xml
index a32ce65ec15..4aaaf34408a 100644
--- a/indra/newview/skins/default/xui/fr/menu_url_teleport.xml
+++ b/indra/newview/skins/default/xui/fr/menu_url_teleport.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="Me téléporter à cet endroit." name="teleport"/>
-	<menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="Me téléporter à cet endroit." name="teleport"/>
+	<menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index 8832550add5..7f6960c8fb9 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -1,2547 +1,2547 @@
-<?xml version="1.0" encoding="utf-8"?>
-<notifications>
-	<global name="skipnexttime">
-		Ne plus afficher
-	</global>
-	<global name="alwayschoose">
-		Toujours choisir cette option
-	</global>
-	<global name="implicitclosebutton">
-		Fermer
-	</global>
-	<template name="okbutton">
-		<form>
-			<button name="OK" text="$yestext"/>
-		</form>
-	</template>
-	<template name="okignore"/>
-	<template name="okcancelbuttons">
-		<form>
-			<button name="Cancel" text="$notext"/>
-		</form>
-	</template>
-	<template name="okcancelignore"/>
-	<template name="okhelpbuttons">
-		<form>
-			<button name="Help" text="$helptext"/>
-		</form>
-	</template>
-	<template name="yesnocancelbuttons">
-		<form>
-			<button name="Yes" text="$yestext"/>
-			<button name="No" text="$notext"/>
-		</form>
-	</template>
-	<notification functor="GenericAcknowledge" label="Message d&apos;alerte inconnu" name="MissingAlert">
-		Votre version de [APP_NAME] ne peut afficher ce message d&apos;erreur.  Veuillez vous assurer que vous avez bien la toute dernière version du client.
-
-Détails de l&apos;erreur : L&apos;alerte, appelée &apos;[_NAME]&apos; est introuvable dans notifications.xml.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="FloaterNotFound">
-		Erreur floater : impossible de trouver les contrôles suivants :
-
-[CONTROLS]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="TutorialNotFound">
-		Aucun didacticiel n&apos;est disponible actuellement.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="GenericAlert">
-		[MESSAGE]
-	</notification>
-	<notification name="GenericAlertYesCancel">
-		[MESSAGE]
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/>
-	</notification>
-	<notification name="BadInstallation">
-		Une erreur est survenue lors de la mise à jour de [APP_NAME].  Veuillez télécharger la dernière version su client. http://get.secondlife.com
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="LoginFailedNoNetwork">
-		Connexion à [SECOND_LIFE_GRID] impossible.
-&apos;[DIAGNOSTIC]&apos;
-Veuillez vérifier votre connexion Internet.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="MessageTemplateNotFound">
-		Le modèle de message [PATH] est introuvable.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="WearableSave">
-		Enregistrer les changements dans la partie du corps/les habits actuels ?
-		<usetemplate canceltext="Cancel" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/>
-	</notification>
-	<notification name="CompileQueueSaveText">
-		Une erreur est survenue lors du chargement du texte pour un script, suite au problème suivant : [REASON]. Veuillez réessayer ultérieurement.
-	</notification>
-	<notification name="CompileQueueSaveBytecode">
-		Une erreur est survenue lors du chargement du script compilé, suite au problème suivant : [REASON]. Veuillez réessayer ultérieurement.
-	</notification>
-	<notification name="WriteAnimationFail">
-		Une erreur est survenue lors de l&apos;écriture des données d&apos;animation. Veuillez réessayer ultérieurement.
-	</notification>
-	<notification name="UploadAuctionSnapshotFail">
-		Un problème est survenu lors du chargement du script compilé, suite au problème suivant : [REASON]
-	</notification>
-	<notification name="UnableToViewContentsMoreThanOne">
-		Impossible d&apos;afficher les contenus de plus d&apos;un objet à la fois.
-Veuillez ne sélectionner qu&apos;un seul objet.
-	</notification>
-	<notification name="SaveClothingBodyChanges">
-		Enregistrer tous les changements dans les habits/parties du corps ?
-		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Tout enregistrer"/>
-	</notification>
-	<notification name="GrantModifyRights">
-		Lorsque vous accordez des droits d&apos;édition à un autre résident, vous lui permettez de changer, supprimer ou prendre n&apos;importe lequel de vos objets dans le Monde. Réfléchissez bien avant d&apos;accorder ces droits.
-Souhaitez-vous accorder des droits d&apos;édition à [FIRST_NAME] [LAST_NAME] ?
-		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
-	</notification>
-	<notification name="GrantModifyRightsMultiple">
-		Lorsque vous accordez des droits d&apos;édition à un autre résident, vous lui permettez de changer n&apos;importe lequel de vos objets dans le Monde. Réfléchissez bien avant d&apos;accorder ces droits.
-Souhaitez-vous accorder des droits d&apos;édition aux résidents selectionnés ?
-		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
-	</notification>
-	<notification name="RevokeModifyRights">
-		Souhaitez-vous retirer les droits d&apos;édition à [FIRST_NAME] [LAST_NAME] ?
-		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
-	</notification>
-	<notification name="RevokeModifyRightsMultiple">
-		Souhaitez-vous retirer les droits d&apos;édition aux résidents selectionnés ?
-		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
-	</notification>
-	<notification name="UnableToCreateGroup">
-		Impossible de créer le groupe.
-[MESSAGE]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="PanelGroupApply">
-		[NEEDS_APPLY_MESSAGE]
-[WANT_APPLY_MESSAGE]
-		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ignorer les modifications" yestext="Enregistrer les modifications"/>
-	</notification>
-	<notification name="MustSpecifyGroupNoticeSubject">
-		Pour envoyer une notice au groupe, vous devez indiquer un sujet.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="AddGroupOwnerWarning">
-		Vous êtes sur le point d&apos;ajouter des membres du groupe dans le rôle de [ROLE_NAME].
-Les membres ne peuvent pas être destitués de ce rôle.
-Ils doivent donner eux-mêmes leur démission.
-Êtes-vous certain de vouloir continuer ?
-		<usetemplate ignoretext="Confirmer avant d&apos;ajouter un nouveau propriétaire" name="okcancelignore" notext="Non" yestext="Oui"/>
-	</notification>
-	<notification name="AssignDangerousActionWarning">
-		Vous êtes sur le point d&apos;ajouter le pouvoir « [ACTION_NAME] » au rôle « [ROLE_NAME] ».
- *Avertissement*
- Tout membre disposant de ce pouvoir peut s&apos;affecter lui-même, ainsi que tout autre membre, à des rôles disposant de pouvoirs plus importants, et accéder potentiellement à des pouvoirs proches de ceux d&apos;un propriétaire. Assurez-vous de bien comprendre ce que vous faites avant d&apos;attribuer ce pouvoir.
-
-Ajouter ce pouvoir à « [ROLE_NAME] » ?
-		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
-	</notification>
-	<notification name="AssignDangerousAbilityWarning">
-		Vous êtes sur le point d&apos;ajouter le pouvoir « [ACTION_NAME] » au rôle « [ROLE_NAME] ».
-
- *Avertissement*
- Tout membre dans un rôle avec ce pouvoir peut s&apos;attribuer à lui-même, ainsi qu&apos;à tout autre membre, Tous les pouvoirs, et accéder potentiellement à des pouvoirs proches de ceux d&apos;un propriétaire.
-
-Ajouter ce pouvoir à « [ROLE_NAME] » ?
-		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
-	</notification>
-	<notification name="JoinGroupCanAfford">
-		Rejoindre ce groupe coûte [COST] L$.
-Voulez-vous continuer ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Rejoindre"/>
-	</notification>
-	<notification name="JoinGroupCannotAfford">
-		Rejoindre ce groupe coûte [COST] L$.
-Vous n&apos;avez pas suffisamment de L$ pour rejoindre ce groupe.
-	</notification>
-	<notification name="CreateGroupCost">
-		La création de ce groupe coûte 100 L$.
-Les groupes doivent comporter plus d&apos;un membre, sinon ils sont supprimés.
-Veuillez inviter des membres d&apos;ici 48 heures.
-		<usetemplate canceltext="Annuler" name="okcancelbuttons" notext="Annuler" yestext="Créer un groupe pour 100 L$"/>
-	</notification>
-	<notification name="LandBuyPass">
-		Pour [COST] L$ vous pouvez pénétrer sur ce terrain ([PARCEL_NAME]) et y rester [TIME] heures. Acheter un pass ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="SalePriceRestriction">
-		Pour rendre l&apos;annonce disponible à tous, le prix de vente doit être supérieur à 0 L$.
-Si le prix de vente est de 0 L$, vous devez choisir un acheteur spécifique.
-	</notification>
-	<notification name="ConfirmLandSaleChange">
-		Le terrain sélectionné, de [LAND_SIZE] m², est mis en vente.
-Votre prix de vente sera de [SALE_PRICE] L$ et la vente sera disponible à [NAME].
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmLandSaleToAnyoneChange">
-		Attention : en cliquant sur Vendre à n&apos;importe qui, vous rendez votre terrain disponible à toute la communauté de [SECOND_LIFE], même aux personnes qui ne sont pas dans cette région.
-
-Le terrain sélectionné, de [LAND_SIZE] m², est mis en vente.
-Votre prix de vente sera de [SALE_PRICE] L$ et la vente sera disponible à [NAME].
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsDeededToGroup">
-		Êtes-vous certain de vouloir renvoyer tous les objets partagés par le groupe [NAME] sur cette parcelle dans l&apos;inventaire du propriétaire précédent ?
-
-*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés !
-
-Objets : [N]
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsOwnedByUser">
-		Etes-vous certain de vouloir renvoyer tous les objets que [NAME] possède sur cette parcelle dans son inventaire ?
-
-Objets : [N]
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsOwnedBySelf">
-		Êtes-vous certain de vouloir renvoyer tous les objets que vous possédez sur cette parcelle dans votre inventaire ?
-
-Objets : [N]
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsNotOwnedBySelf">
-		Êtes-vous certain de vouloir renvoyer tous les objets que vous ne possédez pas sur cette parcelle dans l&apos;inventaire de leur propriétaire ?
-Les objets transférables cédés à un groupe seront renvoyés aux propriétaires précédents.
-
-*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés !
-
-Objets : [N]
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsNotOwnedByUser">
-		Êtes-vous certain de vouloir renvoyer tous les objets que [NAME] ne possède pas sur cette parcelle dans l&apos;inventaire de leur propriétaire ?
-Les objets transférables cédés à un groupe seront renvoyés aux propriétaires précédents.
-
-*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés !
-
-Objets : [N]
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ReturnAllTopObjects">
-		Êtes-vous certain de vouloir renvoyer tous les objets de la liste dans l&apos;inventaire de leur propriétaire ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="DisableAllTopObjects">
-		Êtes-vous certain de vouloir désactiver tous les objets dans cette région ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsNotOwnedByGroup">
-		Renvoyer les objets de cette parcelle qui ne sont pas partagés avec le groupe [NAME] à leur propriétaire ?
-
-Objets : [N]
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="UnableToDisableOutsideScripts">
-		Impossible de désactiver les scripts.
-Les dégâts sont autorisés dans toute la région.
-Pour que les armes fonctionnent, les scripts doivent être autorisés.
-	</notification>
-	<notification name="MustBeInParcel">
-		Pour définir le point d&apos;atterrissage, vous devez vous trouver à l&apos;intérieur de la parcelle.
-	</notification>
-	<notification name="PromptRecipientEmail">
-		Veuillez saisir une adresse e-mail valide pour le(s) destinataire(s).
-	</notification>
-	<notification name="PromptSelfEmail">
-		Veuillez saisir votre adresse e-mail.
-	</notification>
-	<notification name="PromptMissingSubjMsg">
-		Envoyer la photo avec le sujet ou le message par défaut ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ErrorProcessingSnapshot">
-		Erreur dans le traitement des données de la photo
-	</notification>
-	<notification name="ErrorEncodingSnapshot">
-		Erreur d&apos;encodage de la photo.
-	</notification>
-	<notification name="ErrorUploadingPostcard">
-		Une erreur est survenue lors du chargement du script compilé, suite au problème suivant : [REASON]
-	</notification>
-	<notification name="ErrorUploadingReportScreenshot">
-		Une erreur est survenue lors du chargement de la capture d&apos;écran destinée au rapport, suite au problème suivant : [REASON]
-	</notification>
-	<notification name="MustAgreeToLogIn">
-		Pour vous connecter à [SECOND_LIFE], vous devez accepter les Conditions d&apos;utilisation.
-	</notification>
-	<notification name="CouldNotPutOnOutfit">
-		Impossible de mettre cet ensemble.
-Ce dossier ne contient pas d&apos;habits, de parties du corps ni de pièces jointes.
-	</notification>
-	<notification name="CannotWearTrash">
-		Vous ne pouvez pas porter d&apos;habits ni de parties du corps se trouvant dans la corbeille.
-	</notification>
-	<notification name="CannotWearInfoNotComplete">
-		Vous ne pouvez pas porter cet article car il n&apos;a pas encore été chargé. Veuillez réessayer dans une minute.
-	</notification>
-	<notification name="MustHaveAccountToLogIn">
-		Oups! Vous avez oublié de fournir certaines informations.
-Vous devez saisir le nom et le prénom de votre avatar.
-
-Pour entrer dans [SECOND_LIFE], vous devez avoir un compte. Voulez-vous en créer un maintenant ?
-		<url name="url">
-			http://join.secondlife.com/
-		</url>
-		<usetemplate name="okcancelbuttons" notext="Réessayer" yestext="Créer un compte"/>
-	</notification>
-	<notification name="AddClassified">
-		Les petites annonces sont publiées à l&apos;onglet Petites annonces de la section Recherche pendant une semaine.
-Rédigez votre annonce, puis cliquez sur Publier pour l&apos;ajouter à la liste des annonces.
-Au moment de cliquer sur Publier, vous serez invité à payer des frais.
-Plus vous payez cher, plus votre annonce est visible dans la liste ainsi que dans les résultats de recherche de mots-clés.
-		<usetemplate ignoretext="Comment ajouter une nouvelle petite annonce" name="okcancelignore" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="DeleteClassified">
-		Supprimer l&apos;annonce [NAME] ?
-Une fois payés, les frais ne sont pas remboursables.
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ClassifiedSave">
-		Enregistrer les changements dans l&apos;annonce [NAME] ?
-		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/>
-	</notification>
-	<notification name="DeleteAvatarPick">
-		Supprimer le favori [PICK] ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="PromptGoToEventsPage">
-		Aller à la page web de [SECOND_LIFE] réservée aux événements ?
-		<url name="url">
-			http://secondlife.com/events/
-		</url>
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="SelectProposalToView">
-		Veuillez sélectionner une proposition.
-	</notification>
-	<notification name="SelectHistoryItemToView">
-		Veuillez sélectionner un historique.
-	</notification>
-	<notification name="ResetShowNextTimeDialogs">
-		Souhaitez-vous réactiver tous les pop-ups que vous aviez désactivés ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="SkipShowNextTimeDialogs">
-		Voulez-vous désactiver tous les pop-ups qui peuvent être évités ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="CacheWillClear">
-		Le cache sera vidé après le redémarrage de [APP_NAME].
-	</notification>
-	<notification name="CacheWillBeMoved">
-		Le cache sera déplacé après le redémarrage de [APP_NAME].
-Remarque : cela videra le cache.
-	</notification>
-	<notification name="ChangeConnectionPort">
-		Les paramètres du port prendront effet après le redémarrage de [APP_NAME].
-	</notification>
-	<notification name="ChangeSkin">
-		Le nouveau thème apparaîtra après le redémarrage de [APP_NAME].
-	</notification>
-	<notification name="GoToAuctionPage">
-		Aller à la page web de [SECOND_LIFE] pour voir le détail des enchères ou enchérir ?
-		<url name="url">
-			http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
-		</url>
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="SaveChanges">
-		Enregistrer les changements ?
-		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/>
-	</notification>
-	<notification name="GestureSaveFailedTooManySteps">
-		L&apos;enregistrement du geste a échoué.
-Il y a trop d&apos;étapes dans ce geste.
-Essayez d&apos;en supprimer quelques-unes.
-	</notification>
-	<notification name="GestureSaveFailedTryAgain">
-		L&apos;enregistrement du geste a échoué. Veuillez réessayer dans une minute.
-	</notification>
-	<notification name="GestureSaveFailedObjectNotFound">
-		Le geste n&apos;a pas pu être enregistré car l&apos;objet ou l&apos;inventaire de l&apos;objet associé n&apos;a pas été trouvé.
-L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
-	</notification>
-	<notification name="GestureSaveFailedReason">
-		Une erreur est survenue lors de l&apos;enregistrement du geste, suite au problème suivant : [REASON]. Essayez d&apos;enregistrer votre geste ultérieurement.
-	</notification>
-	<notification name="SaveNotecardFailObjectNotFound">
-		La note n&apos;a pas pu être enregistrée car l&apos;objet ou l&apos;inventaire de l&apos;objet associé n&apos;a pas été trouvé.
-L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
-	</notification>
-	<notification name="SaveNotecardFailReason">
-		Une erreur est survenue lors de l&apos;enregistrement de la note, suite au problème suivant : [REASON]. Essayez d&apos;enregistrer votre note ultérieurement.
-	</notification>
-	<notification name="ScriptCannotUndo">
-		Impossible d&apos;annuler tous les changements dans votre version du script.
-Souhaitez-vous charger la dernière version enregistrée sur le serveur ?
-(**Attention** Cette opération est irréversible.)
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="SaveScriptFailReason">
-		Une erreur est survenue lors de l&apos;enregistrement du script, suite au problème suivant : [REASON]. Essayez d&apos;enregistrer votre script ultérieurement.
-	</notification>
-	<notification name="SaveScriptFailObjectNotFound">
-		Impossible d&apos;enregistrer le script car l&apos;objet qui le contient est introuvable.
-L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
-	</notification>
-	<notification name="SaveBytecodeFailReason">
-		Une erreur est survenue lors de l&apos;enregistrement du script compilé, suite au problème suivant : [REASON]. Essayez d&apos;enregistrer votre script ultérieurement.
-	</notification>
-	<notification name="StartRegionEmpty">
-		Vous n&apos;avez pas défini de région de départ. 
-Veuillez saisir le nom de la région dans la case Lieu de départ, ou choisissez Dernier emplacement ou Domicile comme Lieu de départ.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="CouldNotStartStopScript">
-		Impossible de lancer ou d&apos;arrêter le script car l&apos;objet qui le contient est introuvable.
-L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
-	</notification>
-	<notification name="CannotDownloadFile">
-		Impossible de télécharger le fichier
-	</notification>
-	<notification name="CannotWriteFile">
-		Impossible d&apos;écrire le fichier [[FILE]]
-	</notification>
-	<notification name="UnsupportedHardware">
-		Avertissement : vous n&apos;avez pas la configuration système requise pour utiliser [APP_NAME]. Si vous continuez à utiliser [APP_NAME], votre performance risque d&apos;être moindre. Malheureusement, la section [SUPPORT_SITE] n&apos;offre aucune aide pour les problèmes de configuration système.
-
-MINSPECS
-Voulez-vous visiter [_URL] pour plus d&apos;informations ?
-		<url name="url" option="0">
-			http://secondlife.com/support/sysreqs.php?lang=fr
-		</url>
-		<usetemplate ignoretext="Mon matériel n&apos;est pas pris en charge" name="okcancelignore" notext="Non" yestext="Oui"/>
-	</notification>
-	<notification name="UnknownGPU">
-		Votre système contient une carte graphique que nous ne connaissons pas actuellement.
-Cela est souvent le cas avec le nouveau materiel qui n&apos;a pas encore été testé avec [APP_NAME].  Vous pourrez probablement utiliser [APP_NAME] sans problème, mais vous devrez peut-être ajuster les paramètres de vos graphiques.
-(Préférences &gt; Graphiques).
-		<form name="form">
-			<ignore name="ignore" text="Ma carte graphique ne peut être identifiée"/>
-		</form>
-	</notification>
-	<notification name="DisplaySettingsNoShaders">
-		[APP_NAME] a planté lors de l&apos;initialisation des drivers graphiques.
-La qualité des graphiques sera paramétrée sur Faible pour éviter certaines erreurs de driver fréquentes.
-Certaines fonctionnalités graphiques seront donc désactivées.
-Nous vous recommandons de mettre à jour les drivers de votre carte graphique.
-La qualité des graphiques peut être augmentée à la section Préférences &gt; Graphiques
-	</notification>
-	<notification name="RegionNoTerraforming">
-		Le terraformage est interdit dans la région [REGION].
-	</notification>
-	<notification name="CannotCopyWarning">
-		Vous n&apos;êtes pas autorisé à copier cet objet et il disparaîtra de votre inventaire si vous le donnez. Souhaitez-vous vraiment offrir cet objet ?
-		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
-	</notification>
-	<notification name="CannotGiveItem">
-		Impossible de donner l&apos;objet de l&apos;inventaire.
-	</notification>
-	<notification name="TransactionCancelled">
-		Transaction annulée.
-	</notification>
-	<notification name="TooManyItems">
-		Impossible de donner plus de 42 objets au cours d&apos;un seul transfert d&apos;inventaire.
-	</notification>
-	<notification name="NoItems">
-		Vous n&apos;êtes pas autorisé à transférer les objets sélectionnés.
-	</notification>
-	<notification name="CannotCopyCountItems">
-		Vous n&apos;êtes pas autorisé à copier [COUNT] des objets sélectionnés. Ces objets disparaîtront de votre inventaire.
-Souhaitez-vous vraiment donner ces objets ?
-		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
-	</notification>
-	<notification name="CannotGiveCategory">
-		Vous n&apos;êtes pas autorisé à transférer le dossier sélectionné.
-	</notification>
-	<notification name="FreezeAvatar">
-		Geler cet avatar ?
-Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le Monde.
-		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Dégeler" yestext="Geler"/>
-	</notification>
-	<notification name="FreezeAvatarFullname">
-		Geler [AVATAR_NAME] ?
-Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le Monde.
-		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Dégeler" yestext="Geler"/>
-	</notification>
-	<notification name="EjectAvatarFullname">
-		Expulser [AVATAR_NAME] de votre terrain ?
-		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Expulser et bannir" yestext="Expulser"/>
-	</notification>
-	<notification name="EjectAvatarNoBan">
-		Expulser cet avatar de votre terrain ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Expulser"/>
-	</notification>
-	<notification name="EjectAvatarFullnameNoBan">
-		Expulser [AVATAR_NAME] de votre terrain ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Expulser"/>
-	</notification>
-	<notification name="AcquireErrorTooManyObjects">
-		Erreur d&apos;acquisition : trop d&apos;objets sélectionnés.
-	</notification>
-	<notification name="AcquireErrorObjectSpan">
-		Erreur d&apos;acquisition : les objets sont répartis dans plus d&apos;une région.
-Veuillez mettre tous les objets que vous souhaitez acquérir dans la même région.
-	</notification>
-	<notification name="PromptGoToCurrencyPage">
-		[EXTRA]
-
-Aller sur [_URL] pour obtenir des informations sur l&apos;achat de L$ ?
-		<url name="url">
-			http://secondlife.com/app/currency/
-		</url>
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="UnableToLinkObjects">
-		Impossible de lier ces [COUNT] objets.
-Vous pouvez lier un maximum de [MAX] objets.
-	</notification>
-	<notification name="CannotLinkIncompleteSet">
-		Vous ne pouvez lier que des ensembles d&apos;objets complets et vous devez choisir un minimum de deux objets.
-	</notification>
-	<notification name="CannotLinkModify">
-		Impossible de lier car vous n&apos;avez pas le droit de modifier tous les objets.
-
-Assurez-vous que vous êtes le propriétaire de tous les objets et qu&apos;aucun d&apos;eux n&apos;est verrouillé.
-	</notification>
-	<notification name="CannotLinkDifferentOwners">
-		Impossible de lier car les objets n&apos;ont pas tous le même propriétaire.
-
-Assurez-vous que vous êtes le propriétaire de tous les objets sélectionnés.
-	</notification>
-	<notification name="NoFileExtension">
-		Pas d&apos;extension pour le fichier suivant : &apos;[FILE]&apos;
-
-Assurez-vous que le fichier a l&apos;extension correcte.
-	</notification>
-	<notification name="InvalidFileExtension">
-		Extension de fichier [EXTENSION] invalide
-[VALIDS] attendu
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="CannotUploadSoundFile">
-		Impossible de lire le fichier son chargé :
-[FILE]
-	</notification>
-	<notification name="SoundFileNotRIFF">
-		Il semble que le fichier ne soit pas un fichier RIFF WAVE :
-[FILE]
-	</notification>
-	<notification name="SoundFileNotPCM">
-		Il semble que le fichier ne soit pas un fichier audio PCM WAVE :
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidChannelCount">
-		Le fichier contient un nombre de canaux invalide (doit être mono ou stéréo) :
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidSampleRate">
-		Le fichier ne semble pas être pris en charge (doit être 44,1 k) :
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidWordSize">
-		Le fichier ne semble pas être pris en charge (doit faire 8 ou 16 bit) :
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidHeader">
-		Impossible de trouver les données dans l&apos;en-tête WAV :
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidTooLong">
-		Le fichier audio est trop long (10 secondes maximum) :
-[FILE]
-	</notification>
-	<notification name="ProblemWithFile">
-		Problème avec le fichier [FILE] :
-
-[ERROR]
-	</notification>
-	<notification name="CannotOpenTemporarySoundFile">
-		Impossible d&apos;ouvrir le fichier son compressé temporaire : [FILE]
-	</notification>
-	<notification name="UnknownVorbisEncodeFailure">
-		Échec d&apos;encodage Vorbis inconnu sur : [FILE]
-	</notification>
-	<notification name="CannotEncodeFile">
-		Impossible d&apos;encoder le fichier : [FILE]
-	</notification>
-	<notification name="CorruptResourceFile">
-		Fichier ressource corrompu : [FILE]
-	</notification>
-	<notification name="UnknownResourceFileVersion">
-		Version de fichier ressource Linden inconnu : [FILE]
-	</notification>
-	<notification name="UnableToCreateOutputFile">
-		Impossible de créer le fichier de sortie : [FILE]
-	</notification>
-	<notification name="DoNotSupportBulkAnimationUpload">
-		Actuellement, APP_NAME] ne prend pas en charge le chargement de lots de fichiers d&apos;animation.
-	</notification>
-	<notification name="CannotUploadReason">
-		Impossible de charger [FILE] suite au problème suivant : [REASON]
-Veuillez réessayer ultérieurement.
-	</notification>
-	<notification name="LandmarkCreated">
-		Vous avez ajouté &quot;[LANDMARK_NAME]&quot; à votre dossier [FOLDER_NAME].
-	</notification>
-	<notification name="CannotCreateLandmarkNotOwner">
-		Vous ne pouvez pas créer de repère ici car le propriétaire du terrain ne l&apos;autorise pas.
-	</notification>
-	<notification name="CannotRecompileSelectObjectsNoScripts">
-		Impossible d&apos;effectuer les recompilations.
-Sélectionnez un objet avec un script.
-	</notification>
-	<notification name="CannotRecompileSelectObjectsNoPermission">
-		Impossible d&apos;effectuer les recompilations.
-
-Sélectionnez des objets qui ont des scripts et que vous pouvez modifier.
-	</notification>
-	<notification name="CannotResetSelectObjectsNoScripts">
-		Impossible d&apos;effectuer la réinitialisation.
-
-Veuillez sélectionner des objets avec des scripts.
-	</notification>
-	<notification name="CannotResetSelectObjectsNoPermission">
-		Impossible d&apos;effectuer la réinitialisation.
-
-Sélectionnez des objets qui ont des scripts et que vous pouvez modifier.
-	</notification>
-	<notification name="CannotSetRunningSelectObjectsNoScripts">
-		Impossible de définir les scripts sur « exécution ».
-
-Veuillez sélectionner des objets avec des scripts.
-	</notification>
-	<notification name="CannotSetRunningNotSelectObjectsNoScripts">
-		Impossible de définir les scripts sur « non-exécution ».
-
-Veuillez sélectionner des objets avec des scripts.
-	</notification>
-	<notification name="NoFrontmostFloater">
-		Aucun floater frontmost à sauvegarder.
-	</notification>
-	<notification name="SeachFilteredOnShortWords">
-		Votre requête a été modifiée et les mots trops courts ont été supprimés.
-
-Recherche effectuée : [FINALQUERY]
-	</notification>
-	<notification name="SeachFilteredOnShortWordsEmpty">
-		Vos termes de recherche étaient trop courts et aucune recherche n&apos;a été effectuée.
-	</notification>
-	<notification name="CouldNotTeleportReason">
-		Impossible de téléporter.
-[REASON]
-	</notification>
-	<notification name="invalid_tport">
-		Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir vous téléporter.
-Si ce message persiste, veuillez consulter la page [SUPPORT_SITE].
-	</notification>
-	<notification name="invalid_region_handoff">
-		Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir traverser des régions.
-Si ce message persiste, veuillez consulter la page [SUPPORT_SITE].
-	</notification>
-	<notification name="blocked_tport">
-		Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment.
-Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis reconnectez-vous pour résoudre le problème.
-	</notification>
-	<notification name="nolandmark_tport">
-		Désolé, le système n&apos;a pas réussi à localiser la destination de votre repère.
-	</notification>
-	<notification name="timeout_tport">
-		Désolé, la connexion vers votre lieu de téléportation n&apos;a pas abouti.
-Veuillez réessayer dans un moment.
-	</notification>
-	<notification name="noaccess_tport">
-		Désolé, vous n&apos;avez pas accès à cette destination.
-	</notification>
-	<notification name="missing_attach_tport">
-		Vos pieces-jointes ne sont pas encore arrivées. Attendez quelques secondes de plus ou déconnectez-vous puis reconnectez-vous avant d&apos;essayer de vous téléporter.
-	</notification>
-	<notification name="too_many_uploads_tport">
-		Le trafic vers cette région est bouché en ce moment. Votre téléportation ne pourra pas avoir lieu immédiatement. Veuillez réessayer dans quelques minutes ou bien aller dans une zone moins fréquentée.
-	</notification>
-	<notification name="expired_tport">
-		Désolé, votre demande de téléportation n&apos;a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes.
-	</notification>
-	<notification name="expired_region_handoff">
-		Désolé, votre demande pour passer dans une autre région n&apos;a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes.
-	</notification>
-	<notification name="no_host">
-		Impossible de trouver la destination de la téléportation. Il est possible que cette destination soit temporairement indisponible ou qu&apos;elle n&apos;existe plus. Veuillez réessayer dans quelques minutes.
-	</notification>
-	<notification name="no_inventory_host">
-		L&apos;inventaire est temporairement indisponible.
-	</notification>
-	<notification name="CannotSetLandOwnerNothingSelected">
-		Impossible de définir le propriétaire foncier :
-aucune parcelle sélectionnée.
-	</notification>
-	<notification name="CannotSetLandOwnerMultipleRegions">
-		Impossible de définir un propriétaire car la sélection couvre plusieurs régions. Veuillez sélectionner une zone plus petite et réessayer.
-	</notification>
-	<notification name="ForceOwnerAuctionWarning">
-		Cette parcelle est mise aux enchères. Définir un propriétaire annulerait les enchères, ce qui pourrait être gênant pour certains résidents si ces dernières ont commencé. Souhaitez-vous définir un propriétaire ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="CannotContentifyNothingSelected">
-		Problème :
-Aucune parcelle sélectionnée.
-	</notification>
-	<notification name="CannotContentifyNoRegion">
-		Problème :
-Aucune région sélectionnée.
-	</notification>
-	<notification name="CannotReleaseLandNothingSelected">
-		Impossible d&apos;abandonner le terrain :
-aucune parcelle sélectionnée.
-	</notification>
-	<notification name="CannotReleaseLandNoRegion">
-		Impossible d&apos;abandonner le terrain :
-la région est introuvable.
-	</notification>
-	<notification name="CannotBuyLandNothingSelected">
-		Impossible d&apos;acheter le terrain :
-aucune parcelle sélectionnée.
-	</notification>
-	<notification name="CannotBuyLandNoRegion">
-		Impossible d&apos;acheter le terrain :
-la région dans laquelle il est situé est introuvable.
-	</notification>
-	<notification name="CannotCloseFloaterBuyLand">
-		Vous ne pouvez pas fermer la fenêtre Acheter le terrain avant que [APP_NAME] n&apos;estime le montant de cette transaction.
-	</notification>
-	<notification name="CannotDeedLandNothingSelected">
-		Cession du terrain impossible :
-aucune parcelle sélectionnée.
-	</notification>
-	<notification name="CannotDeedLandNoGroup">
-		Cession du terrain impossible :
-aucun groupe sélectionné.
-	</notification>
-	<notification name="CannotDeedLandNoRegion">
-		Cession du terrain impossible :
-la région dans laquelle il est situé est introuvable.
-	</notification>
-	<notification name="CannotDeedLandMultipleSelected">
-		Cession du terrain impossible :
-plusieurs parcelles sélectionnées.
-
-Essayez de ne sélectionner qu&apos;une seule parcelle.
-	</notification>
-	<notification name="ParcelCanPlayMedia">
-		Cette parcelle propose des flux média.
-Pour jouer des flux média, il faut avoir une connexion internet rapide.
-
-Jouer les flux média lorsqu&apos;ils sont disponibles ?
-(Vous pourrez modifier cette option ultérieurement sous Préférences &gt; Audio et vidéo.)
-		<usetemplate name="okcancelbuttons" notext="Désactiver" yestext="Jouer le média"/>
-	</notification>
-	<notification name="CannotDeedLandWaitingForServer">
-		Cession du terrain impossible :
-rapport de propriété sur le point d&apos;être envoyé par le serveur.
-
-Merci de réessayer.
-	</notification>
-	<notification name="CannotDeedLandNoTransfer">
-		Cession du terrain impossible :
-la cession de terrain est interdite dans la région [REGION].
-	</notification>
-	<notification name="CannotReleaseLandWatingForServer">
-		Impossible d&apos;abandonner le terrain :
-mise à jour des informations sur la parcelle sur le point d&apos;être envoyée par le serveur.
-
-Veuillez réessayer dans quelques secondes.
-	</notification>
-	<notification name="CannotReleaseLandSelected">
-		Impossible d&apos;abandonner le terrain :
-vous n&apos;êtes pas le propriétaire des parcelles sélectionnées.
-
-Veuillez sélectionner une seule parcelle.
-	</notification>
-	<notification name="CannotReleaseLandDontOwn">
-		Impossible d&apos;abandonner le terrain :
-vous n&apos;avez pas le droit de libérer cette parcelle.
-Les parcelles qui vous appartiennent sont en vert.
-	</notification>
-	<notification name="CannotReleaseLandRegionNotFound">
-		Impossible d&apos;abandonner le terrain :
-la région dans laquelle il est situé est introuvable.
-	</notification>
-	<notification name="CannotReleaseLandNoTransfer">
-		Impossible d&apos;abandonner le terrain :
-le transfert de terrain est interdit dans la région [REGION].
-	</notification>
-	<notification name="CannotReleaseLandPartialSelection">
-		Impossible d&apos;abandonner le terrain :
-vous devez sélectionner une parcelle entière pour la libérer.
-
-Sélectionnez toute la parcelle ou divisez-la d&apos;abord.
-	</notification>
-	<notification name="ReleaseLandWarning">
-		Vous vous apprêtez à libérer [AREA] m² de terrain.
-Si vous libérez cette parcelle, elle sera supprimée de votre patrimoine, mais vous ne recevrez pas de L$.
-
-Libérer ce terrain ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="CannotDivideLandNothingSelected">
-		Division du terrain impossible :
-
-aucune parcelle sélectionnée.
-	</notification>
-	<notification name="CannotDivideLandPartialSelection">
-		Division du terrain impossible :
-
-Toute la parcelle est sélectionnée.
-Sélectionnez une partie de la parcelle uniquement.
-	</notification>
-	<notification name="LandDivideWarning">
-		Si vous divisez ce terrain, cette parcelle sera partagée en deux et chaque parcelle pourra avoir ses propres paramètres. Après cette opération, certains paramètres reviendront aux paramètres par défaut.
-
-Diviser le terrain ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="CannotDivideLandNoRegion">
-		Division du terrain impossible :
-la région dans laquelle il est situé est introuvable.
-	</notification>
-	<notification name="CannotJoinLandNoRegion">
-		Impossible de fusionner le terrain :
-la région dans laquelle il est situé est introuvable.
-	</notification>
-	<notification name="CannotJoinLandNothingSelected">
-		Impossible de fusionner le terrain :
-aucune parcelle sélectionnée.
-	</notification>
-	<notification name="CannotJoinLandEntireParcelSelected">
-		Impossible de fusionner le terrain :
-vous avez sélectionné une seule parcelle.
-
-Sélectionnez le terrain sur les deux parcelles.
-	</notification>
-	<notification name="CannotJoinLandSelection">
-		Impossible de fusionner le terrain :
-vous devez sélectionner au moins deux parcelles.
-
-Sélectionnez le terrain sur les deux parcelles.
-	</notification>
-	<notification name="JoinLandWarning">
-		En fusionnant ce terrain, vous créerez une grande parcelle composée de toutes les parcelles se trouvant dans le rectangle sélectionné.
-Vous devrez réinitialiser le nom et les options de la nouvelle parcelle.
-
-Fusionner le terrain ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmNotecardSave">
-		Cette note doit être sauvegardée avant que l&apos;objet ne puisse être copié ou visualisé. Enregistrer la note ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmItemCopy">
-		Copier cet objet dans votre inventaire ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Copier"/>
-	</notification>
-	<notification name="ResolutionSwitchFail">
-		Échec du changement de résolution (à [RESX], de [RESY])
-	</notification>
-	<notification name="ErrorUndefinedGrasses">
-		Erreur : herbes non identifiées : [SPECIES]
-	</notification>
-	<notification name="ErrorUndefinedTrees">
-		Erreur : arbres non identifiés : [SPECIES]
-	</notification>
-	<notification name="CannotSaveWearableOutOfSpace">
-		Impossible de sauvegarder [NAME]. Pour pouvoir sauvegarder ce fichier, vous devez d&apos;abord libérer de la mémoire sur votre ordinateur.
-	</notification>
-	<notification name="CannotSaveToAssetStore">
-		Impossible de sauvegarder le fichier [NAME] dans la base de données centrale.
-Cette erreur est généralement temporaire. Veuillez éditer et sauvegarder l&apos;élément endossable à nouveau d&apos;ici quelques minutes.
-	</notification>
-	<notification name="YouHaveBeenLoggedOut">
-		Vous avez été déconnecté(e) de [SECOND_LIFE] :
-            [MESSAGE]
-Vous pouvez afficher vos messages instantanés et votre chat en cliquant sur Afficher IM et chat. Sinon, cliquez sur Quitter pour quitter immédiatement [APP_NAME].
-		<usetemplate name="okcancelbuttons" notext="Quitter" yestext="Afficher IM et chat"/>
-	</notification>
-	<notification name="OnlyOfficerCanBuyLand">
-		Impossible d&apos;acheter du terrain pour le groupe :
-Vous n&apos;avez pas le droit d&apos;acheter de terrain pour votre groupe.
-	</notification>
-	<notification label="Devenir amis" name="AddFriend">
-		Vous pouvez suivre les déplacements de vos amis sur la carte et voir lorsqu&apos;ils se connectent.
-
-Proposer à [NAME] de devenir votre ami(e) ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification label="Devenir amis" name="AddFriendWithMessage">
-		Vous pouvez suivre les déplacements de vos amis sur la carte et voir lorsqu&apos;ils se connectent.
-
-Proposer à [NAME] de devenir votre ami(e) ?
-		<form name="form">
-			<input name="message">
-				Voulez-vous être mon ami(e) ?
-			</input>
-			<button name="Offer" text="OK"/>
-			<button name="Cancel" text="Annuler"/>
-		</form>
-	</notification>
-	<notification name="RemoveFromFriends">
-		Voulez-vous supprimer [FIRST_NAME] [LAST_NAME] de votre liste d&apos;amis ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="RemoveMultipleFromFriends">
-		Voulez-vous supprimer plusieurs résidents de votre liste d&apos;amis ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="GodDeleteAllScriptedPublicObjectsByUser">
-		Êtes-vous certain de vouloir supprimer tous les objets scriptés appartenant à ** [AVATAR_NAME] ** sur tous les terrains des autres résidents dans cette région ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="GodDeleteAllScriptedObjectsByUser">
-		Êtes-vous certain de vouloir supprimer tous les objets scriptés appartenant à ** [AVATAR_NAME] ** sur tous les terrains de cette région ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="GodDeleteAllObjectsByUser">
-		Êtes-vous certain de vouloir supprimer tous les objets (scriptés ou pas) appartenant à ** [AVATAR_NAME] ** sur tous les terrains de cette région ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="BlankClassifiedName">
-		Vous devez choisir un nom pour votre petite annonce.
-	</notification>
-	<notification name="MinClassifiedPrice">
-		Le coût de l&apos;annonce doit être de [MIN_PRICE] L$ minimum.
-
-Veuillez saisir un montant plus élevé.
-	</notification>
-	<notification name="ConfirmObjectDeleteLock">
-		Au moins un des objets que vous avez sélectionnés est verrouillé.
-
-Êtes-vous certain de vouloir supprimer ces objets ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteNoCopy">
-		Au moins un des objets que vous avez sélectionnés n&apos;est pas copiable.
-
-Êtes-vous certain de vouloir supprimer ces objets ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteNoOwn">
-		Au moins un des objets que vous avez sélectionnés ne vous appartient pas.
-
-Êtes-vous certain de vouloir supprimer ces objets ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteLockNoCopy">
-		Au moins un des objets est verrouillé.
-Au moins un des objets n&apos;est pas copiable.
-
-Êtes-vous certain de vouloir supprimer ces objets ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteLockNoOwn">
-		Au moins un des objets est verrouillé.
-Au moins un des objets ne vous appartient pas.
-
-Êtes-vous certain de vouloir supprimer ces objets ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteNoCopyNoOwn">
-		Au moins un des objets n&apos;est pas copiable.
-Au moins un des objets ne vous appartient pas.
-
-Êtes-vous certain de vouloir supprimer ces objets ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
-		Au moins un des objets est verrouillé.
-Au moins un des objets n&apos;est pas copiable.
-Au moins un des objets ne vous appartient pas.
-
-Êtes-vous certain de vouloir supprimer ces objets ?
-		<usetemplate name="okcancelbuttons" notext="annuler" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectTakeLock">
-		Au moins un des objets est verrouillé.
-
-Êtes-vous certain de vouloir prendre ces objets ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectTakeNoOwn">
-		Vous n&apos;êtes pas le propriétaire de tous les objets que vous prenez.
-Si vous continuez, les droits accordés au prochain propriétaire seront activés et vous risquez de ne plus pouvoir modifier ou copier les objets.
-
-Êtes-vous certain de vouloir prendre ces objets ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectTakeLockNoOwn">
-		Au moins un des objets est verrouillé.
-Vous n&apos;êtes pas le propriétaire de tous les objets que vous prenez.
-Si vous continuez, les droits accordés au prochain propriétaire seront activés et vous risquez de ne plus pouvoir modifier ou copier les objets.
-Par contre, vous pouvez prendre les objets sélectionnés.
-
-Êtes-vous certain de vouloir prendre ces objets ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="CantBuyLandAcrossMultipleRegions">
-		Impossible d&apos;acheter le terrain car la sélection couvre plusieurs régions.
-
-Veuillez sélectionner une zone plus petite et réessayer.
-	</notification>
-	<notification name="DeedLandToGroup">
-		Si vous cédez ce terrain, le groupe devra avoir les moyens de le prendre en charge.
-Le prix de la vente du terrain n&apos;est pas remboursé par le propriétaire. Si la parcelle que vous cédez se vend, le prix de la vente sera divisé en parts égales parmi les membres du groupe.
-
-Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="DeedLandToGroupWithContribution">
-		Si vous cédez ce terrain, le groupe devra avoir les moyens de le prendre en charge.
-La cession incluera une contribution de terrain simultanée au groupe de [FIRST_NAME] [LAST_NAME].
-Le prix de la vente du terrain n&apos;est pas remboursé par le propriétaire. Si la parcelle que vous cédez se vend, le prix de la vente sera divisé en parts égales parmi les membres du groupe.
-
-Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="DisplaySetToSafe">
-		Les paramètres d&apos;affichage sont au niveau le plus sûr, comme vous l&apos;aviez indiqué.
-	</notification>
-	<notification name="DisplaySetToRecommended">
-		Vos paramètres d&apos;affichage ont été réglés avec une marge de sécurité en fonction de votre configuration système.
-	</notification>
-	<notification name="ErrorMessage">
-		[ERROR_MESSAGE]
-	</notification>
-	<notification name="AvatarMovedDesired">
-		La destination que vous avez choisie n&apos;est pas disponible actuellement.
-Vous avez été téléporté vers une région voisine.
-	</notification>
-	<notification name="AvatarMovedLast">
-		Votre dernière destination n&apos;est pas disponible actuellement.
-Vous avez été téléporté vers une région voisine.
-	</notification>
-	<notification name="AvatarMovedHome">
-		La destination que vous avez choisie n&apos;est pas disponible actuellement.
-Vous avez été téléporté vers une région voisine.
-Nous vous conseillons de définir votre domicile ailleurs.
-	</notification>
-	<notification name="ClothingLoading">
-		Vos vêtements sont en cours de téléchargement.
-Vous pouvez utiliser [SECOND_LIFE] normalement, les autres résidents vous voient correctement.
-		<form name="form">
-			<ignore name="ignore" text="Vos habits prennent du temps à télécharger"/>
-		</form>
-	</notification>
-	<notification name="FirstRun">
-		L&apos;installation de [APP_NAME] est terminée.
-
-S&apos;il s&apos;agit de la première fois que vous utilisez [SECOND_LIFE], vous devrez créer un compte avant de pouvoir vous connecter.
-Retourner sur www.secondlife.com pour créer un nouveau compte ?
-		<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Nouveau compte..."/>
-	</notification>
-	<notification name="LoginPacketNeverReceived">
-		Nous avons des difficultés à vous connecter. Il y a peut-être un problème avec votre connexion Internet ou la [SECOND_LIFE_GRID].
-
-Vérifiez votre connextion Internet et réessayez dans quelques minutes, cliquez sur Aide pour consulter la page [SUPPORT_SITE] ou bien sur Téléporter pour essayer d&apos;aller chez vous.
-		<url name="url">
-			http://secondlife.com/support/
-		</url>
-		<form name="form">
-			<button name="OK" text="OK"/>
-			<button name="Help" text="Aide"/>
-			<button name="Teleport" text="Téléporter"/>
-		</form>
-	</notification>
-	<notification name="WelcomeChooseSex">
-		Votre personnage va apparaître dans un moment.
-
-Pour marcher, utilisez les flèches de direction.
-Appuyez sur F1 pour obtenir de l&apos;aide ou en savoir plus sur [SECOND_LIFE].
-Choisissez un avatar homme ou femme.
-Vous pourrez revenir sur votre décision plus tard.
-		<usetemplate name="okcancelbuttons" notext="Femme" yestext="Homme"/>
-	</notification>
-	<notification name="NotEnoughCurrency">
-		[NAME] [PRICE] L$ Vous n&apos;avez pas suffisamment de L$ pour faire cela.
-	</notification>
-	<notification name="GrantedModifyRights">
-		[FIRST_NAME] [LAST_NAME] vous avez donné la permission de modifier ses objets.
-	</notification>
-	<notification name="RevokedModifyRights">
-		Vous n&apos;avez plus le droit de modifier les objets de [FIRST_NAME] [LAST_NAME].
-	</notification>
-	<notification name="FlushMapVisibilityCaches">
-		Cela videra le cache cartographique de cette région.
-Cela n&apos;est vraiment utile que pour faire du débugage.
-(En production, attendez 5 minutes. Les cartes seront mises à jour après reconnexion.)
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="BuyOneObjectOnly">
-		Impossible d&apos;acheter plus d&apos;un objet à  la fois.  Veuillez ne sélectionner qu&apos;un seul objet.
-	</notification>
-	<notification name="OnlyCopyContentsOfSingleItem">
-		Impossible de copier les contenus de plus d&apos;un objet à la fois.
-Veuillez ne sélectionner qu&apos;un seul objet.
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="KickUsersFromRegion">
-		Téléporter tous les résidents de cette région chez eux ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="EstateObjectReturn">
-		Etes-vous certain de vouloir renvoyer les objets appartenant à [USER_NAME] ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="InvalidTerrainBitDepth">
-		Impossible de definir les textures de la région :
-La texture du terrain [TEXTURE_NUM] a une profondeur invalide ([TEXTURE_BIT_DEPTH]).
-
-Remplacer la texture [TEXTURE_NUM] avec une image de 24 bits, 512 X 512, ou plus petite, puis cliquez à nouveau sur Appliquer.
-	</notification>
-	<notification name="InvalidTerrainSize">
-		Impossible de definir les textures de la région :
-La texture du terrain [TEXTURE_NUM] est trop volumineuse ([TEXTURE_SIZE_X] X [TEXTURE_SIZE_Y]).
-
-Remplacer la texture [TEXTURE_NUM] avec une image de 24 bits, 512 X 512, ou plus petite, puis cliquez à nouveau sur Appliquer.
-	</notification>
-	<notification name="RawUploadStarted">
-		Le chargement a commencé. Cela va prendre une à deux minutes,
-suivant votre vitesse de connexion.
-	</notification>
-	<notification name="ConfirmBakeTerrain">
-		Etes-vous sûr(e) de vouloir figer le relief actuel, en faire le point central des limites d&apos;élévation/abaissement de relief et la valeur par défaut du bouton Annuler modification ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="MaxAllowedAgentOnRegion">
-		Vous ne pouvez pas autoriser plus de [MAX_AGENTS] résidents.
-	</notification>
-	<notification name="MaxBannedAgentsOnRegion">
-		Vous ne pouvez pas bannir plus de [MAX_BANNED] résidents.
-	</notification>
-	<notification name="MaxAgentOnRegionBatch">
-		Echec lors de la tentative d&apos;ajout de [NUM_ADDED] agents :
-Dépasse la limite fixée à [MAX_AGENTS] [LIST_TYPE] de [NUM_EXCESS].
-	</notification>
-	<notification name="MaxAllowedGroupsOnRegion">
-		Vous ne pouvez pas avoir plus que [MAX_GROUPS] groupes autorisés.
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Figer"/>
-	</notification>
-	<notification name="MaxManagersOnRegion">
-		Vous ne pouvez avoir que [MAX_MANAGER] gérants de domaine.
-	</notification>
-	<notification name="OwnerCanNotBeDenied">
-		Impossible d&apos;ajouter le propriétaire du domaine à la liste des résidents bannis.
-	</notification>
-	<notification name="CanNotChangeAppearanceUntilLoaded">
-		Impossible de changer d&apos;apparence jusqu&apos;à ce que les habits et la silhouette soient chargés.
-	</notification>
-	<notification name="ClassifiedMustBeAlphanumeric">
-		Le nom de votre petite annonce doit commencer par un chiffre ou une lettre (A à Z). La ponctuation n&apos;est pas autorisée.
-	</notification>
-	<notification name="CantSetBuyObject">
-		Cet objet n&apos;est pas à vendre.
-Veuillez choisir un objet à vendre et réessayer.
-	</notification>
-	<notification name="FinishedRawDownload">
-		Chargement du fichier de terrain raw effectué vers :
-[DOWNLOAD_PATH].
-	</notification>
-	<notification name="DownloadWindowsMandatory">
-		Une nouvelle version de [APP_NAME] est disponible.
-[MESSAGE]
-Pour utiliser [APP_NAME] vous devez télécharger cette mise à jour.
-		<usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/>
-	</notification>
-	<notification name="DownloadWindows">
-		Une mise à jour de [APP_NAME] est disponible.
-[MESSAGE]
-Cette mise à jour n&apos;est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l&apos;installer.
-		<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/>
-	</notification>
-	<notification name="DownloadWindowsReleaseForDownload">
-		Une mise à jour de [APP_NAME] est disponible.
-[MESSAGE]
-Cette mise à jour n&apos;est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l&apos;installer.
-		<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/>
-	</notification>
-	<notification name="DownloadLinuxMandatory">
-		Une nouvelle version de [APP_NAME] est disponible.
-[MESSAGE]
-Pour utiliser [APP_NAME] vous devez télécharger cette mise à jour.
-		<usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/>
-	</notification>
-	<notification name="DownloadLinux">
-		Une mise à jour de [SECOND_LIFE] est disponible.
-[MESSAGE]
-Cette mise à jour n&apos;est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l&apos;installer.
-		<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/>
-	</notification>
-	<notification name="DownloadLinuxReleaseForDownload">
-		Une mise à jour de [SECOND_LIFE] est disponible.
-[MESSAGE]
-Cette mise à jour n&apos;est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l&apos;installer.
-		<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/>
-	</notification>
-	<notification name="DownloadMacMandatory">
-		Une nouvelle version de [APP_NAME] est disponible.
-[MESSAGE]
-Pour utiliser [APP_NAME] vous devez télécharger cette mise à jour.
-
-Télécharger vers le dossier Applications ?
-		<usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/>
-	</notification>
-	<notification name="DownloadMac">
-		Une mise à jour de [APP_NAME] est disponible.
-[MESSAGE]
-Cette mise à jour n&apos;est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l&apos;installer.
-
-Télécharger vers le dossier Applications ?
-		<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/>
-	</notification>
-	<notification name="DownloadMacReleaseForDownload">
-		Une mise à jour de [APP_NAME] est disponible.
-[MESSAGE]
-Cette mise à jour n&apos;est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l&apos;installer.
-
-Télécharger vers le dossier Applications ?
-		<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/>
-	</notification>
-	<notification name="DeedObjectToGroup">
-		Si vous cédez cet objet, le groupe :
-* recevra les L$ versés pour l&apos;objet ;
-		<usetemplate ignoretext="Confimer avant que je ne cède un objet à un groupe" name="okcancelignore" notext="Annuler" yestext="Céder"/>
-	</notification>
-	<notification name="WebLaunchExternalTarget">
-		Voulez-vous ouvrir votre navigateur web système pour afficher ce contenu ?
-		<usetemplate ignoretext="Ouvrir mon navigateur pour consulter une page web" name="okcancelignore" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchJoinNow">
-		Aller sur secondlife.com pour gérer votre compte ?
-		<usetemplate ignoretext="Lancer mon navigateur pour gérer mon compte" name="okcancelignore" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchSecurityIssues">
-		Pour apprendre à signaler un problème de sécurité, consultez le Wiki de [SECOND_LIFE].
-		<usetemplate ignoretext="Lancer mon navigateur pour apprendre comment signaler un problème de sécurité" name="okcancelignore" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchQAWiki">
-		Consultez le Wiki sur l&apos;Assurance Qualité de [SECOND_LIFE].
-		<usetemplate ignoretext="Lancer mon navigateur web pour consulter la page Wiki sur l&apos;Assurance Qualité." name="okcancelignore" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchPublicIssue">
-		Pour signaler des bugs et autres problèmes, utilisez le JIRA de [SECOND_LIFE].
-		<usetemplate ignoretext="Lancer mon navigateur pour utiliser le Public Issue Tracker (JIRA)" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/>
-	</notification>
-	<notification name="WebLaunchSupportWiki">
-		Visitez le blog officiel des Lindens pour les dernières nouvelles et informations.
-		<usetemplate ignoretext="Lancer mon navigateur web pour consulter le blog" name="okcancelignore" notext="Annuler" yestext="Aller à la page"/>
-	</notification>
-	<notification name="WebLaunchLSLGuide">
-		Voulez-vous ouvrir le guide pour l&apos;écriture de scripts ?
-		<usetemplate ignoretext="Lancer mon navigateur web pour consulter le guide pour l&apos;écriture de scripts" name="okcancelignore" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchLSLWiki">
-		Voulez-vous ouvrir le portail LSL pour l&apos;écriture de scripts ?
-		<usetemplate ignoretext="Lancer mon navigateur web pour consulter le portail LSL" name="okcancelignore" notext="Annuler" yestext="Aller à la page"/>
-	</notification>
-	<notification name="ReturnToOwner">
-		Êtes-vous certain de vouloir renvoyer les objets sélectionnés à leur propriétaire ? Les objets donnés transférables seront renvoyés à leur ancien propriétaire.
-
-*Avertissement* Les objets non transférables seront supprimés !
-		<usetemplate ignoretext="Confirmer avant de rendre les objets à leurs propriétaires" name="okcancelignore" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="GroupLeaveConfirmMember">
-		Vous êtes actuellement membre du groupe [GROUP].
-Quitter le groupe ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmKick">
-		Souhaitez-vous vraiment éjecter tous les utilisateurs de la grille ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Éjecter tous"/>
-	</notification>
-	<notification name="MuteLinden">
-		Désolé, vous ne pouvez pas ignorer un Linden.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="CannotStartAuctionAlreadyForSale">
-		Vous ne pouvez pas démarrer des enchères sur une parcelle déjà en vente.  Si vous êtes certain de vouloir démarrer des enchères, mettez fin à la vente.
-	</notification>
-	<notification label="Échec de la fonction Ignorer les objets par nom" name="MuteByNameFailed">
-		Vous ignorez déjà ce résident.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="RemoveItemWarn">
-		Si vous supprimez des contenus, vous risquez d&apos;endommager l&apos;objet. Souhaitez-vous supprimer cet objet ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="CantOfferCallingCard">
-		Impossible d&apos;offrir une carte de visite actuellement. Veuillez réessayer dans un moment.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="CantOfferFriendship">
-		Impossible de proposer votre amitié actuellement. Veuillez réessayer dans un moment.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="BusyModeSet">
-		Le mode Occupé est sélectionné.
-Les chats et les messages instantanés ne s&apos;afficheront pas. Les messages instantanés génèreront la réponse en mode occupé que vous avez créée. Toutes les offres de téléportation seront refusées. Toutes les offres d&apos;inventaire iront dans la corbeille.
-		<usetemplate ignoretext="Je change mon statut en mode Occupé" name="okignore" yestext="OK"/>
-	</notification>
-	<notification name="JoinedTooManyGroupsMember">
-		Vous avez atteint le nombre de groupes maximum. Avant de pouvoir rejoindre ce groupe, vous devez en quitter un ou refuser cette offre.
-[NAME] vous invite à rejoindre un groupe.
-[INVITE]
-		<usetemplate name="okcancelbuttons" notext="Refuser" yestext="Rejoindre"/>
-	</notification>
-	<notification name="KickUser">
-		Éjecter cet utilisateur avec quel message ?
-		<form name="form">
-			<input name="message">
-				Un administrateur vous a déconnecté.
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Annuler"/>
-		</form>
-	</notification>
-	<notification name="KickAllUsers">
-		Éjecter tous les résidents actuellement en ligne avec quel message ?
-		<form name="form">
-			<input name="message">
-				Un administrateur vous a déconnecté.
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Annuler"/>
-		</form>
-	</notification>
-	<notification name="FreezeUser">
-		Geler cet utilisateur avec quel message ?
-		<form name="form">
-			<input name="message">
-				Vous avez été gelé. Vous ne pouvez ni bouger ni chatter. Un administrateur va vous envoyer un message instantané (IM).
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Annuler"/>
-		</form>
-	</notification>
-	<notification name="UnFreezeUser">
-		Dégeler cet utilisateur avec quel message ?
-		<form name="form">
-			<input name="message">
-				Vous n&apos;êtes plus gelé.
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Annuler"/>
-		</form>
-	</notification>
-	<notification name="OfferTeleport">
-		Proposez une téléportation avec le message suivant ?
-		<form name="form">
-			<input name="message">
-				On se rejoint à [REGION] ?
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Annuler"/>
-		</form>
-	</notification>
-	<notification name="OfferTeleportFromGod">
-		Demander au résident de venir vous rejoindre ?
-		<form name="form">
-			<input name="message">
-				On se rejoint à [REGION] ?
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Annuler"/>
-		</form>
-	</notification>
-	<notification name="TeleportFromLandmark">
-		Êtes-vous certain de vouloir être téléporté ?
-		<usetemplate ignoretext="Confirmer que je veux me téléporter à un repère" name="okcancelignore" notext="Annuler" yestext="Téléporter"/>
-	</notification>
-	<notification name="TeleportToPick">
-		Téléporter vers [PICK] ?
-		<usetemplate ignoretext="Confirmer que je veux me téléporter à un endroit dans mes Préférences" name="okcancelignore" notext="Annuler" yestext="Téléporter"/>
-	</notification>
-	<notification label="Envoyer un message à tout le monde dans votre domaine" name="MessageEstate">
-		Saisissez un message court qui sera envoyé à tous les résidents se trouvant actuellement sur votre domaine.
-		<form name="form">
-			<input name="message"/>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Annuler"/>
-		</form>
-	</notification>
-	<notification label="Modifier un domaine Linden" name="ChangeLindenEstate">
-		Vous vous apprêtez à modifier un domaine appartenant aux Lindens (continent, zone réservée aux ados, orientation etc.).
-
-Cela est extrêmement délicat car l&apos;expérience des résidents est en jeu. Sur le continent, cela modifiera des milliers de régions et sera difficile à digérer pour le serveur.
-
-Continuer ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification label="Modifier l&apos;accès à un domaine Linden" name="ChangeLindenAccess">
-		Vous vous apprêtez à modifier la liste d&apos;accès à un domaine appartenant aux Linden (continent, zone réservée aux ados, orientation etc.).
-
-Cette action est délicate et ne doit être effectuée que pour appeler le hack autorisant des objets/L$ à être transférés à l&apos;intérieur/extérieur de la grille.
-Cette action modifiera des milliers de régions et sera difficile à digérer pour le serveur.
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification label="Choisir le domaine" name="EstateAllowedAgentAdd">
-		Ajouter à la liste des résidents autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ?
-		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
-	</notification>
-	<notification label="Choisir le domaine" name="EstateAllowedAgentRemove">
-		Supprimer de la liste des résidents autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ?
-		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
-	</notification>
-	<notification label="Choisir le domaine" name="EstateAllowedGroupAdd">
-		Ajouter à la liste des groupes autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ?
-		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
-	</notification>
-	<notification label="Choisir le domaine" name="EstateAllowedGroupRemove">
-		Supprimer de la liste des groupes autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ?
-		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
-	</notification>
-	<notification label="Choisir le domaine" name="EstateBannedAgentAdd">
-		Refuser l&apos;accès à ce domaine uniquement ou à [ALL_ESTATES] ?
-		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
-	</notification>
-	<notification label="Choisir le domaine" name="EstateBannedAgentRemove">
-		Supprimer ce résident de la liste des résidents bannis pour ce domaine uniquement ou pour [ALL_ESTATES] ?
-		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
-	</notification>
-	<notification label="Choisir le domaine" name="EstateManagerAdd">
-		Ajouter un gérant de domaine pour ce domaine uniquement ou pour [ALL_ESTATES] ?
-		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
-	</notification>
-	<notification label="Choisir le domaine" name="EstateManagerRemove">
-		Supprimer le gérant de domaine pour ce domaine uniquement ou pour [ALL_ESTATES] ?
-		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
-	</notification>
-	<notification label="Confirmer" name="EstateKickUser">
-		Éjecter [EVIL_USER] de ce domaine ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="EstateChangeCovenant">
-		Êtes-vous certain de vouloir modifier le règlement du domaine ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="RegionEntryAccessBlocked">
-		Votre catégorie d&apos;accès ne vous autorise pas à pénétrer dans cette région. Cela vient peut-être du fait qu&apos;il manquait des informations pour valider votre âge.
-
-Vérifiez que vous avez la toute dernière version du client et consultez les pages d&apos;aide pour savoir comment accéder aux zones ayant ce niveau d&apos;accès.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="RegionEntryAccessBlocked_KB">
-		Votre catégorie d&apos;accès ne vous permet pas de pénétrer dans cette région.
-
-Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
-		<url name="url">
-			http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB)
-		</url>
-		<usetemplate ignoretext="Je ne peux pas pénétrer dans cette région car je n&apos;ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
-	</notification>
-	<notification name="RegionEntryAccessBlocked_Notify">
-		Votre catégorie d&apos;accès ne vous permet pas de pénétrer dans cette région.
-	</notification>
-	<notification name="RegionEntryAccessBlocked_Change">
-		Votre catégorie d&apos;accès ne vous permet pas de pénétrer dans cette région.
-
-En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d&apos;accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Édition &gt; Préférences... &gt; Général.
-		<form name="form">
-			<button name="OK" text="Modifier les Préférences"/>
-			<button default="true" name="Cancel" text="Fermer"/>
-			<ignore name="ignore" text="La catégorie de contenu que j&apos;ai choisie m&apos;empêche de pénétrer dans une région"/>
-		</form>
-	</notification>
-	<notification name="LandClaimAccessBlocked">
-		Votre catégorie d&apos;accès ne vous permet pas de réclamer cette région. Cela vient peut-être du fait qu&apos;il manquait des informations pour valider votre âge.
-
-Vérifiez que vous avez la toute dernière version du client et consultez les pages d&apos;aide pour savoir comment accéder aux zones ayant ce niveau d&apos;accès.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="LandClaimAccessBlocked_KB">
-		Votre catégorie d&apos;accès ne vous permet pas de réclamer cette région.
-
-Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
-		<url name="url">
-			http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB)
-		</url>
-		<usetemplate ignoretext="Je ne peux pas réclamer cette région car je n&apos;ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
-	</notification>
-	<notification name="LandClaimAccessBlocked_Notify">
-		Votre catégorie d&apos;accès ne vous autorise pas à réclamer cette région.
-	</notification>
-	<notification name="LandClaimAccessBlocked_Change">
-		Votre catégorie d&apos;accès ne vous permet pas de réclamer cette région.
-
-En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d&apos;accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Édition &gt; Préférences... &gt; Général.
-		<usetemplate ignoretext="La catégorie de contenu que j&apos;ai choisie m&apos;empêche de réclamer un terrain" name="okcancelignore" notext="Fermer" yestext="Modifier les Préférences"/>
-	</notification>
-	<notification name="LandBuyAccessBlocked">
-		Votre catégorie d&apos;accès ne vous permet pas d&apos;acheter cette région. Cela vient peut-être du fait qu&apos;il manquait des informations pour valider votre âge.
-
-Vérifiez que vous avez la toute dernière version du client et consultez les pages d&apos;aide pour savoir comment accéder aux zones ayant ce niveau d&apos;accès.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="LandBuyAccessBlocked_KB">
-		Votre catégorie d&apos;accès ne vous permet pas d&apos;acheter cette région.
-
-Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
-		<url name="url">
-			http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB)
-		</url>
-		<usetemplate ignoretext="Je ne peux pas acheter ce terrain car je n&apos;ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
-	</notification>
-	<notification name="LandBuyAccessBlocked_Notify">
-		Votre catégorie d&apos;accès ne vous permet pas d&apos;acheter cette région.
-	</notification>
-	<notification name="LandBuyAccessBlocked_Change">
-		Votre catégorie d&apos;accès ne vous autorise pas à acheter cette région.
-
-En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d&apos;accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Édition &gt; Préférences... &gt; Général.
-		<usetemplate ignoretext="La catégorie de contenu que j&apos;ai choisie m&apos;empêche d&apos;acheter un terrain" name="okcancelignore" notext="Fermer" yestext="Modifier les Préférences"/>
-	</notification>
-	<notification name="TooManyPrimsSelected">
-		&quot;Vous avez sélectionné trop de prims. Veuillez sélectionner au maximum [MAX_PRIM_COUNT] prims et réessayer.&quot;
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="ProblemImportingEstateCovenant">
-		Problème lors de l&apos;importation du règlement du domaine.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="ProblemAddingEstateManager">
-		Problèmes lors de l&apos;ajout d&apos;un nouveau gérant de domaine. Il est possible qu&apos;au moins un des domaines ait une liste de gérants complète.
-	</notification>
-	<notification name="ProblemAddingEstateGeneric">
-		Problème lors de l&apos;ajout à la liste de ce domaine. Il est possible qu&apos;au moins un des domaines ait une liste complète.
-	</notification>
-	<notification name="UnableToLoadNotecardAsset">
-		Impossible de charger les données de la note actuellement.
-	</notification>
-	<notification name="NotAllowedToViewNotecard">
-		Permissions pour afficher la note insuffisantes.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="MissingNotecardAssetID">
-		Les références de la note ne se trouvent pas dans la base de données.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="PublishClassified">
-		Rappel : les frais pour passer des petites annonces ne sont pas remboursables.
-
-Publier cette petite annonce maintenant pour [AMOUNT] L$ ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="SetClassifiedMature">
-		Cette petite annonce contient-elle du contenu Mature ?
-		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Non" yestext="Oui"/>
-	</notification>
-	<notification name="SetGroupMature">
-		Ce groupe contient-il du contenu Mature ?
-		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Non" yestext="Oui"/>
-	</notification>
-	<notification label="Confirmer le redémarrage" name="ConfirmRestart">
-		Souhaitez-vous vraiment redémarrer cette région dans 2 minutes ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification label="Envoyer un message à la région" name="MessageRegion">
-		Saisissez une message qui sera envoyé à tous les résidents présents dans cette région.
-		<form name="form">
-			<input name="message"/>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Annuler"/>
-		</form>
-	</notification>
-	<notification label="Catégorie de la région modifiée" name="RegionMaturityChange">
-		La catégorie d&apos;accès de cette région a été mise à jour.
-Ce changement n&apos;apparaîtra pas immédiatement sur la carte.
-	</notification>
-	<notification label="Versions de voix non compatibles" name="VoiceVersionMismatch">
-		Cette version de [APP_NAME] n&apos;est pas compatible avec la fonctionnalité de chat vocal dans cette région. Vous devez mettre à jour [APP_NAME] pour que le chat vocal fonctionne correctement.
-	</notification>
-	<notification label="Impossible d&apos;acheter des objets" name="BuyObjectOneOwner">
-		Impossible d&apos;acheter simultanément des objets de propriétaires différents.
-Veuillez ne sélectionner qu&apos;un seul objet.
-	</notification>
-	<notification label="Impossible d&apos;acheter des contenus" name="BuyContentsOneOnly">
-		Impossible d&apos;acheter les contenus de plus d&apos;un objet à la fois.
-Veuillez ne sélectionner qu&apos;un seul objet.
-	</notification>
-	<notification label="Impossible d&apos;acheter des contenus" name="BuyContentsOneOwner">
-		Impossible d&apos;acheter simultanément des objets de propriétaires différents.
-Veuillez ne sélectionner qu&apos;un seul objet.
-	</notification>
-	<notification name="BuyOriginal">
-		Acheter l&apos;objet original pour [PRICE] L$ à [PRICE] ?
-Vous deviendrez le propriétaire de cet objet.
-Vous pourrez :
- Modifier : [MODIFYPERM]
- Copier : [COPYPERM]
- Revendre ou donner : [RESELLPERM]
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="BuyOriginalNoOwner">
-		Acheter l&apos;objet original pour [PRICE] L$ ?
-Vous deviendrez le propriétaire de cet objet.
-Vous pourrez :
- Modifier : [MODIFYPERM]
- Copier : [COPYPERM]
- Revendre ou donner : [RESELLPERM]
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="BuyCopy">
-		Acheter une copie pour [PRICE] L$ à [OWNER] ?
-L&apos;objet sera copié dans votre inventaire.
-Vous pourrez :
- Modifier : [MODIFYPERM]
- Copier : [COPYPERM]
- Revendre ou donner : [RESELLPERM]
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="BuyCopyNoOwner">
-		Acheter une copie pour [PRICE] L$ ?
-L&apos;objet sera copié dans votre inventaire.
-Vous pourrez :
- Modifier : [MODIFYPERM]
- Copier : [COPYPERM]
- Revendre ou donner : [RESELLPERM]
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="BuyContents">
-		Acheter des contenus pour [PRICE] L$ à [OWNER] ?
-Ils seront copiés dans votre inventaire.
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="BuyContentsNoOwner">
-		Acheter des contenus pour [PRICE] L$ ?
-Ils seront copiés dans votre inventaire.
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmPurchase">
-		Suite à cette transaction, vous allez :
-[ACTION]
-
-Êtes-vous certain de vouloir effectuer cette transaction ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmPurchasePassword">
-		Suite à cette transaction, vous allez :
-[ACTION]
-
-Êtes-vous certain de vouloir effectuer cette transaction ?
-Veuillez saisir à nouveau votre mot de passe et cliquer sur OK.
-		<form name="form">
-			<button name="ConfirmPurchase" text="OK"/>
-			<button name="Cancel" text="Annuler"/>
-		</form>
-	</notification>
-	<notification name="SetPickLocation">
-		Remarque :
-vous avez mis à jour l&apos;emplacement de ce favori mais les autres détails resteront inchangés.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="MoveInventoryFromObject">
-		Vous avez sélectionné des objets non copiables.
-Ces objets seront déplacés dans votre inventaire et non pas copiés.
-
-Déplacer les objets de l&apos;inventaire ?
-		<usetemplate ignoretext="M&apos;avertir avant que je ne déplace des objets pour lesquels la copie est interdite" name="okcancelignore" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="MoveInventoryFromScriptedObject">
-		Vous avez sélectionné des objets de l&apos;inventaire qui ne peuvent pas être copiés. Ces objets seront déplacés vers votre inventaire, et non pas copiés.
-L&apos;objet les contenant est scripté, déplacer ces objets peut causer des problèmes au niveau du script.
-
-Déplacer les objets de l&apos;inventaire ?
-		<usetemplate ignoretext="M&apos;avertir avant que je ne déplace des objets pour lesquels la copie est interdite et qui pourraient casser des objets scriptés" name="okcancelignore" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ClickActionNotPayable">
-		Avertissement : l&apos;action du clic Payer l&apos;objet a été définie mais ne fonctionnera que si un script est ajouté avec l&apos;event money().
-		<form name="form">
-			<ignore name="ignore" text="Je définis l&apos;action du clic Payer l&apos;objet  lorsque je construis un objet sans le script money()"/>
-		</form>
-	</notification>
-	<notification name="OpenObjectCannotCopy">
-		Vous n&apos;êtes autorisé à copier aucun élément dans cet objet.
-	</notification>
-	<notification name="WebLaunchAccountHistory">
-		Aller sur secondlife.com pour consulter l&apos;historique de votre compte ?
-		<usetemplate ignoretext="Lancer mon navigateur pour consulter l&apos;historique de mon compte" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/>
-	</notification>
-	<notification name="ConfirmQuit">
-		Êtes-vous certain de vouloir quitter ?
-		<usetemplate ignoretext="Confirmer avant de quitter" name="okcancelignore" notext="Ne pas quitter" yestext="Quitter"/>
-	</notification>
-	<notification name="HelpReportAbuseEmailLL">
-		Utilisez cet outil pour signaler des infractions aux Conditions d&apos;utilisation et aux Règles de la communauté. Voir :
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
-
-Lorsqu&apos;elles sont signalées, toutes les infractions aux Conditions d&apos;utilisation et aux Règles de la communauté font l&apos;objet d&apos;une enquête et sont résolues. Pour accéder aux détails de la résolution d&apos;un incident, allez sur :
-
-http://secondlife.com/support/incidentreport.php
-	</notification>
-	<notification name="HelpReportAbuseEmailEO">
-		Important : ce rapport ira au propriétaire de la région dans laquelle vous êtes et non à Linden Lab.
-
-Pour aider les résidents et les visiteurs, le propriétaire de la région dans laquelle vous êtes a choisi de recevoir et de s&apos;occuper de tous les rapports envoyés à partir de cette région. Linden Lab n&apos;enquêtera pas sur les rapports que vous envoyez à partir de cet endroit.
-
-Le propriétaire de la région traitera les rapports en fonction des règles de cette région, comme indiqué dans le réglement du domaine.
-(Les réglements sont visibles à partir du menu Monde &gt; À propos du terrain.)
-
-La résolution de ce rapport ne s&apos;applique qu&apos;à cette région ; L&apos;accès aux autres endroits de [SECOND_LIFE] ne sera pas affecté par les résultats de cette enquête. Seul Linden Lab peut interdire l&apos;accès à l&apos;ensemble de [SECOND_LIFE].
-	</notification>
-	<notification name="HelpReportAbuseSelectCategory">
-		Veuillez choisir une catégorie pour ce rapport d&apos;infraction.
-Le choix d&apos;une catégorie nous permet de traiter les rapports d&apos;infraction plus rapidement.
-	</notification>
-	<notification name="HelpReportAbuseAbuserNameEmpty">
-		Veuillez saisir le nom du contrevenant.
-Lorsque nous avons le nom du contrevenant, nous sommes en mesure de traiter les rapports plus rapidement.
-	</notification>
-	<notification name="HelpReportAbuseAbuserLocationEmpty">
-		Veuillez indiquer l&apos;endroit où l&apos;infraction a eu lieu.
-Les informations précises et exactes nous permettent de traiter les rapports plus rapidement.
-	</notification>
-	<notification name="HelpReportAbuseSummaryEmpty">
-		Veuillez saisir un récapitulatif de l&apos;infraction.
-Les récapitulatifs précis nous permettent de traiter les rapports plus rapidement.
-	</notification>
-	<notification name="HelpReportAbuseDetailsEmpty">
-		Veuillez saisir une description détaillée de l&apos;infraction.
-Soyez aussi précis que possible et essayez de fournir des noms ainsi que des détails sur l&apos;incident que vous signalez.
-Les descriptions précises nous permettent de traiter les rapports plus rapidement.
-	</notification>
-	<notification name="HelpReportAbuseContainsCopyright">
-		Cher résident,
-
-Il semble que vous souhaitiez reporter une infraction à des droits de propriété intellectuelle. Pour signaler correctement cette infraction :
-
-(1) Remplissez un rapport d&apos;infraction. Vous pouvez soumettre un rapport d&apos;infraction si vous pensez qu&apos;un résident exploite le système de droits de [SECOND_LIFE], par exemple en utilisant un CopyBot ou des outils similaires pour enfreindre des droits de propriété intellectuelle. Notre équipe chargée des infractions mènera une enquête et prendra les mesures nécessaires à l&apos;encontre du résident non respectueux des Conditions d&apos;utilisation ou des règles de la communauté. Sachez toutefois que l&apos;équipe chargée des infractions ne supprimera pas de contenu à l&apos;intérieur de [SECOND_LIFE].
-
-(2) Demandez à ce que du contenu à l&apos;intérieur de [SECOND_LIFE] soit supprimé. Pour demander à ce que du contenu soit supprimé de [SECOND_LIFE], vous devez soumettre un rapport d&apos;infraction valide, tel que fourni dans notre Règlement contre les violations des droit d&apos;auteurs (DMCA), à http://secondlife.com/corporate/dmca.php.
-
-Si vous souhaitez toujours reporter cette infraction, veuillez fermer cette fenêtre et soumettre votre rapport.  Vous devrez peut-être sélectionner la catégorie CopyBot ou exploitation abusive des droits.
-
-Merci,
-
-Linden Lab
-	</notification>
-	<notification name="FailedRequirementsCheck">
-		Les composantes requises suivantes ne se trouvent pas dans [FLOATER]:
-[COMPONENTS]
-	</notification>
-	<notification label="Remplacer la pièce-jointe existante" name="ReplaceAttachment">
-		Vous avez déjà un objet sur cette partie du corps.
-Voulez-vous le remplacer par l&apos;objet sélectionné ?
-		<form name="form">
-			<ignore name="ignore" save_option="true" text="Remplacer une pièce-jointe existante par l&apos;objet sélectionné"/>
-			<button ignore="Remplacer automatiquement" name="Yes" text="OK"/>
-			<button ignore="Ne jamais remplacer" name="No" text="Annuler"/>
-		</form>
-	</notification>
-	<notification label="Réponse si occupé(e)" name="BusyModePay">
-		Vous êtes en mode occupé et vous ne recevrez donc aucun objet en échange de ce paiement.
-
-Souhaitez-vous quitter le mode occupé avant de terminer cette transaction ?
-		<form name="form">
-			<ignore name="ignore" save_option="true" text="Je suis sur le point de payer une personne ou un objet mais suis en mode Occupé"/>
-			<button ignore="Toujours quitter le mode occupé" name="Yes" text="OK"/>
-			<button ignore="Ne jamais quitter le mode occupé" name="No" text="Annuler"/>
-		</form>
-	</notification>
-	<notification name="ConfirmEmptyTrash">
-		Êtes-vous certain de vouloir supprimer le contenu de votre corbeille de manière permanente ?
-		<usetemplate ignoretext="Confimer avant de vider la corbeille" name="okcancelignore" notext="Annuler" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmClearBrowserCache">
-		Êtes-vous certain de vouloir supprimer l&apos;historique de vos visites et recherches ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/>
-	</notification>
-	<notification name="ConfirmClearCookies">
-		Êtes-vous certain de vouloir supprimer vos cookies ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/>
-	</notification>
-	<notification name="ConfirmClearMediaUrlList">
-		Êtes-vous certain de vouloir supprimer la liste des URL enregistrées ?
-		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/>
-	</notification>
-	<notification name="ConfirmEmptyLostAndFound">
-		Êtes-vous certain de vouloir supprimer le contenu de votre dossier Objets trouvés de manière permanente ?
-		<usetemplate ignoretext="Confimer avant de vider le dossier Objets trouvés" name="okcancelignore" notext="Non" yestext="Oui"/>
-	</notification>
-	<notification name="CopySLURL">
-		La SLurl suivante a été copiée dans votre presse-papier :
- [SLURL]
-
-Liez-la à partir d&apos;une page web pour permettre aux autres résidents d&apos;accéder facilement à cet endroit ou bien collez-la dans la barre d&apos;adresse de votre navigateur.
-		<form name="form">
-			<ignore name="ignore" text="La SLurl est copiée dans mon presse-papier"/>
-		</form>
-	</notification>
-	<notification name="WLSavePresetAlert">
-		Voulez-vous écraser l&apos;option précédemment enregistrée ?
-		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
-	</notification>
-	<notification name="WLDeletePresetAlert">
-		Voulez-vous supprimer [SKY] ?
-		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
-	</notification>
-	<notification name="WLNoEditDefault">
-		Vous ne pouvez pas éditer ou supprimer un préréglage par défaut.
-	</notification>
-	<notification name="WLMissingSky">
-		Une dossier semble manquer au Cycle du jour : [SKY].
-	</notification>
-	<notification name="PPSaveEffectAlert">
-		Certains effets post-traitement existent. Voulez-vous quand même écraser ce fichier ?
-		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
-	</notification>
-	<notification name="NewSkyPreset">
-		Nommez le nouveau ciel.
-		<form name="form">
-			<input name="message">
-				Nouveau préréglage
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Annuler"/>
-		</form>
-	</notification>
-	<notification name="ExistsSkyPresetAlert">
-		Ce préréglage existe déjà !
-	</notification>
-	<notification name="NewWaterPreset">
-		Nommez ce nouveau préréglage d&apos;eau.
-		<form name="form">
-			<input name="message">
-				Nouveau préréglage
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Annuler"/>
-		</form>
-	</notification>
-	<notification name="ExistsWaterPresetAlert">
-		Ce préréglage existe déjà !
-	</notification>
-	<notification name="WaterNoEditDefault">
-		Vous ne pouvez pas éditer ou supprimer un préréglage par défaut.
-	</notification>
-	<notification name="ChatterBoxSessionStartError">
-		Impossible de démarrer une nouvelle session de chat avec [RECIPIENT].
-[REASON]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="ChatterBoxSessionEventError">
-		[EVENT]
-[REASON]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="ForceCloseChatterBoxSession">
-		Vous devez terminer votre session de chat avec [NAME].
-[REASON]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="Cannot_Purchase_an_Attachment">
-		Vous ne pouvez pas acheter un objet s&apos;il fait partie d&apos;une pièce-jointe.
-	</notification>
-	<notification label="À propos des requêtes pour les autorisations de débit" name="DebitPermissionDetails">
-		Accepter cette requête donne au script l&apos;autorisation de prélever des dollars Linden (L$) sur votre compte de manière continue. Pour révoquer cette autorisation, le propriétaire de l&apos;objet doit supprimer l&apos;objet ou bien réinitialiser les scripts dans l&apos;objet.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="AutoWearNewClothing">
-		Voulez-vous automatiquement porter l&apos;habit que vous allez créer ?
-		<usetemplate ignoretext="Porter automatiquement tout en modifiant mon apparence" name="okcancelignore" notext="Non" yestext="Oui"/>
-	</notification>
-	<notification name="NotAgeVerified">
-		Pour pouvoir pénétrer dans cette zone, vous devez avoir procédé à la vérification de votre âge.  Souhaitez-vous aller sur [SECOND_LIFE] et procéder à la vérification de votre âge ?
-
-[_URL]
-		<url name="url" option="0">
-			https://secondlife.com/account/verification.php?lang=fr
-		</url>
-		<usetemplate ignoretext="Je n&apos;ai pas procédé à la vérification de mon âge" name="okcancelignore" notext="Non" yestext="Oui"/>
-	</notification>
-	<notification name="Cannot enter parcel: no payment info on file">
-		Pour pouvoir pénétrer dans cette zone, vous devez avoir enregistré vos informations de paiement.  Souhaitez-vous aller sur [SECOND_LIFE] et enregistrer vos informations de paiement ?
-
-[_URL]
-		<url name="url" option="0">
-			https://secondlife.com/account/index.php?lang=fr
-		</url>
-		<usetemplate ignoretext="Mes informations de paiement ne sont pas enregistrées" name="okcancelignore" notext="Non" yestext="Oui"/>
-	</notification>
-	<notification name="MissingString">
-		The string [STRING_NAME] is missing from strings.xml
-	</notification>
-	<notification name="SystemMessageTip">
-		[MESSAGE]
-	</notification>
-	<notification name="Cancelled">
-		Annulé
-	</notification>
-	<notification name="CancelledSit">
-		Action annulée
-	</notification>
-	<notification name="CancelledAttach">
-		Attachement annulé
-	</notification>
-	<notification name="ReplacedMissingWearable">
-		Habits et parties du corps manquants remplacés par les éléments par défaut.
-	</notification>
-	<notification name="GroupNotice">
-		Sujet : [SUBJECT], Message : [MESSAGE]
-	</notification>
-	<notification name="FriendOnline">
-		[FIRST] [LAST] est connecté(e)
-	</notification>
-	<notification name="FriendOffline">
-		[FIRST] [LAST] est déconnecté(e)
-	</notification>
-	<notification name="AddSelfFriend">
-		Même si vous êtes extrêmement sympathique, vous ne pouvez pas devenir ami avec vous-même.
-	</notification>
-	<notification name="UploadingAuctionSnapshot">
-		Importation de photos SL et Web en cours...
-(prend environ 5 minutes.)
-	</notification>
-	<notification name="UploadPayment">
-		Le chargement a coûté [AMOUNT] L$.
-	</notification>
-	<notification name="UploadWebSnapshotDone">
-		Photo Web importée
-	</notification>
-	<notification name="UploadSnapshotDone">
-		Photo SL importée
-	</notification>
-	<notification name="TerrainDownloaded">
-		Fichier terrain.raw téléchargé
-	</notification>
-	<notification name="GestureMissing">
-		Geste [NAME] absent de la base de données.
-	</notification>
-	<notification name="UnableToLoadGesture">
-		Impossible de charger le geste [NAME].
-Merci de réessayer.
-	</notification>
-	<notification name="LandmarkMissing">
-		Repère absent de la base de données.
-	</notification>
-	<notification name="UnableToLoadLandmark">
-		Impossible de charger le repère. Merci de réessayer.
-	</notification>
-	<notification name="CapsKeyOn">
-		La touche Verr.maj est activée.
-Cela risque d&apos;impacter votre mot de passe.
-	</notification>
-	<notification name="NotecardMissing">
-		Note absente de la base de données.
-	</notification>
-	<notification name="NotecardNoPermissions">
-		Vous n&apos;avez pas le droit de consulter cette note.
-	</notification>
-	<notification name="RezItemNoPermissions">
-		Permissions insuffisantes pour rezzer l&apos;objet.
-	</notification>
-	<notification name="UnableToLoadNotecard">
-		Impossible de lire les données de la note actuellement.
-	</notification>
-	<notification name="ScriptMissing">
-		Script absent de la base de données.
-	</notification>
-	<notification name="ScriptNoPermissions">
-		Permissions insuffisantes pour voir le script.
-	</notification>
-	<notification name="UnableToLoadScript">
-		Impossible de charger le script. Merci de réessayer.
-	</notification>
-	<notification name="IncompleteInventory">
-		Tous les éléments que vous souhaitez transférer ne sont pas encore disponibles sur le serveur.
-Merci d&apos;essayer à nouveau dans une minute.
-	</notification>
-	<notification name="CannotModifyProtectedCategories">
-		Vous ne pouvez pas modifier de catégories protégées.
-	</notification>
-	<notification name="CannotRemoveProtectedCategories">
-		Vous ne pouvez pas supprimer de catégories protégées.
-	</notification>
-	<notification name="OfferedCard">
-		Vous avez offert votre carte de visite à [FIRST] [LAST]
-	</notification>
-	<notification name="UnableToBuyWhileDownloading">
-		Achat impossible durant le chargement de l&apos;objet.
-Merci de réessayer.
-	</notification>
-	<notification name="UnableToLinkWhileDownloading">
-		Impossible de lier durant le chargement de l&apos;objet.
-Merci de réessayer.
-	</notification>
-	<notification name="CannotBuyObjectsFromDifferentOwners">
-		Vous ne pouvez pas acheter simultanément des objets de propriétaires différents.
-Veuillez sélectionner un seul objet.
-	</notification>
-	<notification name="ObjectNotForSale">
-		Cet objet n&apos;est pas à vendre.
-	</notification>
-	<notification name="EnteringGodMode">
-		Activation du mode divin : niveau [LEVEL]
-	</notification>
-	<notification name="LeavingGodMode">
-		Désactivation du mode divin : niveau [LEVEL]
-	</notification>
-	<notification name="CopyFailed">
-		Vous n&apos;avez pas le droit de copier ceci.
-	</notification>
-	<notification name="InventoryAccepted">
-		[NAME] a accepté votre envoi.
-	</notification>
-	<notification name="InventoryDeclined">
-		[NAME] a refusé votre envoi.
-	</notification>
-	<notification name="ObjectMessage">
-		[NAME]: [MESSAGE]
-	</notification>
-	<notification name="CallingCardAccepted">
-		Votre carte de visite a été acceptée.
-	</notification>
-	<notification name="CallingCardDeclined">
-		Votre carte de visite a été refusée.
-	</notification>
-	<notification name="TeleportToLandmark">
-		A présent que vous êtes sur le continent, vous pouvez voyager par téléportation (vers [NAME] par exemple). Cliquez sur le bouton Inventaire en bas à droite de l&apos;écran puis sélectionnez le dossier Repères (Landmarks).
-Choisissez un repère, double-cliquez dessus et cliquez sur Téléporter.
-	</notification>
-	<notification name="TeleportToPerson">
-		A présent que vous êtes sur le continent, vous pouvez contacter des résidents (tel [NAME] par exemple). Cliquez sur le bouton Inventaire en bas à droite de l&apos;écran puis sélectionnez le dossier Cartes de visite (Calling Cards).
-Choisissez en une, double-cliquez dessus et cliquez sur Message Instantané.
-	</notification>
-	<notification name="CantSelectLandFromMultipleRegions">
-		Vous ne pouvez pas sélectionner de terrain en dehors des limites du serveur.
-Veuillez sélectionner un terrain plus petit.
-	</notification>
-	<notification name="SearchWordBanned">
-		Certains termes de votre recherche ont été exclus car ils ne correspondaient pas aux standards fixés dans les Règles communautaires.
-	</notification>
-	<notification name="NoContentToSearch">
-		Veuillez sélectionner au moins un type de contenu à rechercher (PG, Mature ou Adulte)
-	</notification>
-	<notification name="GroupVote">
-		[NAME] a proposé un vote pour :
-[MESSAGE]
-		<form name="form">
-			<button name="VoteNow" text="Voter"/>
-			<button name="Later" text="Plus tard"/>
-		</form>
-	</notification>
-	<notification name="SystemMessage">
-		[MESSAGE]
-	</notification>
-	<notification name="EventNotification">
-		Avis d&apos;événement :
-
-[NAME]
-[DATE]
-		<form name="form">
-			<button name="Teleport" text="Téléporter"/>
-			<button name="Description" text="Description"/>
-			<button name="Cancel" text="Annuler"/>
-		</form>
-	</notification>
-	<notification name="TransferObjectsHighlighted">
-		Tous les objets de cette parcelle qui seront transférés à l&apos;acheteur sont maintenant mis en surbrillance.
-
-* Les arbres et la pelouse qui seront transférés ne sont pas mis en surbrillance.
-		<form name="form">
-			<button name="Done" text="Transfert effectué"/>
-		</form>
-	</notification>
-	<notification name="DeactivatedGesturesTrigger">
-		Gestes désactivés ayant le même mot-clé :
-[NAMES]
-	</notification>
-	<notification name="NoQuickTime">
-		Le logiciel Apple QuickTime ne semble pas installé sur votre système.
-Pour voir les vidéos sur les terrains qui le permettent, allez sur le site de QuickTime (http://www.apple.com/fr/quicktime/download) et installez le lecteur QuickTime.
-	</notification>
-	<notification name="NoPlugin">
-		Aucun Media Plugin n&apos;a été trouvé pour prendre en charge &quot;[MIME_TYPE]&quot;.  Les médias de ce type ne sont pas disponibles.
-	</notification>
-	<notification name="MediaPluginFailed">
-		Le Media Plugin suivant a échoué :
-    [PLUGIN]
-
-Si le problème persiste, veuillez réinstaller le plugin ou contacter le vendeur.
-		<form name="form">
-			<ignore name="ignore" text="L&apos;éxécution d&apos;un Media Plugin a échoué"/>
-		</form>
-	</notification>
-	<notification name="OwnedObjectsReturned">
-		Les objets que vous possédez sur la parcelle de terrain sélectionnée ont été renvoyés dans votre inventaire.
-	</notification>
-	<notification name="OtherObjectsReturned">
-		Les objets que vous possédez sur la parcelle de terrain appartenant à [FIRST] [LAST] ont été renvoyés dans votre inventaire.
-	</notification>
-	<notification name="OtherObjectsReturned2">
-		Les objets sur la parcelle appartenant à « [NAME] » ont étés renvoyés à leur propriétaire.
-	</notification>
-	<notification name="GroupObjectsReturned">
-		Les objets sélectionnés sur la parcelle de terrain partagée avec le groupe [GROUPNAME] ont été renvoyés dans l&apos;inventaire de leur propriétaire.
-Les objets donnés transférables ont étés renvoyés à leur propriétaire.
-Les objets non transférables donnés au groupe ont étés supprimés.
-	</notification>
-	<notification name="UnOwnedObjectsReturned">
-		Les objets sélectionnés sur la parcelle et qui ne sont pas à vous ont été rendus à leurs propriétaires.
-	</notification>
-	<notification name="NotSafe">
-		Les dégâts sont autorisés sur ce terrain.
-Vous pouvez être blessé ici. Si vous décédez, vous serez téléporté à votre domicile.
-	</notification>
-	<notification name="NoFly">
-		Le vol est interdit dans cette zone.
-Vous ne pouvez pas voler ici.
-	</notification>
-	<notification name="PushRestricted">
-		Les bousculades sont interdites dans cette zone.
-Vous ne pouvez pas pousser les autres à moins que vous soyez propriétaire de ce terrain.
-	</notification>
-	<notification name="NoVoice">
-		Le chat vocal est interdit dans cette zone. Vous n&apos;entendrez personne parler.
-	</notification>
-	<notification name="NoBuild">
-		La construction est interdite dans cette zone. Vous ne pouvez pas construite ou rezzer d&apos;objets ici.
-	</notification>
-	<notification name="ScriptsStopped">
-		Un administrateur a temporairement stoppé les scripts dans cette région.
-	</notification>
-	<notification name="ScriptsNotRunning">
-		Aucun script ne fonctionne dans cette région.
-	</notification>
-	<notification name="NoOutsideScripts">
-		Les scripts externes sont désactivés sur ce terrain.
-
-Aucun script ne marche ici à part ceux du propriétaire du terrain.
-	</notification>
-	<notification name="ClaimPublicLand">
-		Vous ne pouvez réclamer qu&apos;un terrain public dans la région où vous vous trouvez actuellement.
-	</notification>
-	<notification name="RegionTPAccessBlocked">
-		Votre catégorie d&apos;accès ne vous autorise pas à pénétrer dans cette région. Vous devez sans doute procéder à la vérification de votre âge ou installer une version plus récente du client.
-
-Pour savoir comment accéder aux zones ayant un tel niveau d&apos;accès, veuillez consulter les pages d&apos;aide.
-	</notification>
-	<notification name="URBannedFromRegion">
-		Vous avez été banni de cette région.
-	</notification>
-	<notification name="NoTeenGridAccess">
-		Votre compte ne peut pas se connecter à cette région du Teen grid.
-	</notification>
-	<notification name="ImproperPaymentStatus">
-		Vous n&apos;avez pas le statut de paiement approprié pour pénétrer dans cette région.
-	</notification>
-	<notification name="MustGetAgeParcel">
-		Pour pouvoir pénétrer sur cette parcelle, vous devez avoir procédé à la vérification de votre âge.
-	</notification>
-	<notification name="NoDestRegion">
-		Région de destination introuvable.
-	</notification>
-	<notification name="NotAllowedInDest">
-		Vous n&apos;êtes pas autorisé dans cette région.
-	</notification>
-	<notification name="RegionParcelBan">
-		Impossible de traverser une parcelle bannie. Veuillez trouver une autre solution.
-	</notification>
-	<notification name="TelehubRedirect">
-		Vous avez été redirigé vers un téléhub.
-	</notification>
-	<notification name="CouldntTPCloser">
-		Il n&apos;a pas été possible de vous téléporter vers une destination plus proche.
-	</notification>
-	<notification name="TPCancelled">
-		Téléportation annulée.
-	</notification>
-	<notification name="FullRegionTryAgain">
-		La région dans laquelle vous essayez de pénétrer est pleine actuellement.
-Veuillez réessayer dans quelques minutes.
-	</notification>
-	<notification name="GeneralFailure">
-		Panne générale.
-	</notification>
-	<notification name="RoutedWrongRegion">
-		Dirigé vers la mauvaise région. Merci de réessayer.
-	</notification>
-	<notification name="NoValidAgentID">
-		ID agent non valide.
-	</notification>
-	<notification name="NoValidSession">
-		ID de session non valide.
-	</notification>
-	<notification name="NoValidCircuit">
-		Aucun code de circuit valide.
-	</notification>
-	<notification name="NoValidTimestamp">
-		Timestamp non valide.
-	</notification>
-	<notification name="NoPendingConnection">
-		Impossible de créer la connexion en attente.
-	</notification>
-	<notification name="InternalUsherError">
-		Erreur interne lors de la tentative de connexion.
-	</notification>
-	<notification name="NoGoodTPDestination">
-		Impossible de trouver un lieu de téléportation valide dans cette région.
-	</notification>
-	<notification name="InternalErrorRegionResolver">
-		Une erreur interne est survenue lors de la résolution des coodonnées de la région.
-	</notification>
-	<notification name="NoValidLanding">
-		Impossible de trouver un point d&apos;atterrissage valide.
-	</notification>
-	<notification name="NoValidParcel">
-		Aucune parcelle valide n&apos;a été trouvée.
-	</notification>
-	<notification name="ObjectGiveItem">
-		Un objet appelé [OBJECTFROMNAME] appartenant à [FIRST] [LAST] vous a donné : [OBJECTTYPE] appelé(e) [OBJECTNAME].
-		<form name="form">
-			<button name="Keep" text="Garder"/>
-			<button name="Discard" text="Jeter"/>
-			<button name="Mute" text="Ignorer"/>
-		</form>
-	</notification>
-	<notification name="ObjectGiveItemUnknownUser">
-		L&apos;objet [OBJECTFROMNAME] appartenant à un utilisateur inconnu vous a donné un(e) [OBJECTTYPE] nommé(e) [OBJECTNAME].
-		<form name="form">
-			<button name="Keep" text="Garder"/>
-			<button name="Discard" text="Jeter"/>
-			<button name="Mute" text="Ignorer"/>
-		</form>
-	</notification>
-	<notification name="UserGiveItem">
-		[NAME] vous a donné un(e) [OBJECTTYPE] nommé(e) [OBJECTNAME].
-		<form name="form">
-			<button name="Keep" text="Garder"/>
-			<button name="Discard" text="Jeter"/>
-		</form>
-	</notification>
-	<notification name="GodMessage">
-		[NAME]
-[MESSAGE]
-	</notification>
-	<notification name="JoinGroup">
-		[MESSAGE]
-		<form name="form">
-			<button name="Join" text="Rejoindre"/>
-			<button name="Decline" text="Refuser"/>
-			<button name="Info" text="Infos"/>
-		</form>
-	</notification>
-	<notification name="TeleportOffered">
-		[NAME] vous propose de le/la rejoindre par téléportation :
-
-[MESSAGE]
-		<form name="form">
-			<button name="Teleport" text="Téléporter"/>
-			<button name="Cancel" text="Annuler"/>
-		</form>
-	</notification>
-	<notification name="GotoURL">
-		[MESSAGE]
-[URL]
-		<form name="form">
-			<button name="Later" text="Plus tard"/>
-			<button name="GoNow..." text="Y aller maintenant..."/>
-		</form>
-	</notification>
-	<notification name="OfferFriendship">
-		[NAME] vous demande de devenir son ami(e).
-
-[MESSAGE]
-
-(Par défaut, vous pourrez voir lorsque vous êtes tous deux connectés.)
-		<form name="form">
-			<button name="Accept" text="Accepter"/>
-			<button name="Decline" text="Refuser"/>
-		</form>
-	</notification>
-	<notification name="OfferFriendshipNoMessage">
-		[NAME] vous demande de devenir son ami.
-
-(Par défaut, vous pourrez voir quand vous êtes tous deux connectés)
-		<form name="form">
-			<button name="Accept" text="Accepter"/>
-			<button name="Decline" text="Refuser"/>
-		</form>
-	</notification>
-	<notification name="FriendshipAccepted">
-		[NAME] a accepté votre amitié.
-	</notification>
-	<notification name="FriendshipDeclined">
-		[NAME] a refusé votre amitié.
-	</notification>
-	<notification name="OfferCallingCard">
-		[FIRST] [LAST] vous offre sa carte de visite.
-Cela ajoute un marque-page dans votre inventaire, ce qui vous permet d&apos;envoyer rapidement un IM à ce résident.
-		<form name="form">
-			<button name="Accept" text="Accepter"/>
-			<button name="Decline" text="Refuser"/>
-		</form>
-	</notification>
-	<notification name="RegionRestartMinutes">
-		La région va redémarrer dans [MINUTES] minutes.
-Si vous restez dans cette région, vous serez déconnecté(e).
-	</notification>
-	<notification name="RegionRestartSeconds">
-		La région va redémarrer dans [SECONDS] secondes.
-Si vous restez dans cette région, vous serez déconnecté(e).
-	</notification>
-	<notification name="LoadWebPage">
-		Charger cette page web [URL] ?
-
-[MESSAGE]
-
-Venant de l&apos;objet : [OBJECTNAME], appartenant à : [NAME]?
-		<form name="form">
-			<button name="Gotopage" text="Charger"/>
-			<button name="Cancel" text="Annuler"/>
-		</form>
-	</notification>
-	<notification name="FailedToFindWearableUnnamed">
-		La recherche du [TYPE] dans la base de données a échoué.
-	</notification>
-	<notification name="FailedToFindWearable">
-		La recherche du [TYPE] nommé(e) [DESC] dans la base de données a échoué.
-	</notification>
-	<notification name="InvalidWearable">
-		L&apos;objet que vous essayez de porter utilise une fonctionnalité que le client ne peut lire.  Pour porter cet objet, veuillez télécharger une mise à jour du client.
-	</notification>
-	<notification name="ScriptQuestion">
-		&apos;[OBJECTNAME]&apos;, un objet appartenant à &apos;[NAME]&apos;, aimerait :
-
-[QUESTIONS]
-Acceptez-vous ?
-		<form name="form">
-			<button name="Yes" text="Oui"/>
-			<button name="No" text="Non"/>
-			<button name="Mute" text="Ignorer"/>
-		</form>
-	</notification>
-	<notification name="ScriptQuestionCaution">
-		Un objet appelé « [OBJECTNAME] », appartenant à « [NAME] », aimerait :
-
-[QUESTIONS]
-Si vous n&apos;avez pas confiance en cet objet ni en son créateur, vous devriez refuser cette requête.
-
-Accepter cette requête ?
-		<form name="form">
-			<button name="Grant" text="Accepter"/>
-			<button name="Deny" text="Refuser"/>
-			<button name="Details" text="Détails..."/>
-		</form>
-	</notification>
-	<notification name="ScriptDialog">
-		&apos;[TITLE]&apos; de [FIRST] [LAST]
-[MESSAGE]
-		<form name="form">
-			<button name="Ignore" text="Ignorer"/>
-		</form>
-	</notification>
-	<notification name="ScriptDialogGroup">
-		&apos;[TITLE]&apos; de [GROUPNAME]
-[MESSAGE]
-		<form name="form">
-			<button name="Ignore" text="Ignorer"/>
-		</form>
-	</notification>
-	<notification name="FirstBalanceIncrease">
-		Vous venez de recevoir [AMOUNT] L$.
-Votre solde en L$ est affiché en haut à droite.
-	</notification>
-	<notification name="FirstBalanceDecrease">
-		Vous venez de payer [AMOUNT] L$.
-Votre solde en L$ est affiché en haut à droite.
-	</notification>
-	<notification name="FirstSit">
-		Vous êtes assis(e).
-Utilisez les touches de direction (ou AWSD) pour regarder autour de vous.
-Pour vous lever, cliquez sur le bouton Me lever.
-	</notification>
-	<notification name="FirstMap">
-		Cliquez et faîtes glisser pour faire défiler la carte.
-Double-cliquez pour vous téléporter.
-Utilisez les contrôles à droite pour trouver des choses et afficher différents arrière-plans.
-	</notification>
-	<notification name="FirstBuild">
-		Vous avez ouvert les outils de construction. Tous les objets autour de vous ont été créés avec ces outils.
-	</notification>
-	<notification name="FirstTeleport">
-		Vous ne pouvez vous téléporter que dans certaines zones de cette région. La flèche pointe vers votre destination. Cliquez sur la flèche pour la faire disparaître.
-	</notification>
-	<notification name="FirstOverrideKeys">
-		Vos mouvements sont maintenant pris en charge par un objet.
-Essayez les flèches de votre clavier ou AWSD pour voir à quoi elles servent.
-Certains objets (comme les armes) nécessitent l&apos;activation du mode Vue subjective pour être utilisés.
-Pour cela, appuyez sur la touche M.
-	</notification>
-	<notification name="FirstAppearance">
-		Vous êtes en train d&apos;éditer votre apparence.
-Utilisez les touches de direction pour regarder autour de vous.
-Une fois terminé, cliquer sur Tout enregistrer.
-	</notification>
-	<notification name="FirstInventory">
-		Il s&apos;agit de votre inventaire qui contient vos possessions.
-
-* Pour porter quelque chose, faites glisser l&apos;objet sur vous-même.
-* Pour rezzer un objet dans le monde, faites-le glisser sur le sol.
-* Pour lire une note, double-cliquez dessus.
-	</notification>
-	<notification name="FirstSandbox">
-		Cette région est un bac à sable et est utilisée par les résidents pour apprendre à construire.
-
-Les objets que vous construisez ici seront supprimés après votre départ. N&apos;oubliez donc pas de cliquer droit et de choisir Prendre pour sauvegarder votre création dans votre inventaire.
-	</notification>
-	<notification name="FirstFlexible">
-		Cet objet est flexible. Les objets flexibles ne peuvent pas avoir de propriétés physiques et doivent rester fantômes.
-	</notification>
-	<notification name="FirstDebugMenus">
-		Vous avez ouvert le menu Avancé.
-
-Pour activer/désactiver ce menu,
-  Windows : Ctrl-Alt-D
-  Mac : ⌘-Opt-D
-	</notification>
-	<notification name="FirstSculptedPrim">
-		Vous êtes en train d&apos;éditer un sculptie. Pour spécifier la forme d&apos;un sculptie, vous devez utiliser une texture spécifique.
-	</notification>
-	<notification name="MaxListSelectMessage">
-		Vous ne pouvez sélectionner que [MAX_SELECT] objets maximum dans cette liste.
-	</notification>
-	<notification name="VoiceInviteP2P">
-		[NAME] vous invite à un chat vocal.
-Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cette personne, cliquez sur Ignorer.
-		<form name="form">
-			<button name="Accept" text="Accepter"/>
-			<button name="Decline" text="Refuser"/>
-			<button name="Mute" text="Ignorer"/>
-		</form>
-	</notification>
-	<notification name="AutoUnmuteByIM">
-		[FIRST] [LAST] a reçu un message instantané et n&apos;est donc plus ignoré.
-	</notification>
-	<notification name="AutoUnmuteByMoney">
-		[FIRST] [LAST] a reçu de l&apos;argent et n&apos;est donc plus ignoré.
-	</notification>
-	<notification name="AutoUnmuteByInventory">
-		[FIRST] [LAST] a reçu un inventaire et n&apos;est donc plus ignoré.
-	</notification>
-	<notification name="VoiceInviteGroup">
-		[NAME] a rejoint un chat vocal avec le groupe [GROUP].
-Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cette personne, cliquez sur Ignorer.
-		<form name="form">
-			<button name="Accept" text="Accepter"/>
-			<button name="Decline" text="Refuser"/>
-			<button name="Mute" text="Ignorer"/>
-		</form>
-	</notification>
-	<notification name="VoiceInviteAdHoc">
-		[NAME] a rejoint un chat vocal avec conférence.
-Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cet utilisateur, cliquez sur Ignorer.
-		<form name="form">
-			<button name="Accept" text="Accepter"/>
-			<button name="Decline" text="Refuser"/>
-			<button name="Mute" text="Ignorer"/>
-		</form>
-	</notification>
-	<notification name="InviteAdHoc">
-		[NAME] vous invite à un chat conférence.
-Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cet utilisateur, cliquez sur Ignorer.
-		<form name="form">
-			<button name="Accept" text="Accepter"/>
-			<button name="Decline" text="Refuser"/>
-			<button name="Mute" text="Ignorer"/>
-		</form>
-	</notification>
-	<notification name="VoiceChannelFull">
-		L&apos;appel auquel vous essayez de participer, [VOICE_CHANNEL_NAME], a atteint le nombre maximum de participants. Veuillez réessayer ultérieurement.
-	</notification>
-	<notification name="ProximalVoiceChannelFull">
-		Nous sommes désolés. Le nombre maximum de conversations vocales a été atteint dans cette zone. Veuillez trouver un autre endroit pour discuter.
-	</notification>
-	<notification name="VoiceChannelDisconnected">
-		Vous avez été déconnecté(e) de [VOICE_CHANNEL_NAME]. Vous allez maintenant être reconnecté au chat vocal spatial.
-	</notification>
-	<notification name="VoiceChannelDisconnectedP2P">
-		[VOICE_CHANNEL_NAME] a mis fin à l&apos;appel. Vous allez maintenant être reconnecté au chat vocal spatial.
-	</notification>
-	<notification name="P2PCallDeclined">
-		[VOICE_CHANNEL_NAME] a refusé votre appel. Vous allez maintenant être reconnecté au chat vocal spatial.
-	</notification>
-	<notification name="P2PCallNoAnswer">
-		[VOICE_CHANNEL_NAME] ne peut pas prendre votre appel. Vous allez maintenant être reconnecté au chat vocal spatial.
-	</notification>
-	<notification name="VoiceChannelJoinFailed">
-		Echec de la connexion avec [VOICE_CHANNEL_NAME], veuillez réessayer ultérieurement. Vous allez maintenant être reconnecté au chat vocal spatial.
-	</notification>
-	<notification name="VoiceLoginRetry">
-		Nous sommes en train de créer un canal vocal pour vous. Veuillez patienter quelques instants.
-	</notification>
-	<notification name="Cannot enter parcel: not a group member">
-		Seuls les membres d&apos;un certain groupe peuvent visiter cette zone.
-	</notification>
-	<notification name="Cannot enter parcel: banned">
-		Vous ne pouvez pas pénétrer sur ce terrain car l&apos;accès vous y est interdit.
-	</notification>
-	<notification name="Cannot enter parcel: not on access list">
-		Vous ne pouvez pas pénétrer sur ce terrain car vous n&apos;avez pas les droits d&apos;accès requis.
-	</notification>
-	<notification name="VoiceNotAllowed">
-		Vous n&apos;êtes pas autorisé à vous connecter au chat vocal pour [VOICE_CHANNEL_NAME].
-	</notification>
-	<notification name="VoiceCallGenericError">
-		Une erreur est survenue pendant la connexion au chat vocal pour [VOICE_CHANNEL_NAME]. Veuillez réessayer ultérieurement.
-	</notification>
-	<notification name="ServerVersionChanged">
-		La région dans laquelle vous avez pénétré utilise une version de serveur différente, ce qui peut avoir un impact sur votre performance. Cliquez pour voir les notes de version.
-	</notification>
-	<notification name="UnsupportedCommandSLURL">
-		La SLurl que vous avez saisie n&apos;est pas prise en charge.
-	</notification>
-	<notification name="IMToast">
-		<form name="form">
-			<button name="respondbutton" text="Répondre"/>
-		</form>
-	</notification>
-	<notification name="AttachmentSaved">
-		L&apos;élément joint a été sauvegardé.
-	</notification>
-	<notification name="UnableToFindHelpTopic">
-		Impossible de trouver l&apos;aide.
-	</notification>
-	<global name="UnsupportedCPU">
-		- Votre processeur ne remplit pas les conditions minimum requises.
-	</global>
-	<global name="UnsupportedGLRequirements">
-		Vous semblez ne pas avoir le matériel requis pour utiliser [APP_NAME]. [APP_NAME] requiert une carte graphique OpenGL avec une prise en charge du multitexturing. Si vous avez une telle carte, assurez-vous que vous avez aussi les pilotes les plus récents pour la carte, ainsi que les service packs et les patchs pour votre système d&apos;exploitation.
-
-Si vous avez toujours des problèmes, veuillez consulter la page [SUPPORT_SITE].
-	</global>
-	<global name="UnsupportedCPUAmount">
-		796
-	</global>
-	<global name="UnsupportedRAMAmount">
-		510
-	</global>
-	<global name="UnsupportedGPU">
-		- Votre carte graphique ne remplit pas les conditions minimum requises.
-	</global>
-	<global name="UnsupportedRAM">
-		- Votre mémoire système ne remplit pas les conditions minimum requises.
-	</global>
-	<global name="PermYes">
-		Oui
-	</global>
-	<global name="PermNo">
-		Non
-	</global>
-	<global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
-		Si vous possédez un terrain, vous pouvez le définir comme domicile. 
-Sinon, consultez la carte et trouvez les « infohubs ».
-	</global>
-</notifications>
+<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+	<global name="skipnexttime">
+		Ne plus afficher
+	</global>
+	<global name="alwayschoose">
+		Toujours choisir cette option
+	</global>
+	<global name="implicitclosebutton">
+		Fermer
+	</global>
+	<template name="okbutton">
+		<form>
+			<button name="OK" text="$yestext"/>
+		</form>
+	</template>
+	<template name="okignore"/>
+	<template name="okcancelbuttons">
+		<form>
+			<button name="Cancel" text="$notext"/>
+		</form>
+	</template>
+	<template name="okcancelignore"/>
+	<template name="okhelpbuttons">
+		<form>
+			<button name="Help" text="$helptext"/>
+		</form>
+	</template>
+	<template name="yesnocancelbuttons">
+		<form>
+			<button name="Yes" text="$yestext"/>
+			<button name="No" text="$notext"/>
+		</form>
+	</template>
+	<notification functor="GenericAcknowledge" label="Message d&apos;alerte inconnu" name="MissingAlert">
+		Votre version de [APP_NAME] ne peut afficher ce message d&apos;erreur.  Veuillez vous assurer que vous avez bien la toute dernière version du client.
+
+Détails de l&apos;erreur : L&apos;alerte, appelée &apos;[_NAME]&apos; est introuvable dans notifications.xml.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="FloaterNotFound">
+		Erreur floater : impossible de trouver les contrôles suivants :
+
+[CONTROLS]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="TutorialNotFound">
+		Aucun didacticiel n&apos;est disponible actuellement.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="GenericAlert">
+		[MESSAGE]
+	</notification>
+	<notification name="GenericAlertYesCancel">
+		[MESSAGE]
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/>
+	</notification>
+	<notification name="BadInstallation">
+		Une erreur est survenue lors de la mise à jour de [APP_NAME].  Veuillez télécharger la dernière version su client. http://get.secondlife.com
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="LoginFailedNoNetwork">
+		Connexion à [SECOND_LIFE_GRID] impossible.
+&apos;[DIAGNOSTIC]&apos;
+Veuillez vérifier votre connexion Internet.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="MessageTemplateNotFound">
+		Le modèle de message [PATH] est introuvable.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="WearableSave">
+		Enregistrer les changements dans la partie du corps/les habits actuels ?
+		<usetemplate canceltext="Cancel" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/>
+	</notification>
+	<notification name="CompileQueueSaveText">
+		Une erreur est survenue lors du chargement du texte pour un script, suite au problème suivant : [REASON]. Veuillez réessayer ultérieurement.
+	</notification>
+	<notification name="CompileQueueSaveBytecode">
+		Une erreur est survenue lors du chargement du script compilé, suite au problème suivant : [REASON]. Veuillez réessayer ultérieurement.
+	</notification>
+	<notification name="WriteAnimationFail">
+		Une erreur est survenue lors de l&apos;écriture des données d&apos;animation. Veuillez réessayer ultérieurement.
+	</notification>
+	<notification name="UploadAuctionSnapshotFail">
+		Un problème est survenu lors du chargement du script compilé, suite au problème suivant : [REASON]
+	</notification>
+	<notification name="UnableToViewContentsMoreThanOne">
+		Impossible d&apos;afficher les contenus de plus d&apos;un objet à la fois.
+Veuillez ne sélectionner qu&apos;un seul objet.
+	</notification>
+	<notification name="SaveClothingBodyChanges">
+		Enregistrer tous les changements dans les habits/parties du corps ?
+		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Tout enregistrer"/>
+	</notification>
+	<notification name="GrantModifyRights">
+		Lorsque vous accordez des droits d&apos;édition à un autre résident, vous lui permettez de changer, supprimer ou prendre n&apos;importe lequel de vos objets dans le Monde. Réfléchissez bien avant d&apos;accorder ces droits.
+Souhaitez-vous accorder des droits d&apos;édition à [FIRST_NAME] [LAST_NAME] ?
+		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
+	</notification>
+	<notification name="GrantModifyRightsMultiple">
+		Lorsque vous accordez des droits d&apos;édition à un autre résident, vous lui permettez de changer n&apos;importe lequel de vos objets dans le Monde. Réfléchissez bien avant d&apos;accorder ces droits.
+Souhaitez-vous accorder des droits d&apos;édition aux résidents selectionnés ?
+		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
+	</notification>
+	<notification name="RevokeModifyRights">
+		Souhaitez-vous retirer les droits d&apos;édition à [FIRST_NAME] [LAST_NAME] ?
+		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
+	</notification>
+	<notification name="RevokeModifyRightsMultiple">
+		Souhaitez-vous retirer les droits d&apos;édition aux résidents selectionnés ?
+		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
+	</notification>
+	<notification name="UnableToCreateGroup">
+		Impossible de créer le groupe.
+[MESSAGE]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="PanelGroupApply">
+		[NEEDS_APPLY_MESSAGE]
+[WANT_APPLY_MESSAGE]
+		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ignorer les modifications" yestext="Enregistrer les modifications"/>
+	</notification>
+	<notification name="MustSpecifyGroupNoticeSubject">
+		Pour envoyer une notice au groupe, vous devez indiquer un sujet.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="AddGroupOwnerWarning">
+		Vous êtes sur le point d&apos;ajouter des membres du groupe dans le rôle de [ROLE_NAME].
+Les membres ne peuvent pas être destitués de ce rôle.
+Ils doivent donner eux-mêmes leur démission.
+Êtes-vous certain de vouloir continuer ?
+		<usetemplate ignoretext="Confirmer avant d&apos;ajouter un nouveau propriétaire" name="okcancelignore" notext="Non" yestext="Oui"/>
+	</notification>
+	<notification name="AssignDangerousActionWarning">
+		Vous êtes sur le point d&apos;ajouter le pouvoir « [ACTION_NAME] » au rôle « [ROLE_NAME] ».
+ *Avertissement*
+ Tout membre disposant de ce pouvoir peut s&apos;affecter lui-même, ainsi que tout autre membre, à des rôles disposant de pouvoirs plus importants, et accéder potentiellement à des pouvoirs proches de ceux d&apos;un propriétaire. Assurez-vous de bien comprendre ce que vous faites avant d&apos;attribuer ce pouvoir.
+
+Ajouter ce pouvoir à « [ROLE_NAME] » ?
+		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
+	</notification>
+	<notification name="AssignDangerousAbilityWarning">
+		Vous êtes sur le point d&apos;ajouter le pouvoir « [ACTION_NAME] » au rôle « [ROLE_NAME] ».
+
+ *Avertissement*
+ Tout membre dans un rôle avec ce pouvoir peut s&apos;attribuer à lui-même, ainsi qu&apos;à tout autre membre, Tous les pouvoirs, et accéder potentiellement à des pouvoirs proches de ceux d&apos;un propriétaire.
+
+Ajouter ce pouvoir à « [ROLE_NAME] » ?
+		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
+	</notification>
+	<notification name="JoinGroupCanAfford">
+		Rejoindre ce groupe coûte [COST] L$.
+Voulez-vous continuer ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Rejoindre"/>
+	</notification>
+	<notification name="JoinGroupCannotAfford">
+		Rejoindre ce groupe coûte [COST] L$.
+Vous n&apos;avez pas suffisamment de L$ pour rejoindre ce groupe.
+	</notification>
+	<notification name="CreateGroupCost">
+		La création de ce groupe coûte 100 L$.
+Les groupes doivent comporter plus d&apos;un membre, sinon ils sont supprimés.
+Veuillez inviter des membres d&apos;ici 48 heures.
+		<usetemplate canceltext="Annuler" name="okcancelbuttons" notext="Annuler" yestext="Créer un groupe pour 100 L$"/>
+	</notification>
+	<notification name="LandBuyPass">
+		Pour [COST] L$ vous pouvez pénétrer sur ce terrain ([PARCEL_NAME]) et y rester [TIME] heures. Acheter un pass ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="SalePriceRestriction">
+		Pour rendre l&apos;annonce disponible à tous, le prix de vente doit être supérieur à 0 L$.
+Si le prix de vente est de 0 L$, vous devez choisir un acheteur spécifique.
+	</notification>
+	<notification name="ConfirmLandSaleChange">
+		Le terrain sélectionné, de [LAND_SIZE] m², est mis en vente.
+Votre prix de vente sera de [SALE_PRICE] L$ et la vente sera disponible à [NAME].
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmLandSaleToAnyoneChange">
+		Attention : en cliquant sur Vendre à n&apos;importe qui, vous rendez votre terrain disponible à toute la communauté de [SECOND_LIFE], même aux personnes qui ne sont pas dans cette région.
+
+Le terrain sélectionné, de [LAND_SIZE] m², est mis en vente.
+Votre prix de vente sera de [SALE_PRICE] L$ et la vente sera disponible à [NAME].
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsDeededToGroup">
+		Êtes-vous certain de vouloir renvoyer tous les objets partagés par le groupe [NAME] sur cette parcelle dans l&apos;inventaire du propriétaire précédent ?
+
+*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés !
+
+Objets : [N]
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsOwnedByUser">
+		Etes-vous certain de vouloir renvoyer tous les objets que [NAME] possède sur cette parcelle dans son inventaire ?
+
+Objets : [N]
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsOwnedBySelf">
+		Êtes-vous certain de vouloir renvoyer tous les objets que vous possédez sur cette parcelle dans votre inventaire ?
+
+Objets : [N]
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsNotOwnedBySelf">
+		Êtes-vous certain de vouloir renvoyer tous les objets que vous ne possédez pas sur cette parcelle dans l&apos;inventaire de leur propriétaire ?
+Les objets transférables cédés à un groupe seront renvoyés aux propriétaires précédents.
+
+*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés !
+
+Objets : [N]
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsNotOwnedByUser">
+		Êtes-vous certain de vouloir renvoyer tous les objets que [NAME] ne possède pas sur cette parcelle dans l&apos;inventaire de leur propriétaire ?
+Les objets transférables cédés à un groupe seront renvoyés aux propriétaires précédents.
+
+*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés !
+
+Objets : [N]
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ReturnAllTopObjects">
+		Êtes-vous certain de vouloir renvoyer tous les objets de la liste dans l&apos;inventaire de leur propriétaire ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="DisableAllTopObjects">
+		Êtes-vous certain de vouloir désactiver tous les objets dans cette région ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsNotOwnedByGroup">
+		Renvoyer les objets de cette parcelle qui ne sont pas partagés avec le groupe [NAME] à leur propriétaire ?
+
+Objets : [N]
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="UnableToDisableOutsideScripts">
+		Impossible de désactiver les scripts.
+Les dégâts sont autorisés dans toute la région.
+Pour que les armes fonctionnent, les scripts doivent être autorisés.
+	</notification>
+	<notification name="MustBeInParcel">
+		Pour définir le point d&apos;atterrissage, vous devez vous trouver à l&apos;intérieur de la parcelle.
+	</notification>
+	<notification name="PromptRecipientEmail">
+		Veuillez saisir une adresse e-mail valide pour le(s) destinataire(s).
+	</notification>
+	<notification name="PromptSelfEmail">
+		Veuillez saisir votre adresse e-mail.
+	</notification>
+	<notification name="PromptMissingSubjMsg">
+		Envoyer la photo avec le sujet ou le message par défaut ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ErrorProcessingSnapshot">
+		Erreur dans le traitement des données de la photo
+	</notification>
+	<notification name="ErrorEncodingSnapshot">
+		Erreur d&apos;encodage de la photo.
+	</notification>
+	<notification name="ErrorUploadingPostcard">
+		Une erreur est survenue lors du chargement du script compilé, suite au problème suivant : [REASON]
+	</notification>
+	<notification name="ErrorUploadingReportScreenshot">
+		Une erreur est survenue lors du chargement de la capture d&apos;écran destinée au rapport, suite au problème suivant : [REASON]
+	</notification>
+	<notification name="MustAgreeToLogIn">
+		Pour vous connecter à [SECOND_LIFE], vous devez accepter les Conditions d&apos;utilisation.
+	</notification>
+	<notification name="CouldNotPutOnOutfit">
+		Impossible de mettre cet ensemble.
+Ce dossier ne contient pas d&apos;habits, de parties du corps ni de pièces jointes.
+	</notification>
+	<notification name="CannotWearTrash">
+		Vous ne pouvez pas porter d&apos;habits ni de parties du corps se trouvant dans la corbeille.
+	</notification>
+	<notification name="CannotWearInfoNotComplete">
+		Vous ne pouvez pas porter cet article car il n&apos;a pas encore été chargé. Veuillez réessayer dans une minute.
+	</notification>
+	<notification name="MustHaveAccountToLogIn">
+		Oups! Vous avez oublié de fournir certaines informations.
+Vous devez saisir le nom et le prénom de votre avatar.
+
+Pour entrer dans [SECOND_LIFE], vous devez avoir un compte. Voulez-vous en créer un maintenant ?
+		<url name="url">
+			http://join.secondlife.com/
+		</url>
+		<usetemplate name="okcancelbuttons" notext="Réessayer" yestext="Créer un compte"/>
+	</notification>
+	<notification name="AddClassified">
+		Les petites annonces sont publiées à l&apos;onglet Petites annonces de la section Recherche pendant une semaine.
+Rédigez votre annonce, puis cliquez sur Publier pour l&apos;ajouter à la liste des annonces.
+Au moment de cliquer sur Publier, vous serez invité à payer des frais.
+Plus vous payez cher, plus votre annonce est visible dans la liste ainsi que dans les résultats de recherche de mots-clés.
+		<usetemplate ignoretext="Comment ajouter une nouvelle petite annonce" name="okcancelignore" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="DeleteClassified">
+		Supprimer l&apos;annonce [NAME] ?
+Une fois payés, les frais ne sont pas remboursables.
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ClassifiedSave">
+		Enregistrer les changements dans l&apos;annonce [NAME] ?
+		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/>
+	</notification>
+	<notification name="DeleteAvatarPick">
+		Supprimer le favori [PICK] ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="PromptGoToEventsPage">
+		Aller à la page web de [SECOND_LIFE] réservée aux événements ?
+		<url name="url">
+			http://secondlife.com/events/
+		</url>
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="SelectProposalToView">
+		Veuillez sélectionner une proposition.
+	</notification>
+	<notification name="SelectHistoryItemToView">
+		Veuillez sélectionner un historique.
+	</notification>
+	<notification name="ResetShowNextTimeDialogs">
+		Souhaitez-vous réactiver tous les pop-ups que vous aviez désactivés ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="SkipShowNextTimeDialogs">
+		Voulez-vous désactiver tous les pop-ups qui peuvent être évités ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="CacheWillClear">
+		Le cache sera vidé après le redémarrage de [APP_NAME].
+	</notification>
+	<notification name="CacheWillBeMoved">
+		Le cache sera déplacé après le redémarrage de [APP_NAME].
+Remarque : cela videra le cache.
+	</notification>
+	<notification name="ChangeConnectionPort">
+		Les paramètres du port prendront effet après le redémarrage de [APP_NAME].
+	</notification>
+	<notification name="ChangeSkin">
+		Le nouveau thème apparaîtra après le redémarrage de [APP_NAME].
+	</notification>
+	<notification name="GoToAuctionPage">
+		Aller à la page web de [SECOND_LIFE] pour voir le détail des enchères ou enchérir ?
+		<url name="url">
+			http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
+		</url>
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="SaveChanges">
+		Enregistrer les changements ?
+		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/>
+	</notification>
+	<notification name="GestureSaveFailedTooManySteps">
+		L&apos;enregistrement du geste a échoué.
+Il y a trop d&apos;étapes dans ce geste.
+Essayez d&apos;en supprimer quelques-unes.
+	</notification>
+	<notification name="GestureSaveFailedTryAgain">
+		L&apos;enregistrement du geste a échoué. Veuillez réessayer dans une minute.
+	</notification>
+	<notification name="GestureSaveFailedObjectNotFound">
+		Le geste n&apos;a pas pu être enregistré car l&apos;objet ou l&apos;inventaire de l&apos;objet associé n&apos;a pas été trouvé.
+L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
+	</notification>
+	<notification name="GestureSaveFailedReason">
+		Une erreur est survenue lors de l&apos;enregistrement du geste, suite au problème suivant : [REASON]. Essayez d&apos;enregistrer votre geste ultérieurement.
+	</notification>
+	<notification name="SaveNotecardFailObjectNotFound">
+		La note n&apos;a pas pu être enregistrée car l&apos;objet ou l&apos;inventaire de l&apos;objet associé n&apos;a pas été trouvé.
+L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
+	</notification>
+	<notification name="SaveNotecardFailReason">
+		Une erreur est survenue lors de l&apos;enregistrement de la note, suite au problème suivant : [REASON]. Essayez d&apos;enregistrer votre note ultérieurement.
+	</notification>
+	<notification name="ScriptCannotUndo">
+		Impossible d&apos;annuler tous les changements dans votre version du script.
+Souhaitez-vous charger la dernière version enregistrée sur le serveur ?
+(**Attention** Cette opération est irréversible.)
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="SaveScriptFailReason">
+		Une erreur est survenue lors de l&apos;enregistrement du script, suite au problème suivant : [REASON]. Essayez d&apos;enregistrer votre script ultérieurement.
+	</notification>
+	<notification name="SaveScriptFailObjectNotFound">
+		Impossible d&apos;enregistrer le script car l&apos;objet qui le contient est introuvable.
+L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
+	</notification>
+	<notification name="SaveBytecodeFailReason">
+		Une erreur est survenue lors de l&apos;enregistrement du script compilé, suite au problème suivant : [REASON]. Essayez d&apos;enregistrer votre script ultérieurement.
+	</notification>
+	<notification name="StartRegionEmpty">
+		Vous n&apos;avez pas défini de région de départ. 
+Veuillez saisir le nom de la région dans la case Lieu de départ, ou choisissez Dernier emplacement ou Domicile comme Lieu de départ.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="CouldNotStartStopScript">
+		Impossible de lancer ou d&apos;arrêter le script car l&apos;objet qui le contient est introuvable.
+L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
+	</notification>
+	<notification name="CannotDownloadFile">
+		Impossible de télécharger le fichier
+	</notification>
+	<notification name="CannotWriteFile">
+		Impossible d&apos;écrire le fichier [[FILE]]
+	</notification>
+	<notification name="UnsupportedHardware">
+		Avertissement : vous n&apos;avez pas la configuration système requise pour utiliser [APP_NAME]. Si vous continuez à utiliser [APP_NAME], votre performance risque d&apos;être moindre. Malheureusement, la section [SUPPORT_SITE] n&apos;offre aucune aide pour les problèmes de configuration système.
+
+MINSPECS
+Voulez-vous visiter [_URL] pour plus d&apos;informations ?
+		<url name="url" option="0">
+			http://secondlife.com/support/sysreqs.php?lang=fr
+		</url>
+		<usetemplate ignoretext="Mon matériel n&apos;est pas pris en charge" name="okcancelignore" notext="Non" yestext="Oui"/>
+	</notification>
+	<notification name="UnknownGPU">
+		Votre système contient une carte graphique que nous ne connaissons pas actuellement.
+Cela est souvent le cas avec le nouveau materiel qui n&apos;a pas encore été testé avec [APP_NAME].  Vous pourrez probablement utiliser [APP_NAME] sans problème, mais vous devrez peut-être ajuster les paramètres de vos graphiques.
+(Préférences &gt; Graphiques).
+		<form name="form">
+			<ignore name="ignore" text="Ma carte graphique ne peut être identifiée"/>
+		</form>
+	</notification>
+	<notification name="DisplaySettingsNoShaders">
+		[APP_NAME] a planté lors de l&apos;initialisation des drivers graphiques.
+La qualité des graphiques sera paramétrée sur Faible pour éviter certaines erreurs de driver fréquentes.
+Certaines fonctionnalités graphiques seront donc désactivées.
+Nous vous recommandons de mettre à jour les drivers de votre carte graphique.
+La qualité des graphiques peut être augmentée à la section Préférences &gt; Graphiques
+	</notification>
+	<notification name="RegionNoTerraforming">
+		Le terraformage est interdit dans la région [REGION].
+	</notification>
+	<notification name="CannotCopyWarning">
+		Vous n&apos;êtes pas autorisé à copier cet objet et il disparaîtra de votre inventaire si vous le donnez. Souhaitez-vous vraiment offrir cet objet ?
+		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
+	</notification>
+	<notification name="CannotGiveItem">
+		Impossible de donner l&apos;objet de l&apos;inventaire.
+	</notification>
+	<notification name="TransactionCancelled">
+		Transaction annulée.
+	</notification>
+	<notification name="TooManyItems">
+		Impossible de donner plus de 42 objets au cours d&apos;un seul transfert d&apos;inventaire.
+	</notification>
+	<notification name="NoItems">
+		Vous n&apos;êtes pas autorisé à transférer les objets sélectionnés.
+	</notification>
+	<notification name="CannotCopyCountItems">
+		Vous n&apos;êtes pas autorisé à copier [COUNT] des objets sélectionnés. Ces objets disparaîtront de votre inventaire.
+Souhaitez-vous vraiment donner ces objets ?
+		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
+	</notification>
+	<notification name="CannotGiveCategory">
+		Vous n&apos;êtes pas autorisé à transférer le dossier sélectionné.
+	</notification>
+	<notification name="FreezeAvatar">
+		Geler cet avatar ?
+Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le Monde.
+		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Dégeler" yestext="Geler"/>
+	</notification>
+	<notification name="FreezeAvatarFullname">
+		Geler [AVATAR_NAME] ?
+Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le Monde.
+		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Dégeler" yestext="Geler"/>
+	</notification>
+	<notification name="EjectAvatarFullname">
+		Expulser [AVATAR_NAME] de votre terrain ?
+		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Expulser et bannir" yestext="Expulser"/>
+	</notification>
+	<notification name="EjectAvatarNoBan">
+		Expulser cet avatar de votre terrain ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Expulser"/>
+	</notification>
+	<notification name="EjectAvatarFullnameNoBan">
+		Expulser [AVATAR_NAME] de votre terrain ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Expulser"/>
+	</notification>
+	<notification name="AcquireErrorTooManyObjects">
+		Erreur d&apos;acquisition : trop d&apos;objets sélectionnés.
+	</notification>
+	<notification name="AcquireErrorObjectSpan">
+		Erreur d&apos;acquisition : les objets sont répartis dans plus d&apos;une région.
+Veuillez mettre tous les objets que vous souhaitez acquérir dans la même région.
+	</notification>
+	<notification name="PromptGoToCurrencyPage">
+		[EXTRA]
+
+Aller sur [_URL] pour obtenir des informations sur l&apos;achat de L$ ?
+		<url name="url">
+			http://secondlife.com/app/currency/
+		</url>
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="UnableToLinkObjects">
+		Impossible de lier ces [COUNT] objets.
+Vous pouvez lier un maximum de [MAX] objets.
+	</notification>
+	<notification name="CannotLinkIncompleteSet">
+		Vous ne pouvez lier que des ensembles d&apos;objets complets et vous devez choisir un minimum de deux objets.
+	</notification>
+	<notification name="CannotLinkModify">
+		Impossible de lier car vous n&apos;avez pas le droit de modifier tous les objets.
+
+Assurez-vous que vous êtes le propriétaire de tous les objets et qu&apos;aucun d&apos;eux n&apos;est verrouillé.
+	</notification>
+	<notification name="CannotLinkDifferentOwners">
+		Impossible de lier car les objets n&apos;ont pas tous le même propriétaire.
+
+Assurez-vous que vous êtes le propriétaire de tous les objets sélectionnés.
+	</notification>
+	<notification name="NoFileExtension">
+		Pas d&apos;extension pour le fichier suivant : &apos;[FILE]&apos;
+
+Assurez-vous que le fichier a l&apos;extension correcte.
+	</notification>
+	<notification name="InvalidFileExtension">
+		Extension de fichier [EXTENSION] invalide
+[VALIDS] attendu
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="CannotUploadSoundFile">
+		Impossible de lire le fichier son chargé :
+[FILE]
+	</notification>
+	<notification name="SoundFileNotRIFF">
+		Il semble que le fichier ne soit pas un fichier RIFF WAVE :
+[FILE]
+	</notification>
+	<notification name="SoundFileNotPCM">
+		Il semble que le fichier ne soit pas un fichier audio PCM WAVE :
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidChannelCount">
+		Le fichier contient un nombre de canaux invalide (doit être mono ou stéréo) :
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidSampleRate">
+		Le fichier ne semble pas être pris en charge (doit être 44,1 k) :
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidWordSize">
+		Le fichier ne semble pas être pris en charge (doit faire 8 ou 16 bit) :
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidHeader">
+		Impossible de trouver les données dans l&apos;en-tête WAV :
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidTooLong">
+		Le fichier audio est trop long (10 secondes maximum) :
+[FILE]
+	</notification>
+	<notification name="ProblemWithFile">
+		Problème avec le fichier [FILE] :
+
+[ERROR]
+	</notification>
+	<notification name="CannotOpenTemporarySoundFile">
+		Impossible d&apos;ouvrir le fichier son compressé temporaire : [FILE]
+	</notification>
+	<notification name="UnknownVorbisEncodeFailure">
+		Échec d&apos;encodage Vorbis inconnu sur : [FILE]
+	</notification>
+	<notification name="CannotEncodeFile">
+		Impossible d&apos;encoder le fichier : [FILE]
+	</notification>
+	<notification name="CorruptResourceFile">
+		Fichier ressource corrompu : [FILE]
+	</notification>
+	<notification name="UnknownResourceFileVersion">
+		Version de fichier ressource Linden inconnu : [FILE]
+	</notification>
+	<notification name="UnableToCreateOutputFile">
+		Impossible de créer le fichier de sortie : [FILE]
+	</notification>
+	<notification name="DoNotSupportBulkAnimationUpload">
+		Actuellement, APP_NAME] ne prend pas en charge le chargement de lots de fichiers d&apos;animation.
+	</notification>
+	<notification name="CannotUploadReason">
+		Impossible de charger [FILE] suite au problème suivant : [REASON]
+Veuillez réessayer ultérieurement.
+	</notification>
+	<notification name="LandmarkCreated">
+		Vous avez ajouté &quot;[LANDMARK_NAME]&quot; à votre dossier [FOLDER_NAME].
+	</notification>
+	<notification name="CannotCreateLandmarkNotOwner">
+		Vous ne pouvez pas créer de repère ici car le propriétaire du terrain ne l&apos;autorise pas.
+	</notification>
+	<notification name="CannotRecompileSelectObjectsNoScripts">
+		Impossible d&apos;effectuer les recompilations.
+Sélectionnez un objet avec un script.
+	</notification>
+	<notification name="CannotRecompileSelectObjectsNoPermission">
+		Impossible d&apos;effectuer les recompilations.
+
+Sélectionnez des objets qui ont des scripts et que vous pouvez modifier.
+	</notification>
+	<notification name="CannotResetSelectObjectsNoScripts">
+		Impossible d&apos;effectuer la réinitialisation.
+
+Veuillez sélectionner des objets avec des scripts.
+	</notification>
+	<notification name="CannotResetSelectObjectsNoPermission">
+		Impossible d&apos;effectuer la réinitialisation.
+
+Sélectionnez des objets qui ont des scripts et que vous pouvez modifier.
+	</notification>
+	<notification name="CannotSetRunningSelectObjectsNoScripts">
+		Impossible de définir les scripts sur « exécution ».
+
+Veuillez sélectionner des objets avec des scripts.
+	</notification>
+	<notification name="CannotSetRunningNotSelectObjectsNoScripts">
+		Impossible de définir les scripts sur « non-exécution ».
+
+Veuillez sélectionner des objets avec des scripts.
+	</notification>
+	<notification name="NoFrontmostFloater">
+		Aucun floater frontmost à sauvegarder.
+	</notification>
+	<notification name="SeachFilteredOnShortWords">
+		Votre requête a été modifiée et les mots trops courts ont été supprimés.
+
+Recherche effectuée : [FINALQUERY]
+	</notification>
+	<notification name="SeachFilteredOnShortWordsEmpty">
+		Vos termes de recherche étaient trop courts et aucune recherche n&apos;a été effectuée.
+	</notification>
+	<notification name="CouldNotTeleportReason">
+		Impossible de téléporter.
+[REASON]
+	</notification>
+	<notification name="invalid_tport">
+		Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir vous téléporter.
+Si ce message persiste, veuillez consulter la page [SUPPORT_SITE].
+	</notification>
+	<notification name="invalid_region_handoff">
+		Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir traverser des régions.
+Si ce message persiste, veuillez consulter la page [SUPPORT_SITE].
+	</notification>
+	<notification name="blocked_tport">
+		Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment.
+Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis reconnectez-vous pour résoudre le problème.
+	</notification>
+	<notification name="nolandmark_tport">
+		Désolé, le système n&apos;a pas réussi à localiser la destination de votre repère.
+	</notification>
+	<notification name="timeout_tport">
+		Désolé, la connexion vers votre lieu de téléportation n&apos;a pas abouti.
+Veuillez réessayer dans un moment.
+	</notification>
+	<notification name="noaccess_tport">
+		Désolé, vous n&apos;avez pas accès à cette destination.
+	</notification>
+	<notification name="missing_attach_tport">
+		Vos pieces-jointes ne sont pas encore arrivées. Attendez quelques secondes de plus ou déconnectez-vous puis reconnectez-vous avant d&apos;essayer de vous téléporter.
+	</notification>
+	<notification name="too_many_uploads_tport">
+		Le trafic vers cette région est bouché en ce moment. Votre téléportation ne pourra pas avoir lieu immédiatement. Veuillez réessayer dans quelques minutes ou bien aller dans une zone moins fréquentée.
+	</notification>
+	<notification name="expired_tport">
+		Désolé, votre demande de téléportation n&apos;a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes.
+	</notification>
+	<notification name="expired_region_handoff">
+		Désolé, votre demande pour passer dans une autre région n&apos;a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes.
+	</notification>
+	<notification name="no_host">
+		Impossible de trouver la destination de la téléportation. Il est possible que cette destination soit temporairement indisponible ou qu&apos;elle n&apos;existe plus. Veuillez réessayer dans quelques minutes.
+	</notification>
+	<notification name="no_inventory_host">
+		L&apos;inventaire est temporairement indisponible.
+	</notification>
+	<notification name="CannotSetLandOwnerNothingSelected">
+		Impossible de définir le propriétaire foncier :
+aucune parcelle sélectionnée.
+	</notification>
+	<notification name="CannotSetLandOwnerMultipleRegions">
+		Impossible de définir un propriétaire car la sélection couvre plusieurs régions. Veuillez sélectionner une zone plus petite et réessayer.
+	</notification>
+	<notification name="ForceOwnerAuctionWarning">
+		Cette parcelle est mise aux enchères. Définir un propriétaire annulerait les enchères, ce qui pourrait être gênant pour certains résidents si ces dernières ont commencé. Souhaitez-vous définir un propriétaire ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="CannotContentifyNothingSelected">
+		Problème :
+Aucune parcelle sélectionnée.
+	</notification>
+	<notification name="CannotContentifyNoRegion">
+		Problème :
+Aucune région sélectionnée.
+	</notification>
+	<notification name="CannotReleaseLandNothingSelected">
+		Impossible d&apos;abandonner le terrain :
+aucune parcelle sélectionnée.
+	</notification>
+	<notification name="CannotReleaseLandNoRegion">
+		Impossible d&apos;abandonner le terrain :
+la région est introuvable.
+	</notification>
+	<notification name="CannotBuyLandNothingSelected">
+		Impossible d&apos;acheter le terrain :
+aucune parcelle sélectionnée.
+	</notification>
+	<notification name="CannotBuyLandNoRegion">
+		Impossible d&apos;acheter le terrain :
+la région dans laquelle il est situé est introuvable.
+	</notification>
+	<notification name="CannotCloseFloaterBuyLand">
+		Vous ne pouvez pas fermer la fenêtre Acheter le terrain avant que [APP_NAME] n&apos;estime le montant de cette transaction.
+	</notification>
+	<notification name="CannotDeedLandNothingSelected">
+		Cession du terrain impossible :
+aucune parcelle sélectionnée.
+	</notification>
+	<notification name="CannotDeedLandNoGroup">
+		Cession du terrain impossible :
+aucun groupe sélectionné.
+	</notification>
+	<notification name="CannotDeedLandNoRegion">
+		Cession du terrain impossible :
+la région dans laquelle il est situé est introuvable.
+	</notification>
+	<notification name="CannotDeedLandMultipleSelected">
+		Cession du terrain impossible :
+plusieurs parcelles sélectionnées.
+
+Essayez de ne sélectionner qu&apos;une seule parcelle.
+	</notification>
+	<notification name="ParcelCanPlayMedia">
+		Cette parcelle propose des flux média.
+Pour jouer des flux média, il faut avoir une connexion internet rapide.
+
+Jouer les flux média lorsqu&apos;ils sont disponibles ?
+(Vous pourrez modifier cette option ultérieurement sous Préférences &gt; Audio et vidéo.)
+		<usetemplate name="okcancelbuttons" notext="Désactiver" yestext="Jouer le média"/>
+	</notification>
+	<notification name="CannotDeedLandWaitingForServer">
+		Cession du terrain impossible :
+rapport de propriété sur le point d&apos;être envoyé par le serveur.
+
+Merci de réessayer.
+	</notification>
+	<notification name="CannotDeedLandNoTransfer">
+		Cession du terrain impossible :
+la cession de terrain est interdite dans la région [REGION].
+	</notification>
+	<notification name="CannotReleaseLandWatingForServer">
+		Impossible d&apos;abandonner le terrain :
+mise à jour des informations sur la parcelle sur le point d&apos;être envoyée par le serveur.
+
+Veuillez réessayer dans quelques secondes.
+	</notification>
+	<notification name="CannotReleaseLandSelected">
+		Impossible d&apos;abandonner le terrain :
+vous n&apos;êtes pas le propriétaire des parcelles sélectionnées.
+
+Veuillez sélectionner une seule parcelle.
+	</notification>
+	<notification name="CannotReleaseLandDontOwn">
+		Impossible d&apos;abandonner le terrain :
+vous n&apos;avez pas le droit de libérer cette parcelle.
+Les parcelles qui vous appartiennent sont en vert.
+	</notification>
+	<notification name="CannotReleaseLandRegionNotFound">
+		Impossible d&apos;abandonner le terrain :
+la région dans laquelle il est situé est introuvable.
+	</notification>
+	<notification name="CannotReleaseLandNoTransfer">
+		Impossible d&apos;abandonner le terrain :
+le transfert de terrain est interdit dans la région [REGION].
+	</notification>
+	<notification name="CannotReleaseLandPartialSelection">
+		Impossible d&apos;abandonner le terrain :
+vous devez sélectionner une parcelle entière pour la libérer.
+
+Sélectionnez toute la parcelle ou divisez-la d&apos;abord.
+	</notification>
+	<notification name="ReleaseLandWarning">
+		Vous vous apprêtez à libérer [AREA] m² de terrain.
+Si vous libérez cette parcelle, elle sera supprimée de votre patrimoine, mais vous ne recevrez pas de L$.
+
+Libérer ce terrain ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="CannotDivideLandNothingSelected">
+		Division du terrain impossible :
+
+aucune parcelle sélectionnée.
+	</notification>
+	<notification name="CannotDivideLandPartialSelection">
+		Division du terrain impossible :
+
+Toute la parcelle est sélectionnée.
+Sélectionnez une partie de la parcelle uniquement.
+	</notification>
+	<notification name="LandDivideWarning">
+		Si vous divisez ce terrain, cette parcelle sera partagée en deux et chaque parcelle pourra avoir ses propres paramètres. Après cette opération, certains paramètres reviendront aux paramètres par défaut.
+
+Diviser le terrain ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="CannotDivideLandNoRegion">
+		Division du terrain impossible :
+la région dans laquelle il est situé est introuvable.
+	</notification>
+	<notification name="CannotJoinLandNoRegion">
+		Impossible de fusionner le terrain :
+la région dans laquelle il est situé est introuvable.
+	</notification>
+	<notification name="CannotJoinLandNothingSelected">
+		Impossible de fusionner le terrain :
+aucune parcelle sélectionnée.
+	</notification>
+	<notification name="CannotJoinLandEntireParcelSelected">
+		Impossible de fusionner le terrain :
+vous avez sélectionné une seule parcelle.
+
+Sélectionnez le terrain sur les deux parcelles.
+	</notification>
+	<notification name="CannotJoinLandSelection">
+		Impossible de fusionner le terrain :
+vous devez sélectionner au moins deux parcelles.
+
+Sélectionnez le terrain sur les deux parcelles.
+	</notification>
+	<notification name="JoinLandWarning">
+		En fusionnant ce terrain, vous créerez une grande parcelle composée de toutes les parcelles se trouvant dans le rectangle sélectionné.
+Vous devrez réinitialiser le nom et les options de la nouvelle parcelle.
+
+Fusionner le terrain ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmNotecardSave">
+		Cette note doit être sauvegardée avant que l&apos;objet ne puisse être copié ou visualisé. Enregistrer la note ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmItemCopy">
+		Copier cet objet dans votre inventaire ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Copier"/>
+	</notification>
+	<notification name="ResolutionSwitchFail">
+		Échec du changement de résolution (à [RESX], de [RESY])
+	</notification>
+	<notification name="ErrorUndefinedGrasses">
+		Erreur : herbes non identifiées : [SPECIES]
+	</notification>
+	<notification name="ErrorUndefinedTrees">
+		Erreur : arbres non identifiés : [SPECIES]
+	</notification>
+	<notification name="CannotSaveWearableOutOfSpace">
+		Impossible de sauvegarder [NAME]. Pour pouvoir sauvegarder ce fichier, vous devez d&apos;abord libérer de la mémoire sur votre ordinateur.
+	</notification>
+	<notification name="CannotSaveToAssetStore">
+		Impossible de sauvegarder le fichier [NAME] dans la base de données centrale.
+Cette erreur est généralement temporaire. Veuillez éditer et sauvegarder l&apos;élément endossable à nouveau d&apos;ici quelques minutes.
+	</notification>
+	<notification name="YouHaveBeenLoggedOut">
+		Vous avez été déconnecté(e) de [SECOND_LIFE] :
+            [MESSAGE]
+Vous pouvez afficher vos messages instantanés et votre chat en cliquant sur Afficher IM et chat. Sinon, cliquez sur Quitter pour quitter immédiatement [APP_NAME].
+		<usetemplate name="okcancelbuttons" notext="Quitter" yestext="Afficher IM et chat"/>
+	</notification>
+	<notification name="OnlyOfficerCanBuyLand">
+		Impossible d&apos;acheter du terrain pour le groupe :
+Vous n&apos;avez pas le droit d&apos;acheter de terrain pour votre groupe.
+	</notification>
+	<notification label="Devenir amis" name="AddFriend">
+		Vous pouvez suivre les déplacements de vos amis sur la carte et voir lorsqu&apos;ils se connectent.
+
+Proposer à [NAME] de devenir votre ami(e) ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification label="Devenir amis" name="AddFriendWithMessage">
+		Vous pouvez suivre les déplacements de vos amis sur la carte et voir lorsqu&apos;ils se connectent.
+
+Proposer à [NAME] de devenir votre ami(e) ?
+		<form name="form">
+			<input name="message">
+				Voulez-vous être mon ami(e) ?
+			</input>
+			<button name="Offer" text="OK"/>
+			<button name="Cancel" text="Annuler"/>
+		</form>
+	</notification>
+	<notification name="RemoveFromFriends">
+		Voulez-vous supprimer [FIRST_NAME] [LAST_NAME] de votre liste d&apos;amis ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="RemoveMultipleFromFriends">
+		Voulez-vous supprimer plusieurs résidents de votre liste d&apos;amis ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="GodDeleteAllScriptedPublicObjectsByUser">
+		Êtes-vous certain de vouloir supprimer tous les objets scriptés appartenant à ** [AVATAR_NAME] ** sur tous les terrains des autres résidents dans cette région ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="GodDeleteAllScriptedObjectsByUser">
+		Êtes-vous certain de vouloir supprimer tous les objets scriptés appartenant à ** [AVATAR_NAME] ** sur tous les terrains de cette région ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="GodDeleteAllObjectsByUser">
+		Êtes-vous certain de vouloir supprimer tous les objets (scriptés ou pas) appartenant à ** [AVATAR_NAME] ** sur tous les terrains de cette région ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="BlankClassifiedName">
+		Vous devez choisir un nom pour votre petite annonce.
+	</notification>
+	<notification name="MinClassifiedPrice">
+		Le coût de l&apos;annonce doit être de [MIN_PRICE] L$ minimum.
+
+Veuillez saisir un montant plus élevé.
+	</notification>
+	<notification name="ConfirmObjectDeleteLock">
+		Au moins un des objets que vous avez sélectionnés est verrouillé.
+
+Êtes-vous certain de vouloir supprimer ces objets ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteNoCopy">
+		Au moins un des objets que vous avez sélectionnés n&apos;est pas copiable.
+
+Êtes-vous certain de vouloir supprimer ces objets ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteNoOwn">
+		Au moins un des objets que vous avez sélectionnés ne vous appartient pas.
+
+Êtes-vous certain de vouloir supprimer ces objets ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteLockNoCopy">
+		Au moins un des objets est verrouillé.
+Au moins un des objets n&apos;est pas copiable.
+
+Êtes-vous certain de vouloir supprimer ces objets ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteLockNoOwn">
+		Au moins un des objets est verrouillé.
+Au moins un des objets ne vous appartient pas.
+
+Êtes-vous certain de vouloir supprimer ces objets ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteNoCopyNoOwn">
+		Au moins un des objets n&apos;est pas copiable.
+Au moins un des objets ne vous appartient pas.
+
+Êtes-vous certain de vouloir supprimer ces objets ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
+		Au moins un des objets est verrouillé.
+Au moins un des objets n&apos;est pas copiable.
+Au moins un des objets ne vous appartient pas.
+
+Êtes-vous certain de vouloir supprimer ces objets ?
+		<usetemplate name="okcancelbuttons" notext="annuler" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectTakeLock">
+		Au moins un des objets est verrouillé.
+
+Êtes-vous certain de vouloir prendre ces objets ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectTakeNoOwn">
+		Vous n&apos;êtes pas le propriétaire de tous les objets que vous prenez.
+Si vous continuez, les droits accordés au prochain propriétaire seront activés et vous risquez de ne plus pouvoir modifier ou copier les objets.
+
+Êtes-vous certain de vouloir prendre ces objets ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectTakeLockNoOwn">
+		Au moins un des objets est verrouillé.
+Vous n&apos;êtes pas le propriétaire de tous les objets que vous prenez.
+Si vous continuez, les droits accordés au prochain propriétaire seront activés et vous risquez de ne plus pouvoir modifier ou copier les objets.
+Par contre, vous pouvez prendre les objets sélectionnés.
+
+Êtes-vous certain de vouloir prendre ces objets ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="CantBuyLandAcrossMultipleRegions">
+		Impossible d&apos;acheter le terrain car la sélection couvre plusieurs régions.
+
+Veuillez sélectionner une zone plus petite et réessayer.
+	</notification>
+	<notification name="DeedLandToGroup">
+		Si vous cédez ce terrain, le groupe devra avoir les moyens de le prendre en charge.
+Le prix de la vente du terrain n&apos;est pas remboursé par le propriétaire. Si la parcelle que vous cédez se vend, le prix de la vente sera divisé en parts égales parmi les membres du groupe.
+
+Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="DeedLandToGroupWithContribution">
+		Si vous cédez ce terrain, le groupe devra avoir les moyens de le prendre en charge.
+La cession incluera une contribution de terrain simultanée au groupe de [FIRST_NAME] [LAST_NAME].
+Le prix de la vente du terrain n&apos;est pas remboursé par le propriétaire. Si la parcelle que vous cédez se vend, le prix de la vente sera divisé en parts égales parmi les membres du groupe.
+
+Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="DisplaySetToSafe">
+		Les paramètres d&apos;affichage sont au niveau le plus sûr, comme vous l&apos;aviez indiqué.
+	</notification>
+	<notification name="DisplaySetToRecommended">
+		Vos paramètres d&apos;affichage ont été réglés avec une marge de sécurité en fonction de votre configuration système.
+	</notification>
+	<notification name="ErrorMessage">
+		[ERROR_MESSAGE]
+	</notification>
+	<notification name="AvatarMovedDesired">
+		La destination que vous avez choisie n&apos;est pas disponible actuellement.
+Vous avez été téléporté vers une région voisine.
+	</notification>
+	<notification name="AvatarMovedLast">
+		Votre dernière destination n&apos;est pas disponible actuellement.
+Vous avez été téléporté vers une région voisine.
+	</notification>
+	<notification name="AvatarMovedHome">
+		La destination que vous avez choisie n&apos;est pas disponible actuellement.
+Vous avez été téléporté vers une région voisine.
+Nous vous conseillons de définir votre domicile ailleurs.
+	</notification>
+	<notification name="ClothingLoading">
+		Vos vêtements sont en cours de téléchargement.
+Vous pouvez utiliser [SECOND_LIFE] normalement, les autres résidents vous voient correctement.
+		<form name="form">
+			<ignore name="ignore" text="Vos habits prennent du temps à télécharger"/>
+		</form>
+	</notification>
+	<notification name="FirstRun">
+		L&apos;installation de [APP_NAME] est terminée.
+
+S&apos;il s&apos;agit de la première fois que vous utilisez [SECOND_LIFE], vous devrez créer un compte avant de pouvoir vous connecter.
+Retourner sur www.secondlife.com pour créer un nouveau compte ?
+		<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Nouveau compte..."/>
+	</notification>
+	<notification name="LoginPacketNeverReceived">
+		Nous avons des difficultés à vous connecter. Il y a peut-être un problème avec votre connexion Internet ou la [SECOND_LIFE_GRID].
+
+Vérifiez votre connextion Internet et réessayez dans quelques minutes, cliquez sur Aide pour consulter la page [SUPPORT_SITE] ou bien sur Téléporter pour essayer d&apos;aller chez vous.
+		<url name="url">
+			http://secondlife.com/support/
+		</url>
+		<form name="form">
+			<button name="OK" text="OK"/>
+			<button name="Help" text="Aide"/>
+			<button name="Teleport" text="Téléporter"/>
+		</form>
+	</notification>
+	<notification name="WelcomeChooseSex">
+		Votre personnage va apparaître dans un moment.
+
+Pour marcher, utilisez les flèches de direction.
+Appuyez sur F1 pour obtenir de l&apos;aide ou en savoir plus sur [SECOND_LIFE].
+Choisissez un avatar homme ou femme.
+Vous pourrez revenir sur votre décision plus tard.
+		<usetemplate name="okcancelbuttons" notext="Femme" yestext="Homme"/>
+	</notification>
+	<notification name="NotEnoughCurrency">
+		[NAME] [PRICE] L$ Vous n&apos;avez pas suffisamment de L$ pour faire cela.
+	</notification>
+	<notification name="GrantedModifyRights">
+		[FIRST_NAME] [LAST_NAME] vous avez donné la permission de modifier ses objets.
+	</notification>
+	<notification name="RevokedModifyRights">
+		Vous n&apos;avez plus le droit de modifier les objets de [FIRST_NAME] [LAST_NAME].
+	</notification>
+	<notification name="FlushMapVisibilityCaches">
+		Cela videra le cache cartographique de cette région.
+Cela n&apos;est vraiment utile que pour faire du débugage.
+(En production, attendez 5 minutes. Les cartes seront mises à jour après reconnexion.)
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="BuyOneObjectOnly">
+		Impossible d&apos;acheter plus d&apos;un objet à  la fois.  Veuillez ne sélectionner qu&apos;un seul objet.
+	</notification>
+	<notification name="OnlyCopyContentsOfSingleItem">
+		Impossible de copier les contenus de plus d&apos;un objet à la fois.
+Veuillez ne sélectionner qu&apos;un seul objet.
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="KickUsersFromRegion">
+		Téléporter tous les résidents de cette région chez eux ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="EstateObjectReturn">
+		Etes-vous certain de vouloir renvoyer les objets appartenant à [USER_NAME] ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="InvalidTerrainBitDepth">
+		Impossible de definir les textures de la région :
+La texture du terrain [TEXTURE_NUM] a une profondeur invalide ([TEXTURE_BIT_DEPTH]).
+
+Remplacer la texture [TEXTURE_NUM] avec une image de 24 bits, 512 X 512, ou plus petite, puis cliquez à nouveau sur Appliquer.
+	</notification>
+	<notification name="InvalidTerrainSize">
+		Impossible de definir les textures de la région :
+La texture du terrain [TEXTURE_NUM] est trop volumineuse ([TEXTURE_SIZE_X] X [TEXTURE_SIZE_Y]).
+
+Remplacer la texture [TEXTURE_NUM] avec une image de 24 bits, 512 X 512, ou plus petite, puis cliquez à nouveau sur Appliquer.
+	</notification>
+	<notification name="RawUploadStarted">
+		Le chargement a commencé. Cela va prendre une à deux minutes,
+suivant votre vitesse de connexion.
+	</notification>
+	<notification name="ConfirmBakeTerrain">
+		Etes-vous sûr(e) de vouloir figer le relief actuel, en faire le point central des limites d&apos;élévation/abaissement de relief et la valeur par défaut du bouton Annuler modification ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="MaxAllowedAgentOnRegion">
+		Vous ne pouvez pas autoriser plus de [MAX_AGENTS] résidents.
+	</notification>
+	<notification name="MaxBannedAgentsOnRegion">
+		Vous ne pouvez pas bannir plus de [MAX_BANNED] résidents.
+	</notification>
+	<notification name="MaxAgentOnRegionBatch">
+		Echec lors de la tentative d&apos;ajout de [NUM_ADDED] agents :
+Dépasse la limite fixée à [MAX_AGENTS] [LIST_TYPE] de [NUM_EXCESS].
+	</notification>
+	<notification name="MaxAllowedGroupsOnRegion">
+		Vous ne pouvez pas avoir plus que [MAX_GROUPS] groupes autorisés.
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Figer"/>
+	</notification>
+	<notification name="MaxManagersOnRegion">
+		Vous ne pouvez avoir que [MAX_MANAGER] gérants de domaine.
+	</notification>
+	<notification name="OwnerCanNotBeDenied">
+		Impossible d&apos;ajouter le propriétaire du domaine à la liste des résidents bannis.
+	</notification>
+	<notification name="CanNotChangeAppearanceUntilLoaded">
+		Impossible de changer d&apos;apparence jusqu&apos;à ce que les habits et la silhouette soient chargés.
+	</notification>
+	<notification name="ClassifiedMustBeAlphanumeric">
+		Le nom de votre petite annonce doit commencer par un chiffre ou une lettre (A à Z). La ponctuation n&apos;est pas autorisée.
+	</notification>
+	<notification name="CantSetBuyObject">
+		Cet objet n&apos;est pas à vendre.
+Veuillez choisir un objet à vendre et réessayer.
+	</notification>
+	<notification name="FinishedRawDownload">
+		Chargement du fichier de terrain raw effectué vers :
+[DOWNLOAD_PATH].
+	</notification>
+	<notification name="DownloadWindowsMandatory">
+		Une nouvelle version de [APP_NAME] est disponible.
+[MESSAGE]
+Pour utiliser [APP_NAME] vous devez télécharger cette mise à jour.
+		<usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/>
+	</notification>
+	<notification name="DownloadWindows">
+		Une mise à jour de [APP_NAME] est disponible.
+[MESSAGE]
+Cette mise à jour n&apos;est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l&apos;installer.
+		<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/>
+	</notification>
+	<notification name="DownloadWindowsReleaseForDownload">
+		Une mise à jour de [APP_NAME] est disponible.
+[MESSAGE]
+Cette mise à jour n&apos;est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l&apos;installer.
+		<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/>
+	</notification>
+	<notification name="DownloadLinuxMandatory">
+		Une nouvelle version de [APP_NAME] est disponible.
+[MESSAGE]
+Pour utiliser [APP_NAME] vous devez télécharger cette mise à jour.
+		<usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/>
+	</notification>
+	<notification name="DownloadLinux">
+		Une mise à jour de [SECOND_LIFE] est disponible.
+[MESSAGE]
+Cette mise à jour n&apos;est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l&apos;installer.
+		<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/>
+	</notification>
+	<notification name="DownloadLinuxReleaseForDownload">
+		Une mise à jour de [SECOND_LIFE] est disponible.
+[MESSAGE]
+Cette mise à jour n&apos;est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l&apos;installer.
+		<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/>
+	</notification>
+	<notification name="DownloadMacMandatory">
+		Une nouvelle version de [APP_NAME] est disponible.
+[MESSAGE]
+Pour utiliser [APP_NAME] vous devez télécharger cette mise à jour.
+
+Télécharger vers le dossier Applications ?
+		<usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/>
+	</notification>
+	<notification name="DownloadMac">
+		Une mise à jour de [APP_NAME] est disponible.
+[MESSAGE]
+Cette mise à jour n&apos;est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l&apos;installer.
+
+Télécharger vers le dossier Applications ?
+		<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/>
+	</notification>
+	<notification name="DownloadMacReleaseForDownload">
+		Une mise à jour de [APP_NAME] est disponible.
+[MESSAGE]
+Cette mise à jour n&apos;est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l&apos;installer.
+
+Télécharger vers le dossier Applications ?
+		<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/>
+	</notification>
+	<notification name="DeedObjectToGroup">
+		Si vous cédez cet objet, le groupe :
+* recevra les L$ versés pour l&apos;objet ;
+		<usetemplate ignoretext="Confimer avant que je ne cède un objet à un groupe" name="okcancelignore" notext="Annuler" yestext="Céder"/>
+	</notification>
+	<notification name="WebLaunchExternalTarget">
+		Voulez-vous ouvrir votre navigateur web système pour afficher ce contenu ?
+		<usetemplate ignoretext="Ouvrir mon navigateur pour consulter une page web" name="okcancelignore" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchJoinNow">
+		Aller sur secondlife.com pour gérer votre compte ?
+		<usetemplate ignoretext="Lancer mon navigateur pour gérer mon compte" name="okcancelignore" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchSecurityIssues">
+		Pour apprendre à signaler un problème de sécurité, consultez le Wiki de [SECOND_LIFE].
+		<usetemplate ignoretext="Lancer mon navigateur pour apprendre comment signaler un problème de sécurité" name="okcancelignore" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchQAWiki">
+		Consultez le Wiki sur l&apos;Assurance Qualité de [SECOND_LIFE].
+		<usetemplate ignoretext="Lancer mon navigateur web pour consulter la page Wiki sur l&apos;Assurance Qualité." name="okcancelignore" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchPublicIssue">
+		Pour signaler des bugs et autres problèmes, utilisez le JIRA de [SECOND_LIFE].
+		<usetemplate ignoretext="Lancer mon navigateur pour utiliser le Public Issue Tracker (JIRA)" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/>
+	</notification>
+	<notification name="WebLaunchSupportWiki">
+		Visitez le blog officiel des Lindens pour les dernières nouvelles et informations.
+		<usetemplate ignoretext="Lancer mon navigateur web pour consulter le blog" name="okcancelignore" notext="Annuler" yestext="Aller à la page"/>
+	</notification>
+	<notification name="WebLaunchLSLGuide">
+		Voulez-vous ouvrir le guide pour l&apos;écriture de scripts ?
+		<usetemplate ignoretext="Lancer mon navigateur web pour consulter le guide pour l&apos;écriture de scripts" name="okcancelignore" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchLSLWiki">
+		Voulez-vous ouvrir le portail LSL pour l&apos;écriture de scripts ?
+		<usetemplate ignoretext="Lancer mon navigateur web pour consulter le portail LSL" name="okcancelignore" notext="Annuler" yestext="Aller à la page"/>
+	</notification>
+	<notification name="ReturnToOwner">
+		Êtes-vous certain de vouloir renvoyer les objets sélectionnés à leur propriétaire ? Les objets donnés transférables seront renvoyés à leur ancien propriétaire.
+
+*Avertissement* Les objets non transférables seront supprimés !
+		<usetemplate ignoretext="Confirmer avant de rendre les objets à leurs propriétaires" name="okcancelignore" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="GroupLeaveConfirmMember">
+		Vous êtes actuellement membre du groupe [GROUP].
+Quitter le groupe ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmKick">
+		Souhaitez-vous vraiment éjecter tous les utilisateurs de la grille ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Éjecter tous"/>
+	</notification>
+	<notification name="MuteLinden">
+		Désolé, vous ne pouvez pas ignorer un Linden.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="CannotStartAuctionAlreadyForSale">
+		Vous ne pouvez pas démarrer des enchères sur une parcelle déjà en vente.  Si vous êtes certain de vouloir démarrer des enchères, mettez fin à la vente.
+	</notification>
+	<notification label="Échec de la fonction Ignorer les objets par nom" name="MuteByNameFailed">
+		Vous ignorez déjà ce résident.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="RemoveItemWarn">
+		Si vous supprimez des contenus, vous risquez d&apos;endommager l&apos;objet. Souhaitez-vous supprimer cet objet ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="CantOfferCallingCard">
+		Impossible d&apos;offrir une carte de visite actuellement. Veuillez réessayer dans un moment.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="CantOfferFriendship">
+		Impossible de proposer votre amitié actuellement. Veuillez réessayer dans un moment.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="BusyModeSet">
+		Le mode Occupé est sélectionné.
+Les chats et les messages instantanés ne s&apos;afficheront pas. Les messages instantanés génèreront la réponse en mode occupé que vous avez créée. Toutes les offres de téléportation seront refusées. Toutes les offres d&apos;inventaire iront dans la corbeille.
+		<usetemplate ignoretext="Je change mon statut en mode Occupé" name="okignore" yestext="OK"/>
+	</notification>
+	<notification name="JoinedTooManyGroupsMember">
+		Vous avez atteint le nombre de groupes maximum. Avant de pouvoir rejoindre ce groupe, vous devez en quitter un ou refuser cette offre.
+[NAME] vous invite à rejoindre un groupe.
+[INVITE]
+		<usetemplate name="okcancelbuttons" notext="Refuser" yestext="Rejoindre"/>
+	</notification>
+	<notification name="KickUser">
+		Éjecter cet utilisateur avec quel message ?
+		<form name="form">
+			<input name="message">
+				Un administrateur vous a déconnecté.
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Annuler"/>
+		</form>
+	</notification>
+	<notification name="KickAllUsers">
+		Éjecter tous les résidents actuellement en ligne avec quel message ?
+		<form name="form">
+			<input name="message">
+				Un administrateur vous a déconnecté.
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Annuler"/>
+		</form>
+	</notification>
+	<notification name="FreezeUser">
+		Geler cet utilisateur avec quel message ?
+		<form name="form">
+			<input name="message">
+				Vous avez été gelé. Vous ne pouvez ni bouger ni chatter. Un administrateur va vous envoyer un message instantané (IM).
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Annuler"/>
+		</form>
+	</notification>
+	<notification name="UnFreezeUser">
+		Dégeler cet utilisateur avec quel message ?
+		<form name="form">
+			<input name="message">
+				Vous n&apos;êtes plus gelé.
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Annuler"/>
+		</form>
+	</notification>
+	<notification name="OfferTeleport">
+		Proposez une téléportation avec le message suivant ?
+		<form name="form">
+			<input name="message">
+				On se rejoint à [REGION] ?
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Annuler"/>
+		</form>
+	</notification>
+	<notification name="OfferTeleportFromGod">
+		Demander au résident de venir vous rejoindre ?
+		<form name="form">
+			<input name="message">
+				On se rejoint à [REGION] ?
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Annuler"/>
+		</form>
+	</notification>
+	<notification name="TeleportFromLandmark">
+		Êtes-vous certain de vouloir être téléporté ?
+		<usetemplate ignoretext="Confirmer que je veux me téléporter à un repère" name="okcancelignore" notext="Annuler" yestext="Téléporter"/>
+	</notification>
+	<notification name="TeleportToPick">
+		Téléporter vers [PICK] ?
+		<usetemplate ignoretext="Confirmer que je veux me téléporter à un endroit dans mes Préférences" name="okcancelignore" notext="Annuler" yestext="Téléporter"/>
+	</notification>
+	<notification label="Envoyer un message à tout le monde dans votre domaine" name="MessageEstate">
+		Saisissez un message court qui sera envoyé à tous les résidents se trouvant actuellement sur votre domaine.
+		<form name="form">
+			<input name="message"/>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Annuler"/>
+		</form>
+	</notification>
+	<notification label="Modifier un domaine Linden" name="ChangeLindenEstate">
+		Vous vous apprêtez à modifier un domaine appartenant aux Lindens (continent, zone réservée aux ados, orientation etc.).
+
+Cela est extrêmement délicat car l&apos;expérience des résidents est en jeu. Sur le continent, cela modifiera des milliers de régions et sera difficile à digérer pour le serveur.
+
+Continuer ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification label="Modifier l&apos;accès à un domaine Linden" name="ChangeLindenAccess">
+		Vous vous apprêtez à modifier la liste d&apos;accès à un domaine appartenant aux Linden (continent, zone réservée aux ados, orientation etc.).
+
+Cette action est délicate et ne doit être effectuée que pour appeler le hack autorisant des objets/L$ à être transférés à l&apos;intérieur/extérieur de la grille.
+Cette action modifiera des milliers de régions et sera difficile à digérer pour le serveur.
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification label="Choisir le domaine" name="EstateAllowedAgentAdd">
+		Ajouter à la liste des résidents autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ?
+		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
+	</notification>
+	<notification label="Choisir le domaine" name="EstateAllowedAgentRemove">
+		Supprimer de la liste des résidents autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ?
+		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
+	</notification>
+	<notification label="Choisir le domaine" name="EstateAllowedGroupAdd">
+		Ajouter à la liste des groupes autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ?
+		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
+	</notification>
+	<notification label="Choisir le domaine" name="EstateAllowedGroupRemove">
+		Supprimer de la liste des groupes autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ?
+		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
+	</notification>
+	<notification label="Choisir le domaine" name="EstateBannedAgentAdd">
+		Refuser l&apos;accès à ce domaine uniquement ou à [ALL_ESTATES] ?
+		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
+	</notification>
+	<notification label="Choisir le domaine" name="EstateBannedAgentRemove">
+		Supprimer ce résident de la liste des résidents bannis pour ce domaine uniquement ou pour [ALL_ESTATES] ?
+		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
+	</notification>
+	<notification label="Choisir le domaine" name="EstateManagerAdd">
+		Ajouter un gérant de domaine pour ce domaine uniquement ou pour [ALL_ESTATES] ?
+		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
+	</notification>
+	<notification label="Choisir le domaine" name="EstateManagerRemove">
+		Supprimer le gérant de domaine pour ce domaine uniquement ou pour [ALL_ESTATES] ?
+		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/>
+	</notification>
+	<notification label="Confirmer" name="EstateKickUser">
+		Éjecter [EVIL_USER] de ce domaine ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="EstateChangeCovenant">
+		Êtes-vous certain de vouloir modifier le règlement du domaine ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="RegionEntryAccessBlocked">
+		Votre catégorie d&apos;accès ne vous autorise pas à pénétrer dans cette région. Cela vient peut-être du fait qu&apos;il manquait des informations pour valider votre âge.
+
+Vérifiez que vous avez la toute dernière version du client et consultez les pages d&apos;aide pour savoir comment accéder aux zones ayant ce niveau d&apos;accès.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="RegionEntryAccessBlocked_KB">
+		Votre catégorie d&apos;accès ne vous permet pas de pénétrer dans cette région.
+
+Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
+		<url name="url">
+			http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB)
+		</url>
+		<usetemplate ignoretext="Je ne peux pas pénétrer dans cette région car je n&apos;ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
+	</notification>
+	<notification name="RegionEntryAccessBlocked_Notify">
+		Votre catégorie d&apos;accès ne vous permet pas de pénétrer dans cette région.
+	</notification>
+	<notification name="RegionEntryAccessBlocked_Change">
+		Votre catégorie d&apos;accès ne vous permet pas de pénétrer dans cette région.
+
+En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d&apos;accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Édition &gt; Préférences... &gt; Général.
+		<form name="form">
+			<button name="OK" text="Modifier les Préférences"/>
+			<button default="true" name="Cancel" text="Fermer"/>
+			<ignore name="ignore" text="La catégorie de contenu que j&apos;ai choisie m&apos;empêche de pénétrer dans une région"/>
+		</form>
+	</notification>
+	<notification name="LandClaimAccessBlocked">
+		Votre catégorie d&apos;accès ne vous permet pas de réclamer cette région. Cela vient peut-être du fait qu&apos;il manquait des informations pour valider votre âge.
+
+Vérifiez que vous avez la toute dernière version du client et consultez les pages d&apos;aide pour savoir comment accéder aux zones ayant ce niveau d&apos;accès.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="LandClaimAccessBlocked_KB">
+		Votre catégorie d&apos;accès ne vous permet pas de réclamer cette région.
+
+Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
+		<url name="url">
+			http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB)
+		</url>
+		<usetemplate ignoretext="Je ne peux pas réclamer cette région car je n&apos;ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
+	</notification>
+	<notification name="LandClaimAccessBlocked_Notify">
+		Votre catégorie d&apos;accès ne vous autorise pas à réclamer cette région.
+	</notification>
+	<notification name="LandClaimAccessBlocked_Change">
+		Votre catégorie d&apos;accès ne vous permet pas de réclamer cette région.
+
+En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d&apos;accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Édition &gt; Préférences... &gt; Général.
+		<usetemplate ignoretext="La catégorie de contenu que j&apos;ai choisie m&apos;empêche de réclamer un terrain" name="okcancelignore" notext="Fermer" yestext="Modifier les Préférences"/>
+	</notification>
+	<notification name="LandBuyAccessBlocked">
+		Votre catégorie d&apos;accès ne vous permet pas d&apos;acheter cette région. Cela vient peut-être du fait qu&apos;il manquait des informations pour valider votre âge.
+
+Vérifiez que vous avez la toute dernière version du client et consultez les pages d&apos;aide pour savoir comment accéder aux zones ayant ce niveau d&apos;accès.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="LandBuyAccessBlocked_KB">
+		Votre catégorie d&apos;accès ne vous permet pas d&apos;acheter cette région.
+
+Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
+		<url name="url">
+			http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB)
+		</url>
+		<usetemplate ignoretext="Je ne peux pas acheter ce terrain car je n&apos;ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
+	</notification>
+	<notification name="LandBuyAccessBlocked_Notify">
+		Votre catégorie d&apos;accès ne vous permet pas d&apos;acheter cette région.
+	</notification>
+	<notification name="LandBuyAccessBlocked_Change">
+		Votre catégorie d&apos;accès ne vous autorise pas à acheter cette région.
+
+En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d&apos;accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Édition &gt; Préférences... &gt; Général.
+		<usetemplate ignoretext="La catégorie de contenu que j&apos;ai choisie m&apos;empêche d&apos;acheter un terrain" name="okcancelignore" notext="Fermer" yestext="Modifier les Préférences"/>
+	</notification>
+	<notification name="TooManyPrimsSelected">
+		&quot;Vous avez sélectionné trop de prims. Veuillez sélectionner au maximum [MAX_PRIM_COUNT] prims et réessayer.&quot;
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="ProblemImportingEstateCovenant">
+		Problème lors de l&apos;importation du règlement du domaine.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="ProblemAddingEstateManager">
+		Problèmes lors de l&apos;ajout d&apos;un nouveau gérant de domaine. Il est possible qu&apos;au moins un des domaines ait une liste de gérants complète.
+	</notification>
+	<notification name="ProblemAddingEstateGeneric">
+		Problème lors de l&apos;ajout à la liste de ce domaine. Il est possible qu&apos;au moins un des domaines ait une liste complète.
+	</notification>
+	<notification name="UnableToLoadNotecardAsset">
+		Impossible de charger les données de la note actuellement.
+	</notification>
+	<notification name="NotAllowedToViewNotecard">
+		Permissions pour afficher la note insuffisantes.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="MissingNotecardAssetID">
+		Les références de la note ne se trouvent pas dans la base de données.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="PublishClassified">
+		Rappel : les frais pour passer des petites annonces ne sont pas remboursables.
+
+Publier cette petite annonce maintenant pour [AMOUNT] L$ ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="SetClassifiedMature">
+		Cette petite annonce contient-elle du contenu Mature ?
+		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Non" yestext="Oui"/>
+	</notification>
+	<notification name="SetGroupMature">
+		Ce groupe contient-il du contenu Mature ?
+		<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Non" yestext="Oui"/>
+	</notification>
+	<notification label="Confirmer le redémarrage" name="ConfirmRestart">
+		Souhaitez-vous vraiment redémarrer cette région dans 2 minutes ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification label="Envoyer un message à la région" name="MessageRegion">
+		Saisissez une message qui sera envoyé à tous les résidents présents dans cette région.
+		<form name="form">
+			<input name="message"/>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Annuler"/>
+		</form>
+	</notification>
+	<notification label="Catégorie de la région modifiée" name="RegionMaturityChange">
+		La catégorie d&apos;accès de cette région a été mise à jour.
+Ce changement n&apos;apparaîtra pas immédiatement sur la carte.
+	</notification>
+	<notification label="Versions de voix non compatibles" name="VoiceVersionMismatch">
+		Cette version de [APP_NAME] n&apos;est pas compatible avec la fonctionnalité de chat vocal dans cette région. Vous devez mettre à jour [APP_NAME] pour que le chat vocal fonctionne correctement.
+	</notification>
+	<notification label="Impossible d&apos;acheter des objets" name="BuyObjectOneOwner">
+		Impossible d&apos;acheter simultanément des objets de propriétaires différents.
+Veuillez ne sélectionner qu&apos;un seul objet.
+	</notification>
+	<notification label="Impossible d&apos;acheter des contenus" name="BuyContentsOneOnly">
+		Impossible d&apos;acheter les contenus de plus d&apos;un objet à la fois.
+Veuillez ne sélectionner qu&apos;un seul objet.
+	</notification>
+	<notification label="Impossible d&apos;acheter des contenus" name="BuyContentsOneOwner">
+		Impossible d&apos;acheter simultanément des objets de propriétaires différents.
+Veuillez ne sélectionner qu&apos;un seul objet.
+	</notification>
+	<notification name="BuyOriginal">
+		Acheter l&apos;objet original pour [PRICE] L$ à [PRICE] ?
+Vous deviendrez le propriétaire de cet objet.
+Vous pourrez :
+ Modifier : [MODIFYPERM]
+ Copier : [COPYPERM]
+ Revendre ou donner : [RESELLPERM]
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="BuyOriginalNoOwner">
+		Acheter l&apos;objet original pour [PRICE] L$ ?
+Vous deviendrez le propriétaire de cet objet.
+Vous pourrez :
+ Modifier : [MODIFYPERM]
+ Copier : [COPYPERM]
+ Revendre ou donner : [RESELLPERM]
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="BuyCopy">
+		Acheter une copie pour [PRICE] L$ à [OWNER] ?
+L&apos;objet sera copié dans votre inventaire.
+Vous pourrez :
+ Modifier : [MODIFYPERM]
+ Copier : [COPYPERM]
+ Revendre ou donner : [RESELLPERM]
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="BuyCopyNoOwner">
+		Acheter une copie pour [PRICE] L$ ?
+L&apos;objet sera copié dans votre inventaire.
+Vous pourrez :
+ Modifier : [MODIFYPERM]
+ Copier : [COPYPERM]
+ Revendre ou donner : [RESELLPERM]
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="BuyContents">
+		Acheter des contenus pour [PRICE] L$ à [OWNER] ?
+Ils seront copiés dans votre inventaire.
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="BuyContentsNoOwner">
+		Acheter des contenus pour [PRICE] L$ ?
+Ils seront copiés dans votre inventaire.
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmPurchase">
+		Suite à cette transaction, vous allez :
+[ACTION]
+
+Êtes-vous certain de vouloir effectuer cette transaction ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmPurchasePassword">
+		Suite à cette transaction, vous allez :
+[ACTION]
+
+Êtes-vous certain de vouloir effectuer cette transaction ?
+Veuillez saisir à nouveau votre mot de passe et cliquer sur OK.
+		<form name="form">
+			<button name="ConfirmPurchase" text="OK"/>
+			<button name="Cancel" text="Annuler"/>
+		</form>
+	</notification>
+	<notification name="SetPickLocation">
+		Remarque :
+vous avez mis à jour l&apos;emplacement de ce favori mais les autres détails resteront inchangés.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="MoveInventoryFromObject">
+		Vous avez sélectionné des objets non copiables.
+Ces objets seront déplacés dans votre inventaire et non pas copiés.
+
+Déplacer les objets de l&apos;inventaire ?
+		<usetemplate ignoretext="M&apos;avertir avant que je ne déplace des objets pour lesquels la copie est interdite" name="okcancelignore" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="MoveInventoryFromScriptedObject">
+		Vous avez sélectionné des objets de l&apos;inventaire qui ne peuvent pas être copiés. Ces objets seront déplacés vers votre inventaire, et non pas copiés.
+L&apos;objet les contenant est scripté, déplacer ces objets peut causer des problèmes au niveau du script.
+
+Déplacer les objets de l&apos;inventaire ?
+		<usetemplate ignoretext="M&apos;avertir avant que je ne déplace des objets pour lesquels la copie est interdite et qui pourraient casser des objets scriptés" name="okcancelignore" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ClickActionNotPayable">
+		Avertissement : l&apos;action du clic Payer l&apos;objet a été définie mais ne fonctionnera que si un script est ajouté avec l&apos;event money().
+		<form name="form">
+			<ignore name="ignore" text="Je définis l&apos;action du clic Payer l&apos;objet  lorsque je construis un objet sans le script money()"/>
+		</form>
+	</notification>
+	<notification name="OpenObjectCannotCopy">
+		Vous n&apos;êtes autorisé à copier aucun élément dans cet objet.
+	</notification>
+	<notification name="WebLaunchAccountHistory">
+		Aller sur secondlife.com pour consulter l&apos;historique de votre compte ?
+		<usetemplate ignoretext="Lancer mon navigateur pour consulter l&apos;historique de mon compte" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/>
+	</notification>
+	<notification name="ConfirmQuit">
+		Êtes-vous certain de vouloir quitter ?
+		<usetemplate ignoretext="Confirmer avant de quitter" name="okcancelignore" notext="Ne pas quitter" yestext="Quitter"/>
+	</notification>
+	<notification name="HelpReportAbuseEmailLL">
+		Utilisez cet outil pour signaler des infractions aux Conditions d&apos;utilisation et aux Règles de la communauté. Voir :
+
+http://secondlife.com/corporate/tos.php
+http://secondlife.com/corporate/cs.php
+
+Lorsqu&apos;elles sont signalées, toutes les infractions aux Conditions d&apos;utilisation et aux Règles de la communauté font l&apos;objet d&apos;une enquête et sont résolues. Pour accéder aux détails de la résolution d&apos;un incident, allez sur :
+
+http://secondlife.com/support/incidentreport.php
+	</notification>
+	<notification name="HelpReportAbuseEmailEO">
+		Important : ce rapport ira au propriétaire de la région dans laquelle vous êtes et non à Linden Lab.
+
+Pour aider les résidents et les visiteurs, le propriétaire de la région dans laquelle vous êtes a choisi de recevoir et de s&apos;occuper de tous les rapports envoyés à partir de cette région. Linden Lab n&apos;enquêtera pas sur les rapports que vous envoyez à partir de cet endroit.
+
+Le propriétaire de la région traitera les rapports en fonction des règles de cette région, comme indiqué dans le réglement du domaine.
+(Les réglements sont visibles à partir du menu Monde &gt; À propos du terrain.)
+
+La résolution de ce rapport ne s&apos;applique qu&apos;à cette région ; L&apos;accès aux autres endroits de [SECOND_LIFE] ne sera pas affecté par les résultats de cette enquête. Seul Linden Lab peut interdire l&apos;accès à l&apos;ensemble de [SECOND_LIFE].
+	</notification>
+	<notification name="HelpReportAbuseSelectCategory">
+		Veuillez choisir une catégorie pour ce rapport d&apos;infraction.
+Le choix d&apos;une catégorie nous permet de traiter les rapports d&apos;infraction plus rapidement.
+	</notification>
+	<notification name="HelpReportAbuseAbuserNameEmpty">
+		Veuillez saisir le nom du contrevenant.
+Lorsque nous avons le nom du contrevenant, nous sommes en mesure de traiter les rapports plus rapidement.
+	</notification>
+	<notification name="HelpReportAbuseAbuserLocationEmpty">
+		Veuillez indiquer l&apos;endroit où l&apos;infraction a eu lieu.
+Les informations précises et exactes nous permettent de traiter les rapports plus rapidement.
+	</notification>
+	<notification name="HelpReportAbuseSummaryEmpty">
+		Veuillez saisir un récapitulatif de l&apos;infraction.
+Les récapitulatifs précis nous permettent de traiter les rapports plus rapidement.
+	</notification>
+	<notification name="HelpReportAbuseDetailsEmpty">
+		Veuillez saisir une description détaillée de l&apos;infraction.
+Soyez aussi précis que possible et essayez de fournir des noms ainsi que des détails sur l&apos;incident que vous signalez.
+Les descriptions précises nous permettent de traiter les rapports plus rapidement.
+	</notification>
+	<notification name="HelpReportAbuseContainsCopyright">
+		Cher résident,
+
+Il semble que vous souhaitiez reporter une infraction à des droits de propriété intellectuelle. Pour signaler correctement cette infraction :
+
+(1) Remplissez un rapport d&apos;infraction. Vous pouvez soumettre un rapport d&apos;infraction si vous pensez qu&apos;un résident exploite le système de droits de [SECOND_LIFE], par exemple en utilisant un CopyBot ou des outils similaires pour enfreindre des droits de propriété intellectuelle. Notre équipe chargée des infractions mènera une enquête et prendra les mesures nécessaires à l&apos;encontre du résident non respectueux des Conditions d&apos;utilisation ou des règles de la communauté. Sachez toutefois que l&apos;équipe chargée des infractions ne supprimera pas de contenu à l&apos;intérieur de [SECOND_LIFE].
+
+(2) Demandez à ce que du contenu à l&apos;intérieur de [SECOND_LIFE] soit supprimé. Pour demander à ce que du contenu soit supprimé de [SECOND_LIFE], vous devez soumettre un rapport d&apos;infraction valide, tel que fourni dans notre Règlement contre les violations des droit d&apos;auteurs (DMCA), à http://secondlife.com/corporate/dmca.php.
+
+Si vous souhaitez toujours reporter cette infraction, veuillez fermer cette fenêtre et soumettre votre rapport.  Vous devrez peut-être sélectionner la catégorie CopyBot ou exploitation abusive des droits.
+
+Merci,
+
+Linden Lab
+	</notification>
+	<notification name="FailedRequirementsCheck">
+		Les composantes requises suivantes ne se trouvent pas dans [FLOATER]:
+[COMPONENTS]
+	</notification>
+	<notification label="Remplacer la pièce-jointe existante" name="ReplaceAttachment">
+		Vous avez déjà un objet sur cette partie du corps.
+Voulez-vous le remplacer par l&apos;objet sélectionné ?
+		<form name="form">
+			<ignore name="ignore" save_option="true" text="Remplacer une pièce-jointe existante par l&apos;objet sélectionné"/>
+			<button ignore="Remplacer automatiquement" name="Yes" text="OK"/>
+			<button ignore="Ne jamais remplacer" name="No" text="Annuler"/>
+		</form>
+	</notification>
+	<notification label="Réponse si occupé(e)" name="BusyModePay">
+		Vous êtes en mode occupé et vous ne recevrez donc aucun objet en échange de ce paiement.
+
+Souhaitez-vous quitter le mode occupé avant de terminer cette transaction ?
+		<form name="form">
+			<ignore name="ignore" save_option="true" text="Je suis sur le point de payer une personne ou un objet mais suis en mode Occupé"/>
+			<button ignore="Toujours quitter le mode occupé" name="Yes" text="OK"/>
+			<button ignore="Ne jamais quitter le mode occupé" name="No" text="Annuler"/>
+		</form>
+	</notification>
+	<notification name="ConfirmEmptyTrash">
+		Êtes-vous certain de vouloir supprimer le contenu de votre corbeille de manière permanente ?
+		<usetemplate ignoretext="Confimer avant de vider la corbeille" name="okcancelignore" notext="Annuler" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmClearBrowserCache">
+		Êtes-vous certain de vouloir supprimer l&apos;historique de vos visites et recherches ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/>
+	</notification>
+	<notification name="ConfirmClearCookies">
+		Êtes-vous certain de vouloir supprimer vos cookies ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/>
+	</notification>
+	<notification name="ConfirmClearMediaUrlList">
+		Êtes-vous certain de vouloir supprimer la liste des URL enregistrées ?
+		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/>
+	</notification>
+	<notification name="ConfirmEmptyLostAndFound">
+		Êtes-vous certain de vouloir supprimer le contenu de votre dossier Objets trouvés de manière permanente ?
+		<usetemplate ignoretext="Confimer avant de vider le dossier Objets trouvés" name="okcancelignore" notext="Non" yestext="Oui"/>
+	</notification>
+	<notification name="CopySLURL">
+		La SLurl suivante a été copiée dans votre presse-papier :
+ [SLURL]
+
+Liez-la à partir d&apos;une page web pour permettre aux autres résidents d&apos;accéder facilement à cet endroit ou bien collez-la dans la barre d&apos;adresse de votre navigateur.
+		<form name="form">
+			<ignore name="ignore" text="La SLurl est copiée dans mon presse-papier"/>
+		</form>
+	</notification>
+	<notification name="WLSavePresetAlert">
+		Voulez-vous écraser l&apos;option précédemment enregistrée ?
+		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
+	</notification>
+	<notification name="WLDeletePresetAlert">
+		Voulez-vous supprimer [SKY] ?
+		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
+	</notification>
+	<notification name="WLNoEditDefault">
+		Vous ne pouvez pas éditer ou supprimer un préréglage par défaut.
+	</notification>
+	<notification name="WLMissingSky">
+		Une dossier semble manquer au Cycle du jour : [SKY].
+	</notification>
+	<notification name="PPSaveEffectAlert">
+		Certains effets post-traitement existent. Voulez-vous quand même écraser ce fichier ?
+		<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
+	</notification>
+	<notification name="NewSkyPreset">
+		Nommez le nouveau ciel.
+		<form name="form">
+			<input name="message">
+				Nouveau préréglage
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Annuler"/>
+		</form>
+	</notification>
+	<notification name="ExistsSkyPresetAlert">
+		Ce préréglage existe déjà !
+	</notification>
+	<notification name="NewWaterPreset">
+		Nommez ce nouveau préréglage d&apos;eau.
+		<form name="form">
+			<input name="message">
+				Nouveau préréglage
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Annuler"/>
+		</form>
+	</notification>
+	<notification name="ExistsWaterPresetAlert">
+		Ce préréglage existe déjà !
+	</notification>
+	<notification name="WaterNoEditDefault">
+		Vous ne pouvez pas éditer ou supprimer un préréglage par défaut.
+	</notification>
+	<notification name="ChatterBoxSessionStartError">
+		Impossible de démarrer une nouvelle session de chat avec [RECIPIENT].
+[REASON]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="ChatterBoxSessionEventError">
+		[EVENT]
+[REASON]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="ForceCloseChatterBoxSession">
+		Vous devez terminer votre session de chat avec [NAME].
+[REASON]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="Cannot_Purchase_an_Attachment">
+		Vous ne pouvez pas acheter un objet s&apos;il fait partie d&apos;une pièce-jointe.
+	</notification>
+	<notification label="À propos des requêtes pour les autorisations de débit" name="DebitPermissionDetails">
+		Accepter cette requête donne au script l&apos;autorisation de prélever des dollars Linden (L$) sur votre compte de manière continue. Pour révoquer cette autorisation, le propriétaire de l&apos;objet doit supprimer l&apos;objet ou bien réinitialiser les scripts dans l&apos;objet.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="AutoWearNewClothing">
+		Voulez-vous automatiquement porter l&apos;habit que vous allez créer ?
+		<usetemplate ignoretext="Porter automatiquement tout en modifiant mon apparence" name="okcancelignore" notext="Non" yestext="Oui"/>
+	</notification>
+	<notification name="NotAgeVerified">
+		Pour pouvoir pénétrer dans cette zone, vous devez avoir procédé à la vérification de votre âge.  Souhaitez-vous aller sur [SECOND_LIFE] et procéder à la vérification de votre âge ?
+
+[_URL]
+		<url name="url" option="0">
+			https://secondlife.com/account/verification.php?lang=fr
+		</url>
+		<usetemplate ignoretext="Je n&apos;ai pas procédé à la vérification de mon âge" name="okcancelignore" notext="Non" yestext="Oui"/>
+	</notification>
+	<notification name="Cannot enter parcel: no payment info on file">
+		Pour pouvoir pénétrer dans cette zone, vous devez avoir enregistré vos informations de paiement.  Souhaitez-vous aller sur [SECOND_LIFE] et enregistrer vos informations de paiement ?
+
+[_URL]
+		<url name="url" option="0">
+			https://secondlife.com/account/index.php?lang=fr
+		</url>
+		<usetemplate ignoretext="Mes informations de paiement ne sont pas enregistrées" name="okcancelignore" notext="Non" yestext="Oui"/>
+	</notification>
+	<notification name="MissingString">
+		The string [STRING_NAME] is missing from strings.xml
+	</notification>
+	<notification name="SystemMessageTip">
+		[MESSAGE]
+	</notification>
+	<notification name="Cancelled">
+		Annulé
+	</notification>
+	<notification name="CancelledSit">
+		Action annulée
+	</notification>
+	<notification name="CancelledAttach">
+		Attachement annulé
+	</notification>
+	<notification name="ReplacedMissingWearable">
+		Habits et parties du corps manquants remplacés par les éléments par défaut.
+	</notification>
+	<notification name="GroupNotice">
+		Sujet : [SUBJECT], Message : [MESSAGE]
+	</notification>
+	<notification name="FriendOnline">
+		[FIRST] [LAST] est connecté(e)
+	</notification>
+	<notification name="FriendOffline">
+		[FIRST] [LAST] est déconnecté(e)
+	</notification>
+	<notification name="AddSelfFriend">
+		Même si vous êtes extrêmement sympathique, vous ne pouvez pas devenir ami avec vous-même.
+	</notification>
+	<notification name="UploadingAuctionSnapshot">
+		Importation de photos SL et Web en cours...
+(prend environ 5 minutes.)
+	</notification>
+	<notification name="UploadPayment">
+		Le chargement a coûté [AMOUNT] L$.
+	</notification>
+	<notification name="UploadWebSnapshotDone">
+		Photo Web importée
+	</notification>
+	<notification name="UploadSnapshotDone">
+		Photo SL importée
+	</notification>
+	<notification name="TerrainDownloaded">
+		Fichier terrain.raw téléchargé
+	</notification>
+	<notification name="GestureMissing">
+		Geste [NAME] absent de la base de données.
+	</notification>
+	<notification name="UnableToLoadGesture">
+		Impossible de charger le geste [NAME].
+Merci de réessayer.
+	</notification>
+	<notification name="LandmarkMissing">
+		Repère absent de la base de données.
+	</notification>
+	<notification name="UnableToLoadLandmark">
+		Impossible de charger le repère. Merci de réessayer.
+	</notification>
+	<notification name="CapsKeyOn">
+		La touche Verr.maj est activée.
+Cela risque d&apos;impacter votre mot de passe.
+	</notification>
+	<notification name="NotecardMissing">
+		Note absente de la base de données.
+	</notification>
+	<notification name="NotecardNoPermissions">
+		Vous n&apos;avez pas le droit de consulter cette note.
+	</notification>
+	<notification name="RezItemNoPermissions">
+		Permissions insuffisantes pour rezzer l&apos;objet.
+	</notification>
+	<notification name="UnableToLoadNotecard">
+		Impossible de lire les données de la note actuellement.
+	</notification>
+	<notification name="ScriptMissing">
+		Script absent de la base de données.
+	</notification>
+	<notification name="ScriptNoPermissions">
+		Permissions insuffisantes pour voir le script.
+	</notification>
+	<notification name="UnableToLoadScript">
+		Impossible de charger le script. Merci de réessayer.
+	</notification>
+	<notification name="IncompleteInventory">
+		Tous les éléments que vous souhaitez transférer ne sont pas encore disponibles sur le serveur.
+Merci d&apos;essayer à nouveau dans une minute.
+	</notification>
+	<notification name="CannotModifyProtectedCategories">
+		Vous ne pouvez pas modifier de catégories protégées.
+	</notification>
+	<notification name="CannotRemoveProtectedCategories">
+		Vous ne pouvez pas supprimer de catégories protégées.
+	</notification>
+	<notification name="OfferedCard">
+		Vous avez offert votre carte de visite à [FIRST] [LAST]
+	</notification>
+	<notification name="UnableToBuyWhileDownloading">
+		Achat impossible durant le chargement de l&apos;objet.
+Merci de réessayer.
+	</notification>
+	<notification name="UnableToLinkWhileDownloading">
+		Impossible de lier durant le chargement de l&apos;objet.
+Merci de réessayer.
+	</notification>
+	<notification name="CannotBuyObjectsFromDifferentOwners">
+		Vous ne pouvez pas acheter simultanément des objets de propriétaires différents.
+Veuillez sélectionner un seul objet.
+	</notification>
+	<notification name="ObjectNotForSale">
+		Cet objet n&apos;est pas à vendre.
+	</notification>
+	<notification name="EnteringGodMode">
+		Activation du mode divin : niveau [LEVEL]
+	</notification>
+	<notification name="LeavingGodMode">
+		Désactivation du mode divin : niveau [LEVEL]
+	</notification>
+	<notification name="CopyFailed">
+		Vous n&apos;avez pas le droit de copier ceci.
+	</notification>
+	<notification name="InventoryAccepted">
+		[NAME] a accepté votre envoi.
+	</notification>
+	<notification name="InventoryDeclined">
+		[NAME] a refusé votre envoi.
+	</notification>
+	<notification name="ObjectMessage">
+		[NAME]: [MESSAGE]
+	</notification>
+	<notification name="CallingCardAccepted">
+		Votre carte de visite a été acceptée.
+	</notification>
+	<notification name="CallingCardDeclined">
+		Votre carte de visite a été refusée.
+	</notification>
+	<notification name="TeleportToLandmark">
+		A présent que vous êtes sur le continent, vous pouvez voyager par téléportation (vers [NAME] par exemple). Cliquez sur le bouton Inventaire en bas à droite de l&apos;écran puis sélectionnez le dossier Repères (Landmarks).
+Choisissez un repère, double-cliquez dessus et cliquez sur Téléporter.
+	</notification>
+	<notification name="TeleportToPerson">
+		A présent que vous êtes sur le continent, vous pouvez contacter des résidents (tel [NAME] par exemple). Cliquez sur le bouton Inventaire en bas à droite de l&apos;écran puis sélectionnez le dossier Cartes de visite (Calling Cards).
+Choisissez en une, double-cliquez dessus et cliquez sur Message Instantané.
+	</notification>
+	<notification name="CantSelectLandFromMultipleRegions">
+		Vous ne pouvez pas sélectionner de terrain en dehors des limites du serveur.
+Veuillez sélectionner un terrain plus petit.
+	</notification>
+	<notification name="SearchWordBanned">
+		Certains termes de votre recherche ont été exclus car ils ne correspondaient pas aux standards fixés dans les Règles communautaires.
+	</notification>
+	<notification name="NoContentToSearch">
+		Veuillez sélectionner au moins un type de contenu à rechercher (PG, Mature ou Adulte)
+	</notification>
+	<notification name="GroupVote">
+		[NAME] a proposé un vote pour :
+[MESSAGE]
+		<form name="form">
+			<button name="VoteNow" text="Voter"/>
+			<button name="Later" text="Plus tard"/>
+		</form>
+	</notification>
+	<notification name="SystemMessage">
+		[MESSAGE]
+	</notification>
+	<notification name="EventNotification">
+		Avis d&apos;événement :
+
+[NAME]
+[DATE]
+		<form name="form">
+			<button name="Teleport" text="Téléporter"/>
+			<button name="Description" text="Description"/>
+			<button name="Cancel" text="Annuler"/>
+		</form>
+	</notification>
+	<notification name="TransferObjectsHighlighted">
+		Tous les objets de cette parcelle qui seront transférés à l&apos;acheteur sont maintenant mis en surbrillance.
+
+* Les arbres et la pelouse qui seront transférés ne sont pas mis en surbrillance.
+		<form name="form">
+			<button name="Done" text="Transfert effectué"/>
+		</form>
+	</notification>
+	<notification name="DeactivatedGesturesTrigger">
+		Gestes désactivés ayant le même mot-clé :
+[NAMES]
+	</notification>
+	<notification name="NoQuickTime">
+		Le logiciel Apple QuickTime ne semble pas installé sur votre système.
+Pour voir les vidéos sur les terrains qui le permettent, allez sur le site de QuickTime (http://www.apple.com/fr/quicktime/download) et installez le lecteur QuickTime.
+	</notification>
+	<notification name="NoPlugin">
+		Aucun Media Plugin n&apos;a été trouvé pour prendre en charge &quot;[MIME_TYPE]&quot;.  Les médias de ce type ne sont pas disponibles.
+	</notification>
+	<notification name="MediaPluginFailed">
+		Le Media Plugin suivant a échoué :
+    [PLUGIN]
+
+Si le problème persiste, veuillez réinstaller le plugin ou contacter le vendeur.
+		<form name="form">
+			<ignore name="ignore" text="L&apos;éxécution d&apos;un Media Plugin a échoué"/>
+		</form>
+	</notification>
+	<notification name="OwnedObjectsReturned">
+		Les objets que vous possédez sur la parcelle de terrain sélectionnée ont été renvoyés dans votre inventaire.
+	</notification>
+	<notification name="OtherObjectsReturned">
+		Les objets que vous possédez sur la parcelle de terrain appartenant à [FIRST] [LAST] ont été renvoyés dans votre inventaire.
+	</notification>
+	<notification name="OtherObjectsReturned2">
+		Les objets sur la parcelle appartenant à « [NAME] » ont étés renvoyés à leur propriétaire.
+	</notification>
+	<notification name="GroupObjectsReturned">
+		Les objets sélectionnés sur la parcelle de terrain partagée avec le groupe [GROUPNAME] ont été renvoyés dans l&apos;inventaire de leur propriétaire.
+Les objets donnés transférables ont étés renvoyés à leur propriétaire.
+Les objets non transférables donnés au groupe ont étés supprimés.
+	</notification>
+	<notification name="UnOwnedObjectsReturned">
+		Les objets sélectionnés sur la parcelle et qui ne sont pas à vous ont été rendus à leurs propriétaires.
+	</notification>
+	<notification name="NotSafe">
+		Les dégâts sont autorisés sur ce terrain.
+Vous pouvez être blessé ici. Si vous décédez, vous serez téléporté à votre domicile.
+	</notification>
+	<notification name="NoFly">
+		Le vol est interdit dans cette zone.
+Vous ne pouvez pas voler ici.
+	</notification>
+	<notification name="PushRestricted">
+		Les bousculades sont interdites dans cette zone.
+Vous ne pouvez pas pousser les autres à moins que vous soyez propriétaire de ce terrain.
+	</notification>
+	<notification name="NoVoice">
+		Le chat vocal est interdit dans cette zone. Vous n&apos;entendrez personne parler.
+	</notification>
+	<notification name="NoBuild">
+		La construction est interdite dans cette zone. Vous ne pouvez pas construite ou rezzer d&apos;objets ici.
+	</notification>
+	<notification name="ScriptsStopped">
+		Un administrateur a temporairement stoppé les scripts dans cette région.
+	</notification>
+	<notification name="ScriptsNotRunning">
+		Aucun script ne fonctionne dans cette région.
+	</notification>
+	<notification name="NoOutsideScripts">
+		Les scripts externes sont désactivés sur ce terrain.
+
+Aucun script ne marche ici à part ceux du propriétaire du terrain.
+	</notification>
+	<notification name="ClaimPublicLand">
+		Vous ne pouvez réclamer qu&apos;un terrain public dans la région où vous vous trouvez actuellement.
+	</notification>
+	<notification name="RegionTPAccessBlocked">
+		Votre catégorie d&apos;accès ne vous autorise pas à pénétrer dans cette région. Vous devez sans doute procéder à la vérification de votre âge ou installer une version plus récente du client.
+
+Pour savoir comment accéder aux zones ayant un tel niveau d&apos;accès, veuillez consulter les pages d&apos;aide.
+	</notification>
+	<notification name="URBannedFromRegion">
+		Vous avez été banni de cette région.
+	</notification>
+	<notification name="NoTeenGridAccess">
+		Votre compte ne peut pas se connecter à cette région du Teen grid.
+	</notification>
+	<notification name="ImproperPaymentStatus">
+		Vous n&apos;avez pas le statut de paiement approprié pour pénétrer dans cette région.
+	</notification>
+	<notification name="MustGetAgeParcel">
+		Pour pouvoir pénétrer sur cette parcelle, vous devez avoir procédé à la vérification de votre âge.
+	</notification>
+	<notification name="NoDestRegion">
+		Région de destination introuvable.
+	</notification>
+	<notification name="NotAllowedInDest">
+		Vous n&apos;êtes pas autorisé dans cette région.
+	</notification>
+	<notification name="RegionParcelBan">
+		Impossible de traverser une parcelle bannie. Veuillez trouver une autre solution.
+	</notification>
+	<notification name="TelehubRedirect">
+		Vous avez été redirigé vers un téléhub.
+	</notification>
+	<notification name="CouldntTPCloser">
+		Il n&apos;a pas été possible de vous téléporter vers une destination plus proche.
+	</notification>
+	<notification name="TPCancelled">
+		Téléportation annulée.
+	</notification>
+	<notification name="FullRegionTryAgain">
+		La région dans laquelle vous essayez de pénétrer est pleine actuellement.
+Veuillez réessayer dans quelques minutes.
+	</notification>
+	<notification name="GeneralFailure">
+		Panne générale.
+	</notification>
+	<notification name="RoutedWrongRegion">
+		Dirigé vers la mauvaise région. Merci de réessayer.
+	</notification>
+	<notification name="NoValidAgentID">
+		ID agent non valide.
+	</notification>
+	<notification name="NoValidSession">
+		ID de session non valide.
+	</notification>
+	<notification name="NoValidCircuit">
+		Aucun code de circuit valide.
+	</notification>
+	<notification name="NoValidTimestamp">
+		Timestamp non valide.
+	</notification>
+	<notification name="NoPendingConnection">
+		Impossible de créer la connexion en attente.
+	</notification>
+	<notification name="InternalUsherError">
+		Erreur interne lors de la tentative de connexion.
+	</notification>
+	<notification name="NoGoodTPDestination">
+		Impossible de trouver un lieu de téléportation valide dans cette région.
+	</notification>
+	<notification name="InternalErrorRegionResolver">
+		Une erreur interne est survenue lors de la résolution des coodonnées de la région.
+	</notification>
+	<notification name="NoValidLanding">
+		Impossible de trouver un point d&apos;atterrissage valide.
+	</notification>
+	<notification name="NoValidParcel">
+		Aucune parcelle valide n&apos;a été trouvée.
+	</notification>
+	<notification name="ObjectGiveItem">
+		Un objet appelé [OBJECTFROMNAME] appartenant à [FIRST] [LAST] vous a donné : [OBJECTTYPE] appelé(e) [OBJECTNAME].
+		<form name="form">
+			<button name="Keep" text="Garder"/>
+			<button name="Discard" text="Jeter"/>
+			<button name="Mute" text="Ignorer"/>
+		</form>
+	</notification>
+	<notification name="ObjectGiveItemUnknownUser">
+		L&apos;objet [OBJECTFROMNAME] appartenant à un utilisateur inconnu vous a donné un(e) [OBJECTTYPE] nommé(e) [OBJECTNAME].
+		<form name="form">
+			<button name="Keep" text="Garder"/>
+			<button name="Discard" text="Jeter"/>
+			<button name="Mute" text="Ignorer"/>
+		</form>
+	</notification>
+	<notification name="UserGiveItem">
+		[NAME] vous a donné un(e) [OBJECTTYPE] nommé(e) [OBJECTNAME].
+		<form name="form">
+			<button name="Keep" text="Garder"/>
+			<button name="Discard" text="Jeter"/>
+		</form>
+	</notification>
+	<notification name="GodMessage">
+		[NAME]
+[MESSAGE]
+	</notification>
+	<notification name="JoinGroup">
+		[MESSAGE]
+		<form name="form">
+			<button name="Join" text="Rejoindre"/>
+			<button name="Decline" text="Refuser"/>
+			<button name="Info" text="Infos"/>
+		</form>
+	</notification>
+	<notification name="TeleportOffered">
+		[NAME] vous propose de le/la rejoindre par téléportation :
+
+[MESSAGE]
+		<form name="form">
+			<button name="Teleport" text="Téléporter"/>
+			<button name="Cancel" text="Annuler"/>
+		</form>
+	</notification>
+	<notification name="GotoURL">
+		[MESSAGE]
+[URL]
+		<form name="form">
+			<button name="Later" text="Plus tard"/>
+			<button name="GoNow..." text="Y aller maintenant..."/>
+		</form>
+	</notification>
+	<notification name="OfferFriendship">
+		[NAME] vous demande de devenir son ami(e).
+
+[MESSAGE]
+
+(Par défaut, vous pourrez voir lorsque vous êtes tous deux connectés.)
+		<form name="form">
+			<button name="Accept" text="Accepter"/>
+			<button name="Decline" text="Refuser"/>
+		</form>
+	</notification>
+	<notification name="OfferFriendshipNoMessage">
+		[NAME] vous demande de devenir son ami.
+
+(Par défaut, vous pourrez voir quand vous êtes tous deux connectés)
+		<form name="form">
+			<button name="Accept" text="Accepter"/>
+			<button name="Decline" text="Refuser"/>
+		</form>
+	</notification>
+	<notification name="FriendshipAccepted">
+		[NAME] a accepté votre amitié.
+	</notification>
+	<notification name="FriendshipDeclined">
+		[NAME] a refusé votre amitié.
+	</notification>
+	<notification name="OfferCallingCard">
+		[FIRST] [LAST] vous offre sa carte de visite.
+Cela ajoute un marque-page dans votre inventaire, ce qui vous permet d&apos;envoyer rapidement un IM à ce résident.
+		<form name="form">
+			<button name="Accept" text="Accepter"/>
+			<button name="Decline" text="Refuser"/>
+		</form>
+	</notification>
+	<notification name="RegionRestartMinutes">
+		La région va redémarrer dans [MINUTES] minutes.
+Si vous restez dans cette région, vous serez déconnecté(e).
+	</notification>
+	<notification name="RegionRestartSeconds">
+		La région va redémarrer dans [SECONDS] secondes.
+Si vous restez dans cette région, vous serez déconnecté(e).
+	</notification>
+	<notification name="LoadWebPage">
+		Charger cette page web [URL] ?
+
+[MESSAGE]
+
+Venant de l&apos;objet : [OBJECTNAME], appartenant à : [NAME]?
+		<form name="form">
+			<button name="Gotopage" text="Charger"/>
+			<button name="Cancel" text="Annuler"/>
+		</form>
+	</notification>
+	<notification name="FailedToFindWearableUnnamed">
+		La recherche du [TYPE] dans la base de données a échoué.
+	</notification>
+	<notification name="FailedToFindWearable">
+		La recherche du [TYPE] nommé(e) [DESC] dans la base de données a échoué.
+	</notification>
+	<notification name="InvalidWearable">
+		L&apos;objet que vous essayez de porter utilise une fonctionnalité que le client ne peut lire.  Pour porter cet objet, veuillez télécharger une mise à jour du client.
+	</notification>
+	<notification name="ScriptQuestion">
+		&apos;[OBJECTNAME]&apos;, un objet appartenant à &apos;[NAME]&apos;, aimerait :
+
+[QUESTIONS]
+Acceptez-vous ?
+		<form name="form">
+			<button name="Yes" text="Oui"/>
+			<button name="No" text="Non"/>
+			<button name="Mute" text="Ignorer"/>
+		</form>
+	</notification>
+	<notification name="ScriptQuestionCaution">
+		Un objet appelé « [OBJECTNAME] », appartenant à « [NAME] », aimerait :
+
+[QUESTIONS]
+Si vous n&apos;avez pas confiance en cet objet ni en son créateur, vous devriez refuser cette requête.
+
+Accepter cette requête ?
+		<form name="form">
+			<button name="Grant" text="Accepter"/>
+			<button name="Deny" text="Refuser"/>
+			<button name="Details" text="Détails..."/>
+		</form>
+	</notification>
+	<notification name="ScriptDialog">
+		&apos;[TITLE]&apos; de [FIRST] [LAST]
+[MESSAGE]
+		<form name="form">
+			<button name="Ignore" text="Ignorer"/>
+		</form>
+	</notification>
+	<notification name="ScriptDialogGroup">
+		&apos;[TITLE]&apos; de [GROUPNAME]
+[MESSAGE]
+		<form name="form">
+			<button name="Ignore" text="Ignorer"/>
+		</form>
+	</notification>
+	<notification name="FirstBalanceIncrease">
+		Vous venez de recevoir [AMOUNT] L$.
+Votre solde en L$ est affiché en haut à droite.
+	</notification>
+	<notification name="FirstBalanceDecrease">
+		Vous venez de payer [AMOUNT] L$.
+Votre solde en L$ est affiché en haut à droite.
+	</notification>
+	<notification name="FirstSit">
+		Vous êtes assis(e).
+Utilisez les touches de direction (ou AWSD) pour regarder autour de vous.
+Pour vous lever, cliquez sur le bouton Me lever.
+	</notification>
+	<notification name="FirstMap">
+		Cliquez et faîtes glisser pour faire défiler la carte.
+Double-cliquez pour vous téléporter.
+Utilisez les contrôles à droite pour trouver des choses et afficher différents arrière-plans.
+	</notification>
+	<notification name="FirstBuild">
+		Vous avez ouvert les outils de construction. Tous les objets autour de vous ont été créés avec ces outils.
+	</notification>
+	<notification name="FirstTeleport">
+		Vous ne pouvez vous téléporter que dans certaines zones de cette région. La flèche pointe vers votre destination. Cliquez sur la flèche pour la faire disparaître.
+	</notification>
+	<notification name="FirstOverrideKeys">
+		Vos mouvements sont maintenant pris en charge par un objet.
+Essayez les flèches de votre clavier ou AWSD pour voir à quoi elles servent.
+Certains objets (comme les armes) nécessitent l&apos;activation du mode Vue subjective pour être utilisés.
+Pour cela, appuyez sur la touche M.
+	</notification>
+	<notification name="FirstAppearance">
+		Vous êtes en train d&apos;éditer votre apparence.
+Utilisez les touches de direction pour regarder autour de vous.
+Une fois terminé, cliquer sur Tout enregistrer.
+	</notification>
+	<notification name="FirstInventory">
+		Il s&apos;agit de votre inventaire qui contient vos possessions.
+
+* Pour porter quelque chose, faites glisser l&apos;objet sur vous-même.
+* Pour rezzer un objet dans le monde, faites-le glisser sur le sol.
+* Pour lire une note, double-cliquez dessus.
+	</notification>
+	<notification name="FirstSandbox">
+		Cette région est un bac à sable et est utilisée par les résidents pour apprendre à construire.
+
+Les objets que vous construisez ici seront supprimés après votre départ. N&apos;oubliez donc pas de cliquer droit et de choisir Prendre pour sauvegarder votre création dans votre inventaire.
+	</notification>
+	<notification name="FirstFlexible">
+		Cet objet est flexible. Les objets flexibles ne peuvent pas avoir de propriétés physiques et doivent rester fantômes.
+	</notification>
+	<notification name="FirstDebugMenus">
+		Vous avez ouvert le menu Avancé.
+
+Pour activer/désactiver ce menu,
+  Windows : Ctrl-Alt-D
+  Mac : ⌘-Opt-D
+	</notification>
+	<notification name="FirstSculptedPrim">
+		Vous êtes en train d&apos;éditer un sculptie. Pour spécifier la forme d&apos;un sculptie, vous devez utiliser une texture spécifique.
+	</notification>
+	<notification name="MaxListSelectMessage">
+		Vous ne pouvez sélectionner que [MAX_SELECT] objets maximum dans cette liste.
+	</notification>
+	<notification name="VoiceInviteP2P">
+		[NAME] vous invite à un chat vocal.
+Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cette personne, cliquez sur Ignorer.
+		<form name="form">
+			<button name="Accept" text="Accepter"/>
+			<button name="Decline" text="Refuser"/>
+			<button name="Mute" text="Ignorer"/>
+		</form>
+	</notification>
+	<notification name="AutoUnmuteByIM">
+		[FIRST] [LAST] a reçu un message instantané et n&apos;est donc plus ignoré.
+	</notification>
+	<notification name="AutoUnmuteByMoney">
+		[FIRST] [LAST] a reçu de l&apos;argent et n&apos;est donc plus ignoré.
+	</notification>
+	<notification name="AutoUnmuteByInventory">
+		[FIRST] [LAST] a reçu un inventaire et n&apos;est donc plus ignoré.
+	</notification>
+	<notification name="VoiceInviteGroup">
+		[NAME] a rejoint un chat vocal avec le groupe [GROUP].
+Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cette personne, cliquez sur Ignorer.
+		<form name="form">
+			<button name="Accept" text="Accepter"/>
+			<button name="Decline" text="Refuser"/>
+			<button name="Mute" text="Ignorer"/>
+		</form>
+	</notification>
+	<notification name="VoiceInviteAdHoc">
+		[NAME] a rejoint un chat vocal avec conférence.
+Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cet utilisateur, cliquez sur Ignorer.
+		<form name="form">
+			<button name="Accept" text="Accepter"/>
+			<button name="Decline" text="Refuser"/>
+			<button name="Mute" text="Ignorer"/>
+		</form>
+	</notification>
+	<notification name="InviteAdHoc">
+		[NAME] vous invite à un chat conférence.
+Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cet utilisateur, cliquez sur Ignorer.
+		<form name="form">
+			<button name="Accept" text="Accepter"/>
+			<button name="Decline" text="Refuser"/>
+			<button name="Mute" text="Ignorer"/>
+		</form>
+	</notification>
+	<notification name="VoiceChannelFull">
+		L&apos;appel auquel vous essayez de participer, [VOICE_CHANNEL_NAME], a atteint le nombre maximum de participants. Veuillez réessayer ultérieurement.
+	</notification>
+	<notification name="ProximalVoiceChannelFull">
+		Nous sommes désolés. Le nombre maximum de conversations vocales a été atteint dans cette zone. Veuillez trouver un autre endroit pour discuter.
+	</notification>
+	<notification name="VoiceChannelDisconnected">
+		Vous avez été déconnecté(e) de [VOICE_CHANNEL_NAME]. Vous allez maintenant être reconnecté au chat vocal spatial.
+	</notification>
+	<notification name="VoiceChannelDisconnectedP2P">
+		[VOICE_CHANNEL_NAME] a mis fin à l&apos;appel. Vous allez maintenant être reconnecté au chat vocal spatial.
+	</notification>
+	<notification name="P2PCallDeclined">
+		[VOICE_CHANNEL_NAME] a refusé votre appel. Vous allez maintenant être reconnecté au chat vocal spatial.
+	</notification>
+	<notification name="P2PCallNoAnswer">
+		[VOICE_CHANNEL_NAME] ne peut pas prendre votre appel. Vous allez maintenant être reconnecté au chat vocal spatial.
+	</notification>
+	<notification name="VoiceChannelJoinFailed">
+		Echec de la connexion avec [VOICE_CHANNEL_NAME], veuillez réessayer ultérieurement. Vous allez maintenant être reconnecté au chat vocal spatial.
+	</notification>
+	<notification name="VoiceLoginRetry">
+		Nous sommes en train de créer un canal vocal pour vous. Veuillez patienter quelques instants.
+	</notification>
+	<notification name="Cannot enter parcel: not a group member">
+		Seuls les membres d&apos;un certain groupe peuvent visiter cette zone.
+	</notification>
+	<notification name="Cannot enter parcel: banned">
+		Vous ne pouvez pas pénétrer sur ce terrain car l&apos;accès vous y est interdit.
+	</notification>
+	<notification name="Cannot enter parcel: not on access list">
+		Vous ne pouvez pas pénétrer sur ce terrain car vous n&apos;avez pas les droits d&apos;accès requis.
+	</notification>
+	<notification name="VoiceNotAllowed">
+		Vous n&apos;êtes pas autorisé à vous connecter au chat vocal pour [VOICE_CHANNEL_NAME].
+	</notification>
+	<notification name="VoiceCallGenericError">
+		Une erreur est survenue pendant la connexion au chat vocal pour [VOICE_CHANNEL_NAME]. Veuillez réessayer ultérieurement.
+	</notification>
+	<notification name="ServerVersionChanged">
+		La région dans laquelle vous avez pénétré utilise une version de serveur différente, ce qui peut avoir un impact sur votre performance. Cliquez pour voir les notes de version.
+	</notification>
+	<notification name="UnsupportedCommandSLURL">
+		La SLurl que vous avez saisie n&apos;est pas prise en charge.
+	</notification>
+	<notification name="IMToast">
+		<form name="form">
+			<button name="respondbutton" text="Répondre"/>
+		</form>
+	</notification>
+	<notification name="AttachmentSaved">
+		L&apos;élément joint a été sauvegardé.
+	</notification>
+	<notification name="UnableToFindHelpTopic">
+		Impossible de trouver l&apos;aide.
+	</notification>
+	<global name="UnsupportedCPU">
+		- Votre processeur ne remplit pas les conditions minimum requises.
+	</global>
+	<global name="UnsupportedGLRequirements">
+		Vous semblez ne pas avoir le matériel requis pour utiliser [APP_NAME]. [APP_NAME] requiert une carte graphique OpenGL avec une prise en charge du multitexturing. Si vous avez une telle carte, assurez-vous que vous avez aussi les pilotes les plus récents pour la carte, ainsi que les service packs et les patchs pour votre système d&apos;exploitation.
+
+Si vous avez toujours des problèmes, veuillez consulter la page [SUPPORT_SITE].
+	</global>
+	<global name="UnsupportedCPUAmount">
+		796
+	</global>
+	<global name="UnsupportedRAMAmount">
+		510
+	</global>
+	<global name="UnsupportedGPU">
+		- Votre carte graphique ne remplit pas les conditions minimum requises.
+	</global>
+	<global name="UnsupportedRAM">
+		- Votre mémoire système ne remplit pas les conditions minimum requises.
+	</global>
+	<global name="PermYes">
+		Oui
+	</global>
+	<global name="PermNo">
+		Non
+	</global>
+	<global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+		Si vous possédez un terrain, vous pouvez le définir comme domicile. 
+Sinon, consultez la carte et trouvez les « infohubs ».
+	</global>
+</notifications>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
index afadd109b1d..3a13748efab 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
@@ -1,38 +1,38 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profile Edit" name="edit_profile_panel">
-	<string name="CaptionTextAcctInfo">
-		[ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-	</string>
-	<string name="AcctTypeResident" value="Résident"/>
-	<string name="AcctTypeTrial" value="Essai"/>
-	<string name="AcctTypeCharterMember" value="Membre originaire"/>
-	<string name="AcctTypeEmployee" value="Employé(e) de Linden Lab"/>
-	<string name="PaymentInfoUsed" value="Infos de paiement utilisées"/>
-	<string name="PaymentInfoOnFile" value="Infos de paiement enregistrées"/>
-	<string name="NoPaymentInfoOnFile" value="Aucune info de paiement"/>
-	<string name="AgeVerified" value="Âge vérifié"/>
-	<string name="NotAgeVerified" value="Âge non vérifié"/>
-	<string name="partner_edit_link_url">
-		http://www.secondlife.com/account/partners.php?lang=fr
-	</string>
-	<string name="no_partner_text" value="Aucun"/>
-	<scroll_container name="profile_scroll">
-		<panel name="scroll_content_panel">
-			<panel name="data_panel">
-				<panel name="lifes_images_panel">
-					<icon label="" name="2nd_life_edit_icon" tool_tip="Cliquez pour sélectionner une image"/>
-				</panel>
-				<icon label="" name="real_world_edit_icon" tool_tip="Cliquez pour sélectionner une image"/>
-				<text name="title_homepage_text">
-					Page d&apos;accueil :
-				</text>
-				<check_box label="Afficher dans les résultats de recherche" name="show_in_search_checkbox"/>
-				<text name="title_acc_status_text" value="Statut du compte :"/>
-			</panel>
-		</panel>
-	</scroll_container>
-	<panel name="profile_me_buttons_panel">
-		<button label="Enregistrer les changements" name="save_btn"/>
-		<button label="Annuler" name="cancel_btn"/>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profile Edit" name="edit_profile_panel">
+	<string name="CaptionTextAcctInfo">
+		[ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+	</string>
+	<string name="AcctTypeResident" value="Résident"/>
+	<string name="AcctTypeTrial" value="Essai"/>
+	<string name="AcctTypeCharterMember" value="Membre originaire"/>
+	<string name="AcctTypeEmployee" value="Employé(e) de Linden Lab"/>
+	<string name="PaymentInfoUsed" value="Infos de paiement utilisées"/>
+	<string name="PaymentInfoOnFile" value="Infos de paiement enregistrées"/>
+	<string name="NoPaymentInfoOnFile" value="Aucune info de paiement"/>
+	<string name="AgeVerified" value="Âge vérifié"/>
+	<string name="NotAgeVerified" value="Âge non vérifié"/>
+	<string name="partner_edit_link_url">
+		http://www.secondlife.com/account/partners.php?lang=fr
+	</string>
+	<string name="no_partner_text" value="Aucun"/>
+	<scroll_container name="profile_scroll">
+		<panel name="scroll_content_panel">
+			<panel name="data_panel">
+				<panel name="lifes_images_panel">
+					<icon label="" name="2nd_life_edit_icon" tool_tip="Cliquez pour sélectionner une image"/>
+				</panel>
+				<icon label="" name="real_world_edit_icon" tool_tip="Cliquez pour sélectionner une image"/>
+				<text name="title_homepage_text">
+					Page d&apos;accueil :
+				</text>
+				<check_box label="Afficher dans les résultats de recherche" name="show_in_search_checkbox"/>
+				<text name="title_acc_status_text" value="Statut du compte :"/>
+			</panel>
+		</panel>
+	</scroll_container>
+	<panel name="profile_me_buttons_panel">
+		<button label="Enregistrer les changements" name="save_btn"/>
+		<button label="Annuler" name="cancel_btn"/>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_invite.xml b/indra/newview/skins/default/xui/fr/panel_group_invite.xml
index ae01f05bfbf..7055d9e3f26 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_invite.xml
@@ -1,29 +1,29 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Inviter un résident" name="invite_panel">
-	<panel.string name="confirm_invite_owner_str">
-		Etes-vous certain de vouloir inviter un/de nouveau(x) propriétaire(s) ? Ce choix est permanent !
-	</panel.string>
-	<panel.string name="loading">
-		(en cours de chargement...)
-	</panel.string>
-	<panel.string name="already_in_group">
-		Certains des avatars font déjà partie du groupe et n&apos;ont pas été invités.
-	</panel.string>
-	<text name="help_text">
-		Vous pouvez inviter plusieurs résidents
-à la fois. Cliquez d&apos;abord sur
-Choisir un résident.
-	</text>
-	<button label="Choisir un résident" name="add_button" tool_tip=""/>
-	<name_list name="invitee_list" tool_tip="Pour sélectionner plusieurs noms, maintenez la touche Ctrl enfoncée en cliquant sur le nom des résidents."/>
-	<button label="Supprimer de la liste" name="remove_button" tool_tip="Supprime les résidents sélectionnés de la liste des invités."/>
-	<text name="role_text">
-		Assignez-leur un rôle :
-	</text>
-	<combo_box name="role_name" tool_tip="Choisissez des rôles à assigner aux membres dans la liste."/>
-	<button label="Envoyer les invitations" name="ok_button"/>
-	<button label="Annuler" name="cancel_button"/>
-	<string name="GroupInvitation">
-		Invitations au groupe
-	</string>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Inviter un résident" name="invite_panel">
+	<panel.string name="confirm_invite_owner_str">
+		Etes-vous certain de vouloir inviter un/de nouveau(x) propriétaire(s) ? Ce choix est permanent !
+	</panel.string>
+	<panel.string name="loading">
+		(en cours de chargement...)
+	</panel.string>
+	<panel.string name="already_in_group">
+		Certains des avatars font déjà partie du groupe et n&apos;ont pas été invités.
+	</panel.string>
+	<text name="help_text">
+		Vous pouvez inviter plusieurs résidents
+à la fois. Cliquez d&apos;abord sur
+Choisir un résident.
+	</text>
+	<button label="Choisir un résident" name="add_button" tool_tip=""/>
+	<name_list name="invitee_list" tool_tip="Pour sélectionner plusieurs noms, maintenez la touche Ctrl enfoncée en cliquant sur le nom des résidents."/>
+	<button label="Supprimer de la liste" name="remove_button" tool_tip="Supprime les résidents sélectionnés de la liste des invités."/>
+	<text name="role_text">
+		Assignez-leur un rôle :
+	</text>
+	<combo_box name="role_name" tool_tip="Choisissez des rôles à assigner aux membres dans la liste."/>
+	<button label="Envoyer les invitations" name="ok_button"/>
+	<button label="Annuler" name="cancel_button"/>
+	<string name="GroupInvitation">
+		Invitations au groupe
+	</string>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_land_money.xml b/indra/newview/skins/default/xui/fr/panel_group_land_money.xml
index 9a24b7a6871..3ffdf53e7cd 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_land_money.xml
@@ -1,86 +1,86 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Terrain et L$" name="land_money_tab">
-	<string name="help_text">
-		Les parcelles appartenant au groupe sont indiquées avec le détails des contributions. Un avertissement apparaît si la surface utilisée par le groupe est supérieure ou égale au total des contributions. Les onglets Planification, Détails et Ventes correspondent aux finances du groupe.
-	</string>
-	<button label="?" name="help_button"/>
-	<string name="cant_view_group_land_text">
-		Vous n&apos;avez pas la permission de voir quel terrain possède ce groupe.
-	</string>
-	<string name="cant_view_group_accounting_text">
-		Vous n&apos;avez pas la permission d&apos;accéder aux informations
-financières de ce groupe.
-	</string>
-	<string name="loading_txt">
-		Chargement...
-	</string>
-	<text name="group_land_heading">
-		Terrain du groupe
-	</text>
-	<scroll_list name="group_parcel_list">
-		<column label="Parcelle" name="name"/>
-		<column label="Région" name="location"/>
-		<column label="Type" name="type"/>
-		<column label="Surface" name="area"/>
-		<column label="" name="hidden"/>
-	</scroll_list>
-	<button label="Carte" label_selected="Carte" name="map_button"/>
-	<text name="total_contributed_land_label">
-		Total des contributions :
-	</text>
-	<text name="total_contributed_land_value">
-		[AREA] m²
-	</text>
-	<text name="total_land_in_use_label">
-		Superficie déjà utilisée :
-	</text>
-	<text name="total_land_in_use_value">
-		[AREA] m²
-	</text>
-	<text name="land_available_label">
-		Superficie disponible :
-	</text>
-	<text name="land_available_value">
-		[AREA] m²
-	</text>
-	<text name="your_contribution_label">
-		Votre contribution :
-	</text>
-	<string name="land_contrib_error">
-		Impossible de définir votre don de terre.
-	</string>
-	<text name="your_contribution_units">
-		( m² )
-	</text>
-	<text name="your_contribution_max_value">
-		([AMOUNT] max.)
-	</text>
-	<text name="group_over_limit_text">
-		Une contribution supplémentaire du groupe est requise pour prendre en
-charge le terrain utilisé.
-	</text>
-	<text name="group_money_heading">
-		Finances
-	</text>
-	<tab_container name="group_money_tab_container">
-		<panel label="Planification" name="group_money_planning_tab">
-			<text_editor name="group_money_planning_text">
-				Calcul en cours...
-			</text_editor>
-		</panel>
-		<panel label="Détails" name="group_money_details_tab">
-			<text_editor name="group_money_details_text">
-				Calcul en cours...
-			</text_editor>
-			<button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="earlier_details_button" tool_tip="Reculer dans le temps"/>
-			<button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="later_details_button" tool_tip="Avancer dans le temps"/>
-		</panel>
-		<panel label="Ventes" name="group_money_sales_tab">
-			<text_editor name="group_money_sales_text">
-				Calcul en cours...
-			</text_editor>
-			<button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="earlier_sales_button" tool_tip="Reculer dans le temps"/>
-			<button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="later_sales_button" tool_tip="Avancer dans le temps"/>
-		</panel>
-	</tab_container>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Terrain et L$" name="land_money_tab">
+	<string name="help_text">
+		Les parcelles appartenant au groupe sont indiquées avec le détails des contributions. Un avertissement apparaît si la surface utilisée par le groupe est supérieure ou égale au total des contributions. Les onglets Planification, Détails et Ventes correspondent aux finances du groupe.
+	</string>
+	<button label="?" name="help_button"/>
+	<string name="cant_view_group_land_text">
+		Vous n&apos;avez pas la permission de voir quel terrain possède ce groupe.
+	</string>
+	<string name="cant_view_group_accounting_text">
+		Vous n&apos;avez pas la permission d&apos;accéder aux informations
+financières de ce groupe.
+	</string>
+	<string name="loading_txt">
+		Chargement...
+	</string>
+	<text name="group_land_heading">
+		Terrain du groupe
+	</text>
+	<scroll_list name="group_parcel_list">
+		<column label="Parcelle" name="name"/>
+		<column label="Région" name="location"/>
+		<column label="Type" name="type"/>
+		<column label="Surface" name="area"/>
+		<column label="" name="hidden"/>
+	</scroll_list>
+	<button label="Carte" label_selected="Carte" name="map_button"/>
+	<text name="total_contributed_land_label">
+		Total des contributions :
+	</text>
+	<text name="total_contributed_land_value">
+		[AREA] m²
+	</text>
+	<text name="total_land_in_use_label">
+		Superficie déjà utilisée :
+	</text>
+	<text name="total_land_in_use_value">
+		[AREA] m²
+	</text>
+	<text name="land_available_label">
+		Superficie disponible :
+	</text>
+	<text name="land_available_value">
+		[AREA] m²
+	</text>
+	<text name="your_contribution_label">
+		Votre contribution :
+	</text>
+	<string name="land_contrib_error">
+		Impossible de définir votre don de terre.
+	</string>
+	<text name="your_contribution_units">
+		( m² )
+	</text>
+	<text name="your_contribution_max_value">
+		([AMOUNT] max.)
+	</text>
+	<text name="group_over_limit_text">
+		Une contribution supplémentaire du groupe est requise pour prendre en
+charge le terrain utilisé.
+	</text>
+	<text name="group_money_heading">
+		Finances
+	</text>
+	<tab_container name="group_money_tab_container">
+		<panel label="Planification" name="group_money_planning_tab">
+			<text_editor name="group_money_planning_text">
+				Calcul en cours...
+			</text_editor>
+		</panel>
+		<panel label="Détails" name="group_money_details_tab">
+			<text_editor name="group_money_details_text">
+				Calcul en cours...
+			</text_editor>
+			<button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="earlier_details_button" tool_tip="Reculer dans le temps"/>
+			<button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="later_details_button" tool_tip="Avancer dans le temps"/>
+		</panel>
+		<panel label="Ventes" name="group_money_sales_tab">
+			<text_editor name="group_money_sales_text">
+				Calcul en cours...
+			</text_editor>
+			<button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="earlier_sales_button" tool_tip="Reculer dans le temps"/>
+			<button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="later_sales_button" tool_tip="Avancer dans le temps"/>
+		</panel>
+	</tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_list_item.xml b/indra/newview/skins/default/xui/fr/panel_group_list_item.xml
index 15d48c4eb4c..a61cb787a83 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_list_item.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_list_item.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="group_list_item">
-	<text name="group_name" value="Inconnu"/>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="group_list_item">
+	<text name="group_name" value="Inconnu"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_notices.xml b/indra/newview/skins/default/xui/fr/panel_group_notices.xml
index b719f1f07ff..432bb8b9c16 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_notices.xml
@@ -1,67 +1,67 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Notices" name="notices_tab">
-	<text name="help_text">
-		Les notices vous permettent d&apos;envoyer des messages et pièces-jointes aux membres du groupe autorisés à les recevoir. Vous pouvez désactiver la réception des notices à l&apos;onglet Général.
-	</text>
-	<text name="no_notices_text">
-		Aucune notice
-	</text>
-	<button label="?" label_selected="?" name="help_button"/>
-	<text name="lbl">
-		Anciennes notices du groupe
-	</text>
-	<text name="lbl2">
-		Les notes sont conservées pendant 14 jours. La limite est de 200 notes quotidiennes par groupe.
-	</text>
-	<scroll_list name="notice_list">
-		<column label="" name="icon"/>
-		<column label="Sujet" name="subject"/>
-		<column label="De" name="from"/>
-		<column label="Date" name="date"/>
-	</scroll_list>
-	<text name="notice_list_none_found">
-		Aucun résultat.
-	</text>
-	<button label="Nouvelle note" label_selected="Créer une notice" name="create_new_notice"/>
-	<button label="Rafraîchir" label_selected="Rafraîchir la liste" name="refresh_notices"/>
-	<panel label="Créer une notice" name="panel_create_new_notice">
-		<text name="lbl">
-			Créer une notice
-		</text>
-		<text name="lbl2">
-			Vous pouvez ajouter un objet simple à la note en le faisant glisser de votre inventaire vers cette section. Les objets joints doivent pouvoir être copiés et transférés. Vous ne pouvez pas envoyer de dossier.
-		</text>
-		<text bottom_delta="-79" left="20" name="lbl3">
-			Sujet :
-		</text>
-		<line_editor left_delta="61" name="create_subject" width="331"/>
-		<text left="20" name="lbl4">
-			Message :
-		</text>
-		<text_editor bottom_delta="-90" height="104" left_delta="61" name="create_message" width="330"/>
-		<text name="lbl5" width="68">
-			Pièce-jointe :
-		</text>
-		<line_editor left_delta="74" name="create_inventory_name" width="190"/>
-		<button label="Supprimer pièce-jointe" label_selected="Supprimer pièce-jointe" left="274" name="remove_attachment" width="140"/>
-		<button label="Envoyer" label_selected="Envoyer" left="274" name="send_notice" width="140"/>
-		<panel name="drop_target2" tool_tip="Pour joindre un objet de l&apos;inventaire à la notice, faites-le glisser dans la boîte de message. Pour envoyer l&apos;objet avec la notice, vous devez avoir la permission de le copier et de le transférer."/>
-		<panel name="drop_target" tool_tip="Pour joindre un objet de l&apos;inventaire à la notice, faites-le glisser dans la boîte de message. Pour envoyer l&apos;objet avec la notice, vous devez avoir la permission de le copier et de le transférer."/>
-	</panel>
-	<panel label="Voir ancienne notice" name="panel_view_past_notice">
-		<text name="lbl">
-			Détails
-		</text>
-		<text name="lbl2">
-			Pour envoyer une nouvelle notice, cliquez sur Créer une notice ci-dessus.
-		</text>
-		<text name="lbl3">
-			Sujet :
-		</text>
-		<text name="lbl4">
-			Message :
-		</text>
-		<button label="Ouvrir pièce-jointe" label_selected="Ouvrir pièce-jointe" name="open_attachment" width="118"/>
-		<line_editor left="128" name="view_inventory_name" width="256"/>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Notices" name="notices_tab">
+	<text name="help_text">
+		Les notices vous permettent d&apos;envoyer des messages et pièces-jointes aux membres du groupe autorisés à les recevoir. Vous pouvez désactiver la réception des notices à l&apos;onglet Général.
+	</text>
+	<text name="no_notices_text">
+		Aucune notice
+	</text>
+	<button label="?" label_selected="?" name="help_button"/>
+	<text name="lbl">
+		Anciennes notices du groupe
+	</text>
+	<text name="lbl2">
+		Les notes sont conservées pendant 14 jours. La limite est de 200 notes quotidiennes par groupe.
+	</text>
+	<scroll_list name="notice_list">
+		<column label="" name="icon"/>
+		<column label="Sujet" name="subject"/>
+		<column label="De" name="from"/>
+		<column label="Date" name="date"/>
+	</scroll_list>
+	<text name="notice_list_none_found">
+		Aucun résultat.
+	</text>
+	<button label="Nouvelle note" label_selected="Créer une notice" name="create_new_notice"/>
+	<button label="Rafraîchir" label_selected="Rafraîchir la liste" name="refresh_notices"/>
+	<panel label="Créer une notice" name="panel_create_new_notice">
+		<text name="lbl">
+			Créer une notice
+		</text>
+		<text name="lbl2">
+			Vous pouvez ajouter un objet simple à la note en le faisant glisser de votre inventaire vers cette section. Les objets joints doivent pouvoir être copiés et transférés. Vous ne pouvez pas envoyer de dossier.
+		</text>
+		<text bottom_delta="-79" left="20" name="lbl3">
+			Sujet :
+		</text>
+		<line_editor left_delta="61" name="create_subject" width="331"/>
+		<text left="20" name="lbl4">
+			Message :
+		</text>
+		<text_editor bottom_delta="-90" height="104" left_delta="61" name="create_message" width="330"/>
+		<text name="lbl5" width="68">
+			Pièce-jointe :
+		</text>
+		<line_editor left_delta="74" name="create_inventory_name" width="190"/>
+		<button label="Supprimer pièce-jointe" label_selected="Supprimer pièce-jointe" left="274" name="remove_attachment" width="140"/>
+		<button label="Envoyer" label_selected="Envoyer" left="274" name="send_notice" width="140"/>
+		<panel name="drop_target2" tool_tip="Pour joindre un objet de l&apos;inventaire à la notice, faites-le glisser dans la boîte de message. Pour envoyer l&apos;objet avec la notice, vous devez avoir la permission de le copier et de le transférer."/>
+		<panel name="drop_target" tool_tip="Pour joindre un objet de l&apos;inventaire à la notice, faites-le glisser dans la boîte de message. Pour envoyer l&apos;objet avec la notice, vous devez avoir la permission de le copier et de le transférer."/>
+	</panel>
+	<panel label="Voir ancienne notice" name="panel_view_past_notice">
+		<text name="lbl">
+			Détails
+		</text>
+		<text name="lbl2">
+			Pour envoyer une nouvelle notice, cliquez sur Créer une notice ci-dessus.
+		</text>
+		<text name="lbl3">
+			Sujet :
+		</text>
+		<text name="lbl4">
+			Message :
+		</text>
+		<button label="Ouvrir pièce-jointe" label_selected="Ouvrir pièce-jointe" name="open_attachment" width="118"/>
+		<line_editor left="128" name="view_inventory_name" width="256"/>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_roles.xml b/indra/newview/skins/default/xui/fr/panel_group_roles.xml
index 1b716babc65..65aaab40f17 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_roles.xml
@@ -1,113 +1,113 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Membres et rôles" name="roles_tab">
-	<panel.string name="default_needs_apply_text">
-		Certains changements n&apos;ont pas été appliqués sur ce sous-onglet.
-	</panel.string>
-	<panel.string name="want_apply_text">
-		Voulez-vous enregistrer les modifications ?
-	</panel.string>
-	<tab_container height="164" name="roles_tab_container">
-		<panel height="148" label="Membres" name="members_sub_tab" tool_tip="Membres">
-			<panel.string name="help_text">
-				Vous pouvez ajouter ou supprimer les rôles assignés aux membres.
-Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la touche Ctrl enfoncée.
-			</panel.string>
-			<filter_editor label="Filtrer les membres" name="filter_input"/>
-			<name_list bottom_delta="-105" height="104" name="member_list">
-				<name_list.columns label="Membre" name="name"/>
-				<name_list.columns label="Donations" name="donated" width="116"/>
-				<name_list.columns label="En ligne" name="online" width="136"/>
-			</name_list>
-			<button label="Inviter" name="member_invite" width="165"/>
-			<button label="Expulser" name="member_eject"/>
-		</panel>
-		<panel height="148" label="Rôles" name="roles_sub_tab">
-			<panel.string name="help_text">
-				Chaque rôle possède un titre et des pouvoirs. Un membre peut avoir plusieurs rôles mais il ne peut y avoir que 10 rôles dans un groupe, Visiteur et Propriétaire inclus.
-			</panel.string>
-			<panel.string name="cant_delete_role">
-				Les rôles Tous et Propriétaires sont spéciaux et ne peuvent pas être supprimés.
-			</panel.string>
-			<filter_editor label="Filtrer les rôles" name="filter_input"/>
-			<scroll_list bottom_delta="-104" height="104" name="role_list">
-				<scroll_list.columns label="Rôle" name="name"/>
-				<scroll_list.columns label="Titre" name="title"/>
-				<scroll_list.columns label="Membres" name="members"/>
-			</scroll_list>
-			<button label="Ajouter un rôle" name="role_create"/>
-			<button label="Supprimer le rôle" name="role_delete"/>
-		</panel>
-		<panel height="148" label="Pouvoirs" name="actions_sub_tab" tool_tip="Vous pouvez afficher une description du pouvoir et voir quels membres et rôles peuvent s&apos;en servir.">
-			<panel.string name="help_text">
-				Les pouvoirs déterminent les facultés de chaque membre dans le groupe.
-			</panel.string>
-			<filter_editor label="Filtrer les pouvoirs" name="filter_input"/>
-			<scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Sélectionnez un pouvoir pour en afficher les détails.">
-				<scroll_list.columns label="" name="icon"/>
-				<scroll_list.columns label="" name="action"/>
-			</scroll_list>
-		</panel>
-	</tab_container>
-	<panel name="members_footer">
-		<text name="static">
-			Rôles assignés
-		</text>
-		<scroll_list name="member_assigned_roles">
-			<scroll_list.columns label="" name="checkbox"/>
-			<scroll_list.columns label="" name="role"/>
-		</scroll_list>
-		<text name="static2">
-			Pouvoirs attribués
-		</text>
-		<scroll_list name="member_allowed_actions" tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l&apos;onglet Pouvoirs.">
-			<scroll_list.columns label="" name="icon"/>
-			<scroll_list.columns label="" name="action"/>
-		</scroll_list>
-	</panel>
-	<panel name="roles_footer">
-		<text name="static">
-			Nom
-		</text>
-		<line_editor name="role_name">
-			Employés
-		</line_editor>
-		<text name="static3">
-			Titre
-		</text>
-		<line_editor name="role_title">
-			(en attente)
-		</line_editor>
-		<text name="static2">
-			Description
-		</text>
-		<text_editor name="role_description">
-			(en attente)
-		</text_editor>
-		<text name="static4">
-			Membres assignés
-		</text>
-		<check_box label="Membres visibles" name="role_visible_in_list" tool_tip="Définit si les membres de ce rôle sont visibles à partir de l&apos;onglet Général aux personnes en dehors du groupe."/>
-		<text name="static5" tool_tip="Une liste des pouvoirs auquel le rôle sélectionné a accès.">
-			Pouvoirs attribués
-		</text>
-		<scroll_list name="role_allowed_actions" tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l&apos;onglet Pouvoirs.">
-			<scroll_list.columns label="" name="icon"/>
-			<scroll_list.columns label="" name="checkbox"/>
-			<scroll_list.columns label="" name="action"/>
-		</scroll_list>
-	</panel>
-	<panel name="actions_footer">
-		<text name="static">
-			Description
-		</text>
-		<text_editor name="action_description">
-			Ce pouvoir permet d&apos;expulser des membres du groupe. Seul un propriétaire peut expulser un autre propriétaire.
-		</text_editor>
-		<text name="static2">
-			Rôles avec ce pouvoir
-		</text>
-		<text name="static3">
-			Membres avec ce pouvoir
-		</text>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Membres et rôles" name="roles_tab">
+	<panel.string name="default_needs_apply_text">
+		Certains changements n&apos;ont pas été appliqués sur ce sous-onglet.
+	</panel.string>
+	<panel.string name="want_apply_text">
+		Voulez-vous enregistrer les modifications ?
+	</panel.string>
+	<tab_container height="164" name="roles_tab_container">
+		<panel height="148" label="Membres" name="members_sub_tab" tool_tip="Membres">
+			<panel.string name="help_text">
+				Vous pouvez ajouter ou supprimer les rôles assignés aux membres.
+Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la touche Ctrl enfoncée.
+			</panel.string>
+			<filter_editor label="Filtrer les membres" name="filter_input"/>
+			<name_list bottom_delta="-105" height="104" name="member_list">
+				<name_list.columns label="Membre" name="name"/>
+				<name_list.columns label="Donations" name="donated" width="116"/>
+				<name_list.columns label="En ligne" name="online" width="136"/>
+			</name_list>
+			<button label="Inviter" name="member_invite" width="165"/>
+			<button label="Expulser" name="member_eject"/>
+		</panel>
+		<panel height="148" label="Rôles" name="roles_sub_tab">
+			<panel.string name="help_text">
+				Chaque rôle possède un titre et des pouvoirs. Un membre peut avoir plusieurs rôles mais il ne peut y avoir que 10 rôles dans un groupe, Visiteur et Propriétaire inclus.
+			</panel.string>
+			<panel.string name="cant_delete_role">
+				Les rôles Tous et Propriétaires sont spéciaux et ne peuvent pas être supprimés.
+			</panel.string>
+			<filter_editor label="Filtrer les rôles" name="filter_input"/>
+			<scroll_list bottom_delta="-104" height="104" name="role_list">
+				<scroll_list.columns label="Rôle" name="name"/>
+				<scroll_list.columns label="Titre" name="title"/>
+				<scroll_list.columns label="Membres" name="members"/>
+			</scroll_list>
+			<button label="Ajouter un rôle" name="role_create"/>
+			<button label="Supprimer le rôle" name="role_delete"/>
+		</panel>
+		<panel height="148" label="Pouvoirs" name="actions_sub_tab" tool_tip="Vous pouvez afficher une description du pouvoir et voir quels membres et rôles peuvent s&apos;en servir.">
+			<panel.string name="help_text">
+				Les pouvoirs déterminent les facultés de chaque membre dans le groupe.
+			</panel.string>
+			<filter_editor label="Filtrer les pouvoirs" name="filter_input"/>
+			<scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Sélectionnez un pouvoir pour en afficher les détails.">
+				<scroll_list.columns label="" name="icon"/>
+				<scroll_list.columns label="" name="action"/>
+			</scroll_list>
+		</panel>
+	</tab_container>
+	<panel name="members_footer">
+		<text name="static">
+			Rôles assignés
+		</text>
+		<scroll_list name="member_assigned_roles">
+			<scroll_list.columns label="" name="checkbox"/>
+			<scroll_list.columns label="" name="role"/>
+		</scroll_list>
+		<text name="static2">
+			Pouvoirs attribués
+		</text>
+		<scroll_list name="member_allowed_actions" tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l&apos;onglet Pouvoirs.">
+			<scroll_list.columns label="" name="icon"/>
+			<scroll_list.columns label="" name="action"/>
+		</scroll_list>
+	</panel>
+	<panel name="roles_footer">
+		<text name="static">
+			Nom
+		</text>
+		<line_editor name="role_name">
+			Employés
+		</line_editor>
+		<text name="static3">
+			Titre
+		</text>
+		<line_editor name="role_title">
+			(en attente)
+		</line_editor>
+		<text name="static2">
+			Description
+		</text>
+		<text_editor name="role_description">
+			(en attente)
+		</text_editor>
+		<text name="static4">
+			Membres assignés
+		</text>
+		<check_box label="Membres visibles" name="role_visible_in_list" tool_tip="Définit si les membres de ce rôle sont visibles à partir de l&apos;onglet Général aux personnes en dehors du groupe."/>
+		<text name="static5" tool_tip="Une liste des pouvoirs auquel le rôle sélectionné a accès.">
+			Pouvoirs attribués
+		</text>
+		<scroll_list name="role_allowed_actions" tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l&apos;onglet Pouvoirs.">
+			<scroll_list.columns label="" name="icon"/>
+			<scroll_list.columns label="" name="checkbox"/>
+			<scroll_list.columns label="" name="action"/>
+		</scroll_list>
+	</panel>
+	<panel name="actions_footer">
+		<text name="static">
+			Description
+		</text>
+		<text_editor name="action_description">
+			Ce pouvoir permet d&apos;expulser des membres du groupe. Seul un propriétaire peut expulser un autre propriétaire.
+		</text_editor>
+		<text name="static2">
+			Rôles avec ce pouvoir
+		</text>
+		<text name="static3">
+			Membres avec ce pouvoir
+		</text>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml b/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml
index 7f8f03f9aba..340ca75d196 100644
--- a/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
-	<button label="Voir le profil" name="view_profile_btn"/>
-	<button label="Devenir amis" name="add_friend_btn"/>
-	<button label="Partager" name="share_btn"/>
-	<panel name="panel_call_buttons">
-		<button label="Appeler" name="call_btn"/>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+	<button label="Voir le profil" name="view_profile_btn"/>
+	<button label="Devenir amis" name="add_friend_btn"/>
+	<button label="Partager" name="share_btn"/>
+	<panel name="panel_call_buttons">
+		<button label="Appeler" name="call_btn"/>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml
index 3c174aa45bd..284590cd5d7 100644
--- a/indra/newview/skins/default/xui/fr/panel_login.xml
+++ b/indra/newview/skins/default/xui/fr/panel_login.xml
@@ -1,19 +1,19 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_login">
-	<panel.string name="create_account_url">
-		http://secondlife.com/registration/
-	</panel.string>
-	<panel.string name="forgot_password_url">
-		http://secondlife.com/account/request.php
-	</panel.string>
-	<panel name="login_widgets">
-		<line_editor name="first_name_edit" tool_tip="Prénom sur [SECOND_LIFE]"/>
-		<line_editor name="last_name_edit" tool_tip="Nom sur [SECOND_LIFE]"/>
-		<text name="start_location_text">
-			Lieu de départ :
-		</text>
-		<text name="create_new_account_text">
-			Créer un compte
-		</text>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_login">
+	<panel.string name="create_account_url">
+		http://secondlife.com/registration/
+	</panel.string>
+	<panel.string name="forgot_password_url">
+		http://secondlife.com/account/request.php
+	</panel.string>
+	<panel name="login_widgets">
+		<line_editor name="first_name_edit" tool_tip="Prénom sur [SECOND_LIFE]"/>
+		<line_editor name="last_name_edit" tool_tip="Nom sur [SECOND_LIFE]"/>
+		<text name="start_location_text">
+			Lieu de départ :
+		</text>
+		<text name="create_new_account_text">
+			Créer un compte
+		</text>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml
index 7aa8f244049..c236c59fbc8 100644
--- a/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="chat_bar">
-	<line_editor label="Cliquer ici pour chatter." name="chat_box" tool_tip="Appuyer sur Entrée pour dire, Ctrl-Entrée pour crier"/>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chat_bar">
+	<line_editor label="Cliquer ici pour chatter." name="chat_box" tool_tip="Appuyer sur Entrée pour dire, Ctrl-Entrée pour crier"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_picks.xml b/indra/newview/skins/default/xui/fr/panel_picks.xml
index 534af5ed3f2..25aeac9e755 100644
--- a/indra/newview/skins/default/xui/fr/panel_picks.xml
+++ b/indra/newview/skins/default/xui/fr/panel_picks.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Favoris" name="panel_picks">
-	<panel label="bottom_panel" name="edit_panel">
-		<button name="new_btn" tool_tip="Ajouter cet endroit à mes Favoris"/>
-	</panel>
-	<panel name="buttons_cucks">
-		<button label="Carte" name="show_on_map_btn"/>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Favoris" name="panel_picks">
+	<panel label="bottom_panel" name="edit_panel">
+		<button name="new_btn" tool_tip="Ajouter cet endroit à mes Favoris"/>
+	</panel>
+	<panel name="buttons_cucks">
+		<button label="Carte" name="show_on_map_btn"/>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
index 1f7c9a57dc8..e2d00a2421f 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
@@ -1,42 +1,42 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Chat écrit" name="chat">
-	<radio_group name="chat_font_size">
-		<radio_item label="Petite" name="radio"/>
-		<radio_item label="Moyenne" name="radio2"/>
-		<radio_item label="Grande" name="radio3"/>
-	</radio_group>
-	<color_swatch label="Vous" name="user"/>
-	<text name="text_box1">
-		Moi
-	</text>
-	<color_swatch label="Avatars" name="agent"/>
-	<text name="text_box2">
-		Avatars
-	</text>
-	<color_swatch label="IM" name="im"/>
-	<text name="text_box3">
-		IM
-	</text>
-	<color_swatch label="Système" name="system"/>
-	<text name="text_box4">
-		Système
-	</text>
-	<color_swatch label="Erreurs de script" name="script_error"/>
-	<text name="text_box5">
-		Erreurs de script
-	</text>
-	<color_swatch label="Objets" name="objects"/>
-	<text name="text_box6">
-		Objets
-	</text>
-	<color_swatch label="Propriétaire" name="owner"/>
-	<text name="text_box7">
-		Propriétaire
-	</text>
-	<color_swatch label="URL" name="links"/>
-	<text name="text_box9">
-		URL
-	</text>
-	<check_box initial_value="true" label="Jouer l&apos;animation clavier quand vous écrivez" name="play_typing_animation"/>
-	<check_box label="M&apos;envoyer les IM par e-mail une fois déconnecté" name="send_im_to_email"/>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Chat écrit" name="chat">
+	<radio_group name="chat_font_size">
+		<radio_item label="Petite" name="radio"/>
+		<radio_item label="Moyenne" name="radio2"/>
+		<radio_item label="Grande" name="radio3"/>
+	</radio_group>
+	<color_swatch label="Vous" name="user"/>
+	<text name="text_box1">
+		Moi
+	</text>
+	<color_swatch label="Avatars" name="agent"/>
+	<text name="text_box2">
+		Avatars
+	</text>
+	<color_swatch label="IM" name="im"/>
+	<text name="text_box3">
+		IM
+	</text>
+	<color_swatch label="Système" name="system"/>
+	<text name="text_box4">
+		Système
+	</text>
+	<color_swatch label="Erreurs de script" name="script_error"/>
+	<text name="text_box5">
+		Erreurs de script
+	</text>
+	<color_swatch label="Objets" name="objects"/>
+	<text name="text_box6">
+		Objets
+	</text>
+	<color_swatch label="Propriétaire" name="owner"/>
+	<text name="text_box7">
+		Propriétaire
+	</text>
+	<color_swatch label="URL" name="links"/>
+	<text name="text_box9">
+		URL
+	</text>
+	<check_box initial_value="true" label="Jouer l&apos;animation clavier quand vous écrivez" name="play_typing_animation"/>
+	<check_box label="M&apos;envoyer les IM par e-mail une fois déconnecté" name="send_im_to_email"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
index 2afd7152cb7..6a469c7322a 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
@@ -1,116 +1,116 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Graphiques" name="Display panel">
-	<text name="WindowSizeLabel">
-		Taille de la fenêtre :
-	</text>
-	<check_box label="Utiliser le plein écran" name="windowed mode"/>
-	<combo_box name="windowsize combo">
-		<combo_box.item label="640 x 480" name="640x480"/>
-		<combo_box.item label="800 x 600" name="800x600"/>
-		<combo_box.item label="720 x 480 (NTSC)" name="720x480"/>
-		<combo_box.item label="768 x 576 (PAL)" name="768x576"/>
-		<combo_box.item label="1024 x 768" name="1024x768"/>
-	</combo_box>
-	<text name="UI Size:">
-		Taille de l&apos;IU :
-	</text>
-	<text name="QualitySpeed">
-		Qualité et vitesse :
-	</text>
-	<text left="105" name="FasterText">
-		Plus rapide
-	</text>
-	<text name="BetterText">
-		Mieux
-	</text>
-	<text name="ShadersPrefText">
-		Faible
-	</text>
-	<text name="ShadersPrefText2">
-		Moyen
-	</text>
-	<text name="ShadersPrefText3">
-		Élevé
-	</text>
-	<text name="ShadersPrefText4">
-		Ultra
-	</text>
-	<panel label="CustomGraphics" name="CustomGraphics Panel">
-		<text name="ShadersText">
-			Effets :
-		</text>
-		<check_box initial_value="true" label="Placage de relief et brillance" name="BumpShiny"/>
-		<check_box initial_value="true" label="Effets de base" name="BasicShaders" tool_tip="Désactiver cette option peut empêcher certains drivers de cartes graphiques de planter."/>
-		<check_box initial_value="true" label="Effets atmosphériques" name="WindLightUseAtmosShaders"/>
-		<check_box initial_value="true" label="Reflets de l&apos;eau" name="Reflections"/>
-		<text name="ReflectionDetailText">
-			Objets reflétés :
-		</text>
-		<radio_group name="ReflectionDetailRadio">
-			<radio_item label="Terrain et Arbres" name="0"/>
-			<radio_item label="Objets statiques" name="1"/>
-			<radio_item label="Objets et avatars" name="2"/>
-			<radio_item label="Tout" name="3"/>
-		</radio_group>
-		<text name="AvatarRenderingText">
-			Rendu de l&apos;avatar :
-		</text>
-		<check_box initial_value="true" label="Avatars éloignés en 2D" name="AvatarImpostors"/>
-		<check_box initial_value="true" label="Accélération du rendu" name="AvatarVertexProgram"/>
-		<check_box initial_value="true" label="Mouvement des habits" name="AvatarCloth"/>
-		<slider label="Limite d&apos;affichage :" name="DrawDistance"/>
-		<text name="DrawDistanceMeterText2">
-			m
-		</text>
-		<slider label="Nombre de particules max. :" label_width="143" name="MaxParticleCount"/>
-		<slider label="Qualité post-traitement :" name="RenderPostProcess"/>
-		<text name="MeshDetailText">
-			Détails des rendus :
-		</text>
-		<slider label="  Objets :" name="ObjectMeshDetail"/>
-		<slider label="  Flexiprims :" name="FlexibleMeshDetail"/>
-		<slider label="  Arbres :" name="TreeMeshDetail"/>
-		<slider label="  Avatars :" name="AvatarMeshDetail"/>
-		<slider label="  Relief :" name="TerrainMeshDetail"/>
-		<slider label="  Ciel :" name="SkyMeshDetail"/>
-		<text name="PostProcessText">
-			Faible
-		</text>
-		<text name="ObjectMeshDetailText">
-			Faible
-		</text>
-		<text name="FlexibleMeshDetailText">
-			Faible
-		</text>
-		<text name="TreeMeshDetailText">
-			Faible
-		</text>
-		<text name="AvatarMeshDetailText">
-			Faible
-		</text>
-		<text name="TerrainMeshDetailText">
-			Faible
-		</text>
-		<text name="SkyMeshDetailText">
-			Faible
-		</text>
-		<text name="LightingDetailText">
-			Sources lumineuses :
-		</text>
-		<radio_group name="LightingDetailRadio">
-			<radio_item label="Soleil et lune uniquement" name="SunMoon"/>
-			<radio_item label="Lumières à proximité" name="LocalLights"/>
-		</radio_group>
-		<text left="380" name="TerrainDetailText">
-			Rendu du terrain :
-		</text>
-		<radio_group name="TerrainDetailRadio">
-			<radio_item label="Faible" name="0"/>
-			<radio_item label="Élevé" name="2"/>
-		</radio_group>
-	</panel>
-	<button label="Appliquer" label_selected="Appliquer" name="Apply"/>
-	<button label="Réinitialiser" name="Defaults"/>
-	<button label="Avancé" name="Advanced"/>
-	<button label="Matériel" label_selected="Matériel" name="GraphicsHardwareButton"/>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Graphiques" name="Display panel">
+	<text name="WindowSizeLabel">
+		Taille de la fenêtre :
+	</text>
+	<check_box label="Utiliser le plein écran" name="windowed mode"/>
+	<combo_box name="windowsize combo">
+		<combo_box.item label="640 x 480" name="640x480"/>
+		<combo_box.item label="800 x 600" name="800x600"/>
+		<combo_box.item label="720 x 480 (NTSC)" name="720x480"/>
+		<combo_box.item label="768 x 576 (PAL)" name="768x576"/>
+		<combo_box.item label="1024 x 768" name="1024x768"/>
+	</combo_box>
+	<text name="UI Size:">
+		Taille de l&apos;IU :
+	</text>
+	<text name="QualitySpeed">
+		Qualité et vitesse :
+	</text>
+	<text left="105" name="FasterText">
+		Plus rapide
+	</text>
+	<text name="BetterText">
+		Mieux
+	</text>
+	<text name="ShadersPrefText">
+		Faible
+	</text>
+	<text name="ShadersPrefText2">
+		Moyen
+	</text>
+	<text name="ShadersPrefText3">
+		Élevé
+	</text>
+	<text name="ShadersPrefText4">
+		Ultra
+	</text>
+	<panel label="CustomGraphics" name="CustomGraphics Panel">
+		<text name="ShadersText">
+			Effets :
+		</text>
+		<check_box initial_value="true" label="Placage de relief et brillance" name="BumpShiny"/>
+		<check_box initial_value="true" label="Effets de base" name="BasicShaders" tool_tip="Désactiver cette option peut empêcher certains drivers de cartes graphiques de planter."/>
+		<check_box initial_value="true" label="Effets atmosphériques" name="WindLightUseAtmosShaders"/>
+		<check_box initial_value="true" label="Reflets de l&apos;eau" name="Reflections"/>
+		<text name="ReflectionDetailText">
+			Objets reflétés :
+		</text>
+		<radio_group name="ReflectionDetailRadio">
+			<radio_item label="Terrain et Arbres" name="0"/>
+			<radio_item label="Objets statiques" name="1"/>
+			<radio_item label="Objets et avatars" name="2"/>
+			<radio_item label="Tout" name="3"/>
+		</radio_group>
+		<text name="AvatarRenderingText">
+			Rendu de l&apos;avatar :
+		</text>
+		<check_box initial_value="true" label="Avatars éloignés en 2D" name="AvatarImpostors"/>
+		<check_box initial_value="true" label="Accélération du rendu" name="AvatarVertexProgram"/>
+		<check_box initial_value="true" label="Mouvement des habits" name="AvatarCloth"/>
+		<slider label="Limite d&apos;affichage :" name="DrawDistance"/>
+		<text name="DrawDistanceMeterText2">
+			m
+		</text>
+		<slider label="Nombre de particules max. :" label_width="143" name="MaxParticleCount"/>
+		<slider label="Qualité post-traitement :" name="RenderPostProcess"/>
+		<text name="MeshDetailText">
+			Détails des rendus :
+		</text>
+		<slider label="  Objets :" name="ObjectMeshDetail"/>
+		<slider label="  Flexiprims :" name="FlexibleMeshDetail"/>
+		<slider label="  Arbres :" name="TreeMeshDetail"/>
+		<slider label="  Avatars :" name="AvatarMeshDetail"/>
+		<slider label="  Relief :" name="TerrainMeshDetail"/>
+		<slider label="  Ciel :" name="SkyMeshDetail"/>
+		<text name="PostProcessText">
+			Faible
+		</text>
+		<text name="ObjectMeshDetailText">
+			Faible
+		</text>
+		<text name="FlexibleMeshDetailText">
+			Faible
+		</text>
+		<text name="TreeMeshDetailText">
+			Faible
+		</text>
+		<text name="AvatarMeshDetailText">
+			Faible
+		</text>
+		<text name="TerrainMeshDetailText">
+			Faible
+		</text>
+		<text name="SkyMeshDetailText">
+			Faible
+		</text>
+		<text name="LightingDetailText">
+			Sources lumineuses :
+		</text>
+		<radio_group name="LightingDetailRadio">
+			<radio_item label="Soleil et lune uniquement" name="SunMoon"/>
+			<radio_item label="Lumières à proximité" name="LocalLights"/>
+		</radio_group>
+		<text left="380" name="TerrainDetailText">
+			Rendu du terrain :
+		</text>
+		<radio_group name="TerrainDetailRadio">
+			<radio_item label="Faible" name="0"/>
+			<radio_item label="Élevé" name="2"/>
+		</radio_group>
+	</panel>
+	<button label="Appliquer" label_selected="Appliquer" name="Apply"/>
+	<button label="Réinitialiser" name="Defaults"/>
+	<button label="Avancé" name="Advanced"/>
+	<button label="Matériel" label_selected="Matériel" name="GraphicsHardwareButton"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
index c1a6d450891..3beaaf5c792 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
@@ -1,21 +1,21 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Communication" name="im">
-	<panel.string name="log_in_to_change">
-		se connecter pour changer
-	</panel.string>
-	<button label="Vider le cache" name="clear_cache"/>
-	<text name="cache_size_label_l">
-		(Endroits, images, web, historique des recherches)
-	</text>
-	<check_box label="Seuls mes amis et groupes voient quand je suis en ligne" name="online_visibility"/>
-	<check_box label="Seuls mes amis et groupes peuvent m&apos;appeler ou m&apos;envoyer un IM" name="voice_call_friends_only_check"/>
-	<check_box label="Fermer le micro à la fin d&apos;un appel" name="auto_disengage_mic_check"/>
-	<check_box label="Accepter les cookies" name="cookies_enabled"/>
-	<check_box label="Sauvegarder les journaux sur mon ordinateur" name="log_instant_messages"/>
-	<radio_group name="ChatIMLogs">
-		<radio_item label="Chat" name="radio1"/>
-		<radio_item label="IM" name="radio2"/>
-	</radio_group>
-	<line_editor left="308" name="log_path_string" right="-20"/>
-	<button label="Parcourir" label_selected="Parcourir" name="log_path_button" width="150"/>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Communication" name="im">
+	<panel.string name="log_in_to_change">
+		se connecter pour changer
+	</panel.string>
+	<button label="Vider le cache" name="clear_cache"/>
+	<text name="cache_size_label_l">
+		(Endroits, images, web, historique des recherches)
+	</text>
+	<check_box label="Seuls mes amis et groupes voient quand je suis en ligne" name="online_visibility"/>
+	<check_box label="Seuls mes amis et groupes peuvent m&apos;appeler ou m&apos;envoyer un IM" name="voice_call_friends_only_check"/>
+	<check_box label="Fermer le micro à la fin d&apos;un appel" name="auto_disengage_mic_check"/>
+	<check_box label="Accepter les cookies" name="cookies_enabled"/>
+	<check_box label="Sauvegarder les journaux sur mon ordinateur" name="log_instant_messages"/>
+	<radio_group name="ChatIMLogs">
+		<radio_item label="Chat" name="radio1"/>
+		<radio_item label="IM" name="radio2"/>
+	</radio_group>
+	<line_editor left="308" name="log_path_string" right="-20"/>
+	<button label="Parcourir" label_selected="Parcourir" name="log_path_button" width="150"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
index 7f6c7c57bd9..2e8f5e9a8b4 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
@@ -1,46 +1,46 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Contrôle et caméra" name="Input panel">
-	<button label="Autres accessoires" name="joystick_setup_button" width="175"/>
-	<text name="Mouselook:">
-		Vue subjective :
-	</text>
-	<text name=" Mouse Sensitivity">
-		Sensibilité de la souris
-	</text>
-	<check_box label="Inverser" name="invert_mouse"/>
-	<text name="Network:">
-		Réseau :
-	</text>
-	<text name="Maximum bandwidth">
-		Bande passante maximale
-	</text>
-	<text name="text_box2">
-		kbps
-	</text>
-	<check_box label="Port de connexion personnalisé" name="connection_port_enabled"/>
-	<spinner label="Numéro de port :" name="web_proxy_port"/>
-	<text name="cache_size_label_l">
-		Taille de la mémoire
-	</text>
-	<text name="text_box5">
-		Mo
-	</text>
-	<button label="Parcourir" label_selected="Parcourir" name="set_cache"/>
-	<button label="Réinitialiser" label_selected="Choisir" name="reset_cache"/>
-	<text name="Cache location">
-		Emplacement du cache
-	</text>
-	<text name="Web:">
-		Web :
-	</text>
-	<radio_group name="use_external_browser">
-		<radio_item label="Utiliser le navigateur intégré" name="internal" tool_tip="Utilisez le navigateur intégré pour obtenir de l&apos;aide, ouvrir des liens etc. Ce navigateur s&apos;ouvre dans [APP_NAME]."/>
-		<radio_item label="Utiliser mon navigateur (IE, Firefox etc.)" name="external" tool_tip="Utiliser le navigateur web système par défaut pour l&apos;aide, les liens etc. Non recommandé en mode plein écran."/>
-	</radio_group>
-	<check_box initial_value="false" label="Proxy web" name="web_proxy_enabled"/>
-	<line_editor name="web_proxy_editor" tool_tip="Le nom ou adresse IP du proxy que vous souhaitez utiliser"/>
-	<button label="Parcourir" label_selected="Parcourir" name="set_proxy"/>
-	<text name="Proxy location">
-		Emplacement du proxy
-	</text>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Contrôle et caméra" name="Input panel">
+	<button label="Autres accessoires" name="joystick_setup_button" width="175"/>
+	<text name="Mouselook:">
+		Vue subjective :
+	</text>
+	<text name=" Mouse Sensitivity">
+		Sensibilité de la souris
+	</text>
+	<check_box label="Inverser" name="invert_mouse"/>
+	<text name="Network:">
+		Réseau :
+	</text>
+	<text name="Maximum bandwidth">
+		Bande passante maximale
+	</text>
+	<text name="text_box2">
+		kbps
+	</text>
+	<check_box label="Port de connexion personnalisé" name="connection_port_enabled"/>
+	<spinner label="Numéro de port :" name="web_proxy_port"/>
+	<text name="cache_size_label_l">
+		Taille de la mémoire
+	</text>
+	<text name="text_box5">
+		Mo
+	</text>
+	<button label="Parcourir" label_selected="Parcourir" name="set_cache"/>
+	<button label="Réinitialiser" label_selected="Choisir" name="reset_cache"/>
+	<text name="Cache location">
+		Emplacement du cache
+	</text>
+	<text name="Web:">
+		Web :
+	</text>
+	<radio_group name="use_external_browser">
+		<radio_item label="Utiliser le navigateur intégré" name="internal" tool_tip="Utilisez le navigateur intégré pour obtenir de l&apos;aide, ouvrir des liens etc. Ce navigateur s&apos;ouvre dans [APP_NAME]."/>
+		<radio_item label="Utiliser mon navigateur (IE, Firefox etc.)" name="external" tool_tip="Utiliser le navigateur web système par défaut pour l&apos;aide, les liens etc. Non recommandé en mode plein écran."/>
+	</radio_group>
+	<check_box initial_value="false" label="Proxy web" name="web_proxy_enabled"/>
+	<line_editor name="web_proxy_editor" tool_tip="Le nom ou adresse IP du proxy que vous souhaitez utiliser"/>
+	<button label="Parcourir" label_selected="Parcourir" name="set_proxy"/>
+	<text name="Proxy location">
+		Emplacement du proxy
+	</text>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
index c002c55c23e..3c38da3eb91 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
@@ -1,40 +1,40 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Audio et vidéo" name="Preference Media panel">
-	<slider label="Volume principal" name="System Volume"/>
-	<slider label="Son ambiant" name="Wind Volume"/>
-	<slider label="Sons" name="SFX Volume"/>
-	<slider label="Média" name="Media Volume"/>
-	<slider label="Interface" name="UI Volume"/>
-	<slider label="Musique" name="Music Volume"/>
-	<slider label="Voix" name="Voice Volume"/>
-	<text_editor name="voice_unavailable">
-		Le chat vocal n&apos;est pas disponible
-	</text_editor>
-	<check_box label="Chat vocal" name="enable_voice_check"/>
-	<radio_group name="ear_location">
-		<radio_item label="Écouter depuis la position de la caméra" name="0"/>
-		<radio_item label="Écouter depuis la position de l&apos;avatar" name="1"/>
-	</radio_group>
-	<button label="Paramètres du matériel" name="device_settings_btn"/>
-	<text name="muting_text">
-		Volume :
-	</text>
-	<panel name="Volume Panel" width="249"/>
-	<check_box label="Couper le son" name="disable audio"/>
-	<text bottom="-195" name="streaming_prefs_text" width="145">
-		Média :
-	</text>
-	<text name="audio_prefs_text">
-		Audio :
-	</text>
-	<panel label="Volume" name="Volume Panel"/>
-	<check_box label="Couper le son quand minimisé" name="mute_when_minimized"/>
-	<check_box label="Jouer la musique disponible" name="streaming_music"/>
-	<check_box label="Jouer le média disponible" name="streaming_video"/>
-	<check_box label="Lire automatiquement le média" name="auto_streaming_video"/>
-	<slider label="Effet Doppler" label_width="115" name="Doppler Effect"/>
-	<slider label="Facteur d&apos;éloignement" label_width="115" name="Distance Factor"/>
-	<slider label="Facteur d&apos;atténuation" label_width="115" name="Rolloff Factor"/>
-	<spinner label="Alerte L$" name="L$ Change Threshold"/>
-	<spinner label="Alerte santé" name="Health Change Threshold"/>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Audio et vidéo" name="Preference Media panel">
+	<slider label="Volume principal" name="System Volume"/>
+	<slider label="Son ambiant" name="Wind Volume"/>
+	<slider label="Sons" name="SFX Volume"/>
+	<slider label="Média" name="Media Volume"/>
+	<slider label="Interface" name="UI Volume"/>
+	<slider label="Musique" name="Music Volume"/>
+	<slider label="Voix" name="Voice Volume"/>
+	<text_editor name="voice_unavailable">
+		Le chat vocal n&apos;est pas disponible
+	</text_editor>
+	<check_box label="Chat vocal" name="enable_voice_check"/>
+	<radio_group name="ear_location">
+		<radio_item label="Écouter depuis la position de la caméra" name="0"/>
+		<radio_item label="Écouter depuis la position de l&apos;avatar" name="1"/>
+	</radio_group>
+	<button label="Paramètres du matériel" name="device_settings_btn"/>
+	<text name="muting_text">
+		Volume :
+	</text>
+	<panel name="Volume Panel" width="249"/>
+	<check_box label="Couper le son" name="disable audio"/>
+	<text bottom="-195" name="streaming_prefs_text" width="145">
+		Média :
+	</text>
+	<text name="audio_prefs_text">
+		Audio :
+	</text>
+	<panel label="Volume" name="Volume Panel"/>
+	<check_box label="Couper le son quand minimisé" name="mute_when_minimized"/>
+	<check_box label="Jouer la musique disponible" name="streaming_music"/>
+	<check_box label="Jouer le média disponible" name="streaming_video"/>
+	<check_box label="Lire automatiquement le média" name="auto_streaming_video"/>
+	<slider label="Effet Doppler" label_width="115" name="Doppler Effect"/>
+	<slider label="Facteur d&apos;éloignement" label_width="115" name="Distance Factor"/>
+	<slider label="Facteur d&apos;atténuation" label_width="115" name="Rolloff Factor"/>
+	<spinner label="Alerte L$" name="L$ Change Threshold"/>
+	<spinner label="Alerte santé" name="Health Change Threshold"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_profile.xml b/indra/newview/skins/default/xui/fr/panel_profile.xml
index bd67605d9f2..e13de7a5d1f 100644
--- a/indra/newview/skins/default/xui/fr/panel_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_profile.xml
@@ -1,41 +1,41 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profil" name="panel_profile">
-	<string name="CaptionTextAcctInfo">
-		[ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-	</string>
-	<string name="payment_update_link_url">
-		http://www.secondlife.com/account/billing.php?lang=en
-	</string>
-	<string name="my_account_link_url" value="http://secondlife.com/account"/>
-	<string name="no_partner_text" value="Aucun"/>
-	<scroll_container name="profile_scroll">
-		<panel name="scroll_content_panel">
-			<panel name="second_life_image_panel">
-				<text name="title_sl_descr_text" value="[SECOND_LIFE] :"/>
-			</panel>
-			<panel name="first_life_image_panel">
-				<text name="title_rw_descr_text" value="Monde physique :"/>
-			</panel>
-			<text name="me_homepage_text">
-				Page d&apos;accueil :
-			</text>
-			<text name="title_member_text" value="Membre depuis :"/>
-			<text name="title_acc_status_text" value="Statut du compte :"/>
-			<text name="title_partner_text" value="Partenaire :"/>
-			<panel name="partner_data_panel">
-				<text name="partner_text" value="[FIRST] [LAST]"/>
-			</panel>
-			<text name="title_groups_text" value="Groupes :"/>
-		</panel>
-	</scroll_container>
-	<panel name="profile_buttons_panel">
-		<button label="Devenir amis" name="add_friend"/>
-		<button label="IM" name="im"/>
-		<button label="Appeler" name="call"/>
-		<button label="Téléporter" name="teleport"/>
-	</panel>
-	<panel name="profile_me_buttons_panel">
-		<button label="Modifier le profil" name="edit_profile_btn"/>
-		<button label="Changer d&apos;apparence" name="edit_appearance_btn"/>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profil" name="panel_profile">
+	<string name="CaptionTextAcctInfo">
+		[ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+	</string>
+	<string name="payment_update_link_url">
+		http://www.secondlife.com/account/billing.php?lang=en
+	</string>
+	<string name="my_account_link_url" value="http://secondlife.com/account"/>
+	<string name="no_partner_text" value="Aucun"/>
+	<scroll_container name="profile_scroll">
+		<panel name="scroll_content_panel">
+			<panel name="second_life_image_panel">
+				<text name="title_sl_descr_text" value="[SECOND_LIFE] :"/>
+			</panel>
+			<panel name="first_life_image_panel">
+				<text name="title_rw_descr_text" value="Monde physique :"/>
+			</panel>
+			<text name="me_homepage_text">
+				Page d&apos;accueil :
+			</text>
+			<text name="title_member_text" value="Membre depuis :"/>
+			<text name="title_acc_status_text" value="Statut du compte :"/>
+			<text name="title_partner_text" value="Partenaire :"/>
+			<panel name="partner_data_panel">
+				<text name="partner_text" value="[FIRST] [LAST]"/>
+			</panel>
+			<text name="title_groups_text" value="Groupes :"/>
+		</panel>
+	</scroll_container>
+	<panel name="profile_buttons_panel">
+		<button label="Devenir amis" name="add_friend"/>
+		<button label="IM" name="im"/>
+		<button label="Appeler" name="call"/>
+		<button label="Téléporter" name="teleport"/>
+	</panel>
+	<panel name="profile_me_buttons_panel">
+		<button label="Modifier le profil" name="edit_profile_btn"/>
+		<button label="Changer d&apos;apparence" name="edit_appearance_btn"/>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_profile_view.xml b/indra/newview/skins/default/xui/fr/panel_profile_view.xml
index 44539ddba47..928df67e4c4 100644
--- a/indra/newview/skins/default/xui/fr/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/fr/panel_profile_view.xml
@@ -1,15 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
-	<string name="status_online">
-		En ligne
-	</string>
-	<string name="status_offline">
-		Hors ligne
-	</string>
-	<text name="user_name" value="(en cours de chargement...)"/>
-	<text name="status" value="En ligne"/>
-	<tab_container name="tabs">
-		<panel label="Profil" name="panel_profile"/>
-		<panel label="Favoris" name="panel_picks"/>
-	</tab_container>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_target_profile">
+	<string name="status_online">
+		En ligne
+	</string>
+	<string name="status_offline">
+		Hors ligne
+	</string>
+	<text name="user_name" value="(en cours de chargement...)"/>
+	<text name="status" value="En ligne"/>
+	<tab_container name="tabs">
+		<panel label="Profil" name="panel_profile"/>
+		<panel label="Favoris" name="panel_picks"/>
+	</tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_script_ed.xml b/indra/newview/skins/default/xui/fr/panel_script_ed.xml
index 5790efe2f8f..7256fe41093 100644
--- a/indra/newview/skins/default/xui/fr/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/fr/panel_script_ed.xml
@@ -1,43 +1,43 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="script panel">
-	<panel.string name="loading">
-		Chargement…
-	</panel.string>
-	<panel.string name="can_not_view">
-		Ce scipt ne peut pas être copié, visualisé ou modifié.  Pour visualiser ou modifier un script à l&apos;intérieur d&apos;un objet, vous devez avoir les permissions requises.
-	</panel.string>
-	<panel.string name="public_objects_can_not_run">
-		Les objets publics ne peuvent pas exécuter de scripts
-	</panel.string>
-	<panel.string name="script_running">
-		Exécution en cours
-	</panel.string>
-	<panel.string name="Title">
-		Script : [NAME]
-	</panel.string>
-	<text_editor name="Script Editor">
-		Chargement…
-	</text_editor>
-	<button label="Enregistrer" label_selected="Enregistrer" name="Save_btn"/>
-	<combo_box label="Insérer..." name="Insert..."/>
-	<menu_bar name="script_menu">
-		<menu label="Fichier" name="File">
-			<menu_item_call label="Enregistrer" name="Save"/>
-			<menu_item_call label="Annuler tous les changements" name="Revert All Changes"/>
-		</menu>
-		<menu label="Éditer" name="Edit">
-			<menu_item_call label="Annuler" name="Undo"/>
-			<menu_item_call label="Refaire" name="Redo"/>
-			<menu_item_call label="Couper" name="Cut"/>
-			<menu_item_call label="Copier" name="Copy"/>
-			<menu_item_call label="Coller" name="Paste"/>
-			<menu_item_call label="Tout sélectionner" name="Select All"/>
-			<menu_item_call label="Désélectionner" name="Deselect"/>
-			<menu_item_call label="Rechercher / Remplacer..." name="Search / Replace..."/>
-		</menu>
-		<menu label="Aide" name="Help">
-			<menu_item_call label="Aide..." name="Help..."/>
-			<menu_item_call label="Aide par mots-clés..." name="Keyword Help..."/>
-		</menu>
-	</menu_bar>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="script panel">
+	<panel.string name="loading">
+		Chargement…
+	</panel.string>
+	<panel.string name="can_not_view">
+		Ce scipt ne peut pas être copié, visualisé ou modifié.  Pour visualiser ou modifier un script à l&apos;intérieur d&apos;un objet, vous devez avoir les permissions requises.
+	</panel.string>
+	<panel.string name="public_objects_can_not_run">
+		Les objets publics ne peuvent pas exécuter de scripts
+	</panel.string>
+	<panel.string name="script_running">
+		Exécution en cours
+	</panel.string>
+	<panel.string name="Title">
+		Script : [NAME]
+	</panel.string>
+	<text_editor name="Script Editor">
+		Chargement…
+	</text_editor>
+	<button label="Enregistrer" label_selected="Enregistrer" name="Save_btn"/>
+	<combo_box label="Insérer..." name="Insert..."/>
+	<menu_bar name="script_menu">
+		<menu label="Fichier" name="File">
+			<menu_item_call label="Enregistrer" name="Save"/>
+			<menu_item_call label="Annuler tous les changements" name="Revert All Changes"/>
+		</menu>
+		<menu label="Éditer" name="Edit">
+			<menu_item_call label="Annuler" name="Undo"/>
+			<menu_item_call label="Refaire" name="Redo"/>
+			<menu_item_call label="Couper" name="Cut"/>
+			<menu_item_call label="Copier" name="Copy"/>
+			<menu_item_call label="Coller" name="Paste"/>
+			<menu_item_call label="Tout sélectionner" name="Select All"/>
+			<menu_item_call label="Désélectionner" name="Deselect"/>
+			<menu_item_call label="Rechercher / Remplacer..." name="Search / Replace..."/>
+		</menu>
+		<menu label="Aide" name="Help">
+			<menu_item_call label="Aide..." name="Help..."/>
+			<menu_item_call label="Aide par mots-clés..." name="Keyword Help..."/>
+		</menu>
+	</menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/fr/panel_stand_stop_flying.xml
index 9a2567c831a..ee4e8a6be65 100644
--- a/indra/newview/skins/default/xui/fr/panel_stand_stop_flying.xml
+++ b/indra/newview/skins/default/xui/fr/panel_stand_stop_flying.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
-<panel name="panel_stand_stop_flying">
-	<button label="Me lever" name="stand_btn" tool_tip="Cliquez ici pour vous lever."/>
-	<button label="Atterrir" name="stop_fly_btn" tool_tip="Atterrir"/>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
+<panel name="panel_stand_stop_flying">
+	<button label="Me lever" name="stand_btn" tool_tip="Cliquez ici pour vous lever."/>
+	<button label="Atterrir" name="stop_fly_btn" tool_tip="Atterrir"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_status_bar.xml b/indra/newview/skins/default/xui/fr/panel_status_bar.xml
index c963b4d8cba..6a481a155c7 100644
--- a/indra/newview/skins/default/xui/fr/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/fr/panel_status_bar.xml
@@ -1,22 +1,22 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="status">
-	<panel.string name="StatBarDaysOfWeek">
-		Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday
-	</panel.string>
-	<panel.string name="StatBarMonthsOfYear">
-		January:February:March:April:May:June:July:August:September:October:November:December
-	</panel.string>
-	<panel.string name="packet_loss_tooltip">
-		Perte de paquets
-	</panel.string>
-	<panel.string name="bandwidth_tooltip">
-		Bande passante
-	</panel.string>
-	<panel.string name="buycurrencylabel">
-		[AMT] L$
-	</panel.string>
-	<button label="" label_selected="" name="buycurrency" tool_tip="Mon solde : Cliquez ici pour acheter plus de L$"/>
-	<text name="TimeText" tool_tip="Heure actuelle (Californie)">
-		midi
-	</text>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="status">
+	<panel.string name="StatBarDaysOfWeek">
+		Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday
+	</panel.string>
+	<panel.string name="StatBarMonthsOfYear">
+		January:February:March:April:May:June:July:August:September:October:November:December
+	</panel.string>
+	<panel.string name="packet_loss_tooltip">
+		Perte de paquets
+	</panel.string>
+	<panel.string name="bandwidth_tooltip">
+		Bande passante
+	</panel.string>
+	<panel.string name="buycurrencylabel">
+		[AMT] L$
+	</panel.string>
+	<button label="" label_selected="" name="buycurrency" tool_tip="Mon solde : Cliquez ici pour acheter plus de L$"/>
+	<text name="TimeText" tool_tip="Heure actuelle (Californie)">
+		midi
+	</text>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_world_map.xml b/indra/newview/skins/default/xui/fr/panel_world_map.xml
index 2fb7baaf7ca..a35d0eaea9c 100644
--- a/indra/newview/skins/default/xui/fr/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/fr/panel_world_map.xml
@@ -1,57 +1,57 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="world_map">
-	<panel.string name="Loading">
-		Chargement…
-	</panel.string>
-	<panel.string name="InvalidLocation">
-		Lieu invalide...
-	</panel.string>
-	<panel.string name="world_map_north">
-		N
-	</panel.string>
-	<panel.string name="world_map_east">
-		E
-	</panel.string>
-	<panel.string name="world_map_west">
-		O
-	</panel.string>
-	<panel.string name="world_map_south">
-		S
-	</panel.string>
-	<panel.string name="world_map_southeast">
-		SE
-	</panel.string>
-	<panel.string name="world_map_northeast">
-		NE
-	</panel.string>
-	<panel.string name="world_map_southwest">
-		SO
-	</panel.string>
-	<panel.string name="world_map_northwest">
-		NO
-	</panel.string>
-	<text label="N" name="floater_map_north" text="N">
-		N
-	</text>
-	<text label="E" name="floater_map_east" text="E">
-		E
-	</text>
-	<text label="O" name="floater_map_west" text="O">
-		O
-	</text>
-	<text label="S" name="floater_map_south" text="S">
-		S
-	</text>
-	<text label="SE" name="floater_map_southeast" text="SE">
-		SE
-	</text>
-	<text label="NE" name="floater_map_northeast" text="NE">
-		NE
-	</text>
-	<text label="SO" name="floater_map_southwest" text="SO">
-		SO
-	</text>
-	<text label="NO" name="floater_map_northwest" text="NO">
-		NO
-	</text>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="world_map">
+	<panel.string name="Loading">
+		Chargement…
+	</panel.string>
+	<panel.string name="InvalidLocation">
+		Lieu invalide...
+	</panel.string>
+	<panel.string name="world_map_north">
+		N
+	</panel.string>
+	<panel.string name="world_map_east">
+		E
+	</panel.string>
+	<panel.string name="world_map_west">
+		O
+	</panel.string>
+	<panel.string name="world_map_south">
+		S
+	</panel.string>
+	<panel.string name="world_map_southeast">
+		SE
+	</panel.string>
+	<panel.string name="world_map_northeast">
+		NE
+	</panel.string>
+	<panel.string name="world_map_southwest">
+		SO
+	</panel.string>
+	<panel.string name="world_map_northwest">
+		NO
+	</panel.string>
+	<text label="N" name="floater_map_north" text="N">
+		N
+	</text>
+	<text label="E" name="floater_map_east" text="E">
+		E
+	</text>
+	<text label="O" name="floater_map_west" text="O">
+		O
+	</text>
+	<text label="S" name="floater_map_south" text="S">
+		S
+	</text>
+	<text label="SE" name="floater_map_southeast" text="SE">
+		SE
+	</text>
+	<text label="NE" name="floater_map_northeast" text="NE">
+		NE
+	</text>
+	<text label="SO" name="floater_map_southwest" text="SO">
+		SO
+	</text>
+	<text label="NO" name="floater_map_northwest" text="NO">
+		NO
+	</text>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 06cc7d4a791..2d0df66f18b 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -1,3149 +1,3149 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- This file contains strings that used to be hardcoded in the source.
-     It is only for those strings which do not belong in a floater.
-     For example, the strings used in avatar chat bubbles, and strings 
-     that are returned from one component and may appear in many places-->
-<strings>
-	<string name="SECOND_LIFE">
-		Second Life
-	</string>
-	<string name="APP_NAME">
-		Second Life
-	</string>
-	<string name="SECOND_LIFE_GRID">
-		Grille de Second Life
-	</string>
-	<string name="SUPPORT_SITE">
-		Portail Assistance Second Life
-	</string>
-	<string name="StartupDetectingHardware">
-		Détection du matériel...
-	</string>
-	<string name="StartupLoading">
-		Chargement
-	</string>
-	<string name="Fullbright">
-		Fullbright (Legacy)
-	</string>
-	<string name="LoginInProgress">
-		La connexion à [APP_NAME] apparaît peut-être comme étant gelée. Veuillez patienter.
-	</string>
-	<string name="LoginInProgressNoFrozen">
-		Connexion...
-	</string>
-	<string name="LoginAuthenticating">
-		Authentification en cours
-	</string>
-	<string name="LoginMaintenance">
-		Maintenance du compte en cours…
-	</string>
-	<string name="LoginAttempt">
-		La tentative de connexion précédente a échoué. Connexion, esssai [NUMBER]
-	</string>
-	<string name="LoginPrecaching">
-		Monde en cours de chargement…
-	</string>
-	<string name="LoginInitializingBrowser">
-		Navigateur Web incorporé en cours d&apos;initialisation…
-	</string>
-	<string name="LoginInitializingMultimedia">
-		Multimédia en cours d&apos;initialisation…
-	</string>
-	<string name="LoginVerifyingCache">
-		Fichiers du cache en cours de vérification (peut prendre 60-90 s)...
-	</string>
-	<string name="LoginProcessingResponse">
-		Réponse en cours de traitement…
-	</string>
-	<string name="LoginInitializingWorld">
-		Monde en cours d&apos;initialisation…
-	</string>
-	<string name="LoginDecodingImages">
-		Décodage des images en cours...
-	</string>
-	<string name="LoginInitializingQuicktime">
-		Quicktime en cours d&apos;initialisation
-	</string>
-	<string name="LoginQuicktimeNotFound">
-		Quicktime introuvable, impossible de procéder à l&apos;initialisation.
-	</string>
-	<string name="LoginQuicktimeOK">
-		Initialisation de Quicktime réussie.
-	</string>
-	<string name="LoginWaitingForRegionHandshake">
-		Liaison avec la région en cours de création...
-	</string>
-	<string name="LoginConnectingToRegion">
-		Connexion avec la région en cours...
-	</string>
-	<string name="LoginDownloadingClothing">
-		Habits en cours de téléchargement...
-	</string>
-	<string name="AgentLostConnection">
-		Il y a peut-être des problèmes techniques dans cette region. Veuillez vérifier votre connexion Internet.
-	</string>
-	<string name="TooltipPerson">
-		Personne
-	</string>
-	<string name="TooltipNoName">
-		(pas de nom)
-	</string>
-	<string name="TooltipOwner">
-		Propriétaire :
-	</string>
-	<string name="TooltipPublic">
-		Public
-	</string>
-	<string name="TooltipIsGroup">
-		(Groupe)
-	</string>
-	<string name="TooltipForSaleL$">
-		À vendre : [AMOUNT] L$
-	</string>
-	<string name="TooltipFlagGroupBuild">
-		Contruction de groupe
-	</string>
-	<string name="TooltipFlagNoBuild">
-		Pas de construction
-	</string>
-	<string name="TooltipFlagNoEdit">
-		Contruction de groupe
-	</string>
-	<string name="TooltipFlagNotSafe">
-		Non sécurisé
-	</string>
-	<string name="TooltipFlagNoFly">
-		Interdiction de voler
-	</string>
-	<string name="TooltipFlagGroupScripts">
-		Scripts de groupe
-	</string>
-	<string name="TooltipFlagNoScripts">
-		Pas de scripts
-	</string>
-	<string name="TooltipLand">
-		Terrain :
-	</string>
-	<string name="TooltipMustSingleDrop">
-		Impossible de faire glisser plus d&apos;un objet ici
-	</string>
-	<string name="TooltipHttpUrl">
-		Cliquez pour afficher cette page web
-	</string>
-	<string name="TooltipSLURL">
-		Cliquez pour en savoir plus sur cet endroit
-	</string>
-	<string name="TooltipAgentUrl">
-		Cliquez pour afficher le profil de ce résident
-	</string>
-	<string name="TooltipGroupUrl">
-		Cliquez pour afficher la description de ce groupe
-	</string>
-	<string name="TooltipEventUrl">
-		Cliquez pour afficher la description de cet événement
-	</string>
-	<string name="TooltipClassifiedUrl">
-		Cliquez pour afficher cette petite annonce
-	</string>
-	<string name="TooltipParcelUrl">
-		Cliquez pour afficher la description de cette parcelle
-	</string>
-	<string name="TooltipTeleportUrl">
-		Cliquez pour vous téléporter à cet endroit
-	</string>
-	<string name="TooltipObjectIMUrl">
-		Cliquez pour afficher la description de cet objet
-	</string>
-	<string name="TooltipSLAPP">
-		Cliquez pour exécuter la commande secondlife:// command
-	</string>
-	<string name="BUTTON_CLOSE_DARWIN">
-		Fermer (⌘-W)
-	</string>
-	<string name="BUTTON_CLOSE_WIN">
-		Fermer (Ctrl+W)
-	</string>
-	<string name="BUTTON_RESTORE">
-		Restaurer
-	</string>
-	<string name="BUTTON_MINIMIZE">
-		Minimiser
-	</string>
-	<string name="BUTTON_TEAR_OFF">
-		Réduire
-	</string>
-	<string name="BUTTON_DOCK">
-		Attacher
-	</string>
-	<string name="BUTTON_UNDOCK">
-		Détacher
-	</string>
-	<string name="BUTTON_HELP">
-		Afficher l&apos;aide
-	</string>
-	<string name="RetrievingData">
-		En cours d&apos;extraction...
-	</string>
-	<string name="ReleaseNotes">
-		Notes de version
-	</string>
-	<string name="LoadingData">
-		Chargement..
-	</string>
-	<string name="AvatarNameNobody">
-		(personne)
-	</string>
-	<string name="AvatarNameWaiting">
-		(en attente)
-	</string>
-	<string name="AvatarNameHippos">
-		(hippos)
-	</string>
-	<string name="GroupNameNone">
-		(aucun)
-	</string>
-	<string name="AssetErrorNone">
-		Aucune erreur
-	</string>
-	<string name="AssetErrorRequestFailed">
-		Requête de l&apos;actif : échec
-	</string>
-	<string name="AssetErrorNonexistentFile">
-		Requête de l&apos;actif : fichier inexistant
-	</string>
-	<string name="AssetErrorNotInDatabase">
-		Requête de l&apos;actif : actif introuvable dans la base de données
-	</string>
-	<string name="AssetErrorEOF">
-		Fin du ficher
-	</string>
-	<string name="AssetErrorCannotOpenFile">
-		Impossible d&apos;ouvrir le fichier
-	</string>
-	<string name="AssetErrorFileNotFound">
-		Fichier introuvable
-	</string>
-	<string name="AssetErrorTCPTimeout">
-		Délai d&apos;attente du transfert du fichier dépassé
-	</string>
-	<string name="AssetErrorCircuitGone">
-		Disparition du circuit
-	</string>
-	<string name="AssetErrorPriceMismatch">
-		Il y a une différence de prix entre le client et le serveur
-	</string>
-	<string name="AssetErrorUnknownStatus">
-		Statut inconnu
-	</string>
-	<string name="texture">
-		texture
-	</string>
-	<string name="sound">
-		son
-	</string>
-	<string name="calling card">
-		carte de visite
-	</string>
-	<string name="landmark">
-		repère
-	</string>
-	<string name="legacy script">
-		script (ancienne version)
-	</string>
-	<string name="clothing">
-		habits
-	</string>
-	<string name="object">
-		objet
-	</string>
-	<string name="note card">
-		note
-	</string>
-	<string name="folder">
-		dossier
-	</string>
-	<string name="root">
-		racine
-	</string>
-	<string name="lsl2 script">
-		script lsl2
-	</string>
-	<string name="lsl bytecode">
-		bytecode lsl
-	</string>
-	<string name="tga texture">
-		texture tga
-	</string>
-	<string name="body part">
-		partie du corps
-	</string>
-	<string name="snapshot">
-		photo
-	</string>
-	<string name="lost and found">
-		objets trouvés
-	</string>
-	<string name="targa image">
-		image targa
-	</string>
-	<string name="trash">
-		poubelle
-	</string>
-	<string name="jpeg image">
-		image jpeg
-	</string>
-	<string name="animation">
-		animation
-	</string>
-	<string name="gesture">
-		geste
-	</string>
-	<string name="simstate">
-		simstate
-	</string>
-	<string name="favorite">
-		favori
-	</string>
-	<string name="symbolic link">
-		lien
-	</string>
-	<string name="AvatarAway">
-		Absent
-	</string>
-	<string name="AvatarBusy">
-		Occupé
-	</string>
-	<string name="AvatarMuted">
-		Ignoré
-	</string>
-	<string name="anim_express_afraid">
-		Effrayé
-	</string>
-	<string name="anim_express_anger">
-		En colère
-	</string>
-	<string name="anim_away">
-		Absent
-	</string>
-	<string name="anim_backflip">
-		Salto arrière
-	</string>
-	<string name="anim_express_laugh">
-		Rire en se tenant le ventre
-	</string>
-	<string name="anim_express_toothsmile">
-		Grand sourire
-	</string>
-	<string name="anim_blowkiss">
-		Envoyer un baiser
-	</string>
-	<string name="anim_express_bored">
-		Bailler d&apos;ennui
-	</string>
-	<string name="anim_bow">
-		S&apos;incliner
-	</string>
-	<string name="anim_clap">
-		Applaudir
-	</string>
-	<string name="anim_courtbow">
-		Révérence de cour
-	</string>
-	<string name="anim_express_cry">
-		Pleurer
-	</string>
-	<string name="anim_dance1">
-		Danse 1
-	</string>
-	<string name="anim_dance2">
-		Danse 2
-	</string>
-	<string name="anim_dance3">
-		Danse 3
-	</string>
-	<string name="anim_dance4">
-		Danse 4
-	</string>
-	<string name="anim_dance5">
-		Danse 5
-	</string>
-	<string name="anim_dance6">
-		Danse 6
-	</string>
-	<string name="anim_dance7">
-		Danse 7
-	</string>
-	<string name="anim_dance8">
-		Danse 8
-	</string>
-	<string name="anim_express_disdain">
-		Mépris
-	</string>
-	<string name="anim_drink">
-		Boire
-	</string>
-	<string name="anim_express_embarrased">
-		Gêne
-	</string>
-	<string name="anim_angry_fingerwag">
-		Désapprobation
-	</string>
-	<string name="anim_fist_pump">
-		Victoire
-	</string>
-	<string name="anim_yoga_float">
-		Yoga
-	</string>
-	<string name="anim_express_frown">
-		Froncer les sourcils
-	</string>
-	<string name="anim_impatient">
-		Impatient
-	</string>
-	<string name="anim_jumpforjoy">
-		Sauter de joie
-	</string>
-	<string name="anim_kissmybutt">
-		Va te faire voir !
-	</string>
-	<string name="anim_express_kiss">
-		Baiser
-	</string>
-	<string name="anim_laugh_short">
-		Rire
-	</string>
-	<string name="anim_musclebeach">
-		Montrer ses muscles
-	</string>
-	<string name="anim_no_unhappy">
-		Non (mécontent)
-	</string>
-	<string name="anim_no_head">
-		Non
-	</string>
-	<string name="anim_nyanya">
-		Na na na na nère
-	</string>
-	<string name="anim_punch_onetwo">
-		Gauche-droite
-	</string>
-	<string name="anim_express_open_mouth">
-		Bouche ouverte
-	</string>
-	<string name="anim_peace">
-		Paix
-	</string>
-	<string name="anim_point_you">
-		Montrer quelqu&apos;un du doigt
-	</string>
-	<string name="anim_point_me">
-		Se montrer du doigt
-	</string>
-	<string name="anim_punch_l">
-		Gauche
-	</string>
-	<string name="anim_punch_r">
-		Droite
-	</string>
-	<string name="anim_rps_countdown">
-		Compter (pierre-papier-ciseaux)
-	</string>
-	<string name="anim_rps_paper">
-		Papier (pierre-papier-ciseaux)
-	</string>
-	<string name="anim_rps_rock">
-		Pierre (pierre-papier-ciseaux)
-	</string>
-	<string name="anim_rps_scissors">
-		Ciseaux (pierre-papier-ciseaux)
-	</string>
-	<string name="anim_express_repulsed">
-		Dégoût
-	</string>
-	<string name="anim_kick_roundhouse_r">
-		Coup de pied circulaire
-	</string>
-	<string name="anim_express_sad">
-		Triste
-	</string>
-	<string name="anim_salute">
-		Salut
-	</string>
-	<string name="anim_shout">
-		Crier
-	</string>
-	<string name="anim_express_shrug">
-		Hausser les épaules
-	</string>
-	<string name="anim_express_smile">
-		Sourire
-	</string>
-	<string name="anim_smoke_idle">
-		Fumer, immobile
-	</string>
-	<string name="anim_smoke_inhale">
-		Fumer, prendre une bouffée
-	</string>
-	<string name="anim_smoke_throw_down">
-		Fumer, jeter son mégot
-	</string>
-	<string name="anim_express_surprise">
-		Surprise
-	</string>
-	<string name="anim_sword_strike_r">
-		Coup d&apos;épée
-	</string>
-	<string name="anim_angry_tantrum">
-		Caprice
-	</string>
-	<string name="anim_express_tongue_out">
-		Tirer la langue
-	</string>
-	<string name="anim_hello">
-		Faire signe
-	</string>
-	<string name="anim_whisper">
-		Chuchoter
-	</string>
-	<string name="anim_whistle">
-		Siffler
-	</string>
-	<string name="anim_express_wink">
-		Clin d&apos;œil
-	</string>
-	<string name="anim_wink_hollywood">
-		Clin d&apos;œil (Hollywood)
-	</string>
-	<string name="anim_express_worry">
-		Soucis
-	</string>
-	<string name="anim_yes_happy">
-		Oui (Joie)
-	</string>
-	<string name="anim_yes_head">
-		Oui
-	</string>
-	<string name="texture_loading">
-		Chargement...
-	</string>
-	<string name="worldmap_offline">
-		Hors ligne
-	</string>
-	<string name="Ok">
-		OK
-	</string>
-	<string name="Premature end of file">
-		Fichier incomplet
-	</string>
-	<string name="ST_NO_JOINT">
-		Impossible de trouver ROOT ou JOINT.
-	</string>
-	<string name="whisper">
-		chuchote :
-	</string>
-	<string name="shout">
-		crie :
-	</string>
-	<string name="ringing">
-		Connexion au chat vocal du Monde en cours…
-	</string>
-	<string name="connected">
-		Connecté(e)
-	</string>
-	<string name="unavailable">
-		Voix non disponible à l&apos;endroit où vous êtes
-	</string>
-	<string name="hang_up">
-		Déconnecté du chat vocal
-	</string>
-	<string name="ScriptQuestionCautionChatGranted">
-		&apos;[OBJECTNAME]&apos;, un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], a reçu le droit de : [PERMISSIONS].
-	</string>
-	<string name="ScriptQuestionCautionChatDenied">
-		&apos;[OBJECTNAME]&apos;, un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], n&apos;a pas reçu le droit de : [PERMISSIONS].
-	</string>
-	<string name="ScriptTakeMoney">
-		Débiter vos Linden dollars (L$)
-	</string>
-	<string name="ActOnControlInputs">
-		Utiliser vos touches de commandes
-	</string>
-	<string name="RemapControlInputs">
-		Reconfigurer vos touches de commandes
-	</string>
-	<string name="AnimateYourAvatar">
-		Animer votre avatar
-	</string>
-	<string name="AttachToYourAvatar">
-		Attacher à votre avatar
-	</string>
-	<string name="ReleaseOwnership">
-		Passer l&apos;objet dans le domaine public (sans propriétaire)
-	</string>
-	<string name="LinkAndDelink">
-		Lier et délier d&apos;autres objets
-	</string>
-	<string name="AddAndRemoveJoints">
-		Créer et supprimer des liens avec d&apos;autres objets
-	</string>
-	<string name="ChangePermissions">
-		Modifier ses droits
-	</string>
-	<string name="TrackYourCamera">
-		Suivre votre caméra
-	</string>
-	<string name="ControlYourCamera">
-		Contrôler votre caméra
-	</string>
-	<string name="SIM_ACCESS_PG">
-		PG
-	</string>
-	<string name="SIM_ACCESS_MATURE">
-		Mature
-	</string>
-	<string name="SIM_ACCESS_ADULT">
-		Adult
-	</string>
-	<string name="SIM_ACCESS_DOWN">
-		Hors ligne
-	</string>
-	<string name="SIM_ACCESS_MIN">
-		Inconnu
-	</string>
-	<string name="land_type_unknown">
-		(inconnu)
-	</string>
-	<string name="all_files">
-		Tous fichiers
-	</string>
-	<string name="sound_files">
-		Sons
-	</string>
-	<string name="animation_files">
-		Animations
-	</string>
-	<string name="image_files">
-		Images
-	</string>
-	<string name="save_file_verb">
-		Enregistrer
-	</string>
-	<string name="load_file_verb">
-		Charger
-	</string>
-	<string name="targa_image_files">
-		Images Targa
-	</string>
-	<string name="bitmap_image_files">
-		Images Bitmap
-	</string>
-	<string name="avi_movie_file">
-		Fichier de film AVI
-	</string>
-	<string name="xaf_animation_file">
-		Fichier d&apos;animation XAF
-	</string>
-	<string name="xml_file">
-		Fichier XML
-	</string>
-	<string name="dot_raw_file">
-		Fichier RAW
-	</string>
-	<string name="compressed_image_files">
-		Images compressées
-	</string>
-	<string name="load_files">
-		Charger des fichiers
-	</string>
-	<string name="choose_the_directory">
-		Choisir le répertoire
-	</string>
-	<string name="AvatarSetNotAway">
-		Ne plus me mettre en mode absent
-	</string>
-	<string name="AvatarSetAway">
-		Me mettre en mode absent
-	</string>
-	<string name="AvatarSetNotBusy">
-		Ne plus me mettre en mode occupé
-	</string>
-	<string name="AvatarSetBusy">
-		Me mettre en mode occupé
-	</string>
-	<string name="shape">
-		Silhouette
-	</string>
-	<string name="skin">
-		Peau
-	</string>
-	<string name="hair">
-		Cheveux
-	</string>
-	<string name="eyes">
-		Yeux
-	</string>
-	<string name="shirt">
-		Chemise
-	</string>
-	<string name="pants">
-		Pantalon
-	</string>
-	<string name="shoes">
-		Chaussures
-	</string>
-	<string name="socks">
-		Chaussettes
-	</string>
-	<string name="jacket">
-		Veste
-	</string>
-	<string name="gloves">
-		Gants
-	</string>
-	<string name="undershirt">
-		Sous-vêtements (homme)
-	</string>
-	<string name="underpants">
-		Sous-vêtements (femme)
-	</string>
-	<string name="skirt">
-		Jupe
-	</string>
-	<string name="invalid">
-		non valide
-	</string>
-	<string name="BodyPartsRightArm">
-		Bras droit
-	</string>
-	<string name="BodyPartsHead">
-		Tête
-	</string>
-	<string name="BodyPartsLeftArm">
-		Bras gauche
-	</string>
-	<string name="BodyPartsLeftLeg">
-		Jambe gauche
-	</string>
-	<string name="BodyPartsTorso">
-		Torse
-	</string>
-	<string name="BodyPartsRightLeg">
-		Jambe droite
-	</string>
-	<string name="GraphicsQualityLow">
-		Faible
-	</string>
-	<string name="GraphicsQualityMid">
-		Moyen
-	</string>
-	<string name="GraphicsQualityHigh">
-		Élevé
-	</string>
-	<string name="LeaveMouselook">
-		Appuyez sur ESC pour quitter la vue subjective
-	</string>
-	<string name="InventoryNoMatchingItems">
-		Aucun objet correspondant ne se trouve dans l&apos;inventaire.
-	</string>
-	<string name="InventoryNoTexture">
-		Vous n&apos;avez pas de copie de cette texture dans votre inventaire
-	</string>
-	<string name="LoadingContents">
-		chargement des contenus en cours...
-	</string>
-	<string name="NoContents">
-		Aucun contenu
-	</string>
-	<string name="InvFolder My Inventory">
-		Mon inventaire
-	</string>
-	<string name="InvFolder My Favorites">
-		Mes favoris
-	</string>
-	<string name="InvFolder Library">
-		Bibliothèque
-	</string>
-	<string name="InvFolder Textures">
-		Textures
-	</string>
-	<string name="InvFolder Sounds">
-		Sons
-	</string>
-	<string name="InvFolder Calling Cards">
-		Cartes de visite
-	</string>
-	<string name="InvFolder Landmarks">
-		Repères
-	</string>
-	<string name="InvFolder Scripts">
-		Scripts
-	</string>
-	<string name="InvFolder Clothing">
-		Habits
-	</string>
-	<string name="InvFolder Objects">
-		Objets
-	</string>
-	<string name="InvFolder Notecards">
-		Notes
-	</string>
-	<string name="InvFolder New Folder">
-		Nouveau dossier
-	</string>
-	<string name="InvFolder Inventory">
-		Inventaire
-	</string>
-	<string name="InvFolder Uncompressed Images">
-		Images non compressées
-	</string>
-	<string name="InvFolder Body Parts">
-		Parties du corps
-	</string>
-	<string name="InvFolder Trash">
-		Poubelle
-	</string>
-	<string name="InvFolder Photo Album">
-		Albums photo
-	</string>
-	<string name="InvFolder Lost And Found">
-		Objets trouvés
-	</string>
-	<string name="InvFolder Uncompressed Sounds">
-		Sons non compressés
-	</string>
-	<string name="InvFolder Animations">
-		Animations
-	</string>
-	<string name="InvFolder Gestures">
-		Gestes
-	</string>
-	<string name="InvFolder favorite">
-		Favoris
-	</string>
-	<string name="InvFolder Current Outfit">
-		Tenue actuelle
-	</string>
-	<string name="InvFolder My Outfits">
-		Mes tenues
-	</string>
-	<string name="InvFolder Friends">
-		Amis
-	</string>
-	<string name="InvFolder All">
-		Tout
-	</string>
-	<string name="Buy">
-		Acheter
-	</string>
-	<string name="BuyforL$">
-		Acheter des L$
-	</string>
-	<string name="Stone">
-		Pierre
-	</string>
-	<string name="Metal">
-		Métal
-	</string>
-	<string name="Glass">
-		Verre
-	</string>
-	<string name="Wood">
-		Bois
-	</string>
-	<string name="Flesh">
-		Chair
-	</string>
-	<string name="Plastic">
-		Plastique
-	</string>
-	<string name="Rubber">
-		Caoutchouc
-	</string>
-	<string name="Light">
-		Léger
-	</string>
-	<string name="KBShift">
-		Maj-
-	</string>
-	<string name="KBCtrl">
-		Ctrl
-	</string>
-	<string name="Chest">
-		Poitrine
-	</string>
-	<string name="Skull">
-		Crâne
-	</string>
-	<string name="Left Shoulder">
-		Épaule gauche
-	</string>
-	<string name="Right Shoulder">
-		Épaule droite
-	</string>
-	<string name="Left Hand">
-		Main gauche
-	</string>
-	<string name="Right Hand">
-		Main droite
-	</string>
-	<string name="Left Foot">
-		Pied gauche
-	</string>
-	<string name="Right Foot">
-		Pied droit
-	</string>
-	<string name="Spine">
-		Colonne
-	</string>
-	<string name="Pelvis">
-		Bassin
-	</string>
-	<string name="Mouth">
-		Bouche
-	</string>
-	<string name="Chin">
-		Menton
-	</string>
-	<string name="Left Ear">
-		Oreille gauche
-	</string>
-	<string name="Right Ear">
-		Oreille droite
-	</string>
-	<string name="Left Eyeball">
-		Globe oculaire gauche
-	</string>
-	<string name="Right Eyeball">
-		Globe oculaire droit
-	</string>
-	<string name="Nose">
-		Nez
-	</string>
-	<string name="R Upper Arm">
-		Bras D
-	</string>
-	<string name="R Forearm">
-		Avant-bras D
-	</string>
-	<string name="L Upper Arm">
-		Bras G
-	</string>
-	<string name="L Forearm">
-		Avant-bras G
-	</string>
-	<string name="Right Hip">
-		Hanche droite
-	</string>
-	<string name="R Upper Leg">
-		Cuisse D
-	</string>
-	<string name="R Lower Leg">
-		Jambe D
-	</string>
-	<string name="Left Hip">
-		Hanche gauche
-	</string>
-	<string name="L Upper Leg">
-		Cuisse G
-	</string>
-	<string name="L Lower Leg">
-		Jambe G
-	</string>
-	<string name="Stomach">
-		Estomac
-	</string>
-	<string name="Left Pec">
-		Pectoral gauche
-	</string>
-	<string name="Right Pec">
-		Pectoral droit
-	</string>
-	<string name="YearsMonthsOld">
-		[AGEYEARS] [AGEMONTHS]
-	</string>
-	<string name="YearsOld">
-		[AGEYEARS]
-	</string>
-	<string name="MonthsOld">
-		[AGEMONTHS]
-	</string>
-	<string name="WeeksOld">
-		[AGEWEEKS]
-	</string>
-	<string name="DaysOld">
-		[AGEDAYS]
-	</string>
-	<string name="TodayOld">
-		Inscrit aujourd&apos;hui
-	</string>
-	<string name="AgeYearsA">
-		[COUNT] an
-	</string>
-	<string name="AgeYearsB">
-		[COUNT] ans
-	</string>
-	<string name="AgeYearsC">
-		[COUNT] ans
-	</string>
-	<string name="AgeMonthsA">
-		[COUNT] mois
-	</string>
-	<string name="AgeMonthsB">
-		[COUNT] mois
-	</string>
-	<string name="AgeMonthsC">
-		[COUNT] mois
-	</string>
-	<string name="AgeWeeksA">
-		[COUNT] semaine
-	</string>
-	<string name="AgeWeeksB">
-		[COUNT] semaines
-	</string>
-	<string name="AgeWeeksC">
-		[COUNT] semaines
-	</string>
-	<string name="AgeDaysA">
-		[COUNT] jour
-	</string>
-	<string name="AgeDaysB">
-		[COUNT] jours
-	</string>
-	<string name="AgeDaysC">
-		[COUNT] jours
-	</string>
-	<string name="AcctTypeResident">
-		Résident
-	</string>
-	<string name="AcctTypeTrial">
-		Essai
-	</string>
-	<string name="AcctTypeCharterMember">
-		Membre originaire
-	</string>
-	<string name="AcctTypeEmployee">
-		Employé(e) de Linden Lab
-	</string>
-	<string name="PaymentInfoUsed">
-		Infos de paiement utilisées
-	</string>
-	<string name="PaymentInfoOnFile">
-		Infos de paiement enregistrées
-	</string>
-	<string name="NoPaymentInfoOnFile">
-		Aucune info de paiement
-	</string>
-	<string name="AgeVerified">
-		Âge vérifié
-	</string>
-	<string name="NotAgeVerified">
-		Âge non vérifié
-	</string>
-	<string name="Center 2">
-		Centrer 2
-	</string>
-	<string name="Top Right">
-		En haut à droite
-	</string>
-	<string name="Top">
-		En haut
-	</string>
-	<string name="Top Left">
-		En haut à gauche
-	</string>
-	<string name="Center">
-		Centrer
-	</string>
-	<string name="Bottom Left">
-		En bas à gauche
-	</string>
-	<string name="Bottom">
-		Bas
-	</string>
-	<string name="Bottom Right">
-		En bas à droite
-	</string>
-	<string name="CompileQueueDownloadedCompiling">
-		Téléchargé, compilation en cours
-	</string>
-	<string name="CompileQueueScriptNotFound">
-		Script introuvable sur le serveur.
-	</string>
-	<string name="CompileQueueProblemDownloading">
-		Problème lors du téléchargement
-	</string>
-	<string name="CompileQueueInsufficientPermDownload">
-		Permissions insuffisantes pour télécharger un script.
-	</string>
-	<string name="CompileQueueInsufficientPermFor">
-		Permissions insuffisantes pour
-	</string>
-	<string name="CompileQueueUnknownFailure">
-		Échec du téléchargement, erreur inconnue
-	</string>
-	<string name="CompileQueueTitle">
-		Recompilation - progrès
-	</string>
-	<string name="CompileQueueStart">
-		recompiler
-	</string>
-	<string name="ResetQueueTitle">
-		Réinitialiser les progrès
-	</string>
-	<string name="ResetQueueStart">
-		réinitialiser
-	</string>
-	<string name="RunQueueTitle">
-		Lancer
-	</string>
-	<string name="RunQueueStart">
-		lancer
-	</string>
-	<string name="NotRunQueueTitle">
-		Arrêter
-	</string>
-	<string name="NotRunQueueStart">
-		arrêter
-	</string>
-	<string name="CompileSuccessful">
-		Compilation réussie !
-	</string>
-	<string name="CompileSuccessfulSaving">
-		Compilation réussie, enregistrement en cours...
-	</string>
-	<string name="SaveComplete">
-		Enregistrement terminé.
-	</string>
-	<string name="ObjectOutOfRange">
-		Script (objet hors de portée)
-	</string>
-	<string name="GodToolsObjectOwnedBy">
-		Objet [OBJECT] possédé par [OWNER]
-	</string>
-	<string name="GroupsNone">
-		aucun
-	</string>
-	<string name="Unknown">
-		(Inconnu)
-	</string>
-	<string name="Balance">
-		Solde
-	</string>
-	<string name="Credits">
-		Remerciements
-	</string>
-	<string name="Debits">
-		Débits
-	</string>
-	<string name="Total">
-		Total
-	</string>
-	<string name="NoGroupDataFound">
-		Aucune donnée trouvée pour le groupe
-	</string>
-	<string name="IMParentEstate">
-		domaine parent
-	</string>
-	<string name="IMMainland">
-		continent
-	</string>
-	<string name="IMTeen">
-		teen
-	</string>
-	<string name="RegionInfoError">
-		erreur
-	</string>
-	<string name="RegionInfoAllEstatesOwnedBy">
-		tous les domaines possédés par [OWNER]
-	</string>
-	<string name="RegionInfoAllEstatesYouOwn">
-		tous les domaines que vous possédez
-	</string>
-	<string name="RegionInfoAllEstatesYouManage">
-		tous les domaines que vous gérez pour [owner]
-	</string>
-	<string name="RegionInfoAllowedResidents">
-		Résidents autorisés : ([ALLOWEDAGENTS], max [MAXACCESS])
-	</string>
-	<string name="RegionInfoAllowedGroups">
-		Groupes autorisés : ([ALLOWEDGROUPS], max [MAXACCESS])
-	</string>
-	<string name="CursorPos">
-		Ligne [LINE], Colonne [COLUMN]
-	</string>
-	<string name="PanelDirCountFound">
-		[COUNT] trouvé(s)
-	</string>
-	<string name="PanelContentsNewScript">
-		Nouveau script
-	</string>
-	<string name="MuteByName">
-		(par nom)
-	</string>
-	<string name="MuteAgent">
-		(résident)
-	</string>
-	<string name="MuteObject">
-		(objet)
-	</string>
-	<string name="MuteGroup">
-		(groupe)
-	</string>
-	<string name="RegionNoCovenant">
-		Il n&apos;y a aucun règlement pour ce domaine.
-	</string>
-	<string name="RegionNoCovenantOtherOwner">
-		Il n&apos;y a aucun règlement pour ce domaine. Le terrain sur ce domaine est vendu par le propriétaire, non par Linden Lab.  Pour en savoir plus, veuillez contacter le propriétaire.
-	</string>
-	<string name="covenant_last_modified">
-		Dernière modification :
-	</string>
-	<string name="GroupOwned">
-		Propriété du groupe
-	</string>
-	<string name="Public">
-		Public
-	</string>
-	<string name="ClassifiedClicksTxt">
-		Clics : [TELEPORT] téléporter, [MAP] carte, [PROFILE] profile
-	</string>
-	<string name="ClassifiedUpdateAfterPublish">
-		(mise à jour après la publication)
-	</string>
-	<string name="GroupVoteYes">
-		Oui
-	</string>
-	<string name="GroupVoteNo">
-		Non
-	</string>
-	<string name="GroupVoteNoActiveProposals">
-		Il n&apos;y a aucune proposition active actuellement
-	</string>
-	<string name="GroupVoteNoArchivedProposals">
-		Il n&apos;y a aucune proposition archivée actuellement
-	</string>
-	<string name="GroupVoteRetrievingArchivedProposals">
-		Extraction des propositions archivées
-	</string>
-	<string name="GroupVoteRetrievingActiveProposals">
-		Extraction des propositions actives
-	</string>
-	<string name="MultiPreviewTitle">
-		Prévisualiser
-	</string>
-	<string name="MultiPropertiesTitle">
-		Propriétés
-	</string>
-	<string name="InvOfferAnObjectNamed">
-		Un objet appelé
-	</string>
-	<string name="InvOfferOwnedByGroup">
-		possédé par le groupe
-	</string>
-	<string name="InvOfferOwnedByUnknownGroup">
-		possédé par un groupe inconnu
-	</string>
-	<string name="InvOfferOwnedBy">
-		possédé par
-	</string>
-	<string name="InvOfferOwnedByUnknownUser">
-		possédé par un résident inconnu
-	</string>
-	<string name="InvOfferGaveYou">
-		vous a donné
-	</string>
-	<string name="InvOfferYouDecline">
-		Vous avez refusé
-	</string>
-	<string name="InvOfferFrom">
-		de la part de
-	</string>
-	<string name="GroupMoneyTotal">
-		Total
-	</string>
-	<string name="GroupMoneyBought">
-		acheté
-	</string>
-	<string name="GroupMoneyPaidYou">
-		vous a payé
-	</string>
-	<string name="GroupMoneyPaidInto">
-		payé
-	</string>
-	<string name="GroupMoneyBoughtPassTo">
-		a acheté un pass à
-	</string>
-	<string name="GroupMoneyPaidFeeForEvent">
-		a payé des frais pour un événement
-	</string>
-	<string name="GroupMoneyPaidPrizeForEvent">
-		a payé un prix pour un événement
-	</string>
-	<string name="GroupMoneyBalance">
-		Solde
-	</string>
-	<string name="GroupMoneyCredits">
-		Remerciements
-	</string>
-	<string name="GroupMoneyDebits">
-		Débits
-	</string>
-	<string name="ViewerObjectContents">
-		Contenus
-	</string>
-	<string name="AcquiredItems">
-		Objets acquis
-	</string>
-	<string name="Cancel">
-		Annuler
-	</string>
-	<string name="UploadingCosts">
-		Chargement de %s coûts
-	</string>
-	<string name="UnknownFileExtension">
-		Extension de fichier inconnue. %s
-.wav, .tga, .bmp, .jpg, .jpeg, ou .bvh acceptés
-	</string>
-	<string name="AddLandmarkNavBarMenu">
-		Ajouter un repère...
-	</string>
-	<string name="EditLandmarkNavBarMenu">
-		Modifier le repère...
-	</string>
-	<string name="accel-mac-control">
-		⌃
-	</string>
-	<string name="accel-mac-command">
-		⌘
-	</string>
-	<string name="accel-mac-option">
-		⌥
-	</string>
-	<string name="accel-mac-shift">
-		⇧
-	</string>
-	<string name="accel-win-control">
-		Ctrl+
-	</string>
-	<string name="accel-win-alt">
-		Alt+
-	</string>
-	<string name="accel-win-shift">
-		Maj+
-	</string>
-	<string name="FileSaved">
-		Fichier enregistré
-	</string>
-	<string name="Receiving">
-		Réception
-	</string>
-	<string name="AM">
-		AM
-	</string>
-	<string name="PM">
-		PM
-	</string>
-	<string name="PST">
-		PST
-	</string>
-	<string name="PDT">
-		PDT
-	</string>
-	<string name="Forward">
-		Vers l&apos;avant
-	</string>
-	<string name="Left">
-		Gauche
-	</string>
-	<string name="Right">
-		Droite
-	</string>
-	<string name="Back">
-		Précédente
-	</string>
-	<string name="North">
-		Nord
-	</string>
-	<string name="South">
-		Sud
-	</string>
-	<string name="West">
-		Ouest
-	</string>
-	<string name="East">
-		Est
-	</string>
-	<string name="Up">
-		Vers le haut
-	</string>
-	<string name="Down">
-		Vers le bas
-	</string>
-	<string name="Any Category">
-		Toutes catégories
-	</string>
-	<string name="Shopping">
-		Shopping
-	</string>
-	<string name="Land Rental">
-		Terrains à louer
-	</string>
-	<string name="Property Rental">
-		Propriétés à louer
-	</string>
-	<string name="Special Attraction">
-		Divertissements
-	</string>
-	<string name="New Products">
-		Nouveaux produits
-	</string>
-	<string name="Employment">
-		Emplois
-	</string>
-	<string name="Wanted">
-		Offres
-	</string>
-	<string name="Service">
-		Services
-	</string>
-	<string name="Personal">
-		Divers
-	</string>
-	<string name="None">
-		Aucun
-	</string>
-	<string name="Linden Location">
-		Appartenant aux Lindens
-	</string>
-	<string name="Adult">
-		Adult
-	</string>
-	<string name="Arts&amp;Culture">
-		Art et Culture
-	</string>
-	<string name="Business">
-		Affaires
-	</string>
-	<string name="Educational">
-		Éducation
-	</string>
-	<string name="Gaming">
-		Jeux
-	</string>
-	<string name="Hangout">
-		Favoris
-	</string>
-	<string name="Newcomer Friendly">
-		Accueil pour les nouveaux
-	</string>
-	<string name="Parks&amp;Nature">
-		Parcs et Nature
-	</string>
-	<string name="Residential">
-		Résidentiel
-	</string>
-	<string name="Stage">
-		Phase
-	</string>
-	<string name="Other">
-		Autre
-	</string>
-	<string name="Any">
-		Aucun
-	</string>
-	<string name="You">
-		Vous
-	</string>
-	<string name=":">
-		:
-	</string>
-	<string name=",">
-		,
-	</string>
-	<string name="...">
-		...
-	</string>
-	<string name="***">
-		***
-	</string>
-	<string name="(">
-		(
-	</string>
-	<string name=")">
-		)
-	</string>
-	<string name=".">
-		.
-	</string>
-	<string name="&apos;">
-		&apos;
-	</string>
-	<string name="---">
-		---
-	</string>
-	<string name="MBCmdLineError">
-		Une erreur est survenue lors de la lecture de la ligne de commande.
-Merci de consulter : http://wiki.secondlife.com/wiki/Client_parameters
-Erreur :
-	</string>
-	<string name="MBCmdLineUsg">
-		[APP_NAME] Utilisation de la ligne de commande :
-	</string>
-	<string name="MBUnableToAccessFile">
-		[APP_NAME] ne peut accéder à un fichier requis.
-
-Cela vient du fait que quelqu&apos;un a ouvert plusieurs copies ou que votre système pense qu&apos;un fichier est ouvert.
-Si ce message persiste, veuillez redémarrer votre ordinateur.
-Si le problème persiste, vous devrez peut-être complètement désinstaller puis réinstaller [APP_NAME].
-	</string>
-	<string name="MBFatalError">
-		Erreur fatale
-	</string>
-	<string name="MBRequiresAltiVec">
-		[APP_NAME] nécessite un microprocesseur AltiVec (version G4 ou antérieure).
-	</string>
-	<string name="MBAlreadyRunning">
-		[APP_NAME] est déjà lancé.
-Vérifiez si une version minimisée du programme apparaît dans votre barre de tâches.
-Si ce message persiste, redémarrez votre ordinateur.
-	</string>
-	<string name="MBFrozenCrashed">
-		[APP_NAME] semble avoir crashé lors de l&apos;utilisation précédente.
-Voulez-vous envoyer un rapport de crash ?
-	</string>
-	<string name="MBAlert">
-		Alerte
-	</string>
-	<string name="MBNoDirectX">
-		[APP_NAME] ne peut détecter DirectX 9.0b ou une version supérieure.
-[APP_NAME] utilise DirectX pour détecter les matériels et/ou les pilotes qui ne sont pas à jour et peuvent causer des problèmes de stabilité, de performance, ou des plantages.  Bien que vous puissiez utiliser [APP_NAME] sans DirectX, nous vous recommandons de l&apos;utiliser avec DirectX 9.0b.
-
-Voulez-vous continuer ?
-	</string>
-	<string name="MBWarning">
-		Avertissement
-	</string>
-	<string name="MBNoAutoUpdate">
-		Les mises à jour automatiques n&apos;existent pas encore pour Linux.
-Veuillez télécharger la dernière version sur www.secondlife.com.
-	</string>
-	<string name="MBRegClassFailed">
-		RegisterClass a échoué
-	</string>
-	<string name="MBError">
-		Erreur
-	</string>
-	<string name="MBFullScreenErr">
-		Impossible d&apos;ouvrir le mode plein écran de [WIDTH] x [HEIGHT]
-Utilisation du mode fenêtré.
-	</string>
-	<string name="MBDestroyWinFailed">
-		Erreur de fermeture lors de la destruction de la fenêtre (DestroyWindow() failed))
-	</string>
-	<string name="MBShutdownErr">
-		Erreur de fermeture
-	</string>
-	<string name="MBDevContextErr">
-		Impossible de créer le contexte GL
-	</string>
-	<string name="MBPixelFmtErr">
-		Impossible de trouver le format pixel approprié
-	</string>
-	<string name="MBPixelFmtDescErr">
-		Impossible de trouver la description du format pixel
-	</string>
-	<string name="MBTrueColorWindow">
-		[APP_NAME] nécessite que True Color (32-bit) soit exécuté dans une fenêtre.
-Veuillez allez sous Panneau de configuration &gt; Affichage &gt; Paramètres et régler la couleur de l&apos;écran sur 32-bit.
-Sinon, lorsque vous choisissez le mode plein écran,  [APP_NAME] ajustera automatiquement l&apos;écran à chaque utilisation.
-	</string>
-	<string name="MBAlpha">
-		[APP_NAME] ne peut pas être lancé car il n&apos;y pas de channel 8 bit accessible.  En général, ceci vient de problèmes avec le pilote de la carte vidéo.
-Assurez-vous d&apos;avoir installé le pilote de carte vidéo le plus récent possible.
- Assurez-vous aussi que votre écran est réglé sur True Clor (22-bit) sous Panneau de configuration &gt; Affichage &gt; Paramètres.
-Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
-	</string>
-	<string name="MBPixelFmtSetErr">
-		Impossible de trouver le format pixel approprié
-	</string>
-	<string name="MBGLContextErr">
-		Impossible de créer le contexte de rendu GL
-	</string>
-	<string name="MBGLContextActErr">
-		Impossible d&apos;activer le contexte de rendu GL
-	</string>
-	<string name="MBVideoDrvErr">
-		[APP_NAME] ne peut pas être exécuté car les pilotes de votre carte vidéo n&apos;ont pas été installés correctement, ne sont pas à jour, ou sont pour du matériel non pris en charge. Assurez-vous d&apos;avoir des pilotes de cartes vidéos récents, et même si vous avez les plus récents, réinstallez-les.
-
-Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
-	</string>
-	<string name="5 O&apos;Clock Shadow">
-		Barbe naissante
-	</string>
-	<string name="All White">
-		Tout blancs
-	</string>
-	<string name="Anime Eyes">
-		Grand yeux
-	</string>
-	<string name="Arced">
-		Arquées
-	</string>
-	<string name="Arm Length">
-		Longueur des bras
-	</string>
-	<string name="Attached">
-		Minces
-	</string>
-	<string name="Attached Earlobes">
-		Largeur des lobes
-	</string>
-	<string name="Back Bangs">
-		Mèches de derrière
-	</string>
-	<string name="Back Bangs Down">
-		Mèches de derrière Bas
-	</string>
-	<string name="Back Bangs Up">
-		Mèches de derrière haut
-	</string>
-	<string name="Back Fringe">
-		Mèches de derrière
-	</string>
-	<string name="Back Hair">
-		Cheveux de derrière
-	</string>
-	<string name="Back Hair Down">
-		Cheveux de derrière Bas
-	</string>
-	<string name="Back Hair Up">
-		Cheveux de derrière haut
-	</string>
-	<string name="Baggy">
-		Cernés
-	</string>
-	<string name="Bangs">
-		Frange
-	</string>
-	<string name="Bangs Down">
-		Frange Bas
-	</string>
-	<string name="Bangs Up">
-		Frange Haut
-	</string>
-	<string name="Beady Eyes">
-		Yeux perçants
-	</string>
-	<string name="Belly Size">
-		Taille du ventre
-	</string>
-	<string name="Big">
-		Gros
-	</string>
-	<string name="Big Butt">
-		Grosses fesses
-	</string>
-	<string name="Big Eyeball">
-		Gros globe oculaire
-	</string>
-	<string name="Big Hair Back">
-		Cheveux volumineux : Derrière
-	</string>
-	<string name="Big Hair Front">
-		Cheveux volumineux : Devant
-	</string>
-	<string name="Big Hair Top">
-		Cheveux volumineux : En haut
-	</string>
-	<string name="Big Head">
-		Grosse tête
-	</string>
-	<string name="Big Pectorals">
-		Gros pectoraux
-	</string>
-	<string name="Big Spikes">
-		Spikes
-	</string>
-	<string name="Black">
-		Noir
-	</string>
-	<string name="Blonde">
-		Blond
-	</string>
-	<string name="Blonde Hair">
-		Cheveux blonds
-	</string>
-	<string name="Blush">
-		Blush
-	</string>
-	<string name="Blush Color">
-		Couleur du blush
-	</string>
-	<string name="Blush Opacity">
-		Opacité du blush
-	</string>
-	<string name="Body Definition">
-		Contour du corps
-	</string>
-	<string name="Body Fat">
-		Graisse
-	</string>
-	<string name="Body Freckles">
-		Grains de beauté
-	</string>
-	<string name="Body Thick">
-		Corps épais
-	</string>
-	<string name="Body Thickness">
-		Épaisseur du corps
-	</string>
-	<string name="Body Thin">
-		Corps mince
-	</string>
-	<string name="Bow Legged">
-		Jambes arquées
-	</string>
-	<string name="Breast Buoyancy">
-		Hauteur des seins
-	</string>
-	<string name="Breast Cleavage">
-		Clivage
-	</string>
-	<string name="Breast Size">
-		Taille des seins
-	</string>
-	<string name="Bridge Width">
-		Arête du nez
-	</string>
-	<string name="Broad">
-		Large
-	</string>
-	<string name="Brow Size">
-		Taille des sourcils
-	</string>
-	<string name="Bug Eyes">
-		Yeux globuleux
-	</string>
-	<string name="Bugged Eyes">
-		Yeux globuleux
-	</string>
-	<string name="Bulbous">
-		En bulbe
-	</string>
-	<string name="Bulbous Nose">
-		Nez en bulbe
-	</string>
-	<string name="Bushy Eyebrows">
-		Sourcils touffus
-	</string>
-	<string name="Bushy Hair">
-		Cheveux touffus
-	</string>
-	<string name="Butt Size">
-		Taille des fesses
-	</string>
-	<string name="bustle skirt">
-		Jupe gonflante
-	</string>
-	<string name="no bustle">
-		Pas gonflante
-	</string>
-	<string name="more bustle">
-		Plus gonflante
-	</string>
-	<string name="Chaplin">
-		Chaplin
-	</string>
-	<string name="Cheek Bones">
-		Pommettes
-	</string>
-	<string name="Chest Size">
-		Taille de la poitrine
-	</string>
-	<string name="Chin Angle">
-		Angle du menton
-	</string>
-	<string name="Chin Cleft">
-		Fente labiale
-	</string>
-	<string name="Chin Curtains">
-		Favoris
-	</string>
-	<string name="Chin Depth">
-		Profondeur du menton
-	</string>
-	<string name="Chin Heavy">
-		Menton lourd
-	</string>
-	<string name="Chin In">
-		Menton rentré
-	</string>
-	<string name="Chin Out">
-		Menton sorti
-	</string>
-	<string name="Chin-Neck">
-		Menton-cou
-	</string>
-	<string name="Clear">
-		Effacer
-	</string>
-	<string name="Cleft">
-		Fente
-	</string>
-	<string name="Close Set Eyes">
-		Yeux rapprochés
-	</string>
-	<string name="Closed">
-		Fermé(s)
-	</string>
-	<string name="Closed Back">
-		Fermé à l&apos;arrière
-	</string>
-	<string name="Closed Front">
-		Fermé devant
-	</string>
-	<string name="Closed Left">
-		Fermé à gauche
-	</string>
-	<string name="Closed Right">
-		Fermé à droite
-	</string>
-	<string name="Coin Purse">
-		Bijoux de famille
-	</string>
-	<string name="Collar Back">
-		Col arrière
-	</string>
-	<string name="Collar Front">
-		Col devant
-	</string>
-	<string name="Corner Down">
-		Coin vers le bas
-	</string>
-	<string name="Corner Normal">
-		Coin normal
-	</string>
-	<string name="Corner Up">
-		Coin vers le haut
-	</string>
-	<string name="Creased">
-		Frippée
-	</string>
-	<string name="Crooked Nose">
-		Nez en bec d&apos;aigle
-	</string>
-	<string name="Cropped Hair">
-		Garçonne
-	</string>
-	<string name="Cuff Flare">
-		Jambe
-	</string>
-	<string name="Dark">
-		Sombre
-	</string>
-	<string name="Dark Green">
-		Vert foncé
-	</string>
-	<string name="Darker">
-		Plus foncé
-	</string>
-	<string name="Deep">
-		Profonde
-	</string>
-	<string name="Default Heels">
-		Talons par défaut
-	</string>
-	<string name="Default Toe">
-		Orteil par défaut
-	</string>
-	<string name="Dense">
-		Dense
-	</string>
-	<string name="Dense hair">
-		Cheveux denses
-	</string>
-	<string name="Double Chin">
-		Double menton
-	</string>
-	<string name="Downturned">
-		Pointant vers le bas
-	</string>
-	<string name="Duffle Bag">
-		Membre viril
-	</string>
-	<string name="Ear Angle">
-		Angle de l&apos;oreille
-	</string>
-	<string name="Ear Size">
-		Taille de l&apos;oreille
-	</string>
-	<string name="Ear Tips">
-		Pointes de l&apos;oreille
-	</string>
-	<string name="Egg Head">
-		Forme de la tête
-	</string>
-	<string name="Eye Bags">
-		Cernes
-	</string>
-	<string name="Eye Color">
-		Couleur des yeux
-	</string>
-	<string name="Eye Depth">
-		Profondeur des yeux
-	</string>
-	<string name="Eye Lightness">
-		Clarté des yeux
-	</string>
-	<string name="Eye Opening">
-		Ouverture des yeux
-	</string>
-	<string name="Eye Pop">
-		Œil proéminent
-	</string>
-	<string name="Eye Size">
-		Taille de l&apos;œil
-	</string>
-	<string name="Eye Spacing">
-		Espacement des yeux
-	</string>
-	<string name="Eyeball Size">
-		Taille du globe oculaire
-	</string>
-	<string name="Eyebrow Arc">
-		Arc des sourcils
-	</string>
-	<string name="Eyebrow Density">
-		Épaisseur des sourcils
-	</string>
-	<string name="Eyebrow Height">
-		Hauteur des sourcils
-	</string>
-	<string name="Eyebrow Points">
-		Direction des sourcils
-	</string>
-	<string name="Eyebrow Size">
-		Taille des sourcils
-	</string>
-	<string name="Eyelash Length">
-		Longueur des cils
-	</string>
-	<string name="Eyeliner">
-		Eyeliner
-	</string>
-	<string name="Eyeliner Color">
-		Couleur de l&apos;eyeliner
-	</string>
-	<string name="Eyes Back">
-		Yeux noirs
-	</string>
-	<string name="Eyes Bugged">
-		Yeux globuleux
-	</string>
-	<string name="Eyes Forward">
-		Yeux vers l&apos;avant
-	</string>
-	<string name="Eyes Long Head">
-		Yeux longue tête
-	</string>
-	<string name="Eyes Shear Left Up">
-		Å’il gauche vers le haut
-	</string>
-	<string name="Eyes Shear Right Up">
-		Å’il droit vers le haut
-	</string>
-	<string name="Eyes Short Head">
-		Yeux petite tête
-	</string>
-	<string name="Eyes Spread">
-		Espacement des yeux
-	</string>
-	<string name="Eyes Sunken">
-		Yeux enfoncés
-	</string>
-	<string name="Eyes Together">
-		Yeux rapprochés
-	</string>
-	<string name="Face Shear">
-		Visage
-	</string>
-	<string name="Facial Definition">
-		Définition du visage
-	</string>
-	<string name="Far Set Eyes">
-		Yeux écartés
-	</string>
-	<string name="Fat">
-		Grosse
-	</string>
-	<string name="Fat Head">
-		Grosse tête
-	</string>
-	<string name="Fat Lips">
-		Lèvres épaisses
-	</string>
-	<string name="Fat Lower">
-		Inférieure plus épaisse
-	</string>
-	<string name="Fat Lower Lip">
-		Lèvre inférieure épaisse
-	</string>
-	<string name="Fat Torso">
-		Torse épais
-	</string>
-	<string name="Fat Upper">
-		Supérieure plus épaisse
-	</string>
-	<string name="Fat Upper Lip">
-		Lèvre supérieure épaisse
-	</string>
-	<string name="Female">
-		Femme
-	</string>
-	<string name="Fingerless">
-		Sans doigts
-	</string>
-	<string name="Fingers">
-		Doigts
-	</string>
-	<string name="Flared Cuffs">
-		Jambes larges
-	</string>
-	<string name="Flat">
-		Plat
-	</string>
-	<string name="Flat Butt">
-		Fesses plates
-	</string>
-	<string name="Flat Head">
-		Tête plate
-	</string>
-	<string name="Flat Toe">
-		Orteil plat
-	</string>
-	<string name="Foot Size">
-		Pointure
-	</string>
-	<string name="Forehead Angle">
-		Angle du front
-	</string>
-	<string name="Forehead Heavy">
-		Front lourd
-	</string>
-	<string name="Freckles">
-		Tâches de rousseur
-	</string>
-	<string name="Front Bangs Down">
-		Mèches de devant longues
-	</string>
-	<string name="Front Bangs Up">
-		Mèches de devant courtes
-	</string>
-	<string name="Front Fringe">
-		Mèches de devant
-	</string>
-	<string name="Front Hair">
-		Cheveux devant
-	</string>
-	<string name="Front Hair Down">
-		Cheveux de devant longs
-	</string>
-	<string name="Front Hair Up">
-		Cheveux de devant courts
-	</string>
-	<string name="Full Back">
-		Arrière touffu
-	</string>
-	<string name="Full Eyeliner">
-		Eyeliner marqué
-	</string>
-	<string name="Full Front">
-		Devant touffu
-	</string>
-	<string name="Full Hair Sides">
-		Côtés touffus
-	</string>
-	<string name="Full Sides">
-		Côtés touffus
-	</string>
-	<string name="Glossy">
-		Brillant
-	</string>
-	<string name="Glove Fingers">
-		Doigts avec gants
-	</string>
-	<string name="Glove Length">
-		Longueur des gants
-	</string>
-	<string name="Hair">
-		Cheveux
-	</string>
-	<string name="Hair Back">
-		Cheveux : Derrière
-	</string>
-	<string name="Hair Front">
-		Cheveux : Devant
-	</string>
-	<string name="Hair Sides">
-		Cheveux : Côtés
-	</string>
-	<string name="Hair Sweep">
-		Sens de la coiffure
-	</string>
-	<string name="Hair Thickess">
-		Épaisseur des cheveux
-	</string>
-	<string name="Hair Thickness">
-		Épaisseur des cheveux
-	</string>
-	<string name="Hair Tilt">
-		Inclinaison des cheveux
-	</string>
-	<string name="Hair Tilted Left">
-		Vers la gauche
-	</string>
-	<string name="Hair Tilted Right">
-		Vers la droite
-	</string>
-	<string name="Hair Volume">
-		Cheveux : Volume
-	</string>
-	<string name="Hand Size">
-		Taille de la main
-	</string>
-	<string name="Handlebars">
-		Guidons
-	</string>
-	<string name="Head Length">
-		Longueur de la tête
-	</string>
-	<string name="Head Shape">
-		Forme de la tête
-	</string>
-	<string name="Head Size">
-		Taille de la tête
-	</string>
-	<string name="Head Stretch">
-		Allongement de la tête
-	</string>
-	<string name="Heel Height">
-		Hauteur des talons
-	</string>
-	<string name="Heel Shape">
-		Forme des talons
-	</string>
-	<string name="Height">
-		Taille
-	</string>
-	<string name="High">
-		Haut
-	</string>
-	<string name="High Heels">
-		Talons hauts
-	</string>
-	<string name="High Jaw">
-		Mâchoire haute
-	</string>
-	<string name="High Platforms">
-		Plateformes hautes
-	</string>
-	<string name="High and Tight">
-		Haut et serré
-	</string>
-	<string name="Higher">
-		Plus élevé
-	</string>
-	<string name="Hip Length">
-		Longueur hanche
-	</string>
-	<string name="Hip Width">
-		Largeur hanche
-	</string>
-	<string name="In">
-		In
-	</string>
-	<string name="In Shdw Color">
-		Couleur ombre interne
-	</string>
-	<string name="In Shdw Opacity">
-		Opacité ombre interne
-	</string>
-	<string name="Inner Eye Corner">
-		Coin de l&apos;œil interne
-	</string>
-	<string name="Inner Eye Shadow">
-		Ombre de l&apos;œil interne
-	</string>
-	<string name="Inner Shadow">
-		Ombre interne
-	</string>
-	<string name="Jacket Length">
-		Longueur de la veste
-	</string>
-	<string name="Jacket Wrinkles">
-		Plis de la veste
-	</string>
-	<string name="Jaw Angle">
-		Angle de la mâchoire
-	</string>
-	<string name="Jaw Jut">
-		saillie de la mâchoire
-	</string>
-	<string name="Jaw Shape">
-		Forme de la mâchoire
-	</string>
-	<string name="Join">
-		Rapprochés
-	</string>
-	<string name="Jowls">
-		Bajoues
-	</string>
-	<string name="Knee Angle">
-		Angle du genou
-	</string>
-	<string name="Knock Kneed">
-		Genoux rapprochés
-	</string>
-	<string name="Large">
-		Grande
-	</string>
-	<string name="Large Hands">
-		Grandes mains
-	</string>
-	<string name="Left Part">
-		Raie à gauche
-	</string>
-	<string name="Leg Length">
-		Longueur de la jambe
-	</string>
-	<string name="Leg Muscles">
-		Muscles de la jambe
-	</string>
-	<string name="Less">
-		Moins
-	</string>
-	<string name="Less Body Fat">
-		Moins de graisse
-	</string>
-	<string name="Less Curtains">
-		Moins
-	</string>
-	<string name="Less Freckles">
-		Moins
-	</string>
-	<string name="Less Full">
-		Moins
-	</string>
-	<string name="Less Gravity">
-		Moins
-	</string>
-	<string name="Less Love">
-		Moins
-	</string>
-	<string name="Less Muscles">
-		Moins
-	</string>
-	<string name="Less Muscular">
-		Moins
-	</string>
-	<string name="Less Rosy">
-		Moins
-	</string>
-	<string name="Less Round">
-		Moins
-	</string>
-	<string name="Less Saddle">
-		Moins
-	</string>
-	<string name="Less Square">
-		Moins
-	</string>
-	<string name="Less Volume">
-		Moins
-	</string>
-	<string name="Less soul">
-		Moins
-	</string>
-	<string name="Lighter">
-		Plus léger
-	</string>
-	<string name="Lip Cleft">
-		Fente labiale
-	</string>
-	<string name="Lip Cleft Depth">
-		Profondeur de la fente labiale
-	</string>
-	<string name="Lip Fullness">
-		Volume des lèvres
-	</string>
-	<string name="Lip Pinkness">
-		Rougeur des lèvres
-	</string>
-	<string name="Lip Ratio">
-		Proportion des lèvres
-	</string>
-	<string name="Lip Thickness">
-		Épaisseur des lèvres
-	</string>
-	<string name="Lip Width">
-		Largeur des lèvres
-	</string>
-	<string name="Lipgloss">
-		Brillant à lèvres
-	</string>
-	<string name="Lipstick">
-		Rouge à lèvres
-	</string>
-	<string name="Lipstick Color">
-		Couleur du rouge à lèvres
-	</string>
-	<string name="Long">
-		Long
-	</string>
-	<string name="Long Head">
-		Tête longue
-	</string>
-	<string name="Long Hips">
-		Hanches longues
-	</string>
-	<string name="Long Legs">
-		Jambes longues
-	</string>
-	<string name="Long Neck">
-		Long cou
-	</string>
-	<string name="Long Pigtails">
-		Longues couettes
-	</string>
-	<string name="Long Ponytail">
-		Longue queue de cheval
-	</string>
-	<string name="Long Torso">
-		Torse long
-	</string>
-	<string name="Long arms">
-		Longs bras
-	</string>
-	<string name="Longcuffs">
-		Manches longues
-	</string>
-	<string name="Loose Pants">
-		Pantalons amples
-	</string>
-	<string name="Loose Shirt">
-		Chemise ample
-	</string>
-	<string name="Loose Sleeves">
-		Manches amples
-	</string>
-	<string name="Love Handles">
-		Poignées d&apos;amour
-	</string>
-	<string name="Low">
-		Bas
-	</string>
-	<string name="Low Heels">
-		Talons bas
-	</string>
-	<string name="Low Jaw">
-		Mâchoire basse
-	</string>
-	<string name="Low Platforms">
-		Plateformes basses
-	</string>
-	<string name="Low and Loose">
-		Bas et ample
-	</string>
-	<string name="Lower">
-		Abaisser
-	</string>
-	<string name="Lower Bridge">
-		Arête plus basse
-	</string>
-	<string name="Lower Cheeks">
-		Joues plus basses
-	</string>
-	<string name="Male">
-		Homme
-	</string>
-	<string name="Middle Part">
-		Raie au milieu
-	</string>
-	<string name="More">
-		Plus
-	</string>
-	<string name="More Blush">
-		Plus
-	</string>
-	<string name="More Body Fat">
-		Plus
-	</string>
-	<string name="More Curtains">
-		Plus
-	</string>
-	<string name="More Eyeshadow">
-		Plus
-	</string>
-	<string name="More Freckles">
-		Plus
-	</string>
-	<string name="More Full">
-		Plus
-	</string>
-	<string name="More Gravity">
-		Plus
-	</string>
-	<string name="More Lipstick">
-		Plus
-	</string>
-	<string name="More Love">
-		Plus
-	</string>
-	<string name="More Lower Lip">
-		Plus
-	</string>
-	<string name="More Muscles">
-		Plus
-	</string>
-	<string name="More Muscular">
-		Plus
-	</string>
-	<string name="More Rosy">
-		Plus
-	</string>
-	<string name="More Round">
-		Plus
-	</string>
-	<string name="More Saddle">
-		Plus
-	</string>
-	<string name="More Sloped">
-		Plus
-	</string>
-	<string name="More Square">
-		Plus
-	</string>
-	<string name="More Upper Lip">
-		Plus
-	</string>
-	<string name="More Vertical">
-		Plus
-	</string>
-	<string name="More Volume">
-		Plus
-	</string>
-	<string name="More soul">
-		Plus
-	</string>
-	<string name="Moustache">
-		Moustache
-	</string>
-	<string name="Mouth Corner">
-		Coin de la bouche
-	</string>
-	<string name="Mouth Position">
-		Position de la bouche
-	</string>
-	<string name="Mowhawk">
-		Mowhawk
-	</string>
-	<string name="Muscular">
-		Musclé
-	</string>
-	<string name="Mutton Chops">
-		Rouflaquettes
-	</string>
-	<string name="Nail Polish">
-		Vernis à ongles
-	</string>
-	<string name="Nail Polish Color">
-		Couleur du vernis
-	</string>
-	<string name="Narrow">
-		Étroit
-	</string>
-	<string name="Narrow Back">
-		Arrière étroit
-	</string>
-	<string name="Narrow Front">
-		Devant étroit
-	</string>
-	<string name="Narrow Lips">
-		Lèvres étroites
-	</string>
-	<string name="Natural">
-		Naturel
-	</string>
-	<string name="Neck Length">
-		Longueur du cou
-	</string>
-	<string name="Neck Thickness">
-		Épaisseur du cou
-	</string>
-	<string name="No Blush">
-		Pas de blush
-	</string>
-	<string name="No Eyeliner">
-		Pas de eyeliner
-	</string>
-	<string name="No Eyeshadow">
-		Pas d&apos;ombre à paupières
-	</string>
-	<string name="No Heels">
-		Pas de talons
-	</string>
-	<string name="No Lipgloss">
-		Pas de brillant à lèvres
-	</string>
-	<string name="No Lipstick">
-		Pas de rouge à lèvres
-	</string>
-	<string name="No Part">
-		Pas de raie
-	</string>
-	<string name="No Polish">
-		Pas de vernis
-	</string>
-	<string name="No Red">
-		Pas de rouge
-	</string>
-	<string name="No Spikes">
-		Pas de spikes
-	</string>
-	<string name="No White">
-		Pas de blanc
-	</string>
-	<string name="No Wrinkles">
-		Pas de rides
-	</string>
-	<string name="Normal Lower">
-		Normal plus bas
-	</string>
-	<string name="Normal Upper">
-		Normal plus haut
-	</string>
-	<string name="Nose Left">
-		Nez à gauche
-	</string>
-	<string name="Nose Right">
-		Nez à droite
-	</string>
-	<string name="Nose Size">
-		Taille du nez
-	</string>
-	<string name="Nose Thickness">
-		Épaisseur du nez
-	</string>
-	<string name="Nose Tip Angle">
-		Angle du bout du nez
-	</string>
-	<string name="Nose Tip Shape">
-		Forme du bout du nez
-	</string>
-	<string name="Nose Width">
-		Largeur du nez
-	</string>
-	<string name="Nostril Division">
-		Division des narines
-	</string>
-	<string name="Nostril Width">
-		Largeur des narines
-	</string>
-	<string name="Old">
-		Vieux
-	</string>
-	<string name="Opaque">
-		Opaque
-	</string>
-	<string name="Open">
-		Ouvert
-	</string>
-	<string name="Open Back">
-		Derrière ouvert
-	</string>
-	<string name="Open Front">
-		Devant ouvert
-	</string>
-	<string name="Open Left">
-		Ouvert à gauche
-	</string>
-	<string name="Open Right">
-		Ouvert à droite
-	</string>
-	<string name="Orange">
-		Orange
-	</string>
-	<string name="Out">
-		Dehors
-	</string>
-	<string name="Out Shdw Color">
-		Couleur de l&apos;ombre externe
-	</string>
-	<string name="Out Shdw Opacity">
-		Opacité de l&apos;ombre externe
-	</string>
-	<string name="Outer Eye Corner">
-		Coin de l&apos;œil externe
-	</string>
-	<string name="Outer Eye Shadow">
-		Ombre de l&apos;œil externe
-	</string>
-	<string name="Outer Shadow">
-		Ombre externe
-	</string>
-	<string name="Overbite">
-		Chevauchement
-	</string>
-	<string name="Package">
-		Parties
-	</string>
-	<string name="Painted Nails">
-		Ongles vernis
-	</string>
-	<string name="Pale">
-		Pâle
-	</string>
-	<string name="Pants Crotch">
-		Entrejambe
-	</string>
-	<string name="Pants Fit">
-		Taille
-	</string>
-	<string name="Pants Length">
-		Longueur
-	</string>
-	<string name="Pants Waist">
-		Taille
-	</string>
-	<string name="Pants Wrinkles">
-		Plis
-	</string>
-	<string name="Part">
-		Raie
-	</string>
-	<string name="Part Bangs">
-		Séparation de la frange
-	</string>
-	<string name="Pectorals">
-		Pectoraux
-	</string>
-	<string name="Pigment">
-		Pigmentation
-	</string>
-	<string name="Pigtails">
-		Couettes
-	</string>
-	<string name="Pink">
-		Rose
-	</string>
-	<string name="Pinker">
-		Plus rose
-	</string>
-	<string name="Platform Height">
-		Hauteur de la plateforme
-	</string>
-	<string name="Platform Width">
-		Largeur de la plateforme
-	</string>
-	<string name="Pointy">
-		Pointu
-	</string>
-	<string name="Pointy Heels">
-		Talons pointus
-	</string>
-	<string name="Pointy Toe">
-		Orteil pointu
-	</string>
-	<string name="Ponytail">
-		Queue de cheval
-	</string>
-	<string name="Poofy Skirt">
-		Jupe bouffante
-	</string>
-	<string name="Pop Left Eye">
-		Å’il gauche saillant
-	</string>
-	<string name="Pop Right Eye">
-		Å’il droit saillant
-	</string>
-	<string name="Puffy">
-		Gonflé
-	</string>
-	<string name="Puffy Eyelids">
-		Paupières gonflées
-	</string>
-	<string name="Rainbow Color">
-		Couleur de l&apos;arc en ciel
-	</string>
-	<string name="Red Hair">
-		Cheveux roux
-	</string>
-	<string name="Red Skin">
-		Peau rouge
-	</string>
-	<string name="Regular">
-		Standard
-	</string>
-	<string name="Regular Muscles">
-		Muscles normaux
-	</string>
-	<string name="Right Part">
-		Raie à droite
-	</string>
-	<string name="Rosy Complexion">
-		Teint rosé
-	</string>
-	<string name="Round">
-		Rond
-	</string>
-	<string name="Round Forehead">
-		Front rond
-	</string>
-	<string name="Ruddiness">
-		Rougeur
-	</string>
-	<string name="Ruddy">
-		Rouge
-	</string>
-	<string name="Rumpled Hair">
-		Texture
-	</string>
-	<string name="Saddle Bags">
-		Culotte de cheval
-	</string>
-	<string name="Saddlebags">
-		Culotte de cheval
-	</string>
-	<string name="Scrawny">
-		Maigre
-	</string>
-	<string name="Scrawny Leg">
-		Jambes maigres
-	</string>
-	<string name="Separate">
-		Séparés
-	</string>
-	<string name="Shading">
-		Dégradé
-	</string>
-	<string name="Shadow hair">
-		Cheveux
-	</string>
-	<string name="Shallow">
-		Creux
-	</string>
-	<string name="Shear Back">
-		Coupe derrière
-	</string>
-	<string name="Shear Face">
-		Visage
-	</string>
-	<string name="Shear Front">
-		Devant dégagé
-	</string>
-	<string name="Shear Left">
-		Gauche dégagée
-	</string>
-	<string name="Shear Left Up">
-		Haut gauche dégagé
-	</string>
-	<string name="Shear Right">
-		Droite dégagée
-	</string>
-	<string name="Shear Right Up">
-		Haut droit dégagé
-	</string>
-	<string name="Sheared Back">
-		Dégagé derrière
-	</string>
-	<string name="Sheared Front">
-		Dégagé devant
-	</string>
-	<string name="Shift Left">
-		Déplacer vers la gauche
-	</string>
-	<string name="Shift Mouth">
-		Déplacer la bouche
-	</string>
-	<string name="Shift Right">
-		Déplacer vers la droite
-	</string>
-	<string name="Shirt Bottom">
-		Chemise
-	</string>
-	<string name="Shirt Fit">
-		Taille
-	</string>
-	<string name="Shirt Wrinkles">
-		Plis
-	</string>
-	<string name="Shoe Height">
-		Hauteur de la chaussure
-	</string>
-	<string name="Short">
-		Court
-	</string>
-	<string name="Short Arms">
-		Bras courts
-	</string>
-	<string name="Short Legs">
-		Jambes courtes
-	</string>
-	<string name="Short Neck">
-		Petit cou
-	</string>
-	<string name="Short Pigtails">
-		Couettes courtes
-	</string>
-	<string name="Short Ponytail">
-		Queue de cheval courte
-	</string>
-	<string name="Short Sideburns">
-		Favoris courts
-	</string>
-	<string name="Short Torso">
-		Torse court
-	</string>
-	<string name="Short hips">
-		Hanches courtes
-	</string>
-	<string name="Shoulders">
-		Épaules
-	</string>
-	<string name="Side Bangs">
-		Mèches sur le côté
-	</string>
-	<string name="Side Bangs Down">
-		Mèches sur le côté en bas
-	</string>
-	<string name="Side Bangs Up">
-		Mèches sur le côté en haut
-	</string>
-	<string name="Side Fringe">
-		Frange sur le côté
-	</string>
-	<string name="Sideburns">
-		Favoris
-	</string>
-	<string name="Sides Hair">
-		Cheveux sur le côté
-	</string>
-	<string name="Sides Hair Down">
-		Cheveux sur le côté en bas
-	</string>
-	<string name="Sides Hair Up">
-		Cheveux sur le côté en haut
-	</string>
-	<string name="Skinny">
-		Maigre
-	</string>
-	<string name="Skinny Neck">
-		Cou maigre
-	</string>
-	<string name="Skirt Fit">
-		Taille de la jupe
-	</string>
-	<string name="Skirt Length">
-		Longueur de la jupe
-	</string>
-	<string name="Slanted Forehead">
-		Front incliné
-	</string>
-	<string name="Sleeve Length">
-		Longueur de la manche
-	</string>
-	<string name="Sleeve Looseness">
-		Ampleur de la manche
-	</string>
-	<string name="Slit Back">
-		Fente : Derrière
-	</string>
-	<string name="Slit Front">
-		Fente : Devant
-	</string>
-	<string name="Slit Left">
-		Fente : Gauche
-	</string>
-	<string name="Slit Right">
-		Fente : Droite
-	</string>
-	<string name="Small">
-		Petite
-	</string>
-	<string name="Small Hands">
-		Petites mains
-	</string>
-	<string name="Small Head">
-		Petite tête
-	</string>
-	<string name="Smooth">
-		Lisse
-	</string>
-	<string name="Smooth Hair">
-		Cheveux lisses
-	</string>
-	<string name="Socks Length">
-		Longueur des chaussettes
-	</string>
-	<string name="Some">
-		Quelques un(e)s
-	</string>
-	<string name="Soulpatch">
-		Soulpatch
-	</string>
-	<string name="Sparse">
-		Rares
-	</string>
-	<string name="Spiked Hair">
-		Mèches en pointe
-	</string>
-	<string name="Square">
-		Carré
-	</string>
-	<string name="Square Toe">
-		Orteil carré
-	</string>
-	<string name="Squash Head">
-		Écraser la tête
-	</string>
-	<string name="Squash/Stretch Head">
-		Allonger/écraser la tête
-	</string>
-	<string name="Stretch Head">
-		Allonger la tête
-	</string>
-	<string name="Sunken">
-		Enfoncées
-	</string>
-	<string name="Sunken Chest">
-		Poitrine enfoncée
-	</string>
-	<string name="Sunken Eyes">
-		Yeux enfoncés
-	</string>
-	<string name="Sweep Back">
-		En arrière
-	</string>
-	<string name="Sweep Forward">
-		Vers l&apos;avant
-	</string>
-	<string name="Swept Back">
-		En arrière
-	</string>
-	<string name="Swept Back Hair">
-		Cheveux en arrière
-	</string>
-	<string name="Swept Forward">
-		Vers l&apos;avant
-	</string>
-	<string name="Swept Forward Hair">
-		Cheveux vers l&apos;&apos;avant
-	</string>
-	<string name="Tall">
-		Grand
-	</string>
-	<string name="Taper Back">
-		Biseauter à l&apos;arrière
-	</string>
-	<string name="Taper Front">
-		Biseauter à l&apos;avant
-	</string>
-	<string name="Thick Heels">
-		Talons épais
-	</string>
-	<string name="Thick Neck">
-		Cou épais
-	</string>
-	<string name="Thick Toe">
-		Orteil épais
-	</string>
-	<string name="Thickness">
-		Épaisseur
-	</string>
-	<string name="Thin">
-		Fins
-	</string>
-	<string name="Thin Eyebrows">
-		Sourcils fins
-	</string>
-	<string name="Thin Lips">
-		Lèvres fines
-	</string>
-	<string name="Thin Nose">
-		Nez fin
-	</string>
-	<string name="Tight Chin">
-		Menton fin
-	</string>
-	<string name="Tight Cuffs">
-		Jambes serrées
-	</string>
-	<string name="Tight Pants">
-		Pantalons serrés
-	</string>
-	<string name="Tight Shirt">
-		Chemise serrée
-	</string>
-	<string name="Tight Skirt">
-		Jupe serrée
-	</string>
-	<string name="Tight Sleeves">
-		Manches serrées
-	</string>
-	<string name="Tilt Left">
-		Pencher sur la gauche
-	</string>
-	<string name="Tilt Right">
-		Pencher sur la droite
-	</string>
-	<string name="Toe Shape">
-		Forme de l&apos;orteil
-	</string>
-	<string name="Toe Thickness">
-		Épaisseur de l&apos;orteil
-	</string>
-	<string name="Torso Length">
-		Longueur du torse
-	</string>
-	<string name="Torso Muscles">
-		Muscles du torse
-	</string>
-	<string name="Torso Scrawny">
-		Torse maigre
-	</string>
-	<string name="Unattached">
-		Séparés
-	</string>
-	<string name="Uncreased">
-		Lisse
-	</string>
-	<string name="Underbite">
-		Rentré
-	</string>
-	<string name="Unnatural">
-		Artificiel
-	</string>
-	<string name="Upper Bridge">
-		Arête supérieure
-	</string>
-	<string name="Upper Cheeks">
-		Pommettes
-	</string>
-	<string name="Upper Chin Cleft">
-		Fente du menton supérieure
-	</string>
-	<string name="Upper Eyelid Fold">
-		Paupière supérieure
-	</string>
-	<string name="Upturned">
-		En trompette
-	</string>
-	<string name="Very Red">
-		Très rouge
-	</string>
-	<string name="Waist Height">
-		Hauteur de la taille
-	</string>
-	<string name="Well-Fed">
-		Bien nourri
-	</string>
-	<string name="White Hair">
-		Cheveux blancs
-	</string>
-	<string name="Wide">
-		Large
-	</string>
-	<string name="Wide Back">
-		Dos large
-	</string>
-	<string name="Wide Front">
-		Devant large
-	</string>
-	<string name="Wide Lips">
-		Lèvres larges
-	</string>
-	<string name="Wild">
-		Revêche
-	</string>
-	<string name="Wrinkles">
-		Rides
-	</string>
-	<string name="LocationCtrlAddLandmarkTooltip">
-		Ajouter à mes repères
-	</string>
-	<string name="LocationCtrlEditLandmarkTooltip">
-		Modifier mes repères
-	</string>
-	<string name="UpdaterWindowTitle">
-		[APP_NAME] Mettre à jour
-	</string>
-	<string name="UpdaterNowUpdating">
-		En train de charger [APP_NAME]...
-	</string>
-	<string name="UpdaterNowInstalling">
-		En train d&apos;installer [APP_NAME]...
-	</string>
-	<string name="UpdaterUpdatingDescriptive">
-		Le client [APP_NAME] est en train d&apos;être mis à jour.  Cela peut prendre un certain temps, merci de votre patience.
-	</string>
-	<string name="UpdaterProgressBarTextWithEllipses">
-		Mise à jour en cours...
-	</string>
-	<string name="UpdaterProgressBarText">
-		Mise à jour en cours
-	</string>
-	<string name="UpdaterFailDownloadTitle">
-		Le téléchargement de la mise à jour a échoué
-	</string>
-	<string name="UpdaterFailUpdateDescriptive">
-		Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez télécharger la dernière version sur www.secondlife.com.
-	</string>
-	<string name="UpdaterFailInstallTitle">
-		L&apos;installation de la mise à jour a échoué
-	</string>
-	<string name="UpdaterFailStartTitle">
-		Impossible de lancer le client
-	</string>
-	<string name="only_user_message">
-		Vous êtes le seul participant à cette session.
-	</string>
-	<string name="offline_message">
-		[FIRST] [LAST] est déconnecté(e).
-	</string>
-	<string name="invite_message">
-		Pour accepter ce chat vocal/vous connecter, cliquez sur le bouton [BUTTON NAME].
-	</string>
-	<string name="generic_request_error">
-		Erreur lors de la requête, veuillez réessayer ultérieurement.
-	</string>
-	<string name="insufficient_perms_error">
-		Vous n&apos;avez pas les droits requis.
-	</string>
-	<string name="session_does_not_exist_error">
-		La session a expiré
-	</string>
-	<string name="no_ability_error">
-		Vous n&apos;avez pas ce pouvoir.
-	</string>
-	<string name="no_ability">
-		Vous n&apos;avez pas ce pouvoir.
-	</string>
-	<string name="not_a_mod_error">
-		Vous n&apos;êtes pas modérateur de session.
-	</string>
-	<string name="muted_error">
-		Un modérateur de groupe a désactivé votre chat écrit.
-	</string>
-	<string name="add_session_event">
-		Impossible d&apos;ajouter des participants à la session de chat avec [RECIPIENT].
-	</string>
-	<string name="message_session_event">
-		Impossible d&apos;envoyer votre message à la session de chat avec [RECIPIENT].
-	</string>
-	<string name="removed_from_group">
-		Vous avez été supprimé du groupe.
-	</string>
-	<string name="close_on_no_ability">
-		Vous ne pouvez plus participer à la session de chat.
-	</string>
-</strings>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- This file contains strings that used to be hardcoded in the source.
+     It is only for those strings which do not belong in a floater.
+     For example, the strings used in avatar chat bubbles, and strings 
+     that are returned from one component and may appear in many places-->
+<strings>
+	<string name="SECOND_LIFE">
+		Second Life
+	</string>
+	<string name="APP_NAME">
+		Second Life
+	</string>
+	<string name="SECOND_LIFE_GRID">
+		Grille de Second Life
+	</string>
+	<string name="SUPPORT_SITE">
+		Portail Assistance Second Life
+	</string>
+	<string name="StartupDetectingHardware">
+		Détection du matériel...
+	</string>
+	<string name="StartupLoading">
+		Chargement
+	</string>
+	<string name="Fullbright">
+		Fullbright (Legacy)
+	</string>
+	<string name="LoginInProgress">
+		La connexion à [APP_NAME] apparaît peut-être comme étant gelée. Veuillez patienter.
+	</string>
+	<string name="LoginInProgressNoFrozen">
+		Connexion...
+	</string>
+	<string name="LoginAuthenticating">
+		Authentification en cours
+	</string>
+	<string name="LoginMaintenance">
+		Maintenance du compte en cours…
+	</string>
+	<string name="LoginAttempt">
+		La tentative de connexion précédente a échoué. Connexion, esssai [NUMBER]
+	</string>
+	<string name="LoginPrecaching">
+		Monde en cours de chargement…
+	</string>
+	<string name="LoginInitializingBrowser">
+		Navigateur Web incorporé en cours d&apos;initialisation…
+	</string>
+	<string name="LoginInitializingMultimedia">
+		Multimédia en cours d&apos;initialisation…
+	</string>
+	<string name="LoginVerifyingCache">
+		Fichiers du cache en cours de vérification (peut prendre 60-90 s)...
+	</string>
+	<string name="LoginProcessingResponse">
+		Réponse en cours de traitement…
+	</string>
+	<string name="LoginInitializingWorld">
+		Monde en cours d&apos;initialisation…
+	</string>
+	<string name="LoginDecodingImages">
+		Décodage des images en cours...
+	</string>
+	<string name="LoginInitializingQuicktime">
+		Quicktime en cours d&apos;initialisation
+	</string>
+	<string name="LoginQuicktimeNotFound">
+		Quicktime introuvable, impossible de procéder à l&apos;initialisation.
+	</string>
+	<string name="LoginQuicktimeOK">
+		Initialisation de Quicktime réussie.
+	</string>
+	<string name="LoginWaitingForRegionHandshake">
+		Liaison avec la région en cours de création...
+	</string>
+	<string name="LoginConnectingToRegion">
+		Connexion avec la région en cours...
+	</string>
+	<string name="LoginDownloadingClothing">
+		Habits en cours de téléchargement...
+	</string>
+	<string name="AgentLostConnection">
+		Il y a peut-être des problèmes techniques dans cette region. Veuillez vérifier votre connexion Internet.
+	</string>
+	<string name="TooltipPerson">
+		Personne
+	</string>
+	<string name="TooltipNoName">
+		(pas de nom)
+	</string>
+	<string name="TooltipOwner">
+		Propriétaire :
+	</string>
+	<string name="TooltipPublic">
+		Public
+	</string>
+	<string name="TooltipIsGroup">
+		(Groupe)
+	</string>
+	<string name="TooltipForSaleL$">
+		À vendre : [AMOUNT] L$
+	</string>
+	<string name="TooltipFlagGroupBuild">
+		Contruction de groupe
+	</string>
+	<string name="TooltipFlagNoBuild">
+		Pas de construction
+	</string>
+	<string name="TooltipFlagNoEdit">
+		Contruction de groupe
+	</string>
+	<string name="TooltipFlagNotSafe">
+		Non sécurisé
+	</string>
+	<string name="TooltipFlagNoFly">
+		Interdiction de voler
+	</string>
+	<string name="TooltipFlagGroupScripts">
+		Scripts de groupe
+	</string>
+	<string name="TooltipFlagNoScripts">
+		Pas de scripts
+	</string>
+	<string name="TooltipLand">
+		Terrain :
+	</string>
+	<string name="TooltipMustSingleDrop">
+		Impossible de faire glisser plus d&apos;un objet ici
+	</string>
+	<string name="TooltipHttpUrl">
+		Cliquez pour afficher cette page web
+	</string>
+	<string name="TooltipSLURL">
+		Cliquez pour en savoir plus sur cet endroit
+	</string>
+	<string name="TooltipAgentUrl">
+		Cliquez pour afficher le profil de ce résident
+	</string>
+	<string name="TooltipGroupUrl">
+		Cliquez pour afficher la description de ce groupe
+	</string>
+	<string name="TooltipEventUrl">
+		Cliquez pour afficher la description de cet événement
+	</string>
+	<string name="TooltipClassifiedUrl">
+		Cliquez pour afficher cette petite annonce
+	</string>
+	<string name="TooltipParcelUrl">
+		Cliquez pour afficher la description de cette parcelle
+	</string>
+	<string name="TooltipTeleportUrl">
+		Cliquez pour vous téléporter à cet endroit
+	</string>
+	<string name="TooltipObjectIMUrl">
+		Cliquez pour afficher la description de cet objet
+	</string>
+	<string name="TooltipSLAPP">
+		Cliquez pour exécuter la commande secondlife:// command
+	</string>
+	<string name="BUTTON_CLOSE_DARWIN">
+		Fermer (⌘-W)
+	</string>
+	<string name="BUTTON_CLOSE_WIN">
+		Fermer (Ctrl+W)
+	</string>
+	<string name="BUTTON_RESTORE">
+		Restaurer
+	</string>
+	<string name="BUTTON_MINIMIZE">
+		Minimiser
+	</string>
+	<string name="BUTTON_TEAR_OFF">
+		Réduire
+	</string>
+	<string name="BUTTON_DOCK">
+		Attacher
+	</string>
+	<string name="BUTTON_UNDOCK">
+		Détacher
+	</string>
+	<string name="BUTTON_HELP">
+		Afficher l&apos;aide
+	</string>
+	<string name="RetrievingData">
+		En cours d&apos;extraction...
+	</string>
+	<string name="ReleaseNotes">
+		Notes de version
+	</string>
+	<string name="LoadingData">
+		Chargement..
+	</string>
+	<string name="AvatarNameNobody">
+		(personne)
+	</string>
+	<string name="AvatarNameWaiting">
+		(en attente)
+	</string>
+	<string name="AvatarNameHippos">
+		(hippos)
+	</string>
+	<string name="GroupNameNone">
+		(aucun)
+	</string>
+	<string name="AssetErrorNone">
+		Aucune erreur
+	</string>
+	<string name="AssetErrorRequestFailed">
+		Requête de l&apos;actif : échec
+	</string>
+	<string name="AssetErrorNonexistentFile">
+		Requête de l&apos;actif : fichier inexistant
+	</string>
+	<string name="AssetErrorNotInDatabase">
+		Requête de l&apos;actif : actif introuvable dans la base de données
+	</string>
+	<string name="AssetErrorEOF">
+		Fin du ficher
+	</string>
+	<string name="AssetErrorCannotOpenFile">
+		Impossible d&apos;ouvrir le fichier
+	</string>
+	<string name="AssetErrorFileNotFound">
+		Fichier introuvable
+	</string>
+	<string name="AssetErrorTCPTimeout">
+		Délai d&apos;attente du transfert du fichier dépassé
+	</string>
+	<string name="AssetErrorCircuitGone">
+		Disparition du circuit
+	</string>
+	<string name="AssetErrorPriceMismatch">
+		Il y a une différence de prix entre le client et le serveur
+	</string>
+	<string name="AssetErrorUnknownStatus">
+		Statut inconnu
+	</string>
+	<string name="texture">
+		texture
+	</string>
+	<string name="sound">
+		son
+	</string>
+	<string name="calling card">
+		carte de visite
+	</string>
+	<string name="landmark">
+		repère
+	</string>
+	<string name="legacy script">
+		script (ancienne version)
+	</string>
+	<string name="clothing">
+		habits
+	</string>
+	<string name="object">
+		objet
+	</string>
+	<string name="note card">
+		note
+	</string>
+	<string name="folder">
+		dossier
+	</string>
+	<string name="root">
+		racine
+	</string>
+	<string name="lsl2 script">
+		script lsl2
+	</string>
+	<string name="lsl bytecode">
+		bytecode lsl
+	</string>
+	<string name="tga texture">
+		texture tga
+	</string>
+	<string name="body part">
+		partie du corps
+	</string>
+	<string name="snapshot">
+		photo
+	</string>
+	<string name="lost and found">
+		objets trouvés
+	</string>
+	<string name="targa image">
+		image targa
+	</string>
+	<string name="trash">
+		poubelle
+	</string>
+	<string name="jpeg image">
+		image jpeg
+	</string>
+	<string name="animation">
+		animation
+	</string>
+	<string name="gesture">
+		geste
+	</string>
+	<string name="simstate">
+		simstate
+	</string>
+	<string name="favorite">
+		favori
+	</string>
+	<string name="symbolic link">
+		lien
+	</string>
+	<string name="AvatarAway">
+		Absent
+	</string>
+	<string name="AvatarBusy">
+		Occupé
+	</string>
+	<string name="AvatarMuted">
+		Ignoré
+	</string>
+	<string name="anim_express_afraid">
+		Effrayé
+	</string>
+	<string name="anim_express_anger">
+		En colère
+	</string>
+	<string name="anim_away">
+		Absent
+	</string>
+	<string name="anim_backflip">
+		Salto arrière
+	</string>
+	<string name="anim_express_laugh">
+		Rire en se tenant le ventre
+	</string>
+	<string name="anim_express_toothsmile">
+		Grand sourire
+	</string>
+	<string name="anim_blowkiss">
+		Envoyer un baiser
+	</string>
+	<string name="anim_express_bored">
+		Bailler d&apos;ennui
+	</string>
+	<string name="anim_bow">
+		S&apos;incliner
+	</string>
+	<string name="anim_clap">
+		Applaudir
+	</string>
+	<string name="anim_courtbow">
+		Révérence de cour
+	</string>
+	<string name="anim_express_cry">
+		Pleurer
+	</string>
+	<string name="anim_dance1">
+		Danse 1
+	</string>
+	<string name="anim_dance2">
+		Danse 2
+	</string>
+	<string name="anim_dance3">
+		Danse 3
+	</string>
+	<string name="anim_dance4">
+		Danse 4
+	</string>
+	<string name="anim_dance5">
+		Danse 5
+	</string>
+	<string name="anim_dance6">
+		Danse 6
+	</string>
+	<string name="anim_dance7">
+		Danse 7
+	</string>
+	<string name="anim_dance8">
+		Danse 8
+	</string>
+	<string name="anim_express_disdain">
+		Mépris
+	</string>
+	<string name="anim_drink">
+		Boire
+	</string>
+	<string name="anim_express_embarrased">
+		Gêne
+	</string>
+	<string name="anim_angry_fingerwag">
+		Désapprobation
+	</string>
+	<string name="anim_fist_pump">
+		Victoire
+	</string>
+	<string name="anim_yoga_float">
+		Yoga
+	</string>
+	<string name="anim_express_frown">
+		Froncer les sourcils
+	</string>
+	<string name="anim_impatient">
+		Impatient
+	</string>
+	<string name="anim_jumpforjoy">
+		Sauter de joie
+	</string>
+	<string name="anim_kissmybutt">
+		Va te faire voir !
+	</string>
+	<string name="anim_express_kiss">
+		Baiser
+	</string>
+	<string name="anim_laugh_short">
+		Rire
+	</string>
+	<string name="anim_musclebeach">
+		Montrer ses muscles
+	</string>
+	<string name="anim_no_unhappy">
+		Non (mécontent)
+	</string>
+	<string name="anim_no_head">
+		Non
+	</string>
+	<string name="anim_nyanya">
+		Na na na na nère
+	</string>
+	<string name="anim_punch_onetwo">
+		Gauche-droite
+	</string>
+	<string name="anim_express_open_mouth">
+		Bouche ouverte
+	</string>
+	<string name="anim_peace">
+		Paix
+	</string>
+	<string name="anim_point_you">
+		Montrer quelqu&apos;un du doigt
+	</string>
+	<string name="anim_point_me">
+		Se montrer du doigt
+	</string>
+	<string name="anim_punch_l">
+		Gauche
+	</string>
+	<string name="anim_punch_r">
+		Droite
+	</string>
+	<string name="anim_rps_countdown">
+		Compter (pierre-papier-ciseaux)
+	</string>
+	<string name="anim_rps_paper">
+		Papier (pierre-papier-ciseaux)
+	</string>
+	<string name="anim_rps_rock">
+		Pierre (pierre-papier-ciseaux)
+	</string>
+	<string name="anim_rps_scissors">
+		Ciseaux (pierre-papier-ciseaux)
+	</string>
+	<string name="anim_express_repulsed">
+		Dégoût
+	</string>
+	<string name="anim_kick_roundhouse_r">
+		Coup de pied circulaire
+	</string>
+	<string name="anim_express_sad">
+		Triste
+	</string>
+	<string name="anim_salute">
+		Salut
+	</string>
+	<string name="anim_shout">
+		Crier
+	</string>
+	<string name="anim_express_shrug">
+		Hausser les épaules
+	</string>
+	<string name="anim_express_smile">
+		Sourire
+	</string>
+	<string name="anim_smoke_idle">
+		Fumer, immobile
+	</string>
+	<string name="anim_smoke_inhale">
+		Fumer, prendre une bouffée
+	</string>
+	<string name="anim_smoke_throw_down">
+		Fumer, jeter son mégot
+	</string>
+	<string name="anim_express_surprise">
+		Surprise
+	</string>
+	<string name="anim_sword_strike_r">
+		Coup d&apos;épée
+	</string>
+	<string name="anim_angry_tantrum">
+		Caprice
+	</string>
+	<string name="anim_express_tongue_out">
+		Tirer la langue
+	</string>
+	<string name="anim_hello">
+		Faire signe
+	</string>
+	<string name="anim_whisper">
+		Chuchoter
+	</string>
+	<string name="anim_whistle">
+		Siffler
+	</string>
+	<string name="anim_express_wink">
+		Clin d&apos;œil
+	</string>
+	<string name="anim_wink_hollywood">
+		Clin d&apos;œil (Hollywood)
+	</string>
+	<string name="anim_express_worry">
+		Soucis
+	</string>
+	<string name="anim_yes_happy">
+		Oui (Joie)
+	</string>
+	<string name="anim_yes_head">
+		Oui
+	</string>
+	<string name="texture_loading">
+		Chargement...
+	</string>
+	<string name="worldmap_offline">
+		Hors ligne
+	</string>
+	<string name="Ok">
+		OK
+	</string>
+	<string name="Premature end of file">
+		Fichier incomplet
+	</string>
+	<string name="ST_NO_JOINT">
+		Impossible de trouver ROOT ou JOINT.
+	</string>
+	<string name="whisper">
+		chuchote :
+	</string>
+	<string name="shout">
+		crie :
+	</string>
+	<string name="ringing">
+		Connexion au chat vocal du Monde en cours…
+	</string>
+	<string name="connected">
+		Connecté(e)
+	</string>
+	<string name="unavailable">
+		Voix non disponible à l&apos;endroit où vous êtes
+	</string>
+	<string name="hang_up">
+		Déconnecté du chat vocal
+	</string>
+	<string name="ScriptQuestionCautionChatGranted">
+		&apos;[OBJECTNAME]&apos;, un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], a reçu le droit de : [PERMISSIONS].
+	</string>
+	<string name="ScriptQuestionCautionChatDenied">
+		&apos;[OBJECTNAME]&apos;, un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], n&apos;a pas reçu le droit de : [PERMISSIONS].
+	</string>
+	<string name="ScriptTakeMoney">
+		Débiter vos Linden dollars (L$)
+	</string>
+	<string name="ActOnControlInputs">
+		Utiliser vos touches de commandes
+	</string>
+	<string name="RemapControlInputs">
+		Reconfigurer vos touches de commandes
+	</string>
+	<string name="AnimateYourAvatar">
+		Animer votre avatar
+	</string>
+	<string name="AttachToYourAvatar">
+		Attacher à votre avatar
+	</string>
+	<string name="ReleaseOwnership">
+		Passer l&apos;objet dans le domaine public (sans propriétaire)
+	</string>
+	<string name="LinkAndDelink">
+		Lier et délier d&apos;autres objets
+	</string>
+	<string name="AddAndRemoveJoints">
+		Créer et supprimer des liens avec d&apos;autres objets
+	</string>
+	<string name="ChangePermissions">
+		Modifier ses droits
+	</string>
+	<string name="TrackYourCamera">
+		Suivre votre caméra
+	</string>
+	<string name="ControlYourCamera">
+		Contrôler votre caméra
+	</string>
+	<string name="SIM_ACCESS_PG">
+		PG
+	</string>
+	<string name="SIM_ACCESS_MATURE">
+		Mature
+	</string>
+	<string name="SIM_ACCESS_ADULT">
+		Adult
+	</string>
+	<string name="SIM_ACCESS_DOWN">
+		Hors ligne
+	</string>
+	<string name="SIM_ACCESS_MIN">
+		Inconnu
+	</string>
+	<string name="land_type_unknown">
+		(inconnu)
+	</string>
+	<string name="all_files">
+		Tous fichiers
+	</string>
+	<string name="sound_files">
+		Sons
+	</string>
+	<string name="animation_files">
+		Animations
+	</string>
+	<string name="image_files">
+		Images
+	</string>
+	<string name="save_file_verb">
+		Enregistrer
+	</string>
+	<string name="load_file_verb">
+		Charger
+	</string>
+	<string name="targa_image_files">
+		Images Targa
+	</string>
+	<string name="bitmap_image_files">
+		Images Bitmap
+	</string>
+	<string name="avi_movie_file">
+		Fichier de film AVI
+	</string>
+	<string name="xaf_animation_file">
+		Fichier d&apos;animation XAF
+	</string>
+	<string name="xml_file">
+		Fichier XML
+	</string>
+	<string name="dot_raw_file">
+		Fichier RAW
+	</string>
+	<string name="compressed_image_files">
+		Images compressées
+	</string>
+	<string name="load_files">
+		Charger des fichiers
+	</string>
+	<string name="choose_the_directory">
+		Choisir le répertoire
+	</string>
+	<string name="AvatarSetNotAway">
+		Ne plus me mettre en mode absent
+	</string>
+	<string name="AvatarSetAway">
+		Me mettre en mode absent
+	</string>
+	<string name="AvatarSetNotBusy">
+		Ne plus me mettre en mode occupé
+	</string>
+	<string name="AvatarSetBusy">
+		Me mettre en mode occupé
+	</string>
+	<string name="shape">
+		Silhouette
+	</string>
+	<string name="skin">
+		Peau
+	</string>
+	<string name="hair">
+		Cheveux
+	</string>
+	<string name="eyes">
+		Yeux
+	</string>
+	<string name="shirt">
+		Chemise
+	</string>
+	<string name="pants">
+		Pantalon
+	</string>
+	<string name="shoes">
+		Chaussures
+	</string>
+	<string name="socks">
+		Chaussettes
+	</string>
+	<string name="jacket">
+		Veste
+	</string>
+	<string name="gloves">
+		Gants
+	</string>
+	<string name="undershirt">
+		Sous-vêtements (homme)
+	</string>
+	<string name="underpants">
+		Sous-vêtements (femme)
+	</string>
+	<string name="skirt">
+		Jupe
+	</string>
+	<string name="invalid">
+		non valide
+	</string>
+	<string name="BodyPartsRightArm">
+		Bras droit
+	</string>
+	<string name="BodyPartsHead">
+		Tête
+	</string>
+	<string name="BodyPartsLeftArm">
+		Bras gauche
+	</string>
+	<string name="BodyPartsLeftLeg">
+		Jambe gauche
+	</string>
+	<string name="BodyPartsTorso">
+		Torse
+	</string>
+	<string name="BodyPartsRightLeg">
+		Jambe droite
+	</string>
+	<string name="GraphicsQualityLow">
+		Faible
+	</string>
+	<string name="GraphicsQualityMid">
+		Moyen
+	</string>
+	<string name="GraphicsQualityHigh">
+		Élevé
+	</string>
+	<string name="LeaveMouselook">
+		Appuyez sur ESC pour quitter la vue subjective
+	</string>
+	<string name="InventoryNoMatchingItems">
+		Aucun objet correspondant ne se trouve dans l&apos;inventaire.
+	</string>
+	<string name="InventoryNoTexture">
+		Vous n&apos;avez pas de copie de cette texture dans votre inventaire
+	</string>
+	<string name="LoadingContents">
+		chargement des contenus en cours...
+	</string>
+	<string name="NoContents">
+		Aucun contenu
+	</string>
+	<string name="InvFolder My Inventory">
+		Mon inventaire
+	</string>
+	<string name="InvFolder My Favorites">
+		Mes favoris
+	</string>
+	<string name="InvFolder Library">
+		Bibliothèque
+	</string>
+	<string name="InvFolder Textures">
+		Textures
+	</string>
+	<string name="InvFolder Sounds">
+		Sons
+	</string>
+	<string name="InvFolder Calling Cards">
+		Cartes de visite
+	</string>
+	<string name="InvFolder Landmarks">
+		Repères
+	</string>
+	<string name="InvFolder Scripts">
+		Scripts
+	</string>
+	<string name="InvFolder Clothing">
+		Habits
+	</string>
+	<string name="InvFolder Objects">
+		Objets
+	</string>
+	<string name="InvFolder Notecards">
+		Notes
+	</string>
+	<string name="InvFolder New Folder">
+		Nouveau dossier
+	</string>
+	<string name="InvFolder Inventory">
+		Inventaire
+	</string>
+	<string name="InvFolder Uncompressed Images">
+		Images non compressées
+	</string>
+	<string name="InvFolder Body Parts">
+		Parties du corps
+	</string>
+	<string name="InvFolder Trash">
+		Poubelle
+	</string>
+	<string name="InvFolder Photo Album">
+		Albums photo
+	</string>
+	<string name="InvFolder Lost And Found">
+		Objets trouvés
+	</string>
+	<string name="InvFolder Uncompressed Sounds">
+		Sons non compressés
+	</string>
+	<string name="InvFolder Animations">
+		Animations
+	</string>
+	<string name="InvFolder Gestures">
+		Gestes
+	</string>
+	<string name="InvFolder favorite">
+		Favoris
+	</string>
+	<string name="InvFolder Current Outfit">
+		Tenue actuelle
+	</string>
+	<string name="InvFolder My Outfits">
+		Mes tenues
+	</string>
+	<string name="InvFolder Friends">
+		Amis
+	</string>
+	<string name="InvFolder All">
+		Tout
+	</string>
+	<string name="Buy">
+		Acheter
+	</string>
+	<string name="BuyforL$">
+		Acheter des L$
+	</string>
+	<string name="Stone">
+		Pierre
+	</string>
+	<string name="Metal">
+		Métal
+	</string>
+	<string name="Glass">
+		Verre
+	</string>
+	<string name="Wood">
+		Bois
+	</string>
+	<string name="Flesh">
+		Chair
+	</string>
+	<string name="Plastic">
+		Plastique
+	</string>
+	<string name="Rubber">
+		Caoutchouc
+	</string>
+	<string name="Light">
+		Léger
+	</string>
+	<string name="KBShift">
+		Maj-
+	</string>
+	<string name="KBCtrl">
+		Ctrl
+	</string>
+	<string name="Chest">
+		Poitrine
+	</string>
+	<string name="Skull">
+		Crâne
+	</string>
+	<string name="Left Shoulder">
+		Épaule gauche
+	</string>
+	<string name="Right Shoulder">
+		Épaule droite
+	</string>
+	<string name="Left Hand">
+		Main gauche
+	</string>
+	<string name="Right Hand">
+		Main droite
+	</string>
+	<string name="Left Foot">
+		Pied gauche
+	</string>
+	<string name="Right Foot">
+		Pied droit
+	</string>
+	<string name="Spine">
+		Colonne
+	</string>
+	<string name="Pelvis">
+		Bassin
+	</string>
+	<string name="Mouth">
+		Bouche
+	</string>
+	<string name="Chin">
+		Menton
+	</string>
+	<string name="Left Ear">
+		Oreille gauche
+	</string>
+	<string name="Right Ear">
+		Oreille droite
+	</string>
+	<string name="Left Eyeball">
+		Globe oculaire gauche
+	</string>
+	<string name="Right Eyeball">
+		Globe oculaire droit
+	</string>
+	<string name="Nose">
+		Nez
+	</string>
+	<string name="R Upper Arm">
+		Bras D
+	</string>
+	<string name="R Forearm">
+		Avant-bras D
+	</string>
+	<string name="L Upper Arm">
+		Bras G
+	</string>
+	<string name="L Forearm">
+		Avant-bras G
+	</string>
+	<string name="Right Hip">
+		Hanche droite
+	</string>
+	<string name="R Upper Leg">
+		Cuisse D
+	</string>
+	<string name="R Lower Leg">
+		Jambe D
+	</string>
+	<string name="Left Hip">
+		Hanche gauche
+	</string>
+	<string name="L Upper Leg">
+		Cuisse G
+	</string>
+	<string name="L Lower Leg">
+		Jambe G
+	</string>
+	<string name="Stomach">
+		Estomac
+	</string>
+	<string name="Left Pec">
+		Pectoral gauche
+	</string>
+	<string name="Right Pec">
+		Pectoral droit
+	</string>
+	<string name="YearsMonthsOld">
+		[AGEYEARS] [AGEMONTHS]
+	</string>
+	<string name="YearsOld">
+		[AGEYEARS]
+	</string>
+	<string name="MonthsOld">
+		[AGEMONTHS]
+	</string>
+	<string name="WeeksOld">
+		[AGEWEEKS]
+	</string>
+	<string name="DaysOld">
+		[AGEDAYS]
+	</string>
+	<string name="TodayOld">
+		Inscrit aujourd&apos;hui
+	</string>
+	<string name="AgeYearsA">
+		[COUNT] an
+	</string>
+	<string name="AgeYearsB">
+		[COUNT] ans
+	</string>
+	<string name="AgeYearsC">
+		[COUNT] ans
+	</string>
+	<string name="AgeMonthsA">
+		[COUNT] mois
+	</string>
+	<string name="AgeMonthsB">
+		[COUNT] mois
+	</string>
+	<string name="AgeMonthsC">
+		[COUNT] mois
+	</string>
+	<string name="AgeWeeksA">
+		[COUNT] semaine
+	</string>
+	<string name="AgeWeeksB">
+		[COUNT] semaines
+	</string>
+	<string name="AgeWeeksC">
+		[COUNT] semaines
+	</string>
+	<string name="AgeDaysA">
+		[COUNT] jour
+	</string>
+	<string name="AgeDaysB">
+		[COUNT] jours
+	</string>
+	<string name="AgeDaysC">
+		[COUNT] jours
+	</string>
+	<string name="AcctTypeResident">
+		Résident
+	</string>
+	<string name="AcctTypeTrial">
+		Essai
+	</string>
+	<string name="AcctTypeCharterMember">
+		Membre originaire
+	</string>
+	<string name="AcctTypeEmployee">
+		Employé(e) de Linden Lab
+	</string>
+	<string name="PaymentInfoUsed">
+		Infos de paiement utilisées
+	</string>
+	<string name="PaymentInfoOnFile">
+		Infos de paiement enregistrées
+	</string>
+	<string name="NoPaymentInfoOnFile">
+		Aucune info de paiement
+	</string>
+	<string name="AgeVerified">
+		Âge vérifié
+	</string>
+	<string name="NotAgeVerified">
+		Âge non vérifié
+	</string>
+	<string name="Center 2">
+		Centrer 2
+	</string>
+	<string name="Top Right">
+		En haut à droite
+	</string>
+	<string name="Top">
+		En haut
+	</string>
+	<string name="Top Left">
+		En haut à gauche
+	</string>
+	<string name="Center">
+		Centrer
+	</string>
+	<string name="Bottom Left">
+		En bas à gauche
+	</string>
+	<string name="Bottom">
+		Bas
+	</string>
+	<string name="Bottom Right">
+		En bas à droite
+	</string>
+	<string name="CompileQueueDownloadedCompiling">
+		Téléchargé, compilation en cours
+	</string>
+	<string name="CompileQueueScriptNotFound">
+		Script introuvable sur le serveur.
+	</string>
+	<string name="CompileQueueProblemDownloading">
+		Problème lors du téléchargement
+	</string>
+	<string name="CompileQueueInsufficientPermDownload">
+		Permissions insuffisantes pour télécharger un script.
+	</string>
+	<string name="CompileQueueInsufficientPermFor">
+		Permissions insuffisantes pour
+	</string>
+	<string name="CompileQueueUnknownFailure">
+		Échec du téléchargement, erreur inconnue
+	</string>
+	<string name="CompileQueueTitle">
+		Recompilation - progrès
+	</string>
+	<string name="CompileQueueStart">
+		recompiler
+	</string>
+	<string name="ResetQueueTitle">
+		Réinitialiser les progrès
+	</string>
+	<string name="ResetQueueStart">
+		réinitialiser
+	</string>
+	<string name="RunQueueTitle">
+		Lancer
+	</string>
+	<string name="RunQueueStart">
+		lancer
+	</string>
+	<string name="NotRunQueueTitle">
+		Arrêter
+	</string>
+	<string name="NotRunQueueStart">
+		arrêter
+	</string>
+	<string name="CompileSuccessful">
+		Compilation réussie !
+	</string>
+	<string name="CompileSuccessfulSaving">
+		Compilation réussie, enregistrement en cours...
+	</string>
+	<string name="SaveComplete">
+		Enregistrement terminé.
+	</string>
+	<string name="ObjectOutOfRange">
+		Script (objet hors de portée)
+	</string>
+	<string name="GodToolsObjectOwnedBy">
+		Objet [OBJECT] possédé par [OWNER]
+	</string>
+	<string name="GroupsNone">
+		aucun
+	</string>
+	<string name="Unknown">
+		(Inconnu)
+	</string>
+	<string name="Balance">
+		Solde
+	</string>
+	<string name="Credits">
+		Remerciements
+	</string>
+	<string name="Debits">
+		Débits
+	</string>
+	<string name="Total">
+		Total
+	</string>
+	<string name="NoGroupDataFound">
+		Aucune donnée trouvée pour le groupe
+	</string>
+	<string name="IMParentEstate">
+		domaine parent
+	</string>
+	<string name="IMMainland">
+		continent
+	</string>
+	<string name="IMTeen">
+		teen
+	</string>
+	<string name="RegionInfoError">
+		erreur
+	</string>
+	<string name="RegionInfoAllEstatesOwnedBy">
+		tous les domaines possédés par [OWNER]
+	</string>
+	<string name="RegionInfoAllEstatesYouOwn">
+		tous les domaines que vous possédez
+	</string>
+	<string name="RegionInfoAllEstatesYouManage">
+		tous les domaines que vous gérez pour [owner]
+	</string>
+	<string name="RegionInfoAllowedResidents">
+		Résidents autorisés : ([ALLOWEDAGENTS], max [MAXACCESS])
+	</string>
+	<string name="RegionInfoAllowedGroups">
+		Groupes autorisés : ([ALLOWEDGROUPS], max [MAXACCESS])
+	</string>
+	<string name="CursorPos">
+		Ligne [LINE], Colonne [COLUMN]
+	</string>
+	<string name="PanelDirCountFound">
+		[COUNT] trouvé(s)
+	</string>
+	<string name="PanelContentsNewScript">
+		Nouveau script
+	</string>
+	<string name="MuteByName">
+		(par nom)
+	</string>
+	<string name="MuteAgent">
+		(résident)
+	</string>
+	<string name="MuteObject">
+		(objet)
+	</string>
+	<string name="MuteGroup">
+		(groupe)
+	</string>
+	<string name="RegionNoCovenant">
+		Il n&apos;y a aucun règlement pour ce domaine.
+	</string>
+	<string name="RegionNoCovenantOtherOwner">
+		Il n&apos;y a aucun règlement pour ce domaine. Le terrain sur ce domaine est vendu par le propriétaire, non par Linden Lab.  Pour en savoir plus, veuillez contacter le propriétaire.
+	</string>
+	<string name="covenant_last_modified">
+		Dernière modification :
+	</string>
+	<string name="GroupOwned">
+		Propriété du groupe
+	</string>
+	<string name="Public">
+		Public
+	</string>
+	<string name="ClassifiedClicksTxt">
+		Clics : [TELEPORT] téléporter, [MAP] carte, [PROFILE] profile
+	</string>
+	<string name="ClassifiedUpdateAfterPublish">
+		(mise à jour après la publication)
+	</string>
+	<string name="GroupVoteYes">
+		Oui
+	</string>
+	<string name="GroupVoteNo">
+		Non
+	</string>
+	<string name="GroupVoteNoActiveProposals">
+		Il n&apos;y a aucune proposition active actuellement
+	</string>
+	<string name="GroupVoteNoArchivedProposals">
+		Il n&apos;y a aucune proposition archivée actuellement
+	</string>
+	<string name="GroupVoteRetrievingArchivedProposals">
+		Extraction des propositions archivées
+	</string>
+	<string name="GroupVoteRetrievingActiveProposals">
+		Extraction des propositions actives
+	</string>
+	<string name="MultiPreviewTitle">
+		Prévisualiser
+	</string>
+	<string name="MultiPropertiesTitle">
+		Propriétés
+	</string>
+	<string name="InvOfferAnObjectNamed">
+		Un objet appelé
+	</string>
+	<string name="InvOfferOwnedByGroup">
+		possédé par le groupe
+	</string>
+	<string name="InvOfferOwnedByUnknownGroup">
+		possédé par un groupe inconnu
+	</string>
+	<string name="InvOfferOwnedBy">
+		possédé par
+	</string>
+	<string name="InvOfferOwnedByUnknownUser">
+		possédé par un résident inconnu
+	</string>
+	<string name="InvOfferGaveYou">
+		vous a donné
+	</string>
+	<string name="InvOfferYouDecline">
+		Vous avez refusé
+	</string>
+	<string name="InvOfferFrom">
+		de la part de
+	</string>
+	<string name="GroupMoneyTotal">
+		Total
+	</string>
+	<string name="GroupMoneyBought">
+		acheté
+	</string>
+	<string name="GroupMoneyPaidYou">
+		vous a payé
+	</string>
+	<string name="GroupMoneyPaidInto">
+		payé
+	</string>
+	<string name="GroupMoneyBoughtPassTo">
+		a acheté un pass à
+	</string>
+	<string name="GroupMoneyPaidFeeForEvent">
+		a payé des frais pour un événement
+	</string>
+	<string name="GroupMoneyPaidPrizeForEvent">
+		a payé un prix pour un événement
+	</string>
+	<string name="GroupMoneyBalance">
+		Solde
+	</string>
+	<string name="GroupMoneyCredits">
+		Remerciements
+	</string>
+	<string name="GroupMoneyDebits">
+		Débits
+	</string>
+	<string name="ViewerObjectContents">
+		Contenus
+	</string>
+	<string name="AcquiredItems">
+		Objets acquis
+	</string>
+	<string name="Cancel">
+		Annuler
+	</string>
+	<string name="UploadingCosts">
+		Chargement de %s coûts
+	</string>
+	<string name="UnknownFileExtension">
+		Extension de fichier inconnue. %s
+.wav, .tga, .bmp, .jpg, .jpeg, ou .bvh acceptés
+	</string>
+	<string name="AddLandmarkNavBarMenu">
+		Ajouter un repère...
+	</string>
+	<string name="EditLandmarkNavBarMenu">
+		Modifier le repère...
+	</string>
+	<string name="accel-mac-control">
+		⌃
+	</string>
+	<string name="accel-mac-command">
+		⌘
+	</string>
+	<string name="accel-mac-option">
+		⌥
+	</string>
+	<string name="accel-mac-shift">
+		⇧
+	</string>
+	<string name="accel-win-control">
+		Ctrl+
+	</string>
+	<string name="accel-win-alt">
+		Alt+
+	</string>
+	<string name="accel-win-shift">
+		Maj+
+	</string>
+	<string name="FileSaved">
+		Fichier enregistré
+	</string>
+	<string name="Receiving">
+		Réception
+	</string>
+	<string name="AM">
+		AM
+	</string>
+	<string name="PM">
+		PM
+	</string>
+	<string name="PST">
+		PST
+	</string>
+	<string name="PDT">
+		PDT
+	</string>
+	<string name="Forward">
+		Vers l&apos;avant
+	</string>
+	<string name="Left">
+		Gauche
+	</string>
+	<string name="Right">
+		Droite
+	</string>
+	<string name="Back">
+		Précédente
+	</string>
+	<string name="North">
+		Nord
+	</string>
+	<string name="South">
+		Sud
+	</string>
+	<string name="West">
+		Ouest
+	</string>
+	<string name="East">
+		Est
+	</string>
+	<string name="Up">
+		Vers le haut
+	</string>
+	<string name="Down">
+		Vers le bas
+	</string>
+	<string name="Any Category">
+		Toutes catégories
+	</string>
+	<string name="Shopping">
+		Shopping
+	</string>
+	<string name="Land Rental">
+		Terrains à louer
+	</string>
+	<string name="Property Rental">
+		Propriétés à louer
+	</string>
+	<string name="Special Attraction">
+		Divertissements
+	</string>
+	<string name="New Products">
+		Nouveaux produits
+	</string>
+	<string name="Employment">
+		Emplois
+	</string>
+	<string name="Wanted">
+		Offres
+	</string>
+	<string name="Service">
+		Services
+	</string>
+	<string name="Personal">
+		Divers
+	</string>
+	<string name="None">
+		Aucun
+	</string>
+	<string name="Linden Location">
+		Appartenant aux Lindens
+	</string>
+	<string name="Adult">
+		Adult
+	</string>
+	<string name="Arts&amp;Culture">
+		Art et Culture
+	</string>
+	<string name="Business">
+		Affaires
+	</string>
+	<string name="Educational">
+		Éducation
+	</string>
+	<string name="Gaming">
+		Jeux
+	</string>
+	<string name="Hangout">
+		Favoris
+	</string>
+	<string name="Newcomer Friendly">
+		Accueil pour les nouveaux
+	</string>
+	<string name="Parks&amp;Nature">
+		Parcs et Nature
+	</string>
+	<string name="Residential">
+		Résidentiel
+	</string>
+	<string name="Stage">
+		Phase
+	</string>
+	<string name="Other">
+		Autre
+	</string>
+	<string name="Any">
+		Aucun
+	</string>
+	<string name="You">
+		Vous
+	</string>
+	<string name=":">
+		:
+	</string>
+	<string name=",">
+		,
+	</string>
+	<string name="...">
+		...
+	</string>
+	<string name="***">
+		***
+	</string>
+	<string name="(">
+		(
+	</string>
+	<string name=")">
+		)
+	</string>
+	<string name=".">
+		.
+	</string>
+	<string name="&apos;">
+		&apos;
+	</string>
+	<string name="---">
+		---
+	</string>
+	<string name="MBCmdLineError">
+		Une erreur est survenue lors de la lecture de la ligne de commande.
+Merci de consulter : http://wiki.secondlife.com/wiki/Client_parameters
+Erreur :
+	</string>
+	<string name="MBCmdLineUsg">
+		[APP_NAME] Utilisation de la ligne de commande :
+	</string>
+	<string name="MBUnableToAccessFile">
+		[APP_NAME] ne peut accéder à un fichier requis.
+
+Cela vient du fait que quelqu&apos;un a ouvert plusieurs copies ou que votre système pense qu&apos;un fichier est ouvert.
+Si ce message persiste, veuillez redémarrer votre ordinateur.
+Si le problème persiste, vous devrez peut-être complètement désinstaller puis réinstaller [APP_NAME].
+	</string>
+	<string name="MBFatalError">
+		Erreur fatale
+	</string>
+	<string name="MBRequiresAltiVec">
+		[APP_NAME] nécessite un microprocesseur AltiVec (version G4 ou antérieure).
+	</string>
+	<string name="MBAlreadyRunning">
+		[APP_NAME] est déjà lancé.
+Vérifiez si une version minimisée du programme apparaît dans votre barre de tâches.
+Si ce message persiste, redémarrez votre ordinateur.
+	</string>
+	<string name="MBFrozenCrashed">
+		[APP_NAME] semble avoir crashé lors de l&apos;utilisation précédente.
+Voulez-vous envoyer un rapport de crash ?
+	</string>
+	<string name="MBAlert">
+		Alerte
+	</string>
+	<string name="MBNoDirectX">
+		[APP_NAME] ne peut détecter DirectX 9.0b ou une version supérieure.
+[APP_NAME] utilise DirectX pour détecter les matériels et/ou les pilotes qui ne sont pas à jour et peuvent causer des problèmes de stabilité, de performance, ou des plantages.  Bien que vous puissiez utiliser [APP_NAME] sans DirectX, nous vous recommandons de l&apos;utiliser avec DirectX 9.0b.
+
+Voulez-vous continuer ?
+	</string>
+	<string name="MBWarning">
+		Avertissement
+	</string>
+	<string name="MBNoAutoUpdate">
+		Les mises à jour automatiques n&apos;existent pas encore pour Linux.
+Veuillez télécharger la dernière version sur www.secondlife.com.
+	</string>
+	<string name="MBRegClassFailed">
+		RegisterClass a échoué
+	</string>
+	<string name="MBError">
+		Erreur
+	</string>
+	<string name="MBFullScreenErr">
+		Impossible d&apos;ouvrir le mode plein écran de [WIDTH] x [HEIGHT]
+Utilisation du mode fenêtré.
+	</string>
+	<string name="MBDestroyWinFailed">
+		Erreur de fermeture lors de la destruction de la fenêtre (DestroyWindow() failed))
+	</string>
+	<string name="MBShutdownErr">
+		Erreur de fermeture
+	</string>
+	<string name="MBDevContextErr">
+		Impossible de créer le contexte GL
+	</string>
+	<string name="MBPixelFmtErr">
+		Impossible de trouver le format pixel approprié
+	</string>
+	<string name="MBPixelFmtDescErr">
+		Impossible de trouver la description du format pixel
+	</string>
+	<string name="MBTrueColorWindow">
+		[APP_NAME] nécessite que True Color (32-bit) soit exécuté dans une fenêtre.
+Veuillez allez sous Panneau de configuration &gt; Affichage &gt; Paramètres et régler la couleur de l&apos;écran sur 32-bit.
+Sinon, lorsque vous choisissez le mode plein écran,  [APP_NAME] ajustera automatiquement l&apos;écran à chaque utilisation.
+	</string>
+	<string name="MBAlpha">
+		[APP_NAME] ne peut pas être lancé car il n&apos;y pas de channel 8 bit accessible.  En général, ceci vient de problèmes avec le pilote de la carte vidéo.
+Assurez-vous d&apos;avoir installé le pilote de carte vidéo le plus récent possible.
+ Assurez-vous aussi que votre écran est réglé sur True Clor (22-bit) sous Panneau de configuration &gt; Affichage &gt; Paramètres.
+Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
+	</string>
+	<string name="MBPixelFmtSetErr">
+		Impossible de trouver le format pixel approprié
+	</string>
+	<string name="MBGLContextErr">
+		Impossible de créer le contexte de rendu GL
+	</string>
+	<string name="MBGLContextActErr">
+		Impossible d&apos;activer le contexte de rendu GL
+	</string>
+	<string name="MBVideoDrvErr">
+		[APP_NAME] ne peut pas être exécuté car les pilotes de votre carte vidéo n&apos;ont pas été installés correctement, ne sont pas à jour, ou sont pour du matériel non pris en charge. Assurez-vous d&apos;avoir des pilotes de cartes vidéos récents, et même si vous avez les plus récents, réinstallez-les.
+
+Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
+	</string>
+	<string name="5 O&apos;Clock Shadow">
+		Barbe naissante
+	</string>
+	<string name="All White">
+		Tout blancs
+	</string>
+	<string name="Anime Eyes">
+		Grand yeux
+	</string>
+	<string name="Arced">
+		Arquées
+	</string>
+	<string name="Arm Length">
+		Longueur des bras
+	</string>
+	<string name="Attached">
+		Minces
+	</string>
+	<string name="Attached Earlobes">
+		Largeur des lobes
+	</string>
+	<string name="Back Bangs">
+		Mèches de derrière
+	</string>
+	<string name="Back Bangs Down">
+		Mèches de derrière Bas
+	</string>
+	<string name="Back Bangs Up">
+		Mèches de derrière haut
+	</string>
+	<string name="Back Fringe">
+		Mèches de derrière
+	</string>
+	<string name="Back Hair">
+		Cheveux de derrière
+	</string>
+	<string name="Back Hair Down">
+		Cheveux de derrière Bas
+	</string>
+	<string name="Back Hair Up">
+		Cheveux de derrière haut
+	</string>
+	<string name="Baggy">
+		Cernés
+	</string>
+	<string name="Bangs">
+		Frange
+	</string>
+	<string name="Bangs Down">
+		Frange Bas
+	</string>
+	<string name="Bangs Up">
+		Frange Haut
+	</string>
+	<string name="Beady Eyes">
+		Yeux perçants
+	</string>
+	<string name="Belly Size">
+		Taille du ventre
+	</string>
+	<string name="Big">
+		Gros
+	</string>
+	<string name="Big Butt">
+		Grosses fesses
+	</string>
+	<string name="Big Eyeball">
+		Gros globe oculaire
+	</string>
+	<string name="Big Hair Back">
+		Cheveux volumineux : Derrière
+	</string>
+	<string name="Big Hair Front">
+		Cheveux volumineux : Devant
+	</string>
+	<string name="Big Hair Top">
+		Cheveux volumineux : En haut
+	</string>
+	<string name="Big Head">
+		Grosse tête
+	</string>
+	<string name="Big Pectorals">
+		Gros pectoraux
+	</string>
+	<string name="Big Spikes">
+		Spikes
+	</string>
+	<string name="Black">
+		Noir
+	</string>
+	<string name="Blonde">
+		Blond
+	</string>
+	<string name="Blonde Hair">
+		Cheveux blonds
+	</string>
+	<string name="Blush">
+		Blush
+	</string>
+	<string name="Blush Color">
+		Couleur du blush
+	</string>
+	<string name="Blush Opacity">
+		Opacité du blush
+	</string>
+	<string name="Body Definition">
+		Contour du corps
+	</string>
+	<string name="Body Fat">
+		Graisse
+	</string>
+	<string name="Body Freckles">
+		Grains de beauté
+	</string>
+	<string name="Body Thick">
+		Corps épais
+	</string>
+	<string name="Body Thickness">
+		Épaisseur du corps
+	</string>
+	<string name="Body Thin">
+		Corps mince
+	</string>
+	<string name="Bow Legged">
+		Jambes arquées
+	</string>
+	<string name="Breast Buoyancy">
+		Hauteur des seins
+	</string>
+	<string name="Breast Cleavage">
+		Clivage
+	</string>
+	<string name="Breast Size">
+		Taille des seins
+	</string>
+	<string name="Bridge Width">
+		Arête du nez
+	</string>
+	<string name="Broad">
+		Large
+	</string>
+	<string name="Brow Size">
+		Taille des sourcils
+	</string>
+	<string name="Bug Eyes">
+		Yeux globuleux
+	</string>
+	<string name="Bugged Eyes">
+		Yeux globuleux
+	</string>
+	<string name="Bulbous">
+		En bulbe
+	</string>
+	<string name="Bulbous Nose">
+		Nez en bulbe
+	</string>
+	<string name="Bushy Eyebrows">
+		Sourcils touffus
+	</string>
+	<string name="Bushy Hair">
+		Cheveux touffus
+	</string>
+	<string name="Butt Size">
+		Taille des fesses
+	</string>
+	<string name="bustle skirt">
+		Jupe gonflante
+	</string>
+	<string name="no bustle">
+		Pas gonflante
+	</string>
+	<string name="more bustle">
+		Plus gonflante
+	</string>
+	<string name="Chaplin">
+		Chaplin
+	</string>
+	<string name="Cheek Bones">
+		Pommettes
+	</string>
+	<string name="Chest Size">
+		Taille de la poitrine
+	</string>
+	<string name="Chin Angle">
+		Angle du menton
+	</string>
+	<string name="Chin Cleft">
+		Fente labiale
+	</string>
+	<string name="Chin Curtains">
+		Favoris
+	</string>
+	<string name="Chin Depth">
+		Profondeur du menton
+	</string>
+	<string name="Chin Heavy">
+		Menton lourd
+	</string>
+	<string name="Chin In">
+		Menton rentré
+	</string>
+	<string name="Chin Out">
+		Menton sorti
+	</string>
+	<string name="Chin-Neck">
+		Menton-cou
+	</string>
+	<string name="Clear">
+		Effacer
+	</string>
+	<string name="Cleft">
+		Fente
+	</string>
+	<string name="Close Set Eyes">
+		Yeux rapprochés
+	</string>
+	<string name="Closed">
+		Fermé(s)
+	</string>
+	<string name="Closed Back">
+		Fermé à l&apos;arrière
+	</string>
+	<string name="Closed Front">
+		Fermé devant
+	</string>
+	<string name="Closed Left">
+		Fermé à gauche
+	</string>
+	<string name="Closed Right">
+		Fermé à droite
+	</string>
+	<string name="Coin Purse">
+		Bijoux de famille
+	</string>
+	<string name="Collar Back">
+		Col arrière
+	</string>
+	<string name="Collar Front">
+		Col devant
+	</string>
+	<string name="Corner Down">
+		Coin vers le bas
+	</string>
+	<string name="Corner Normal">
+		Coin normal
+	</string>
+	<string name="Corner Up">
+		Coin vers le haut
+	</string>
+	<string name="Creased">
+		Frippée
+	</string>
+	<string name="Crooked Nose">
+		Nez en bec d&apos;aigle
+	</string>
+	<string name="Cropped Hair">
+		Garçonne
+	</string>
+	<string name="Cuff Flare">
+		Jambe
+	</string>
+	<string name="Dark">
+		Sombre
+	</string>
+	<string name="Dark Green">
+		Vert foncé
+	</string>
+	<string name="Darker">
+		Plus foncé
+	</string>
+	<string name="Deep">
+		Profonde
+	</string>
+	<string name="Default Heels">
+		Talons par défaut
+	</string>
+	<string name="Default Toe">
+		Orteil par défaut
+	</string>
+	<string name="Dense">
+		Dense
+	</string>
+	<string name="Dense hair">
+		Cheveux denses
+	</string>
+	<string name="Double Chin">
+		Double menton
+	</string>
+	<string name="Downturned">
+		Pointant vers le bas
+	</string>
+	<string name="Duffle Bag">
+		Membre viril
+	</string>
+	<string name="Ear Angle">
+		Angle de l&apos;oreille
+	</string>
+	<string name="Ear Size">
+		Taille de l&apos;oreille
+	</string>
+	<string name="Ear Tips">
+		Pointes de l&apos;oreille
+	</string>
+	<string name="Egg Head">
+		Forme de la tête
+	</string>
+	<string name="Eye Bags">
+		Cernes
+	</string>
+	<string name="Eye Color">
+		Couleur des yeux
+	</string>
+	<string name="Eye Depth">
+		Profondeur des yeux
+	</string>
+	<string name="Eye Lightness">
+		Clarté des yeux
+	</string>
+	<string name="Eye Opening">
+		Ouverture des yeux
+	</string>
+	<string name="Eye Pop">
+		Œil proéminent
+	</string>
+	<string name="Eye Size">
+		Taille de l&apos;œil
+	</string>
+	<string name="Eye Spacing">
+		Espacement des yeux
+	</string>
+	<string name="Eyeball Size">
+		Taille du globe oculaire
+	</string>
+	<string name="Eyebrow Arc">
+		Arc des sourcils
+	</string>
+	<string name="Eyebrow Density">
+		Épaisseur des sourcils
+	</string>
+	<string name="Eyebrow Height">
+		Hauteur des sourcils
+	</string>
+	<string name="Eyebrow Points">
+		Direction des sourcils
+	</string>
+	<string name="Eyebrow Size">
+		Taille des sourcils
+	</string>
+	<string name="Eyelash Length">
+		Longueur des cils
+	</string>
+	<string name="Eyeliner">
+		Eyeliner
+	</string>
+	<string name="Eyeliner Color">
+		Couleur de l&apos;eyeliner
+	</string>
+	<string name="Eyes Back">
+		Yeux noirs
+	</string>
+	<string name="Eyes Bugged">
+		Yeux globuleux
+	</string>
+	<string name="Eyes Forward">
+		Yeux vers l&apos;avant
+	</string>
+	<string name="Eyes Long Head">
+		Yeux longue tête
+	</string>
+	<string name="Eyes Shear Left Up">
+		Å’il gauche vers le haut
+	</string>
+	<string name="Eyes Shear Right Up">
+		Å’il droit vers le haut
+	</string>
+	<string name="Eyes Short Head">
+		Yeux petite tête
+	</string>
+	<string name="Eyes Spread">
+		Espacement des yeux
+	</string>
+	<string name="Eyes Sunken">
+		Yeux enfoncés
+	</string>
+	<string name="Eyes Together">
+		Yeux rapprochés
+	</string>
+	<string name="Face Shear">
+		Visage
+	</string>
+	<string name="Facial Definition">
+		Définition du visage
+	</string>
+	<string name="Far Set Eyes">
+		Yeux écartés
+	</string>
+	<string name="Fat">
+		Grosse
+	</string>
+	<string name="Fat Head">
+		Grosse tête
+	</string>
+	<string name="Fat Lips">
+		Lèvres épaisses
+	</string>
+	<string name="Fat Lower">
+		Inférieure plus épaisse
+	</string>
+	<string name="Fat Lower Lip">
+		Lèvre inférieure épaisse
+	</string>
+	<string name="Fat Torso">
+		Torse épais
+	</string>
+	<string name="Fat Upper">
+		Supérieure plus épaisse
+	</string>
+	<string name="Fat Upper Lip">
+		Lèvre supérieure épaisse
+	</string>
+	<string name="Female">
+		Femme
+	</string>
+	<string name="Fingerless">
+		Sans doigts
+	</string>
+	<string name="Fingers">
+		Doigts
+	</string>
+	<string name="Flared Cuffs">
+		Jambes larges
+	</string>
+	<string name="Flat">
+		Plat
+	</string>
+	<string name="Flat Butt">
+		Fesses plates
+	</string>
+	<string name="Flat Head">
+		Tête plate
+	</string>
+	<string name="Flat Toe">
+		Orteil plat
+	</string>
+	<string name="Foot Size">
+		Pointure
+	</string>
+	<string name="Forehead Angle">
+		Angle du front
+	</string>
+	<string name="Forehead Heavy">
+		Front lourd
+	</string>
+	<string name="Freckles">
+		Tâches de rousseur
+	</string>
+	<string name="Front Bangs Down">
+		Mèches de devant longues
+	</string>
+	<string name="Front Bangs Up">
+		Mèches de devant courtes
+	</string>
+	<string name="Front Fringe">
+		Mèches de devant
+	</string>
+	<string name="Front Hair">
+		Cheveux devant
+	</string>
+	<string name="Front Hair Down">
+		Cheveux de devant longs
+	</string>
+	<string name="Front Hair Up">
+		Cheveux de devant courts
+	</string>
+	<string name="Full Back">
+		Arrière touffu
+	</string>
+	<string name="Full Eyeliner">
+		Eyeliner marqué
+	</string>
+	<string name="Full Front">
+		Devant touffu
+	</string>
+	<string name="Full Hair Sides">
+		Côtés touffus
+	</string>
+	<string name="Full Sides">
+		Côtés touffus
+	</string>
+	<string name="Glossy">
+		Brillant
+	</string>
+	<string name="Glove Fingers">
+		Doigts avec gants
+	</string>
+	<string name="Glove Length">
+		Longueur des gants
+	</string>
+	<string name="Hair">
+		Cheveux
+	</string>
+	<string name="Hair Back">
+		Cheveux : Derrière
+	</string>
+	<string name="Hair Front">
+		Cheveux : Devant
+	</string>
+	<string name="Hair Sides">
+		Cheveux : Côtés
+	</string>
+	<string name="Hair Sweep">
+		Sens de la coiffure
+	</string>
+	<string name="Hair Thickess">
+		Épaisseur des cheveux
+	</string>
+	<string name="Hair Thickness">
+		Épaisseur des cheveux
+	</string>
+	<string name="Hair Tilt">
+		Inclinaison des cheveux
+	</string>
+	<string name="Hair Tilted Left">
+		Vers la gauche
+	</string>
+	<string name="Hair Tilted Right">
+		Vers la droite
+	</string>
+	<string name="Hair Volume">
+		Cheveux : Volume
+	</string>
+	<string name="Hand Size">
+		Taille de la main
+	</string>
+	<string name="Handlebars">
+		Guidons
+	</string>
+	<string name="Head Length">
+		Longueur de la tête
+	</string>
+	<string name="Head Shape">
+		Forme de la tête
+	</string>
+	<string name="Head Size">
+		Taille de la tête
+	</string>
+	<string name="Head Stretch">
+		Allongement de la tête
+	</string>
+	<string name="Heel Height">
+		Hauteur des talons
+	</string>
+	<string name="Heel Shape">
+		Forme des talons
+	</string>
+	<string name="Height">
+		Taille
+	</string>
+	<string name="High">
+		Haut
+	</string>
+	<string name="High Heels">
+		Talons hauts
+	</string>
+	<string name="High Jaw">
+		Mâchoire haute
+	</string>
+	<string name="High Platforms">
+		Plateformes hautes
+	</string>
+	<string name="High and Tight">
+		Haut et serré
+	</string>
+	<string name="Higher">
+		Plus élevé
+	</string>
+	<string name="Hip Length">
+		Longueur hanche
+	</string>
+	<string name="Hip Width">
+		Largeur hanche
+	</string>
+	<string name="In">
+		In
+	</string>
+	<string name="In Shdw Color">
+		Couleur ombre interne
+	</string>
+	<string name="In Shdw Opacity">
+		Opacité ombre interne
+	</string>
+	<string name="Inner Eye Corner">
+		Coin de l&apos;œil interne
+	</string>
+	<string name="Inner Eye Shadow">
+		Ombre de l&apos;œil interne
+	</string>
+	<string name="Inner Shadow">
+		Ombre interne
+	</string>
+	<string name="Jacket Length">
+		Longueur de la veste
+	</string>
+	<string name="Jacket Wrinkles">
+		Plis de la veste
+	</string>
+	<string name="Jaw Angle">
+		Angle de la mâchoire
+	</string>
+	<string name="Jaw Jut">
+		saillie de la mâchoire
+	</string>
+	<string name="Jaw Shape">
+		Forme de la mâchoire
+	</string>
+	<string name="Join">
+		Rapprochés
+	</string>
+	<string name="Jowls">
+		Bajoues
+	</string>
+	<string name="Knee Angle">
+		Angle du genou
+	</string>
+	<string name="Knock Kneed">
+		Genoux rapprochés
+	</string>
+	<string name="Large">
+		Grande
+	</string>
+	<string name="Large Hands">
+		Grandes mains
+	</string>
+	<string name="Left Part">
+		Raie à gauche
+	</string>
+	<string name="Leg Length">
+		Longueur de la jambe
+	</string>
+	<string name="Leg Muscles">
+		Muscles de la jambe
+	</string>
+	<string name="Less">
+		Moins
+	</string>
+	<string name="Less Body Fat">
+		Moins de graisse
+	</string>
+	<string name="Less Curtains">
+		Moins
+	</string>
+	<string name="Less Freckles">
+		Moins
+	</string>
+	<string name="Less Full">
+		Moins
+	</string>
+	<string name="Less Gravity">
+		Moins
+	</string>
+	<string name="Less Love">
+		Moins
+	</string>
+	<string name="Less Muscles">
+		Moins
+	</string>
+	<string name="Less Muscular">
+		Moins
+	</string>
+	<string name="Less Rosy">
+		Moins
+	</string>
+	<string name="Less Round">
+		Moins
+	</string>
+	<string name="Less Saddle">
+		Moins
+	</string>
+	<string name="Less Square">
+		Moins
+	</string>
+	<string name="Less Volume">
+		Moins
+	</string>
+	<string name="Less soul">
+		Moins
+	</string>
+	<string name="Lighter">
+		Plus léger
+	</string>
+	<string name="Lip Cleft">
+		Fente labiale
+	</string>
+	<string name="Lip Cleft Depth">
+		Profondeur de la fente labiale
+	</string>
+	<string name="Lip Fullness">
+		Volume des lèvres
+	</string>
+	<string name="Lip Pinkness">
+		Rougeur des lèvres
+	</string>
+	<string name="Lip Ratio">
+		Proportion des lèvres
+	</string>
+	<string name="Lip Thickness">
+		Épaisseur des lèvres
+	</string>
+	<string name="Lip Width">
+		Largeur des lèvres
+	</string>
+	<string name="Lipgloss">
+		Brillant à lèvres
+	</string>
+	<string name="Lipstick">
+		Rouge à lèvres
+	</string>
+	<string name="Lipstick Color">
+		Couleur du rouge à lèvres
+	</string>
+	<string name="Long">
+		Long
+	</string>
+	<string name="Long Head">
+		Tête longue
+	</string>
+	<string name="Long Hips">
+		Hanches longues
+	</string>
+	<string name="Long Legs">
+		Jambes longues
+	</string>
+	<string name="Long Neck">
+		Long cou
+	</string>
+	<string name="Long Pigtails">
+		Longues couettes
+	</string>
+	<string name="Long Ponytail">
+		Longue queue de cheval
+	</string>
+	<string name="Long Torso">
+		Torse long
+	</string>
+	<string name="Long arms">
+		Longs bras
+	</string>
+	<string name="Longcuffs">
+		Manches longues
+	</string>
+	<string name="Loose Pants">
+		Pantalons amples
+	</string>
+	<string name="Loose Shirt">
+		Chemise ample
+	</string>
+	<string name="Loose Sleeves">
+		Manches amples
+	</string>
+	<string name="Love Handles">
+		Poignées d&apos;amour
+	</string>
+	<string name="Low">
+		Bas
+	</string>
+	<string name="Low Heels">
+		Talons bas
+	</string>
+	<string name="Low Jaw">
+		Mâchoire basse
+	</string>
+	<string name="Low Platforms">
+		Plateformes basses
+	</string>
+	<string name="Low and Loose">
+		Bas et ample
+	</string>
+	<string name="Lower">
+		Abaisser
+	</string>
+	<string name="Lower Bridge">
+		Arête plus basse
+	</string>
+	<string name="Lower Cheeks">
+		Joues plus basses
+	</string>
+	<string name="Male">
+		Homme
+	</string>
+	<string name="Middle Part">
+		Raie au milieu
+	</string>
+	<string name="More">
+		Plus
+	</string>
+	<string name="More Blush">
+		Plus
+	</string>
+	<string name="More Body Fat">
+		Plus
+	</string>
+	<string name="More Curtains">
+		Plus
+	</string>
+	<string name="More Eyeshadow">
+		Plus
+	</string>
+	<string name="More Freckles">
+		Plus
+	</string>
+	<string name="More Full">
+		Plus
+	</string>
+	<string name="More Gravity">
+		Plus
+	</string>
+	<string name="More Lipstick">
+		Plus
+	</string>
+	<string name="More Love">
+		Plus
+	</string>
+	<string name="More Lower Lip">
+		Plus
+	</string>
+	<string name="More Muscles">
+		Plus
+	</string>
+	<string name="More Muscular">
+		Plus
+	</string>
+	<string name="More Rosy">
+		Plus
+	</string>
+	<string name="More Round">
+		Plus
+	</string>
+	<string name="More Saddle">
+		Plus
+	</string>
+	<string name="More Sloped">
+		Plus
+	</string>
+	<string name="More Square">
+		Plus
+	</string>
+	<string name="More Upper Lip">
+		Plus
+	</string>
+	<string name="More Vertical">
+		Plus
+	</string>
+	<string name="More Volume">
+		Plus
+	</string>
+	<string name="More soul">
+		Plus
+	</string>
+	<string name="Moustache">
+		Moustache
+	</string>
+	<string name="Mouth Corner">
+		Coin de la bouche
+	</string>
+	<string name="Mouth Position">
+		Position de la bouche
+	</string>
+	<string name="Mowhawk">
+		Mowhawk
+	</string>
+	<string name="Muscular">
+		Musclé
+	</string>
+	<string name="Mutton Chops">
+		Rouflaquettes
+	</string>
+	<string name="Nail Polish">
+		Vernis à ongles
+	</string>
+	<string name="Nail Polish Color">
+		Couleur du vernis
+	</string>
+	<string name="Narrow">
+		Étroit
+	</string>
+	<string name="Narrow Back">
+		Arrière étroit
+	</string>
+	<string name="Narrow Front">
+		Devant étroit
+	</string>
+	<string name="Narrow Lips">
+		Lèvres étroites
+	</string>
+	<string name="Natural">
+		Naturel
+	</string>
+	<string name="Neck Length">
+		Longueur du cou
+	</string>
+	<string name="Neck Thickness">
+		Épaisseur du cou
+	</string>
+	<string name="No Blush">
+		Pas de blush
+	</string>
+	<string name="No Eyeliner">
+		Pas de eyeliner
+	</string>
+	<string name="No Eyeshadow">
+		Pas d&apos;ombre à paupières
+	</string>
+	<string name="No Heels">
+		Pas de talons
+	</string>
+	<string name="No Lipgloss">
+		Pas de brillant à lèvres
+	</string>
+	<string name="No Lipstick">
+		Pas de rouge à lèvres
+	</string>
+	<string name="No Part">
+		Pas de raie
+	</string>
+	<string name="No Polish">
+		Pas de vernis
+	</string>
+	<string name="No Red">
+		Pas de rouge
+	</string>
+	<string name="No Spikes">
+		Pas de spikes
+	</string>
+	<string name="No White">
+		Pas de blanc
+	</string>
+	<string name="No Wrinkles">
+		Pas de rides
+	</string>
+	<string name="Normal Lower">
+		Normal plus bas
+	</string>
+	<string name="Normal Upper">
+		Normal plus haut
+	</string>
+	<string name="Nose Left">
+		Nez à gauche
+	</string>
+	<string name="Nose Right">
+		Nez à droite
+	</string>
+	<string name="Nose Size">
+		Taille du nez
+	</string>
+	<string name="Nose Thickness">
+		Épaisseur du nez
+	</string>
+	<string name="Nose Tip Angle">
+		Angle du bout du nez
+	</string>
+	<string name="Nose Tip Shape">
+		Forme du bout du nez
+	</string>
+	<string name="Nose Width">
+		Largeur du nez
+	</string>
+	<string name="Nostril Division">
+		Division des narines
+	</string>
+	<string name="Nostril Width">
+		Largeur des narines
+	</string>
+	<string name="Old">
+		Vieux
+	</string>
+	<string name="Opaque">
+		Opaque
+	</string>
+	<string name="Open">
+		Ouvert
+	</string>
+	<string name="Open Back">
+		Derrière ouvert
+	</string>
+	<string name="Open Front">
+		Devant ouvert
+	</string>
+	<string name="Open Left">
+		Ouvert à gauche
+	</string>
+	<string name="Open Right">
+		Ouvert à droite
+	</string>
+	<string name="Orange">
+		Orange
+	</string>
+	<string name="Out">
+		Dehors
+	</string>
+	<string name="Out Shdw Color">
+		Couleur de l&apos;ombre externe
+	</string>
+	<string name="Out Shdw Opacity">
+		Opacité de l&apos;ombre externe
+	</string>
+	<string name="Outer Eye Corner">
+		Coin de l&apos;œil externe
+	</string>
+	<string name="Outer Eye Shadow">
+		Ombre de l&apos;œil externe
+	</string>
+	<string name="Outer Shadow">
+		Ombre externe
+	</string>
+	<string name="Overbite">
+		Chevauchement
+	</string>
+	<string name="Package">
+		Parties
+	</string>
+	<string name="Painted Nails">
+		Ongles vernis
+	</string>
+	<string name="Pale">
+		Pâle
+	</string>
+	<string name="Pants Crotch">
+		Entrejambe
+	</string>
+	<string name="Pants Fit">
+		Taille
+	</string>
+	<string name="Pants Length">
+		Longueur
+	</string>
+	<string name="Pants Waist">
+		Taille
+	</string>
+	<string name="Pants Wrinkles">
+		Plis
+	</string>
+	<string name="Part">
+		Raie
+	</string>
+	<string name="Part Bangs">
+		Séparation de la frange
+	</string>
+	<string name="Pectorals">
+		Pectoraux
+	</string>
+	<string name="Pigment">
+		Pigmentation
+	</string>
+	<string name="Pigtails">
+		Couettes
+	</string>
+	<string name="Pink">
+		Rose
+	</string>
+	<string name="Pinker">
+		Plus rose
+	</string>
+	<string name="Platform Height">
+		Hauteur de la plateforme
+	</string>
+	<string name="Platform Width">
+		Largeur de la plateforme
+	</string>
+	<string name="Pointy">
+		Pointu
+	</string>
+	<string name="Pointy Heels">
+		Talons pointus
+	</string>
+	<string name="Pointy Toe">
+		Orteil pointu
+	</string>
+	<string name="Ponytail">
+		Queue de cheval
+	</string>
+	<string name="Poofy Skirt">
+		Jupe bouffante
+	</string>
+	<string name="Pop Left Eye">
+		Å’il gauche saillant
+	</string>
+	<string name="Pop Right Eye">
+		Å’il droit saillant
+	</string>
+	<string name="Puffy">
+		Gonflé
+	</string>
+	<string name="Puffy Eyelids">
+		Paupières gonflées
+	</string>
+	<string name="Rainbow Color">
+		Couleur de l&apos;arc en ciel
+	</string>
+	<string name="Red Hair">
+		Cheveux roux
+	</string>
+	<string name="Red Skin">
+		Peau rouge
+	</string>
+	<string name="Regular">
+		Standard
+	</string>
+	<string name="Regular Muscles">
+		Muscles normaux
+	</string>
+	<string name="Right Part">
+		Raie à droite
+	</string>
+	<string name="Rosy Complexion">
+		Teint rosé
+	</string>
+	<string name="Round">
+		Rond
+	</string>
+	<string name="Round Forehead">
+		Front rond
+	</string>
+	<string name="Ruddiness">
+		Rougeur
+	</string>
+	<string name="Ruddy">
+		Rouge
+	</string>
+	<string name="Rumpled Hair">
+		Texture
+	</string>
+	<string name="Saddle Bags">
+		Culotte de cheval
+	</string>
+	<string name="Saddlebags">
+		Culotte de cheval
+	</string>
+	<string name="Scrawny">
+		Maigre
+	</string>
+	<string name="Scrawny Leg">
+		Jambes maigres
+	</string>
+	<string name="Separate">
+		Séparés
+	</string>
+	<string name="Shading">
+		Dégradé
+	</string>
+	<string name="Shadow hair">
+		Cheveux
+	</string>
+	<string name="Shallow">
+		Creux
+	</string>
+	<string name="Shear Back">
+		Coupe derrière
+	</string>
+	<string name="Shear Face">
+		Visage
+	</string>
+	<string name="Shear Front">
+		Devant dégagé
+	</string>
+	<string name="Shear Left">
+		Gauche dégagée
+	</string>
+	<string name="Shear Left Up">
+		Haut gauche dégagé
+	</string>
+	<string name="Shear Right">
+		Droite dégagée
+	</string>
+	<string name="Shear Right Up">
+		Haut droit dégagé
+	</string>
+	<string name="Sheared Back">
+		Dégagé derrière
+	</string>
+	<string name="Sheared Front">
+		Dégagé devant
+	</string>
+	<string name="Shift Left">
+		Déplacer vers la gauche
+	</string>
+	<string name="Shift Mouth">
+		Déplacer la bouche
+	</string>
+	<string name="Shift Right">
+		Déplacer vers la droite
+	</string>
+	<string name="Shirt Bottom">
+		Chemise
+	</string>
+	<string name="Shirt Fit">
+		Taille
+	</string>
+	<string name="Shirt Wrinkles">
+		Plis
+	</string>
+	<string name="Shoe Height">
+		Hauteur de la chaussure
+	</string>
+	<string name="Short">
+		Court
+	</string>
+	<string name="Short Arms">
+		Bras courts
+	</string>
+	<string name="Short Legs">
+		Jambes courtes
+	</string>
+	<string name="Short Neck">
+		Petit cou
+	</string>
+	<string name="Short Pigtails">
+		Couettes courtes
+	</string>
+	<string name="Short Ponytail">
+		Queue de cheval courte
+	</string>
+	<string name="Short Sideburns">
+		Favoris courts
+	</string>
+	<string name="Short Torso">
+		Torse court
+	</string>
+	<string name="Short hips">
+		Hanches courtes
+	</string>
+	<string name="Shoulders">
+		Épaules
+	</string>
+	<string name="Side Bangs">
+		Mèches sur le côté
+	</string>
+	<string name="Side Bangs Down">
+		Mèches sur le côté en bas
+	</string>
+	<string name="Side Bangs Up">
+		Mèches sur le côté en haut
+	</string>
+	<string name="Side Fringe">
+		Frange sur le côté
+	</string>
+	<string name="Sideburns">
+		Favoris
+	</string>
+	<string name="Sides Hair">
+		Cheveux sur le côté
+	</string>
+	<string name="Sides Hair Down">
+		Cheveux sur le côté en bas
+	</string>
+	<string name="Sides Hair Up">
+		Cheveux sur le côté en haut
+	</string>
+	<string name="Skinny">
+		Maigre
+	</string>
+	<string name="Skinny Neck">
+		Cou maigre
+	</string>
+	<string name="Skirt Fit">
+		Taille de la jupe
+	</string>
+	<string name="Skirt Length">
+		Longueur de la jupe
+	</string>
+	<string name="Slanted Forehead">
+		Front incliné
+	</string>
+	<string name="Sleeve Length">
+		Longueur de la manche
+	</string>
+	<string name="Sleeve Looseness">
+		Ampleur de la manche
+	</string>
+	<string name="Slit Back">
+		Fente : Derrière
+	</string>
+	<string name="Slit Front">
+		Fente : Devant
+	</string>
+	<string name="Slit Left">
+		Fente : Gauche
+	</string>
+	<string name="Slit Right">
+		Fente : Droite
+	</string>
+	<string name="Small">
+		Petite
+	</string>
+	<string name="Small Hands">
+		Petites mains
+	</string>
+	<string name="Small Head">
+		Petite tête
+	</string>
+	<string name="Smooth">
+		Lisse
+	</string>
+	<string name="Smooth Hair">
+		Cheveux lisses
+	</string>
+	<string name="Socks Length">
+		Longueur des chaussettes
+	</string>
+	<string name="Some">
+		Quelques un(e)s
+	</string>
+	<string name="Soulpatch">
+		Soulpatch
+	</string>
+	<string name="Sparse">
+		Rares
+	</string>
+	<string name="Spiked Hair">
+		Mèches en pointe
+	</string>
+	<string name="Square">
+		Carré
+	</string>
+	<string name="Square Toe">
+		Orteil carré
+	</string>
+	<string name="Squash Head">
+		Écraser la tête
+	</string>
+	<string name="Squash/Stretch Head">
+		Allonger/écraser la tête
+	</string>
+	<string name="Stretch Head">
+		Allonger la tête
+	</string>
+	<string name="Sunken">
+		Enfoncées
+	</string>
+	<string name="Sunken Chest">
+		Poitrine enfoncée
+	</string>
+	<string name="Sunken Eyes">
+		Yeux enfoncés
+	</string>
+	<string name="Sweep Back">
+		En arrière
+	</string>
+	<string name="Sweep Forward">
+		Vers l&apos;avant
+	</string>
+	<string name="Swept Back">
+		En arrière
+	</string>
+	<string name="Swept Back Hair">
+		Cheveux en arrière
+	</string>
+	<string name="Swept Forward">
+		Vers l&apos;avant
+	</string>
+	<string name="Swept Forward Hair">
+		Cheveux vers l&apos;&apos;avant
+	</string>
+	<string name="Tall">
+		Grand
+	</string>
+	<string name="Taper Back">
+		Biseauter à l&apos;arrière
+	</string>
+	<string name="Taper Front">
+		Biseauter à l&apos;avant
+	</string>
+	<string name="Thick Heels">
+		Talons épais
+	</string>
+	<string name="Thick Neck">
+		Cou épais
+	</string>
+	<string name="Thick Toe">
+		Orteil épais
+	</string>
+	<string name="Thickness">
+		Épaisseur
+	</string>
+	<string name="Thin">
+		Fins
+	</string>
+	<string name="Thin Eyebrows">
+		Sourcils fins
+	</string>
+	<string name="Thin Lips">
+		Lèvres fines
+	</string>
+	<string name="Thin Nose">
+		Nez fin
+	</string>
+	<string name="Tight Chin">
+		Menton fin
+	</string>
+	<string name="Tight Cuffs">
+		Jambes serrées
+	</string>
+	<string name="Tight Pants">
+		Pantalons serrés
+	</string>
+	<string name="Tight Shirt">
+		Chemise serrée
+	</string>
+	<string name="Tight Skirt">
+		Jupe serrée
+	</string>
+	<string name="Tight Sleeves">
+		Manches serrées
+	</string>
+	<string name="Tilt Left">
+		Pencher sur la gauche
+	</string>
+	<string name="Tilt Right">
+		Pencher sur la droite
+	</string>
+	<string name="Toe Shape">
+		Forme de l&apos;orteil
+	</string>
+	<string name="Toe Thickness">
+		Épaisseur de l&apos;orteil
+	</string>
+	<string name="Torso Length">
+		Longueur du torse
+	</string>
+	<string name="Torso Muscles">
+		Muscles du torse
+	</string>
+	<string name="Torso Scrawny">
+		Torse maigre
+	</string>
+	<string name="Unattached">
+		Séparés
+	</string>
+	<string name="Uncreased">
+		Lisse
+	</string>
+	<string name="Underbite">
+		Rentré
+	</string>
+	<string name="Unnatural">
+		Artificiel
+	</string>
+	<string name="Upper Bridge">
+		Arête supérieure
+	</string>
+	<string name="Upper Cheeks">
+		Pommettes
+	</string>
+	<string name="Upper Chin Cleft">
+		Fente du menton supérieure
+	</string>
+	<string name="Upper Eyelid Fold">
+		Paupière supérieure
+	</string>
+	<string name="Upturned">
+		En trompette
+	</string>
+	<string name="Very Red">
+		Très rouge
+	</string>
+	<string name="Waist Height">
+		Hauteur de la taille
+	</string>
+	<string name="Well-Fed">
+		Bien nourri
+	</string>
+	<string name="White Hair">
+		Cheveux blancs
+	</string>
+	<string name="Wide">
+		Large
+	</string>
+	<string name="Wide Back">
+		Dos large
+	</string>
+	<string name="Wide Front">
+		Devant large
+	</string>
+	<string name="Wide Lips">
+		Lèvres larges
+	</string>
+	<string name="Wild">
+		Revêche
+	</string>
+	<string name="Wrinkles">
+		Rides
+	</string>
+	<string name="LocationCtrlAddLandmarkTooltip">
+		Ajouter à mes repères
+	</string>
+	<string name="LocationCtrlEditLandmarkTooltip">
+		Modifier mes repères
+	</string>
+	<string name="UpdaterWindowTitle">
+		[APP_NAME] Mettre à jour
+	</string>
+	<string name="UpdaterNowUpdating">
+		En train de charger [APP_NAME]...
+	</string>
+	<string name="UpdaterNowInstalling">
+		En train d&apos;installer [APP_NAME]...
+	</string>
+	<string name="UpdaterUpdatingDescriptive">
+		Le client [APP_NAME] est en train d&apos;être mis à jour.  Cela peut prendre un certain temps, merci de votre patience.
+	</string>
+	<string name="UpdaterProgressBarTextWithEllipses">
+		Mise à jour en cours...
+	</string>
+	<string name="UpdaterProgressBarText">
+		Mise à jour en cours
+	</string>
+	<string name="UpdaterFailDownloadTitle">
+		Le téléchargement de la mise à jour a échoué
+	</string>
+	<string name="UpdaterFailUpdateDescriptive">
+		Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez télécharger la dernière version sur www.secondlife.com.
+	</string>
+	<string name="UpdaterFailInstallTitle">
+		L&apos;installation de la mise à jour a échoué
+	</string>
+	<string name="UpdaterFailStartTitle">
+		Impossible de lancer le client
+	</string>
+	<string name="only_user_message">
+		Vous êtes le seul participant à cette session.
+	</string>
+	<string name="offline_message">
+		[FIRST] [LAST] est déconnecté(e).
+	</string>
+	<string name="invite_message">
+		Pour accepter ce chat vocal/vous connecter, cliquez sur le bouton [BUTTON NAME].
+	</string>
+	<string name="generic_request_error">
+		Erreur lors de la requête, veuillez réessayer ultérieurement.
+	</string>
+	<string name="insufficient_perms_error">
+		Vous n&apos;avez pas les droits requis.
+	</string>
+	<string name="session_does_not_exist_error">
+		La session a expiré
+	</string>
+	<string name="no_ability_error">
+		Vous n&apos;avez pas ce pouvoir.
+	</string>
+	<string name="no_ability">
+		Vous n&apos;avez pas ce pouvoir.
+	</string>
+	<string name="not_a_mod_error">
+		Vous n&apos;êtes pas modérateur de session.
+	</string>
+	<string name="muted_error">
+		Un modérateur de groupe a désactivé votre chat écrit.
+	</string>
+	<string name="add_session_event">
+		Impossible d&apos;ajouter des participants à la session de chat avec [RECIPIENT].
+	</string>
+	<string name="message_session_event">
+		Impossible d&apos;envoyer votre message à la session de chat avec [RECIPIENT].
+	</string>
+	<string name="removed_from_group">
+		Vous avez été supprimé du groupe.
+	</string>
+	<string name="close_on_no_ability">
+		Vous ne pouvez plus participer à la session de chat.
+	</string>
+</strings>
diff --git a/indra/newview/skins/default/xui/fr/teleport_strings.xml b/indra/newview/skins/default/xui/fr/teleport_strings.xml
index 1315a4b1004..b76ae370fd0 100644
--- a/indra/newview/skins/default/xui/fr/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/fr/teleport_strings.xml
@@ -1,77 +1,77 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<teleport_messages name="">
-	<message_set name="errors">
-		<message name="invalid_tport">
-			Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir vous téléporter.
-Si ce message persiste, veuillez consulter la page [SUPPORT_SITE].
-		</message>
-		<message name="invalid_region_handoff">
-			Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir traverser des régions.
-Si ce message persiste, veuillez consulter la page [SUPPORT_SITE].
-		</message>
-		<message name="blocked_tport">
-			Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment.
-Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis reconnectez-vous pour résoudre le problème.
-		</message>
-		<message name="nolandmark_tport">
-			Désolé, le système n&apos;a pas réussi à localiser la destination de votre repère.
-		</message>
-		<message name="timeout_tport">
-			Désolé, la connexion vers votre lieu de téléportation n&apos;a pas abouti.
-Veuillez réessayer dans un moment.
-		</message>
-		<message name="noaccess_tport">
-			Désolé, vous n&apos;avez pas accès à cette destination.
-		</message>
-		<message name="missing_attach_tport">
-			Vos pieces-jointes ne sont pas encore arrivées. Attendez quelques secondes de plus ou déconnectez-vous puis reconnectez-vous avant d&apos;essayer de vous téléporter.
-		</message>
-		<message name="too_many_uploads_tport">
-			Le trafic vers cette région est bouché en ce moment. Votre téléportation ne pourra pas avoir lieu immédiatement. Veuillez réessayer dans quelques minutes ou bien aller dans une zone moins fréquentée.
-		</message>
-		<message name="expired_tport">
-			Désolé, votre demande de téléportation n&apos;a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes.
-		</message>
-		<message name="expired_region_handoff">
-			Désolé, votre demande pour passer dans une autre région n&apos;a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes.
-		</message>
-		<message name="no_host">
-			Impossible de trouver la destination de la téléportation. Il est possible que cette destination soit temporairement indisponible ou qu&apos;elle n&apos;existe plus. Veuillez réessayer dans quelques minutes.
-		</message>
-		<message name="no_inventory_host">
-			L&apos;inventaire est temporairement indisponible.
-		</message>
-	</message_set>
-	<message_set name="progress">
-		<message name="sending_dest">
-			Envoi vers la destination en cours.
-		</message>
-		<message name="redirecting">
-			Redirection vers un emplacement différent en cours.
-		</message>
-		<message name="relaying">
-			Relai vers la destination en cours.
-		</message>
-		<message name="sending_home">
-			Requête de la demande d&apos;envoi vers votre domicile en cours.
-		</message>
-		<message name="sending_landmark">
-			Requête de la demande d&apos;envoi vers le repère en cours.
-		</message>
-		<message name="completing">
-			Téléportation sur le point d&apos;aboutir.
-		</message>
-		<message name="resolving">
-			Destination en cours de résolution.
-		</message>
-		<message name="contacting">
-			Contact avec la nouvelle région en cours.
-		</message>
-		<message name="arriving">
-			Vous arrivez...
-		</message>
-		<message name="requesting">
-			Demande de téléportation en cours...
-		</message>
-	</message_set>
-</teleport_messages>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<teleport_messages name="">
+	<message_set name="errors">
+		<message name="invalid_tport">
+			Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir vous téléporter.
+Si ce message persiste, veuillez consulter la page [SUPPORT_SITE].
+		</message>
+		<message name="invalid_region_handoff">
+			Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir traverser des régions.
+Si ce message persiste, veuillez consulter la page [SUPPORT_SITE].
+		</message>
+		<message name="blocked_tport">
+			Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment.
+Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis reconnectez-vous pour résoudre le problème.
+		</message>
+		<message name="nolandmark_tport">
+			Désolé, le système n&apos;a pas réussi à localiser la destination de votre repère.
+		</message>
+		<message name="timeout_tport">
+			Désolé, la connexion vers votre lieu de téléportation n&apos;a pas abouti.
+Veuillez réessayer dans un moment.
+		</message>
+		<message name="noaccess_tport">
+			Désolé, vous n&apos;avez pas accès à cette destination.
+		</message>
+		<message name="missing_attach_tport">
+			Vos pieces-jointes ne sont pas encore arrivées. Attendez quelques secondes de plus ou déconnectez-vous puis reconnectez-vous avant d&apos;essayer de vous téléporter.
+		</message>
+		<message name="too_many_uploads_tport">
+			Le trafic vers cette région est bouché en ce moment. Votre téléportation ne pourra pas avoir lieu immédiatement. Veuillez réessayer dans quelques minutes ou bien aller dans une zone moins fréquentée.
+		</message>
+		<message name="expired_tport">
+			Désolé, votre demande de téléportation n&apos;a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes.
+		</message>
+		<message name="expired_region_handoff">
+			Désolé, votre demande pour passer dans une autre région n&apos;a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes.
+		</message>
+		<message name="no_host">
+			Impossible de trouver la destination de la téléportation. Il est possible que cette destination soit temporairement indisponible ou qu&apos;elle n&apos;existe plus. Veuillez réessayer dans quelques minutes.
+		</message>
+		<message name="no_inventory_host">
+			L&apos;inventaire est temporairement indisponible.
+		</message>
+	</message_set>
+	<message_set name="progress">
+		<message name="sending_dest">
+			Envoi vers la destination en cours.
+		</message>
+		<message name="redirecting">
+			Redirection vers un emplacement différent en cours.
+		</message>
+		<message name="relaying">
+			Relai vers la destination en cours.
+		</message>
+		<message name="sending_home">
+			Requête de la demande d&apos;envoi vers votre domicile en cours.
+		</message>
+		<message name="sending_landmark">
+			Requête de la demande d&apos;envoi vers le repère en cours.
+		</message>
+		<message name="completing">
+			Téléportation sur le point d&apos;aboutir.
+		</message>
+		<message name="resolving">
+			Destination en cours de résolution.
+		</message>
+		<message name="contacting">
+			Contact avec la nouvelle région en cours.
+		</message>
+		<message name="arriving">
+			Vous arrivez...
+		</message>
+		<message name="requesting">
+			Demande de téléportation en cours...
+		</message>
+	</message_set>
+</teleport_messages>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_profile.xml b/indra/newview/skins/default/xui/it/panel_edit_profile.xml
index 0eba7bf3b69..33f3c367c2e 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_profile.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
-   <string name="CaptionTextAcctInfo">
-       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-   </string>
-   <string name="AcctTypeResident"
-    value="Residente" />
-   <string name="AcctTypeTrial"
-    value="Prova" />
-   <string name="AcctTypeCharterMember"
-    value="Membro privilegiato" />
-   <string name="AcctTypeEmployee"
-    value="Impiegato della Linden Lab" />
-   <string name="PaymentInfoUsed"
-    value="Info. di pagamento usate" />
-   <string name="PaymentInfoOnFile"
-    value="Info. di pagamento in archivio" />
-   <string name="NoPaymentInfoOnFile"
-    value="Nessuna info. di pagamento" />
-   <string name="AgeVerified"
-    value="Età verificata" />
-   <string name="NotAgeVerified"
-    value="Età non verificata" />
-   <string name="partner_edit_link_url">
-       http://www.secondlife.com/account/partners.php?lang=it
-   </string>
-    <panel name="scroll_content_panel">
-    <panel name="data_panel" >
-     <panel name="lifes_images_panel">
-          <panel name="second_life_image_panel">
-              <text name="second_life_photo_title_text">
-			[SECOND_LIFE]:
-              </text>
-          </panel>
-      </panel>
-        <text name="title_partner_text" value="Partner:"/>
-        <panel name="partner_data_panel">
-            <text name="partner_text" value="[FIRST] [LAST]"/>
-         </panel>
-      <text name="text_box3">
-	Risposta agli IM quando sono in &apos;Occupato&apos;:
-      </text>
-    </panel>
-    </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="edit_profile_panel">
+   <string name="CaptionTextAcctInfo">
+       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+   </string>
+   <string name="AcctTypeResident"
+    value="Residente" />
+   <string name="AcctTypeTrial"
+    value="Prova" />
+   <string name="AcctTypeCharterMember"
+    value="Membro privilegiato" />
+   <string name="AcctTypeEmployee"
+    value="Impiegato della Linden Lab" />
+   <string name="PaymentInfoUsed"
+    value="Info. di pagamento usate" />
+   <string name="PaymentInfoOnFile"
+    value="Info. di pagamento in archivio" />
+   <string name="NoPaymentInfoOnFile"
+    value="Nessuna info. di pagamento" />
+   <string name="AgeVerified"
+    value="Età verificata" />
+   <string name="NotAgeVerified"
+    value="Età non verificata" />
+   <string name="partner_edit_link_url">
+       http://www.secondlife.com/account/partners.php?lang=it
+   </string>
+    <panel name="scroll_content_panel">
+    <panel name="data_panel" >
+     <panel name="lifes_images_panel">
+          <panel name="second_life_image_panel">
+              <text name="second_life_photo_title_text">
+			[SECOND_LIFE]:
+              </text>
+          </panel>
+      </panel>
+        <text name="title_partner_text" value="Partner:"/>
+        <panel name="partner_data_panel">
+            <text name="partner_text" value="[FIRST] [LAST]"/>
+         </panel>
+      <text name="text_box3">
+	Risposta agli IM quando sono in &apos;Occupato&apos;:
+      </text>
+    </panel>
+    </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/floater_about.xml b/indra/newview/skins/default/xui/ja/floater_about.xml
index 07911c68b1f..723ceae552f 100644
--- a/indra/newview/skins/default/xui/ja/floater_about.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about.xml
@@ -1,40 +1,40 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="[APP_NAME]について">
-	<tab_container name="about_tab">
-		<panel label="クレジット" name="credits_panel">
-			<text_editor name="credits_editor">
-				Second Lifeは、 Philip、Tessa、Andrew、Cory、James、Ben、Char、Charlie、Colin、Dan、Daniel、Doug、Eric、Hamlet、Haney、Eve、Hunter、Ian、Jeff、Jennifer、Jim、John、Lee、Mark、Peter、Phoenix、Richard、Robin、Xenon、Steve、Tanya、Eddie、Avi、Frank、Bruce、Aaron、Alice、Bob、Debra、Eileen、Helen、Janet、Louie、Leviathania、Stefan、Ray、Kevin、Tom、Mikeb、MikeT、Burgess、Elena、Tracy、Bill、Todd、Ryan、Zach、Sarah、Nova、Tim、Stephanie、Michael、Evan、Nicolas、Catherine、Rachelle、Dave、Holly、Bub、Kelly、Magellan、Ramzi、Don、Sabin、Jill、Rheya、Jeska、Torley、Kona、Callum、Charity、Ventrella、Jack、Vektor、Iris、Chris、Nicole、Mick、Reuben、Blue、Babbage、Yedwab、Deana、Lauren、Brent、Pathfinder、Chadrick、Altruima、Jesse、Teeny、Monroe、Icculus、David、Tess、Lizzie、Patsy、Isaac、Lawrence、Cyn、Bo、Gia、Annette、Marius、Tbone、Jonathan、Karen、Ginsu、Satoko、Yuko、Makiko、Thomas、Harry、Seth、Alexei、Brian、Guy、Runitai、Ethan、Data、Cornelius、Kenny、Swiss、Zero、Natria、Wendy、Stephen、Teeple、Thumper、Lucy、Dee、Mia、Liana、Warren、Branka、Aura、beez、Milo、Hermia、Red、Thrax、Joe、Sally、Magenta、Mogura、Paul、Jose、Rejean、Henrik、Lexie、Amber、Logan、Xan、Nora、Morpheus、Donovan、Leyla、MichaelFrancis、Beast、Cube、Bucky、Joshua、Stryfe、Harmony、Teresa、Claudia、Walker、Glenn、Fritz、Fordak、June、Cleopetra、Jean、Ivy、Betsy、Roosevelt、Spike、Ken、Which、Tofu、Chiyo、Rob、Zee、dustin、George、Del、Matthew、Cat、Jacqui、Lightfoot、Adrian、Viola、Alfred、Noel、Irfan、Sunil、Yool、Rika、Jane、Xtreme、Frontier、a2、Neo、Siobhan、Yoz、Justin、Elle、Qarl、Benjamin、Isabel、Gulliver、Everett、Christopher、Izzy、Stephany、Garry、Sejong、Sean、Tobin、Iridium、Meta、Anthony、Jeremy、JP、Jake、Maurice、Madhavi、Leopard、Kyle、Joon、Kari、Bert、Belinda、Jon、Kristi、Bridie、Pramod、KJ、Socrates、Maria、Ivan、Aric、Yamasaki、Adreanne、Jay、MitchK、Ceren、Coco、Durl、Jenny、Periapse、Kartic、Storrs、Lotte、Sandy、Rohn、Colossus、Zen、BigPapi、Brad、Pastrami、Kurz、Mani、Neuro、Jaime、MJ、Rowan、Sgt、Elvis、Gecko、Samuel、Sardonyx、Leo、Bryan、Niko、Soft、Poppy、Rachel、Aki、Angelo、Banzai、Alexa、Sue、CeeLo、Bender、CG、Gillian、Pelle、Nick、Echo、Zara、Christine、Shamiran、Emma、Blake、Keiko、Plexus、Joppa、Sidewinder、Erica、Ashlei、Twilight、Kristen、Brett、Q、Enus、Simon、Bevis、Kraft、Kip、Chandler、Ron、LauraP、Ram、KyleJM、Scouse、Prospero、Melissa、Marty、Nat、Hamilton、Kend、Lordan、Jimmy、Kosmo、Seraph、Green、Ekim、Wiggo、JT、Rome、Doris、Miz、Benoc、Whump、Trinity、Patch、Kate、TJ、Bao、Joohwan、Christy、Sofia、Matias、Cogsworth、Johan、Oreh、Cheah、Angela、Brandy、Mango、Lan、Aleks、Gloria、Heidy、Mitchell、Space、Colton、Bambers、Einstein、Maggie、Malbers、Rose、Winnie、Stella、Milton、Rothman、Niall、Marin、Allison、Katie、Dawn、Katt、Dusty、Kalpana、Judy、Andrea、Ambroff、Infinity、Gail、Rico、Raymond、Yi、William、Christa、M、Teagan、Scout、Molly、Dante、Corr、Dynamike、Usi、Kaylee、Vidtuts、Lil、Danica、Sascha、Kelv、Jacob、Nya、Rodney、Brandon、Elsie、Blondin、Grant、Katrin、Nyx、Gabriel、Locklainn、Claire、Devin、Minerva、Monty、Austin、Bradford、Si、Keira、H、Caitlin、Dita、Makai、Jenn、Ann、Meredith、Clare、Joy、Praveen、Cody、Edmund、Ruthe、Sirena、Gayathri、Spider、FJ、Davidoff、Tian、Jennie、Louise、Oskar、Landon、Noelle、Jarv、Ingrid、Al、Sommer、Doc、Aria、Huin、Gray、Lili、Vir、DJ、Yang、T、Simone、Maestro、Scott、Charlene、Quixote、Amanda、Susan、Zed、Anne、Enkidu、Esbee、Joroan、Katelin、Roxie、Tay、Scarlet、Kevin、Johnny、Wolfgang、Andren、Bob、Howard、Merov、Rand、Ray、Michon、Newell、Galen、Dessie、Les、Michon、Jenelle、Geo、Siz、Shapiro、Pete、Calyle、Selene、Allen、Phoebe、Goldin、Kimmora、Dakota、Slaton、Lindquist、Zoey、Hari、Othello、Rohit、Sheldon、Petra、Viale、Gordon、Kaye、Pink、Ferny、Emerson、Davy、Bri、Chan、Juan、Robert、Terrence、Nathan、Carlと、その他多数の人達によって作成されました。
-
-  このバージョンをこれまでで最高のものになるようご協力をいただいた以下の住人の皆様に深く感謝いたします。 able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
-
-
-
-  ビジネスで成功するには、勇気を持って、誰よりも先に、人と違ったことをすることだ。 --Henry Marchant
-			</text_editor>
-		</panel>
-		<panel label="ライセンス" name="licenses_panel">
-			<text_editor name="credits_editor">
-				3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
-  APR Copyright (C) 2000-2004 The Apache Software Foundation
-  cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
-  expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
-  FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
-  GL Copyright (C) 1999-2004 Brian Paul.
-  Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
-  jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
-  jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
-  ogg/vorbis Copyright (C) 2001, Xiphophorus
-  OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
-  SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
-  SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-  xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-  zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
-  google-perftools Copyright (c) 2005, Google Inc.
-  
-  無断転写、複製、転載を禁じます。  詳細はlicenses.txtを参照してください。
-
-  Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
-			</text_editor>
-		</panel>
-	</tab_container>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="[APP_NAME]について">
+	<tab_container name="about_tab">
+		<panel label="クレジット" name="credits_panel">
+			<text_editor name="credits_editor">
+				Second Lifeは、 Philip、Tessa、Andrew、Cory、James、Ben、Char、Charlie、Colin、Dan、Daniel、Doug、Eric、Hamlet、Haney、Eve、Hunter、Ian、Jeff、Jennifer、Jim、John、Lee、Mark、Peter、Phoenix、Richard、Robin、Xenon、Steve、Tanya、Eddie、Avi、Frank、Bruce、Aaron、Alice、Bob、Debra、Eileen、Helen、Janet、Louie、Leviathania、Stefan、Ray、Kevin、Tom、Mikeb、MikeT、Burgess、Elena、Tracy、Bill、Todd、Ryan、Zach、Sarah、Nova、Tim、Stephanie、Michael、Evan、Nicolas、Catherine、Rachelle、Dave、Holly、Bub、Kelly、Magellan、Ramzi、Don、Sabin、Jill、Rheya、Jeska、Torley、Kona、Callum、Charity、Ventrella、Jack、Vektor、Iris、Chris、Nicole、Mick、Reuben、Blue、Babbage、Yedwab、Deana、Lauren、Brent、Pathfinder、Chadrick、Altruima、Jesse、Teeny、Monroe、Icculus、David、Tess、Lizzie、Patsy、Isaac、Lawrence、Cyn、Bo、Gia、Annette、Marius、Tbone、Jonathan、Karen、Ginsu、Satoko、Yuko、Makiko、Thomas、Harry、Seth、Alexei、Brian、Guy、Runitai、Ethan、Data、Cornelius、Kenny、Swiss、Zero、Natria、Wendy、Stephen、Teeple、Thumper、Lucy、Dee、Mia、Liana、Warren、Branka、Aura、beez、Milo、Hermia、Red、Thrax、Joe、Sally、Magenta、Mogura、Paul、Jose、Rejean、Henrik、Lexie、Amber、Logan、Xan、Nora、Morpheus、Donovan、Leyla、MichaelFrancis、Beast、Cube、Bucky、Joshua、Stryfe、Harmony、Teresa、Claudia、Walker、Glenn、Fritz、Fordak、June、Cleopetra、Jean、Ivy、Betsy、Roosevelt、Spike、Ken、Which、Tofu、Chiyo、Rob、Zee、dustin、George、Del、Matthew、Cat、Jacqui、Lightfoot、Adrian、Viola、Alfred、Noel、Irfan、Sunil、Yool、Rika、Jane、Xtreme、Frontier、a2、Neo、Siobhan、Yoz、Justin、Elle、Qarl、Benjamin、Isabel、Gulliver、Everett、Christopher、Izzy、Stephany、Garry、Sejong、Sean、Tobin、Iridium、Meta、Anthony、Jeremy、JP、Jake、Maurice、Madhavi、Leopard、Kyle、Joon、Kari、Bert、Belinda、Jon、Kristi、Bridie、Pramod、KJ、Socrates、Maria、Ivan、Aric、Yamasaki、Adreanne、Jay、MitchK、Ceren、Coco、Durl、Jenny、Periapse、Kartic、Storrs、Lotte、Sandy、Rohn、Colossus、Zen、BigPapi、Brad、Pastrami、Kurz、Mani、Neuro、Jaime、MJ、Rowan、Sgt、Elvis、Gecko、Samuel、Sardonyx、Leo、Bryan、Niko、Soft、Poppy、Rachel、Aki、Angelo、Banzai、Alexa、Sue、CeeLo、Bender、CG、Gillian、Pelle、Nick、Echo、Zara、Christine、Shamiran、Emma、Blake、Keiko、Plexus、Joppa、Sidewinder、Erica、Ashlei、Twilight、Kristen、Brett、Q、Enus、Simon、Bevis、Kraft、Kip、Chandler、Ron、LauraP、Ram、KyleJM、Scouse、Prospero、Melissa、Marty、Nat、Hamilton、Kend、Lordan、Jimmy、Kosmo、Seraph、Green、Ekim、Wiggo、JT、Rome、Doris、Miz、Benoc、Whump、Trinity、Patch、Kate、TJ、Bao、Joohwan、Christy、Sofia、Matias、Cogsworth、Johan、Oreh、Cheah、Angela、Brandy、Mango、Lan、Aleks、Gloria、Heidy、Mitchell、Space、Colton、Bambers、Einstein、Maggie、Malbers、Rose、Winnie、Stella、Milton、Rothman、Niall、Marin、Allison、Katie、Dawn、Katt、Dusty、Kalpana、Judy、Andrea、Ambroff、Infinity、Gail、Rico、Raymond、Yi、William、Christa、M、Teagan、Scout、Molly、Dante、Corr、Dynamike、Usi、Kaylee、Vidtuts、Lil、Danica、Sascha、Kelv、Jacob、Nya、Rodney、Brandon、Elsie、Blondin、Grant、Katrin、Nyx、Gabriel、Locklainn、Claire、Devin、Minerva、Monty、Austin、Bradford、Si、Keira、H、Caitlin、Dita、Makai、Jenn、Ann、Meredith、Clare、Joy、Praveen、Cody、Edmund、Ruthe、Sirena、Gayathri、Spider、FJ、Davidoff、Tian、Jennie、Louise、Oskar、Landon、Noelle、Jarv、Ingrid、Al、Sommer、Doc、Aria、Huin、Gray、Lili、Vir、DJ、Yang、T、Simone、Maestro、Scott、Charlene、Quixote、Amanda、Susan、Zed、Anne、Enkidu、Esbee、Joroan、Katelin、Roxie、Tay、Scarlet、Kevin、Johnny、Wolfgang、Andren、Bob、Howard、Merov、Rand、Ray、Michon、Newell、Galen、Dessie、Les、Michon、Jenelle、Geo、Siz、Shapiro、Pete、Calyle、Selene、Allen、Phoebe、Goldin、Kimmora、Dakota、Slaton、Lindquist、Zoey、Hari、Othello、Rohit、Sheldon、Petra、Viale、Gordon、Kaye、Pink、Ferny、Emerson、Davy、Bri、Chan、Juan、Robert、Terrence、Nathan、Carlと、その他多数の人達によって作成されました。
+
+  このバージョンをこれまでで最高のものになるようご協力をいただいた以下の住人の皆様に深く感謝いたします。 able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
+
+
+
+  ビジネスで成功するには、勇気を持って、誰よりも先に、人と違ったことをすることだ。 --Henry Marchant
+			</text_editor>
+		</panel>
+		<panel label="ライセンス" name="licenses_panel">
+			<text_editor name="credits_editor">
+				3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
+  APR Copyright (C) 2000-2004 The Apache Software Foundation
+  cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
+  expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
+  FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
+  GL Copyright (C) 1999-2004 Brian Paul.
+  Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
+  jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
+  jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
+  ogg/vorbis Copyright (C) 2001, Xiphophorus
+  OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
+  SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+  SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+  xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+  zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
+  google-perftools Copyright (c) 2005, Google Inc.
+  
+  無断転写、複製、転載を禁じます。  詳細はlicenses.txtを参照してください。
+
+  Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+			</text_editor>
+		</panel>
+	</tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml
index bb9dcac83bb..80c76879f14 100644
--- a/indra/newview/skins/default/xui/ja/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml
@@ -1,475 +1,475 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterland" title="土地情報">
-	<floater.string name="Minutes">
-		[MINUTES] 分
-	</floater.string>
-	<floater.string name="Minute">
-		分
-	</floater.string>
-	<floater.string name="Seconds">
-		[SECONDS] ç§’
-	</floater.string>
-	<tab_container name="landtab">
-		<panel label="一般" name="land_general_panel">
-			<panel.string name="new users only">
-				新規ユーザーのみ
-			</panel.string>
-			<panel.string name="anyone">
-				誰でも
-			</panel.string>
-			<panel.string name="area_text">
-				面積:
-			</panel.string>
-			<panel.string name="area_size_text">
-				[AREA]平方メートル
-			</panel.string>
-			<panel.string name="auction_id_text">
-				オークションID: [ID]
-			</panel.string>
-			<panel.string name="need_tier_to_modify">
-				この土地を修正変更するには、購入を承認する必要があります。
-			</panel.string>
-			<panel.string name="group_owned_text">
-				(グループ所有)
-			</panel.string>
-			<panel.string name="profile_text">
-				プロフィール...
-			</panel.string>
-			<panel.string name="info_text">
-				情報...
-			</panel.string>
-			<panel.string name="public_text">
-				(公共)
-			</panel.string>
-			<panel.string name="none_text">
-				(なし)
-			</panel.string>
-			<panel.string name="sale_pending_text">
-				(購入審査中)
-			</panel.string>
-			<panel.string name="no_selection_text">
-				区画が選定されていません。
-「世界」メニュー>「土地情報」に進むか、別の区画を選択して、詳細を表示します。
-			</panel.string>
-			<text name="Name:">
-				名前:
-			</text>
-			<line_editor name="Name"/>
-			<text name="Description:">
-				説明:
-			</text>
-			<text name="LandType">
-				種類:
-			</text>
-			<text name="LandTypeText">
-				メインランド/ホームステッド
-			</text>
-			<text name="ContentRating">
-				区分:
-			</text>
-			<text name="ContentRatingText">
-				Adult
-			</text>
-			<text name="Owner:">
-				オーナー:
-			</text>
-			<text name="OwnerText">
-				Leyla Linden
-			</text>
-			<button label="プロフィール..." label_selected="プロフィール..." name="Profile..."/>
-			<text name="Group:">
-				グループ:
-			</text>
-			<button label="設定..." label_selected="設定..." name="Set..."/>
-			<check_box label="グループへの譲渡を許可" name="check deed" tool_tip="グループ・オフィサーは、この土地をグループに譲渡し、グループの土地配分に委ねることができます。"/>
-			<button label="譲渡..." label_selected="譲渡..." name="Deed..." tool_tip="選択されたグループのオフィサーであるときのみ、土地を譲渡できます。"/>
-			<check_box label="オーナーが譲渡と共に寄付" name="check contrib" tool_tip="土地がグループに譲渡されるとき、前の所有者は譲渡が成立するよう、十分な土地を寄付します。"/>
-			<text name="For Sale:">
-				販売の有無:
-			</text>
-			<text name="Not for sale.">
-				販売対象外
-			</text>
-			<text name="For Sale: Price L$[PRICE].">
-				価格: L$[PRICE] (L$[PRICE_PER_SQM]/平方メートル)
-			</text>
-			<button label="土地を販売..." label_selected="土地を販売..." name="Sell Land..."/>
-			<text name="For sale to">
-				販売先:[BUYER]
-			</text>
-			<text name="Sell with landowners objects in parcel.">
-				オブジェクトも販売価格に含まれます
-			</text>
-			<text name="Selling with no objects in parcel.">
-				オブジェクトは販売対象外です
-			</text>
-			<button label="土地販売の取り消し" label_selected="土地販売の取り消し" name="Cancel Land Sale"/>
-			<text name="Claimed:">
-				取得日時:
-			</text>
-			<text name="DateClaimText">
-				2006年8月15日火曜日13:47:25
-			</text>
-			<text name="PriceLabel">
-				面積:
-			</text>
-			<text name="PriceText">
-				4048平方メートル
-			</text>
-			<text name="Traffic:">
-				交通量:
-			</text>
-			<text name="DwellText">
-				誤
-			</text>
-			<button label="土地を購入..." label_selected="土地を購入..." left="130" name="Buy Land..." width="125"/>
-			<button label="グループ用に購入..." label_selected="グループ用に購入..." name="Buy For Group..."/>
-			<button label="入場許可を購入..." label_selected="入場許可を購入..." left="130" name="Buy Pass..." tool_tip="この土地への一時的なアクセスを許可します。" width="125"/>
-			<button label="土地を放棄..." label_selected="土地を放棄..." name="Abandon Land..."/>
-			<button label="土地の返還を要求..." label_selected="土地の返還を要求..." name="Reclaim Land..."/>
-			<button label="Lindenセール..." label_selected="Lindenセール..." name="Linden Sale..." tool_tip="土地が所有されており、コンテンツが設定されている必要があります。オークションの対象になっていないことも必要条件です。"/>
-		</panel>
-		<panel label="約款" name="land_covenant_panel">
-			<panel.string name="can_resell">
-				この地域で購入した土地は、再販できます。
-			</panel.string>
-			<panel.string name="can_not_resell">
-				この地域で購入した土地は、再販できないことがあります。
-			</panel.string>
-			<panel.string name="can_change">
-				この地域で購入した土地は、統合または再分割できます。
-			</panel.string>
-			<panel.string name="can_not_change">
-				この地域で購入した土地は、統合/再分割できないことが
-あります。
-			</panel.string>
-			<text font="SansSerifLarge" name="estate_section_lbl">
-				不動産:
-			</text>
-			<text name="estate_name_lbl">
-				名前:
-			</text>
-			<text name="estate_name_text">
-				メインランド
-			</text>
-			<text name="estate_owner_lbl">
-				オーナー:
-			</text>
-			<text name="estate_owner_text">
-				(なし)
-			</text>
-			<text_editor name="covenant_editor">
-				この不動産には約款がありません。
-			</text_editor>
-			<text name="covenant_timestamp_text">
-				最後の更新1969年12月31日水曜日16:00:00
-			</text>
-			<text font="SansSerifLarge" name="region_section_lbl">
-				地域:
-			</text>
-			<text name="region_name_lbl">
-				名前:
-			</text>
-			<text name="region_name_text">
-				Leyla
-			</text>
-			<text name="region_landtype_lbl">
-				種類:
-			</text>
-			<text name="region_landtype_text">
-				メインランド/ホームステッド
-			</text>
-			<text name="region_maturity_lbl">
-				区分:
-			</text>
-			<text name="region_maturity_text">
-				Adult
-			</text>
-			<text name="resellable_lbl">
-				再販:
-			</text>
-			<text name="resellable_clause">
-				この地域(リージョン)にある土地は再販できません。
-			</text>
-			<text name="changeable_lbl">
-				再分割:
-			</text>
-			<text name="changeable_clause">
-				この地域(リージョン)にある土地は統合または分割ができ
-ません。
-			</text>
-		</panel>
-		<panel label="オブジェクト" name="land_objects_panel">
-			<panel.string left="200" name="objects_available_text">
-				[MAX]の内[COUNT]([AVAILABLE]利用可能)
-			</panel.string>
-			<panel.string left="200" name="objects_deleted_text">
-				[MAX]の内[COUNT]([DELETED]を削除)
-			</panel.string>
-			<text name="parcel_object_bonus">
-				地域オブジェクトボーナス要因: [BONUS]
-			</text>
-			<text name="Simulator primitive usage:" width="500">
-				地域全体のプリム使用状況:
-			</text>
-			<text left="200" name="objects_available">
-				[MAX]の内[COUNT]([AVAILABLE]利用可能)
-			</text>
-			<text name="Primitives parcel supports:" width="200">
-				区画でサポートされるプリム数:
-			</text>
-			<text left="200" name="object_contrib_text">
-				[COUNT]
-			</text>
-			<text name="Primitives on parcel:">
-				区画上のプリム数:
-			</text>
-			<text left="200" name="total_objects_text">
-				[COUNT]
-			</text>
-			<text name="Owned by parcel owner:" width="300">
-				区画オーナーによる所有:
-			</text>
-			<text left="200" name="owner_objects_text">
-				[COUNT]
-			</text>
-			<button label="表示" label_selected="表示" name="ShowOwner" right="-145"/>
-			<button label="返却..." label_selected="返却..." name="ReturnOwner..." right="-15" tool_tip="オブジェクトをオーナーに返却します"/>
-			<text name="Set to group:">
-				グループに設定:
-			</text>
-			<text left="200" name="group_objects_text">
-				[COUNT]
-			</text>
-			<button label="表示" label_selected="表示" name="ShowGroup" right="-145"/>
-			<button label="返却..." label_selected="返却..." name="ReturnGroup..." right="-15" tool_tip="オブジェクトをオーナーに返却します"/>
-			<text name="Owned by others:">
-				他人による所有:
-			</text>
-			<text left="200" name="other_objects_text">
-				[COUNT]
-			</text>
-			<button label="表示" label_selected="表示" name="ShowOther" right="-145"/>
-			<button label="返却..." label_selected="返却..." name="ReturnOther..." right="-15" tool_tip="オブジェクトをオーナーに返却します"/>
-			<text name="Selected / sat upon:">
-				選択済み/決定済み:
-			</text>
-			<text left="200" name="selected_objects_text">
-				[COUNT]
-			</text>
-			<text name="Autoreturn" width="500">
-				他の住人のオブジェクトの自動返却(分、0で自動返却なし)
-			</text>
-			<line_editor left_delta="5" name="clean other time" right="-80"/>
-			<text name="Object Owners:" width="150">
-				オブジェクトのオーナー:
-			</text>
-			<button label="リスト更新" label_selected="リスト更新" left="146" name="Refresh List"/>
-			<button label="オブジェクトの返却..." label_selected="オブジェクトの返却..." left="256" name="Return objects..."/>
-			<name_list label="カウント" name="owner list">
-				<name_list.columns label="タイプ" name="type"/>
-				<name_list.columns name="online_status"/>
-				<name_list.columns label="名前" name="name"/>
-				<name_list.columns label="カウント" name="count"/>
-				<name_list.columns label="最新" name="mostrecent"/>
-			</name_list>
-		</panel>
-		<panel label="オプション" name="land_options_panel">
-			<panel.string name="search_enabled_tooltip">
-				この区画を検索結果に表示する
-			</panel.string>
-			<panel.string name="search_disabled_small_tooltip">
-				区画面積が128平方メートルかそれ以下のため、このオプションは無効です。
-大きな区画のみ検索に表示させることが可能です。
-			</panel.string>
-			<panel.string name="search_disabled_permissions_tooltip">
-				あなたはこの区画の設定編集ができないため、このオプションは無効です。
-			</panel.string>
-			<panel.string name="mature_check_mature">
-				Matureコンテンツ
-			</panel.string>
-			<panel.string name="mature_check_adult">
-				Adultコンテンツ
-			</panel.string>
-			<panel.string name="mature_check_mature_tooltip">
-				あなたの区画情報及びコンテンツはMatureとされています。
-			</panel.string>
-			<panel.string name="mature_check_adult_tooltip">
-				あなたの区画情報及びコンテンツはAdultとされています。
-			</panel.string>
-			<panel.string name="landing_point_none">
-				(なし)
-			</panel.string>
-			<panel.string name="push_restrict_text">
-				プッシングを制限
-			</panel.string>
-			<panel.string name="push_restrict_region_text">
-				プッシングを制限 (地域優先)
-			</panel.string>
-			<text name="allow_label">
-				他の住人に以下を許可:
-			</text>
-			<check_box label="地形を編集" name="edit land check" tool_tip="チェックを入れると、他人があなたの土地の地形編集を行うことが可能となります。このオプションのチェックを外しておくことをおすすめします。外した状態であなたの土地の地形編集が可能です。"/>
-			<check_box label="飛行" name="check fly" tool_tip="チェックを入れるとこの土地での飛行が可能となります。チェックを外すと土地に入る際と通り過ぎるときのみ飛行可能となります。"/>
-			<text left="138" name="allow_label2" width="144">
-				オブジェクトの作成:
-			</text>
-			<check_box label="すべての住人" left="280" name="edit objects check"/>
-			<check_box label="グループ" left="380" name="edit group objects check"/>
-			<text left="138" name="allow_label3" width="144">
-				オブジェクトの進入:
-			</text>
-			<check_box label="すべての住人" left="280" name="all object entry check"/>
-			<check_box label="グループ" left="380" name="group object entry check"/>
-			<text left="138" name="allow_label4" width="144">
-				スクリプトの実行:
-			</text>
-			<check_box label="すべての住人" left="280" name="check other scripts"/>
-			<check_box label="グループ" left="380" name="check group scripts"/>
-			<text name="land_options_label">
-				土地オプション:
-			</text>
-			<check_box label="安全(ダメージなし)" name="check safe" tool_tip="チェックを入れるとこの土地でのダメージコンバットが無効になり、「安全」に設定されます。 チェックを外すとダメージコンバットが有効になります。"/>
-			<check_box label="プッシングを制限" name="PushRestrictCheck" tool_tip="スクリプトによるプッシングを制限します。 このオプションを選択することにより、あなたの土地での破壊的行動を妨げることができます。"/>
-			<check_box label="検索に表示>(週L$30)以下の場所" name="ShowDirectoryCheck" tool_tip="検索結果でこの区画を表示させる"/>
-			<combo_box name="land category with adult">
-				<combo_box.item label="全カテゴリ" name="item0"/>
-				<combo_box.item label="Linden所在地" name="item1"/>
-				<combo_box.item label="Adult" name="item2"/>
-				<combo_box.item label="アートとカルチャー" name="item3"/>
-				<combo_box.item label="ビジネス" name="item4"/>
-				<combo_box.item label="教育的" name="item5"/>
-				<combo_box.item label="ゲーム" name="item6"/>
-				<combo_box.item label="たまり場" name="item7"/>
-				<combo_box.item label="新住人に好意的" name="item8"/>
-				<combo_box.item label="公園と自然" name="item9"/>
-				<combo_box.item label="住宅用" name="item10"/>
-				<combo_box.item label="ショッピング" name="item11"/>
-				<combo_box.item label="その他" name="item12"/>
-			</combo_box>
-			<combo_box name="land category">
-				<combo_box.item label="全カテゴリー" name="item0"/>
-				<combo_box.item label="Linden所在地" name="item1"/>
-				<combo_box.item label="アート&amp;カルチャー" name="item3"/>
-				<combo_box.item label="ビジネス" name="item4"/>
-				<combo_box.item label="教育的" name="item5"/>
-				<combo_box.item label="ゲーム" name="item6"/>
-				<combo_box.item label="たまり場" name="item7"/>
-				<combo_box.item label="新住人に好意的" name="item8"/>
-				<combo_box.item label="公園と自然" name="item9"/>
-				<combo_box.item label="住宅用" name="item10"/>
-				<combo_box.item label="ショッピング" name="item11"/>
-				<combo_box.item label="その他" name="item12"/>
-			</combo_box>
-			<check_box label="Matureコンテンツ" name="MatureCheck" tool_tip=""/>
-			<text name="Snapshot:">
-				スナップショット:
-			</text>
-			<texture_picker label="" left="116" name="snapshot_ctrl" tool_tip="写真をクリックして選択"/>
-			<text name="landing_point">
-				着地点: [LANDING]
-			</text>
-			<button label="設定" label_selected="設定" name="Set" tool_tip="訪問者の着地点の設定を行います。この区画内に立って行ってください。"/>
-			<button label="クリア" label_selected="クリア" name="Clear" tool_tip="着地点をクリアしてください。"/>
-			<text name="Teleport Routing: ">
-				テレポート制限:
-			</text>
-			<combo_box name="landing type" tool_tip="Teleport Routing -- select how to handle teleports onto your land.">
-				<combo_box.item label="不可" name="Blocked"/>
-				<combo_box.item label="着地点" name="LandingPoint"/>
-				<combo_box.item label="どこでも" name="Anywhere"/>
-			</combo_box>
-		</panel>
-		<panel label="メディア" name="land_media_panel">
-			<text name="with media:">
-				種類:
-			</text>
-			<combo_box name="media type" tool_tip="URL が動画、ウェブ・ページ、その他のメディアの場合に指定します"/>
-			<text name="at URL:">
-				ホーム URL:
-			</text>
-			<button label="設定..." label_selected="設定..." name="set_media_url"/>
-			<text name="CurrentURL:">
-				現在の URL:
-			</text>
-			<button label="リセット..." label_selected="リセット..." name="reset_media_url"/>
-			<check_box label="URL を非表示" name="hide_media_url" tool_tip="このオプションをオンにすると、許可なしでこの区画情報にアクセスしているユーザーにはメディア URL が表示されません。 これは HTML タイプには使用できませんのでご注意ください。"/>
-			<text name="Description:">
-				説明:
-			</text>
-			<line_editor name="url_description" tool_tip="[再生]/[ロード]ボタンの隣に表示されるテキスト"/>
-			<text name="Media texture:">
-				テクスチ
-ャ取替:
-			</text>
-			<texture_picker label="" name="media texture" tool_tip="写真をクリックして選択"/>
-			<text name="replace_texture_help" width="290">
-				このテクスチャを使用するオブジェクトのプレイをクリックすると、ムービーや Web ページを表示します。
-
-テクスチャを変更するにはサムネイルを選択してください。
-			</text>
-			<check_box label="スケールを自動設定" name="media_auto_scale" tool_tip="このオプションをチェックすると、この区画のコンテンツのスケールが自動的に設定されます。 動作速度と画質が少し低下することがありますが、他のテクスチャーのスケーリングや整列が必要になることはありません。"/>
-			<text name="media_size" tool_tip="レンダリングするウェブ・メディアのサイズ。デフォルトの 0 のままにします。">
-				サイズ:
-			</text>
-			<spinner name="media_size_width" tool_tip="レンダリングするウェブ・メディアのサイズ。デフォルトの 0 のままにします。"/>
-			<spinner name="media_size_height" tool_tip="レンダリングするウェブ・メディアのサイズ。デフォルトの 0 のままにします。"/>
-			<text name="pixels">
-				ピクセル
-			</text>
-			<text name="Options:">
-				オプション:
-			</text>
-			<check_box label="ループ" name="media_loop" tool_tip="メディアをループ再生します。  メディアの再生が終わったら、最初から再生し直します。"/>
-		</panel>
-		<panel label="オーディオ" name="land_audio_panel">
-			<text name="MusicURL:">
-				音楽 URL:
-			</text>
-			<text name="Sound:">
-				サウンド:
-			</text>
-			<check_box label="ジェスチャーとオブジェクトの音をこの区画だけに限定" name="check sound local"/>
-			<text name="Voice settings:">
-				ボイス:
-			</text>
-			<check_box label="ボイスを有効にする" name="parcel_enable_voice_channel"/>
-			<check_box label="ボイスを有効にする(不動産設定)" name="parcel_enable_voice_channel_is_estate_disabled"/>
-			<check_box label="この区画でのボイス使用を制限する" name="parcel_enable_voice_channel_parcel"/>
-		</panel>
-		<panel label="アクセス" name="land_access_panel">
-			<panel.string name="estate_override">
-				1つ以上のオプションが、不動産レベルで設定されています。
-			</panel.string>
-			<text name="Limit access to this parcel to:">
-				この区画にアクセス
-			</text>
-			<check_box label="パブリック・アクセスを許可" name="public_access"/>
-			<text name="Only Allow">
-				次の住人のアクセスをブロック:
-			</text>
-			<check_box label="Linden Labに支払い情報を登録していない住人" name="limit_payment" tool_tip="支払い情報未確認の住人を排除する"/>
-			<check_box label="年齢確認を済ませていない成人の住人" name="limit_age_verified" tool_tip="年齢確認を済ませていない住人を禁止します。 詳しい情報は [SUPPORT_SITE] をご覧下さい。"/>
-			<check_box label="グループ・アクセスを許可:[GROUP]" name="GroupCheck" tool_tip="[一般]タブで、グループを選択してください。"/>
-			<check_box label="入場許可を販売:" name="PassCheck" tool_tip="この区画への一時的なアクセスを許可"/>
-			<combo_box name="pass_combo">
-				<combo_box.item label="誰でも" name="Anyone"/>
-				<combo_box.item label="グループ" name="Group"/>
-			</combo_box>
-			<spinner label="価格(L$):" name="PriceSpin"/>
-			<spinner label="アクセス時間:" name="HoursSpin"/>
-			<text label="常に許可" name="AllowedText">
-				許可された住人
-			</text>
-			<name_list name="AccessList" tool_tip="([LISTED]リスト入り、[MAX]最大)"/>
-			<button label="追加..." label_selected="追加..." name="add_allowed"/>
-			<button label="削除" label_selected="削除" name="remove_allowed"/>
-			<text label="禁止" name="BanCheck">
-				禁止された住人
-			</text>
-			<name_list name="BannedList" tool_tip="([LISTED]リスト入り、[MAX]最大)"/>
-			<button label="追加..." label_selected="追加..." name="add_banned"/>
-			<button label="削除" label_selected="削除" name="remove_banned"/>
-		</panel>
-	</tab_container>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterland" title="土地情報">
+	<floater.string name="Minutes">
+		[MINUTES] 分
+	</floater.string>
+	<floater.string name="Minute">
+		分
+	</floater.string>
+	<floater.string name="Seconds">
+		[SECONDS] ç§’
+	</floater.string>
+	<tab_container name="landtab">
+		<panel label="一般" name="land_general_panel">
+			<panel.string name="new users only">
+				新規ユーザーのみ
+			</panel.string>
+			<panel.string name="anyone">
+				誰でも
+			</panel.string>
+			<panel.string name="area_text">
+				面積:
+			</panel.string>
+			<panel.string name="area_size_text">
+				[AREA]平方メートル
+			</panel.string>
+			<panel.string name="auction_id_text">
+				オークションID: [ID]
+			</panel.string>
+			<panel.string name="need_tier_to_modify">
+				この土地を修正変更するには、購入を承認する必要があります。
+			</panel.string>
+			<panel.string name="group_owned_text">
+				(グループ所有)
+			</panel.string>
+			<panel.string name="profile_text">
+				プロフィール...
+			</panel.string>
+			<panel.string name="info_text">
+				情報...
+			</panel.string>
+			<panel.string name="public_text">
+				(公共)
+			</panel.string>
+			<panel.string name="none_text">
+				(なし)
+			</panel.string>
+			<panel.string name="sale_pending_text">
+				(購入審査中)
+			</panel.string>
+			<panel.string name="no_selection_text">
+				区画が選定されていません。
+「世界」メニュー>「土地情報」に進むか、別の区画を選択して、詳細を表示します。
+			</panel.string>
+			<text name="Name:">
+				名前:
+			</text>
+			<line_editor name="Name"/>
+			<text name="Description:">
+				説明:
+			</text>
+			<text name="LandType">
+				種類:
+			</text>
+			<text name="LandTypeText">
+				メインランド/ホームステッド
+			</text>
+			<text name="ContentRating">
+				区分:
+			</text>
+			<text name="ContentRatingText">
+				Adult
+			</text>
+			<text name="Owner:">
+				オーナー:
+			</text>
+			<text name="OwnerText">
+				Leyla Linden
+			</text>
+			<button label="プロフィール..." label_selected="プロフィール..." name="Profile..."/>
+			<text name="Group:">
+				グループ:
+			</text>
+			<button label="設定..." label_selected="設定..." name="Set..."/>
+			<check_box label="グループへの譲渡を許可" name="check deed" tool_tip="グループ・オフィサーは、この土地をグループに譲渡し、グループの土地配分に委ねることができます。"/>
+			<button label="譲渡..." label_selected="譲渡..." name="Deed..." tool_tip="選択されたグループのオフィサーであるときのみ、土地を譲渡できます。"/>
+			<check_box label="オーナーが譲渡と共に寄付" name="check contrib" tool_tip="土地がグループに譲渡されるとき、前の所有者は譲渡が成立するよう、十分な土地を寄付します。"/>
+			<text name="For Sale:">
+				販売の有無:
+			</text>
+			<text name="Not for sale.">
+				販売対象外
+			</text>
+			<text name="For Sale: Price L$[PRICE].">
+				価格: L$[PRICE] (L$[PRICE_PER_SQM]/平方メートル)
+			</text>
+			<button label="土地を販売..." label_selected="土地を販売..." name="Sell Land..."/>
+			<text name="For sale to">
+				販売先:[BUYER]
+			</text>
+			<text name="Sell with landowners objects in parcel.">
+				オブジェクトも販売価格に含まれます
+			</text>
+			<text name="Selling with no objects in parcel.">
+				オブジェクトは販売対象外です
+			</text>
+			<button label="土地販売の取り消し" label_selected="土地販売の取り消し" name="Cancel Land Sale"/>
+			<text name="Claimed:">
+				取得日時:
+			</text>
+			<text name="DateClaimText">
+				2006年8月15日火曜日13:47:25
+			</text>
+			<text name="PriceLabel">
+				面積:
+			</text>
+			<text name="PriceText">
+				4048平方メートル
+			</text>
+			<text name="Traffic:">
+				交通量:
+			</text>
+			<text name="DwellText">
+				誤
+			</text>
+			<button label="土地を購入..." label_selected="土地を購入..." left="130" name="Buy Land..." width="125"/>
+			<button label="グループ用に購入..." label_selected="グループ用に購入..." name="Buy For Group..."/>
+			<button label="入場許可を購入..." label_selected="入場許可を購入..." left="130" name="Buy Pass..." tool_tip="この土地への一時的なアクセスを許可します。" width="125"/>
+			<button label="土地を放棄..." label_selected="土地を放棄..." name="Abandon Land..."/>
+			<button label="土地の返還を要求..." label_selected="土地の返還を要求..." name="Reclaim Land..."/>
+			<button label="Lindenセール..." label_selected="Lindenセール..." name="Linden Sale..." tool_tip="土地が所有されており、コンテンツが設定されている必要があります。オークションの対象になっていないことも必要条件です。"/>
+		</panel>
+		<panel label="約款" name="land_covenant_panel">
+			<panel.string name="can_resell">
+				この地域で購入した土地は、再販できます。
+			</panel.string>
+			<panel.string name="can_not_resell">
+				この地域で購入した土地は、再販できないことがあります。
+			</panel.string>
+			<panel.string name="can_change">
+				この地域で購入した土地は、統合または再分割できます。
+			</panel.string>
+			<panel.string name="can_not_change">
+				この地域で購入した土地は、統合/再分割できないことが
+あります。
+			</panel.string>
+			<text font="SansSerifLarge" name="estate_section_lbl">
+				不動産:
+			</text>
+			<text name="estate_name_lbl">
+				名前:
+			</text>
+			<text name="estate_name_text">
+				メインランド
+			</text>
+			<text name="estate_owner_lbl">
+				オーナー:
+			</text>
+			<text name="estate_owner_text">
+				(なし)
+			</text>
+			<text_editor name="covenant_editor">
+				この不動産には約款がありません。
+			</text_editor>
+			<text name="covenant_timestamp_text">
+				最後の更新1969年12月31日水曜日16:00:00
+			</text>
+			<text font="SansSerifLarge" name="region_section_lbl">
+				地域:
+			</text>
+			<text name="region_name_lbl">
+				名前:
+			</text>
+			<text name="region_name_text">
+				Leyla
+			</text>
+			<text name="region_landtype_lbl">
+				種類:
+			</text>
+			<text name="region_landtype_text">
+				メインランド/ホームステッド
+			</text>
+			<text name="region_maturity_lbl">
+				区分:
+			</text>
+			<text name="region_maturity_text">
+				Adult
+			</text>
+			<text name="resellable_lbl">
+				再販:
+			</text>
+			<text name="resellable_clause">
+				この地域(リージョン)にある土地は再販できません。
+			</text>
+			<text name="changeable_lbl">
+				再分割:
+			</text>
+			<text name="changeable_clause">
+				この地域(リージョン)にある土地は統合または分割ができ
+ません。
+			</text>
+		</panel>
+		<panel label="オブジェクト" name="land_objects_panel">
+			<panel.string left="200" name="objects_available_text">
+				[MAX]の内[COUNT]([AVAILABLE]利用可能)
+			</panel.string>
+			<panel.string left="200" name="objects_deleted_text">
+				[MAX]の内[COUNT]([DELETED]を削除)
+			</panel.string>
+			<text name="parcel_object_bonus">
+				地域オブジェクトボーナス要因: [BONUS]
+			</text>
+			<text name="Simulator primitive usage:" width="500">
+				地域全体のプリム使用状況:
+			</text>
+			<text left="200" name="objects_available">
+				[MAX]の内[COUNT]([AVAILABLE]利用可能)
+			</text>
+			<text name="Primitives parcel supports:" width="200">
+				区画でサポートされるプリム数:
+			</text>
+			<text left="200" name="object_contrib_text">
+				[COUNT]
+			</text>
+			<text name="Primitives on parcel:">
+				区画上のプリム数:
+			</text>
+			<text left="200" name="total_objects_text">
+				[COUNT]
+			</text>
+			<text name="Owned by parcel owner:" width="300">
+				区画オーナーによる所有:
+			</text>
+			<text left="200" name="owner_objects_text">
+				[COUNT]
+			</text>
+			<button label="表示" label_selected="表示" name="ShowOwner" right="-145"/>
+			<button label="返却..." label_selected="返却..." name="ReturnOwner..." right="-15" tool_tip="オブジェクトをオーナーに返却します"/>
+			<text name="Set to group:">
+				グループに設定:
+			</text>
+			<text left="200" name="group_objects_text">
+				[COUNT]
+			</text>
+			<button label="表示" label_selected="表示" name="ShowGroup" right="-145"/>
+			<button label="返却..." label_selected="返却..." name="ReturnGroup..." right="-15" tool_tip="オブジェクトをオーナーに返却します"/>
+			<text name="Owned by others:">
+				他人による所有:
+			</text>
+			<text left="200" name="other_objects_text">
+				[COUNT]
+			</text>
+			<button label="表示" label_selected="表示" name="ShowOther" right="-145"/>
+			<button label="返却..." label_selected="返却..." name="ReturnOther..." right="-15" tool_tip="オブジェクトをオーナーに返却します"/>
+			<text name="Selected / sat upon:">
+				選択済み/決定済み:
+			</text>
+			<text left="200" name="selected_objects_text">
+				[COUNT]
+			</text>
+			<text name="Autoreturn" width="500">
+				他の住人のオブジェクトの自動返却(分、0で自動返却なし)
+			</text>
+			<line_editor left_delta="5" name="clean other time" right="-80"/>
+			<text name="Object Owners:" width="150">
+				オブジェクトのオーナー:
+			</text>
+			<button label="リスト更新" label_selected="リスト更新" left="146" name="Refresh List"/>
+			<button label="オブジェクトの返却..." label_selected="オブジェクトの返却..." left="256" name="Return objects..."/>
+			<name_list label="カウント" name="owner list">
+				<name_list.columns label="タイプ" name="type"/>
+				<name_list.columns name="online_status"/>
+				<name_list.columns label="名前" name="name"/>
+				<name_list.columns label="カウント" name="count"/>
+				<name_list.columns label="最新" name="mostrecent"/>
+			</name_list>
+		</panel>
+		<panel label="オプション" name="land_options_panel">
+			<panel.string name="search_enabled_tooltip">
+				この区画を検索結果に表示する
+			</panel.string>
+			<panel.string name="search_disabled_small_tooltip">
+				区画面積が128平方メートルかそれ以下のため、このオプションは無効です。
+大きな区画のみ検索に表示させることが可能です。
+			</panel.string>
+			<panel.string name="search_disabled_permissions_tooltip">
+				あなたはこの区画の設定編集ができないため、このオプションは無効です。
+			</panel.string>
+			<panel.string name="mature_check_mature">
+				Matureコンテンツ
+			</panel.string>
+			<panel.string name="mature_check_adult">
+				Adultコンテンツ
+			</panel.string>
+			<panel.string name="mature_check_mature_tooltip">
+				あなたの区画情報及びコンテンツはMatureとされています。
+			</panel.string>
+			<panel.string name="mature_check_adult_tooltip">
+				あなたの区画情報及びコンテンツはAdultとされています。
+			</panel.string>
+			<panel.string name="landing_point_none">
+				(なし)
+			</panel.string>
+			<panel.string name="push_restrict_text">
+				プッシングを制限
+			</panel.string>
+			<panel.string name="push_restrict_region_text">
+				プッシングを制限 (地域優先)
+			</panel.string>
+			<text name="allow_label">
+				他の住人に以下を許可:
+			</text>
+			<check_box label="地形を編集" name="edit land check" tool_tip="チェックを入れると、他人があなたの土地の地形編集を行うことが可能となります。このオプションのチェックを外しておくことをおすすめします。外した状態であなたの土地の地形編集が可能です。"/>
+			<check_box label="飛行" name="check fly" tool_tip="チェックを入れるとこの土地での飛行が可能となります。チェックを外すと土地に入る際と通り過ぎるときのみ飛行可能となります。"/>
+			<text left="138" name="allow_label2" width="144">
+				オブジェクトの作成:
+			</text>
+			<check_box label="すべての住人" left="280" name="edit objects check"/>
+			<check_box label="グループ" left="380" name="edit group objects check"/>
+			<text left="138" name="allow_label3" width="144">
+				オブジェクトの進入:
+			</text>
+			<check_box label="すべての住人" left="280" name="all object entry check"/>
+			<check_box label="グループ" left="380" name="group object entry check"/>
+			<text left="138" name="allow_label4" width="144">
+				スクリプトの実行:
+			</text>
+			<check_box label="すべての住人" left="280" name="check other scripts"/>
+			<check_box label="グループ" left="380" name="check group scripts"/>
+			<text name="land_options_label">
+				土地オプション:
+			</text>
+			<check_box label="安全(ダメージなし)" name="check safe" tool_tip="チェックを入れるとこの土地でのダメージコンバットが無効になり、「安全」に設定されます。 チェックを外すとダメージコンバットが有効になります。"/>
+			<check_box label="プッシングを制限" name="PushRestrictCheck" tool_tip="スクリプトによるプッシングを制限します。 このオプションを選択することにより、あなたの土地での破壊的行動を妨げることができます。"/>
+			<check_box label="検索に表示>(週L$30)以下の場所" name="ShowDirectoryCheck" tool_tip="検索結果でこの区画を表示させる"/>
+			<combo_box name="land category with adult">
+				<combo_box.item label="全カテゴリ" name="item0"/>
+				<combo_box.item label="Linden所在地" name="item1"/>
+				<combo_box.item label="Adult" name="item2"/>
+				<combo_box.item label="アートとカルチャー" name="item3"/>
+				<combo_box.item label="ビジネス" name="item4"/>
+				<combo_box.item label="教育的" name="item5"/>
+				<combo_box.item label="ゲーム" name="item6"/>
+				<combo_box.item label="たまり場" name="item7"/>
+				<combo_box.item label="新住人に好意的" name="item8"/>
+				<combo_box.item label="公園と自然" name="item9"/>
+				<combo_box.item label="住宅用" name="item10"/>
+				<combo_box.item label="ショッピング" name="item11"/>
+				<combo_box.item label="その他" name="item12"/>
+			</combo_box>
+			<combo_box name="land category">
+				<combo_box.item label="全カテゴリー" name="item0"/>
+				<combo_box.item label="Linden所在地" name="item1"/>
+				<combo_box.item label="アート&amp;カルチャー" name="item3"/>
+				<combo_box.item label="ビジネス" name="item4"/>
+				<combo_box.item label="教育的" name="item5"/>
+				<combo_box.item label="ゲーム" name="item6"/>
+				<combo_box.item label="たまり場" name="item7"/>
+				<combo_box.item label="新住人に好意的" name="item8"/>
+				<combo_box.item label="公園と自然" name="item9"/>
+				<combo_box.item label="住宅用" name="item10"/>
+				<combo_box.item label="ショッピング" name="item11"/>
+				<combo_box.item label="その他" name="item12"/>
+			</combo_box>
+			<check_box label="Matureコンテンツ" name="MatureCheck" tool_tip=""/>
+			<text name="Snapshot:">
+				スナップショット:
+			</text>
+			<texture_picker label="" left="116" name="snapshot_ctrl" tool_tip="写真をクリックして選択"/>
+			<text name="landing_point">
+				着地点: [LANDING]
+			</text>
+			<button label="設定" label_selected="設定" name="Set" tool_tip="訪問者の着地点の設定を行います。この区画内に立って行ってください。"/>
+			<button label="クリア" label_selected="クリア" name="Clear" tool_tip="着地点をクリアしてください。"/>
+			<text name="Teleport Routing: ">
+				テレポート制限:
+			</text>
+			<combo_box name="landing type" tool_tip="Teleport Routing -- select how to handle teleports onto your land.">
+				<combo_box.item label="不可" name="Blocked"/>
+				<combo_box.item label="着地点" name="LandingPoint"/>
+				<combo_box.item label="どこでも" name="Anywhere"/>
+			</combo_box>
+		</panel>
+		<panel label="メディア" name="land_media_panel">
+			<text name="with media:">
+				種類:
+			</text>
+			<combo_box name="media type" tool_tip="URL が動画、ウェブ・ページ、その他のメディアの場合に指定します"/>
+			<text name="at URL:">
+				ホーム URL:
+			</text>
+			<button label="設定..." label_selected="設定..." name="set_media_url"/>
+			<text name="CurrentURL:">
+				現在の URL:
+			</text>
+			<button label="リセット..." label_selected="リセット..." name="reset_media_url"/>
+			<check_box label="URL を非表示" name="hide_media_url" tool_tip="このオプションをオンにすると、許可なしでこの区画情報にアクセスしているユーザーにはメディア URL が表示されません。 これは HTML タイプには使用できませんのでご注意ください。"/>
+			<text name="Description:">
+				説明:
+			</text>
+			<line_editor name="url_description" tool_tip="[再生]/[ロード]ボタンの隣に表示されるテキスト"/>
+			<text name="Media texture:">
+				テクスチ
+ャ取替:
+			</text>
+			<texture_picker label="" name="media texture" tool_tip="写真をクリックして選択"/>
+			<text name="replace_texture_help" width="290">
+				このテクスチャを使用するオブジェクトのプレイをクリックすると、ムービーや Web ページを表示します。
+
+テクスチャを変更するにはサムネイルを選択してください。
+			</text>
+			<check_box label="スケールを自動設定" name="media_auto_scale" tool_tip="このオプションをチェックすると、この区画のコンテンツのスケールが自動的に設定されます。 動作速度と画質が少し低下することがありますが、他のテクスチャーのスケーリングや整列が必要になることはありません。"/>
+			<text name="media_size" tool_tip="レンダリングするウェブ・メディアのサイズ。デフォルトの 0 のままにします。">
+				サイズ:
+			</text>
+			<spinner name="media_size_width" tool_tip="レンダリングするウェブ・メディアのサイズ。デフォルトの 0 のままにします。"/>
+			<spinner name="media_size_height" tool_tip="レンダリングするウェブ・メディアのサイズ。デフォルトの 0 のままにします。"/>
+			<text name="pixels">
+				ピクセル
+			</text>
+			<text name="Options:">
+				オプション:
+			</text>
+			<check_box label="ループ" name="media_loop" tool_tip="メディアをループ再生します。  メディアの再生が終わったら、最初から再生し直します。"/>
+		</panel>
+		<panel label="オーディオ" name="land_audio_panel">
+			<text name="MusicURL:">
+				音楽 URL:
+			</text>
+			<text name="Sound:">
+				サウンド:
+			</text>
+			<check_box label="ジェスチャーとオブジェクトの音をこの区画だけに限定" name="check sound local"/>
+			<text name="Voice settings:">
+				ボイス:
+			</text>
+			<check_box label="ボイスを有効にする" name="parcel_enable_voice_channel"/>
+			<check_box label="ボイスを有効にする(不動産設定)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+			<check_box label="この区画でのボイス使用を制限する" name="parcel_enable_voice_channel_parcel"/>
+		</panel>
+		<panel label="アクセス" name="land_access_panel">
+			<panel.string name="estate_override">
+				1つ以上のオプションが、不動産レベルで設定されています。
+			</panel.string>
+			<text name="Limit access to this parcel to:">
+				この区画にアクセス
+			</text>
+			<check_box label="パブリック・アクセスを許可" name="public_access"/>
+			<text name="Only Allow">
+				次の住人のアクセスをブロック:
+			</text>
+			<check_box label="Linden Labに支払い情報を登録していない住人" name="limit_payment" tool_tip="支払い情報未確認の住人を排除する"/>
+			<check_box label="年齢確認を済ませていない成人の住人" name="limit_age_verified" tool_tip="年齢確認を済ませていない住人を禁止します。 詳しい情報は [SUPPORT_SITE] をご覧下さい。"/>
+			<check_box label="グループ・アクセスを許可:[GROUP]" name="GroupCheck" tool_tip="[一般]タブで、グループを選択してください。"/>
+			<check_box label="入場許可を販売:" name="PassCheck" tool_tip="この区画への一時的なアクセスを許可"/>
+			<combo_box name="pass_combo">
+				<combo_box.item label="誰でも" name="Anyone"/>
+				<combo_box.item label="グループ" name="Group"/>
+			</combo_box>
+			<spinner label="価格(L$):" name="PriceSpin"/>
+			<spinner label="アクセス時間:" name="HoursSpin"/>
+			<text label="常に許可" name="AllowedText">
+				許可された住人
+			</text>
+			<name_list name="AccessList" tool_tip="([LISTED]リスト入り、[MAX]最大)"/>
+			<button label="追加..." label_selected="追加..." name="add_allowed"/>
+			<button label="削除" label_selected="削除" name="remove_allowed"/>
+			<text label="禁止" name="BanCheck">
+				禁止された住人
+			</text>
+			<name_list name="BannedList" tool_tip="([LISTED]リスト入り、[MAX]最大)"/>
+			<button label="追加..." label_selected="追加..." name="add_banned"/>
+			<button label="削除" label_selected="削除" name="remove_banned"/>
+		</panel>
+	</tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_animation_preview.xml b/indra/newview/skins/default/xui/ja/floater_animation_preview.xml
index 1bc12b839ce..a1c30ec5726 100644
--- a/indra/newview/skins/default/xui/ja/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_animation_preview.xml
@@ -1,183 +1,183 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Animation Preview" title="">
-	<floater.string name="failed_to_initialize">
-		モーションを初期化できませんでした
-	</floater.string>
-	<floater.string name="anim_too_long">
-		アニメーションファイルの長さは[LENGTH]秒です。
-
-アニメーションの最大の長さは[MAX_LENGTH]秒です。
-	</floater.string>
-	<floater.string name="failed_file_read">
-		アニメーションファイルを読み取れません。
-
-[STATUS]
-	</floater.string>
-	<floater.string name="E_ST_OK">
-		Ok
-	</floater.string>
-	<floater.string name="E_ST_EOF">
-		不完全なファイル。
-	</floater.string>
-	<floater.string name="E_ST_NO_CONSTRAINT">
-		制約定義を読みとれません。
-	</floater.string>
-	<floater.string name="E_ST_NO_FILE">
-		BVH ファイルを開けません。
-	</floater.string>
-	<floater.string name="E_ST_NO_HIER">
-		無効な HIERARCHY ヘッダーです。.
-	</floater.string>
-	<floater.string name="E_ST_NO_JOINT">
-		ROOT または JOINT が見つかりません。
-	</floater.string>
-	<floater.string name="E_ST_NO_NAME">
-		JOINT ネームを取得できません。
-	</floater.string>
-	<floater.string name="E_ST_NO_OFFSET">
-		OFFSET が見つかりません。
-	</floater.string>
-	<floater.string name="E_ST_NO_CHANNELS">
-		CHANNELS が見つかりません。
-	</floater.string>
-	<floater.string name="E_ST_NO_ROTATION">
-		回転順序を取得できません。
-	</floater.string>
-	<floater.string name="E_ST_NO_AXIS">
-		回転軸を取得できません。
-	</floater.string>
-	<floater.string name="E_ST_NO_MOTION">
-		MOTION が見つかりません。
-	</floater.string>
-	<floater.string name="E_ST_NO_FRAMES">
-		フレーム数を取得できません。
-	</floater.string>
-	<floater.string name="E_ST_NO_FRAME_TIME">
-		フレームタイムを取得できません。
-	</floater.string>
-	<floater.string name="E_ST_NO_POS">
-		ポジション値を取得できません。
-	</floater.string>
-	<floater.string name="E_ST_NO_ROT">
-		回転値を取得できません。
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_FILE">
-		Cannot open translation file.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_HEADER">
-		Cannot read translation header.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_NAME">
-		Cannot read translation names.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_IGNORE">
-		Cannot read translation ignore value.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_RELATIVE">
-		Cannot read translation relative value.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_OUTNAME">
-		Cannot read translation outname value.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_MATRIX">
-		Cannot read translation matrix.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_MERGECHILD">
-		Mergechild 名を取得できません。
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_MERGEPARENT">
-		Mergeparent 名を取得できません。
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_PRIORITY">
-		プロパティ値を取得できません。
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_LOOP">
-		ループ値を取得できません。
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_EASEIN">
-		Cannot get easeIn values.
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_EASEOUT">
-		easeOut 値を取得できません。
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_HAND">
-		Hand morph 値を取得できません。
-	</floater.string>
-	<floater.string name="E_ST_NO_XLT_EMOTE">
-		エモート名を読みとれません。
-	</floater.string>
-	<text name="name_label">
-		名前:
-	</text>
-	<text name="description_label">
-		説明:
-	</text>
-	<spinner label="優先順位" name="priority" tool_tip="このアニメーションで上書き可能な他のアニメーションを制御します。"/>
-	<check_box label="ループ" name="loop_check" tool_tip="このアニメーションをループ再生します。"/>
-	<spinner label="イン(%)" label_width="45" left="70" name="loop_in_point" tool_tip="アニメーションのループ復帰点を設定します。" width="100"/>
-	<spinner label="アウト(%)" label_width="60" left="170" name="loop_out_point" tool_tip="アニメーションのループ終了点を設定します。" width="100"/>
-	<text name="hand_label">
-		手の動き
-	</text>
-	<combo_box label="" name="hand_pose_combo" tool_tip="アニメーションの手の動きをコントロールします。">
-		<combo_box.item label="広がる" name="Spread"/>
-		<combo_box.item label="リラックス" name="Relaxed"/>
-		<combo_box.item label="両方を指す" name="PointBoth"/>
-		<combo_box.item label="拳" name="Fist"/>
-		<combo_box.item label="リラックス左" name="RelaxedLeft"/>
-		<combo_box.item label="左を指す" name="PointLeft"/>
-		<combo_box.item label="拳左" name="FistLeft"/>
-		<combo_box.item label="リラックス右" name="RelaxedRight"/>
-		<combo_box.item label="右を指す" name="PointRight"/>
-		<combo_box.item label="拳右" name="FistRight"/>
-		<combo_box.item label="敬礼右" name="SaluteRight"/>
-		<combo_box.item label="入力する" name="Typing"/>
-		<combo_box.item label="ピース・サイン右" name="PeaceRight"/>
-	</combo_box>
-	<text name="emote_label">
-		表現
-	</text>
-	<combo_box label="" name="emote_combo" tool_tip="アニメーションの顔を表情をコントロールします。">
-		<combo_box.item label="None]" name="[None]"/>
-		<combo_box.item label="アーーーーー" name="Aaaaah"/>
-		<combo_box.item label="怖れ" name="Afraid"/>
-		<combo_box.item label="怒り" name="Angry"/>
-		<combo_box.item label="満面の笑み" name="BigSmile"/>
-		<combo_box.item label="退屈" name="Bored"/>
-		<combo_box.item label="泣く" name="Cry"/>
-		<combo_box.item label="侮蔑" name="Disdain"/>
-		<combo_box.item label="困惑" name="Embarrassed"/>
-		<combo_box.item label="しかめっ面" name="Frown"/>
-		<combo_box.item label="キス" name="Kiss"/>
-		<combo_box.item label="笑う" name="Laugh"/>
-		<combo_box.item label="Plllppt" name="Plllppt"/>
-		<combo_box.item label="嫌悪感" name="Repulsed"/>
-		<combo_box.item label="悲しい" name="Sad"/>
-		<combo_box.item label="肩をすくめる" name="Shrug"/>
-		<combo_box.item label="笑み" name="Smile"/>
-		<combo_box.item label="驚き" name="Surprise"/>
-		<combo_box.item label="ウィンク" name="Wink"/>
-		<combo_box.item label="心配" name="Worry"/>
-	</combo_box>
-	<text name="preview_label">
-		同時進行行動
-	</text>
-	<combo_box label="" name="preview_base_anim" tool_tip="アバターが普通の行動をするときのアニメーションの動きをテストするためにこれを使います。">
-		<combo_box.item label="立つ" name="Standing"/>
-		<combo_box.item label="歩く" name="Walking"/>
-		<combo_box.item label="座る" name="Sitting"/>
-		<combo_box.item label="飛行" name="Flying"/>
-	</combo_box>
-	<spinner label="フェーズイン(秒)" name="ease_in_time" tool_tip="アニメーションのブレンド・イン時間(秒)"/>
-	<spinner label="フェーズアウト(秒)" name="ease_out_time" tool_tip="アニメーションのブレンド・アウト時間(秒)"/>
-	<button label="" name="play_btn" tool_tip="アニメーションの再生/一時停止"/>
-	<button label="" name="stop_btn" tool_tip="アニメーションの再生を停止"/>
-	<slider label="" name="playback_slider"/>
-	<text name="bad_animation_text">
-		アニメーション・ファイルを読み込めません。
- 
- Poser 4からエクスポートされたBVHファイルを推奨します。
-	</text>
-	<button label="取り消し" name="cancel_btn"/>
-	<button label="アップロードL$[AMOUNT]" name="ok_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Animation Preview" title="">
+	<floater.string name="failed_to_initialize">
+		モーションを初期化できませんでした
+	</floater.string>
+	<floater.string name="anim_too_long">
+		アニメーションファイルの長さは[LENGTH]秒です。
+
+アニメーションの最大の長さは[MAX_LENGTH]秒です。
+	</floater.string>
+	<floater.string name="failed_file_read">
+		アニメーションファイルを読み取れません。
+
+[STATUS]
+	</floater.string>
+	<floater.string name="E_ST_OK">
+		Ok
+	</floater.string>
+	<floater.string name="E_ST_EOF">
+		不完全なファイル。
+	</floater.string>
+	<floater.string name="E_ST_NO_CONSTRAINT">
+		制約定義を読みとれません。
+	</floater.string>
+	<floater.string name="E_ST_NO_FILE">
+		BVH ファイルを開けません。
+	</floater.string>
+	<floater.string name="E_ST_NO_HIER">
+		無効な HIERARCHY ヘッダーです。.
+	</floater.string>
+	<floater.string name="E_ST_NO_JOINT">
+		ROOT または JOINT が見つかりません。
+	</floater.string>
+	<floater.string name="E_ST_NO_NAME">
+		JOINT ネームを取得できません。
+	</floater.string>
+	<floater.string name="E_ST_NO_OFFSET">
+		OFFSET が見つかりません。
+	</floater.string>
+	<floater.string name="E_ST_NO_CHANNELS">
+		CHANNELS が見つかりません。
+	</floater.string>
+	<floater.string name="E_ST_NO_ROTATION">
+		回転順序を取得できません。
+	</floater.string>
+	<floater.string name="E_ST_NO_AXIS">
+		回転軸を取得できません。
+	</floater.string>
+	<floater.string name="E_ST_NO_MOTION">
+		MOTION が見つかりません。
+	</floater.string>
+	<floater.string name="E_ST_NO_FRAMES">
+		フレーム数を取得できません。
+	</floater.string>
+	<floater.string name="E_ST_NO_FRAME_TIME">
+		フレームタイムを取得できません。
+	</floater.string>
+	<floater.string name="E_ST_NO_POS">
+		ポジション値を取得できません。
+	</floater.string>
+	<floater.string name="E_ST_NO_ROT">
+		回転値を取得できません。
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_FILE">
+		Cannot open translation file.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_HEADER">
+		Cannot read translation header.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_NAME">
+		Cannot read translation names.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_IGNORE">
+		Cannot read translation ignore value.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_RELATIVE">
+		Cannot read translation relative value.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_OUTNAME">
+		Cannot read translation outname value.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_MATRIX">
+		Cannot read translation matrix.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_MERGECHILD">
+		Mergechild 名を取得できません。
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_MERGEPARENT">
+		Mergeparent 名を取得できません。
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_PRIORITY">
+		プロパティ値を取得できません。
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_LOOP">
+		ループ値を取得できません。
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_EASEIN">
+		Cannot get easeIn values.
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_EASEOUT">
+		easeOut 値を取得できません。
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_HAND">
+		Hand morph 値を取得できません。
+	</floater.string>
+	<floater.string name="E_ST_NO_XLT_EMOTE">
+		エモート名を読みとれません。
+	</floater.string>
+	<text name="name_label">
+		名前:
+	</text>
+	<text name="description_label">
+		説明:
+	</text>
+	<spinner label="優先順位" name="priority" tool_tip="このアニメーションで上書き可能な他のアニメーションを制御します。"/>
+	<check_box label="ループ" name="loop_check" tool_tip="このアニメーションをループ再生します。"/>
+	<spinner label="イン(%)" label_width="45" left="70" name="loop_in_point" tool_tip="アニメーションのループ復帰点を設定します。" width="100"/>
+	<spinner label="アウト(%)" label_width="60" left="170" name="loop_out_point" tool_tip="アニメーションのループ終了点を設定します。" width="100"/>
+	<text name="hand_label">
+		手の動き
+	</text>
+	<combo_box label="" name="hand_pose_combo" tool_tip="アニメーションの手の動きをコントロールします。">
+		<combo_box.item label="広がる" name="Spread"/>
+		<combo_box.item label="リラックス" name="Relaxed"/>
+		<combo_box.item label="両方を指す" name="PointBoth"/>
+		<combo_box.item label="拳" name="Fist"/>
+		<combo_box.item label="リラックス左" name="RelaxedLeft"/>
+		<combo_box.item label="左を指す" name="PointLeft"/>
+		<combo_box.item label="拳左" name="FistLeft"/>
+		<combo_box.item label="リラックス右" name="RelaxedRight"/>
+		<combo_box.item label="右を指す" name="PointRight"/>
+		<combo_box.item label="拳右" name="FistRight"/>
+		<combo_box.item label="敬礼右" name="SaluteRight"/>
+		<combo_box.item label="入力する" name="Typing"/>
+		<combo_box.item label="ピース・サイン右" name="PeaceRight"/>
+	</combo_box>
+	<text name="emote_label">
+		表現
+	</text>
+	<combo_box label="" name="emote_combo" tool_tip="アニメーションの顔を表情をコントロールします。">
+		<combo_box.item label="None]" name="[None]"/>
+		<combo_box.item label="アーーーーー" name="Aaaaah"/>
+		<combo_box.item label="怖れ" name="Afraid"/>
+		<combo_box.item label="怒り" name="Angry"/>
+		<combo_box.item label="満面の笑み" name="BigSmile"/>
+		<combo_box.item label="退屈" name="Bored"/>
+		<combo_box.item label="泣く" name="Cry"/>
+		<combo_box.item label="侮蔑" name="Disdain"/>
+		<combo_box.item label="困惑" name="Embarrassed"/>
+		<combo_box.item label="しかめっ面" name="Frown"/>
+		<combo_box.item label="キス" name="Kiss"/>
+		<combo_box.item label="笑う" name="Laugh"/>
+		<combo_box.item label="Plllppt" name="Plllppt"/>
+		<combo_box.item label="嫌悪感" name="Repulsed"/>
+		<combo_box.item label="悲しい" name="Sad"/>
+		<combo_box.item label="肩をすくめる" name="Shrug"/>
+		<combo_box.item label="笑み" name="Smile"/>
+		<combo_box.item label="驚き" name="Surprise"/>
+		<combo_box.item label="ウィンク" name="Wink"/>
+		<combo_box.item label="心配" name="Worry"/>
+	</combo_box>
+	<text name="preview_label">
+		同時進行行動
+	</text>
+	<combo_box label="" name="preview_base_anim" tool_tip="アバターが普通の行動をするときのアニメーションの動きをテストするためにこれを使います。">
+		<combo_box.item label="立つ" name="Standing"/>
+		<combo_box.item label="歩く" name="Walking"/>
+		<combo_box.item label="座る" name="Sitting"/>
+		<combo_box.item label="飛行" name="Flying"/>
+	</combo_box>
+	<spinner label="フェーズイン(秒)" name="ease_in_time" tool_tip="アニメーションのブレンド・イン時間(秒)"/>
+	<spinner label="フェーズアウト(秒)" name="ease_out_time" tool_tip="アニメーションのブレンド・アウト時間(秒)"/>
+	<button label="" name="play_btn" tool_tip="アニメーションの再生/一時停止"/>
+	<button label="" name="stop_btn" tool_tip="アニメーションの再生を停止"/>
+	<slider label="" name="playback_slider"/>
+	<text name="bad_animation_text">
+		アニメーション・ファイルを読み込めません。
+ 
+ Poser 4からエクスポートされたBVHファイルを推奨します。
+	</text>
+	<button label="取り消し" name="cancel_btn"/>
+	<button label="アップロードL$[AMOUNT]" name="ok_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml b/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml
index eebc7eb88e6..df60f52ee8e 100644
--- a/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml
@@ -1,40 +1,40 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater min_width="275" name="avatarpicker" title="住人を選択" width="275">
-	<tab_container name="ResidentChooserTabs" width="265">
-		<panel label="検索" name="SearchPanel" width="145">
-			<text name="InstructSearchResidentName">
-				名前の一部を入力:
-			</text>
-			<button label="検索" label_selected="検索" name="Find"/>
-		</panel>
-		<panel label="コーリングカード" name="CallingCardsPanel" width="145">
-			<text name="InstructSelectCallingCard">
-				コーリングカードを選択:
-			</text>
-		</panel>
-		<panel label="自分の近く" name="NearMePanel" width="145">
-			<text name="InstructSelectResident">
-				近くの人を選択:
-			</text>
-			<button label="リスト更新" label_selected="リスト更新" name="Refresh"/>
-			<slider label="範囲" name="near_me_range"/>
-			<text name="meters" width="50">
-				メートル
-			</text>
-		</panel>
-	</tab_container>
-	<button label="OK" label_selected="OK" name="Select"/>
-	<button label="取り消し" label_selected="取り消し" name="Cancel"/>
-	<string name="not_found">
-		「[TEXT]」は見つかりませんでした
-	</string>
-	<string name="no_one_near">
-		近くに誰もいません
-	</string>
-	<string name="no_results">
-		検索結果:ゼロ
-	</string>
-	<string name="searching">
-		検索中...
-	</string>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater min_width="275" name="avatarpicker" title="住人を選択" width="275">
+	<tab_container name="ResidentChooserTabs" width="265">
+		<panel label="検索" name="SearchPanel" width="145">
+			<text name="InstructSearchResidentName">
+				名前の一部を入力:
+			</text>
+			<button label="検索" label_selected="検索" name="Find"/>
+		</panel>
+		<panel label="コーリングカード" name="CallingCardsPanel" width="145">
+			<text name="InstructSelectCallingCard">
+				コーリングカードを選択:
+			</text>
+		</panel>
+		<panel label="自分の近く" name="NearMePanel" width="145">
+			<text name="InstructSelectResident">
+				近くの人を選択:
+			</text>
+			<button label="リスト更新" label_selected="リスト更新" name="Refresh"/>
+			<slider label="範囲" name="near_me_range"/>
+			<text name="meters" width="50">
+				メートル
+			</text>
+		</panel>
+	</tab_container>
+	<button label="OK" label_selected="OK" name="Select"/>
+	<button label="取り消し" label_selected="取り消し" name="Cancel"/>
+	<string name="not_found">
+		「[TEXT]」は見つかりませんでした
+	</string>
+	<string name="no_one_near">
+		近くに誰もいません
+	</string>
+	<string name="no_results">
+		検索結果:ゼロ
+	</string>
+	<string name="searching">
+		検索中...
+	</string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_beacons.xml b/indra/newview/skins/default/xui/ja/floater_beacons.xml
index 4e89e11d0d2..d2f4798949f 100644
--- a/indra/newview/skins/default/xui/ja/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/ja/floater_beacons.xml
@@ -1,21 +1,21 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="beacons" title="ビーコン(標識)">
-	<panel name="beacons_panel">
-		<text name="label_show">
-			表示:
-		</text>
-		<check_box label="ビーコン(標識)" name="beacons"/>
-		<check_box label="ハイライト" name="highlights"/>
-		<text name="beacon_width_label" tool_tip="ビーコン(標識)の幅">
-			幅:
-		</text>
-		<text name="label_objects">
-			対象オブジェクト:
-		</text>
-		<check_box label="物理的" name="physical"/>
-		<check_box label="スクリプト" name="scripted"/>
-		<check_box label="触れる" name="touch_only"/>
-		<check_box label="音源" name="sounds"/>
-		<check_box label="パーティクル源" name="particles"/>
-	</panel>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="beacons" title="ビーコン(標識)">
+	<panel name="beacons_panel">
+		<text name="label_show">
+			表示:
+		</text>
+		<check_box label="ビーコン(標識)" name="beacons"/>
+		<check_box label="ハイライト" name="highlights"/>
+		<text name="beacon_width_label" tool_tip="ビーコン(標識)の幅">
+			幅:
+		</text>
+		<text name="label_objects">
+			対象オブジェクト:
+		</text>
+		<check_box label="物理的" name="physical"/>
+		<check_box label="スクリプト" name="scripted"/>
+		<check_box label="触れる" name="touch_only"/>
+		<check_box label="音源" name="sounds"/>
+		<check_box label="パーティクル源" name="particles"/>
+	</panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_build_options.xml b/indra/newview/skins/default/xui/ja/floater_build_options.xml
index 8b5e88fa7f4..02bc0dd5f77 100644
--- a/indra/newview/skins/default/xui/ja/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/ja/floater_build_options.xml
@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="build options floater" title="グリッドのオプション">
-	<spinner label="グリッドユニット(メートル)" name="GridResolution"/>
-	<spinner label="グリッド範囲(メートル)" name="GridDrawSize"/>
-	<check_box label="サブユニットにスナップ" name="GridSubUnit"/>
-	<check_box label="横断面を表示" name="GridCrossSection"/>
-	<text name="grid_opacity_label" tool_tip="グリッドの透明度">
-		透明度:
-	</text>
-	<slider label="グリッドの不透明度" name="GridOpacity"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="build options floater" title="グリッドのオプション">
+	<spinner label="グリッドユニット(メートル)" name="GridResolution"/>
+	<spinner label="グリッド範囲(メートル)" name="GridDrawSize"/>
+	<check_box label="サブユニットにスナップ" name="GridSubUnit"/>
+	<check_box label="横断面を表示" name="GridCrossSection"/>
+	<text name="grid_opacity_label" tool_tip="グリッドの透明度">
+		透明度:
+	</text>
+	<slider label="グリッドの不透明度" name="GridOpacity"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml
index b86a3647fe3..9a3d432228d 100644
--- a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml
@@ -1,53 +1,53 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="コンテンツ権限を編集">
-	<floater.string name="nothing_to_modify_text">
-		選択した中に編集できないコンテンツが含まれています
-	</floater.string>
-	<floater.string name="status_text">
-		[NAME]に権限を設定中です。
-	</floater.string>
-	<floater.string name="start_text">
-		権限変更リクエストをしています
-	</floater.string>
-	<floater.string name="done_text">
-		権限変更リクエストが完了しました
-	</floater.string>
-	<check_box label="アニメーション" name="check_animation"/>
-	<icon name="icon_animation" tool_tip="アニメーション"/>
-	<check_box label="身体部位" name="check_bodypart"/>
-	<icon name="icon_bodypart" tool_tip="身体部位"/>
-	<check_box label="服" name="check_clothing"/>
-	<icon name="icon_clothing" tool_tip="衣類"/>
-	<check_box label="ジェスチャー" name="check_gesture"/>
-	<icon name="icon_gesture" tool_tip="ジェスチャー"/>
-	<check_box label="ノートカード" name="check_notecard"/>
-	<icon name="icon_notecard" tool_tip="ノートカード"/>
-	<check_box label="オブジェクト" name="check_object"/>
-	<icon name="icon_object" tool_tip="オブジェクト"/>
-	<check_box label="スクリプト" name="check_script"/>
-	<icon name="icon_script" tool_tip="スクリプト"/>
-	<check_box label="サウンド" name="check_sound"/>
-	<icon name="icon_sound" tool_tip="サウンド"/>
-	<check_box label="テクスチャー" name="check_texture"/>
-	<button label="√ すべて" label_selected="全て" name="check_all"/>
-	<button label="クリア" label_selected="なし" name="check_none"/>
-	<text name="newperms">
-		新しいコンテンツ権限
-	</text>
-	<text name="GroupLabel">
-		グループ:
-	</text>
-	<check_box label="共有" name="share_with_group"/>
-	<text name="AnyoneLabel">
-		すべての人:
-	</text>
-	<check_box label="コピー" name="everyone_copy"/>
-	<text name="NextOwnerLabel">
-		次の所有者:
-	</text>
-	<check_box label="修正" name="next_owner_modify"/>
-	<check_box label="コピー" name="next_owner_copy"/>
-	<check_box initial_value="true" label="再販/プレゼント" name="next_owner_transfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販することができます"/>
-	<button label="OK" name="apply"/>
-	<button label="キャンセル" name="close"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterbulkperms" title="コンテンツ権限を編集">
+	<floater.string name="nothing_to_modify_text">
+		選択した中に編集できないコンテンツが含まれています
+	</floater.string>
+	<floater.string name="status_text">
+		[NAME]に権限を設定中です。
+	</floater.string>
+	<floater.string name="start_text">
+		権限変更リクエストをしています
+	</floater.string>
+	<floater.string name="done_text">
+		権限変更リクエストが完了しました
+	</floater.string>
+	<check_box label="アニメーション" name="check_animation"/>
+	<icon name="icon_animation" tool_tip="アニメーション"/>
+	<check_box label="身体部位" name="check_bodypart"/>
+	<icon name="icon_bodypart" tool_tip="身体部位"/>
+	<check_box label="服" name="check_clothing"/>
+	<icon name="icon_clothing" tool_tip="衣類"/>
+	<check_box label="ジェスチャー" name="check_gesture"/>
+	<icon name="icon_gesture" tool_tip="ジェスチャー"/>
+	<check_box label="ノートカード" name="check_notecard"/>
+	<icon name="icon_notecard" tool_tip="ノートカード"/>
+	<check_box label="オブジェクト" name="check_object"/>
+	<icon name="icon_object" tool_tip="オブジェクト"/>
+	<check_box label="スクリプト" name="check_script"/>
+	<icon name="icon_script" tool_tip="スクリプト"/>
+	<check_box label="サウンド" name="check_sound"/>
+	<icon name="icon_sound" tool_tip="サウンド"/>
+	<check_box label="テクスチャー" name="check_texture"/>
+	<button label="√ すべて" label_selected="全て" name="check_all"/>
+	<button label="クリア" label_selected="なし" name="check_none"/>
+	<text name="newperms">
+		新しいコンテンツ権限
+	</text>
+	<text name="GroupLabel">
+		グループ:
+	</text>
+	<check_box label="共有" name="share_with_group"/>
+	<text name="AnyoneLabel">
+		すべての人:
+	</text>
+	<check_box label="コピー" name="everyone_copy"/>
+	<text name="NextOwnerLabel">
+		次の所有者:
+	</text>
+	<check_box label="修正" name="next_owner_modify"/>
+	<check_box label="コピー" name="next_owner_copy"/>
+	<check_box initial_value="true" label="再販/プレゼント" name="next_owner_transfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販することができます"/>
+	<button label="OK" name="apply"/>
+	<button label="キャンセル" name="close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_object.xml b/indra/newview/skins/default/xui/ja/floater_buy_object.xml
index fc0418f8088..f807e915736 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_object.xml
@@ -1,26 +1,26 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="オブジェクトのコピーを購入">
-	<text name="contents_text">
-		内容:
-	</text>
-	<text name="buy_text">
-		[NAME]からL$[AMOUNT]で購入しますか?
-	</text>
-	<button label="取消" label_selected="取消" name="cancel_btn"/>
-	<button label="購入" label_selected="購入" name="buy_btn"/>
-	<text name="title_buy_text">
-		購入
-	</text>
-	<string name="title_buy_copy_text">
-		次のものを買う
-	</string>
-	<text name="no_copy_text">
-		(コピーなし)
-	</text>
-	<text name="no_modify_text">
-		(修正なし)
-	</text>
-	<text name="no_transfer_text">
-		(転送なし)
-	</text>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="オブジェクトのコピーを購入">
+	<text name="contents_text">
+		内容:
+	</text>
+	<text name="buy_text">
+		[NAME]からL$[AMOUNT]で購入しますか?
+	</text>
+	<button label="取消" label_selected="取消" name="cancel_btn"/>
+	<button label="購入" label_selected="購入" name="buy_btn"/>
+	<text name="title_buy_text">
+		購入
+	</text>
+	<string name="title_buy_copy_text">
+		次のものを買う
+	</string>
+	<text name="no_copy_text">
+		(コピーなし)
+	</text>
+	<text name="no_modify_text">
+		(修正なし)
+	</text>
+	<text name="no_transfer_text">
+		(転送なし)
+	</text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_camera.xml b/indra/newview/skins/default/xui/ja/floater_camera.xml
index 06e42a29d9b..7e32e5b3c5b 100644
--- a/indra/newview/skins/default/xui/ja/floater_camera.xml
+++ b/indra/newview/skins/default/xui/ja/floater_camera.xml
@@ -1,23 +1,23 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater">
-	<floater.string name="rotate_tooltip">
-		フォーカスを中心にカメラを回転
-	</floater.string>
-	<floater.string name="zoom_tooltip">
-		フォーカスに向けてカメラをズーム
-	</floater.string>
-	<floater.string name="move_tooltip">
-		カメラを上下左右に移動
-	</floater.string>
-	<panel name="controls">
-		<joystick_track name="cam_track_stick" tool_tip="カメラを上下左右に移動"/>
-		<joystick_zoom name="zoom" tool_tip="向いてる方法にカメラをズーム"/>
-		<joystick_rotate name="cam_rotate_stick" tool_tip="自分を軸にカメラを回す"/>
-	</panel>
-	<panel name="buttons">
-		<button label="" name="orbit_btn" tool_tip="カメラを旋回"/>
-		<button label="" name="pan_btn" tool_tip="カメラを水平・垂直移動"/>
-		<button label="" name="avatarview_btn" tool_tip="アバター視点"/>
-		<button label="" name="freecamera_btn" tool_tip="オブジェクトを見る"/>
-	</panel>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="camera_floater">
+	<floater.string name="rotate_tooltip">
+		フォーカスを中心にカメラを回転
+	</floater.string>
+	<floater.string name="zoom_tooltip">
+		フォーカスに向けてカメラをズーム
+	</floater.string>
+	<floater.string name="move_tooltip">
+		カメラを上下左右に移動
+	</floater.string>
+	<panel name="controls">
+		<joystick_track name="cam_track_stick" tool_tip="カメラを上下左右に移動"/>
+		<joystick_zoom name="zoom" tool_tip="向いてる方法にカメラをズーム"/>
+		<joystick_rotate name="cam_rotate_stick" tool_tip="自分を軸にカメラを回す"/>
+	</panel>
+	<panel name="buttons">
+		<button label="" name="orbit_btn" tool_tip="カメラを旋回"/>
+		<button label="" name="pan_btn" tool_tip="カメラを水平・垂直移動"/>
+		<button label="" name="avatarview_btn" tool_tip="アバター視点"/>
+		<button label="" name="freecamera_btn" tool_tip="オブジェクトを見る"/>
+	</panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_color_picker.xml b/indra/newview/skins/default/xui/ja/floater_color_picker.xml
index cd871f72143..d041f44e085 100644
--- a/indra/newview/skins/default/xui/ja/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/ja/floater_color_picker.xml
@@ -1,31 +1,31 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="ColorPicker" title="カラー・ピッカー">
-	<text name="r_val_text">
-		赤:
-	</text>
-	<text name="g_val_text">
-		緑:
-	</text>
-	<text name="b_val_text">
-		青:
-	</text>
-	<text name="h_val_text">
-		色相:
-	</text>
-	<text name="s_val_text">
-		色調:
-	</text>
-	<text name="l_val_text">
-		輝度:
-	</text>
-	<check_box label="今すぐ適用" name="apply_immediate"/>
-	<button label="" label_selected="" name="color_pipette"/>
-	<button label="取り消し" label_selected="取り消し" name="cancel_btn"/>
-	<button label="OK" label_selected="選択" name="select_btn"/>
-	<text name="Current color:">
-		現在の色:
-	</text>
-	<text name="(Drag below to save.)">
-		ドラッグして保存
-	</text>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="ColorPicker" title="カラー・ピッカー">
+	<text name="r_val_text">
+		赤:
+	</text>
+	<text name="g_val_text">
+		緑:
+	</text>
+	<text name="b_val_text">
+		青:
+	</text>
+	<text name="h_val_text">
+		色相:
+	</text>
+	<text name="s_val_text">
+		色調:
+	</text>
+	<text name="l_val_text">
+		輝度:
+	</text>
+	<check_box label="今すぐ適用" name="apply_immediate"/>
+	<button label="" label_selected="" name="color_pipette"/>
+	<button label="取り消し" label_selected="取り消し" name="cancel_btn"/>
+	<button label="OK" label_selected="選択" name="select_btn"/>
+	<text name="Current color:">
+		現在の色:
+	</text>
+	<text name="(Drag below to save.)">
+		ドラッグして保存
+	</text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_god_tools.xml b/indra/newview/skins/default/xui/ja/floater_god_tools.xml
index e21b06988c3..25de45c0944 100644
--- a/indra/newview/skins/default/xui/ja/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_god_tools.xml
@@ -1,97 +1,97 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="godtools floater" title="ゴッド・ツール">
-	<tab_container name="GodTools Tabs">
-		<panel label="グリッド" name="grid">
-			<button label="すべてのユーザーを追い出す" label_selected="すべてのユーザーを追い出す" name="Kick all users"/>
-			<button label="この地域の地図の表示キャッシュを消去" label_selected="この地域の地図の表示キャッシュを消去" name="Flush This Region&apos;s Map Visibility Caches"/>
-		</panel>
-		<panel label="地域" name="region">
-			<text name="Sim Name:">
-				シム名:
-			</text>
-			<check_box label="準備" name="check prelude" tool_tip="この設定により、この地域の準備をします。"/>
-			<check_box label="太陽固定" name="check fixed sun" tool_tip="太陽位置を固定([地域/不動産]>[地形]の場合と同様)"/>
-			<check_box label="テレポートのホームをリセット" name="check reset home" tool_tip="住人がテレポートで去ったとき、彼らのホームを目的地にリセットする。"/>
-			<check_box label="可視" name="check visible" tool_tip="この設定により、この地域をゴッド・モード以外でも可視にします。"/>
-			<check_box label="ダメージ" name="check damage" tool_tip="この設定により、この地域内でダメージを有効化します。"/>
-			<check_box label="トラフィック・トラッキングをブロック" name="block dwell" tool_tip="この設定により、この地域内のトラフィック計算をオフにします。"/>
-			<check_box label="土地整備をブロック" name="block terraform" tool_tip="この設定により、この地域内での土地整備を禁止"/>
-			<check_box label="サンドボックス" name="is sandbox" tool_tip="これがサンドボックス地域でも切り替え"/>
-			<button label="地形を構築する" label_selected="地形を構築する" name="Bake Terrain" tool_tip="現在の地形をデフォルトとして保存します。"/>
-			<button label="地形を元に戻す" label_selected="地形を元に戻す" name="Revert Terrain" tool_tip="現在の地形をデフォルトに置換します。"/>
-			<button label="地形を交換" label_selected="地形を交換" name="Swap Terrain" tool_tip="現在の地形をデフォルトと入れ替えます。"/>
-			<text name="estate id">
-				不動産ID:
-			</text>
-			<text name="parent id">
-				親ID:
-			</text>
-			<line_editor name="parentestate" tool_tip="これは、この地域の親不動産です。"/>
-			<text name="Grid Pos: ">
-				グリッド位置:
-			</text>
-			<line_editor name="gridposx" tool_tip="これは、この地域のグリッドxの位置です。"/>
-			<line_editor name="gridposy" tool_tip="これは、この地域のグリッドyの位置です。"/>
-			<text name="Redirect to Grid: ">
-				グリッドにリダイレクト:
-			</text>
-			<text name="billable factor text">
-				請求率:
-			</text>
-			<text name="land cost text">
-				平方メートル当たりL$:
-			</text>
-			<button label="更新" label_selected="更新" name="Refresh" tool_tip="上記の情報を更新するには、ここをクリックします。"/>
-			<button label="適用" label_selected="適用" name="Apply" tool_tip="上記の変更を適用するには、ここをクリックします。"/>
-			<button label="地域を選択" label_selected="地域を選択" name="Select Region" tool_tip="土地ツールで地域全体を選択してください。"/>
-			<button label="ただちに自動保存する" label_selected="ただちに自動保存する" name="Autosave now" tool_tip="Gzip状態を自動保存ディレクトリに保存します。"/>
-		</panel>
-		<panel label="オブジェクト" name="objects">
-			<panel.string name="no_target">
-				(ターゲットなし)
-			</panel.string>
-			<text name="Sim Name:">
-				シム名:
-			</text>
-			<text name="region name">
-				ウェルシュ
-			</text>
-			<check_box label="スクリプトを無効化" name="disable scripts" tool_tip="この設定により、この地域内のスクリプトをすべて無効化"/>
-			<check_box label="衝突を無効化" name="disable collisions" tool_tip="この設定により、この地域内の非エージェント衝突を無効化"/>
-			<check_box label="物理作用を無効化" name="disable physics" tool_tip="この設定により、この地域内の物理的作用をすべて無効化"/>
-			<button label="適用" label_selected="適用" name="Apply" tool_tip="上記の変更を適用するには、ここをクリックします。"/>
-			<button label="対象の設定" label_selected="対象の設定" name="Set Target" tool_tip="オブジェクト削除の対象となるアバターを設定してください。"/>
-			<text name="target_avatar_name">
-				(対象なし)
-			</text>
-			<button label="他の土地における対象のスクリプト・オブジェクトを削除" label_selected="他の土地における対象のスクリプト・オブジェクトを削除" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="この地域において対象が所有していないスクリプト・オブジェクトをすべて削除します。 (コピー禁止)オブジェクトは返却されます。"/>
-			<button label="「すべての」土地における対象のスクリプト・オブジェクトを削除" label_selected="「すべての」土地における対象のスクリプト・オブジェクトを削除" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="この地域において対象が所有しているスクリプト・オブジェクトをすべて削除します。 (コピー禁止)オブジェクトは返却されます。"/>
-			<button label="対象のオブジェクトを「すべて」削除" label_selected="対象のオブジェクトを「すべて」削除" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="この地域において対象が所有しているオブジェクトをすべて削除します。 (コピー禁止)オブジェクトは返却されます。"/>
-			<button label="トップ・コライダーを取得" label_selected="トップ・コライダーを取得" name="Get Top Colliders" tool_tip="最も段階の狭いコールバックが発生したオブジェクトのリストを取得します。"/>
-			<button label="トップ・スクリプトを取得" label_selected="トップ・スクリプトを取得" name="Get Top Scripts" tool_tip="スクリプトの起動に最も時間を費やしているオブジェクトのリストを取得します。"/>
-			<button label="スクリプト・ダイジェスト" label_selected="スクリプト・ダイジェスト" name="Scripts digest" tool_tip="すべてのスクリプトとそれらの使用回数のリストを取得します。"/>
-		</panel>
-		<panel label="要求" name="request">
-			<text name="Destination:">
-				目的地:
-			</text>
-			<combo_box name="destination">
-				<combo_box.item label="選択" name="item1"/>
-				<combo_box.item label="エージェント地域" name="item2"/>
-			</combo_box>
-			<text name="Request:">
-				要求:
-			</text>
-			<combo_box name="request">
-				<combo_box.item label="コライダー<ステップ>" name="item1"/>
-				<combo_box.item label="スクリプト<回数>、<オプション・パターン>" name="item2"/>
-				<combo_box.item label="オブジェクト<パターン>" name="item3"/>
-				<combo_box.item label="rez <asset_id>" name="item4"/>
-			</combo_box>
-			<text name="Parameter:">
-				パラメーター:
-			</text>
-			<button label="リクエストする" label_selected="リクエストする" name="Make Request"/>
-		</panel>
-	</tab_container>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="godtools floater" title="ゴッド・ツール">
+	<tab_container name="GodTools Tabs">
+		<panel label="グリッド" name="grid">
+			<button label="すべてのユーザーを追い出す" label_selected="すべてのユーザーを追い出す" name="Kick all users"/>
+			<button label="この地域の地図の表示キャッシュを消去" label_selected="この地域の地図の表示キャッシュを消去" name="Flush This Region&apos;s Map Visibility Caches"/>
+		</panel>
+		<panel label="地域" name="region">
+			<text name="Sim Name:">
+				シム名:
+			</text>
+			<check_box label="準備" name="check prelude" tool_tip="この設定により、この地域の準備をします。"/>
+			<check_box label="太陽固定" name="check fixed sun" tool_tip="太陽位置を固定([地域/不動産]>[地形]の場合と同様)"/>
+			<check_box label="テレポートのホームをリセット" name="check reset home" tool_tip="住人がテレポートで去ったとき、彼らのホームを目的地にリセットする。"/>
+			<check_box label="可視" name="check visible" tool_tip="この設定により、この地域をゴッド・モード以外でも可視にします。"/>
+			<check_box label="ダメージ" name="check damage" tool_tip="この設定により、この地域内でダメージを有効化します。"/>
+			<check_box label="トラフィック・トラッキングをブロック" name="block dwell" tool_tip="この設定により、この地域内のトラフィック計算をオフにします。"/>
+			<check_box label="土地整備をブロック" name="block terraform" tool_tip="この設定により、この地域内での土地整備を禁止"/>
+			<check_box label="サンドボックス" name="is sandbox" tool_tip="これがサンドボックス地域でも切り替え"/>
+			<button label="地形を構築する" label_selected="地形を構築する" name="Bake Terrain" tool_tip="現在の地形をデフォルトとして保存します。"/>
+			<button label="地形を元に戻す" label_selected="地形を元に戻す" name="Revert Terrain" tool_tip="現在の地形をデフォルトに置換します。"/>
+			<button label="地形を交換" label_selected="地形を交換" name="Swap Terrain" tool_tip="現在の地形をデフォルトと入れ替えます。"/>
+			<text name="estate id">
+				不動産ID:
+			</text>
+			<text name="parent id">
+				親ID:
+			</text>
+			<line_editor name="parentestate" tool_tip="これは、この地域の親不動産です。"/>
+			<text name="Grid Pos: ">
+				グリッド位置:
+			</text>
+			<line_editor name="gridposx" tool_tip="これは、この地域のグリッドxの位置です。"/>
+			<line_editor name="gridposy" tool_tip="これは、この地域のグリッドyの位置です。"/>
+			<text name="Redirect to Grid: ">
+				グリッドにリダイレクト:
+			</text>
+			<text name="billable factor text">
+				請求率:
+			</text>
+			<text name="land cost text">
+				平方メートル当たりL$:
+			</text>
+			<button label="更新" label_selected="更新" name="Refresh" tool_tip="上記の情報を更新するには、ここをクリックします。"/>
+			<button label="適用" label_selected="適用" name="Apply" tool_tip="上記の変更を適用するには、ここをクリックします。"/>
+			<button label="地域を選択" label_selected="地域を選択" name="Select Region" tool_tip="土地ツールで地域全体を選択してください。"/>
+			<button label="ただちに自動保存する" label_selected="ただちに自動保存する" name="Autosave now" tool_tip="Gzip状態を自動保存ディレクトリに保存します。"/>
+		</panel>
+		<panel label="オブジェクト" name="objects">
+			<panel.string name="no_target">
+				(ターゲットなし)
+			</panel.string>
+			<text name="Sim Name:">
+				シム名:
+			</text>
+			<text name="region name">
+				ウェルシュ
+			</text>
+			<check_box label="スクリプトを無効化" name="disable scripts" tool_tip="この設定により、この地域内のスクリプトをすべて無効化"/>
+			<check_box label="衝突を無効化" name="disable collisions" tool_tip="この設定により、この地域内の非エージェント衝突を無効化"/>
+			<check_box label="物理作用を無効化" name="disable physics" tool_tip="この設定により、この地域内の物理的作用をすべて無効化"/>
+			<button label="適用" label_selected="適用" name="Apply" tool_tip="上記の変更を適用するには、ここをクリックします。"/>
+			<button label="対象の設定" label_selected="対象の設定" name="Set Target" tool_tip="オブジェクト削除の対象となるアバターを設定してください。"/>
+			<text name="target_avatar_name">
+				(対象なし)
+			</text>
+			<button label="他の土地における対象のスクリプト・オブジェクトを削除" label_selected="他の土地における対象のスクリプト・オブジェクトを削除" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="この地域において対象が所有していないスクリプト・オブジェクトをすべて削除します。 (コピー禁止)オブジェクトは返却されます。"/>
+			<button label="「すべての」土地における対象のスクリプト・オブジェクトを削除" label_selected="「すべての」土地における対象のスクリプト・オブジェクトを削除" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="この地域において対象が所有しているスクリプト・オブジェクトをすべて削除します。 (コピー禁止)オブジェクトは返却されます。"/>
+			<button label="対象のオブジェクトを「すべて」削除" label_selected="対象のオブジェクトを「すべて」削除" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="この地域において対象が所有しているオブジェクトをすべて削除します。 (コピー禁止)オブジェクトは返却されます。"/>
+			<button label="トップ・コライダーを取得" label_selected="トップ・コライダーを取得" name="Get Top Colliders" tool_tip="最も段階の狭いコールバックが発生したオブジェクトのリストを取得します。"/>
+			<button label="トップ・スクリプトを取得" label_selected="トップ・スクリプトを取得" name="Get Top Scripts" tool_tip="スクリプトの起動に最も時間を費やしているオブジェクトのリストを取得します。"/>
+			<button label="スクリプト・ダイジェスト" label_selected="スクリプト・ダイジェスト" name="Scripts digest" tool_tip="すべてのスクリプトとそれらの使用回数のリストを取得します。"/>
+		</panel>
+		<panel label="要求" name="request">
+			<text name="Destination:">
+				目的地:
+			</text>
+			<combo_box name="destination">
+				<combo_box.item label="選択" name="item1"/>
+				<combo_box.item label="エージェント地域" name="item2"/>
+			</combo_box>
+			<text name="Request:">
+				要求:
+			</text>
+			<combo_box name="request">
+				<combo_box.item label="コライダー<ステップ>" name="item1"/>
+				<combo_box.item label="スクリプト<回数>、<オプション・パターン>" name="item2"/>
+				<combo_box.item label="オブジェクト<パターン>" name="item3"/>
+				<combo_box.item label="rez <asset_id>" name="item4"/>
+			</combo_box>
+			<text name="Parameter:">
+				パラメーター:
+			</text>
+			<button label="リクエストする" label_selected="リクエストする" name="Make Request"/>
+		</panel>
+	</tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml b/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
index 309a35a2a28..a8cc4827c5c 100644
--- a/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
@@ -1,28 +1,28 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Hardware Settings Floater" title="ハードウェア設定">
-	<text name="Filtering:">
-		フィルタリング:
-	</text>
-	<check_box label="異方的フィルタリング(有効にすると速度が低下します)" name="ani"/>
-	<text name="Antialiasing:">
-		アンチエイリアシング:
-	</text>
-	<combo_box label="アンチエイリアシング" name="fsaa">
-		<combo_box.item label="無効" name="FSAADisabled"/>
-		<combo_box.item label="2x" name="2x"/>
-		<combo_box.item label="4x" name="4x"/>
-		<combo_box.item label="8x" name="8x"/>
-		<combo_box.item label="16x" name="16x"/>
-	</combo_box>
-	<spinner label="ガンマ:" name="gamma"/>
-	<text name="(brightness, lower is brighter)">
-		(0 でデフォルト、低いほど明るい)
-	</text>
-	<text name="Enable VBO:">
-		VBO を有効化:
-	</text>
-	<check_box label="OpenGL Vertex Buffer Objectsを有効化" name="vbo" tool_tip="最新のハードウェアでこの設定を有効にすると、パフォーマンスが向上します。  しかし、旧型のハードウェアでは VBO の実装が貧弱な場合が多く、この設定を有効にすることでクラッシュにつながるおそれがあります。"/>
-	<slider label="テクスチャメモリ(MB):" name="GrapicsCardTextureMemory" tool_tip="テクスチャーに割り当てるメモリの合計。 ビデオ・カード・メモリをデフォルトにします。 この数値を減らすと、パフォーマンスが改善されますが、テクスチャーがぼやけた感じになる場合があります。"/>
-	<spinner label="フォグの距離比率:" name="fog"/>
-	<button label="OK" label_selected="OK" name="OK"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Hardware Settings Floater" title="ハードウェア設定">
+	<text name="Filtering:">
+		フィルタリング:
+	</text>
+	<check_box label="異方的フィルタリング(有効にすると速度が低下します)" name="ani"/>
+	<text name="Antialiasing:">
+		アンチエイリアシング:
+	</text>
+	<combo_box label="アンチエイリアシング" name="fsaa">
+		<combo_box.item label="無効" name="FSAADisabled"/>
+		<combo_box.item label="2x" name="2x"/>
+		<combo_box.item label="4x" name="4x"/>
+		<combo_box.item label="8x" name="8x"/>
+		<combo_box.item label="16x" name="16x"/>
+	</combo_box>
+	<spinner label="ガンマ:" name="gamma"/>
+	<text name="(brightness, lower is brighter)">
+		(0 でデフォルト、低いほど明るい)
+	</text>
+	<text name="Enable VBO:">
+		VBO を有効化:
+	</text>
+	<check_box label="OpenGL Vertex Buffer Objectsを有効化" name="vbo" tool_tip="最新のハードウェアでこの設定を有効にすると、パフォーマンスが向上します。  しかし、旧型のハードウェアでは VBO の実装が貧弱な場合が多く、この設定を有効にすることでクラッシュにつながるおそれがあります。"/>
+	<slider label="テクスチャメモリ(MB):" name="GrapicsCardTextureMemory" tool_tip="テクスチャーに割り当てるメモリの合計。 ビデオ・カード・メモリをデフォルトにします。 この数値を減らすと、パフォーマンスが改善されますが、テクスチャーがぼやけた感じになる場合があります。"/>
+	<spinner label="フォグの距離比率:" name="fog"/>
+	<button label="OK" label_selected="OK" name="OK"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_image_preview.xml b/indra/newview/skins/default/xui/ja/floater_image_preview.xml
index 42a4a2fd7f8..57ed139e546 100644
--- a/indra/newview/skins/default/xui/ja/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_image_preview.xml
@@ -1,32 +1,32 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Image Preview" title="">
-	<text name="name_label">
-		名前:
-	</text>
-	<text name="description_label">
-		説明:
-	</text>
-	<text name="preview_label">
-		イメージのプレビュー:
-	</text>
-	<combo_box label="服の種類" name="clothing_type_combo">
-		<combo_box.item label="画像" name="Image"/>
-		<combo_box.item label="髪" name="Hair"/>
-		<combo_box.item label="女性の頭" name="FemaleHead"/>
-		<combo_box.item label="女性の上半身" name="FemaleUpperBody"/>
-		<combo_box.item label="女性の下半身" name="FemaleLowerBody"/>
-		<combo_box.item label="男性の頭" name="MaleHead"/>
-		<combo_box.item label="男性の上半身" name="MaleUpperBody"/>
-		<combo_box.item label="男性の下半身" name="MaleLowerBody"/>
-		<combo_box.item label="スカート" name="Skirt"/>
-		<combo_box.item label="スカルプトプリム" name="SculptedPrim"/>
-	</combo_box>
-	<text name="bad_image_text">
-		イメージを読み取れません。
-
-24bitTarga(.tga)でイメージを保存してください。
-	</text>
-	<check_box label="ロスのない圧縮を使用" name="lossless_check"/>
-	<button label="取り消し" name="cancel_btn"/>
-	<button label="アップロードL$[AMOUNT]" name="ok_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Image Preview" title="">
+	<text name="name_label">
+		名前:
+	</text>
+	<text name="description_label">
+		説明:
+	</text>
+	<text name="preview_label">
+		イメージのプレビュー:
+	</text>
+	<combo_box label="服の種類" name="clothing_type_combo">
+		<combo_box.item label="画像" name="Image"/>
+		<combo_box.item label="髪" name="Hair"/>
+		<combo_box.item label="女性の頭" name="FemaleHead"/>
+		<combo_box.item label="女性の上半身" name="FemaleUpperBody"/>
+		<combo_box.item label="女性の下半身" name="FemaleLowerBody"/>
+		<combo_box.item label="男性の頭" name="MaleHead"/>
+		<combo_box.item label="男性の上半身" name="MaleUpperBody"/>
+		<combo_box.item label="男性の下半身" name="MaleLowerBody"/>
+		<combo_box.item label="スカート" name="Skirt"/>
+		<combo_box.item label="スカルプトプリム" name="SculptedPrim"/>
+	</combo_box>
+	<text name="bad_image_text">
+		イメージを読み取れません。
+
+24bitTarga(.tga)でイメージを保存してください。
+	</text>
+	<check_box label="ロスのない圧縮を使用" name="lossless_check"/>
+	<button label="取り消し" name="cancel_btn"/>
+	<button label="アップロードL$[AMOUNT]" name="ok_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml
index bc34878fde0..a3fddc7b8dd 100644
--- a/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml
@@ -1,67 +1,67 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="持ち物アイテムのプロパティ">
-	<floater.string name="unknown">
-		(不明)
-	</floater.string>
-	<floater.string name="public">
-		(公共)
-	</floater.string>
-	<floater.string name="you_can">
-		できること:
-	</floater.string>
-	<floater.string name="owner_can">
-		オーナーは次のことができます:
-	</floater.string>
-	<text name="LabelItemNameTitle">
-		名前:
-	</text>
-	<text name="LabelItemDescTitle">
-		説明:
-	</text>
-	<text name="LabelCreatorTitle">
-		クリエーター
-	</text>
-	<text name="LabelCreatorName">
-		Nicole Linden
-	</text>
-	<button label="情報" label_selected="" name="BtnCreator"/>
-	<text name="LabelOwnerTitle">
-		オーナー:
-	</text>
-	<text name="LabelOwnerName">
-		Thrax Linden
-	</text>
-	<button label="情報" label_selected="" name="BtnOwner"/>
-	<text name="LabelAcquiredTitle">
-		入手日時:
-	</text>
-	<text name="LabelAcquiredDate">
-		2006年5月24日水曜日12:50:46
-	</text>
-	<text name="OwnerLabel">
-		あなた:
-	</text>
-	<check_box label="編集" name="CheckOwnerModify"/>
-	<check_box label="コピー" name="CheckOwnerCopy"/>
-	<check_box label="再販・プレゼント" name="CheckOwnerTransfer"/>
-	<text name="AnyoneLabel">
-		全員:
-	</text>
-	<check_box label="コピー" name="CheckEveryoneCopy"/>
-	<text name="GroupLabel">
-		グループ:
-	</text>
-	<check_box label="共有" name="CheckShareWithGroup"/>
-	<text name="NextOwnerLabel" width="158">
-		次の所有者:
-	</text>
-	<check_box label="編集" name="CheckNextOwnerModify"/>
-	<check_box label="コピー" name="CheckNextOwnerCopy"/>
-	<check_box label="再販・プレゼント" name="CheckNextOwnerTransfer"/>
-	<check_box label="売り出し中" name="CheckPurchase"/>
-	<combo_box name="combobox sale copy">
-		<combo_box.item label="コピー" name="Copy"/>
-		<combo_box.item label="オリジナル" name="Original"/>
-	</combo_box>
-	<spinner label="価格: L$" name="Edit Cost"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="item properties" title="持ち物アイテムのプロパティ">
+	<floater.string name="unknown">
+		(不明)
+	</floater.string>
+	<floater.string name="public">
+		(公共)
+	</floater.string>
+	<floater.string name="you_can">
+		できること:
+	</floater.string>
+	<floater.string name="owner_can">
+		オーナーは次のことができます:
+	</floater.string>
+	<text name="LabelItemNameTitle">
+		名前:
+	</text>
+	<text name="LabelItemDescTitle">
+		説明:
+	</text>
+	<text name="LabelCreatorTitle">
+		クリエーター
+	</text>
+	<text name="LabelCreatorName">
+		Nicole Linden
+	</text>
+	<button label="情報" label_selected="" name="BtnCreator"/>
+	<text name="LabelOwnerTitle">
+		オーナー:
+	</text>
+	<text name="LabelOwnerName">
+		Thrax Linden
+	</text>
+	<button label="情報" label_selected="" name="BtnOwner"/>
+	<text name="LabelAcquiredTitle">
+		入手日時:
+	</text>
+	<text name="LabelAcquiredDate">
+		2006年5月24日水曜日12:50:46
+	</text>
+	<text name="OwnerLabel">
+		あなた:
+	</text>
+	<check_box label="編集" name="CheckOwnerModify"/>
+	<check_box label="コピー" name="CheckOwnerCopy"/>
+	<check_box label="再販・プレゼント" name="CheckOwnerTransfer"/>
+	<text name="AnyoneLabel">
+		全員:
+	</text>
+	<check_box label="コピー" name="CheckEveryoneCopy"/>
+	<text name="GroupLabel">
+		グループ:
+	</text>
+	<check_box label="共有" name="CheckShareWithGroup"/>
+	<text name="NextOwnerLabel" width="158">
+		次の所有者:
+	</text>
+	<check_box label="編集" name="CheckNextOwnerModify"/>
+	<check_box label="コピー" name="CheckNextOwnerCopy"/>
+	<check_box label="再販・プレゼント" name="CheckNextOwnerTransfer"/>
+	<check_box label="売り出し中" name="CheckPurchase"/>
+	<combo_box name="combobox sale copy">
+		<combo_box.item label="コピー" name="Copy"/>
+		<combo_box.item label="オリジナル" name="Original"/>
+	</combo_box>
+	<spinner label="価格: L$" name="Edit Cost"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml
index 49a42a71658..3cff79430d3 100644
--- a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml
@@ -1,40 +1,40 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="land holdings floater" title="自分の土地">
-	<scroll_list name="parcel list">
-		<column label="区画" name="name"/>
-		<column label="地域(リージョン)" name="location"/>
-		<column label="種類" name="type"/>
-		<column label="面積" name="area"/>
-		<column label="" name="hidden"/>
-	</scroll_list>
-	<button label="テレポート" label_selected="テレポート" name="Teleport" tool_tip="この土地の中心にテレポート"/>
-	<button label="地図" label_selected="地図" name="Show on Map" tool_tip="この土地を世界地図に表示します。"/>
-	<text name="contrib_label">
-		あなたのグループへの貢献:
-	</text>
-	<scroll_list name="grant list">
-		<column label="グループ名" name="group"/>
-		<column label="面積" name="area"/>
-	</scroll_list>
-	<text name="allowed_label">
-		現在の支払いプランでの許可された保有地:
-	</text>
-	<text name="allowed_text">
-		[AREA]平方メートル
-	</text>
-	<text name="current_label">
-		現在の保有地:
-	</text>
-	<text name="current_text">
-		[AREA]平方メートル
-	</text>
-	<text name="available_label">
-		土地購入可:
-	</text>
-	<text name="available_text">
-		[AREA]平方メートル
-	</text>
-	<string name="area_string">
-		[AREA]平方メートル
-	</string>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="land holdings floater" title="自分の土地">
+	<scroll_list name="parcel list">
+		<column label="区画" name="name"/>
+		<column label="地域(リージョン)" name="location"/>
+		<column label="種類" name="type"/>
+		<column label="面積" name="area"/>
+		<column label="" name="hidden"/>
+	</scroll_list>
+	<button label="テレポート" label_selected="テレポート" name="Teleport" tool_tip="この土地の中心にテレポート"/>
+	<button label="地図" label_selected="地図" name="Show on Map" tool_tip="この土地を世界地図に表示します。"/>
+	<text name="contrib_label">
+		あなたのグループへの貢献:
+	</text>
+	<scroll_list name="grant list">
+		<column label="グループ名" name="group"/>
+		<column label="面積" name="area"/>
+	</scroll_list>
+	<text name="allowed_label">
+		現在の支払いプランでの許可された保有地:
+	</text>
+	<text name="allowed_text">
+		[AREA]平方メートル
+	</text>
+	<text name="current_label">
+		現在の保有地:
+	</text>
+	<text name="current_text">
+		[AREA]平方メートル
+	</text>
+	<text name="available_label">
+		土地購入可:
+	</text>
+	<text name="available_text">
+		[AREA]平方メートル
+	</text>
+	<string name="area_string">
+		[AREA]平方メートル
+	</string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml
index b108a3e70ca..ce1a1ecf928 100644
--- a/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml
@@ -1,15 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script ed float" title="スクリプト:新しいスクリプト">
-	<floater.string name="not_allowed">
-		このスクリプトは「コピー不可」のため、表示または編集することができません。 オブジェクト内のスクリプトの表示または編集には、全権限が必要です。
-	</floater.string>
-	<floater.string name="script_running">
-		実行中
-	</floater.string>
-	<floater.string name="Title">
-		スクリプト: [NAME]
-	</floater.string>
-	<button label="リセット" label_selected="リセット" name="Reset"/>
-	<check_box initial_value="true" label="実行中" name="running"/>
-	<check_box initial_value="true" label="Mono" name="mono"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="スクリプト:新しいスクリプト">
+	<floater.string name="not_allowed">
+		このスクリプトは「コピー不可」のため、表示または編集することができません。 オブジェクト内のスクリプトの表示または編集には、全権限が必要です。
+	</floater.string>
+	<floater.string name="script_running">
+		実行中
+	</floater.string>
+	<floater.string name="Title">
+		スクリプト: [NAME]
+	</floater.string>
+	<button label="リセット" label_selected="リセット" name="Reset"/>
+	<check_box initial_value="true" label="実行中" name="running"/>
+	<check_box initial_value="true" label="Mono" name="mono"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_map.xml b/indra/newview/skins/default/xui/ja/floater_map.xml
index aefe24ae48d..f3cba7e6747 100644
--- a/indra/newview/skins/default/xui/ja/floater_map.xml
+++ b/indra/newview/skins/default/xui/ja/floater_map.xml
@@ -1,54 +1,54 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map">
-	<floater.string name="mini_map_north">
-		北
-	</floater.string>
-	<floater.string name="mini_map_east">
-		東
-	</floater.string>
-	<floater.string name="mini_map_west">
-		西
-	</floater.string>
-	<floater.string name="mini_map_south">
-		南
-	</floater.string>
-	<floater.string name="mini_map_southeast">
-		南東
-	</floater.string>
-	<floater.string name="mini_map_northeast">
-		北東
-	</floater.string>
-	<floater.string name="mini_map_southwest">
-		南西
-	</floater.string>
-	<floater.string name="mini_map_northwest">
-		北西
-	</floater.string>
-	<floater.string name="ToolTipMsg">
-		[AGENT][REGION] (ダブルクリックで地図を開く)
-	</floater.string>
-	<text label="北" name="floater_map_north" text="北">
-		北
-	</text>
-	<text label="東" name="floater_map_east" text="東">
-		東
-	</text>
-	<text label="西" name="floater_map_west" text="西">
-		西
-	</text>
-	<text label="南" name="floater_map_south" text="南">
-		南
-	</text>
-	<text label="南東" name="floater_map_southeast" text="南東">
-		南東
-	</text>
-	<text label="北東" name="floater_map_northeast" text="北東">
-		北東
-	</text>
-	<text label="南西" name="floater_map_southwest" text="南西">
-		南西
-	</text>
-	<text label="北西" name="floater_map_northwest" text="北西">
-		北西
-	</text>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Map">
+	<floater.string name="mini_map_north">
+		北
+	</floater.string>
+	<floater.string name="mini_map_east">
+		東
+	</floater.string>
+	<floater.string name="mini_map_west">
+		西
+	</floater.string>
+	<floater.string name="mini_map_south">
+		南
+	</floater.string>
+	<floater.string name="mini_map_southeast">
+		南東
+	</floater.string>
+	<floater.string name="mini_map_northeast">
+		北東
+	</floater.string>
+	<floater.string name="mini_map_southwest">
+		南西
+	</floater.string>
+	<floater.string name="mini_map_northwest">
+		北西
+	</floater.string>
+	<floater.string name="ToolTipMsg">
+		[AGENT][REGION] (ダブルクリックで地図を開く)
+	</floater.string>
+	<text label="北" name="floater_map_north" text="北">
+		北
+	</text>
+	<text label="東" name="floater_map_east" text="東">
+		東
+	</text>
+	<text label="西" name="floater_map_west" text="西">
+		西
+	</text>
+	<text label="南" name="floater_map_south" text="南">
+		南
+	</text>
+	<text label="南東" name="floater_map_southeast" text="南東">
+		南東
+	</text>
+	<text label="北東" name="floater_map_northeast" text="北東">
+		北東
+	</text>
+	<text label="南西" name="floater_map_southwest" text="南西">
+		南西
+	</text>
+	<text label="北西" name="floater_map_northwest" text="北西">
+		北西
+	</text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_media_browser.xml b/indra/newview/skins/default/xui/ja/floater_media_browser.xml
index 5e60b9f1a2e..3bcc40f9ddc 100644
--- a/indra/newview/skins/default/xui/ja/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/ja/floater_media_browser.xml
@@ -1,30 +1,30 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="メディア・ブラウザ">
-	<floater.string name="home_page_url">
-		http://jp.secondlife.com
-	</floater.string>
-	<floater.string name="support_page_url">
-		http://jp.secondlife.com/support
-	</floater.string>
-	<layout_stack name="stack1">
-		<layout_panel name="nav_controls">
-			<button label="戻る" name="back"/>
-			<button label="進む" name="forward"/>
-			<button label="æ›´æ–°" name="reload"/>
-			<button label="閲覧" name="go"/>
-		</layout_panel>
-		<layout_panel name="time_controls">
-			<button label="巻き戻し" name="rewind"/>
-			<button label="停止" name="stop"/>
-			<button label="早送り" name="seek"/>
-		</layout_panel>
-		<layout_panel name="parcel_owner_controls">
-			<button label="現在の URL を区画に送信" name="assign"/>
-		</layout_panel>
-		<layout_panel name="external_controls">
-			<button label="外部ウェブ・ブラウザで開く" name="open_browser"/>
-			<check_box label="常に外部のウェブ・ブラウザで開く" name="open_always"/>
-			<button label="閉じる" name="close"/>
-		</layout_panel>
-	</layout_stack>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="メディア・ブラウザ">
+	<floater.string name="home_page_url">
+		http://jp.secondlife.com
+	</floater.string>
+	<floater.string name="support_page_url">
+		http://jp.secondlife.com/support
+	</floater.string>
+	<layout_stack name="stack1">
+		<layout_panel name="nav_controls">
+			<button label="戻る" name="back"/>
+			<button label="進む" name="forward"/>
+			<button label="æ›´æ–°" name="reload"/>
+			<button label="閲覧" name="go"/>
+		</layout_panel>
+		<layout_panel name="time_controls">
+			<button label="巻き戻し" name="rewind"/>
+			<button label="停止" name="stop"/>
+			<button label="早送り" name="seek"/>
+		</layout_panel>
+		<layout_panel name="parcel_owner_controls">
+			<button label="現在の URL を区画に送信" name="assign"/>
+		</layout_panel>
+		<layout_panel name="external_controls">
+			<button label="外部ウェブ・ブラウザで開く" name="open_browser"/>
+			<check_box label="常に外部のウェブ・ブラウザで開く" name="open_always"/>
+			<button label="閉じる" name="close"/>
+		</layout_panel>
+	</layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml b/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml
index 1f7fcb94950..6167b6db91c 100644
--- a/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml
@@ -1,18 +1,18 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="MemLeak" title="メモリリークのシミュレート">
-	<spinner label="リークスピード(1フレームごとのバイト数):" label_width="244" name="leak_speed"/>
-	<spinner label="リークした最大メモリ数(MB):" label_width="244" name="max_leak"/>
-	<text name="total_leaked_label">
-		現在のリークメモリサイズ: [SIZE] KB
-	</text>
-	<text name="note_label_1">
-		[NOTE1]
-	</text>
-	<text name="note_label_2">
-		[NOTE2]
-	</text>
-	<button label="é–‹å§‹" name="start_btn"/>
-	<button label="停止" name="stop_btn"/>
-	<button label="解放" name="release_btn"/>
-	<button label="閉じる" name="close_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="MemLeak" title="メモリリークのシミュレート">
+	<spinner label="リークスピード(1フレームごとのバイト数):" label_width="244" name="leak_speed"/>
+	<spinner label="リークした最大メモリ数(MB):" label_width="244" name="max_leak"/>
+	<text name="total_leaked_label">
+		現在のリークメモリサイズ: [SIZE] KB
+	</text>
+	<text name="note_label_1">
+		[NOTE1]
+	</text>
+	<text name="note_label_2">
+		[NOTE2]
+	</text>
+	<button label="é–‹å§‹" name="start_btn"/>
+	<button label="停止" name="stop_btn"/>
+	<button label="解放" name="release_btn"/>
+	<button label="閉じる" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_moveview.xml b/indra/newview/skins/default/xui/ja/floater_moveview.xml
index e6aeccc5175..8ba297c7a02 100644
--- a/indra/newview/skins/default/xui/ja/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_moveview.xml
@@ -1,35 +1,35 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move_floater">
-	<string name="walk_forward_tooltip">
-		前に進む(上矢印か W を押す)
-	</string>
-	<string name="walk_back_tooltip">
-		後ろに歩く(下矢印か S を押す)
-	</string>
-	<string name="run_forward_tooltip">
-		前に走る(上矢印か W を押す)
-	</string>
-	<string name="run_back_tooltip">
-		後ろに走る(下矢印か S を押す)
-	</string>
-	<string name="fly_forward_tooltip">
-		前に飛ぶ(上矢印か W を押す)
-	</string>
-	<string name="fly_back_tooltip">
-		後ろに飛ぶ(下矢印か S を押す)
-	</string>
-	<panel name="panel_actions">
-		<button label="" label_selected="" name="turn left btn" tool_tip="左を向く(左矢印か A を押す)"/>
-		<button label="" label_selected="" name="turn right btn" tool_tip="右を向く(右矢印か D を押す)"/>
-		<button label="" label_selected="" name="move up btn" tool_tip="飛ぶ・E を押す"/>
-		<button label="" label_selected="" name="move down btn" tool_tip="着地・C を押す"/>
-		<joystick_turn name="forward btn" tool_tip="前に進む(上矢印か W を押す)"/>
-		<joystick_turn name="backward btn" tool_tip="後ろに歩く(下矢印か S を押す)"/>
-	</panel>
-	<panel name="panel_modes">
-		<button label="" name="mode_walk_btn" tool_tip="歩行モード"/>
-		<button label="" name="mode_run_btn" tool_tip="走行モード"/>
-		<button label="" name="mode_fly_btn" tool_tip="飛行モード"/>
-		<button label="飛行停止" name="stop_fly_btn" tool_tip="飛行停止"/>
-	</panel>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="move_floater">
+	<string name="walk_forward_tooltip">
+		前に進む(上矢印か W を押す)
+	</string>
+	<string name="walk_back_tooltip">
+		後ろに歩く(下矢印か S を押す)
+	</string>
+	<string name="run_forward_tooltip">
+		前に走る(上矢印か W を押す)
+	</string>
+	<string name="run_back_tooltip">
+		後ろに走る(下矢印か S を押す)
+	</string>
+	<string name="fly_forward_tooltip">
+		前に飛ぶ(上矢印か W を押す)
+	</string>
+	<string name="fly_back_tooltip">
+		後ろに飛ぶ(下矢印か S を押す)
+	</string>
+	<panel name="panel_actions">
+		<button label="" label_selected="" name="turn left btn" tool_tip="左を向く(左矢印か A を押す)"/>
+		<button label="" label_selected="" name="turn right btn" tool_tip="右を向く(右矢印か D を押す)"/>
+		<button label="" label_selected="" name="move up btn" tool_tip="飛ぶ・E を押す"/>
+		<button label="" label_selected="" name="move down btn" tool_tip="着地・C を押す"/>
+		<joystick_turn name="forward btn" tool_tip="前に進む(上矢印か W を押す)"/>
+		<joystick_turn name="backward btn" tool_tip="後ろに歩く(下矢印か S を押す)"/>
+	</panel>
+	<panel name="panel_modes">
+		<button label="" name="mode_walk_btn" tool_tip="歩行モード"/>
+		<button label="" name="mode_run_btn" tool_tip="走行モード"/>
+		<button label="" name="mode_fly_btn" tool_tip="飛行モード"/>
+		<button label="飛行停止" name="stop_fly_btn" tool_tip="飛行停止"/>
+	</panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_pay.xml b/indra/newview/skins/default/xui/ja/floater_pay.xml
index d175009ef31..bef2435fe23 100644
--- a/indra/newview/skins/default/xui/ja/floater_pay.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pay.xml
@@ -1,19 +1,19 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Give Money" title="">
-	<text name="payee_label">
-		支払い:
-	</text>
-	<icon name="icon_person" tool_tip="住人"/>
-	<text name="payee_name">
-		[FIRST] [LAST]
-	</text>
-	<button label="L$1" label_selected="L$1" name="fastpay 1"/>
-	<button label="L$5" label_selected="L$5" name="fastpay 5"/>
-	<button label="L$10" label_selected="L$10" name="fastpay 10"/>
-	<button label="L$20" label_selected="L$20" name="fastpay 20"/>
-	<text name="amount text">
-		金額の指定:
-	</text>
-	<button label="支払い" label_selected="支払い" name="pay btn"/>
-	<button label="取り消し" label_selected="取り消し" name="cancel btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Give Money" title="">
+	<text name="payee_label">
+		支払い:
+	</text>
+	<icon name="icon_person" tool_tip="住人"/>
+	<text name="payee_name">
+		[FIRST] [LAST]
+	</text>
+	<button label="L$1" label_selected="L$1" name="fastpay 1"/>
+	<button label="L$5" label_selected="L$5" name="fastpay 5"/>
+	<button label="L$10" label_selected="L$10" name="fastpay 10"/>
+	<button label="L$20" label_selected="L$20" name="fastpay 20"/>
+	<text name="amount text">
+		金額の指定:
+	</text>
+	<button label="支払い" label_selected="支払い" name="pay btn"/>
+	<button label="取り消し" label_selected="取り消し" name="cancel btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_pay_object.xml b/indra/newview/skins/default/xui/ja/floater_pay_object.xml
index 5a3edb29086..b304e291d3e 100644
--- a/indra/newview/skins/default/xui/ja/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pay_object.xml
@@ -1,29 +1,29 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Give Money" title="">
-	<string name="payee_group">
-		グループへの支払い:
-	</string>
-	<string name="payee_resident">
-		住人への支払い:
-	</string>
-	<icon name="icon_person" tool_tip="住人"/>
-	<text name="payee_name">
-		[FIRST] [LAST]
-	</text>
-	<text name="object_name_label">
-		オブジェクトを介して:
-	</text>
-	<icon name="icon_object" tool_tip="オブジェクト"/>
-	<text name="object_name_text">
-		...
-	</text>
-	<button label="L$1" label_selected="L$1" name="fastpay 1"/>
-	<button label="L$5" label_selected="L$5" name="fastpay 5"/>
-	<button label="L$10" label_selected="L$10" name="fastpay 10"/>
-	<button label="L$20" label_selected="L$20" name="fastpay 20"/>
-	<text name="amount text">
-		金額を指定:
-	</text>
-	<button label="支払い" label_selected="支払い" name="pay btn"/>
-	<button label="取り消し" label_selected="取り消し" name="cancel btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Give Money" title="">
+	<string name="payee_group">
+		グループへの支払い:
+	</string>
+	<string name="payee_resident">
+		住人への支払い:
+	</string>
+	<icon name="icon_person" tool_tip="住人"/>
+	<text name="payee_name">
+		[FIRST] [LAST]
+	</text>
+	<text name="object_name_label">
+		オブジェクトを介して:
+	</text>
+	<icon name="icon_object" tool_tip="オブジェクト"/>
+	<text name="object_name_text">
+		...
+	</text>
+	<button label="L$1" label_selected="L$1" name="fastpay 1"/>
+	<button label="L$5" label_selected="L$5" name="fastpay 5"/>
+	<button label="L$10" label_selected="L$10" name="fastpay 10"/>
+	<button label="L$20" label_selected="L$20" name="fastpay 20"/>
+	<text name="amount text">
+		金額を指定:
+	</text>
+	<button label="支払い" label_selected="支払い" name="pay btn"/>
+	<button label="取り消し" label_selected="取り消し" name="cancel btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_animation.xml b/indra/newview/skins/default/xui/ja/floater_preview_animation.xml
index 95cffd33f2c..629c1fd3391 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_animation.xml
@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview_anim">
-	<floater.string name="Title">
-		アニメーション: [NAME]
-	</floater.string>
-	<text name="desc txt">
-		説明:
-	</text>
-	<button label="世界で再生" label_selected="停止" name="Anim play btn" tool_tip="このアニメーションを他の人も見ることができるように再生します。"/>
-	<button label="ローカルに再生" label_selected="停止" name="Anim audition btn" tool_tip="このアニメーションを自分専用に再生します。"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_anim">
+	<floater.string name="Title">
+		アニメーション: [NAME]
+	</floater.string>
+	<text name="desc txt">
+		説明:
+	</text>
+	<button label="世界で再生" label_selected="停止" name="Anim play btn" tool_tip="このアニメーションを他の人も見ることができるように再生します。"/>
+	<button label="ローカルに再生" label_selected="停止" name="Anim audition btn" tool_tip="このアニメーションを自分専用に再生します。"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_classified.xml b/indra/newview/skins/default/xui/ja/floater_preview_classified.xml
index 48a64e28a6e..ba3bb028b26 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_classified.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_classified.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="classified_preview" title="クラシファイド広告情報">
-	<floater.string name="Title">
-		クラシファイド広告: [NAME]
-	</floater.string>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="classified_preview" title="クラシファイド広告情報">
+	<floater.string name="Title">
+		クラシファイド広告: [NAME]
+	</floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_event.xml b/indra/newview/skins/default/xui/ja/floater_preview_event.xml
index 61c17e2d3c9..21f57ca7a3e 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_event.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_event.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="event_preview" title="イベント情報">
-	<floater.string name="Title">
-		イベント: [NAME]
-	</floater.string>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="event_preview" title="イベント情報">
+	<floater.string name="Title">
+		イベント: [NAME]
+	</floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture_info.xml
index c996ed8591c..682b295a146 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_gesture_info.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture_info.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Gesture" title="ジェスチャーのショートカット"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="ジェスチャーのショートカット"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture_steps.xml
index c996ed8591c..682b295a146 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_gesture_steps.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture_steps.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Gesture" title="ジェスチャーのショートカット"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="ジェスチャーのショートカット"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml b/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml
index ba272bdffd0..0ab1efd127d 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml
@@ -1,22 +1,22 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview notecard" title="メモ:">
-	<floater.string name="no_object">
-		このノートを含んだオブジェクトが見つかりません。
-	</floater.string>
-	<floater.string name="not_allowed">
-		このノートを見る権限がありません。
-	</floater.string>
-	<floater.string name="Title">
-		ノートカード: [NAME]
-	</floater.string>
-	<floater.string label="保存" label_selected="保存" name="Save">
-		保存
-	</floater.string>
-	<text name="desc txt">
-		説明:
-	</text>
-	<text_editor name="Notecard Editor">
-		ローディング...
-	</text_editor>
-	<button label="保存" label_selected="保存" name="Save"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview notecard" title="メモ:">
+	<floater.string name="no_object">
+		このノートを含んだオブジェクトが見つかりません。
+	</floater.string>
+	<floater.string name="not_allowed">
+		このノートを見る権限がありません。
+	</floater.string>
+	<floater.string name="Title">
+		ノートカード: [NAME]
+	</floater.string>
+	<floater.string label="保存" label_selected="保存" name="Save">
+		保存
+	</floater.string>
+	<text name="desc txt">
+		説明:
+	</text>
+	<text_editor name="Notecard Editor">
+		ローディング...
+	</text_editor>
+	<button label="保存" label_selected="保存" name="Save"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_sound.xml b/indra/newview/skins/default/xui/ja/floater_preview_sound.xml
index e52a3a4e924..09c6e46fb50 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_sound.xml
@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview_sound">
-	<floater.string name="Title">
-		サウンド: [NAME]
-	</floater.string>
-	<text name="desc txt">
-		説明:
-	</text>
-	<button label="世界で再生" label_selected="世界で再生" name="Sound play btn" tool_tip="このサウンドを他の人も聞くことができるように再生します。"/>
-	<button label="ローカルに再生" label_selected="ローカルに再生" name="Sound audition btn" tool_tip="このサウンドを自分専用に再生します。"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_sound">
+	<floater.string name="Title">
+		サウンド: [NAME]
+	</floater.string>
+	<text name="desc txt">
+		説明:
+	</text>
+	<button label="世界で再生" label_selected="世界で再生" name="Sound play btn" tool_tip="このサウンドを他の人も聞くことができるように再生します。"/>
+	<button label="ローカルに再生" label_selected="ローカルに再生" name="Sound audition btn" tool_tip="このサウンドを自分専用に再生します。"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_texture.xml b/indra/newview/skins/default/xui/ja/floater_preview_texture.xml
index c83130f3bb0..32b83f295db 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_texture.xml
@@ -1,17 +1,17 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview_texture">
-	<floater.string name="Title">
-		テクスチャ: [NAME]
-	</floater.string>
-	<floater.string name="Copy">
-		持ち物にコピー
-	</floater.string>
-	<text name="desc txt">
-		説明:
-	</text>
-	<button label="保存" name="Keep"/>
-	<button label="削除" name="Discard"/>
-	<text name="dimensions">
-		[WIDTH]px x [HEIGHT]px
-	</text>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_texture">
+	<floater.string name="Title">
+		テクスチャ: [NAME]
+	</floater.string>
+	<floater.string name="Copy">
+		持ち物にコピー
+	</floater.string>
+	<text name="desc txt">
+		説明:
+	</text>
+	<button label="保存" name="Keep"/>
+	<button label="削除" name="Discard"/>
+	<text name="dimensions">
+		[WIDTH]px x [HEIGHT]px
+	</text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_report_abuse.xml b/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
index 2b07deb1032..ac5b2c0a2de 100644
--- a/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
@@ -1,103 +1,103 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_report_abuse" title="嫌がらせの報告">
-	<floater.string name="Screenshot">
-		スクリーンショット
-	</floater.string>
-	<check_box label="このスクリーンショットを使用" name="screen_check"/>
-	<text name="reporter_title">
-		報告者:
-	</text>
-	<text name="reporter_field">
-		Loremipsum Dolorsitamut
-	</text>
-	<text name="sim_title">
-		地域:
-	</text>
-	<text name="sim_field">
-		地域名
-	</text>
-	<text name="pos_title">
-		位置:
-	</text>
-	<text name="pos_field">
-		{128.1, 128.1, 15.4}
-	</text>
-	<text name="select_object_label">
-		ボタンをクリック。悪意のあるオブジェクト:
-	</text>
-	<button label="" label_selected="" name="pick_btn" tool_tip="オブジェクト・ピッカー - この報告の主題となるオブジェクトを特定"/>
-	<text name="object_name_label">
-		オブジェクト:
-	</text>
-	<text name="object_name">
-		Consetetur Sadipscing
-	</text>
-	<text name="owner_name_label">
-		オーナー:
-	</text>
-	<text name="owner_name">
-		Hendrerit Vulputate
-	</text>
-	<combo_box name="category_combo" tool_tip="カテゴリー -- この報告に最も適したカテゴリーを選択してください">
-		<combo_box.item label="カテゴリーを選択" name="Select_category"/>
-		<combo_box.item label="年齢>年齢偽証" name="Age__Age_play"/>
-		<combo_box.item label="年齢>成人の住人がTeen Second Life上にいる" name="Age__Adult_resident_on_Teen_Second_Life"/>
-		<combo_box.item label="年齢>未成年な住人がTeen Second Lifeの外にいる" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
-		<combo_box.item label="攻撃>コンバット・サンドボックス/危険なエリア" name="Assault__Combat_sandbox___unsafe_area"/>
-		<combo_box.item label="攻撃>安全なエリア" name="Assault__Safe_area"/>
-		<combo_box.item label="攻撃>武器テスト用サンドボックス" name="Assault__Weapons_testing_sandbox"/>
-		<combo_box.item label="商取引>製品またはサービスの提供が行われない" name="Commerce__Failure_to_deliver_product_or_service"/>
-		<combo_box.item label="開示>リアルワールドの情報" name="Disclosure__Real_world_information"/>
-		<combo_box.item label="開示>離れたところからチャットをモニターしている" name="Disclosure__Remotely_monitoring chat"/>
-		<combo_box.item label="開示>Second Lifeの情報/チャット/IM" name="Disclosure__Second_Life_information_chat_IMs"/>
-		<combo_box.item label="平穏を乱す行為>地域リソースの使用が不公平" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
-		<combo_box.item label="平穏を乱す行為>スクリプト・オブジェクトの乱用" name="Disturbing_the_peace__Excessive_scripted_objects"/>
-		<combo_box.item label="平穏を乱す行為>オブジェクトの捨て置き" name="Disturbing_the_peace__Object_littering"/>
-		<combo_box.item label="平穏を乱す行為>繰り返しスパム" name="Disturbing_the_peace__Repetitive_spam"/>
-		<combo_box.item label="平穏を乱す行為>不要な広告スパム" name="Disturbing_the_peace__Unwanted_advert_spam"/>
-		<combo_box.item label="詐欺> L$" name="Fraud__L$"/>
-		<combo_box.item label="詐欺>土地" name="Fraud__Land"/>
-		<combo_box.item label="詐欺>マルチ商法またはチェーン・メール" name="Fraud__Pyramid_scheme_or_chain_letter"/>
-		<combo_box.item label="詐欺> US$" name="Fraud__US$"/>
-		<combo_box.item label="嫌がらせ>広告委託/視覚的なスパム" name="Harassment__Advert_farms___visual_spam"/>
-		<combo_box.item label="嫌がらせ>個人またはグループの中傷" name="Harassment__Defaming_individuals_or_groups"/>
-		<combo_box.item label="嫌がらせ>移動の妨害" name="Harassment__Impeding_movement"/>
-		<combo_box.item label="嫌がらせ>性的な嫌がらせ" name="Harassment__Sexual_harassment"/>
-		<combo_box.item label="嫌がらせ>利用規約(ToS)に違反する行為を行うよう他者を勧誘/扇動" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
-		<combo_box.item label="嫌がらせ>暴言" name="Harassment__Verbal_abuse"/>
-		<combo_box.item label="わいせつ>著しく不快であると見なされるコンテンツまたは行為" name="Indecency__Broadly_offensive_content_or_conduct"/>
-		<combo_box.item label="わいせつ>不適切なアバター名" name="Indecency__Inappropriate_avatar_name"/>
-		<combo_box.item label="わいせつ>PG地域での不適切なコンテンツまたは行為" name="Indecency__Mature_content_in_PG_region"/>
-		<combo_box.item label="わいせつ>Mature地域での不適切なコンテンツまたは行為" name="Indecency__Inappropriate_content_in_Mature_region"/>
-		<combo_box.item label="知的財産の侵害>コンテンツの撤去" name="Intellectual_property_infringement_Content_Removal"/>
-		<combo_box.item label="知的財産の侵害>コピーBot及び権限の悪用" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
-		<combo_box.item label="不寛容" name="Intolerance"/>
-		<combo_box.item label="土地>サンドボックス・リソースの乱用" name="Land__Abuse_of_sandbox_resources"/>
-		<combo_box.item label="土地>不法侵入>オブジェクト/テクスチャー" name="Land__Encroachment__Objects_textures"/>
-		<combo_box.item label="土地>不法侵入>パーティクル" name="Land__Encroachment__Particles"/>
-		<combo_box.item label="土地>不法侵入>樹木/植物" name="Land__Encroachment__Trees_plants"/>
-		<combo_box.item label="賭け/ギャンブル" name="Wagering_gambling"/>
-		<combo_box.item label="その他" name="Other"/>
-	</combo_box>
-	<text name="abuser_name_title">
-		迷惑ユーザーの名前:
-	</text>
-	<button label="選択" label_selected="" name="select_abuser" tool_tip="嫌がらせをした人の名前をリストから選択してください。"/>
-	<text name="abuser_name_title2">
-		嫌がらせの起きた場所:
-	</text>
-	<text name="sum_title">
-		概要:
-	</text>
-	<text name="dscr_title">
-		詳細:
-	</text>
-	<text name="bug_aviso">
-		できるだけ具体的にお願いします。
-	</text>
-	<text name="incomplete_title">
-		注意:不完全なレポートは調査されません。
-	</text>
-	<button label="嫌がらせの報告" label_selected="嫌がらせの報告" name="send_btn"/>
-	<button label="取り消し" label_selected="取り消し" name="cancel_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_report_abuse" title="嫌がらせの報告">
+	<floater.string name="Screenshot">
+		スクリーンショット
+	</floater.string>
+	<check_box label="このスクリーンショットを使用" name="screen_check"/>
+	<text name="reporter_title">
+		報告者:
+	</text>
+	<text name="reporter_field">
+		Loremipsum Dolorsitamut
+	</text>
+	<text name="sim_title">
+		地域:
+	</text>
+	<text name="sim_field">
+		地域名
+	</text>
+	<text name="pos_title">
+		位置:
+	</text>
+	<text name="pos_field">
+		{128.1, 128.1, 15.4}
+	</text>
+	<text name="select_object_label">
+		ボタンをクリック。悪意のあるオブジェクト:
+	</text>
+	<button label="" label_selected="" name="pick_btn" tool_tip="オブジェクト・ピッカー - この報告の主題となるオブジェクトを特定"/>
+	<text name="object_name_label">
+		オブジェクト:
+	</text>
+	<text name="object_name">
+		Consetetur Sadipscing
+	</text>
+	<text name="owner_name_label">
+		オーナー:
+	</text>
+	<text name="owner_name">
+		Hendrerit Vulputate
+	</text>
+	<combo_box name="category_combo" tool_tip="カテゴリー -- この報告に最も適したカテゴリーを選択してください">
+		<combo_box.item label="カテゴリーを選択" name="Select_category"/>
+		<combo_box.item label="年齢>年齢偽証" name="Age__Age_play"/>
+		<combo_box.item label="年齢>成人の住人がTeen Second Life上にいる" name="Age__Adult_resident_on_Teen_Second_Life"/>
+		<combo_box.item label="年齢>未成年な住人がTeen Second Lifeの外にいる" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+		<combo_box.item label="攻撃>コンバット・サンドボックス/危険なエリア" name="Assault__Combat_sandbox___unsafe_area"/>
+		<combo_box.item label="攻撃>安全なエリア" name="Assault__Safe_area"/>
+		<combo_box.item label="攻撃>武器テスト用サンドボックス" name="Assault__Weapons_testing_sandbox"/>
+		<combo_box.item label="商取引>製品またはサービスの提供が行われない" name="Commerce__Failure_to_deliver_product_or_service"/>
+		<combo_box.item label="開示>リアルワールドの情報" name="Disclosure__Real_world_information"/>
+		<combo_box.item label="開示>離れたところからチャットをモニターしている" name="Disclosure__Remotely_monitoring chat"/>
+		<combo_box.item label="開示>Second Lifeの情報/チャット/IM" name="Disclosure__Second_Life_information_chat_IMs"/>
+		<combo_box.item label="平穏を乱す行為>地域リソースの使用が不公平" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+		<combo_box.item label="平穏を乱す行為>スクリプト・オブジェクトの乱用" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+		<combo_box.item label="平穏を乱す行為>オブジェクトの捨て置き" name="Disturbing_the_peace__Object_littering"/>
+		<combo_box.item label="平穏を乱す行為>繰り返しスパム" name="Disturbing_the_peace__Repetitive_spam"/>
+		<combo_box.item label="平穏を乱す行為>不要な広告スパム" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+		<combo_box.item label="詐欺> L$" name="Fraud__L$"/>
+		<combo_box.item label="詐欺>土地" name="Fraud__Land"/>
+		<combo_box.item label="詐欺>マルチ商法またはチェーン・メール" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+		<combo_box.item label="詐欺> US$" name="Fraud__US$"/>
+		<combo_box.item label="嫌がらせ>広告委託/視覚的なスパム" name="Harassment__Advert_farms___visual_spam"/>
+		<combo_box.item label="嫌がらせ>個人またはグループの中傷" name="Harassment__Defaming_individuals_or_groups"/>
+		<combo_box.item label="嫌がらせ>移動の妨害" name="Harassment__Impeding_movement"/>
+		<combo_box.item label="嫌がらせ>性的な嫌がらせ" name="Harassment__Sexual_harassment"/>
+		<combo_box.item label="嫌がらせ>利用規約(ToS)に違反する行為を行うよう他者を勧誘/扇動" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+		<combo_box.item label="嫌がらせ>暴言" name="Harassment__Verbal_abuse"/>
+		<combo_box.item label="わいせつ>著しく不快であると見なされるコンテンツまたは行為" name="Indecency__Broadly_offensive_content_or_conduct"/>
+		<combo_box.item label="わいせつ>不適切なアバター名" name="Indecency__Inappropriate_avatar_name"/>
+		<combo_box.item label="わいせつ>PG地域での不適切なコンテンツまたは行為" name="Indecency__Mature_content_in_PG_region"/>
+		<combo_box.item label="わいせつ>Mature地域での不適切なコンテンツまたは行為" name="Indecency__Inappropriate_content_in_Mature_region"/>
+		<combo_box.item label="知的財産の侵害>コンテンツの撤去" name="Intellectual_property_infringement_Content_Removal"/>
+		<combo_box.item label="知的財産の侵害>コピーBot及び権限の悪用" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+		<combo_box.item label="不寛容" name="Intolerance"/>
+		<combo_box.item label="土地>サンドボックス・リソースの乱用" name="Land__Abuse_of_sandbox_resources"/>
+		<combo_box.item label="土地>不法侵入>オブジェクト/テクスチャー" name="Land__Encroachment__Objects_textures"/>
+		<combo_box.item label="土地>不法侵入>パーティクル" name="Land__Encroachment__Particles"/>
+		<combo_box.item label="土地>不法侵入>樹木/植物" name="Land__Encroachment__Trees_plants"/>
+		<combo_box.item label="賭け/ギャンブル" name="Wagering_gambling"/>
+		<combo_box.item label="その他" name="Other"/>
+	</combo_box>
+	<text name="abuser_name_title">
+		迷惑ユーザーの名前:
+	</text>
+	<button label="選択" label_selected="" name="select_abuser" tool_tip="嫌がらせをした人の名前をリストから選択してください。"/>
+	<text name="abuser_name_title2">
+		嫌がらせの起きた場所:
+	</text>
+	<text name="sum_title">
+		概要:
+	</text>
+	<text name="dscr_title">
+		詳細:
+	</text>
+	<text name="bug_aviso">
+		できるだけ具体的にお願いします。
+	</text>
+	<text name="incomplete_title">
+		注意:不完全なレポートは調査されません。
+	</text>
+	<button label="嫌がらせの報告" label_selected="嫌がらせの報告" name="send_btn"/>
+	<button label="取り消し" label_selected="取り消し" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml
index fc805e879b8..ef021ce7131 100644
--- a/indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml
+++ b/indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script" short_title="[All scripts]" title="[All scripts]"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script" short_title="[All scripts]" title="[All scripts]"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_script_preview.xml b/indra/newview/skins/default/xui/ja/floater_script_preview.xml
index 583a2f8b91a..82fe741d676 100644
--- a/indra/newview/skins/default/xui/ja/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_script_preview.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview lsl text" title="スクリプト:回転スクリプト">
-	<floater.string name="Title">
-		スクリプト: [NAME]
-	</floater.string>
-	<text name="desc txt">
-		説明:
-	</text>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview lsl text" title="スクリプト:回転スクリプト">
+	<floater.string name="Title">
+		スクリプト: [NAME]
+	</floater.string>
+	<text name="desc txt">
+		説明:
+	</text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_script_queue.xml b/indra/newview/skins/default/xui/ja/floater_script_queue.xml
index 5e059b91caa..22a79e16d68 100644
--- a/indra/newview/skins/default/xui/ja/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/ja/floater_script_queue.xml
@@ -1,19 +1,19 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="queue" title="進捗のリセット">
-	<floater.string name="Starting">
-		[COUNT] アイテムの [START] を開始します。
-	</floater.string>
-	<floater.string name="Done">
-		完了。
-	</floater.string>
-	<floater.string name="Resetting">
-		リセット中
-	</floater.string>
-	<floater.string name="Running">
-		実行中
-	</floater.string>
-	<floater.string name="NotRunning">
-		実行されていません
-	</floater.string>
-	<button label="閉じる" label_selected="閉じる" name="close"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="queue" title="進捗のリセット">
+	<floater.string name="Starting">
+		[COUNT] アイテムの [START] を開始します。
+	</floater.string>
+	<floater.string name="Done">
+		完了。
+	</floater.string>
+	<floater.string name="Resetting">
+		リセット中
+	</floater.string>
+	<floater.string name="Running">
+		実行中
+	</floater.string>
+	<floater.string name="NotRunning">
+		実行されていません
+	</floater.string>
+	<button label="閉じる" label_selected="閉じる" name="close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_sell_land.xml b/indra/newview/skins/default/xui/ja/floater_sell_land.xml
index f373a7215e0..96a9a76a725 100644
--- a/indra/newview/skins/default/xui/ja/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_sell_land.xml
@@ -1,70 +1,70 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater height="496" min_height="496" name="sell land" title="土地を販売">
-	<scroll_container name="profile_scroll">
-		<panel name="scroll_content_panel">
-			<text name="info_parcel_label">
-				区画:
-			</text>
-			<text name="info_parcel">
-				区画名
-			</text>
-			<text name="info_size_label">
-				サイズ:
-			</text>
-			<text name="info_size">
-				[AREA]平方メートル
-			</text>
-			<text bottom_delta="-57" name="info_action">
-				この区画を販売す
-るには:
-			</text>
-			<icon bottom_delta="-86" name="step_price"/>
-			<text name="price_label">
-				価格を設定:
-			</text>
-			<text name="price_text">
-				適正価格を選んでください。
-			</text>
-			<text name="price_ld">
-				L$
-			</text>
-			<text left_delta="106" name="price_per_m" width="230">
-				(1平方メートル当たりL$ [PER_METER])
-			</text>
-			<text name="sell_to_label">
-				土地の販売先:
-			</text>
-			<text name="sell_to_text" right="-6">
-				誰にでも販売するか、特定の人にのみ販売するかを選択してください
-			</text>
-			<combo_box name="sell_to">
-				<combo_box.item label="1つ選択--" name="--selectone--"/>
-				<combo_box.item label="誰でも" name="Anyone"/>
-				<combo_box.item label="特定の人:" name="Specificuser:"/>
-			</combo_box>
-			<button label="選択..." name="sell_to_select_agent"/>
-			<text name="sell_objects_label">
-				土地と共にオブジェクトを販売しますか?
-			</text>
-			<text name="sell_objects_text">
-				区画上にある譲渡可能なオブジェクトは所有権が変更されます
-			</text>
-			<radio_group bottom_delta="-76" height="72" name="sell_objects">
-				<radio_item name="no">
-					いいえ、オブジェクト所有権
-を保持します
-				</radio_item>
-				<radio_item bottom="-56" name="yes">
-					はい、土地と一緒にオブジェ
-クトを売ります
-				</radio_item>
-			</radio_group>
-			<button label="オブジェクトを表示" name="show_objects" width="138"/>
-			<text name="nag_message_label">
-				注意:返品や交換はできません
-			</text>
-			<button bottom="-489" label="販売を決定" name="sell_btn"/>
-			<button label="取り消し" name="cancel_btn"/>
-		</panel>
-	</scroll_container>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater height="496" min_height="496" name="sell land" title="土地を販売">
+	<scroll_container name="profile_scroll">
+		<panel name="scroll_content_panel">
+			<text name="info_parcel_label">
+				区画:
+			</text>
+			<text name="info_parcel">
+				区画名
+			</text>
+			<text name="info_size_label">
+				サイズ:
+			</text>
+			<text name="info_size">
+				[AREA]平方メートル
+			</text>
+			<text bottom_delta="-57" name="info_action">
+				この区画を販売す
+るには:
+			</text>
+			<icon bottom_delta="-86" name="step_price"/>
+			<text name="price_label">
+				価格を設定:
+			</text>
+			<text name="price_text">
+				適正価格を選んでください。
+			</text>
+			<text name="price_ld">
+				L$
+			</text>
+			<text left_delta="106" name="price_per_m" width="230">
+				(1平方メートル当たりL$ [PER_METER])
+			</text>
+			<text name="sell_to_label">
+				土地の販売先:
+			</text>
+			<text name="sell_to_text" right="-6">
+				誰にでも販売するか、特定の人にのみ販売するかを選択してください
+			</text>
+			<combo_box name="sell_to">
+				<combo_box.item label="1つ選択--" name="--selectone--"/>
+				<combo_box.item label="誰でも" name="Anyone"/>
+				<combo_box.item label="特定の人:" name="Specificuser:"/>
+			</combo_box>
+			<button label="選択..." name="sell_to_select_agent"/>
+			<text name="sell_objects_label">
+				土地と共にオブジェクトを販売しますか?
+			</text>
+			<text name="sell_objects_text">
+				区画上にある譲渡可能なオブジェクトは所有権が変更されます
+			</text>
+			<radio_group bottom_delta="-76" height="72" name="sell_objects">
+				<radio_item name="no">
+					いいえ、オブジェクト所有権
+を保持します
+				</radio_item>
+				<radio_item bottom="-56" name="yes">
+					はい、土地と一緒にオブジェ
+クトを売ります
+				</radio_item>
+			</radio_group>
+			<button label="オブジェクトを表示" name="show_objects" width="138"/>
+			<text name="nag_message_label">
+				注意:返品や交換はできません
+			</text>
+			<button bottom="-489" label="販売を決定" name="sell_btn"/>
+			<button label="取り消し" name="cancel_btn"/>
+		</panel>
+	</scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_settings_debug.xml b/indra/newview/skins/default/xui/ja/floater_settings_debug.xml
index 6ad4976b1c3..cb7950bf533 100644
--- a/indra/newview/skins/default/xui/ja/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/ja/floater_settings_debug.xml
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="settings_debug" title="デバッグ設定">
-	<combo_box name="boolean_combo">
-		<combo_box.item label="TRUE" name="TRUE"/>
-		<combo_box.item label="FALSE" name="FALSE"/>
-	</combo_box>
-	<color_swatch label="色" name="val_color_swatch"/>
-	<spinner label="x" name="val_spinner_1"/>
-	<spinner label="x" name="val_spinner_2"/>
-	<spinner label="x" name="val_spinner_3"/>
-	<spinner label="x" name="val_spinner_4"/>
-	<button label="デフォルトにリセット" name="default_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="settings_debug" title="デバッグ設定">
+	<combo_box name="boolean_combo">
+		<combo_box.item label="TRUE" name="TRUE"/>
+		<combo_box.item label="FALSE" name="FALSE"/>
+	</combo_box>
+	<color_swatch label="色" name="val_color_swatch"/>
+	<spinner label="x" name="val_spinner_1"/>
+	<spinner label="x" name="val_spinner_2"/>
+	<spinner label="x" name="val_spinner_3"/>
+	<spinner label="x" name="val_spinner_4"/>
+	<button label="デフォルトにリセット" name="default_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_stats.xml b/indra/newview/skins/default/xui/ja/floater_stats.xml
index 698beccb071..2a45d8556bc 100644
--- a/indra/newview/skins/default/xui/ja/floater_stats.xml
+++ b/indra/newview/skins/default/xui/ja/floater_stats.xml
@@ -1,71 +1,71 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Statistics" title="統計バー">
-	<scroll_container name="statistics_scroll">
-		<container_view name="statistics_view">
-			<stat_view label="ベーシック" name="basic">
-				<stat_bar label="FPS" name="fps"/>
-				<stat_bar label="帯域幅" name="bandwidth"/>
-				<stat_bar label="パケットロス" name="packet_loss"/>
-				<stat_bar label="シムの Ping" name="ping"/>
-			</stat_view>
-			<stat_view label="詳細" name="advanced">
-				<stat_view label="レンダリング" name="render">
-					<stat_bar label="KTris の描画" name="ktrisframe"/>
-					<stat_bar label="KTris の描画" name="ktrissec"/>
-					<stat_bar label="オブジェクト合計" name="objs"/>
-					<stat_bar label="新しいオブジェクト" name="newobjs"/>
-				</stat_view>
-				<stat_view label="テクスチャ" name="texture">
-					<stat_bar label="カウント" name="numimagesstat"/>
-					<stat_bar label="未処理のカウント" name="numrawimagesstat"/>
-					<stat_bar label="GL メモリ" name="gltexmemstat"/>
-					<stat_bar label="フォーマット済メモリ" name="formattedmemstat"/>
-					<stat_bar label="未処理のメモリ" name="rawmemstat"/>
-					<stat_bar label="統合メモリ" name="glboundmemstat"/>
-				</stat_view>
-				<stat_view label="ネットワーク" name="network">
-					<stat_bar label="パケットイン" name="packetsinstat"/>
-					<stat_bar label="パケットアウト" name="packetsoutstat"/>
-					<stat_bar label="オブジェクト" name="objectkbitstat"/>
-					<stat_bar label="テクスチャ" name="texturekbitstat"/>
-					<stat_bar label="アセット" name="assetkbitstat"/>
-					<stat_bar label="レイヤー" name="layerskbitstat"/>
-					<stat_bar label="実際の受信" name="actualinkbitstat"/>
-					<stat_bar label="実際の送信" name="actualoutkbitstat"/>
-					<stat_bar label="VFS 保留中の操作" name="vfspendingoperations"/>
-				</stat_view>
-			</stat_view>
-			<stat_view label="シミュレーター" name="sim">
-				<stat_bar label="時間の遅れ" name="simtimedilation"/>
-				<stat_bar label="シム FPS" name="simfps"/>
-				<stat_bar label="物理的作用 FPS" name="simphysicsfps"/>
-				<stat_view label="物理的作用の詳細" name="physicsdetail">
-					<stat_bar label="ピン留めオブジェクト" name="physicspinnedtasks"/>
-					<stat_bar label="低 LOD オブジェクト" name="physicslodtasks"/>
-					<stat_bar label="メモリ配分" name="physicsmemoryallocated"/>
-					<stat_bar label="エージェントの更新/秒" name="simagentups"/>
-					<stat_bar label="メインエージェント" name="simmainagents"/>
-					<stat_bar label="チャイルドエージェント" name="simchildagents"/>
-					<stat_bar label="オブジェクト" name="simobjects"/>
-					<stat_bar label="アクティブなオブジェクト" name="simactiveobjects"/>
-					<stat_bar label="アクティブなスクリプト" name="simactivescripts"/>
-					<stat_bar label="スクリプトイベント" name="simscripteps"/>
-					<stat_bar label="パケットイン" name="siminpps"/>
-					<stat_bar label="パケットアウト" name="simoutpps"/>
-					<stat_bar label="保留中のダウンロード" name="simpendingdownloads"/>
-					<stat_bar label="保留中のアップロード" name="simpendinguploads"/>
-					<stat_bar label="未送信バイト合計" name="simtotalunackedbytes"/>
-				</stat_view>
-				<stat_view label="時間(ms)" name="simperf">
-					<stat_bar label="フレーム時間合計" name="simframemsec"/>
-					<stat_bar label="総時間数" name="simnetmsec"/>
-					<stat_bar label="物理的作用時間" name="simsimphysicsmsec"/>
-					<stat_bar label="シミュレーション時間" name="simsimothermsec"/>
-					<stat_bar label="エージェント時間" name="simagentmsec"/>
-					<stat_bar label="イメージ時間" name="simimagesmsec"/>
-					<stat_bar label="スクリプト時間" name="simscriptmsec"/>
-				</stat_view>
-			</stat_view>
-		</container_view>
-	</scroll_container>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="統計バー">
+	<scroll_container name="statistics_scroll">
+		<container_view name="statistics_view">
+			<stat_view label="ベーシック" name="basic">
+				<stat_bar label="FPS" name="fps"/>
+				<stat_bar label="帯域幅" name="bandwidth"/>
+				<stat_bar label="パケットロス" name="packet_loss"/>
+				<stat_bar label="シムの Ping" name="ping"/>
+			</stat_view>
+			<stat_view label="詳細" name="advanced">
+				<stat_view label="レンダリング" name="render">
+					<stat_bar label="KTris の描画" name="ktrisframe"/>
+					<stat_bar label="KTris の描画" name="ktrissec"/>
+					<stat_bar label="オブジェクト合計" name="objs"/>
+					<stat_bar label="新しいオブジェクト" name="newobjs"/>
+				</stat_view>
+				<stat_view label="テクスチャ" name="texture">
+					<stat_bar label="カウント" name="numimagesstat"/>
+					<stat_bar label="未処理のカウント" name="numrawimagesstat"/>
+					<stat_bar label="GL メモリ" name="gltexmemstat"/>
+					<stat_bar label="フォーマット済メモリ" name="formattedmemstat"/>
+					<stat_bar label="未処理のメモリ" name="rawmemstat"/>
+					<stat_bar label="統合メモリ" name="glboundmemstat"/>
+				</stat_view>
+				<stat_view label="ネットワーク" name="network">
+					<stat_bar label="パケットイン" name="packetsinstat"/>
+					<stat_bar label="パケットアウト" name="packetsoutstat"/>
+					<stat_bar label="オブジェクト" name="objectkbitstat"/>
+					<stat_bar label="テクスチャ" name="texturekbitstat"/>
+					<stat_bar label="アセット" name="assetkbitstat"/>
+					<stat_bar label="レイヤー" name="layerskbitstat"/>
+					<stat_bar label="実際の受信" name="actualinkbitstat"/>
+					<stat_bar label="実際の送信" name="actualoutkbitstat"/>
+					<stat_bar label="VFS 保留中の操作" name="vfspendingoperations"/>
+				</stat_view>
+			</stat_view>
+			<stat_view label="シミュレーター" name="sim">
+				<stat_bar label="時間の遅れ" name="simtimedilation"/>
+				<stat_bar label="シム FPS" name="simfps"/>
+				<stat_bar label="物理的作用 FPS" name="simphysicsfps"/>
+				<stat_view label="物理的作用の詳細" name="physicsdetail">
+					<stat_bar label="ピン留めオブジェクト" name="physicspinnedtasks"/>
+					<stat_bar label="低 LOD オブジェクト" name="physicslodtasks"/>
+					<stat_bar label="メモリ配分" name="physicsmemoryallocated"/>
+					<stat_bar label="エージェントの更新/秒" name="simagentups"/>
+					<stat_bar label="メインエージェント" name="simmainagents"/>
+					<stat_bar label="チャイルドエージェント" name="simchildagents"/>
+					<stat_bar label="オブジェクト" name="simobjects"/>
+					<stat_bar label="アクティブなオブジェクト" name="simactiveobjects"/>
+					<stat_bar label="アクティブなスクリプト" name="simactivescripts"/>
+					<stat_bar label="スクリプトイベント" name="simscripteps"/>
+					<stat_bar label="パケットイン" name="siminpps"/>
+					<stat_bar label="パケットアウト" name="simoutpps"/>
+					<stat_bar label="保留中のダウンロード" name="simpendingdownloads"/>
+					<stat_bar label="保留中のアップロード" name="simpendinguploads"/>
+					<stat_bar label="未送信バイト合計" name="simtotalunackedbytes"/>
+				</stat_view>
+				<stat_view label="時間(ms)" name="simperf">
+					<stat_bar label="フレーム時間合計" name="simframemsec"/>
+					<stat_bar label="総時間数" name="simnetmsec"/>
+					<stat_bar label="物理的作用時間" name="simsimphysicsmsec"/>
+					<stat_bar label="シミュレーション時間" name="simsimothermsec"/>
+					<stat_bar label="エージェント時間" name="simagentmsec"/>
+					<stat_bar label="イメージ時間" name="simimagesmsec"/>
+					<stat_bar label="スクリプト時間" name="simscriptmsec"/>
+				</stat_view>
+			</stat_view>
+		</container_view>
+	</scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml
index 880f42840cf..5ce2c291beb 100644
--- a/indra/newview/skins/default/xui/ja/floater_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_tools.xml
@@ -1,477 +1,477 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" short_title="制作ツール" title="">
-	<floater.string name="status_rotate">
-		色の付いたバンドをドラッグしてオブジェクトを回転
-	</floater.string>
-	<floater.string name="status_scale">
-		選択した側をクリックし、ドラッグして引き伸ばす
-	</floater.string>
-	<floater.string name="status_move">
-		移動:ドラッグ、コピー:Shiftを押しながらドラッグ
-	</floater.string>
-	<floater.string name="status_modifyland">
-		土地をクリックし、ボタンを押したまま入力して修正変更
-	</floater.string>
-	<floater.string name="status_camera">
-		クリック・ドラッグで視界を移動
-	</floater.string>
-	<floater.string name="status_grab">
-		移動:ドラッグ、持ち上げ:Ctrl、回転:Ctrl+Shift
-	</floater.string>
-	<floater.string name="status_place">
-		インワールドでクリックして作成
-	</floater.string>
-	<floater.string name="status_selectland">
-		土地をクリックし、ドラッグして選択
-	</floater.string>
-	<floater.string name="grid_screen_text">
-		画面
-	</floater.string>
-	<floater.string name="grid_local_text">
-		ローカル
-	</floater.string>
-	<floater.string name="grid_world_text">
-		世界
-	</floater.string>
-	<floater.string name="grid_reference_text">
-		参照
-	</floater.string>
-	<floater.string name="grid_attachment_text">
-		アタッチメント
-	</floater.string>
-	<button label="" label_selected="" name="button focus" tool_tip="フォーカス"/>
-	<button label="" label_selected="" name="button move" tool_tip="動かす"/>
-	<button label="" label_selected="" name="button edit" tool_tip="編集"/>
-	<button label="" label_selected="" name="button create" tool_tip="作成"/>
-	<button label="" label_selected="" name="button land" tool_tip="土地"/>
-	<text name="text status">
-		移動するにはドラッグ、コピーするにはShiftキーを押しながらドラッグ
-	</text>
-	<radio_group name="focus_radio_group">
-		<radio_item label="ズーム" name="radio zoom"/>
-		<radio_item label="軌跡(Ctrl)" name="radio orbit"/>
-		<radio_item label="パン(Ctrl+Shift)" name="radio pan"/>
-	</radio_group>
-	<radio_group name="move_radio_group">
-		<radio_item label="移動" name="radio move"/>
-		<radio_item label="持ち上げる(Ctrl)" name="radio lift"/>
-		<radio_item label="スピン(Ctrl+Shift)" name="radio spin"/>
-	</radio_group>
-	<radio_group name="edit_radio_group">
-		<radio_item label="移動" name="radio position"/>
-		<radio_item label="回転(Ctrl)" name="radio rotate"/>
-		<radio_item label="引伸ばす(Ctrl+Shift)" name="radio stretch"/>
-		<radio_item label="テクスチャーを選択" name="radio select face"/>
-	</radio_group>
-	<check_box label="リンク部分を編集" name="checkbox edit linked parts"/>
-	<check_box label="両側を引伸ばす" left="116" name="checkbox uniform"/>
-	<check_box initial_value="true" label="テクスチャーを引伸ばす" name="checkbox stretch textures"/>
-	<check_box initial_value="true" label="グリッドポイントにスナップ" left_delta="27" name="checkbox snap to grid"/>
-	<combo_box left_delta="60" name="combobox grid mode" width="76">
-		<combo_box.item label="ワールドルーラ" name="World"/>
-		<combo_box.item label="ローカルルーラ" name="Local"/>
-		<combo_box.item label="レファレンスルーラ" name="Reference"/>
-	</combo_box>
-	<button label="オプション" label_selected="オプション" name="Options..." tool_tip="グリッドオプションを設定"/>
-	<button label="" label_selected="" name="ToolCube" tool_tip="キューブ"/>
-	<button label="" label_selected="" name="ToolPrism" tool_tip="プリズム"/>
-	<button label="" label_selected="" name="ToolPyramid" tool_tip="ピラミッド"/>
-	<button label="" label_selected="" name="ToolTetrahedron" tool_tip="4面体"/>
-	<button label="" label_selected="" name="ToolCylinder" tool_tip="シリンダー"/>
-	<button label="" label_selected="" name="ToolHemiCylinder" tool_tip="半円柱"/>
-	<button label="" label_selected="" name="ToolCone" tool_tip="円錐"/>
-	<button label="" label_selected="" name="ToolHemiCone" tool_tip="半円錐"/>
-	<button label="" label_selected="" name="ToolSphere" tool_tip="球形"/>
-	<button label="" label_selected="" name="ToolHemiSphere" tool_tip="半球"/>
-	<button label="" label_selected="" name="ToolTorus" tool_tip="トーラス"/>
-	<button label="" label_selected="" name="ToolTube" tool_tip="チューブ"/>
-	<button label="" label_selected="" name="ToolRing" tool_tip="リング"/>
-	<button label="" label_selected="" name="ToolTree" tool_tip="樹木"/>
-	<button label="" label_selected="" name="ToolGrass" tool_tip="草地"/>
-	<check_box label="選択したものを保持" name="checkbox sticky"/>
-	<check_box label="選択したものをコピー" name="checkbox copy selection"/>
-	<check_box initial_value="true" label="中央にコピー" name="checkbox copy centers"/>
-	<check_box label="回転させてコピー" name="checkbox copy rotates"/>
-	<radio_group name="land_radio_group">
-		<radio_item label="土地を選択" name="radio select land"/>
-		<radio_item label="ならす" name="radio flatten"/>
-		<radio_item label="隆起" name="radio raise"/>
-		<radio_item label="低くする" name="radio lower"/>
-		<radio_item label="滑らかにする" name="radio smooth"/>
-		<radio_item label="凸凹にする" name="radio noise"/>
-		<radio_item label="元に戻す" name="radio revert"/>
-	</radio_group>
-	<text name="Bulldozer:">
-		ブルドーザー:
-	</text>
-	<text name="Dozer Size:">
-		サイズ
-	</text>
-	<text name="Strength:">
-		強度
-	</text>
-	<button label="適用" label_selected="適用" name="button apply to selection" tool_tip="選択した土地を修正"/>
-	<text name="obj_count">
-		オブジェクト: [COUNT]
-	</text>
-	<text name="prim_count">
-		プリム: [COUNT]
-	</text>
-	<tab_container name="Object Info Tabs" tab_max_width="150" tab_min_width="30">
-		<panel label="一般" name="General">
-			<panel.string name="text deed continued">
-				譲渡
-			</panel.string>
-			<panel.string name="text deed">
-				譲渡
-			</panel.string>
-			<panel.string name="text modify info 1">
-				このオブジェクトは修正できます。
-			</panel.string>
-			<panel.string name="text modify info 2">
-				これらのオブジェクトは修正できます。
-			</panel.string>
-			<panel.string name="text modify info 3">
-				このオブジェクトは修正できません。
-			</panel.string>
-			<panel.string name="text modify info 4">
-				これらのオブジェクトは修正できません。
-			</panel.string>
-			<panel.string name="text modify warning">
-				オブジェクト全体を選択して権限の設定を行ってください。
-			</panel.string>
-			<panel.string name="Cost Default">
-				価格: L$
-			</panel.string>
-			<panel.string name="Cost Total">
-				合計価格: L$
-			</panel.string>
-			<panel.string name="Cost Per Unit">
-				単価: L$
-			</panel.string>
-			<panel.string name="Cost Mixed">
-				混合価格
-			</panel.string>
-			<panel.string name="Sale Mixed">
-				混合販売
-			</panel.string>
-			<text name="Name:">
-				名前:
-			</text>
-			<text name="Description:">
-				説明:
-			</text>
-			<text name="Creator:">
-				クリエーター
-			</text>
-			<text name="Creator Name">
-				Thrax Linden
-			</text>
-			<text name="Owner:">
-				オーナー:
-			</text>
-			<text name="Owner Name">
-				Thrax Linden
-			</text>
-			<text name="Group:">
-				グループ:
-			</text>
-			<button label="設定..." label_selected="設定..." name="button set group" tool_tip="このオブジェクト権限を共有するグループを選択"/>
-			<name_box initial_value="ローディング..." name="Group Name Proxy"/>
-			<button label="譲渡" label_selected="譲渡" name="button deed" tool_tip="このアイテムを譲渡すると次の所有者の権限が適用されます。 グループ共有オブジェクトは、グループのオフィサーが譲渡できます。"/>
-			<check_box label="共有" name="checkbox share with group" tool_tip="設定したグループのメンバー全員にこのオブジェクトの修正権限を与えます。 役割制限を有効にするには、譲渡する必要があります。"/>
-			<text name="label click action">
-				クリックで:
-			</text>
-			<combo_box name="clickaction">
-				<combo_box.item label="触れる(デフォルト)" name="Touch/grab(default)"/>
-				<combo_box.item label="オブジェクトに座る" name="Sitonobject"/>
-				<combo_box.item label="オブジェクトを購入" name="Buyobject"/>
-				<combo_box.item label="オブジェクトへの支払い" name="Payobject"/>
-				<combo_box.item label="開く" name="Open"/>
-			</combo_box>
-			<check_box label="販売中:" name="checkbox for sale"/>
-			<combo_box name="sale type">
-				<combo_box.item label="コピー" name="Copy"/>
-				<combo_box.item label="コンテンツ" name="Contents"/>
-				<combo_box.item label="オリジナル" name="Original"/>
-			</combo_box>
-			<spinner label="価格: L$" name="Edit Cost"/>
-			<check_box label="検索に表示" name="search_check" tool_tip="検索結果で、このオブジェクトを人に見せる"/>
-			<panel name="perms_build">
-				<text name="perm_modify">
-					このオブジェクトを修正できます
-				</text>
-				<text name="Anyone can:">
-					全員:
-				</text>
-				<check_box label="コピー" name="checkbox allow everyone copy"/>
-				<text name="Next owner can:">
-					次の所有者:
-				</text>
-				<check_box label="修正" name="checkbox next owner can modify"/>
-				<check_box label="コピー" name="checkbox next owner can copy"/>
-				<check_box label="再販・プレゼント" name="checkbox next owner can transfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販することができます"/>
-				<text name="B:">
-					B:
-				</text>
-				<text name="O:">
-					O:
-				</text>
-				<text name="G:">
-					G:
-				</text>
-				<text name="E:">
-					E:
-				</text>
-				<text name="N:">
-					N:
-				</text>
-				<text name="F:">
-					F:
-				</text>
-			</panel>
-		</panel>
-		<panel label="形状" name="Object">
-			<check_box label="ロック済み" name="checkbox locked" tool_tip="オブジェクトの移動と削除を禁止します。 この機能を使うと、構築中に意図しない編集を防ぐことができます。"/>
-			<check_box label="物理" name="Physical Checkbox Ctrl" tool_tip="オブジェクトに対する重力の作用と影響を有効にする"/>
-			<check_box label="臨時" name="Temporary Checkbox Ctrl" tool_tip="作成1分後にオブジェクトを削除"/>
-			<check_box label="ファントム" name="Phantom Checkbox Ctrl" tool_tip="オブジェクト同士の衝突またはオブジェクトとアバターの衝突を回避"/>
-			<text name="label position">
-				位置(メートル)
-			</text>
-			<spinner label="X" name="Pos X"/>
-			<spinner label="Y" name="Pos Y"/>
-			<spinner label="Z" name="Pos Z"/>
-			<text name="label size">
-				サイズ(メートル)
-			</text>
-			<spinner label="X" name="Scale X"/>
-			<spinner label="Y" name="Scale Y"/>
-			<spinner label="Z" name="Scale Z"/>
-			<text name="label rotation">
-				回転(度)
-			</text>
-			<spinner label="X" name="Rot X"/>
-			<spinner label="Y" name="Rot Y"/>
-			<spinner label="Z" name="Rot Z"/>
-			<combo_box name="comboBaseType">
-				<combo_box.item label="ボックス" name="Box"/>
-				<combo_box.item label="シリンダー" name="Cylinder"/>
-				<combo_box.item label="プリズム" name="Prism"/>
-				<combo_box.item label="球形" name="Sphere"/>
-				<combo_box.item label="トーラス" name="Torus"/>
-				<combo_box.item label="チューブ" name="Tube"/>
-				<combo_box.item label="リング" name="Ring"/>
-				<combo_box.item label="スカルプト" name="Sculpted"/>
-			</combo_box>
-			<combo_box name="material">
-				<combo_box.item label="石材" name="Stone"/>
-				<combo_box.item label="金属" name="Metal"/>
-				<combo_box.item label="ガラス" name="Glass"/>
-				<combo_box.item label="木材" name="Wood"/>
-				<combo_box.item label="肌" name="Flesh"/>
-				<combo_box.item label="プラスチック" name="Plastic"/>
-				<combo_box.item label="ゴム" name="Rubber"/>
-			</combo_box>
-			<text name="text cut">
-				パスカット(始点/終点)
-			</text>
-			<spinner label="B" name="cut begin"/>
-			<spinner label="E" name="cut end"/>
-			<text name="text hollow">
-				中空(空洞)
-			</text>
-			<text name="text skew">
-				傾斜
-			</text>
-			<text name="Hollow Shape">
-				中空(空洞)の形
-			</text>
-			<combo_box name="hole">
-				<combo_box.item label="デフォルト" name="Default"/>
-				<combo_box.item label="サークル" name="Circle"/>
-				<combo_box.item label="正方形" name="Square"/>
-				<combo_box.item label="三角形" name="Triangle"/>
-			</combo_box>
-			<text name="text twist">
-				ひねり(始点/終点)
-			</text>
-			<spinner label="B" name="Twist Begin"/>
-			<spinner label="E" name="Twist End"/>
-			<text name="scale_taper">
-				テーパー
-			</text>
-			<text name="scale_hole">
-				穴寸法
-			</text>
-			<spinner label="X" name="Taper Scale X"/>
-			<spinner label="Y" name="Taper Scale Y"/>
-			<text name="text topshear">
-				上部層
-			</text>
-			<spinner label="X" name="Shear X"/>
-			<spinner label="Y" name="Shear Y"/>
-			<text name="advanced_cut">
-				プロフィール・カット(始点/終点)
-			</text>
-			<text name="advanced_dimple">
-				くぼみ(始点/終点)
-			</text>
-			<text name="advanced_slice">
-				切り取り(始点/終点)
-			</text>
-			<spinner label="B" name="Path Limit Begin"/>
-			<spinner label="E" name="Path Limit End"/>
-			<text name="text taper2">
-				テーパー
-			</text>
-			<spinner label="X" name="Taper X"/>
-			<spinner label="Y" name="Taper Y"/>
-			<text name="text radius delta">
-				半径
-			</text>
-			<text name="text revolutions">
-				回転体
-			</text>
-			<texture_picker label="スカルプトテクスチャー" name="sculpt texture control" tool_tip="クリックして写真を選択してください。"/>
-			<check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトされたプリムをX軸上で反転"/>
-			<check_box label="裏返し" name="sculpt invert control" tool_tip="スカルプトされたプリムのノーマルを逆転させ、裏返しに表示"/>
-			<text name="label sculpt type">
-				縫い目のタイプ
-			</text>
-			<combo_box name="sculpt type control">
-				<combo_box.item label="(なし)" name="None"/>
-				<combo_box.item label="球形" name="Sphere"/>
-				<combo_box.item label="トーラス" name="Torus"/>
-				<combo_box.item label="平面" name="Plane"/>
-				<combo_box.item label="シリンダー" name="Cylinder"/>
-			</combo_box>
-		</panel>
-		<panel label="特徴" name="Features">
-			<text name="select_single">
-				プリムを1つだけ選択して編集してください
-			</text>
-			<text name="edit_object">
-				オブジェクトの特徴を編集:
-			</text>
-			<check_box label="フレキシブル・パス" name="Flexible1D Checkbox Ctrl" tool_tip="Z軸を中心とするオブジェクトの折れ曲がりを有効にする (クライアント側のみ)"/>
-			<spinner label="柔軟性" label_width="72" name="FlexNumSections" width="135"/>
-			<spinner label="重力" label_width="72" name="FlexGravity" width="135"/>
-			<spinner label="ドラッグ" label_width="72" name="FlexFriction" width="135"/>
-			<spinner label="風" label_width="72" name="FlexWind" width="135"/>
-			<spinner label="ç·Šå¼µ" label_width="72" name="FlexTension" width="135"/>
-			<spinner label="X軸方向の力" label_width="72" name="FlexForceX" width="135"/>
-			<spinner label="Y軸方向の力" label_width="72" name="FlexForceY" width="135"/>
-			<spinner label="Z軸方向の力" label_width="72" name="FlexForceZ" width="135"/>
-			<check_box label="光" name="Light Checkbox Ctrl" tool_tip="オブジェクトが発光"/>
-			<color_swatch label="" left_delta="74" name="colorswatch" tool_tip="カラー・ピッカーをクリックして開く"/>
-			<spinner label="輝度" label_width="72" name="Light Intensity" width="135"/>
-			<spinner label="半径" label_width="72" name="Light Radius" width="135"/>
-			<spinner label="弱まる" label_width="72" name="Light Falloff" width="135"/>
-		</panel>
-		<panel label="材質" name="Texture">
-			<panel.string name="string repeats per meter">
-				メートルごとに繰返す
-			</panel.string>
-			<panel.string name="string repeats per face">
-				面ごとに繰り返す
-			</panel.string>
-			<texture_picker label="テクスチャー" name="texture control" tool_tip="写真をクリックして選択"/>
-			<color_swatch label="色" name="colorswatch" tool_tip="カラー・ピッカーをクリックして開く"/>
-			<text name="color trans">
-				透過度 %
-			</text>
-			<text name="glow label">
-				グロー
-			</text>
-			<check_box label="明るさ全開" name="checkbox fullbright"/>
-			<text name="tex gen">
-				マッピング
-			</text>
-			<combo_box name="combobox texgen">
-				<combo_box.item label="デフォルト" name="Default"/>
-				<combo_box.item label="平面" name="Planar"/>
-			</combo_box>
-			<text name="label shininess">
-				輝き
-			</text>
-			<combo_box name="combobox shininess">
-				<combo_box.item label="なし" name="None"/>
-				<combo_box.item label="低" name="Low"/>
-				<combo_box.item label="中" name="Medium"/>
-				<combo_box.item label="高" name="High"/>
-			</combo_box>
-			<text name="label bumpiness">
-				凹凸
-			</text>
-			<combo_box name="combobox bumpiness">
-				<combo_box.item label="なし" name="None"/>
-				<combo_box.item label="明るさ" name="Brightness"/>
-				<combo_box.item label="暗さ" name="Darkness"/>
-				<combo_box.item label="木目調" name="woodgrain"/>
-				<combo_box.item label="木の皮" name="bark"/>
-				<combo_box.item label="レンガ" name="bricks"/>
-				<combo_box.item label="チェッカー" name="checker"/>
-				<combo_box.item label="コンクリート" name="concrete"/>
-				<combo_box.item label="クラスティ・タイル" name="crustytile"/>
-				<combo_box.item label="カットストーン" name="cutstone"/>
-				<combo_box.item label="ディスク" name="discs"/>
-				<combo_box.item label="砂利" name="gravel"/>
-				<combo_box.item label="ペトリ" name="petridish"/>
-				<combo_box.item label="羽目板" name="siding"/>
-				<combo_box.item label="ストーン・タイル" name="stonetile"/>
-				<combo_box.item label="しっくい" name="stucco"/>
-				<combo_box.item label="吸い込み" name="suction"/>
-				<combo_box.item label="織目" name="weave"/>
-			</combo_box>
-			<text name="tex scale">
-				面ごとに繰り返す
-			</text>
-			<spinner label="水平(U)" name="TexScaleU"/>
-			<check_box label="反転" name="checkbox flip s"/>
-			<spinner label="垂直(V)" name="TexScaleV"/>
-			<check_box label="反転" name="checkbox flip t"/>
-			<button label="適用" label_selected="適用" name="button apply"/>
-			<text name="tex offset">
-				Texture Offset
-			</text>
-			<spinner label="水平(U)" name="TexOffsetU"/>
-			<spinner label="垂直(V)" name="TexOffsetV"/>
-		</panel>
-		<panel label="中身" name="Contents">
-			<button label="新しいスクリプト" label_selected="新しいスクリプト" name="button new script" width="120"/>
-			<button label="権限" left_delta="130" name="button permissions" width="80"/>
-		</panel>
-	</tab_container>
-	<panel name="land info panel">
-		<text name="label_parcel_info">
-			区画情報
-		</text>
-		<text name="label_area_price" width="200">
-			価格:[AREA]平方メートルあたりL$[PRICE]
-		</text>
-		<text name="label_area" width="200">
-			面積:[AREA]平方メートル
-		</text>
-		<button label="土地情報..." label_selected="土地情報..." name="button about land"/>
-		<check_box label="オーナーを表示" name="checkbox show owners" tool_tip="所有権別に区画を色分けします: 
-
-緑 = あなたの土地 
-アクア = あなたのグループ所有地 
-赤 = 他人が所有する土地 
-黄色 = 売り出し中 
-紫 = オークション 
-グレー = パブリック"/>
-		<text name="label_parcel_modify">
-			区画の編集
-		</text>
-		<button label="再分割" label_selected="再分割" name="button subdivide land"/>
-		<button label="統合する" label_selected="統合する" name="button join land"/>
-		<text name="label_parcel_trans">
-			土地取引
-		</text>
-		<button label="土地を購入" label_selected="土地を購入" name="button buy land"/>
-		<button label="土地を放棄" label_selected="土地を放棄" name="button abandon land"/>
-	</panel>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="toolbox floater" short_title="制作ツール" title="">
+	<floater.string name="status_rotate">
+		色の付いたバンドをドラッグしてオブジェクトを回転
+	</floater.string>
+	<floater.string name="status_scale">
+		選択した側をクリックし、ドラッグして引き伸ばす
+	</floater.string>
+	<floater.string name="status_move">
+		移動:ドラッグ、コピー:Shiftを押しながらドラッグ
+	</floater.string>
+	<floater.string name="status_modifyland">
+		土地をクリックし、ボタンを押したまま入力して修正変更
+	</floater.string>
+	<floater.string name="status_camera">
+		クリック・ドラッグで視界を移動
+	</floater.string>
+	<floater.string name="status_grab">
+		移動:ドラッグ、持ち上げ:Ctrl、回転:Ctrl+Shift
+	</floater.string>
+	<floater.string name="status_place">
+		インワールドでクリックして作成
+	</floater.string>
+	<floater.string name="status_selectland">
+		土地をクリックし、ドラッグして選択
+	</floater.string>
+	<floater.string name="grid_screen_text">
+		画面
+	</floater.string>
+	<floater.string name="grid_local_text">
+		ローカル
+	</floater.string>
+	<floater.string name="grid_world_text">
+		世界
+	</floater.string>
+	<floater.string name="grid_reference_text">
+		参照
+	</floater.string>
+	<floater.string name="grid_attachment_text">
+		アタッチメント
+	</floater.string>
+	<button label="" label_selected="" name="button focus" tool_tip="フォーカス"/>
+	<button label="" label_selected="" name="button move" tool_tip="動かす"/>
+	<button label="" label_selected="" name="button edit" tool_tip="編集"/>
+	<button label="" label_selected="" name="button create" tool_tip="作成"/>
+	<button label="" label_selected="" name="button land" tool_tip="土地"/>
+	<text name="text status">
+		移動するにはドラッグ、コピーするにはShiftキーを押しながらドラッグ
+	</text>
+	<radio_group name="focus_radio_group">
+		<radio_item label="ズーム" name="radio zoom"/>
+		<radio_item label="軌跡(Ctrl)" name="radio orbit"/>
+		<radio_item label="パン(Ctrl+Shift)" name="radio pan"/>
+	</radio_group>
+	<radio_group name="move_radio_group">
+		<radio_item label="移動" name="radio move"/>
+		<radio_item label="持ち上げる(Ctrl)" name="radio lift"/>
+		<radio_item label="スピン(Ctrl+Shift)" name="radio spin"/>
+	</radio_group>
+	<radio_group name="edit_radio_group">
+		<radio_item label="移動" name="radio position"/>
+		<radio_item label="回転(Ctrl)" name="radio rotate"/>
+		<radio_item label="引伸ばす(Ctrl+Shift)" name="radio stretch"/>
+		<radio_item label="テクスチャーを選択" name="radio select face"/>
+	</radio_group>
+	<check_box label="リンク部分を編集" name="checkbox edit linked parts"/>
+	<check_box label="両側を引伸ばす" left="116" name="checkbox uniform"/>
+	<check_box initial_value="true" label="テクスチャーを引伸ばす" name="checkbox stretch textures"/>
+	<check_box initial_value="true" label="グリッドポイントにスナップ" left_delta="27" name="checkbox snap to grid"/>
+	<combo_box left_delta="60" name="combobox grid mode" width="76">
+		<combo_box.item label="ワールドルーラ" name="World"/>
+		<combo_box.item label="ローカルルーラ" name="Local"/>
+		<combo_box.item label="レファレンスルーラ" name="Reference"/>
+	</combo_box>
+	<button label="オプション" label_selected="オプション" name="Options..." tool_tip="グリッドオプションを設定"/>
+	<button label="" label_selected="" name="ToolCube" tool_tip="キューブ"/>
+	<button label="" label_selected="" name="ToolPrism" tool_tip="プリズム"/>
+	<button label="" label_selected="" name="ToolPyramid" tool_tip="ピラミッド"/>
+	<button label="" label_selected="" name="ToolTetrahedron" tool_tip="4面体"/>
+	<button label="" label_selected="" name="ToolCylinder" tool_tip="シリンダー"/>
+	<button label="" label_selected="" name="ToolHemiCylinder" tool_tip="半円柱"/>
+	<button label="" label_selected="" name="ToolCone" tool_tip="円錐"/>
+	<button label="" label_selected="" name="ToolHemiCone" tool_tip="半円錐"/>
+	<button label="" label_selected="" name="ToolSphere" tool_tip="球形"/>
+	<button label="" label_selected="" name="ToolHemiSphere" tool_tip="半球"/>
+	<button label="" label_selected="" name="ToolTorus" tool_tip="トーラス"/>
+	<button label="" label_selected="" name="ToolTube" tool_tip="チューブ"/>
+	<button label="" label_selected="" name="ToolRing" tool_tip="リング"/>
+	<button label="" label_selected="" name="ToolTree" tool_tip="樹木"/>
+	<button label="" label_selected="" name="ToolGrass" tool_tip="草地"/>
+	<check_box label="選択したものを保持" name="checkbox sticky"/>
+	<check_box label="選択したものをコピー" name="checkbox copy selection"/>
+	<check_box initial_value="true" label="中央にコピー" name="checkbox copy centers"/>
+	<check_box label="回転させてコピー" name="checkbox copy rotates"/>
+	<radio_group name="land_radio_group">
+		<radio_item label="土地を選択" name="radio select land"/>
+		<radio_item label="ならす" name="radio flatten"/>
+		<radio_item label="隆起" name="radio raise"/>
+		<radio_item label="低くする" name="radio lower"/>
+		<radio_item label="滑らかにする" name="radio smooth"/>
+		<radio_item label="凸凹にする" name="radio noise"/>
+		<radio_item label="元に戻す" name="radio revert"/>
+	</radio_group>
+	<text name="Bulldozer:">
+		ブルドーザー:
+	</text>
+	<text name="Dozer Size:">
+		サイズ
+	</text>
+	<text name="Strength:">
+		強度
+	</text>
+	<button label="適用" label_selected="適用" name="button apply to selection" tool_tip="選択した土地を修正"/>
+	<text name="obj_count">
+		オブジェクト: [COUNT]
+	</text>
+	<text name="prim_count">
+		プリム: [COUNT]
+	</text>
+	<tab_container name="Object Info Tabs" tab_max_width="150" tab_min_width="30">
+		<panel label="一般" name="General">
+			<panel.string name="text deed continued">
+				譲渡
+			</panel.string>
+			<panel.string name="text deed">
+				譲渡
+			</panel.string>
+			<panel.string name="text modify info 1">
+				このオブジェクトは修正できます。
+			</panel.string>
+			<panel.string name="text modify info 2">
+				これらのオブジェクトは修正できます。
+			</panel.string>
+			<panel.string name="text modify info 3">
+				このオブジェクトは修正できません。
+			</panel.string>
+			<panel.string name="text modify info 4">
+				これらのオブジェクトは修正できません。
+			</panel.string>
+			<panel.string name="text modify warning">
+				オブジェクト全体を選択して権限の設定を行ってください。
+			</panel.string>
+			<panel.string name="Cost Default">
+				価格: L$
+			</panel.string>
+			<panel.string name="Cost Total">
+				合計価格: L$
+			</panel.string>
+			<panel.string name="Cost Per Unit">
+				単価: L$
+			</panel.string>
+			<panel.string name="Cost Mixed">
+				混合価格
+			</panel.string>
+			<panel.string name="Sale Mixed">
+				混合販売
+			</panel.string>
+			<text name="Name:">
+				名前:
+			</text>
+			<text name="Description:">
+				説明:
+			</text>
+			<text name="Creator:">
+				クリエーター
+			</text>
+			<text name="Creator Name">
+				Thrax Linden
+			</text>
+			<text name="Owner:">
+				オーナー:
+			</text>
+			<text name="Owner Name">
+				Thrax Linden
+			</text>
+			<text name="Group:">
+				グループ:
+			</text>
+			<button label="設定..." label_selected="設定..." name="button set group" tool_tip="このオブジェクト権限を共有するグループを選択"/>
+			<name_box initial_value="ローディング..." name="Group Name Proxy"/>
+			<button label="譲渡" label_selected="譲渡" name="button deed" tool_tip="このアイテムを譲渡すると次の所有者の権限が適用されます。 グループ共有オブジェクトは、グループのオフィサーが譲渡できます。"/>
+			<check_box label="共有" name="checkbox share with group" tool_tip="設定したグループのメンバー全員にこのオブジェクトの修正権限を与えます。 役割制限を有効にするには、譲渡する必要があります。"/>
+			<text name="label click action">
+				クリックで:
+			</text>
+			<combo_box name="clickaction">
+				<combo_box.item label="触れる(デフォルト)" name="Touch/grab(default)"/>
+				<combo_box.item label="オブジェクトに座る" name="Sitonobject"/>
+				<combo_box.item label="オブジェクトを購入" name="Buyobject"/>
+				<combo_box.item label="オブジェクトへの支払い" name="Payobject"/>
+				<combo_box.item label="開く" name="Open"/>
+			</combo_box>
+			<check_box label="販売中:" name="checkbox for sale"/>
+			<combo_box name="sale type">
+				<combo_box.item label="コピー" name="Copy"/>
+				<combo_box.item label="コンテンツ" name="Contents"/>
+				<combo_box.item label="オリジナル" name="Original"/>
+			</combo_box>
+			<spinner label="価格: L$" name="Edit Cost"/>
+			<check_box label="検索に表示" name="search_check" tool_tip="検索結果で、このオブジェクトを人に見せる"/>
+			<panel name="perms_build">
+				<text name="perm_modify">
+					このオブジェクトを修正できます
+				</text>
+				<text name="Anyone can:">
+					全員:
+				</text>
+				<check_box label="コピー" name="checkbox allow everyone copy"/>
+				<text name="Next owner can:">
+					次の所有者:
+				</text>
+				<check_box label="修正" name="checkbox next owner can modify"/>
+				<check_box label="コピー" name="checkbox next owner can copy"/>
+				<check_box label="再販・プレゼント" name="checkbox next owner can transfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販することができます"/>
+				<text name="B:">
+					B:
+				</text>
+				<text name="O:">
+					O:
+				</text>
+				<text name="G:">
+					G:
+				</text>
+				<text name="E:">
+					E:
+				</text>
+				<text name="N:">
+					N:
+				</text>
+				<text name="F:">
+					F:
+				</text>
+			</panel>
+		</panel>
+		<panel label="形状" name="Object">
+			<check_box label="ロック済み" name="checkbox locked" tool_tip="オブジェクトの移動と削除を禁止します。 この機能を使うと、構築中に意図しない編集を防ぐことができます。"/>
+			<check_box label="物理" name="Physical Checkbox Ctrl" tool_tip="オブジェクトに対する重力の作用と影響を有効にする"/>
+			<check_box label="臨時" name="Temporary Checkbox Ctrl" tool_tip="作成1分後にオブジェクトを削除"/>
+			<check_box label="ファントム" name="Phantom Checkbox Ctrl" tool_tip="オブジェクト同士の衝突またはオブジェクトとアバターの衝突を回避"/>
+			<text name="label position">
+				位置(メートル)
+			</text>
+			<spinner label="X" name="Pos X"/>
+			<spinner label="Y" name="Pos Y"/>
+			<spinner label="Z" name="Pos Z"/>
+			<text name="label size">
+				サイズ(メートル)
+			</text>
+			<spinner label="X" name="Scale X"/>
+			<spinner label="Y" name="Scale Y"/>
+			<spinner label="Z" name="Scale Z"/>
+			<text name="label rotation">
+				回転(度)
+			</text>
+			<spinner label="X" name="Rot X"/>
+			<spinner label="Y" name="Rot Y"/>
+			<spinner label="Z" name="Rot Z"/>
+			<combo_box name="comboBaseType">
+				<combo_box.item label="ボックス" name="Box"/>
+				<combo_box.item label="シリンダー" name="Cylinder"/>
+				<combo_box.item label="プリズム" name="Prism"/>
+				<combo_box.item label="球形" name="Sphere"/>
+				<combo_box.item label="トーラス" name="Torus"/>
+				<combo_box.item label="チューブ" name="Tube"/>
+				<combo_box.item label="リング" name="Ring"/>
+				<combo_box.item label="スカルプト" name="Sculpted"/>
+			</combo_box>
+			<combo_box name="material">
+				<combo_box.item label="石材" name="Stone"/>
+				<combo_box.item label="金属" name="Metal"/>
+				<combo_box.item label="ガラス" name="Glass"/>
+				<combo_box.item label="木材" name="Wood"/>
+				<combo_box.item label="肌" name="Flesh"/>
+				<combo_box.item label="プラスチック" name="Plastic"/>
+				<combo_box.item label="ゴム" name="Rubber"/>
+			</combo_box>
+			<text name="text cut">
+				パスカット(始点/終点)
+			</text>
+			<spinner label="B" name="cut begin"/>
+			<spinner label="E" name="cut end"/>
+			<text name="text hollow">
+				中空(空洞)
+			</text>
+			<text name="text skew">
+				傾斜
+			</text>
+			<text name="Hollow Shape">
+				中空(空洞)の形
+			</text>
+			<combo_box name="hole">
+				<combo_box.item label="デフォルト" name="Default"/>
+				<combo_box.item label="サークル" name="Circle"/>
+				<combo_box.item label="正方形" name="Square"/>
+				<combo_box.item label="三角形" name="Triangle"/>
+			</combo_box>
+			<text name="text twist">
+				ひねり(始点/終点)
+			</text>
+			<spinner label="B" name="Twist Begin"/>
+			<spinner label="E" name="Twist End"/>
+			<text name="scale_taper">
+				テーパー
+			</text>
+			<text name="scale_hole">
+				穴寸法
+			</text>
+			<spinner label="X" name="Taper Scale X"/>
+			<spinner label="Y" name="Taper Scale Y"/>
+			<text name="text topshear">
+				上部層
+			</text>
+			<spinner label="X" name="Shear X"/>
+			<spinner label="Y" name="Shear Y"/>
+			<text name="advanced_cut">
+				プロフィール・カット(始点/終点)
+			</text>
+			<text name="advanced_dimple">
+				くぼみ(始点/終点)
+			</text>
+			<text name="advanced_slice">
+				切り取り(始点/終点)
+			</text>
+			<spinner label="B" name="Path Limit Begin"/>
+			<spinner label="E" name="Path Limit End"/>
+			<text name="text taper2">
+				テーパー
+			</text>
+			<spinner label="X" name="Taper X"/>
+			<spinner label="Y" name="Taper Y"/>
+			<text name="text radius delta">
+				半径
+			</text>
+			<text name="text revolutions">
+				回転体
+			</text>
+			<texture_picker label="スカルプトテクスチャー" name="sculpt texture control" tool_tip="クリックして写真を選択してください。"/>
+			<check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトされたプリムをX軸上で反転"/>
+			<check_box label="裏返し" name="sculpt invert control" tool_tip="スカルプトされたプリムのノーマルを逆転させ、裏返しに表示"/>
+			<text name="label sculpt type">
+				縫い目のタイプ
+			</text>
+			<combo_box name="sculpt type control">
+				<combo_box.item label="(なし)" name="None"/>
+				<combo_box.item label="球形" name="Sphere"/>
+				<combo_box.item label="トーラス" name="Torus"/>
+				<combo_box.item label="平面" name="Plane"/>
+				<combo_box.item label="シリンダー" name="Cylinder"/>
+			</combo_box>
+		</panel>
+		<panel label="特徴" name="Features">
+			<text name="select_single">
+				プリムを1つだけ選択して編集してください
+			</text>
+			<text name="edit_object">
+				オブジェクトの特徴を編集:
+			</text>
+			<check_box label="フレキシブル・パス" name="Flexible1D Checkbox Ctrl" tool_tip="Z軸を中心とするオブジェクトの折れ曲がりを有効にする (クライアント側のみ)"/>
+			<spinner label="柔軟性" label_width="72" name="FlexNumSections" width="135"/>
+			<spinner label="重力" label_width="72" name="FlexGravity" width="135"/>
+			<spinner label="ドラッグ" label_width="72" name="FlexFriction" width="135"/>
+			<spinner label="風" label_width="72" name="FlexWind" width="135"/>
+			<spinner label="ç·Šå¼µ" label_width="72" name="FlexTension" width="135"/>
+			<spinner label="X軸方向の力" label_width="72" name="FlexForceX" width="135"/>
+			<spinner label="Y軸方向の力" label_width="72" name="FlexForceY" width="135"/>
+			<spinner label="Z軸方向の力" label_width="72" name="FlexForceZ" width="135"/>
+			<check_box label="光" name="Light Checkbox Ctrl" tool_tip="オブジェクトが発光"/>
+			<color_swatch label="" left_delta="74" name="colorswatch" tool_tip="カラー・ピッカーをクリックして開く"/>
+			<spinner label="輝度" label_width="72" name="Light Intensity" width="135"/>
+			<spinner label="半径" label_width="72" name="Light Radius" width="135"/>
+			<spinner label="弱まる" label_width="72" name="Light Falloff" width="135"/>
+		</panel>
+		<panel label="材質" name="Texture">
+			<panel.string name="string repeats per meter">
+				メートルごとに繰返す
+			</panel.string>
+			<panel.string name="string repeats per face">
+				面ごとに繰り返す
+			</panel.string>
+			<texture_picker label="テクスチャー" name="texture control" tool_tip="写真をクリックして選択"/>
+			<color_swatch label="色" name="colorswatch" tool_tip="カラー・ピッカーをクリックして開く"/>
+			<text name="color trans">
+				透過度 %
+			</text>
+			<text name="glow label">
+				グロー
+			</text>
+			<check_box label="明るさ全開" name="checkbox fullbright"/>
+			<text name="tex gen">
+				マッピング
+			</text>
+			<combo_box name="combobox texgen">
+				<combo_box.item label="デフォルト" name="Default"/>
+				<combo_box.item label="平面" name="Planar"/>
+			</combo_box>
+			<text name="label shininess">
+				輝き
+			</text>
+			<combo_box name="combobox shininess">
+				<combo_box.item label="なし" name="None"/>
+				<combo_box.item label="低" name="Low"/>
+				<combo_box.item label="中" name="Medium"/>
+				<combo_box.item label="高" name="High"/>
+			</combo_box>
+			<text name="label bumpiness">
+				凹凸
+			</text>
+			<combo_box name="combobox bumpiness">
+				<combo_box.item label="なし" name="None"/>
+				<combo_box.item label="明るさ" name="Brightness"/>
+				<combo_box.item label="暗さ" name="Darkness"/>
+				<combo_box.item label="木目調" name="woodgrain"/>
+				<combo_box.item label="木の皮" name="bark"/>
+				<combo_box.item label="レンガ" name="bricks"/>
+				<combo_box.item label="チェッカー" name="checker"/>
+				<combo_box.item label="コンクリート" name="concrete"/>
+				<combo_box.item label="クラスティ・タイル" name="crustytile"/>
+				<combo_box.item label="カットストーン" name="cutstone"/>
+				<combo_box.item label="ディスク" name="discs"/>
+				<combo_box.item label="砂利" name="gravel"/>
+				<combo_box.item label="ペトリ" name="petridish"/>
+				<combo_box.item label="羽目板" name="siding"/>
+				<combo_box.item label="ストーン・タイル" name="stonetile"/>
+				<combo_box.item label="しっくい" name="stucco"/>
+				<combo_box.item label="吸い込み" name="suction"/>
+				<combo_box.item label="織目" name="weave"/>
+			</combo_box>
+			<text name="tex scale">
+				面ごとに繰り返す
+			</text>
+			<spinner label="水平(U)" name="TexScaleU"/>
+			<check_box label="反転" name="checkbox flip s"/>
+			<spinner label="垂直(V)" name="TexScaleV"/>
+			<check_box label="反転" name="checkbox flip t"/>
+			<button label="適用" label_selected="適用" name="button apply"/>
+			<text name="tex offset">
+				Texture Offset
+			</text>
+			<spinner label="水平(U)" name="TexOffsetU"/>
+			<spinner label="垂直(V)" name="TexOffsetV"/>
+		</panel>
+		<panel label="中身" name="Contents">
+			<button label="新しいスクリプト" label_selected="新しいスクリプト" name="button new script" width="120"/>
+			<button label="権限" left_delta="130" name="button permissions" width="80"/>
+		</panel>
+	</tab_container>
+	<panel name="land info panel">
+		<text name="label_parcel_info">
+			区画情報
+		</text>
+		<text name="label_area_price" width="200">
+			価格:[AREA]平方メートルあたりL$[PRICE]
+		</text>
+		<text name="label_area" width="200">
+			面積:[AREA]平方メートル
+		</text>
+		<button label="土地情報..." label_selected="土地情報..." name="button about land"/>
+		<check_box label="オーナーを表示" name="checkbox show owners" tool_tip="所有権別に区画を色分けします: 
+
+緑 = あなたの土地 
+アクア = あなたのグループ所有地 
+赤 = 他人が所有する土地 
+黄色 = 売り出し中 
+紫 = オークション 
+グレー = パブリック"/>
+		<text name="label_parcel_modify">
+			区画の編集
+		</text>
+		<button label="再分割" label_selected="再分割" name="button subdivide land"/>
+		<button label="統合する" label_selected="統合する" name="button join land"/>
+		<text name="label_parcel_trans">
+			土地取引
+		</text>
+		<button label="土地を購入" label_selected="土地を購入" name="button buy land"/>
+		<button label="土地を放棄" label_selected="土地を放棄" name="button abandon land"/>
+	</panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/inspect_avatar.xml b/indra/newview/skins/default/xui/ja/inspect_avatar.xml
index c7d2cbee043..e5b2a445217 100644
--- a/indra/newview/skins/default/xui/ja/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/ja/inspect_avatar.xml
@@ -1,16 +1,16 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!--
-  Not can_close / no title to avoid window chrome
-  Single instance - only have one at a time, recycle it each spawn
--->
-<floater name="inspect_avatar">
-	<string name="Subtitle">
-		[AGE]
-	</string>
-	<string name="Details">
-		[ACCTTYPE]、[PAYMENTINFO]
-プロフィール: [SL_PROFILE]
-	</string>
-	<slider name="volume_slider" tool_tip="ボイス音量" value="0.5"/>
-	<button label="フレンドを追加" name="add_friend_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+  Not can_close / no title to avoid window chrome
+  Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+	<string name="Subtitle">
+		[AGE]
+	</string>
+	<string name="Details">
+		[ACCTTYPE]、[PAYMENTINFO]
+プロフィール: [SL_PROFILE]
+	</string>
+	<slider name="volume_slider" tool_tip="ボイス音量" value="0.5"/>
+	<button label="フレンドを追加" name="add_friend_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml b/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml
index b3287a1a351..ef63f3f4e09 100644
--- a/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Avatar Icon Menu">
-	<menu_item_call label="プロフィールを表示..." name="Show Profile"/>
-	<menu_item_call label="IMを送信..." name="Send IM"/>
-	<menu_item_call label="フレンドを追加..." name="Add Friend"/>
-	<menu_item_call label="フレンドを削除..." name="Remove Friend"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+	<menu_item_call label="プロフィールを表示..." name="Show Profile"/>
+	<menu_item_call label="IMを送信..." name="Send IM"/>
+	<menu_item_call label="フレンドを追加..." name="Add Friend"/>
+	<menu_item_call label="フレンドを削除..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_favorites.xml b/indra/newview/skins/default/xui/ja/menu_favorites.xml
index fbaa33035fc..4708b1446c7 100644
--- a/indra/newview/skins/default/xui/ja/menu_favorites.xml
+++ b/indra/newview/skins/default/xui/ja/menu_favorites.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
-	<menu_item_call label="テレポート" name="Teleport To Landmark"/>
-	<menu_item_call label="ランドマークを表示・編集" name="Landmark Open"/>
-	<menu_item_call label="SLurl をコピー" name="Copy slurl"/>
-	<menu_item_call label="地図に表示" name="Show On Map"/>
-	<menu_item_call label="コピー" name="Landmark Copy"/>
-	<menu_item_call label="貼り付け" name="Landmark Paste"/>
-	<menu_item_call label="削除" name="Delete"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+	<menu_item_call label="テレポート" name="Teleport To Landmark"/>
+	<menu_item_call label="ランドマークを表示・編集" name="Landmark Open"/>
+	<menu_item_call label="SLurl をコピー" name="Copy slurl"/>
+	<menu_item_call label="地図に表示" name="Show On Map"/>
+	<menu_item_call label="コピー" name="Landmark Copy"/>
+	<menu_item_call label="貼り付け" name="Landmark Paste"/>
+	<menu_item_call label="削除" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_group_plus.xml b/indra/newview/skins/default/xui/ja/menu_group_plus.xml
index 762f9f616d9..3787f7d6450 100644
--- a/indra/newview/skins/default/xui/ja/menu_group_plus.xml
+++ b/indra/newview/skins/default/xui/ja/menu_group_plus.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
-	<menu_item_call label="グループに参加..." name="item_join"/>
-	<menu_item_call label="新しいグループ..." name="item_new"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+	<menu_item_call label="グループに参加..." name="item_join"/>
+	<menu_item_call label="新しいグループ..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory.xml b/indra/newview/skins/default/xui/ja/menu_inventory.xml
index e3420c0c155..3162477c5c3 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml
@@ -1,76 +1,76 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
-	<menu_item_call label="購入" name="Task Buy"/>
-	<menu_item_call label="開く" name="Task Open"/>
-	<menu_item_call label="再生" name="Task Play"/>
-	<menu_item_call label="プロパティ" name="Task Properties"/>
-	<menu_item_call label="名前の変更" name="Task Rename"/>
-	<menu_item_call label="削除" name="Task Remove"/>
-	<menu_item_call label="ゴミ箱を空にする" name="Empty Trash"/>
-	<menu_item_call label="遺失物フォルダを空にする" name="Empty Lost And Found"/>
-	<menu_item_call label="新しいフォルダ" name="New Folder"/>
-	<menu_item_call label="新しいスクリプト" name="New Script"/>
-	<menu_item_call label="新しいノート" name="New Note"/>
-	<menu_item_call label="新しいジェスチャー" name="New Gesture"/>
-	<menu label="新規衣類" name="New Clothes">
-		<menu_item_call label="新しいシャツ" name="New Shirt"/>
-		<menu_item_call label="新しいズボン" name="New Pants"/>
-		<menu_item_call label="新しい靴" name="New Shoes"/>
-		<menu_item_call label="新しい靴下" name="New Socks"/>
-		<menu_item_call label="新しいジャケット" name="New Jacket"/>
-		<menu_item_call label="新しいスカート" name="New Skirt"/>
-		<menu_item_call label="新しい手袋" name="New Gloves"/>
-		<menu_item_call label="新しい下着" name="New Undershirt"/>
-		<menu_item_call label="新しいパンツ" name="New Underpants"/>
-	</menu>
-	<menu label="新規身体部位" name="New Body Parts">
-		<menu_item_call label="新しいシェイプ(体型)" name="New Shape"/>
-		<menu_item_call label="新しいスキン" name="New Skin"/>
-		<menu_item_call label="新しい髪" name="New Hair"/>
-		<menu_item_call label="新しい眼" name="New Eyes"/>
-	</menu>
-	<menu label="種類を変更" name="Change Type">
-		<menu_item_call label="デフォルト" name="Default"/>
-		<menu_item_call label="手袋" name="Gloves"/>
-		<menu_item_call label="ジャケット" name="Jacket"/>
-		<menu_item_call label="パンツ" name="Pants"/>
-		<menu_item_call label="シェイプ" name="Shape"/>
-		<menu_item_call label="靴" name="Shoes"/>
-		<menu_item_call label="シャツ" name="Shirt"/>
-		<menu_item_call label="スカート" name="Skirt"/>
-		<menu_item_call label="下着パンツ" name="Underpants"/>
-		<menu_item_call label="下着シャツ" name="Undershirt"/>
-	</menu>
-	<menu_item_call label="テレポート" name="Landmark Open"/>
-	<menu_item_call label="開く" name="Animation Open"/>
-	<menu_item_call label="開く" name="Sound Open"/>
-	<menu_item_call label="アイテムを除外" name="Purge Item"/>
-	<menu_item_call label="アイテムを復元" name="Restore Item"/>
-	<menu_item_call label="開く" name="Open"/>
-	<menu_item_call label="プロパティ" name="Properties"/>
-	<menu_item_call label="名前の変更" name="Rename"/>
-	<menu_item_call label="UUIDをコピー" name="Copy Asset UUID"/>
-	<menu_item_call label="コピー" name="Copy"/>
-	<menu_item_call label="貼り付け" name="Paste"/>
-	<menu_item_call label="削除" name="Delete"/>
-	<menu_item_call label="アイテムを取り外す" name="Take Off Items"/>
-	<menu_item_call label="服装に追加" name="Add To Outfit"/>
-	<menu_item_call label="服装を置換" name="Replace Outfit"/>
-	<menu_item_call label="会議チャット開始" name="Conference Chat Folder"/>
-	<menu_item_call label="再生" name="Sound Play"/>
-	<menu_item_call label="世界で再生" name="Animation Play"/>
-	<menu_item_call label="ローカルに再生" name="Animation Audition"/>
-	<menu_item_call label="インスタント・メッセージを送信" name="Send Instant Message"/>
-	<menu_item_call label="テレポートを贈る..." name="Offer Teleport..."/>
-	<menu_item_call label="会議チャット開始" name="Conference Chat"/>
-	<menu_item_call label="アクティブ" name="Activate"/>
-	<menu_item_call label="非アクティブ" name="Deactivate"/>
-	<menu_item_call label="自分から取り外す" name="Detach From Yourself"/>
-	<menu_item_call label="装着" name="Object Wear"/>
-	<menu label="装着先" name="Attach To"/>
-	<menu label="HUD装着先" name="Attach To HUD"/>
-	<menu_item_call label="編集" name="Wearable Edit"/>
-	<menu_item_call label="装着" name="Wearable Wear"/>
-	<menu_item_call label="取り外す" name="Take Off"/>
-	<menu_item_call label="--オプションなし--" name="--no options--"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+	<menu_item_call label="購入" name="Task Buy"/>
+	<menu_item_call label="開く" name="Task Open"/>
+	<menu_item_call label="再生" name="Task Play"/>
+	<menu_item_call label="プロパティ" name="Task Properties"/>
+	<menu_item_call label="名前の変更" name="Task Rename"/>
+	<menu_item_call label="削除" name="Task Remove"/>
+	<menu_item_call label="ゴミ箱を空にする" name="Empty Trash"/>
+	<menu_item_call label="遺失物フォルダを空にする" name="Empty Lost And Found"/>
+	<menu_item_call label="新しいフォルダ" name="New Folder"/>
+	<menu_item_call label="新しいスクリプト" name="New Script"/>
+	<menu_item_call label="新しいノート" name="New Note"/>
+	<menu_item_call label="新しいジェスチャー" name="New Gesture"/>
+	<menu label="新規衣類" name="New Clothes">
+		<menu_item_call label="新しいシャツ" name="New Shirt"/>
+		<menu_item_call label="新しいズボン" name="New Pants"/>
+		<menu_item_call label="新しい靴" name="New Shoes"/>
+		<menu_item_call label="新しい靴下" name="New Socks"/>
+		<menu_item_call label="新しいジャケット" name="New Jacket"/>
+		<menu_item_call label="新しいスカート" name="New Skirt"/>
+		<menu_item_call label="新しい手袋" name="New Gloves"/>
+		<menu_item_call label="新しい下着" name="New Undershirt"/>
+		<menu_item_call label="新しいパンツ" name="New Underpants"/>
+	</menu>
+	<menu label="新規身体部位" name="New Body Parts">
+		<menu_item_call label="新しいシェイプ(体型)" name="New Shape"/>
+		<menu_item_call label="新しいスキン" name="New Skin"/>
+		<menu_item_call label="新しい髪" name="New Hair"/>
+		<menu_item_call label="新しい眼" name="New Eyes"/>
+	</menu>
+	<menu label="種類を変更" name="Change Type">
+		<menu_item_call label="デフォルト" name="Default"/>
+		<menu_item_call label="手袋" name="Gloves"/>
+		<menu_item_call label="ジャケット" name="Jacket"/>
+		<menu_item_call label="パンツ" name="Pants"/>
+		<menu_item_call label="シェイプ" name="Shape"/>
+		<menu_item_call label="靴" name="Shoes"/>
+		<menu_item_call label="シャツ" name="Shirt"/>
+		<menu_item_call label="スカート" name="Skirt"/>
+		<menu_item_call label="下着パンツ" name="Underpants"/>
+		<menu_item_call label="下着シャツ" name="Undershirt"/>
+	</menu>
+	<menu_item_call label="テレポート" name="Landmark Open"/>
+	<menu_item_call label="開く" name="Animation Open"/>
+	<menu_item_call label="開く" name="Sound Open"/>
+	<menu_item_call label="アイテムを除外" name="Purge Item"/>
+	<menu_item_call label="アイテムを復元" name="Restore Item"/>
+	<menu_item_call label="開く" name="Open"/>
+	<menu_item_call label="プロパティ" name="Properties"/>
+	<menu_item_call label="名前の変更" name="Rename"/>
+	<menu_item_call label="UUIDをコピー" name="Copy Asset UUID"/>
+	<menu_item_call label="コピー" name="Copy"/>
+	<menu_item_call label="貼り付け" name="Paste"/>
+	<menu_item_call label="削除" name="Delete"/>
+	<menu_item_call label="アイテムを取り外す" name="Take Off Items"/>
+	<menu_item_call label="服装に追加" name="Add To Outfit"/>
+	<menu_item_call label="服装を置換" name="Replace Outfit"/>
+	<menu_item_call label="会議チャット開始" name="Conference Chat Folder"/>
+	<menu_item_call label="再生" name="Sound Play"/>
+	<menu_item_call label="世界で再生" name="Animation Play"/>
+	<menu_item_call label="ローカルに再生" name="Animation Audition"/>
+	<menu_item_call label="インスタント・メッセージを送信" name="Send Instant Message"/>
+	<menu_item_call label="テレポートを贈る..." name="Offer Teleport..."/>
+	<menu_item_call label="会議チャット開始" name="Conference Chat"/>
+	<menu_item_call label="アクティブ" name="Activate"/>
+	<menu_item_call label="非アクティブ" name="Deactivate"/>
+	<menu_item_call label="自分から取り外す" name="Detach From Yourself"/>
+	<menu_item_call label="装着" name="Object Wear"/>
+	<menu label="装着先" name="Attach To"/>
+	<menu label="HUD装着先" name="Attach To HUD"/>
+	<menu_item_call label="編集" name="Wearable Edit"/>
+	<menu_item_call label="装着" name="Wearable Wear"/>
+	<menu_item_call label="取り外す" name="Take Off"/>
+	<menu_item_call label="--オプションなし--" name="--no options--"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_landmark.xml b/indra/newview/skins/default/xui/ja/menu_landmark.xml
index 778eb72e701..de35bf24010 100644
--- a/indra/newview/skins/default/xui/ja/menu_landmark.xml
+++ b/indra/newview/skins/default/xui/ja/menu_landmark.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="landmark_overflow_menu">
-	<menu_item_call label="SLurl をコピー" name="copy"/>
-	<menu_item_call label="削除" name="delete"/>
-	<menu_item_call label="ピックを作成" name="pick"/>
-</toggleable_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+	<menu_item_call label="SLurl をコピー" name="copy"/>
+	<menu_item_call label="削除" name="delete"/>
+	<menu_item_call label="ピックを作成" name="pick"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_mini_map.xml b/indra/newview/skins/default/xui/ja/menu_mini_map.xml
index f080647be27..e1bddd872d7 100644
--- a/indra/newview/skins/default/xui/ja/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/ja/menu_mini_map.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="popup">
-	<menu_item_call label="ズーム(近)" name="Zoom Close"/>
-	<menu_item_call label="ズーム(中)" name="Zoom Medium"/>
-	<menu_item_call label="ズーム(遠)" name="Zoom Far"/>
-	<menu_item_call label="追跡をやめる" name="Stop Tracking"/>
-	<menu_item_call label="世界地図" name="World Map"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="popup">
+	<menu_item_call label="ズーム(近)" name="Zoom Close"/>
+	<menu_item_call label="ズーム(中)" name="Zoom Medium"/>
+	<menu_item_call label="ズーム(遠)" name="Zoom Far"/>
+	<menu_item_call label="追跡をやめる" name="Stop Tracking"/>
+	<menu_item_call label="世界地図" name="World Map"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_navbar.xml b/indra/newview/skins/default/xui/ja/menu_navbar.xml
index e10c436208d..4c9874c645b 100644
--- a/indra/newview/skins/default/xui/ja/menu_navbar.xml
+++ b/indra/newview/skins/default/xui/ja/menu_navbar.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Navbar Menu">
-	<menu_item_check label="座標を表示" name="Show Coordinates"/>
-	<menu_item_call label="ランドマーク" name="Landmark"/>
-	<menu_item_call label="切り取り" name="Cut"/>
-	<menu_item_call label="コピー" name="Copy"/>
-	<menu_item_call label="貼り付け" name="Paste"/>
-	<menu_item_call label="削除" name="Delete"/>
-	<menu_item_call label="すべて選択" name="Select All"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+	<menu_item_check label="座標を表示" name="Show Coordinates"/>
+	<menu_item_call label="ランドマーク" name="Landmark"/>
+	<menu_item_call label="切り取り" name="Cut"/>
+	<menu_item_call label="コピー" name="Copy"/>
+	<menu_item_call label="貼り付け" name="Paste"/>
+	<menu_item_call label="削除" name="Delete"/>
+	<menu_item_call label="すべて選択" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_picks.xml b/indra/newview/skins/default/xui/ja/menu_picks.xml
index a0880bd555a..011d3d25268 100644
--- a/indra/newview/skins/default/xui/ja/menu_picks.xml
+++ b/indra/newview/skins/default/xui/ja/menu_picks.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Picks">
-	<menu_item_call label="情報" name="pick_info"/>
-	<menu_item_call label="編集" name="pick_edit"/>
-	<menu_item_call label="テレポート" name="pick_teleport"/>
-	<menu_item_call label="地図" name="pick_map"/>
-	<menu_item_call label="削除" name="pick_delete"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+	<menu_item_call label="情報" name="pick_info"/>
+	<menu_item_call label="編集" name="pick_edit"/>
+	<menu_item_call label="テレポート" name="pick_teleport"/>
+	<menu_item_call label="地図" name="pick_map"/>
+	<menu_item_call label="削除" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_place.xml b/indra/newview/skins/default/xui/ja/menu_place.xml
index 01095387b4c..a9f05e126d1 100644
--- a/indra/newview/skins/default/xui/ja/menu_place.xml
+++ b/indra/newview/skins/default/xui/ja/menu_place.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="place_overflow_menu">
-	<menu_item_call label="ランドマークを作成" name="landmark"/>
-	<menu_item_call label="ピックを作成" name="pick"/>
-	<menu_item_call label="入場許可を購入" name="pass"/>
-	<menu_item_call label="編集" name="edit"/>
-</toggleable_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+	<menu_item_call label="ランドマークを作成" name="landmark"/>
+	<menu_item_call label="ピックを作成" name="pick"/>
+	<menu_item_call label="入場許可を購入" name="pass"/>
+	<menu_item_call label="編集" name="edit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_slurl.xml b/indra/newview/skins/default/xui/ja/menu_slurl.xml
index 1be2954f3fe..2e06c534941 100644
--- a/indra/newview/skins/default/xui/ja/menu_slurl.xml
+++ b/indra/newview/skins/default/xui/ja/menu_slurl.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
-	<menu_item_call label="URLについて" name="about_url"/>
-	<menu_item_call label="URLへテレポートする" name="teleport_to_url"/>
-	<menu_item_call label="地図" name="show_on_map"/>
-</menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+	<menu_item_call label="URLについて" name="about_url"/>
+	<menu_item_call label="URLへテレポートする" name="teleport_to_url"/>
+	<menu_item_call label="地図" name="show_on_map"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_agent.xml b/indra/newview/skins/default/xui/ja/menu_url_agent.xml
index 57e7931ce60..9c5eb64cb82 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_agent.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_agent.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="住人のプロフィールを表示" name="show_agent"/>
-	<menu_item_call label="名前をクリップボードにコピー" name="url_copy_label"/>
-	<menu_item_call label="SLurlをクリップボードにコピー" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="住人のプロフィールを表示" name="show_agent"/>
+	<menu_item_call label="名前をクリップボードにコピー" name="url_copy_label"/>
+	<menu_item_call label="SLurlをクリップボードにコピー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_group.xml b/indra/newview/skins/default/xui/ja/menu_url_group.xml
index 2970256cfe1..2c453922d0c 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_group.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_group.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="グループ情報を表示" name="show_group"/>
-	<menu_item_call label="グループをクリップボードにコピー" name="url_copy_label"/>
-	<menu_item_call label="SLurlをクリップボードにコピー" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="グループ情報を表示" name="show_group"/>
+	<menu_item_call label="グループをクリップボードにコピー" name="url_copy_label"/>
+	<menu_item_call label="SLurlをクリップボードにコピー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_http.xml b/indra/newview/skins/default/xui/ja/menu_url_http.xml
index 8abb5cead66..c2f4f24db6a 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_http.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_http.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="Web ページを開く" name="url_open"/>
-	<menu_item_call label="インターネットブラウザで開く" name="url_open_internal"/>
-	<menu_item_call label="外部ブラウザで開く" name="url_open_external"/>
-	<menu_item_call label="URLをクリップボードにコピー" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="Web ページを開く" name="url_open"/>
+	<menu_item_call label="インターネットブラウザで開く" name="url_open_internal"/>
+	<menu_item_call label="外部ブラウザで開く" name="url_open_external"/>
+	<menu_item_call label="URLをクリップボードにコピー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml
index 1746e163b6b..b478d9d6c03 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="オブジェクトの情報を表示" name="show_object"/>
-	<menu_item_call label="オブジェクトの場所にテレポート" name="teleport_to_object"/>
-	<menu_item_call label="オブジェクト名をクリップボードにコピー" name="url_copy_label"/>
-	<menu_item_call label="SLurlをクリップボードにコピー" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="オブジェクトの情報を表示" name="show_object"/>
+	<menu_item_call label="オブジェクトの場所にテレポート" name="teleport_to_object"/>
+	<menu_item_call label="オブジェクト名をクリップボードにコピー" name="url_copy_label"/>
+	<menu_item_call label="SLurlをクリップボードにコピー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_parcel.xml b/indra/newview/skins/default/xui/ja/menu_url_parcel.xml
index 05639f086e8..38e31de3f7c 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_parcel.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_parcel.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="区画情報を表示" name="show_parcel"/>
-	<menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="区画情報を表示" name="show_parcel"/>
+	<menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_slurl.xml b/indra/newview/skins/default/xui/ja/menu_url_slurl.xml
index e66da8e9b93..d280ecf6899 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_slurl.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_slurl.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="場所の情報を表示" name="show_place"/>
-	<menu_item_call label="現地にテレポート" name="teleport_to_location"/>
-	<menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="場所の情報を表示" name="show_place"/>
+	<menu_item_call label="現地にテレポート" name="teleport_to_location"/>
+	<menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_teleport.xml b/indra/newview/skins/default/xui/ja/menu_url_teleport.xml
index 0239e0e0e67..355f6eb0183 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_teleport.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_teleport.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Url Popup">
-	<menu_item_call label="この場所にテレポート" name="teleport"/>
-	<menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
-</context_menu>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+	<menu_item_call label="この場所にテレポート" name="teleport"/>
+	<menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index ce50a33f1cd..9962bedaf20 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -1,2685 +1,2685 @@
-<?xml version="1.0" encoding="utf-8"?>
-<notifications>
-	<global name="skipnexttime">
-		今後は表示しない
-	</global>
-	<global name="alwayschoose">
-		常にこのオプションを選択
-	</global>
-	<global name="implicitclosebutton">
-		閉じる
-	</global>
-	<template name="okbutton">
-		<form>
-			<button name="OK" text="$yestext"/>
-		</form>
-	</template>
-	<template name="okignore"/>
-	<template name="okcancelbuttons">
-		<form>
-			<button name="Cancel" text="$notext"/>
-		</form>
-	</template>
-	<template name="okcancelignore"/>
-	<template name="okhelpbuttons">
-		<form>
-			<button name="Help" text="$helptext"/>
-		</form>
-	</template>
-	<template name="yesnocancelbuttons">
-		<form>
-			<button name="Yes" text="$yestext"/>
-			<button name="No" text="$notext"/>
-		</form>
-	</template>
-	<notification functor="GenericAcknowledge" label="不明な警告メッセージ" name="MissingAlert">
-		あなたの [APP_NAME] のバージョンでは今受け取った警告メッセージを表示することができません。  最新ビューワがインストールされているかご確認ください。
-
-エラー詳細: 「[_NAME]」という警告は notifications.xml にありませんでした。
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="FloaterNotFound">
-		フロータ・エラー:下記のコントロールが見つかりませんでした:
-[CONTROLS]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="TutorialNotFound">
-		現在利用可能なチュートリアルはありません。
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="GenericAlert">
-		[MESSAGE]
-	</notification>
-	<notification name="GenericAlertYesCancel">
-		[MESSAGE]
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="はい"/>
-	</notification>
-	<notification name="BadInstallation">
-		[APP_NAME] をアップデート中にエラーが発生しました。  最新バージョンをダウンロードしてください。 http://get.secondlife.com
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="LoginFailedNoNetwork">
-		[SECOND_LIFE_GRID] に接続できませんでした。
-「[DIAGNOSTIC]」
-インターネット接続が正常かご確認ください。
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="MessageTemplateNotFound">
-		メッセージテンプレート [PATH] がありませんでした。
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="WearableSave">
-		現在の衣服/ボディーパーツの変更を保存しますか?
-		<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="保存しない" yestext="保存"/>
-	</notification>
-	<notification name="CompileQueueSaveText">
-		次の理由で、スクリプト用テキストのアップロード時に問題が起こりました。 [REASON] 後でもう一度試してください。
-	</notification>
-	<notification name="CompileQueueSaveBytecode">
-		次の理由で、コンパイルしたスクリプトのアップロード時に問題が起こりました。 [REASON]後でもう一度試してください。
-	</notification>
-	<notification name="WriteAnimationFail">
-		アニメーションデータの書き込みに問題があります。後でもう一度お試しください。
-	</notification>
-	<notification name="UploadAuctionSnapshotFail">
-		次の理由で、オークションのスナップショットのアップロード時に問題が起こりました。 [REASON]
-	</notification>
-	<notification name="UnableToViewContentsMoreThanOne">
-		一度に複数のアイテムのコンテンツは表示できません。
-選択するアイテムを1つだけにして、もう一度試してください。
-	</notification>
-	<notification name="SaveClothingBodyChanges">
-		衣服/身体部位に対する変更をすべて保存しますか?
-		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="保存しない" yestext="すべて保存"/>
-	</notification>
-	<notification name="GrantModifyRights">
-		他の住人に変更権限を与えると、その人はあなたが所有している
-すべてのオブジェクトを変更、削除、または取得することができるようになります。この許可を与えるときは細心の注意を払ってください。
-[FIRST_NAME] [LAST_NAME]に対して変更権限を与えますか?
-		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
-	</notification>
-	<notification name="GrantModifyRightsMultiple">
-		変更権限を与えると、その人はあなたが作成した全てのオブジェクトを変更することができます。
-この許可を与えるときには細心の注意を払ってください。
-選択した住人に変更権限を与えますか?
-		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
-	</notification>
-	<notification name="RevokeModifyRights">
-		[FIRST_NAME] [LAST_NAME]に対して変更権限を取り消しますか?
-		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
-	</notification>
-	<notification name="RevokeModifyRightsMultiple">
-		選択した住人から変更権限を取り下げますか?
-		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
-	</notification>
-	<notification name="UnableToCreateGroup">
-		グループを作成できません。
-[MESSAGE]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="PanelGroupApply">
-		[NEEDS_APPLY_MESSAGE]
-[WANT_APPLY_MESSAGE]
-		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="変更を無視" yestext="変更を適用"/>
-	</notification>
-	<notification name="MustSpecifyGroupNoticeSubject">
-		グループ通知の送信には、件名の記入が必要です。
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="AddGroupOwnerWarning">
-		あなたは [ROLE_NAME]の役割にメンバーを与えようとしています。
-任命されたメンバーが自ら退任しない限り、
-彼らを役柄から削除できません。
-操作を続行しますか?
-		<usetemplate ignoretext="グループオーナーを新しく追加する前に確認" name="okcancelignore" notext="いいえ" yestext="はい"/>
-	</notification>
-	<notification name="AssignDangerousActionWarning">
-		あなたは[ROLE_NAME]に [ACTION_NAME]の能力を
-与えようとしています。
-
- *警告*
-この能力を持つ役割のメンバーは、
-自分と他のメンバーに現在より強力な権限を割り当て、
-自分をオーナーとほぼ同様の立場に
-任命することもできるようになります。 この行為の意味をよく理解してから
-実行してください。
-
-この能力を[ROLE_NAME]に割り当てますか?
-		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
-	</notification>
-	<notification name="AssignDangerousAbilityWarning">
-		あなたは[ROLE_NAME]に [ACTION_NAME]の能力を
-与えようとしています。
-
- *警告*
-この能力をもつ役割のメンバーは、
-自分と他のメンバーにすべての能力を割り当て、
-自分をオーナーとほぼ同様の立場に任命できます。
-
-この能力を[ROLE_NAME]に割り当てますか?
-		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
-	</notification>
-	<notification name="JoinGroupCanAfford">
-		このグループに参加するには、L$[COST]かかります。
-続行しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="参加"/>
-	</notification>
-	<notification name="JoinGroupCannotAfford">
-		このグループに加入するには、L$[COST]必要です。
-L$が不足しているのでこのグループに参加することができません。
-	</notification>
-	<notification name="CreateGroupCost">
-		このグループを作るには L$100 かかります。
-一人ではグループにならないので、永久に削除されてしまいます。
-48時間以内にメンバーを勧誘し入会してもらってください。
-		<usetemplate canceltext="キャンセル" name="okcancelbuttons" notext="キャンセル" yestext="L$100 でグループを作成"/>
-	</notification>
-	<notification name="LandBuyPass">
-		L$[COST]で [TIME]時間この土地[PARCEL_NAME]に入ることができます。
-入場許可を購入しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="SalePriceRestriction">
-		不特定の人に売却する場合には、
-売却価格はL$0以上に設定する必要があります。
-売却価格をL$0に設定する場合は、
-売却する個人を選択してください。
-	</notification>
-	<notification name="ConfirmLandSaleChange">
-		選択された[LAND_SIZE]平方メートルの土地は、売り出し中に設定されています。
-売却価格L$[SALE_PRICE]で、[NAME]に売却を認可します。
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmLandSaleToAnyoneChange">
-		注:「誰にでも売却する」をクリックすると、
-あなたの土地は[SECOND_LIFE] のコミュニティのどこからでも
-(この地域にないコミュニティを含む)購入できるようになります。
-
-選択された[LAND_SIZE]平方メートルの土地は、
-売り出し中に設定されています。
-売却価格L$[SALE_PRICE]で、[NAME]に売却を認可します。
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsDeededToGroup">
-		この区画のグループ[NAME]共有のすべてのオブジェクトを、以前のオーナーの持ち物に戻そうとしています。
-操作を続行しますか?
-
-*警告* これにより、
-グループに譲渡された譲渡不可能なオブジェクトは削除されます!
-オブジェクト: [N]
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsOwnedByUser">
-		この区画で、
-住人[NAME]が所有する全てのオブジェクトを
-彼らの持ち物に本当に返却してもよいですか?
-
-オブジェクト: [N]
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsOwnedBySelf">
-		この土地区画内にある、あなたが所有するすべてのオブジェクトを、
-あなたの持ち物に戻そうとしています。操作を続行しますか?
-
-オブジェクト: [N]
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsNotOwnedBySelf">
-		この土地区画内にある、あなた以外が所有するすべてのオブジェクトを、
-それぞれのオーナーの持ち物に戻そうとしています。
-操作を続行しますか?
-グループに譲渡された譲渡可能オブジェクトは、以前のオーナーに返却されます。
-
-*警告* これにより、
-グループに譲渡された譲渡不可能なオブジェクトは削除されます!
-オブジェクト: [N]
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsNotOwnedByUser">
-		この土地区画内にある、
-[NAME]以外による所有のオブジェクトをすべてそれぞれのオーナーの持ち物に返却しようとしています。
-操作を続行しますか?グループに譲渡された譲渡可能オブジェクトは、以前のオーナーに返却されます。
-
-*警告* これにより、
-グループに譲渡された譲渡不可能なオブジェクトは削除されます!
-オブジェクト: [N]
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="ReturnAllTopObjects">
-		全てのリストされたオブジェクトを所有者に本当に返却しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="DisableAllTopObjects">
-		この地域内のすべてのオブジェクトを無効にしようとしています。操作を続行しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsNotOwnedByGroup">
-		この土地の区画上のオブジェクトのうち、グループ[NAME]
-との間で共有していないオブジェクトをオーナーに返却しますか?
-
-オブジェクト: [N]
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="UnableToDisableOutsideScripts">
-		スクリプトを無効にできません。
-この地域全体が「ダメージ有効」に設定されています。
-武器を使用するにはスクリプトの実行を許可する必要があります。
-	</notification>
-	<notification name="MustBeInParcel">
-		着地点を設定するには、この区画の内側に
-立ってください。
-	</notification>
-	<notification name="PromptRecipientEmail">
-		受信者の有効なEメールアドレスを入力してください。
-	</notification>
-	<notification name="PromptSelfEmail">
-		あなたのEメール・アドレスを入力してください。
-	</notification>
-	<notification name="PromptMissingSubjMsg">
-		デフォルトの件名またはメッセージを付けて、スナップショットを送信しますか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="ErrorProcessingSnapshot">
-		スナップショット・データの処理エラー
-	</notification>
-	<notification name="ErrorEncodingSnapshot">
-		スナップショットのエンコード化でエラーが出ました!
-	</notification>
-	<notification name="ErrorUploadingPostcard">
-		次の理由で、スナップショットの送信時に問題が起こりました: [REASON]
-	</notification>
-	<notification name="ErrorUploadingReportScreenshot">
-		次の理由で、レポートのスクリーンショットのアップロード時に問題が起こりました。 [REASON]
-	</notification>
-	<notification name="MustAgreeToLogIn">
-		[SECOND_LIFE] へのログインを続けるには、利用規約に同意してください。
-	</notification>
-	<notification name="CouldNotPutOnOutfit">
-		服装を装着できません。
-服装フォルダに衣服、身体部位、付属品がありません。
-	</notification>
-	<notification name="CannotWearTrash">
-		ゴミ箱にある服やボディーパーツの着用はできません。
-	</notification>
-	<notification name="CannotWearInfoNotComplete">
-		まだ読み込まれていないため、そのアイテムを装着できません。後でやり直してください。
-	</notification>
-	<notification name="MustHaveAccountToLogIn">
-		おっと! 記入漏れがありますよ。
-アバターのファーストネームとラストネームの両方を入力する必要があります。
-
-[SECOND_LIFE]に入るには、アカウントが必要です。 アカウントを作成しますか?
-		<url name="url">
-			https://join.secondlife.com/index.php?lang=ja-JP
-		</url>
-		<usetemplate name="okcancelbuttons" notext="もう一度試す" yestext="新しいアカウントを作成"/>
-	</notification>
-	<notification name="AddClassified">
-		検索ディレクトリの「クラシファイド」セクションに、
-クラシファイド広告が1週間掲載されます。
-広告を記入後、「公開」をクリックし、ディレクトリに
-追加します。
-「公開」をクリックすると、支払金額を尋ねられます。
-多く払うほど、広告がクラシファイド・リストとキーワード検索
-の上位に表示されます。
-		<usetemplate ignoretext="新規クラシファイド広告作成方法" name="okcancelignore" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="DeleteClassified">
-		クラシファイド広告[NAME]の削除をしますか?
-支払い済みの料金は返金されません。
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="ClassifiedSave">
-		クラシファイド広告[NAME]への変更を保存しますか?
-		<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="保存しない" yestext="保存"/>
-	</notification>
-	<notification name="DeleteAvatarPick">
-		ピック[PICK]を削除しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="PromptGoToEventsPage">
-		[SECOND_LIFE]イベント・ウェブ・ページに移動しますか?
-		<url name="url">
-			http://jp.secondlife.com/events/
-		</url>
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="SelectProposalToView">
-		表示する提案を選択してください。
-	</notification>
-	<notification name="SelectHistoryItemToView">
-		表示する履歴アイテムを選択してください。
-	</notification>
-	<notification name="ResetShowNextTimeDialogs">
-		これらのポップアップ全てを再度有効化しますか?(以前「今後は表示しない」と指定しています)
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="SkipShowNextTimeDialogs">
-		スキップ可能なポップアップ全てを無効化しますか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="CacheWillClear">
-		[APP_NAME]の再起動後にキャッシュがクリアされます。
-	</notification>
-	<notification name="CacheWillBeMoved">
-		[APP_NAME]の再起動後にキャッシュが移動されます。
-注意:これによりキャッシュがクリアされます。
-	</notification>
-	<notification name="ChangeConnectionPort">
-		ポートの設定は、[APP_NAME]の再起動後に有効になります。
-	</notification>
-	<notification name="ChangeSkin">
-		新しいスキンは[APP_NAME]を再起動すると現れます
-	</notification>
-	<notification name="GoToAuctionPage">
-		[SECOND_LIFE]ウェブ・ページに移動し、 入札あるいはオークションの詳細を確認しますか?
-		<url name="url">
-			http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
-		</url>
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="SaveChanges">
-		変更を保存しますか?
-		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="保存しない" yestext="保存"/>
-	</notification>
-	<notification name="GestureSaveFailedTooManySteps">
-		ジェスチャーの保存に失敗しました。
-ステップが多すぎます。
-ステップをいくつか削除してから再保存してください
-	</notification>
-	<notification name="GestureSaveFailedTryAgain">
-		ジェスチャーの保存に失敗しました。少し待ってからもう一度試してください。
-	</notification>
-	<notification name="GestureSaveFailedObjectNotFound">
-		ジェスチャーの保存に失敗しました。オブジェクト、または関連するオブジェクト持ち物が見つかりません。
-オブジェクトが範囲内に存在しないか、または削除された可能性があります。
-	</notification>
-	<notification name="GestureSaveFailedReason">
-		次の理由で、ジェスチャーの保存時に問題が起こりました。 [REASON]。  後でもう一度試してください。
-	</notification>
-	<notification name="SaveNotecardFailObjectNotFound">
-		ノートカードの保存に失敗しました。オブジェクト、または関連するオブジェクト持ち物が見つかりません。
-オブジェクトが範囲内に存在しないか、または削除された可能性があります。
-	</notification>
-	<notification name="SaveNotecardFailReason">
-		次の理由で、ノートカードの保存時に問題が起こりました。 [REASON]。  後でもう一度試してください。
-	</notification>
-	<notification name="ScriptCannotUndo">
-		あなたのスクリプトのバージョンでは、変更を元に戻すことはできませんでした。
-サーバーの最新保存バージョンをロードしますか?
-(**警告**:この操作後元に戻すことはできません)
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="SaveScriptFailReason">
-		次の理由で、スクリプトの保存に問題が起こりました。 [REASON]。  後でもう一度試してください。
-	</notification>
-	<notification name="SaveScriptFailObjectNotFound">
-		スクリプトの保存に失敗しました。スクリプトが入ったオブジェクトが見つかりません。
-オブジェクトは範囲外か、または削除されているかもしれません。
-	</notification>
-	<notification name="SaveBytecodeFailReason">
-		次の理由で、コンパイルしたスクリプトの保存時に問題が起こりました。 [REASON]。  後でもう一度試してください。
-	</notification>
-	<notification name="StartRegionEmpty">
-		ログイン位置が不明です。 
-ログイン位置の欄にリージョン名を入力するか、「最後にログアウトした場所」か「自宅(ホーム)」を選択してください。
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="CouldNotStartStopScript">
-		スクリプトの起動または停止に失敗しました。スクリプトが格納されているオブジェクトが見つかりません。
-オブジェクトが範囲内に存在しないか、または削除された可能性があります。
-	</notification>
-	<notification name="CannotDownloadFile">
-		ファイルをダウンロードできません。
-	</notification>
-	<notification name="CannotWriteFile">
-		ファイル[[FILE]]を書き込めません。
-	</notification>
-	<notification name="UnsupportedHardware">
-		警告: お使いのシステムは [APP_NAME] の必要最低限の動作環境を満たしていません。 このまま [APP_NAME] を使用すると、パフォーマンスの低下を感じるかもしれません。 恐れ入りますが [SUPPORT_SITE] ではサポート対象外のシステムに関する技術的サポートは行っておりません。
-
-最低動作環境
-[_URL] で詳しい情報を確認しますか?
-		<url name="url" option="0">
-			http://secondlife.com/support/sysreqs.php?lang=ja
-		</url>
-		<usetemplate ignoretext="使用しているコンピューターのハードウェアがサポートされていません" name="okcancelignore" notext="いいえ" yestext="はい"/>
-	</notification>
-	<notification name="UnknownGPU">
-		お使いのシステムには、現在 [APP_NAME] が認識できないグラフィックカードが搭載されています。
-[APP_NAME] でまだテストされていない最新ハードウェアのためだと考えられます。  [APP_NAME] は正常に実行される可能性が高いですが、表示設定を調整する必要があるかもしれません。
-(環境設定 &gt; 表示)
-		<form name="form">
-			<ignore name="ignore" text="使用中のグラフックカードが認識されませんでした"/>
-		</form>
-	</notification>
-	<notification name="DisplaySettingsNoShaders">
-		[APP_NAME] は、
-グラフィック・ドライバの初期化中にクラッシュしました。
-一般的なドライバ・エラーを回避するため、「品質およびパフォーマンス」は「低」に設定されます。
-これにより、いくつかのグラフィックス機能は無効になります。
-グラフィックカード・ドライバのアップデートをお勧めします。
-「グラフィックの品質」は「環境設定」>「表示」から上げることができます。
-	</notification>
-	<notification name="RegionNoTerraforming">
-		この地域[REGION] は、テラフォーミングができません。
-	</notification>
-	<notification name="CannotCopyWarning">
-		あなたはこのアイテムのコピーを
-許されていないので、人にあげると
-持ち物から失われます。 本当に
-これをあげたいですか?
-		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
-	</notification>
-	<notification name="CannotGiveItem">
-		持ち物のアイテムを渡せません。
-	</notification>
-	<notification name="TransactionCancelled">
-		取引がキャンセルされました。
-	</notification>
-	<notification name="TooManyItems">
-		一度のインベントリ交換で、42以上のアイテムは送れません。
-	</notification>
-	<notification name="NoItems">
-		選択したアイテムを譲渡できる権限がありません。
-	</notification>
-	<notification name="CannotCopyCountItems">
-		あなたは選択したアイテムの[COUNT]のコピーを
-許されていません。
-これらのアイテムはあなたの持ち物から失われます。
-本当にアイテムをあげたいですか?
-		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
-	</notification>
-	<notification name="CannotGiveCategory">
-		選択したフォルダを譲渡できる権限がありません
-	</notification>
-	<notification name="FreezeAvatar">
-		このアバターをフリーズしますか?
-アバターは一時的に動けなくなり、
-チャットなど、この世界に対する関わりを持つことができなくなります。
-		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="解凍" yestext="フリーズ"/>
-	</notification>
-	<notification name="FreezeAvatarFullname">
-		[AVATAR_NAME]をフリーズしますか?
-フリーズされた人は一時的に動けなくなり、チャットなど、この世界に対する関わりを持つことができなくなります。
-		<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="解凍" yestext="フリーズ"/>
-	</notification>
-	<notification name="EjectAvatarFullname">
-		あなたの土地から[AVATAR_NAME]を追放しますか?
-		<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="追放と禁止" yestext="追放"/>
-	</notification>
-	<notification name="EjectAvatarNoBan">
-		このアバターをあなたの土地から追放しますか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="追放"/>
-	</notification>
-	<notification name="EjectAvatarFullnameNoBan">
-		[AVATAR_NAME] をあなたの土地から追放しますか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="追放"/>
-	</notification>
-	<notification name="AcquireErrorTooManyObjects">
-		取得エラー:選択したオブジェクトの数が多すぎます。
-	</notification>
-	<notification name="AcquireErrorObjectSpan">
-		取得エラー:
-オブジェクトが複数の地域にまたがって存在しています。
-取得するオブジェクトは、
-すべて同じ地域内に移動させてください。
-	</notification>
-	<notification name="PromptGoToCurrencyPage">
-		[EXTRA]
-
-[_URL] でリンデンドル購入に関する情報を確認しますか?
-		<url name="url">
-			http://jp.secondlife.com/currency/
-		</url>
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="UnableToLinkObjects">
-		これらの[COUNT]オブジェクトをリンクできません。
-最大[MAX]オブジェクトをリンクすることができます。
-	</notification>
-	<notification name="CannotLinkIncompleteSet">
-		セットとして揃っているオブジェクトのみリンクできます。複数の
-オブジェクトを選択してください。
-	</notification>
-	<notification name="CannotLinkModify">
-		すべてのオブジェクトに対する修正許可があなたにないため、
-リンクできません。
-
-オブジェクトがすべてロックされておらず、あなたのものであることを確認してください。
-	</notification>
-	<notification name="CannotLinkDifferentOwners">
-		所有者が異なるため、すべてのオブジェクトを
-リンクできません。
-
-自分が所有しているオブジェクトだけを選択してください。
-	</notification>
-	<notification name="NoFileExtension">
-		ファイル「[FILE]」の拡張子が無効です。
-
-このファイルの拡張子が正しいかどうかを確認してください。
-	</notification>
-	<notification name="InvalidFileExtension">
-		ファイル拡張子[EXTENSION]は無効です
-正しい拡張子:[VALIDS]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="CannotUploadSoundFile">
-		読み込みのためにアップロードされたサウンドファイルを開けません:
-[FILE]
-	</notification>
-	<notification name="SoundFileNotRIFF">
-		ファイルがRIFF WAVEファイルとして認識されません:
-[FILE]
-	</notification>
-	<notification name="SoundFileNotPCM">
-		ファイルがPCM WAVEオーディオ・ファイルとして認識されません:
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidChannelCount">
-		ファイルのチャンネル数が無効です(モノラルまたはステレオを使用する必要があります):
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidSampleRate">
-		ファイルのサンプル・レートがサポート外です(44.1kを指定する必要があります):
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidWordSize">
-		ファイルのワード・サイズがサポート外です(8または16ビットを指定する必要があります):
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidHeader">
-		WAVヘッダーにデータ・チャンクが見つかりません:
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidTooLong">
-		オーディオ・ファイルが長すぎます。(最大10秒):
-[FILE]
-	</notification>
-	<notification name="ProblemWithFile">
-		ファイル[FILE]にエラーがあります。
-
-[ERROR]
-	</notification>
-	<notification name="CannotOpenTemporarySoundFile">
-		書き込み用の一時圧縮サウンド・ファイルを開くことができません:[FILE]
-	</notification>
-	<notification name="UnknownVorbisEncodeFailure">
-		未知のVorbis 暗号化に失敗: [FILE]
-	</notification>
-	<notification name="CannotEncodeFile">
-		次のファイルのエンコードができません: [FILE]
-	</notification>
-	<notification name="CorruptResourceFile">
-		破損したリソースファイル: [FILE]
-	</notification>
-	<notification name="UnknownResourceFileVersion">
-		未知のlindenリソースファイルのバージョン: [FILE]
-	</notification>
-	<notification name="UnableToCreateOutputFile">
-		服装ファイルを作成できません: [FILE]
-	</notification>
-	<notification name="DoNotSupportBulkAnimationUpload">
-		現在 [APP_NAME] では、アニメーションの一括アップロードはサポートされていません。
-	</notification>
-	<notification name="CannotUploadReason">
-		次の理由で、[FILE] をアップロードできません: [REASON]
-あとでもう一度試してください。
-	</notification>
-	<notification name="LandmarkCreated">
-		「 [LANDMARK_NAME] 」を「 [FOLDER_NAME] 」フォルダに追加しました。
-	</notification>
-	<notification name="CannotCreateLandmarkNotOwner">
-		土地の所有者が許可していないため、
-ランドマークを作成することはできません。
-	</notification>
-	<notification name="CannotRecompileSelectObjectsNoScripts">
-		再編集は不可能です。
-スクリプト化されたオブジェクトを選択してください。
-	</notification>
-	<notification name="CannotRecompileSelectObjectsNoPermission">
-		「再編集」は不可能です。
-
-変更修正権限のある
-スクリプト化されたオブジェクトを選択してください。
-	</notification>
-	<notification name="CannotResetSelectObjectsNoScripts">
-		「再設定」を行うことができません。
-
-スクリプト化されたオブジェクトを選択してください。
-	</notification>
-	<notification name="CannotResetSelectObjectsNoPermission">
-		「再設定」を行うことができません。
-
-変更修正権限のある
-スクリプト化されたオブジェクトを選択してください。
-	</notification>
-	<notification name="CannotSetRunningSelectObjectsNoScripts">
-		スクリプトの「実行」の設定ができません。
-
-スクリプト化されたオブジェクトを選択してください。
-	</notification>
-	<notification name="CannotSetRunningNotSelectObjectsNoScripts">
-		スクリプトを「実行しない」に設定できません。
-
-スクリプト化されたオブジェクトを選択してください。
-	</notification>
-	<notification name="NoFrontmostFloater">
-		保存すべきfrontmostフロータがありません。
-	</notification>
-	<notification name="SeachFilteredOnShortWords">
-		指定した検索クエリは変更され、短すぎる語句は取り除かれています。
-
-検索語句: [FINALQUERY]
-	</notification>
-	<notification name="SeachFilteredOnShortWordsEmpty">
-		指定した検索語句が短すぎたため、検索は行われませんでした。
-	</notification>
-	<notification name="CouldNotTeleportReason">
-		テレポートに失敗しました。
-[REASON]
-	</notification>
-	<notification name="invalid_tport">
-		テレポート処理中に問題が発生しました。 ログインし直す必要があるかもしれません。
-このメッセージが何度も出る場合は、[SUPPORT_SITE] へご連絡ください。
-	</notification>
-	<notification name="invalid_region_handoff">
-		リージョン間の移動中に問題が発生しました。 ログインし直す必要があるかもしれません。
-このメッセージが何度も出る場合は、[SUPPORT_SITE] へご連絡ください。
-	</notification>
-	<notification name="blocked_tport">
-		申し訳ございません。テレポートは現在、ブロックされています。もう少し後でやり直してください。
-やり直してもテレポートできない場合は、いったんログアウトし、再度ログインして問題を解決してください。
-	</notification>
-	<notification name="nolandmark_tport">
-		残念ながら、システムはランドマーク目的地を探せませんでした。
-	</notification>
-	<notification name="timeout_tport">
-		申し訳ございません。システムはテレポート接続を完了できませんでした。
-もう少し後でやり直してください。
-	</notification>
-	<notification name="noaccess_tport">
-		残念ながら、そのテレポート目的地へのアクセスがありません。
-	</notification>
-	<notification name="missing_attach_tport">
-		添付物は、まだ到着していません。あと数秒間お待ちいただくか、いったんログアウトし、再度ログインしてからテレポートをやり直してださい。
-	</notification>
-	<notification name="too_many_uploads_tport">
-		この地域の資産キューが現在込み合っているため、テレポート・リクエストを時間通りに処理することが難しい状況です。
-数分後にやり直すか、または混雑していない他の地域をお試しください。
-	</notification>
-	<notification name="expired_tport">
-		申し訳ございません。システムはテレポート・リクエストを時間どおりに完了できませんでした。数分後にやり直してください。
-	</notification>
-	<notification name="expired_region_handoff">
-		申し訳ございません。システムは地域間の移動を時間どおりに完了できませんでした。
-数分後にやり直してください。
-	</notification>
-	<notification name="no_host">
-		テレポート目的地を見つけられません。目的地が一時的に利用できない状態か、またはすでに消滅している可能性があります。数分後にやり直してください。
-	</notification>
-	<notification name="no_inventory_host">
-		持ち物システムは現在利用できません。
-	</notification>
-	<notification name="CannotSetLandOwnerNothingSelected">
-		土地所有者設定ができません:
-区画が選定されていません。
-	</notification>
-	<notification name="CannotSetLandOwnerMultipleRegions">
-		複数の地域が選択されたため、
-土地の所有権を取得できません。
-選択する面積を小さくして、もう一度試してください。
-	</notification>
-	<notification name="ForceOwnerAuctionWarning">
-		この区画はオークションに出品されています。
-区画の所有権を取得するとオークションが無効になり、
-入札が開始していたら不満に思う住人が出てくるかもしれません。
-所有権を取得しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="CannotContentifyNothingSelected">
-		コンテンツ化は不可能です:
-区画が選定されていません。
-	</notification>
-	<notification name="CannotContentifyNoRegion">
-		コンテンツ化は不可能です:
-土地が選択されていません。
-	</notification>
-	<notification name="CannotReleaseLandNothingSelected">
-		土地を破棄することができません:
-区画が選定されていません。
-	</notification>
-	<notification name="CannotReleaseLandNoRegion">
-		土地を破棄できません:
-地域が見つかりません。
-	</notification>
-	<notification name="CannotBuyLandNothingSelected">
-		土地を購入できません:
-区画が選定されていません。
-	</notification>
-	<notification name="CannotBuyLandNoRegion">
-		土地を購入できません:
-この土地がある地域を見つけることができません
-	</notification>
-	<notification name="CannotCloseFloaterBuyLand">
-		[APP_NAME]による、
-この取引の見積りが完了するまで「土地を購入」ウィンドウを閉じることはできません。
-	</notification>
-	<notification name="CannotDeedLandNothingSelected">
-		土地を譲渡できません:
-区画が選定されていません。
-	</notification>
-	<notification name="CannotDeedLandNoGroup">
-		土地を譲渡できません:
-グループが選択されていません。
-	</notification>
-	<notification name="CannotDeedLandNoRegion">
-		土地を譲渡できません:
-この土地がある地域が見つかりません。
-	</notification>
-	<notification name="CannotDeedLandMultipleSelected">
-		土地を譲渡できません:
-複数の区画が選択されています。
-
-これより1つの区画を選択してください。
-	</notification>
-	<notification name="ParcelCanPlayMedia">
-		ここではストリーミング・メディア再生が可能です。
-メディアのストリーミングには、高速なインターネット接続環境が必要です。
-
-利用可能になったら再生しますか?
-(このオプションは、「環境設定」>「音声とビデオ」で後からでも変更できます)
-		<usetemplate name="okcancelbuttons" notext="無効化" yestext="メディアを再生"/>
-	</notification>
-	<notification name="CannotDeedLandWaitingForServer">
-		土地を譲渡できません:
-サーバーからの所有権情報を待っています。
-
-再度、試みてください。
-	</notification>
-	<notification name="CannotDeedLandNoTransfer">
-		土地を譲渡できません:
-この地域 [REGION] では土地の譲渡が許されていません。
-	</notification>
-	<notification name="CannotReleaseLandWatingForServer">
-		土地を破棄できません:
-サーバーが区画情報を更新するのを待っています。
-
-もう少し後でやり直してください。
-	</notification>
-	<notification name="CannotReleaseLandSelected">
-		土地を破棄できません:
-あなたは、選択したすべての区画を所有していません。
-
-1つの区画を選択してください。
-	</notification>
-	<notification name="CannotReleaseLandDontOwn">
-		土地を破棄できません:
-あなたはこの土地を手放すことを許可されていません。
-あなたの区画は緑色で表示されています。
-	</notification>
-	<notification name="CannotReleaseLandRegionNotFound">
-		土地を破棄できません:
-この土地がある地域が見つかりません。
-	</notification>
-	<notification name="CannotReleaseLandNoTransfer">
-		土地を破棄できません:
-この [REGION] では土地の譲渡が許されていません。
-	</notification>
-	<notification name="CannotReleaseLandPartialSelection">
-		土地を破棄できません:
-区画全体を選択して破棄する必要があります。
-
-区画全体を選択するか、または、まず最初に区画を分割してください。
-	</notification>
-	<notification name="ReleaseLandWarning">
-		あなたは、[AREA]平方メートルの土地を破棄しようとしています。
-この区画を破棄するとあなたの土地ではなくなりますが、
-L$は返金されません。
-
-土地を破棄しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="CannotDivideLandNothingSelected">
-		土地を分割できません:
-
-区画が選定されていません。
-	</notification>
-	<notification name="CannotDivideLandPartialSelection">
-		土地を分割できません:
-
-区画全体が選択されています。
-区画の一部を選択してください。
-	</notification>
-	<notification name="LandDivideWarning">
-		この土地を分割すると、2つの区画に別れます。
-区画ごとの設定が可能になります。 この操作を行うと、一部の設定がデフォルトにリセットされます。
-
-土地の分割操作を続行しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="CannotDivideLandNoRegion">
-		土地を分割できません:
-この土地がある地域が見つかりません。
-	</notification>
-	<notification name="CannotJoinLandNoRegion">
-		土地を統合できません:
-この土地がある地域が見つかりません。
-	</notification>
-	<notification name="CannotJoinLandNothingSelected">
-		土地を統合できませんでした:
-区画が選定されていません。
-	</notification>
-	<notification name="CannotJoinLandEntireParcelSelected">
-		土地を統合できません:
-1つの区画しか選択されていません。
-
-両方の区画をまたいで土地を選択してください。
-	</notification>
-	<notification name="CannotJoinLandSelection">
-		土地を統合できません:
-1つ以上の区画を選択する必要があります。
-
-両方の区画をまたいで土地を選択してください。
-	</notification>
-	<notification name="JoinLandWarning">
-		この土地を統合すると、選択された長方形に交差する
-全ての区画を基にして1つの大きな区画が作成されます。
-新しい区画の名前とオプションを再設定する必要があります。
-
-土地を統合しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmNotecardSave">
-		このアイテムをコピー、表示する前に、ノートカードの保存が必要です。 保存しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmItemCopy">
-		このアイテムをあなたの持ち物にコピーしますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="コピー"/>
-	</notification>
-	<notification name="ResolutionSwitchFail">
-		解像度を [RESX]x[RESY]に切り替えることができませんでした。
-	</notification>
-	<notification name="ErrorUndefinedGrasses">
-		エラー:未定義の植物:[SPECIES]
-	</notification>
-	<notification name="ErrorUndefinedTrees">
-		エラー:未定義の樹木:[SPECIES]
-	</notification>
-	<notification name="CannotSaveWearableOutOfSpace">
-		「[NAME]」を服のファイルに保存できません。  コンピューターの
-ディスクスペースを少し増やしてから、もう一度
-保存してみてください。
-	</notification>
-	<notification name="CannotSaveToAssetStore">
-		[NAME]を中央資産格納庫に保存できません。
-これは一時的な不具合です。
-服飾品などをカスタマイズし、数分後にもう一度保存してください。
-	</notification>
-	<notification name="YouHaveBeenLoggedOut">
-		あなたは[SECOND_LIFE]からログアウトされました。
-            [MESSAGE]
-「IMとチャットを表示」をクリックすると、
-現在あるIMとチャットを確認できます。
-確認しない場合は「終了」をクリックし、
-すぐに[APP_NAME]を終了してください。
-		<usetemplate name="okcancelbuttons" notext="終了" yestext="IMとチャットを表示"/>
-	</notification>
-	<notification name="OnlyOfficerCanBuyLand">
-		グループ用の土地の購入ができません:
-あなたにはアクティブなグループのために土地を購入する権限がありません。
-	</notification>
-	<notification label="フレンドを追加" name="AddFriend">
-		フレンドとして追加すると、お互いの現在地の地図への表示許可、オンラインステータス表示の設定をすることができます。
-
-[NAME] にフレンドシップを送りますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification label="フレンドを追加" name="AddFriendWithMessage">
-		フレンドとして追加すると、お互いの現在地の地図への表示許可、オンラインステータス表示の設定をすることができます。
-
-[NAME] にフレンドシップのオファーをしますか?
-		<form name="form">
-			<input name="message">
-				フレンドとして登録してくれますか?
-			</input>
-			<button name="Offer" text="OK"/>
-			<button name="Cancel" text="キャンセル"/>
-		</form>
-	</notification>
-	<notification name="RemoveFromFriends">
-		[FIRST_NAME] [LAST_NAME]をフレンドリストから削除しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="RemoveMultipleFromFriends">
-		フレンドリストから複数のフレンドを削除しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="GodDeleteAllScriptedPublicObjectsByUser">
-		**[AVATAR_NAME]**
-所有のすべてのスクリプト・オブジェクトをこのシム内の他のすべての土地から削除しようとしています。操作を続行しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="GodDeleteAllScriptedObjectsByUser">
-		**[AVATAR_NAME]**
-所有のすべてのスクリプト・オブジェクトをこのシム内のすべての土地から削除しようとしています。操作を続行しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="GodDeleteAllObjectsByUser">
-		**[AVATAR_NAME]**
-所有のすべてのオブジェクト(スクリプト・オブジェクトと非スクリプト・オブジェクト)を
-このシム内のすべての土地から削除しようとしています。操作を続行しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="BlankClassifiedName">
-		クラシファイドに名前を指定してください。
-	</notification>
-	<notification name="MinClassifiedPrice">
-		広告料の支払い金額は、Lと[MIN_PRICE]が下限です。
-
-金額を増やしてください。
-	</notification>
-	<notification name="ConfirmObjectDeleteLock">
-		選択したアイテムの1つ以上がロックされています。
-
-本当にこれらのアイテムの削除を続けますか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteNoCopy">
-		選択したアイテムの1つ以上がコピーできません。
-
-本当にこれらのアイテムの削除を続けますか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteNoOwn">
-		選択したアイテムの1つ以上を、あなたは所有していません。
-
-本当にこれらのアイテムの削除を続けますか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteLockNoCopy">
-		一つ以上のオブジェクトがロックされています。
-一つ以上のオブジェクトがコピーできません。
-
-本当にこれらのアイテムの削除を続けますか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteLockNoOwn">
-		一つ以上のオブジェクトがロックされています。
-1つ以上のオブジェクトを、あなたは所有していません。
-
-本当にこれらのアイテムの削除を続けますか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteNoCopyNoOwn">
-		一つ以上のオブジェクトがコピーできません。
-1つ以上のオブジェクトを、あなたは所有していません。
-
-本当にこれらのアイテムの削除を続けますか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
-		一つ以上のオブジェクトがロックされています。
-一つ以上のオブジェクトがコピーできません。
-1つ以上のオブジェクトを、あなたは所有していません。
-
-本当にこれらのアイテムの削除を続けますか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectTakeLock">
-		一つ以上のオブジェクトがロックされています。
-
-これらのアイテムの取得を続けますか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectTakeNoOwn">
-		取得しようとしているオブジェクトには、あなたの所有物でないオブジェクトが含まれています。
-あなたの所有物ではないオブジェクトを取得すると、次のオーナーの権限がそのオブジェクトに適用されます。
-そのため、将来、変更やコピーの能力が制限される可能性があります。
-
-これらのアイテムの取得を続けますか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectTakeLockNoOwn">
-		1つ以上のオブジェクトがロックされています。
-取得しようとしているオブジェクトには、あなたの所有物でないオブジェクトが含まれています。
-あなたの所有物ではないオブジェクトを取得すると、次のオーナーの権限がそのオブジェクトに適用されます。
-そのため、将来、変更やコピーの能力が制限される可能性があります。
-この選択内容のままで続行することは可能ですが、
-
-これらのアイテムの取得を続けますか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="CantBuyLandAcrossMultipleRegions">
-		複数の地域が選択されたため、土地を購入できません。
-
-選択する面積を小さくしてもう一度試してください。
-	</notification>
-	<notification name="DeedLandToGroup">
-		この区画の譲渡に際しては、
-このグループが十分な土地クレジットを保有および維持していることが必要です。
-土地の購入価格は、オーナーに返金されません。譲渡された区画が売れると、販売価格はグループ・メンバーに均等に分配されます。
-
-この[AREA]平方メートルの土地を、グループ
-「[GROUP_NAME]」に譲渡しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="DeedLandToGroupWithContribution">
-		この区画の譲渡に際しては、このグループが
-十分な土地クレジットを保有および維持していることが必要です。
-この譲渡により、
-「[FIRST_NAME] [LAST_NAME]」から
-グループに対して土地が同時に提供されます。
-土地の購入価格は、オーナーに返金されません。
-譲渡された区画が売れると、販売料金はグループ・メンバーに均等に分配されます。
-
-この[AREA]平方メートルの土地を、グループ「[GROUP_NAME]」に譲渡しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="DisplaySetToSafe">
-		-safeオプションを指定したので、
-表示設定はセーフ・レベルに設定されています。
-	</notification>
-	<notification name="DisplaySetToRecommended">
-		表示設定は、あなたのシステム構成に
-基づいて推奨されたレベルに設定されています。
-	</notification>
-	<notification name="ErrorMessage">
-		[ERROR_MESSAGE]
-	</notification>
-	<notification name="AvatarMovedDesired">
-		目的地は現在ご利用いただけません。
-近くのリージョンに移動しました。
-	</notification>
-	<notification name="AvatarMovedLast">
-		前回いた場所は現在ご利用いただけません。
-近くのリージョンに移動しました。
-	</notification>
-	<notification name="AvatarMovedHome">
-		ホームロケーションは現在ご利用いただけません。
-近くのリージョンに移動しました。
-新たにホームを設定しなおすといいかもしれません。
-	</notification>
-	<notification name="ClothingLoading">
-		現在衣類をダウンロード中です。
-このまま [SECOND_LIFE] を通常通りご使用いただけます。他人からはあなたは正しく表示されます。
-		<form name="form">
-			<ignore name="ignore" text="衣類がダウンロードされるまで時間がかかっています"/>
-		</form>
-	</notification>
-	<notification name="FirstRun">
-		[APP_NAME]のインストールが完了しました。
-
-[SECOND_LIFE] の使用が初めての方は、
-ログイン前にアカウントの作成が必要です。
-www.secondlife.comに移動し、新規アカウントの作成を行いますか?
-		<usetemplate name="okcancelbuttons" notext="続行" yestext="新規アカウント..."/>
-	</notification>
-	<notification name="LoginPacketNeverReceived">
-		接続がなかなかできません。 お使いのインターネット接続か、[SECOND_LIFE_GRID] の問題と考えられます。
-
-インターネット接続を確認してから数分後に再接続するか、ヘルプをクリックして [SUPPORT_SITE] をご覧になるか、テレポートをクリックしてホームに移動してみてください。
-		<url name="url">
-			http://jp.secondlife.com/support/
-		</url>
-		<form name="form">
-			<button name="OK" text="OK"/>
-			<button name="Help" text="ヘルプ"/>
-			<button name="Teleport" text="テレポート"/>
-		</form>
-	</notification>
-	<notification name="WelcomeChooseSex">
-		まもなくあなたのアバターが表示されます。
-
-矢印キーを使用して歩きます。
-ヘルプが必要なときや[SECOND_LIFE]について知りたいときは、
-F1キーを押してください。
-男性あるいは女性のアバターを選択してください。
-あなたの決定は後で変更できます。
-		<usetemplate name="okcancelbuttons" notext="女性" yestext="男性"/>
-	</notification>
-	<notification name="NotEnoughCurrency">
-		[NAME] L$[PRICE] 残高不足のため実行不可です。
-	</notification>
-	<notification name="GrantedModifyRights">
-		[FIRST_NAME] [LAST_NAME] のオブジェクトの編集権限を得ました。
-	</notification>
-	<notification name="RevokedModifyRights">
-		[FIRST_NAME] [LAST_NAME]
-のオブジェクトを修正する権限が取り消されました。
-	</notification>
-	<notification name="FlushMapVisibilityCaches">
-		この手順は、この地域の地図のキャッシュを消去します。
-これが便利なのはデバッグ時のみです。
-(作成中は5分間経つと、全員の地図が再度ログイン後に
-更新されます)
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="BuyOneObjectOnly">
-		一度に一つ以上のオブジェクトをと買うことはできません。  オブジェクトを一つだけ選んでもう一度お試しください。
-	</notification>
-	<notification name="OnlyCopyContentsOfSingleItem">
-		一度に複数のアイテムのコンテンツはコピーできません。
-選択するオブジェクトを1つだけにして、もう一度試してください。
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="KickUsersFromRegion">
-		この地域の全ての住人をホームにテレポートしますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="EstateObjectReturn">
-		[USER_NAME]が所有しているオブジェクトを返却しますか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="InvalidTerrainBitDepth">
-		地域テクスチャを設定できませんでした:
-地形テクスチャ[TEXTURE_NUM]は、無効のビット深度[TEXTURE_BIT_DEPTH]です。
-
-テクスチャ[TEXTURE_NUM]を24ビット512x512かそれ以下のイメージと交換し、「適用」を再度クリックしてください。
-	</notification>
-	<notification name="InvalidTerrainSize">
-		地域テクスチャを設定できませんでした:
-地形テクスチャ[TEXTURE_NUM]は、[TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]では大きすぎます。
-
-テクスチャ[TEXTURE_NUM]を24ビット512x512かそれ以下のイメージと交換し、「適用」を再度クリックしてください。
-	</notification>
-	<notification name="RawUploadStarted">
-		アップロード開始。 接続速度によっては、
-最大2分間かかります。
-	</notification>
-	<notification name="ConfirmBakeTerrain">
-		現在の地形を構築しようとしています。
-この操作を行うと、現在の地形が上昇/下降の制限範囲の中心になり、「復帰」ツールのデフォルトになります。
-操作を続行しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="MaxAllowedAgentOnRegion">
-		許可住人は [MAX_AGENTS] 人までです。
-	</notification>
-	<notification name="MaxBannedAgentsOnRegion">
-		禁止住人は[MAX_BANNED]人までです。
-	</notification>
-	<notification name="MaxAgentOnRegionBatch">
-		[NUM_ADDED] 個のエージェントを追加しようとして失敗しました: [MAX_AGENTS] [LIST_TYPE] 制限を [NUM_EXCESS] 個超過しています。
-	</notification>
-	<notification name="MaxAllowedGroupsOnRegion">
-		許可グループは[MAX_GROUPS]グループまでです。
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="構築する"/>
-	</notification>
-	<notification name="MaxManagersOnRegion">
-		不動産マネージャーは[MAX_MANAGER]人までです。
-	</notification>
-	<notification name="OwnerCanNotBeDenied">
-		不動産オーナーを不動産「禁止住人」リストに追加できません。
-	</notification>
-	<notification name="CanNotChangeAppearanceUntilLoaded">
-		服および形がロードされるまで、容姿の変更はできません。
-	</notification>
-	<notification name="ClassifiedMustBeAlphanumeric">
-		クラシファイド広告の名前は、アルファベットか
-数字で始めます。  句読点では始められません。
-	</notification>
-	<notification name="CantSetBuyObject">
-		オブジェクトが販売対象ではないため、オブジェクトの購入が設定できません。
-販売対象のオブジェクトを設定し、もう一度試してください。
-	</notification>
-	<notification name="FinishedRawDownload">
-		未加工の地形ファイルを次へとダウンロードしました:
-[DOWNLOAD_PATH]。
-	</notification>
-	<notification name="DownloadWindowsMandatory">
-		[APP_NAME]の新しいバージョンが利用可能です。
-[MESSAGE]
-[APP_NAME]を使用するためには、
-このアップデートをダウンロードする必要があります。
-		<usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンロード"/>
-	</notification>
-	<notification name="DownloadWindows">
-		[APP_NAME]のアップデート・バージョンが利用可能です。
-[MESSAGE]
-このアップデートは必須ではありませんが、パフォーマンスと安定性を向上させるためにインストールすることをお勧めします。
-		<usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
-	</notification>
-	<notification name="DownloadWindowsReleaseForDownload">
-		[APP_NAME]のアップデート・バージョンが利用可能です。
-[MESSAGE]
-このアップデートは必須ではありませんが、パフォーマンスと安定性を向上させるためにインストールすることをお勧めします。
-		<usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
-	</notification>
-	<notification name="DownloadLinuxMandatory">
-		[APP_NAME] の最新バージョンがご利用可能です。
-[MESSAGE]
-[APP_NAME] をご利用になるにはこのアップデートは必須です。
-		<usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンロード"/>
-	</notification>
-	<notification name="DownloadLinux">
-		[APP_NAME] のアップデートバージョンがご利用可能です。
-[MESSAGE]
-このアップデートは必須ではありませんが、パフォーマンス向上のためにインストールをおすすめします。
-		<usetemplate name="okcancelbuttons" notext="続ける" yestext="ダウンロード"/>
-	</notification>
-	<notification name="DownloadLinuxReleaseForDownload">
-		[APP_NAME] のアップデートバージョンがご利用可能です。
-[MESSAGE]
-このアップデートは必須ではありませんが、パフォーマンス向上のためにインストールをおすすめします。
-		<usetemplate name="okcancelbuttons" notext="続ける" yestext="ダウンロード"/>
-	</notification>
-	<notification name="DownloadMacMandatory">
-		[APP_NAME]の新しいバージョンが利用可能です。
-[MESSAGE]
-[APP_NAME]を使用するために、
-このアップデートをダウンロードする必要があります。
-
-アプリケーションがあるフォルダにダウンロードしますか?
-		<usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンロード"/>
-	</notification>
-	<notification name="DownloadMac">
-		[APP_NAME]のアップデート・バージョンが利用可能です。
-[MESSAGE]
-このアップデートは必須ではありませんが、パフォーマンスと安定性を向上させるためにインストールすることをお勧めします。
-
-アプリケーションがあるフォルダにダウンロードしますか?
-		<usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
-	</notification>
-	<notification name="DownloadMacReleaseForDownload">
-		[APP_NAME]のアップデート・バージョンが利用可能です。
-[MESSAGE]
-このアップデートは必須ではありませんが、パフォーマンスと安定性を向上させるためにインストールすることをお勧めします。
-
-アプリケーションがあるフォルダにダウンロードしますか?
-		<usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
-	</notification>
-	<notification name="DeedObjectToGroup">
-		このオブジェクトを譲渡するとグループは以下のことが可能です:
-* オブジェクトに支払われたL$を受領します。
-		<usetemplate ignoretext="オブジェクトをグループに譲渡する前に確認する" name="okcancelignore" notext="取り消し" yestext="譲渡"/>
-	</notification>
-	<notification name="WebLaunchExternalTarget">
-		Web ブラウザを開いてこのコンテンツを表示しますか?
-		<usetemplate ignoretext="ブラウザを起動して Web ページを見る" name="okcancelignore" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchJoinNow">
-		secondlife.com でアカウントの管理をしますか?
-		<usetemplate ignoretext="ブラウザを起動してアカウントを管理する" name="okcancelignore" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchSecurityIssues">
-		[SECOND_LIFE] Wikiで、
-セキュリティ問題を報告する方法をご覧ください。
-		<usetemplate ignoretext="ブラウザを起動してセキュリティ問題の報告の仕方を確認する" name="okcancelignore" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchQAWiki">
-		[SECOND_LIFE] 品質保証関連Wikiをご覧ください。
-		<usetemplate ignoretext="ブラウザを起動して QA Wiki を見る" name="okcancelignore" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchPublicIssue">
-		[SECOND_LIFE]のパブリック問題トラッカーで、
-バグやその他の問題を報告できます。
-		<usetemplate ignoretext="ブラウザを確認してパブリック問題トラッカーを使用する" name="okcancelignore" notext="キャンセル" yestext="ページへ行く"/>
-	</notification>
-	<notification name="WebLaunchSupportWiki">
-		Linden公式ブログで、最新のニュースや情報を入手してください。
-		<usetemplate ignoretext="ブラウザを起動して公式ブログを見る" name="okcancelignore" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchLSLGuide">
-		スクリプトガイドを開きますか?
-		<usetemplate ignoretext="ブラウザを起動してスクリプトガイドを見る" name="okcancelignore" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchLSLWiki">
-		LSL ポータルでスクリプトに関する情報を確認しますか?
-		<usetemplate ignoretext="ブラウザを起動して LSL ポータルを見る" name="okcancelignore" notext="取り消し" yestext="ページに移動"/>
-	</notification>
-	<notification name="ReturnToOwner">
-		選択したオブジェクトを、所有者に返却しますか?
-譲渡可能なオブジェクトは
-以前の所有者に返却されます。
-
-*警告* 移転が不可能の譲渡されたオブジェクトは削除されます!
-		<usetemplate ignoretext="オブジェクトを所有者に返却する前に確認する" name="okcancelignore" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="GroupLeaveConfirmMember">
-		現在あなたは [GROUP]のメンバーです。
-ここから抜けますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmKick">
-		すべてのユーザーをグリッド外にキックしようとしています。操作を続行しますか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="全てのユーザを追い出す"/>
-	</notification>
-	<notification name="MuteLinden">
-		残念ながらLindenを無視設定に入れることはできません。
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="CannotStartAuctionAlreadyForSale">
-		既に売り出し中の区画なのでオークションにかけることはできません。  オークションにかけたい場合は売り出し設定を解除してから行ってください。
-	</notification>
-	<notification label="オブジェクトを名前でミュートできませんでした" name="MuteByNameFailed">
-		あなたはすでにこの名前をミュートしています。
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="RemoveItemWarn">
-		コンテンツを削除すると、許可があっても、オブジェクトにダメージを与えることがあります。
-そのアイテムの削除を続けますか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="CantOfferCallingCard">
-		現在コーリングカードを送れません。数分後にもう一度試してください。
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="CantOfferFriendship">
-		現在フレンドシップを送れません。数分後に試してください。
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="BusyModeSet">
-		取り込み中モードになりました。
-チャットとインスタントメッセージは表示されません。 受信するインスタントメッセージには取り込み中返答メッセージが表示されます。 テレポートのオファーは受け取り拒否となります。 アイテムのオファーはすべてゴミ箱に入ります。
-		<usetemplate ignoretext="ログイン状態を取り込み中モードに変更する" name="okignore" yestext="OK"/>
-	</notification>
-	<notification name="JoinedTooManyGroupsMember">
-		加入できるグループの最大限に達しました。 このグループに加入するために他のグループを脱退するか、この申し入れを断ってください。
-[NAME] があなたをグループのメンバーとして勧誘しています。
-[INVITE]
-		<usetemplate name="okcancelbuttons" notext="辞退" yestext="参加"/>
-	</notification>
-	<notification name="KickUser">
-		どんなメッセージを表示して、このユーザーを追い出しますか?
-		<form name="form">
-			<input name="message">
-				あなたは管理者によりログオフされました。
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="取り消し"/>
-		</form>
-	</notification>
-	<notification name="KickAllUsers">
-		どんなメッセージを表示して、グリッドにいる全員を追い出しますか?
-		<form name="form">
-			<input name="message">
-				あなたは管理者によりログオフされました。
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="取り消し"/>
-		</form>
-	</notification>
-	<notification name="FreezeUser">
-		どんなメッセージを表示して、このユーザーをフリーズしますか?
-		<form name="form">
-			<input name="message">
-				あなたはフリーズされています。 動くこともチャットすることもできません。 管理者がIMを通じてあなたに連絡します。
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="取り消し"/>
-		</form>
-	</notification>
-	<notification name="UnFreezeUser">
-		どんなメッセージを表示して、このユーザーのフリーズを解除しますか?
-		<form name="form">
-			<input name="message">
-				もうフリーズされていません。
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="取り消し"/>
-		</form>
-	</notification>
-	<notification name="OfferTeleport">
-		次のメッセージを添えてあなたが今いる場所へのテレポートを送りますか?
-		<form name="form">
-			<input name="message">
-				[REGION]に来ませんか?
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="取り消し"/>
-		</form>
-	</notification>
-	<notification name="OfferTeleportFromGod">
-		ユーザーをゴッド・コールで呼び寄せますか?
-		<form name="form">
-			<input name="message">
-				[REGION]に来ませんか?
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="取り消し"/>
-		</form>
-	</notification>
-	<notification name="TeleportFromLandmark">
-		本当にテレポートしますか?
-		<usetemplate ignoretext="ランドマークにテレポートしたいか確認する" name="okcancelignore" notext="キャンセル" yestext="テレポート"/>
-	</notification>
-	<notification name="TeleportToPick">
-		[PICK] にテレポートしますか?
-		<usetemplate ignoretext="ピックの場所にテレポートしたいか確認する" name="okcancelignore" notext="キャンセル" yestext="テレポート"/>
-	</notification>
-	<notification label="あなたの不動産内の全員にメッセージを送信" name="MessageEstate">
-		今あなたの不動産にいる人全員に送る
-短いメッセージを入力してください。
-		<form name="form">
-			<input name="message"/>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="取り消し"/>
-		</form>
-	</notification>
-	<notification label="Lindenの不動産を変更" name="ChangeLindenEstate">
-		あなたはLinden所有の不動産(メインランド、ティーングリッド、オリエンテーションなど)を変更しようとしています。
-
-これはユーザーの経験を根本から揺るがしかねない「非常に危険な行為」です。これにより、メインランドで多数の地域が変更され、スペースサーバーに悪影響が生じます。
-
-操作を続行しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification label="Lindenの不動産へのアクセスを変更" name="ChangeLindenAccess">
-		あなたはLinden所有の不動産(メインランド、ティーングリッド、オリエンテーションなど)へのアクセスリストを変更しようとしています。
-
-この行為は「危険」であり、グリッドからオブジェクトやお金の転送をもたらすハッキングを引き起こす可能性があるため、完全にそれを意図した場合のみ行うべきものです。
-これにより多数の地域が変更され、スペースサーバーに悪影響が生じます。
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification label="不動産を選択" name="EstateAllowedAgentAdd">
-		この不動産の許可リストだけに追加しますか? それとも[ALL_ESTATES]のすべての許可リストに追加しますか?
-		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
-	</notification>
-	<notification label="不動産を選択" name="EstateAllowedAgentRemove">
-		許可リストからの削除をこの不動産についてのみ行いますか? それとも、[ALL_ESTATES]について行いますか?
-		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
-	</notification>
-	<notification label="不動産を選択" name="EstateAllowedGroupAdd">
-		この不動産のグループ許可リストだけに追加しますか? それとも[ALL_ESTATES]のグループ許可リストに追加しますか?
-		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
-	</notification>
-	<notification label="不動産を選択" name="EstateAllowedGroupRemove">
-		許可リストからの削除をこの不動産についてのみ行いますか? それとも、[ALL_ESTATES]について行いますか?
-		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
-	</notification>
-	<notification label="不動産を選択" name="EstateBannedAgentAdd">
-		この不動産についてのみアクセスを拒否しますか? それとも[ALL_ESTATE]へのアクセスを拒否しますか?
-		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
-	</notification>
-	<notification label="不動産を選択" name="EstateBannedAgentRemove">
-		この住人を、この不動産のみ、または[ALL_ESTATES]へとアクセスできるように、禁止リストから削除しますか?
-		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
-	</notification>
-	<notification label="不動産を選択" name="EstateManagerAdd">
-		この不動産のみ、または[ALL_ESTATES]に対して、不動産マネージャーを追加しますか?
-		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
-	</notification>
-	<notification label="不動産を選択" name="EstateManagerRemove">
-		不動産マネージャーを、この不動産のみ、または[ALL_ESTATES]から、削除しますか?
-		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
-	</notification>
-	<notification label="キックを確認" name="EstateKickUser">
-		この不動産から[EVIL_USER]を追い出しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="EstateChangeCovenant">
-		不動産約款を変更しようとしています。操作を続行しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="RegionEntryAccessBlocked">
-		あなたのレーティング区分により、その地域(リージョン)へは入ることができません。 年齢を確認する際の情報に不足があったためと考えられます。
-
-最新ビューワがインストールされているかをご確認ください。このレーティング区分でのアクセスに関する詳細はナレッジベースをご覧ください。
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="RegionEntryAccessBlocked_KB">
-		あなたのレーティング区分により、その地域(リージョン)へは入ることができません。
-
-ナレッジベースを開きレーティング区分について学びますか?
-		<url name="url">
-			http://wiki.secondlife.com/wiki/レーティング区分概要_(KB)
-		</url>
-		<usetemplate ignoretext="レーティング区分の制限のため、このリージョンに入ることができません" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
-	</notification>
-	<notification name="RegionEntryAccessBlocked_Notify">
-		あなたのレーティング区分により、その地域(リージョン)へは入ることができません。
-	</notification>
-	<notification name="RegionEntryAccessBlocked_Change">
-		あなたのレーティング区分設定により、その地域(リージョン)へは入ることができません。
-
-「設定を変更」をクリックするとあなたのレーティング区分が上がり、入れるようになります。 あなたは今後 [REGIONMATURITY] コンテンツの検索及びアクセスが可能となります。
-あとで設定を元に戻したい場合は、「編集」>「環境設定」>「一般」をご覧ください。
-		<form name="form">
-			<button name="OK" text="設定の変更"/>
-			<button default="true" name="Cancel" text="閉じる"/>
-			<ignore name="ignore" text="選択したレーティング区分が原因で、リージョンに入ることができません"/>
-		</form>
-	</notification>
-	<notification name="LandClaimAccessBlocked">
-		あなたのレーティング区分により、この土地を取得することはできません。 年齢を確認する際の情報に不足があったためと考えられます。
-
-最新ビューワがインストールされているかをご確認ください。このレーティング区分でのアクセスに関する詳細はナレッジベースをご覧ください。
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="LandClaimAccessBlocked_KB">
-		あなたのレーティング区分により、この土地を取得することはできません。
-
-ナレッジベースを開きレーティング区分について学びますか?
-		<url name="url">
-			http://wiki.secondlife.com/wiki/レーティング区分概要_(KB)
-		</url>
-		<usetemplate ignoretext="レーティング区分の制限のため、この土地を取得できません" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
-	</notification>
-	<notification name="LandClaimAccessBlocked_Notify">
-		あなたのレーティング区分により、この土地を取得することはできません。
-	</notification>
-	<notification name="LandClaimAccessBlocked_Change">
-		あなたのレーティング区分設定により、この土地を取得することはできません。
-
-「設定を変更」をクリックするとあなたのレーティング区分が上がり、入れるようになります。 あなたは今後 [REGIONMATURITY] コンテンツの検索及びアクセスが可能となります。
-あとで設定を元に戻したい場合は、「編集」>「環境設定」>「一般」をご覧ください。
-		<usetemplate ignoretext="選択したレーティング区分が原因で、土地を取得できません" name="okcancelignore" notext="閉じる" yestext="設定の変更"/>
-	</notification>
-	<notification name="LandBuyAccessBlocked">
-		あなたのレーティング区分により、この土地を購入することはできません。 年齢を確認する際の情報に不足があったためと考えられます。
-
-最新ビューワがインストールされているかをご確認ください。このレーティング区分でのアクセスに関する詳細はナレッジベースをご覧ください。
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="LandBuyAccessBlocked_KB">
-		あなたのレーティング区分により、この土地を購入することはできません。
-
-ナレッジベースを開きレーティング区分について学びますか?
-		<url name="url">
-			http://wiki.secondlife.com/wiki/レーティング区分概要_(KB)
-		</url>
-		<usetemplate ignoretext="レーティング区分の制限のため、この土地を購入できません" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
-	</notification>
-	<notification name="LandBuyAccessBlocked_Notify">
-		あなたのレーティング区分により、この土地を購入することはできません。
-	</notification>
-	<notification name="LandBuyAccessBlocked_Change">
-		あなたのレーティング区分設定により、この土地を購入することができません。
-
-「設定を変更」をクリックするとあなたのレーティング区分が上がり、入れるようになります。 あなたは今後 [REGIONMATURITY] コンテンツの検索及びアクセスが可能となります。
-あとで設定を元に戻したい場合は、「編集」>「環境設定」>「一般」をご覧ください。
-		<usetemplate ignoretext="選択したレーティング区分が原因で、土地を購入できません" name="okcancelignore" notext="閉じる" yestext="設定の変更"/>
-	</notification>
-	<notification name="TooManyPrimsSelected">
-		選択したプリムが多すぎます。
-[MAX_PRIM_COUNT] を選択するか、
-プリム数を減らしてもう一度お試しください。
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="ProblemImportingEstateCovenant">
-		不動産約款のインポート時に問題発生。
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="ProblemAddingEstateManager">
-		新しい不動産マネージャーの追加に関する問題:
-1つ以上の不動産で、マネージャーリストが満杯になっています。
-	</notification>
-	<notification name="ProblemAddingEstateGeneric">
-		不動産リストの追加に関する問題:
-1つ以上の不動産で、リストが満杯になっています。
-	</notification>
-	<notification name="UnableToLoadNotecardAsset">
-		現在ノートカードの資産IDを読み込むことができません。
-	</notification>
-	<notification name="NotAllowedToViewNotecard">
-		要求された資産IDに関するノートカードを閲覧するには権限が不十分です。
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="MissingNotecardAssetID">
-		ノートカード用資産IDがデータベースに登録されていません。
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="PublishClassified">
-		注意:クラシファイド広告の料金は払い戻しされません。
-
-L$[AMOUNT]で、このクラシファイド広告を今すぐ公開しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="SetClassifiedMature">
-		この広告にMatureコンテンツは含まれていますか?
-		<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="いいえ" yestext="はい"/>
-	</notification>
-	<notification name="SetGroupMature">
-		この広告にMatureコンテンツは含まれていますか?
-		<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="いいえ" yestext="はい"/>
-	</notification>
-	<notification label="再起動を確認" name="ConfirmRestart">
-		この地域を2分後に再起動しようとしています。
-操作を続行しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification label="この地域内の全員にメッセージを送信" name="MessageRegion">
-		この地域にいる人全員に送る
-短いメッセージを入力してください。
-		<form name="form">
-			<input name="message"/>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="取り消し"/>
-		</form>
-	</notification>
-	<notification label="地域のレーティング区分指定変更済み" name="RegionMaturityChange">
-		この地域のレーティング区分指定がアップデートされました。
-この変更が地図に反映されるまでにはしばらく時間がかかります。
-	</notification>
-	<notification label="ボイスバージョンの不一致" name="VoiceVersionMismatch">
-		このバージョンの [APP_NAME] は、
-この地域のボイスチャット機能に対応していません。
-ボイスチャットを正しく使用するには、
-[APP_NAME] のアップデートが必要です。
-	</notification>
-	<notification label="オブジェクトを購入できません" name="BuyObjectOneOwner">
-		複数のオーナーから同時にオブジェクトを購入することはできません。
-単一のオブジェクトを選択し、もう一度試してください。
-	</notification>
-	<notification label="コンテンツを購入できません" name="BuyContentsOneOnly">
-		一度に複数のオブジェクトのコンテンツは購入できません。
-選択するオブジェクトを1つだけにして、もう一度試してください。
-	</notification>
-	<notification label="コンテンツを購入できません" name="BuyContentsOneOwner">
-		複数のオーナーから同時にオブジェクトを購入することはできません。
-単一のオブジェクトを選択し、もう一度試してください。
-	</notification>
-	<notification name="BuyOriginal">
-		オリジナルのオブジェクトを[OWNER]からL$[PRICE]で購入しますか?
-これにより、あなたがオブジェクトのオーナーになります。
-可能な操作は、
-変更:[MODIFYPERM]、コピー:[COPYPERM]、
-再販/プレゼント[RESELLPERM]です。
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="BuyOriginalNoOwner">
-		L$[PRICE]でオリジナルのオブジェクトを購入しますか?
-これにより、あなたがオブジェクトのオーナーになります。
-可能な操作は、
-変更:[MODIFYPERM]、コピー:[COPYPERM]、
-再販/プレゼント[RESELLPERM]です。
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="BuyCopy">
-		コピーを[OWNER]からL$[PRICE]で購入しますか?
-購入したオブジェクトは、あなたの持ち物にコピーされます。
-可能な操作は、変更:[MODIFYPERM]、コピー:[COPYPERM]、
-再販/プレゼント[RESELLPERM]です。
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="BuyCopyNoOwner">
-		L$[PRICE]でコピーを購入しますか?
-購入したオブジェクトは、あなたの持ち物にコピーされます。
-可能な操作は、変更:[MODIFYPERM]、コピー:[COPYPERM]、
-再販/プレゼント[RESELLPERM]です。
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="BuyContents">
-		コンテンツを[OWNER]からL$[PRICE]で購入しますか?
-購入したコンテンツは、あなたの持ち物にコピーされます。
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="BuyContentsNoOwner">
-		L$[PRICE]でコンテンツを購入しますか?
-購入したコンテンツは、あなたの持ち物にコピーされます。
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmPurchase">
-		この取引は以下のとおり行われます:
-[ACTION]
-
-この購入を続行しますか?
-		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmPurchasePassword">
-		この取引は以下のとおり行われます:
-[ACTION]
-
-この購入を続行しますか?
-パスワードを再入力し、「OK」をクリックしてください。
-		<form name="form">
-			<input name="message"/>
-			<button name="ConfirmPurchase" text="OK"/>
-			<button name="Cancel" text="取り消し"/>
-		</form>
-	</notification>
-	<notification name="SetPickLocation">
-		メモ:
-本ピックのロケーションを更新しましたが、
-他の詳細は元の値のままになります。
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="MoveInventoryFromObject">
-		「コピー禁止」の持ち物アイテムが選択されました。
-これらのアイテムはコピーされないまま、あなたの持ち物に移動されます。
-
-
-アイテムを動かしますか?
-		<usetemplate ignoretext="「コピー不可」のアイテムをオブジェクトから動かす前に警告する" name="okcancelignore" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="MoveInventoryFromScriptedObject">
-		「コピー禁止」の持ち物アイテムが選択されました。
-これらのアイテムはコピーされるのではなく、あなたの持ち物に移動されます。
-このオブジェクトはスクリプト付きなので、持ち物に移動させると
-スクリプトに誤動作が起きる可能性があります。
-
-持ち物アイテムを移動しますか?
-		<usetemplate ignoretext="スクリプト入りのオブジェクトを壊す恐れのある「コピー不可」のアイテムを動かす前に警告する" name="okcancelignore" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="ClickActionNotPayable">
-		警告: クリックで「オブジェクトに支払う」設定をしました。スクリプトに money()イベントが追加されると動作します。
-		<form name="form">
-			<ignore name="ignore" text="money() スクリプトを入れずにオブジェクトを制作中に、「オブジェクトに支払う」アクションを設定"/>
-		</form>
-	</notification>
-	<notification name="OpenObjectCannotCopy">
-		このオブジェクトには、あなたがコピーできるアイテムはありません。
-	</notification>
-	<notification name="WebLaunchAccountHistory">
-		secondlife.com でアカウント履歴を確認しますか?
-		<usetemplate ignoretext="ブラウザを起動してアカウント履歴を見る" name="okcancelignore" notext="取り消し" yestext="ページに移動"/>
-	</notification>
-	<notification name="ConfirmQuit">
-		終了しようとしています。操作を続行しますか?
-		<usetemplate ignoretext="終了時に確認する" name="okcancelignore" notext="終了しない" yestext="終了"/>
-	</notification>
-	<notification name="HelpReportAbuseEmailLL">
-		利用規約違反とコミュニティースタンダード違反の報告にこのツールをご使用ください。 参照:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
-
-利用規約違反とコミュニティースタンダード違反に関する全てのレポートは、調査され、解決されます。
-以下のリンク先の被害報告にてその確認をすることができます。
-
-http://secondlife.com/support/incidentreport.php
-	</notification>
-	<notification name="HelpReportAbuseEmailEO">
-		重要: このレポートはLinden Lab 社ではなく、
-あなたが現在いる地域のオーナーに送られます。
--
-あなたが今いる地域のオーナーは、
-住人と訪問者へのサービスの一環として、この地域からのレポートをすべて受け付け、解決することに同意しています。
-よってLinden Lab 社が、
-あなたがここから提出するレポートを調査することはありません。
-地域のオーナーは、不動産約款で指定している地元の規則を基に、報告された問題を解決します。
-(「世界」のメニューから「土地情報」を選ぶと、約款を閲覧できます)
--
-このレポートに関する解決策は、この地域にだけ当てはまります。
-住人が[SECOND_LIFE] の他の地域へアクセスする際、
-このレポートの結果に影響されることはありません。
-Linden Lab 社だけが[SECOND_LIFE] 全域における
-アクセス制限権を持っています。
-	</notification>
-	<notification name="HelpReportAbuseSelectCategory">
-		嫌がらせ報告のカテゴリを選択してください。
-カテゴリを選択することにより、嫌がらせ報告の処理や保管に大変役立ちます。
-	</notification>
-	<notification name="HelpReportAbuseAbuserNameEmpty">
-		嫌がらせ行為をした人の名前を入力してください。
-正確な情報の入力により、嫌がらせ報告の処理や保管に大変役立ちます。
-	</notification>
-	<notification name="HelpReportAbuseAbuserLocationEmpty">
-		嫌がらせがあった場所を入力してください。
-正確な情報の入力により、嫌がらせ報告の処理や保管に大変役立ちます。
-	</notification>
-	<notification name="HelpReportAbuseSummaryEmpty">
-		嫌がらせの概要を入力してください。
-正確な概要の入力により、
-嫌がらせ報告の処理や保管に大変役立ちます。
-	</notification>
-	<notification name="HelpReportAbuseDetailsEmpty">
-		嫌がらせの詳細な説明を入力してください。
-名前や嫌がらせの詳細を、できるだけ具体的に入力してください。
-
-正確な説明の入力により、
-嫌がらせ報告の処理や保管に大変役立ちます。
-	</notification>
-	<notification name="HelpReportAbuseContainsCopyright">
-		住人の皆様へ、
-
-知的財産の侵害に関する報告を行う際には、以下の点に注意してください。
-
-(1) 嫌がらせの報告のプロセス
-[SECOND_LIFE] の権限システムを悪用している住人を見つけたら、
-嫌がらせの報告を行ってください。
-例えばコピーBotの使用、それに似たツールの使用による知的財産権の侵害があります。
-アビューズチームは調査に基づき、
-[SECOND_LIFE] のコミュニティースタンダードや
-利用規約に違反する行為と判断された場合には適切な処置を行っています。
-ただし、コンテンツを[SECOND_LIFE] から撤去してほしい、
-といった要望にはアビューズチームは応えることができません。
-
-(2) DMCA(デジタルミレニアム著作権法)及びコンテンツ撤去プロセス
-[SECOND_LIFE] からのコンテンツの撤去をリクエストするには、
-著作権侵害通知の提出を行う必要があります。
-参照: http://secondlife.com/corporate/dmca.php
-
-この件に関する嫌がらせの報告を続ける際は、このウィンドウを閉じてください。選択すべきカテゴリは「知的財産の侵害>コピーBot及び権限の悪用」のほうが適しているかもしれませんのでご確認ください。
-
-よろしくお願いします。
-
-Linden Lab
-	</notification>
-	<notification name="FailedRequirementsCheck">
-		以下の必要なコンポーネントが、[FLOATER]から抜け落ちています
-[COMPONENTS]
-	</notification>
-	<notification label="既存の付属品を置換" name="ReplaceAttachment">
-		体のこの部位にはオブジェクトが装着されています。
-選択されたオブジェクトと置き換えますか?
-		<form name="form">
-			<ignore name="ignore" save_option="true" text="装着しているアイテムと選択したアイテムを入れ替える"/>
-			<button ignore="自動的に交換" name="Yes" text="OK"/>
-			<button ignore="交換しない" name="No" text="キャンセル"/>
-		</form>
-	</notification>
-	<notification label="取り込み中の警告" name="BusyModePay">
-		現在、取り込み中のため、この支払いと
-引き換えのアイテムを受け取ることが
-できません。
-
-この取引を完了する前に、取り込み中の設定を解除しますか?
-		<form name="form">
-			<ignore name="ignore" save_option="true" text="取り込み中モードの時に支払をする"/>
-			<button ignore="常に取り込み中の設定" name="Yes" text="OK"/>
-			<button ignore="取り込み中の設定にしない" name="No" text="キャンセル"/>
-		</form>
-	</notification>
-	<notification name="ConfirmEmptyTrash">
-		ゴミ箱の項目をすべて削除しますか?
-		<usetemplate ignoretext="持ち物のゴミ箱フォルダを空にする前に確認する" name="okcancelignore" notext="キャンセル" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmClearBrowserCache">
-		トラベル、Web、検索の履歴をすべて削除しますか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="はい"/>
-	</notification>
-	<notification name="ConfirmClearCookies">
-		本当にクッキーをクリアしますか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="はい"/>
-	</notification>
-	<notification name="ConfirmClearMediaUrlList">
-		保存された URL のリストを消去します。よろしいですか?
-		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="はい"/>
-	</notification>
-	<notification name="ConfirmEmptyLostAndFound">
-		紛失物の項目をすべて削除しますか?
-		<usetemplate ignoretext="紛失物フォルダを空にする前に確認する" name="okcancelignore" notext="いいえ" yestext="はい"/>
-	</notification>
-	<notification name="CopySLURL">
-		次の SLurl がクリップボードにコピーされました:
- [SLURL]
-
-Webページにこれをリンクすると、他人がこの場所に簡単にアクセスできます。Webブラウザのアドレスバーに貼り付けて試してみてください。
-		<form name="form">
-			<ignore name="ignore" text="クリップボードに SLurl がコピーされる"/>
-		</form>
-	</notification>
-	<notification name="WLSavePresetAlert">
-		保存された事前設定を上書きしますか?
-		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
-	</notification>
-	<notification name="WLDeletePresetAlert">
-		[SKY] を削除しますか?
-		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
-	</notification>
-	<notification name="WLNoEditDefault">
-		デフォルトの設定を編集したり削除したりすることはできません。
-	</notification>
-	<notification name="WLMissingSky">
-		このデイ・サイクルのファイルは次の存在しない「空」ファイルを参照しています: [SKY]。
-	</notification>
-	<notification name="PPSaveEffectAlert">
-		ポストプロセス効果が存在します。 上書きしますか?
-		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
-	</notification>
-	<notification name="NewSkyPreset">
-		新しい空の名前を指定してください。
-		<form name="form">
-			<input name="message">
-				新しい事前設定
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="キャンセル"/>
-		</form>
-	</notification>
-	<notification name="ExistsSkyPresetAlert">
-		事前設定がすでに存在します!
-	</notification>
-	<notification name="NewWaterPreset">
-		新しい水の事前設定の名前を指定してください。
-		<form name="form">
-			<input name="message">
-				新しい事前設定
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="キャンセル"/>
-		</form>
-	</notification>
-	<notification name="ExistsWaterPresetAlert">
-		事前設定がすでに存在します!
-	</notification>
-	<notification name="WaterNoEditDefault">
-		デフォルトの設定を編集したり削除したりすることはできません。
-	</notification>
-	<notification name="ChatterBoxSessionStartError">
-		[RECIPIENT]との新しいチャットを開始することができません
-[REASON]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="ChatterBoxSessionEventError">
-		[EVENT]
-[REASON]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="ForceCloseChatterBoxSession">
-		[NAME]とのチャットセッションを閉じます。
-[REASON]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="Cannot_Purchase_an_Attachment">
-		オブジェクトが取り付けられているときは購入することができません。
-	</notification>
-	<notification label="デビット許可のリクエストについて" name="DebitPermissionDetails">
-		この要求を許可すると、スクリプトからあなたのアカウントにリンデンドルを課金できるようになります。
-この許可を取り消すには、オブジェクトのオーナーはオブジェクトを削除するか、オブジェクトのスクリプトをリセットしなければなりません。
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="AutoWearNewClothing">
-		作成しようとしている衣類を自動的に装着しますか?
-		<usetemplate ignoretext="容姿編集画面で作成する衣類を装着する" name="okcancelignore" notext="いいえ" yestext="はい"/>
-	</notification>
-	<notification name="NotAgeVerified">
-		年齢確認を済ませていないとこの区画を訪れることができません。  [SECOND_LIFE] サイトで年齢の確認を行いますか?
-
-[_URL]
-		<url name="url" option="0">
-			https://secondlife.com/account/verification.php?lang=ja
-		</url>
-		<usetemplate ignoretext="年齢の確認を済ませていません" name="okcancelignore" notext="いいえ" yestext="はい"/>
-	</notification>
-	<notification name="Cannot enter parcel: no payment info on file">
-		支払情報が登録されていないとこのエリアを訪れることができません。  [SECOND_LIFE] サイトで登録を行いますか?
-
-[_URL]
-		<url name="url" option="0">
-			https://secondlife.com/account/index.php?lang=ja
-		</url>
-		<usetemplate ignoretext="支払情報が登録されていません" name="okcancelignore" notext="いいえ" yestext="はい"/>
-	</notification>
-	<notification name="MissingString">
-		文字列[STRING_NAME]がstrings.xmlに含まれていません
-	</notification>
-	<notification name="SystemMessageTip">
-		[MESSAGE]
-	</notification>
-	<notification name="Cancelled">
-		取り消されました
-	</notification>
-	<notification name="CancelledSit">
-		座るのを取り消されました
-	</notification>
-	<notification name="CancelledAttach">
-		添付は取り消されました
-	</notification>
-	<notification name="ReplacedMissingWearable">
-		欠落している服/身体部位をデフォルトに置換します。
-	</notification>
-	<notification name="GroupNotice">
-		件名: [SUBJECT], メッセージ: [MESSAGE]
-	</notification>
-	<notification name="FriendOnline">
-		[FIRST] [LAST] はオンラインです。
-	</notification>
-	<notification name="FriendOffline">
-		[FIRST] [LAST] はオフラインです。
-	</notification>
-	<notification name="AddSelfFriend">
-		残念ながら自分自身をフレンドに追加することはできません。
-	</notification>
-	<notification name="UploadingAuctionSnapshot">
-		インワールドとウェブ・サイトのスナップショットをアップロード中です...
-(所要時間:約5分)
-	</notification>
-	<notification name="UploadPayment">
-		アップロードに L$[AMOUNT] 支払いました。
-	</notification>
-	<notification name="UploadWebSnapshotDone">
-		Webサイトのスナップショットがアップロードされました。
-	</notification>
-	<notification name="UploadSnapshotDone">
-		インワールドでのスナップショットのアップロードが完了しました。
-	</notification>
-	<notification name="TerrainDownloaded">
-		raw地形がダウンロードされました
-	</notification>
-	<notification name="GestureMissing">
-		ジェスチャー[NAME] がデータベースにありません。
-	</notification>
-	<notification name="UnableToLoadGesture">
-		ジェスチャー[NAME] を読み込むことができません。
-再度、試みてください。
-	</notification>
-	<notification name="LandmarkMissing">
-		データベースにランドマークがありません。
-	</notification>
-	<notification name="UnableToLoadLandmark">
-		ランドマークをロードできません。  もう一度試してください。
-	</notification>
-	<notification name="CapsKeyOn">
-		CapsLock キーが有効になっています。
-パスワードに影響があるかもしれません。
-	</notification>
-	<notification name="NotecardMissing">
-		ノートカードがデータベースにありません。
-	</notification>
-	<notification name="NotecardNoPermissions">
-		このノートカードを見る権限がありません。
-	</notification>
-	<notification name="RezItemNoPermissions">
-		オブジェクトをrezするにはパーミッション(承認)が不足してます。
-	</notification>
-	<notification name="UnableToLoadNotecard">
-		現在ノートカードの資産をロードできません。
-	</notification>
-	<notification name="ScriptMissing">
-		データベースにスクリプトがありません。
-	</notification>
-	<notification name="ScriptNoPermissions">
-		スクリプトを閲覧するには権限が不十分です。
-	</notification>
-	<notification name="UnableToLoadScript">
-		スクリプトをロードできません。  もう一度試してください。
-	</notification>
-	<notification name="IncompleteInventory">
-		あなたの提供するコンテンツは、この場所ではまだ全部揃いません。
-少ししてからもう一度試してください。
-	</notification>
-	<notification name="CannotModifyProtectedCategories">
-		保護されたカテゴリーは修正できません。
-	</notification>
-	<notification name="CannotRemoveProtectedCategories">
-		保護されたカテゴリーは削除できません。
-	</notification>
-	<notification name="OfferedCard">
-		あなたは[FIRST] [LAST] に
-コーリング・カードを送りました。
-	</notification>
-	<notification name="UnableToBuyWhileDownloading">
-		オブジェクトデータのダウンロード中は購入できません。
-もう一度試してください。
-	</notification>
-	<notification name="UnableToLinkWhileDownloading">
-		オブジェクトデータのウンロード中はリンクできません。
-もう一度試してください。
-	</notification>
-	<notification name="CannotBuyObjectsFromDifferentOwners">
-		オブジェクトは一度につき一人の所有者から購入できます。
-オブジェクトを 1 つだけ選んでください。
-	</notification>
-	<notification name="ObjectNotForSale">
-		このオブジェクトは販売対象ではありません。
-	</notification>
-	<notification name="EnteringGodMode">
-		レベル[LEVEL]のゴッド・モードに入ります
-	</notification>
-	<notification name="LeavingGodMode">
-		レベル [LEVEL] のゴッドモードを解除します
-	</notification>
-	<notification name="CopyFailed">
-		これをコピーする権限がありません。
-	</notification>
-	<notification name="InventoryAccepted">
-		[NAME]は、持ち物の提供を受け入れました。
-	</notification>
-	<notification name="InventoryDeclined">
-		[NAME]は、持ち物の提供を断りました。
-	</notification>
-	<notification name="ObjectMessage">
-		[NAME]: [MESSAGE]
-	</notification>
-	<notification name="CallingCardAccepted">
-		コーリング・カードが受理されました。
-	</notification>
-	<notification name="CallingCardDeclined">
-		コーリング・カードが拒否されました。
-	</notification>
-	<notification name="TeleportToLandmark">
-		本土に到達しました。
-[NAME]などの場所にテレポートするには、画面右下にある「持ち物」ボタンをクリックし、ランドマーク(Landmarks)フォルダを選択してください。
-ランドマークをダブルクリックした後「テレポート」をクリックするとその場所へ移動します。
-	</notification>
-	<notification name="TeleportToPerson">
-		本土に到達しました。
-住人の[NAME]と接触するには、画面右下にある「持ち物」ボタンをクリックし、コーリングカード(Calling Cards)フォルダを選択してください。
-カードをダブルクリックし、「IMを送る」をクリックし、メッセージを送信してください。
-	</notification>
-	<notification name="CantSelectLandFromMultipleRegions">
-		サーバーの境界を越えて土地を選択することできません。
-もっと小さな土地を選択してください。
-	</notification>
-	<notification name="SearchWordBanned">
-		コミュニティスタンダードに明記されているコンテンツ制限により、あなたの検索語の一部が除外されました。
-	</notification>
-	<notification name="NoContentToSearch">
-		少なくともどれか一つコンテンツの種類を選択して検索を行ってください。(PG, Mature, Adult)
-	</notification>
-	<notification name="GroupVote">
-		[NAME] は投票の申請をしています:
-[MESSAGE]
-		<form name="form">
-			<button name="VoteNow" text="今すぐ投票する"/>
-			<button name="Later" text="あとで"/>
-		</form>
-	</notification>
-	<notification name="SystemMessage">
-		[MESSAGE]
-	</notification>
-	<notification name="EventNotification">
-		イベント通知:
-
-[NAME]
-[DATE]
-		<form name="form">
-			<button name="Teleport" text="テレポート"/>
-			<button name="Description" text="説明"/>
-			<button name="Cancel" text="取り消し"/>
-		</form>
-	</notification>
-	<notification name="TransferObjectsHighlighted">
-		この区画上に存在するオブジェクトのうち、この区画の購入者に譲渡されるオブジェクトがすべて強調表示されます。
-
-
-*譲渡される樹木や植物は、強調表示されません。
-		<form name="form">
-			<button name="Done" text="完了"/>
-		</form>
-	</notification>
-	<notification name="DeactivatedGesturesTrigger">
-		同じトリガーでアクティブにしないジェスチャー:
-[NAMES]
-	</notification>
-	<notification name="NoQuickTime">
-		Apple社のQuickTimeがシステムにインストールされていないと思われます。
-ストリーミング・メディアの再生を行いたい場合は、QuickTimeのサイト(http://www.apple.com/quicktime)にアクセスして、QuickTime Player をインストールしてください。
-	</notification>
-	<notification name="NoPlugin">
-		「 [MIME_TYPE] 」の MIME タイプを扱うメディアプラグインが見つかりませんでした。  このタイプのメディアはご利用いただけません。
-	</notification>
-	<notification name="MediaPluginFailed">
-		次のメディアプラグインが実行できませんでした:
-    [PLUGIN]
-
-プラグインをインストールしなおすか、問題が解決しない場合はメーカーにお問い合わせください。
-		<form name="form">
-			<ignore name="ignore" text="メディアプラグインの実行に失敗"/>
-		</form>
-	</notification>
-	<notification name="OwnedObjectsReturned">
-		選択した土地の区画上にあったあなたのオブジェクトは、あなたの持ち物に返却されました。
-	</notification>
-	<notification name="OtherObjectsReturned">
-		選択されている土地の区画上にあった
- [FIRST] [LAST]
- が所有するオブジェクトは、オーナーの持ち物に返却されました。
-	</notification>
-	<notification name="OtherObjectsReturned2">
-		選択された土地の区画上にあり、
-住人の[NAME]の所有だったオブジェクトはオーナーに返却されました。
-	</notification>
-	<notification name="GroupObjectsReturned">
-		選択されている区画上にあり、[GROUPNAME] というグループと共有だったオブジェクトは、オーナーの持ち物に返却されました。
-譲渡されていた譲渡可能なオブジェクトは、前のオーナーに返却されました。
-グループに譲渡されていた譲渡不可能なオブジェクトは、削除されました。
-	</notification>
-	<notification name="UnOwnedObjectsReturned">
-		選択された土地の区画上にあり、あなたの所有で「なかった」オブジェクトは、本来のオーナーに返却されました。
-	</notification>
-	<notification name="NotSafe">
-		この土地ではダメージが有効です。
-ケガをするかもしれません。 死んでしまった場合はホームにテレポートされます。
-	</notification>
-	<notification name="NoFly">
-		このエリアでは飛行が禁止されています。
-ここでは飛べません。
-	</notification>
-	<notification name="PushRestricted">
-		このエリアではプッシュが制限されています。
-土地所有者以外は他人をプッシュすることはできません。
-	</notification>
-	<notification name="NoVoice">
-		このエリアではボイスチャットが無効です。 誰かが話しているのを聞くことはできません。
-	</notification>
-	<notification name="NoBuild">
-		このエリアでは制作が禁止されています。 オブジェクトを制作したり Rez することはできません。
-	</notification>
-	<notification name="ScriptsStopped">
-		管理者がこの地域内のスクリプトを一時停止させました。
-	</notification>
-	<notification name="ScriptsNotRunning">
-		この地域ではスクリプトの使用が禁止されています
-	</notification>
-	<notification name="NoOutsideScripts">
-		この土地では、外部のスクリプトが禁止されています。
-
-土地所有者のもの以外はスクリプトは実行されません。
-	</notification>
-	<notification name="ClaimPublicLand">
-		そのリージョンにいないと公共の土地を取得することはできません。
-	</notification>
-	<notification name="RegionTPAccessBlocked">
-		あなたのレーティング区分によりその地域(リージョン)へは入ることができません。 年齢確認を行うか、最新ビューワをインストールしてください。
-
-現在のレーティング区分でアクセス可能なエリアに関する詳細はナレッジベースを参照してください。
-	</notification>
-	<notification name="URBannedFromRegion">
-		あなたは地域(リージョン)への立入が禁止されています。
-	</notification>
-	<notification name="NoTeenGridAccess">
-		あなたのアカウントではティーングリッドに接続できません。
-	</notification>
-	<notification name="ImproperPaymentStatus">
-		この地域(リージョン)に入るために適した支払いステータスがありません。
-	</notification>
-	<notification name="MustGetAgeParcel">
-		この区画に入るには年齢確認済みである必要があります。
-	</notification>
-	<notification name="NoDestRegion">
-		目的地の地域(リージョン)が見つかりませんでした。
-	</notification>
-	<notification name="NotAllowedInDest">
-		目的地に入る許可がありません。
-	</notification>
-	<notification name="RegionParcelBan">
-		立入禁止された区画を横断することはできません。 別の方法をお試しください。
-	</notification>
-	<notification name="TelehubRedirect">
-		テレハブに転送されました。
-	</notification>
-	<notification name="CouldntTPCloser">
-		これ以上目的地に近い場所にテレポートができませんでした。
-	</notification>
-	<notification name="TPCancelled">
-		テレポートがキャンセルされました。
-	</notification>
-	<notification name="FullRegionTryAgain">
-		入ろうとしている地域(リージョン)は現在満員です。
-しばらくしてから再度お試しください。
-	</notification>
-	<notification name="GeneralFailure">
-		よくある失敗
-	</notification>
-	<notification name="RoutedWrongRegion">
-		異なる地域(リージョン)に迂回されました。 もう一度お試しください。
-	</notification>
-	<notification name="NoValidAgentID">
-		エージェントIDが無効です。
-	</notification>
-	<notification name="NoValidSession">
-		セッションIDが無効です。
-	</notification>
-	<notification name="NoValidCircuit">
-		回路コードが無効です。
-	</notification>
-	<notification name="NoValidTimestamp">
-		タイムスタンプが無効です。
-	</notification>
-	<notification name="NoPendingConnection">
-		接続を生成できません。
-	</notification>
-	<notification name="InternalUsherError">
-		内部エラーが発生しました。
-	</notification>
-	<notification name="NoGoodTPDestination">
-		この地域(リージョン)では適切なテレポート目的地が見つかりませんでした。
-	</notification>
-	<notification name="InternalErrorRegionResolver">
-		内部エラーが発生しました。
-	</notification>
-	<notification name="NoValidLanding">
-		有効な着地点が見つかりませんでした。
-	</notification>
-	<notification name="NoValidParcel">
-		有効な区画が見つかりませんでした。
-	</notification>
-	<notification name="ObjectGiveItem">
-		[FIRST] [LAST]所有の、
-[OBJECTFROMNAME]から、
-[OBJECTNAME]という[OBJECTTYPE]が送られてきました。
-		<form name="form">
-			<button name="Keep" text="受け取る"/>
-			<button name="Discard" text="破棄"/>
-			<button name="Mute" text="無視リストへ"/>
-		</form>
-	</notification>
-	<notification name="ObjectGiveItemUnknownUser">
-		(未知のユーザー) 所有の[OBJECTFROMNAME]から、
-あなたに[OBJECTNAME]という[OBJECTTYPE]が送られてきました。
-		<form name="form">
-			<button name="Keep" text="受け取る"/>
-			<button name="Discard" text="破棄"/>
-			<button name="Mute" text="無視リストへ"/>
-		</form>
-	</notification>
-	<notification name="UserGiveItem">
-		[NAME]は、あなたに[OBJECTNAME]という名前の[OBJECTTYPE]を渡しました。
-		<form name="form">
-			<button name="Keep" text="受け取る"/>
-			<button name="Discard" text="破棄"/>
-		</form>
-	</notification>
-	<notification name="GodMessage">
-		[NAME]
-[MESSAGE]
-	</notification>
-	<notification name="JoinGroup">
-		[MESSAGE]
-		<form name="form">
-			<button name="Join" text="参加"/>
-			<button name="Decline" text="辞退"/>
-			<button name="Info" text="情報"/>
-		</form>
-	</notification>
-	<notification name="TeleportOffered">
-		[NAME]はあなたをテレポートで呼び寄せようとしています:
-
-[MESSAGE]
-		<form name="form">
-			<button name="Teleport" text="テレポート"/>
-			<button name="Cancel" text="取り消し"/>
-		</form>
-	</notification>
-	<notification name="GotoURL">
-		[MESSAGE]
-[URL]
-		<form name="form">
-			<button name="Later" text="あとで"/>
-			<button name="GoNow..." text="今すぐ行く"/>
-		</form>
-	</notification>
-	<notification name="OfferFriendship">
-		[NAME]は、
-フレンド登録を申し込んでいます。
-
-[MESSAGE]
-
-(デフォルトでお互いのオンライン・ステータスを見ることができるようになります。)
-		<form name="form">
-			<button name="Accept" text="受け入れる"/>
-			<button name="Decline" text="辞退"/>
-		</form>
-	</notification>
-	<notification name="OfferFriendshipNoMessage">
-		[NAME]は、
-フレンド登録を申し込んでいます。
-
-(デフォルトでお互いのオンライン・ステータスを見ることができるようになります。)
-		<form name="form">
-			<button name="Accept" text="受け入れる"/>
-			<button name="Decline" text="拒否"/>
-		</form>
-	</notification>
-	<notification name="FriendshipAccepted">
-		[NAME]は、フレンド 登録を受け入れました。
-	</notification>
-	<notification name="FriendshipDeclined">
-		[NAME]は、フレンド 登録を断りました。
-	</notification>
-	<notification name="OfferCallingCard">
-		[FIRST] [LAST]が
-あなたにコーリングカードを送ってきました。
-これにより、あなたの持ち物にブックマークが追加され、この住人にすばやくIMすることができます。
-		<form name="form">
-			<button name="Accept" text="受け入れる"/>
-			<button name="Decline" text="辞退"/>
-		</form>
-	</notification>
-	<notification name="RegionRestartMinutes">
-		この地域は[MINUTES]分後に再起動されます。
-強制ログアウトとなりますので、この地域の外に出てください。
-	</notification>
-	<notification name="RegionRestartSeconds">
-		このリージョンは [SECONDS] 秒後に再起動されます。.
-このままここにいるとログアウトされます。
-	</notification>
-	<notification name="LoadWebPage">
-		ウェブ・ページ[URL]をロードしますか?
-
-[MESSAGE]
-
-ロード元のオブジェクト:[OBJECTNAME]、オーナー:[NAME]?
-		<form name="form">
-			<button name="Gotopage" text="移動"/>
-			<button name="Cancel" text="取り消し"/>
-		</form>
-	</notification>
-	<notification name="FailedToFindWearableUnnamed">
-		データベースに[TYPE]が見つかりませんでした
-	</notification>
-	<notification name="FailedToFindWearable">
-		データベースに[DESC]という名前の[TYPE]が見つかりませんでした。
-	</notification>
-	<notification name="InvalidWearable">
-		着用しようとしているアイテムはあなたのビューワでは読み込むことができません。 [APP_NAME]ビューワを最新のものにアップグレードしてからこのアイテムを着用してください。
-	</notification>
-	<notification name="ScriptQuestion">
-		「[NAME]」が所有するオブジェクト「[OBJECTNAME]」を:
-
-[QUESTIONS]
-よろしいですか?
-		<form name="form">
-			<button name="Yes" text="はい"/>
-			<button name="No" text="いいえ"/>
-			<button name="Mute" text="無視リストに追加"/>
-		</form>
-	</notification>
-	<notification name="ScriptQuestionCaution">
-		[NAME] 所有の「 [OBJECTNAME] 」 というオブジェクトが次のことをしようとしています:
-
-[QUESTIONS]
-このオブジェクトや制作者を信用できない場合は、このリクエストを拒否してください。
-
-リクエストを受けますか?
-		<form name="form">
-			<button name="Grant" text="許可"/>
-			<button name="Deny" text="拒否"/>
-			<button name="Details" text="詳細..."/>
-		</form>
-	</notification>
-	<notification name="ScriptDialog">
-		[FIRST] [LAST]の「[TITLE]」
-[MESSAGE]
-		<form name="form">
-			<button name="Ignore" text="無視する"/>
-		</form>
-	</notification>
-	<notification name="ScriptDialogGroup">
-		[GROUPNAME]の「[TITLE]」
-[MESSAGE]
-		<form name="form">
-			<button name="Ignore" text="無視する"/>
-		</form>
-	</notification>
-	<notification name="FirstBalanceIncrease">
-		L$[AMOUNT] を受け取りました。
-あなたの L$ 残高は画面右上に表示されています。
-	</notification>
-	<notification name="FirstBalanceDecrease">
-		L$[AMOUNT] を支払いました。
-あなたの L$ 残高は画面右上に表示されています。
-	</notification>
-	<notification name="FirstSit">
-		着席中です。
-周囲を見るには矢印キーか AWSD キーを使ってください。
-立つときには「立ち上がる」ボタンをクリックしてください。
-	</notification>
-	<notification name="FirstMap">
-		地図をクリック・ドラッグして周囲を見てください。
-ダブルクリックするとテレポートします。
-右側のコントロールで場所を探したり背景を変更してください。
-	</notification>
-	<notification name="FirstBuild">
-		制作ツールを開きました。 見るものすべてがこのツールで作成されたものです。
-	</notification>
-	<notification name="FirstTeleport">
-		このリージョンでは特定のエリアにのみテレポートできます。 矢印が目的地を指しています。 矢印をクリックすると消えます。
-	</notification>
-	<notification name="FirstOverrideKeys">
-		あなたの移動キーをオブジェクトが操作しています。
-矢印かAWSDのキーで動作を確認してください。
-銃などのオブジェクトだと、一人称視点(マウスルック)に変更する必要があります。
-Mキーを押して変更します。
-	</notification>
-	<notification name="FirstAppearance">
-		容姿を編集中です。
-周囲を見るには矢印キーを使ってください。
-終わったら「すべて保存」を押してください。
-	</notification>
-	<notification name="FirstInventory">
-		これはあなたの持ち物です。所有しているアイテムが入っています。
-
-* アイテムを自分にドラッグして装着してください。
-* アイテムを地面にドラッグして Rez してください。
-* ノートカードをダブルクリックして開いてください。
-	</notification>
-	<notification name="FirstSandbox">
-		ここはサンドボックスエリアです。住人が制作を学ぶことができます。
-
-ここで制作されたものは時間が経つと削除されます。制作したアイテムを右クリックして「取る」を選び、持ち物に入れてお持ち帰りするのをお忘れなく。
-	</notification>
-	<notification name="FirstFlexible">
-		このオブジェクトはフレキシブルです。 フレキシブルオブジェクトは、「物理」ではなく「ファントム」でなければなりません。
-	</notification>
-	<notification name="FirstDebugMenus">
-		アドバンスメニューを開きました。
-
-このメニューの有効・無効設定:
-  Windows: Ctrl+Alt+D
-  Mac: ⌘-Opt+D
-	</notification>
-	<notification name="FirstSculptedPrim">
-		スカルプトプリムを編集中です。 スカルプトプリムには形状の輪郭を指定するための特別なテクスチャが必要です。
-	</notification>
-	<notification name="MaxListSelectMessage">
-		このリストから[MAX_SELECT]個までのアイテムを選択できます。
-	</notification>
-	<notification name="VoiceInviteP2P">
-		[NAME]が、あなたをボイスチャットコールに招待しています。
-コールに参加するには「受け入れる」をクリックし、招待を断るときは「拒否」をクリックしてください。このコールをしている人をミュートにする場合は「ミュート」をクリックしてください。
-		<form name="form">
-			<button name="Accept" text="受け入れる"/>
-			<button name="Decline" text="拒否"/>
-			<button name="Mute" text="ミュート"/>
-		</form>
-	</notification>
-	<notification name="AutoUnmuteByIM">
-		[FIRST] [LAST]に
-インスタント・メッセージが送信され、無視設定は自動的に解除されました。
-	</notification>
-	<notification name="AutoUnmuteByMoney">
-		[FIRST] [LAST]にお金を渡したため、 無視設定が自動的に解除されました。
-	</notification>
-	<notification name="AutoUnmuteByInventory">
-		[FIRST] [LAST]に持ち物を渡したため、 無視設定が自動的に解除されました。
-	</notification>
-	<notification name="VoiceInviteGroup">
-		[NAME]が、 グループ[GROUP]とのボイスチャットコールに参加しました。
-コールに参加するには「受け入れる」をクリックし、招待を断るときは「拒否」をクリックしてください。このコールをしている人をミュートにする場合は「ミュート」をクリックしてください。
-		<form name="form">
-			<button name="Accept" text="受け入れる"/>
-			<button name="Decline" text="拒否"/>
-			<button name="Mute" text="ミュート"/>
-		</form>
-	</notification>
-	<notification name="VoiceInviteAdHoc">
-		[NAME]が、 会議チャットでボイスチャットコールに参加しました。
-コールに参加するには「受け入れる」をクリックし、招待を断るときは「拒否」をクリックしてください。 このユーザーをミュート(消声)する場合は「ミュート」をクリックしてください。
-		<form name="form">
-			<button name="Accept" text="受け入れる"/>
-			<button name="Decline" text="拒否"/>
-			<button name="Mute" text="ミュート"/>
-		</form>
-	</notification>
-	<notification name="InviteAdHoc">
-		[NAME]が、 あなたを会議チャットに招待しています。
-チャットに参加するには「受け入れる」をクリックし、招待を断るときは「拒否」をクリックしてください。このユーザーをミュート(消声)する場合は「ミュート」をクリックしてください。
-		<form name="form">
-			<button name="Accept" text="受け入れる"/>
-			<button name="Decline" text="拒否"/>
-			<button name="Mute" text="ミュート"/>
-		</form>
-	</notification>
-	<notification name="VoiceChannelFull">
-		あなたが参加しようとしているボイスコール[VOICE_CHANNEL_NAME]は、参加者が最大限に達しました。後でもう一度お試しください。
-	</notification>
-	<notification name="ProximalVoiceChannelFull">
-		このエリアのボイスチャットは、混雑のため容量を超えてしまっています。申し訳ありませんが、他のエリアでボイスチャットをお試しください。
-	</notification>
-	<notification name="VoiceChannelDisconnected">
-		[VOICE_CHANNEL_NAME]への接続が切断されました。空間ボイスチャットに再接続されます。
-	</notification>
-	<notification name="VoiceChannelDisconnectedP2P">
-		[VOICE_CHANNEL_NAME]は、コールを終了しました。空間ボイスチャットに再接続されます。
-	</notification>
-	<notification name="P2PCallDeclined">
-		[VOICE_CHANNEL_NAME]は、あなたのコールを拒否しました。空間ボイスチャットに再接続されます。
-	</notification>
-	<notification name="P2PCallNoAnswer">
-		[VOICE_CHANNEL_NAME]は、あなたのコールを受け取れません。空間ボイスチャットに再接続されます。
-	</notification>
-	<notification name="VoiceChannelJoinFailed">
-		[VOICE_CHANNEL_NAME]への接続に失敗しました。時間をおいて、再度、試みてください。空間ボイスチャットに再接続されます。
-	</notification>
-	<notification name="VoiceLoginRetry">
-		あなた用のボイスチャンネルを作成しています。1分ほどかかります。
-	</notification>
-	<notification name="Cannot enter parcel: not a group member">
-		特定のグループメンバーのみこのエリアを訪問することができます。
-	</notification>
-	<notification name="Cannot enter parcel: banned">
-		立入禁止されているため、区画に入ることができません。
-	</notification>
-	<notification name="Cannot enter parcel: not on access list">
-		アクセス・リストに含まれていないため、区画に入ることができません。
-	</notification>
-	<notification name="VoiceNotAllowed">
-		あなたには[VOICE_CHANNEL_NAME]のボイス・チャットに接続する権限がありません。
-	</notification>
-	<notification name="VoiceCallGenericError">
-		[VOICE_CHANNEL_NAME]のボイス・チャットに接続中に、エラーが発生しました。後でもう一度お試しください。
-	</notification>
-	<notification name="ServerVersionChanged">
-		異なるサーバーバージョンのリージョンに来ました。パフォーマンスに影響があるかもしれません。 クリックしてリリースノートを確認してみてください。
-	</notification>
-	<notification name="UnsupportedCommandSLURL">
-		クリックした SLurl はサポートされていません。
-	</notification>
-	<notification name="IMToast">
-		<form name="form">
-			<button name="respondbutton" text="返答"/>
-		</form>
-	</notification>
-	<notification name="AttachmentSaved">
-		付属物(アタッチメント)が保存されました。
-	</notification>
-	<notification name="UnableToFindHelpTopic">
-		ヘルプトピックが見つかりませんでした。
-	</notification>
-	<global name="UnsupportedCPU">
-		- あなたの CPU の速度は必須動作環境の条件を満たしていません。
-	</global>
-	<global name="UnsupportedGLRequirements">
-		[APP_NAME] に必要なハードウェアがないようです。 [APP_NAME] にはマルチテクスチャをサポートする OpenGL グラフィックカードが必要です。 お使いのグラフィックカードの最新ドライバがインストールされているかどうか、オペレーティングシステムのサービスパックとパッチが入っているかをご確認ください。
-
-この問題が何度も起きる場合は、[SUPPORT_SITE] へご連絡ください。
-	</global>
-	<global name="UnsupportedCPUAmount">
-		796
-	</global>
-	<global name="UnsupportedRAMAmount">
-		510
-	</global>
-	<global name="UnsupportedGPU">
-		- あなたのグラフィック・カードは必須動作環境の条件を満たしていません。
-	</global>
-	<global name="UnsupportedRAM">
-		- あなたのシステム・メモリは必須動作環境の条件を満たしていません。
-	</global>
-	<global name="PermYes">
-		はい
-	</global>
-	<global name="PermNo">
-		いいえ
-	</global>
-	<global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
-		自分の土地をお持ちの場合、ホームロケーションに設定できます。 
-お持ちでない場合は、地図で「インフォハブ」を探してください。
-	</global>
-</notifications>
+<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+	<global name="skipnexttime">
+		今後は表示しない
+	</global>
+	<global name="alwayschoose">
+		常にこのオプションを選択
+	</global>
+	<global name="implicitclosebutton">
+		閉じる
+	</global>
+	<template name="okbutton">
+		<form>
+			<button name="OK" text="$yestext"/>
+		</form>
+	</template>
+	<template name="okignore"/>
+	<template name="okcancelbuttons">
+		<form>
+			<button name="Cancel" text="$notext"/>
+		</form>
+	</template>
+	<template name="okcancelignore"/>
+	<template name="okhelpbuttons">
+		<form>
+			<button name="Help" text="$helptext"/>
+		</form>
+	</template>
+	<template name="yesnocancelbuttons">
+		<form>
+			<button name="Yes" text="$yestext"/>
+			<button name="No" text="$notext"/>
+		</form>
+	</template>
+	<notification functor="GenericAcknowledge" label="不明な警告メッセージ" name="MissingAlert">
+		あなたの [APP_NAME] のバージョンでは今受け取った警告メッセージを表示することができません。  最新ビューワがインストールされているかご確認ください。
+
+エラー詳細: 「[_NAME]」という警告は notifications.xml にありませんでした。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="FloaterNotFound">
+		フロータ・エラー:下記のコントロールが見つかりませんでした:
+[CONTROLS]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="TutorialNotFound">
+		現在利用可能なチュートリアルはありません。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="GenericAlert">
+		[MESSAGE]
+	</notification>
+	<notification name="GenericAlertYesCancel">
+		[MESSAGE]
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="はい"/>
+	</notification>
+	<notification name="BadInstallation">
+		[APP_NAME] をアップデート中にエラーが発生しました。  最新バージョンをダウンロードしてください。 http://get.secondlife.com
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="LoginFailedNoNetwork">
+		[SECOND_LIFE_GRID] に接続できませんでした。
+「[DIAGNOSTIC]」
+インターネット接続が正常かご確認ください。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="MessageTemplateNotFound">
+		メッセージテンプレート [PATH] がありませんでした。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="WearableSave">
+		現在の衣服/ボディーパーツの変更を保存しますか?
+		<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="保存しない" yestext="保存"/>
+	</notification>
+	<notification name="CompileQueueSaveText">
+		次の理由で、スクリプト用テキストのアップロード時に問題が起こりました。 [REASON] 後でもう一度試してください。
+	</notification>
+	<notification name="CompileQueueSaveBytecode">
+		次の理由で、コンパイルしたスクリプトのアップロード時に問題が起こりました。 [REASON]後でもう一度試してください。
+	</notification>
+	<notification name="WriteAnimationFail">
+		アニメーションデータの書き込みに問題があります。後でもう一度お試しください。
+	</notification>
+	<notification name="UploadAuctionSnapshotFail">
+		次の理由で、オークションのスナップショットのアップロード時に問題が起こりました。 [REASON]
+	</notification>
+	<notification name="UnableToViewContentsMoreThanOne">
+		一度に複数のアイテムのコンテンツは表示できません。
+選択するアイテムを1つだけにして、もう一度試してください。
+	</notification>
+	<notification name="SaveClothingBodyChanges">
+		衣服/身体部位に対する変更をすべて保存しますか?
+		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="保存しない" yestext="すべて保存"/>
+	</notification>
+	<notification name="GrantModifyRights">
+		他の住人に変更権限を与えると、その人はあなたが所有している
+すべてのオブジェクトを変更、削除、または取得することができるようになります。この許可を与えるときは細心の注意を払ってください。
+[FIRST_NAME] [LAST_NAME]に対して変更権限を与えますか?
+		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+	</notification>
+	<notification name="GrantModifyRightsMultiple">
+		変更権限を与えると、その人はあなたが作成した全てのオブジェクトを変更することができます。
+この許可を与えるときには細心の注意を払ってください。
+選択した住人に変更権限を与えますか?
+		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+	</notification>
+	<notification name="RevokeModifyRights">
+		[FIRST_NAME] [LAST_NAME]に対して変更権限を取り消しますか?
+		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+	</notification>
+	<notification name="RevokeModifyRightsMultiple">
+		選択した住人から変更権限を取り下げますか?
+		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+	</notification>
+	<notification name="UnableToCreateGroup">
+		グループを作成できません。
+[MESSAGE]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="PanelGroupApply">
+		[NEEDS_APPLY_MESSAGE]
+[WANT_APPLY_MESSAGE]
+		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="変更を無視" yestext="変更を適用"/>
+	</notification>
+	<notification name="MustSpecifyGroupNoticeSubject">
+		グループ通知の送信には、件名の記入が必要です。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="AddGroupOwnerWarning">
+		あなたは [ROLE_NAME]の役割にメンバーを与えようとしています。
+任命されたメンバーが自ら退任しない限り、
+彼らを役柄から削除できません。
+操作を続行しますか?
+		<usetemplate ignoretext="グループオーナーを新しく追加する前に確認" name="okcancelignore" notext="いいえ" yestext="はい"/>
+	</notification>
+	<notification name="AssignDangerousActionWarning">
+		あなたは[ROLE_NAME]に [ACTION_NAME]の能力を
+与えようとしています。
+
+ *警告*
+この能力を持つ役割のメンバーは、
+自分と他のメンバーに現在より強力な権限を割り当て、
+自分をオーナーとほぼ同様の立場に
+任命することもできるようになります。 この行為の意味をよく理解してから
+実行してください。
+
+この能力を[ROLE_NAME]に割り当てますか?
+		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+	</notification>
+	<notification name="AssignDangerousAbilityWarning">
+		あなたは[ROLE_NAME]に [ACTION_NAME]の能力を
+与えようとしています。
+
+ *警告*
+この能力をもつ役割のメンバーは、
+自分と他のメンバーにすべての能力を割り当て、
+自分をオーナーとほぼ同様の立場に任命できます。
+
+この能力を[ROLE_NAME]に割り当てますか?
+		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+	</notification>
+	<notification name="JoinGroupCanAfford">
+		このグループに参加するには、L$[COST]かかります。
+続行しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="参加"/>
+	</notification>
+	<notification name="JoinGroupCannotAfford">
+		このグループに加入するには、L$[COST]必要です。
+L$が不足しているのでこのグループに参加することができません。
+	</notification>
+	<notification name="CreateGroupCost">
+		このグループを作るには L$100 かかります。
+一人ではグループにならないので、永久に削除されてしまいます。
+48時間以内にメンバーを勧誘し入会してもらってください。
+		<usetemplate canceltext="キャンセル" name="okcancelbuttons" notext="キャンセル" yestext="L$100 でグループを作成"/>
+	</notification>
+	<notification name="LandBuyPass">
+		L$[COST]で [TIME]時間この土地[PARCEL_NAME]に入ることができます。
+入場許可を購入しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="SalePriceRestriction">
+		不特定の人に売却する場合には、
+売却価格はL$0以上に設定する必要があります。
+売却価格をL$0に設定する場合は、
+売却する個人を選択してください。
+	</notification>
+	<notification name="ConfirmLandSaleChange">
+		選択された[LAND_SIZE]平方メートルの土地は、売り出し中に設定されています。
+売却価格L$[SALE_PRICE]で、[NAME]に売却を認可します。
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmLandSaleToAnyoneChange">
+		注:「誰にでも売却する」をクリックすると、
+あなたの土地は[SECOND_LIFE] のコミュニティのどこからでも
+(この地域にないコミュニティを含む)購入できるようになります。
+
+選択された[LAND_SIZE]平方メートルの土地は、
+売り出し中に設定されています。
+売却価格L$[SALE_PRICE]で、[NAME]に売却を認可します。
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsDeededToGroup">
+		この区画のグループ[NAME]共有のすべてのオブジェクトを、以前のオーナーの持ち物に戻そうとしています。
+操作を続行しますか?
+
+*警告* これにより、
+グループに譲渡された譲渡不可能なオブジェクトは削除されます!
+オブジェクト: [N]
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsOwnedByUser">
+		この区画で、
+住人[NAME]が所有する全てのオブジェクトを
+彼らの持ち物に本当に返却してもよいですか?
+
+オブジェクト: [N]
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsOwnedBySelf">
+		この土地区画内にある、あなたが所有するすべてのオブジェクトを、
+あなたの持ち物に戻そうとしています。操作を続行しますか?
+
+オブジェクト: [N]
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsNotOwnedBySelf">
+		この土地区画内にある、あなた以外が所有するすべてのオブジェクトを、
+それぞれのオーナーの持ち物に戻そうとしています。
+操作を続行しますか?
+グループに譲渡された譲渡可能オブジェクトは、以前のオーナーに返却されます。
+
+*警告* これにより、
+グループに譲渡された譲渡不可能なオブジェクトは削除されます!
+オブジェクト: [N]
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsNotOwnedByUser">
+		この土地区画内にある、
+[NAME]以外による所有のオブジェクトをすべてそれぞれのオーナーの持ち物に返却しようとしています。
+操作を続行しますか?グループに譲渡された譲渡可能オブジェクトは、以前のオーナーに返却されます。
+
+*警告* これにより、
+グループに譲渡された譲渡不可能なオブジェクトは削除されます!
+オブジェクト: [N]
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="ReturnAllTopObjects">
+		全てのリストされたオブジェクトを所有者に本当に返却しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="DisableAllTopObjects">
+		この地域内のすべてのオブジェクトを無効にしようとしています。操作を続行しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsNotOwnedByGroup">
+		この土地の区画上のオブジェクトのうち、グループ[NAME]
+との間で共有していないオブジェクトをオーナーに返却しますか?
+
+オブジェクト: [N]
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="UnableToDisableOutsideScripts">
+		スクリプトを無効にできません。
+この地域全体が「ダメージ有効」に設定されています。
+武器を使用するにはスクリプトの実行を許可する必要があります。
+	</notification>
+	<notification name="MustBeInParcel">
+		着地点を設定するには、この区画の内側に
+立ってください。
+	</notification>
+	<notification name="PromptRecipientEmail">
+		受信者の有効なEメールアドレスを入力してください。
+	</notification>
+	<notification name="PromptSelfEmail">
+		あなたのEメール・アドレスを入力してください。
+	</notification>
+	<notification name="PromptMissingSubjMsg">
+		デフォルトの件名またはメッセージを付けて、スナップショットを送信しますか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="ErrorProcessingSnapshot">
+		スナップショット・データの処理エラー
+	</notification>
+	<notification name="ErrorEncodingSnapshot">
+		スナップショットのエンコード化でエラーが出ました!
+	</notification>
+	<notification name="ErrorUploadingPostcard">
+		次の理由で、スナップショットの送信時に問題が起こりました: [REASON]
+	</notification>
+	<notification name="ErrorUploadingReportScreenshot">
+		次の理由で、レポートのスクリーンショットのアップロード時に問題が起こりました。 [REASON]
+	</notification>
+	<notification name="MustAgreeToLogIn">
+		[SECOND_LIFE] へのログインを続けるには、利用規約に同意してください。
+	</notification>
+	<notification name="CouldNotPutOnOutfit">
+		服装を装着できません。
+服装フォルダに衣服、身体部位、付属品がありません。
+	</notification>
+	<notification name="CannotWearTrash">
+		ゴミ箱にある服やボディーパーツの着用はできません。
+	</notification>
+	<notification name="CannotWearInfoNotComplete">
+		まだ読み込まれていないため、そのアイテムを装着できません。後でやり直してください。
+	</notification>
+	<notification name="MustHaveAccountToLogIn">
+		おっと! 記入漏れがありますよ。
+アバターのファーストネームとラストネームの両方を入力する必要があります。
+
+[SECOND_LIFE]に入るには、アカウントが必要です。 アカウントを作成しますか?
+		<url name="url">
+			https://join.secondlife.com/index.php?lang=ja-JP
+		</url>
+		<usetemplate name="okcancelbuttons" notext="もう一度試す" yestext="新しいアカウントを作成"/>
+	</notification>
+	<notification name="AddClassified">
+		検索ディレクトリの「クラシファイド」セクションに、
+クラシファイド広告が1週間掲載されます。
+広告を記入後、「公開」をクリックし、ディレクトリに
+追加します。
+「公開」をクリックすると、支払金額を尋ねられます。
+多く払うほど、広告がクラシファイド・リストとキーワード検索
+の上位に表示されます。
+		<usetemplate ignoretext="新規クラシファイド広告作成方法" name="okcancelignore" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="DeleteClassified">
+		クラシファイド広告[NAME]の削除をしますか?
+支払い済みの料金は返金されません。
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="ClassifiedSave">
+		クラシファイド広告[NAME]への変更を保存しますか?
+		<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="保存しない" yestext="保存"/>
+	</notification>
+	<notification name="DeleteAvatarPick">
+		ピック[PICK]を削除しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="PromptGoToEventsPage">
+		[SECOND_LIFE]イベント・ウェブ・ページに移動しますか?
+		<url name="url">
+			http://jp.secondlife.com/events/
+		</url>
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="SelectProposalToView">
+		表示する提案を選択してください。
+	</notification>
+	<notification name="SelectHistoryItemToView">
+		表示する履歴アイテムを選択してください。
+	</notification>
+	<notification name="ResetShowNextTimeDialogs">
+		これらのポップアップ全てを再度有効化しますか?(以前「今後は表示しない」と指定しています)
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="SkipShowNextTimeDialogs">
+		スキップ可能なポップアップ全てを無効化しますか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="CacheWillClear">
+		[APP_NAME]の再起動後にキャッシュがクリアされます。
+	</notification>
+	<notification name="CacheWillBeMoved">
+		[APP_NAME]の再起動後にキャッシュが移動されます。
+注意:これによりキャッシュがクリアされます。
+	</notification>
+	<notification name="ChangeConnectionPort">
+		ポートの設定は、[APP_NAME]の再起動後に有効になります。
+	</notification>
+	<notification name="ChangeSkin">
+		新しいスキンは[APP_NAME]を再起動すると現れます
+	</notification>
+	<notification name="GoToAuctionPage">
+		[SECOND_LIFE]ウェブ・ページに移動し、 入札あるいはオークションの詳細を確認しますか?
+		<url name="url">
+			http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
+		</url>
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="SaveChanges">
+		変更を保存しますか?
+		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="保存しない" yestext="保存"/>
+	</notification>
+	<notification name="GestureSaveFailedTooManySteps">
+		ジェスチャーの保存に失敗しました。
+ステップが多すぎます。
+ステップをいくつか削除してから再保存してください
+	</notification>
+	<notification name="GestureSaveFailedTryAgain">
+		ジェスチャーの保存に失敗しました。少し待ってからもう一度試してください。
+	</notification>
+	<notification name="GestureSaveFailedObjectNotFound">
+		ジェスチャーの保存に失敗しました。オブジェクト、または関連するオブジェクト持ち物が見つかりません。
+オブジェクトが範囲内に存在しないか、または削除された可能性があります。
+	</notification>
+	<notification name="GestureSaveFailedReason">
+		次の理由で、ジェスチャーの保存時に問題が起こりました。 [REASON]。  後でもう一度試してください。
+	</notification>
+	<notification name="SaveNotecardFailObjectNotFound">
+		ノートカードの保存に失敗しました。オブジェクト、または関連するオブジェクト持ち物が見つかりません。
+オブジェクトが範囲内に存在しないか、または削除された可能性があります。
+	</notification>
+	<notification name="SaveNotecardFailReason">
+		次の理由で、ノートカードの保存時に問題が起こりました。 [REASON]。  後でもう一度試してください。
+	</notification>
+	<notification name="ScriptCannotUndo">
+		あなたのスクリプトのバージョンでは、変更を元に戻すことはできませんでした。
+サーバーの最新保存バージョンをロードしますか?
+(**警告**:この操作後元に戻すことはできません)
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="SaveScriptFailReason">
+		次の理由で、スクリプトの保存に問題が起こりました。 [REASON]。  後でもう一度試してください。
+	</notification>
+	<notification name="SaveScriptFailObjectNotFound">
+		スクリプトの保存に失敗しました。スクリプトが入ったオブジェクトが見つかりません。
+オブジェクトは範囲外か、または削除されているかもしれません。
+	</notification>
+	<notification name="SaveBytecodeFailReason">
+		次の理由で、コンパイルしたスクリプトの保存時に問題が起こりました。 [REASON]。  後でもう一度試してください。
+	</notification>
+	<notification name="StartRegionEmpty">
+		ログイン位置が不明です。 
+ログイン位置の欄にリージョン名を入力するか、「最後にログアウトした場所」か「自宅(ホーム)」を選択してください。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="CouldNotStartStopScript">
+		スクリプトの起動または停止に失敗しました。スクリプトが格納されているオブジェクトが見つかりません。
+オブジェクトが範囲内に存在しないか、または削除された可能性があります。
+	</notification>
+	<notification name="CannotDownloadFile">
+		ファイルをダウンロードできません。
+	</notification>
+	<notification name="CannotWriteFile">
+		ファイル[[FILE]]を書き込めません。
+	</notification>
+	<notification name="UnsupportedHardware">
+		警告: お使いのシステムは [APP_NAME] の必要最低限の動作環境を満たしていません。 このまま [APP_NAME] を使用すると、パフォーマンスの低下を感じるかもしれません。 恐れ入りますが [SUPPORT_SITE] ではサポート対象外のシステムに関する技術的サポートは行っておりません。
+
+最低動作環境
+[_URL] で詳しい情報を確認しますか?
+		<url name="url" option="0">
+			http://secondlife.com/support/sysreqs.php?lang=ja
+		</url>
+		<usetemplate ignoretext="使用しているコンピューターのハードウェアがサポートされていません" name="okcancelignore" notext="いいえ" yestext="はい"/>
+	</notification>
+	<notification name="UnknownGPU">
+		お使いのシステムには、現在 [APP_NAME] が認識できないグラフィックカードが搭載されています。
+[APP_NAME] でまだテストされていない最新ハードウェアのためだと考えられます。  [APP_NAME] は正常に実行される可能性が高いですが、表示設定を調整する必要があるかもしれません。
+(環境設定 &gt; 表示)
+		<form name="form">
+			<ignore name="ignore" text="使用中のグラフックカードが認識されませんでした"/>
+		</form>
+	</notification>
+	<notification name="DisplaySettingsNoShaders">
+		[APP_NAME] は、
+グラフィック・ドライバの初期化中にクラッシュしました。
+一般的なドライバ・エラーを回避するため、「品質およびパフォーマンス」は「低」に設定されます。
+これにより、いくつかのグラフィックス機能は無効になります。
+グラフィックカード・ドライバのアップデートをお勧めします。
+「グラフィックの品質」は「環境設定」>「表示」から上げることができます。
+	</notification>
+	<notification name="RegionNoTerraforming">
+		この地域[REGION] は、テラフォーミングができません。
+	</notification>
+	<notification name="CannotCopyWarning">
+		あなたはこのアイテムのコピーを
+許されていないので、人にあげると
+持ち物から失われます。 本当に
+これをあげたいですか?
+		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+	</notification>
+	<notification name="CannotGiveItem">
+		持ち物のアイテムを渡せません。
+	</notification>
+	<notification name="TransactionCancelled">
+		取引がキャンセルされました。
+	</notification>
+	<notification name="TooManyItems">
+		一度のインベントリ交換で、42以上のアイテムは送れません。
+	</notification>
+	<notification name="NoItems">
+		選択したアイテムを譲渡できる権限がありません。
+	</notification>
+	<notification name="CannotCopyCountItems">
+		あなたは選択したアイテムの[COUNT]のコピーを
+許されていません。
+これらのアイテムはあなたの持ち物から失われます。
+本当にアイテムをあげたいですか?
+		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+	</notification>
+	<notification name="CannotGiveCategory">
+		選択したフォルダを譲渡できる権限がありません
+	</notification>
+	<notification name="FreezeAvatar">
+		このアバターをフリーズしますか?
+アバターは一時的に動けなくなり、
+チャットなど、この世界に対する関わりを持つことができなくなります。
+		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="解凍" yestext="フリーズ"/>
+	</notification>
+	<notification name="FreezeAvatarFullname">
+		[AVATAR_NAME]をフリーズしますか?
+フリーズされた人は一時的に動けなくなり、チャットなど、この世界に対する関わりを持つことができなくなります。
+		<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="解凍" yestext="フリーズ"/>
+	</notification>
+	<notification name="EjectAvatarFullname">
+		あなたの土地から[AVATAR_NAME]を追放しますか?
+		<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="追放と禁止" yestext="追放"/>
+	</notification>
+	<notification name="EjectAvatarNoBan">
+		このアバターをあなたの土地から追放しますか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="追放"/>
+	</notification>
+	<notification name="EjectAvatarFullnameNoBan">
+		[AVATAR_NAME] をあなたの土地から追放しますか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="追放"/>
+	</notification>
+	<notification name="AcquireErrorTooManyObjects">
+		取得エラー:選択したオブジェクトの数が多すぎます。
+	</notification>
+	<notification name="AcquireErrorObjectSpan">
+		取得エラー:
+オブジェクトが複数の地域にまたがって存在しています。
+取得するオブジェクトは、
+すべて同じ地域内に移動させてください。
+	</notification>
+	<notification name="PromptGoToCurrencyPage">
+		[EXTRA]
+
+[_URL] でリンデンドル購入に関する情報を確認しますか?
+		<url name="url">
+			http://jp.secondlife.com/currency/
+		</url>
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="UnableToLinkObjects">
+		これらの[COUNT]オブジェクトをリンクできません。
+最大[MAX]オブジェクトをリンクすることができます。
+	</notification>
+	<notification name="CannotLinkIncompleteSet">
+		セットとして揃っているオブジェクトのみリンクできます。複数の
+オブジェクトを選択してください。
+	</notification>
+	<notification name="CannotLinkModify">
+		すべてのオブジェクトに対する修正許可があなたにないため、
+リンクできません。
+
+オブジェクトがすべてロックされておらず、あなたのものであることを確認してください。
+	</notification>
+	<notification name="CannotLinkDifferentOwners">
+		所有者が異なるため、すべてのオブジェクトを
+リンクできません。
+
+自分が所有しているオブジェクトだけを選択してください。
+	</notification>
+	<notification name="NoFileExtension">
+		ファイル「[FILE]」の拡張子が無効です。
+
+このファイルの拡張子が正しいかどうかを確認してください。
+	</notification>
+	<notification name="InvalidFileExtension">
+		ファイル拡張子[EXTENSION]は無効です
+正しい拡張子:[VALIDS]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="CannotUploadSoundFile">
+		読み込みのためにアップロードされたサウンドファイルを開けません:
+[FILE]
+	</notification>
+	<notification name="SoundFileNotRIFF">
+		ファイルがRIFF WAVEファイルとして認識されません:
+[FILE]
+	</notification>
+	<notification name="SoundFileNotPCM">
+		ファイルがPCM WAVEオーディオ・ファイルとして認識されません:
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidChannelCount">
+		ファイルのチャンネル数が無効です(モノラルまたはステレオを使用する必要があります):
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidSampleRate">
+		ファイルのサンプル・レートがサポート外です(44.1kを指定する必要があります):
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidWordSize">
+		ファイルのワード・サイズがサポート外です(8または16ビットを指定する必要があります):
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidHeader">
+		WAVヘッダーにデータ・チャンクが見つかりません:
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidTooLong">
+		オーディオ・ファイルが長すぎます。(最大10秒):
+[FILE]
+	</notification>
+	<notification name="ProblemWithFile">
+		ファイル[FILE]にエラーがあります。
+
+[ERROR]
+	</notification>
+	<notification name="CannotOpenTemporarySoundFile">
+		書き込み用の一時圧縮サウンド・ファイルを開くことができません:[FILE]
+	</notification>
+	<notification name="UnknownVorbisEncodeFailure">
+		未知のVorbis 暗号化に失敗: [FILE]
+	</notification>
+	<notification name="CannotEncodeFile">
+		次のファイルのエンコードができません: [FILE]
+	</notification>
+	<notification name="CorruptResourceFile">
+		破損したリソースファイル: [FILE]
+	</notification>
+	<notification name="UnknownResourceFileVersion">
+		未知のlindenリソースファイルのバージョン: [FILE]
+	</notification>
+	<notification name="UnableToCreateOutputFile">
+		服装ファイルを作成できません: [FILE]
+	</notification>
+	<notification name="DoNotSupportBulkAnimationUpload">
+		現在 [APP_NAME] では、アニメーションの一括アップロードはサポートされていません。
+	</notification>
+	<notification name="CannotUploadReason">
+		次の理由で、[FILE] をアップロードできません: [REASON]
+あとでもう一度試してください。
+	</notification>
+	<notification name="LandmarkCreated">
+		「 [LANDMARK_NAME] 」を「 [FOLDER_NAME] 」フォルダに追加しました。
+	</notification>
+	<notification name="CannotCreateLandmarkNotOwner">
+		土地の所有者が許可していないため、
+ランドマークを作成することはできません。
+	</notification>
+	<notification name="CannotRecompileSelectObjectsNoScripts">
+		再編集は不可能です。
+スクリプト化されたオブジェクトを選択してください。
+	</notification>
+	<notification name="CannotRecompileSelectObjectsNoPermission">
+		「再編集」は不可能です。
+
+変更修正権限のある
+スクリプト化されたオブジェクトを選択してください。
+	</notification>
+	<notification name="CannotResetSelectObjectsNoScripts">
+		「再設定」を行うことができません。
+
+スクリプト化されたオブジェクトを選択してください。
+	</notification>
+	<notification name="CannotResetSelectObjectsNoPermission">
+		「再設定」を行うことができません。
+
+変更修正権限のある
+スクリプト化されたオブジェクトを選択してください。
+	</notification>
+	<notification name="CannotSetRunningSelectObjectsNoScripts">
+		スクリプトの「実行」の設定ができません。
+
+スクリプト化されたオブジェクトを選択してください。
+	</notification>
+	<notification name="CannotSetRunningNotSelectObjectsNoScripts">
+		スクリプトを「実行しない」に設定できません。
+
+スクリプト化されたオブジェクトを選択してください。
+	</notification>
+	<notification name="NoFrontmostFloater">
+		保存すべきfrontmostフロータがありません。
+	</notification>
+	<notification name="SeachFilteredOnShortWords">
+		指定した検索クエリは変更され、短すぎる語句は取り除かれています。
+
+検索語句: [FINALQUERY]
+	</notification>
+	<notification name="SeachFilteredOnShortWordsEmpty">
+		指定した検索語句が短すぎたため、検索は行われませんでした。
+	</notification>
+	<notification name="CouldNotTeleportReason">
+		テレポートに失敗しました。
+[REASON]
+	</notification>
+	<notification name="invalid_tport">
+		テレポート処理中に問題が発生しました。 ログインし直す必要があるかもしれません。
+このメッセージが何度も出る場合は、[SUPPORT_SITE] へご連絡ください。
+	</notification>
+	<notification name="invalid_region_handoff">
+		リージョン間の移動中に問題が発生しました。 ログインし直す必要があるかもしれません。
+このメッセージが何度も出る場合は、[SUPPORT_SITE] へご連絡ください。
+	</notification>
+	<notification name="blocked_tport">
+		申し訳ございません。テレポートは現在、ブロックされています。もう少し後でやり直してください。
+やり直してもテレポートできない場合は、いったんログアウトし、再度ログインして問題を解決してください。
+	</notification>
+	<notification name="nolandmark_tport">
+		残念ながら、システムはランドマーク目的地を探せませんでした。
+	</notification>
+	<notification name="timeout_tport">
+		申し訳ございません。システムはテレポート接続を完了できませんでした。
+もう少し後でやり直してください。
+	</notification>
+	<notification name="noaccess_tport">
+		残念ながら、そのテレポート目的地へのアクセスがありません。
+	</notification>
+	<notification name="missing_attach_tport">
+		添付物は、まだ到着していません。あと数秒間お待ちいただくか、いったんログアウトし、再度ログインしてからテレポートをやり直してださい。
+	</notification>
+	<notification name="too_many_uploads_tport">
+		この地域の資産キューが現在込み合っているため、テレポート・リクエストを時間通りに処理することが難しい状況です。
+数分後にやり直すか、または混雑していない他の地域をお試しください。
+	</notification>
+	<notification name="expired_tport">
+		申し訳ございません。システムはテレポート・リクエストを時間どおりに完了できませんでした。数分後にやり直してください。
+	</notification>
+	<notification name="expired_region_handoff">
+		申し訳ございません。システムは地域間の移動を時間どおりに完了できませんでした。
+数分後にやり直してください。
+	</notification>
+	<notification name="no_host">
+		テレポート目的地を見つけられません。目的地が一時的に利用できない状態か、またはすでに消滅している可能性があります。数分後にやり直してください。
+	</notification>
+	<notification name="no_inventory_host">
+		持ち物システムは現在利用できません。
+	</notification>
+	<notification name="CannotSetLandOwnerNothingSelected">
+		土地所有者設定ができません:
+区画が選定されていません。
+	</notification>
+	<notification name="CannotSetLandOwnerMultipleRegions">
+		複数の地域が選択されたため、
+土地の所有権を取得できません。
+選択する面積を小さくして、もう一度試してください。
+	</notification>
+	<notification name="ForceOwnerAuctionWarning">
+		この区画はオークションに出品されています。
+区画の所有権を取得するとオークションが無効になり、
+入札が開始していたら不満に思う住人が出てくるかもしれません。
+所有権を取得しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="CannotContentifyNothingSelected">
+		コンテンツ化は不可能です:
+区画が選定されていません。
+	</notification>
+	<notification name="CannotContentifyNoRegion">
+		コンテンツ化は不可能です:
+土地が選択されていません。
+	</notification>
+	<notification name="CannotReleaseLandNothingSelected">
+		土地を破棄することができません:
+区画が選定されていません。
+	</notification>
+	<notification name="CannotReleaseLandNoRegion">
+		土地を破棄できません:
+地域が見つかりません。
+	</notification>
+	<notification name="CannotBuyLandNothingSelected">
+		土地を購入できません:
+区画が選定されていません。
+	</notification>
+	<notification name="CannotBuyLandNoRegion">
+		土地を購入できません:
+この土地がある地域を見つけることができません
+	</notification>
+	<notification name="CannotCloseFloaterBuyLand">
+		[APP_NAME]による、
+この取引の見積りが完了するまで「土地を購入」ウィンドウを閉じることはできません。
+	</notification>
+	<notification name="CannotDeedLandNothingSelected">
+		土地を譲渡できません:
+区画が選定されていません。
+	</notification>
+	<notification name="CannotDeedLandNoGroup">
+		土地を譲渡できません:
+グループが選択されていません。
+	</notification>
+	<notification name="CannotDeedLandNoRegion">
+		土地を譲渡できません:
+この土地がある地域が見つかりません。
+	</notification>
+	<notification name="CannotDeedLandMultipleSelected">
+		土地を譲渡できません:
+複数の区画が選択されています。
+
+これより1つの区画を選択してください。
+	</notification>
+	<notification name="ParcelCanPlayMedia">
+		ここではストリーミング・メディア再生が可能です。
+メディアのストリーミングには、高速なインターネット接続環境が必要です。
+
+利用可能になったら再生しますか?
+(このオプションは、「環境設定」>「音声とビデオ」で後からでも変更できます)
+		<usetemplate name="okcancelbuttons" notext="無効化" yestext="メディアを再生"/>
+	</notification>
+	<notification name="CannotDeedLandWaitingForServer">
+		土地を譲渡できません:
+サーバーからの所有権情報を待っています。
+
+再度、試みてください。
+	</notification>
+	<notification name="CannotDeedLandNoTransfer">
+		土地を譲渡できません:
+この地域 [REGION] では土地の譲渡が許されていません。
+	</notification>
+	<notification name="CannotReleaseLandWatingForServer">
+		土地を破棄できません:
+サーバーが区画情報を更新するのを待っています。
+
+もう少し後でやり直してください。
+	</notification>
+	<notification name="CannotReleaseLandSelected">
+		土地を破棄できません:
+あなたは、選択したすべての区画を所有していません。
+
+1つの区画を選択してください。
+	</notification>
+	<notification name="CannotReleaseLandDontOwn">
+		土地を破棄できません:
+あなたはこの土地を手放すことを許可されていません。
+あなたの区画は緑色で表示されています。
+	</notification>
+	<notification name="CannotReleaseLandRegionNotFound">
+		土地を破棄できません:
+この土地がある地域が見つかりません。
+	</notification>
+	<notification name="CannotReleaseLandNoTransfer">
+		土地を破棄できません:
+この [REGION] では土地の譲渡が許されていません。
+	</notification>
+	<notification name="CannotReleaseLandPartialSelection">
+		土地を破棄できません:
+区画全体を選択して破棄する必要があります。
+
+区画全体を選択するか、または、まず最初に区画を分割してください。
+	</notification>
+	<notification name="ReleaseLandWarning">
+		あなたは、[AREA]平方メートルの土地を破棄しようとしています。
+この区画を破棄するとあなたの土地ではなくなりますが、
+L$は返金されません。
+
+土地を破棄しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="CannotDivideLandNothingSelected">
+		土地を分割できません:
+
+区画が選定されていません。
+	</notification>
+	<notification name="CannotDivideLandPartialSelection">
+		土地を分割できません:
+
+区画全体が選択されています。
+区画の一部を選択してください。
+	</notification>
+	<notification name="LandDivideWarning">
+		この土地を分割すると、2つの区画に別れます。
+区画ごとの設定が可能になります。 この操作を行うと、一部の設定がデフォルトにリセットされます。
+
+土地の分割操作を続行しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="CannotDivideLandNoRegion">
+		土地を分割できません:
+この土地がある地域が見つかりません。
+	</notification>
+	<notification name="CannotJoinLandNoRegion">
+		土地を統合できません:
+この土地がある地域が見つかりません。
+	</notification>
+	<notification name="CannotJoinLandNothingSelected">
+		土地を統合できませんでした:
+区画が選定されていません。
+	</notification>
+	<notification name="CannotJoinLandEntireParcelSelected">
+		土地を統合できません:
+1つの区画しか選択されていません。
+
+両方の区画をまたいで土地を選択してください。
+	</notification>
+	<notification name="CannotJoinLandSelection">
+		土地を統合できません:
+1つ以上の区画を選択する必要があります。
+
+両方の区画をまたいで土地を選択してください。
+	</notification>
+	<notification name="JoinLandWarning">
+		この土地を統合すると、選択された長方形に交差する
+全ての区画を基にして1つの大きな区画が作成されます。
+新しい区画の名前とオプションを再設定する必要があります。
+
+土地を統合しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmNotecardSave">
+		このアイテムをコピー、表示する前に、ノートカードの保存が必要です。 保存しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmItemCopy">
+		このアイテムをあなたの持ち物にコピーしますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="コピー"/>
+	</notification>
+	<notification name="ResolutionSwitchFail">
+		解像度を [RESX]x[RESY]に切り替えることができませんでした。
+	</notification>
+	<notification name="ErrorUndefinedGrasses">
+		エラー:未定義の植物:[SPECIES]
+	</notification>
+	<notification name="ErrorUndefinedTrees">
+		エラー:未定義の樹木:[SPECIES]
+	</notification>
+	<notification name="CannotSaveWearableOutOfSpace">
+		「[NAME]」を服のファイルに保存できません。  コンピューターの
+ディスクスペースを少し増やしてから、もう一度
+保存してみてください。
+	</notification>
+	<notification name="CannotSaveToAssetStore">
+		[NAME]を中央資産格納庫に保存できません。
+これは一時的な不具合です。
+服飾品などをカスタマイズし、数分後にもう一度保存してください。
+	</notification>
+	<notification name="YouHaveBeenLoggedOut">
+		あなたは[SECOND_LIFE]からログアウトされました。
+            [MESSAGE]
+「IMとチャットを表示」をクリックすると、
+現在あるIMとチャットを確認できます。
+確認しない場合は「終了」をクリックし、
+すぐに[APP_NAME]を終了してください。
+		<usetemplate name="okcancelbuttons" notext="終了" yestext="IMとチャットを表示"/>
+	</notification>
+	<notification name="OnlyOfficerCanBuyLand">
+		グループ用の土地の購入ができません:
+あなたにはアクティブなグループのために土地を購入する権限がありません。
+	</notification>
+	<notification label="フレンドを追加" name="AddFriend">
+		フレンドとして追加すると、お互いの現在地の地図への表示許可、オンラインステータス表示の設定をすることができます。
+
+[NAME] にフレンドシップを送りますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification label="フレンドを追加" name="AddFriendWithMessage">
+		フレンドとして追加すると、お互いの現在地の地図への表示許可、オンラインステータス表示の設定をすることができます。
+
+[NAME] にフレンドシップのオファーをしますか?
+		<form name="form">
+			<input name="message">
+				フレンドとして登録してくれますか?
+			</input>
+			<button name="Offer" text="OK"/>
+			<button name="Cancel" text="キャンセル"/>
+		</form>
+	</notification>
+	<notification name="RemoveFromFriends">
+		[FIRST_NAME] [LAST_NAME]をフレンドリストから削除しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="RemoveMultipleFromFriends">
+		フレンドリストから複数のフレンドを削除しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="GodDeleteAllScriptedPublicObjectsByUser">
+		**[AVATAR_NAME]**
+所有のすべてのスクリプト・オブジェクトをこのシム内の他のすべての土地から削除しようとしています。操作を続行しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="GodDeleteAllScriptedObjectsByUser">
+		**[AVATAR_NAME]**
+所有のすべてのスクリプト・オブジェクトをこのシム内のすべての土地から削除しようとしています。操作を続行しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="GodDeleteAllObjectsByUser">
+		**[AVATAR_NAME]**
+所有のすべてのオブジェクト(スクリプト・オブジェクトと非スクリプト・オブジェクト)を
+このシム内のすべての土地から削除しようとしています。操作を続行しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="BlankClassifiedName">
+		クラシファイドに名前を指定してください。
+	</notification>
+	<notification name="MinClassifiedPrice">
+		広告料の支払い金額は、Lと[MIN_PRICE]が下限です。
+
+金額を増やしてください。
+	</notification>
+	<notification name="ConfirmObjectDeleteLock">
+		選択したアイテムの1つ以上がロックされています。
+
+本当にこれらのアイテムの削除を続けますか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteNoCopy">
+		選択したアイテムの1つ以上がコピーできません。
+
+本当にこれらのアイテムの削除を続けますか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteNoOwn">
+		選択したアイテムの1つ以上を、あなたは所有していません。
+
+本当にこれらのアイテムの削除を続けますか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteLockNoCopy">
+		一つ以上のオブジェクトがロックされています。
+一つ以上のオブジェクトがコピーできません。
+
+本当にこれらのアイテムの削除を続けますか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteLockNoOwn">
+		一つ以上のオブジェクトがロックされています。
+1つ以上のオブジェクトを、あなたは所有していません。
+
+本当にこれらのアイテムの削除を続けますか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteNoCopyNoOwn">
+		一つ以上のオブジェクトがコピーできません。
+1つ以上のオブジェクトを、あなたは所有していません。
+
+本当にこれらのアイテムの削除を続けますか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
+		一つ以上のオブジェクトがロックされています。
+一つ以上のオブジェクトがコピーできません。
+1つ以上のオブジェクトを、あなたは所有していません。
+
+本当にこれらのアイテムの削除を続けますか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectTakeLock">
+		一つ以上のオブジェクトがロックされています。
+
+これらのアイテムの取得を続けますか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectTakeNoOwn">
+		取得しようとしているオブジェクトには、あなたの所有物でないオブジェクトが含まれています。
+あなたの所有物ではないオブジェクトを取得すると、次のオーナーの権限がそのオブジェクトに適用されます。
+そのため、将来、変更やコピーの能力が制限される可能性があります。
+
+これらのアイテムの取得を続けますか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectTakeLockNoOwn">
+		1つ以上のオブジェクトがロックされています。
+取得しようとしているオブジェクトには、あなたの所有物でないオブジェクトが含まれています。
+あなたの所有物ではないオブジェクトを取得すると、次のオーナーの権限がそのオブジェクトに適用されます。
+そのため、将来、変更やコピーの能力が制限される可能性があります。
+この選択内容のままで続行することは可能ですが、
+
+これらのアイテムの取得を続けますか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="CantBuyLandAcrossMultipleRegions">
+		複数の地域が選択されたため、土地を購入できません。
+
+選択する面積を小さくしてもう一度試してください。
+	</notification>
+	<notification name="DeedLandToGroup">
+		この区画の譲渡に際しては、
+このグループが十分な土地クレジットを保有および維持していることが必要です。
+土地の購入価格は、オーナーに返金されません。譲渡された区画が売れると、販売価格はグループ・メンバーに均等に分配されます。
+
+この[AREA]平方メートルの土地を、グループ
+「[GROUP_NAME]」に譲渡しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="DeedLandToGroupWithContribution">
+		この区画の譲渡に際しては、このグループが
+十分な土地クレジットを保有および維持していることが必要です。
+この譲渡により、
+「[FIRST_NAME] [LAST_NAME]」から
+グループに対して土地が同時に提供されます。
+土地の購入価格は、オーナーに返金されません。
+譲渡された区画が売れると、販売料金はグループ・メンバーに均等に分配されます。
+
+この[AREA]平方メートルの土地を、グループ「[GROUP_NAME]」に譲渡しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="DisplaySetToSafe">
+		-safeオプションを指定したので、
+表示設定はセーフ・レベルに設定されています。
+	</notification>
+	<notification name="DisplaySetToRecommended">
+		表示設定は、あなたのシステム構成に
+基づいて推奨されたレベルに設定されています。
+	</notification>
+	<notification name="ErrorMessage">
+		[ERROR_MESSAGE]
+	</notification>
+	<notification name="AvatarMovedDesired">
+		目的地は現在ご利用いただけません。
+近くのリージョンに移動しました。
+	</notification>
+	<notification name="AvatarMovedLast">
+		前回いた場所は現在ご利用いただけません。
+近くのリージョンに移動しました。
+	</notification>
+	<notification name="AvatarMovedHome">
+		ホームロケーションは現在ご利用いただけません。
+近くのリージョンに移動しました。
+新たにホームを設定しなおすといいかもしれません。
+	</notification>
+	<notification name="ClothingLoading">
+		現在衣類をダウンロード中です。
+このまま [SECOND_LIFE] を通常通りご使用いただけます。他人からはあなたは正しく表示されます。
+		<form name="form">
+			<ignore name="ignore" text="衣類がダウンロードされるまで時間がかかっています"/>
+		</form>
+	</notification>
+	<notification name="FirstRun">
+		[APP_NAME]のインストールが完了しました。
+
+[SECOND_LIFE] の使用が初めての方は、
+ログイン前にアカウントの作成が必要です。
+www.secondlife.comに移動し、新規アカウントの作成を行いますか?
+		<usetemplate name="okcancelbuttons" notext="続行" yestext="新規アカウント..."/>
+	</notification>
+	<notification name="LoginPacketNeverReceived">
+		接続がなかなかできません。 お使いのインターネット接続か、[SECOND_LIFE_GRID] の問題と考えられます。
+
+インターネット接続を確認してから数分後に再接続するか、ヘルプをクリックして [SUPPORT_SITE] をご覧になるか、テレポートをクリックしてホームに移動してみてください。
+		<url name="url">
+			http://jp.secondlife.com/support/
+		</url>
+		<form name="form">
+			<button name="OK" text="OK"/>
+			<button name="Help" text="ヘルプ"/>
+			<button name="Teleport" text="テレポート"/>
+		</form>
+	</notification>
+	<notification name="WelcomeChooseSex">
+		まもなくあなたのアバターが表示されます。
+
+矢印キーを使用して歩きます。
+ヘルプが必要なときや[SECOND_LIFE]について知りたいときは、
+F1キーを押してください。
+男性あるいは女性のアバターを選択してください。
+あなたの決定は後で変更できます。
+		<usetemplate name="okcancelbuttons" notext="女性" yestext="男性"/>
+	</notification>
+	<notification name="NotEnoughCurrency">
+		[NAME] L$[PRICE] 残高不足のため実行不可です。
+	</notification>
+	<notification name="GrantedModifyRights">
+		[FIRST_NAME] [LAST_NAME] のオブジェクトの編集権限を得ました。
+	</notification>
+	<notification name="RevokedModifyRights">
+		[FIRST_NAME] [LAST_NAME]
+のオブジェクトを修正する権限が取り消されました。
+	</notification>
+	<notification name="FlushMapVisibilityCaches">
+		この手順は、この地域の地図のキャッシュを消去します。
+これが便利なのはデバッグ時のみです。
+(作成中は5分間経つと、全員の地図が再度ログイン後に
+更新されます)
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="BuyOneObjectOnly">
+		一度に一つ以上のオブジェクトをと買うことはできません。  オブジェクトを一つだけ選んでもう一度お試しください。
+	</notification>
+	<notification name="OnlyCopyContentsOfSingleItem">
+		一度に複数のアイテムのコンテンツはコピーできません。
+選択するオブジェクトを1つだけにして、もう一度試してください。
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="KickUsersFromRegion">
+		この地域の全ての住人をホームにテレポートしますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="EstateObjectReturn">
+		[USER_NAME]が所有しているオブジェクトを返却しますか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="InvalidTerrainBitDepth">
+		地域テクスチャを設定できませんでした:
+地形テクスチャ[TEXTURE_NUM]は、無効のビット深度[TEXTURE_BIT_DEPTH]です。
+
+テクスチャ[TEXTURE_NUM]を24ビット512x512かそれ以下のイメージと交換し、「適用」を再度クリックしてください。
+	</notification>
+	<notification name="InvalidTerrainSize">
+		地域テクスチャを設定できませんでした:
+地形テクスチャ[TEXTURE_NUM]は、[TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]では大きすぎます。
+
+テクスチャ[TEXTURE_NUM]を24ビット512x512かそれ以下のイメージと交換し、「適用」を再度クリックしてください。
+	</notification>
+	<notification name="RawUploadStarted">
+		アップロード開始。 接続速度によっては、
+最大2分間かかります。
+	</notification>
+	<notification name="ConfirmBakeTerrain">
+		現在の地形を構築しようとしています。
+この操作を行うと、現在の地形が上昇/下降の制限範囲の中心になり、「復帰」ツールのデフォルトになります。
+操作を続行しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="MaxAllowedAgentOnRegion">
+		許可住人は [MAX_AGENTS] 人までです。
+	</notification>
+	<notification name="MaxBannedAgentsOnRegion">
+		禁止住人は[MAX_BANNED]人までです。
+	</notification>
+	<notification name="MaxAgentOnRegionBatch">
+		[NUM_ADDED] 個のエージェントを追加しようとして失敗しました: [MAX_AGENTS] [LIST_TYPE] 制限を [NUM_EXCESS] 個超過しています。
+	</notification>
+	<notification name="MaxAllowedGroupsOnRegion">
+		許可グループは[MAX_GROUPS]グループまでです。
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="構築する"/>
+	</notification>
+	<notification name="MaxManagersOnRegion">
+		不動産マネージャーは[MAX_MANAGER]人までです。
+	</notification>
+	<notification name="OwnerCanNotBeDenied">
+		不動産オーナーを不動産「禁止住人」リストに追加できません。
+	</notification>
+	<notification name="CanNotChangeAppearanceUntilLoaded">
+		服および形がロードされるまで、容姿の変更はできません。
+	</notification>
+	<notification name="ClassifiedMustBeAlphanumeric">
+		クラシファイド広告の名前は、アルファベットか
+数字で始めます。  句読点では始められません。
+	</notification>
+	<notification name="CantSetBuyObject">
+		オブジェクトが販売対象ではないため、オブジェクトの購入が設定できません。
+販売対象のオブジェクトを設定し、もう一度試してください。
+	</notification>
+	<notification name="FinishedRawDownload">
+		未加工の地形ファイルを次へとダウンロードしました:
+[DOWNLOAD_PATH]。
+	</notification>
+	<notification name="DownloadWindowsMandatory">
+		[APP_NAME]の新しいバージョンが利用可能です。
+[MESSAGE]
+[APP_NAME]を使用するためには、
+このアップデートをダウンロードする必要があります。
+		<usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンロード"/>
+	</notification>
+	<notification name="DownloadWindows">
+		[APP_NAME]のアップデート・バージョンが利用可能です。
+[MESSAGE]
+このアップデートは必須ではありませんが、パフォーマンスと安定性を向上させるためにインストールすることをお勧めします。
+		<usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
+	</notification>
+	<notification name="DownloadWindowsReleaseForDownload">
+		[APP_NAME]のアップデート・バージョンが利用可能です。
+[MESSAGE]
+このアップデートは必須ではありませんが、パフォーマンスと安定性を向上させるためにインストールすることをお勧めします。
+		<usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
+	</notification>
+	<notification name="DownloadLinuxMandatory">
+		[APP_NAME] の最新バージョンがご利用可能です。
+[MESSAGE]
+[APP_NAME] をご利用になるにはこのアップデートは必須です。
+		<usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンロード"/>
+	</notification>
+	<notification name="DownloadLinux">
+		[APP_NAME] のアップデートバージョンがご利用可能です。
+[MESSAGE]
+このアップデートは必須ではありませんが、パフォーマンス向上のためにインストールをおすすめします。
+		<usetemplate name="okcancelbuttons" notext="続ける" yestext="ダウンロード"/>
+	</notification>
+	<notification name="DownloadLinuxReleaseForDownload">
+		[APP_NAME] のアップデートバージョンがご利用可能です。
+[MESSAGE]
+このアップデートは必須ではありませんが、パフォーマンス向上のためにインストールをおすすめします。
+		<usetemplate name="okcancelbuttons" notext="続ける" yestext="ダウンロード"/>
+	</notification>
+	<notification name="DownloadMacMandatory">
+		[APP_NAME]の新しいバージョンが利用可能です。
+[MESSAGE]
+[APP_NAME]を使用するために、
+このアップデートをダウンロードする必要があります。
+
+アプリケーションがあるフォルダにダウンロードしますか?
+		<usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンロード"/>
+	</notification>
+	<notification name="DownloadMac">
+		[APP_NAME]のアップデート・バージョンが利用可能です。
+[MESSAGE]
+このアップデートは必須ではありませんが、パフォーマンスと安定性を向上させるためにインストールすることをお勧めします。
+
+アプリケーションがあるフォルダにダウンロードしますか?
+		<usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
+	</notification>
+	<notification name="DownloadMacReleaseForDownload">
+		[APP_NAME]のアップデート・バージョンが利用可能です。
+[MESSAGE]
+このアップデートは必須ではありませんが、パフォーマンスと安定性を向上させるためにインストールすることをお勧めします。
+
+アプリケーションがあるフォルダにダウンロードしますか?
+		<usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
+	</notification>
+	<notification name="DeedObjectToGroup">
+		このオブジェクトを譲渡するとグループは以下のことが可能です:
+* オブジェクトに支払われたL$を受領します。
+		<usetemplate ignoretext="オブジェクトをグループに譲渡する前に確認する" name="okcancelignore" notext="取り消し" yestext="譲渡"/>
+	</notification>
+	<notification name="WebLaunchExternalTarget">
+		Web ブラウザを開いてこのコンテンツを表示しますか?
+		<usetemplate ignoretext="ブラウザを起動して Web ページを見る" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchJoinNow">
+		secondlife.com でアカウントの管理をしますか?
+		<usetemplate ignoretext="ブラウザを起動してアカウントを管理する" name="okcancelignore" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchSecurityIssues">
+		[SECOND_LIFE] Wikiで、
+セキュリティ問題を報告する方法をご覧ください。
+		<usetemplate ignoretext="ブラウザを起動してセキュリティ問題の報告の仕方を確認する" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchQAWiki">
+		[SECOND_LIFE] 品質保証関連Wikiをご覧ください。
+		<usetemplate ignoretext="ブラウザを起動して QA Wiki を見る" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchPublicIssue">
+		[SECOND_LIFE]のパブリック問題トラッカーで、
+バグやその他の問題を報告できます。
+		<usetemplate ignoretext="ブラウザを確認してパブリック問題トラッカーを使用する" name="okcancelignore" notext="キャンセル" yestext="ページへ行く"/>
+	</notification>
+	<notification name="WebLaunchSupportWiki">
+		Linden公式ブログで、最新のニュースや情報を入手してください。
+		<usetemplate ignoretext="ブラウザを起動して公式ブログを見る" name="okcancelignore" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchLSLGuide">
+		スクリプトガイドを開きますか?
+		<usetemplate ignoretext="ブラウザを起動してスクリプトガイドを見る" name="okcancelignore" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchLSLWiki">
+		LSL ポータルでスクリプトに関する情報を確認しますか?
+		<usetemplate ignoretext="ブラウザを起動して LSL ポータルを見る" name="okcancelignore" notext="取り消し" yestext="ページに移動"/>
+	</notification>
+	<notification name="ReturnToOwner">
+		選択したオブジェクトを、所有者に返却しますか?
+譲渡可能なオブジェクトは
+以前の所有者に返却されます。
+
+*警告* 移転が不可能の譲渡されたオブジェクトは削除されます!
+		<usetemplate ignoretext="オブジェクトを所有者に返却する前に確認する" name="okcancelignore" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="GroupLeaveConfirmMember">
+		現在あなたは [GROUP]のメンバーです。
+ここから抜けますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmKick">
+		すべてのユーザーをグリッド外にキックしようとしています。操作を続行しますか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="全てのユーザを追い出す"/>
+	</notification>
+	<notification name="MuteLinden">
+		残念ながらLindenを無視設定に入れることはできません。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="CannotStartAuctionAlreadyForSale">
+		既に売り出し中の区画なのでオークションにかけることはできません。  オークションにかけたい場合は売り出し設定を解除してから行ってください。
+	</notification>
+	<notification label="オブジェクトを名前でミュートできませんでした" name="MuteByNameFailed">
+		あなたはすでにこの名前をミュートしています。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="RemoveItemWarn">
+		コンテンツを削除すると、許可があっても、オブジェクトにダメージを与えることがあります。
+そのアイテムの削除を続けますか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="CantOfferCallingCard">
+		現在コーリングカードを送れません。数分後にもう一度試してください。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="CantOfferFriendship">
+		現在フレンドシップを送れません。数分後に試してください。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="BusyModeSet">
+		取り込み中モードになりました。
+チャットとインスタントメッセージは表示されません。 受信するインスタントメッセージには取り込み中返答メッセージが表示されます。 テレポートのオファーは受け取り拒否となります。 アイテムのオファーはすべてゴミ箱に入ります。
+		<usetemplate ignoretext="ログイン状態を取り込み中モードに変更する" name="okignore" yestext="OK"/>
+	</notification>
+	<notification name="JoinedTooManyGroupsMember">
+		加入できるグループの最大限に達しました。 このグループに加入するために他のグループを脱退するか、この申し入れを断ってください。
+[NAME] があなたをグループのメンバーとして勧誘しています。
+[INVITE]
+		<usetemplate name="okcancelbuttons" notext="辞退" yestext="参加"/>
+	</notification>
+	<notification name="KickUser">
+		どんなメッセージを表示して、このユーザーを追い出しますか?
+		<form name="form">
+			<input name="message">
+				あなたは管理者によりログオフされました。
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="取り消し"/>
+		</form>
+	</notification>
+	<notification name="KickAllUsers">
+		どんなメッセージを表示して、グリッドにいる全員を追い出しますか?
+		<form name="form">
+			<input name="message">
+				あなたは管理者によりログオフされました。
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="取り消し"/>
+		</form>
+	</notification>
+	<notification name="FreezeUser">
+		どんなメッセージを表示して、このユーザーをフリーズしますか?
+		<form name="form">
+			<input name="message">
+				あなたはフリーズされています。 動くこともチャットすることもできません。 管理者がIMを通じてあなたに連絡します。
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="取り消し"/>
+		</form>
+	</notification>
+	<notification name="UnFreezeUser">
+		どんなメッセージを表示して、このユーザーのフリーズを解除しますか?
+		<form name="form">
+			<input name="message">
+				もうフリーズされていません。
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="取り消し"/>
+		</form>
+	</notification>
+	<notification name="OfferTeleport">
+		次のメッセージを添えてあなたが今いる場所へのテレポートを送りますか?
+		<form name="form">
+			<input name="message">
+				[REGION]に来ませんか?
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="取り消し"/>
+		</form>
+	</notification>
+	<notification name="OfferTeleportFromGod">
+		ユーザーをゴッド・コールで呼び寄せますか?
+		<form name="form">
+			<input name="message">
+				[REGION]に来ませんか?
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="取り消し"/>
+		</form>
+	</notification>
+	<notification name="TeleportFromLandmark">
+		本当にテレポートしますか?
+		<usetemplate ignoretext="ランドマークにテレポートしたいか確認する" name="okcancelignore" notext="キャンセル" yestext="テレポート"/>
+	</notification>
+	<notification name="TeleportToPick">
+		[PICK] にテレポートしますか?
+		<usetemplate ignoretext="ピックの場所にテレポートしたいか確認する" name="okcancelignore" notext="キャンセル" yestext="テレポート"/>
+	</notification>
+	<notification label="あなたの不動産内の全員にメッセージを送信" name="MessageEstate">
+		今あなたの不動産にいる人全員に送る
+短いメッセージを入力してください。
+		<form name="form">
+			<input name="message"/>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="取り消し"/>
+		</form>
+	</notification>
+	<notification label="Lindenの不動産を変更" name="ChangeLindenEstate">
+		あなたはLinden所有の不動産(メインランド、ティーングリッド、オリエンテーションなど)を変更しようとしています。
+
+これはユーザーの経験を根本から揺るがしかねない「非常に危険な行為」です。これにより、メインランドで多数の地域が変更され、スペースサーバーに悪影響が生じます。
+
+操作を続行しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification label="Lindenの不動産へのアクセスを変更" name="ChangeLindenAccess">
+		あなたはLinden所有の不動産(メインランド、ティーングリッド、オリエンテーションなど)へのアクセスリストを変更しようとしています。
+
+この行為は「危険」であり、グリッドからオブジェクトやお金の転送をもたらすハッキングを引き起こす可能性があるため、完全にそれを意図した場合のみ行うべきものです。
+これにより多数の地域が変更され、スペースサーバーに悪影響が生じます。
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification label="不動産を選択" name="EstateAllowedAgentAdd">
+		この不動産の許可リストだけに追加しますか? それとも[ALL_ESTATES]のすべての許可リストに追加しますか?
+		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+	</notification>
+	<notification label="不動産を選択" name="EstateAllowedAgentRemove">
+		許可リストからの削除をこの不動産についてのみ行いますか? それとも、[ALL_ESTATES]について行いますか?
+		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+	</notification>
+	<notification label="不動産を選択" name="EstateAllowedGroupAdd">
+		この不動産のグループ許可リストだけに追加しますか? それとも[ALL_ESTATES]のグループ許可リストに追加しますか?
+		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+	</notification>
+	<notification label="不動産を選択" name="EstateAllowedGroupRemove">
+		許可リストからの削除をこの不動産についてのみ行いますか? それとも、[ALL_ESTATES]について行いますか?
+		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+	</notification>
+	<notification label="不動産を選択" name="EstateBannedAgentAdd">
+		この不動産についてのみアクセスを拒否しますか? それとも[ALL_ESTATE]へのアクセスを拒否しますか?
+		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+	</notification>
+	<notification label="不動産を選択" name="EstateBannedAgentRemove">
+		この住人を、この不動産のみ、または[ALL_ESTATES]へとアクセスできるように、禁止リストから削除しますか?
+		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+	</notification>
+	<notification label="不動産を選択" name="EstateManagerAdd">
+		この不動産のみ、または[ALL_ESTATES]に対して、不動産マネージャーを追加しますか?
+		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+	</notification>
+	<notification label="不動産を選択" name="EstateManagerRemove">
+		不動産マネージャーを、この不動産のみ、または[ALL_ESTATES]から、削除しますか?
+		<usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+	</notification>
+	<notification label="キックを確認" name="EstateKickUser">
+		この不動産から[EVIL_USER]を追い出しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="EstateChangeCovenant">
+		不動産約款を変更しようとしています。操作を続行しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="RegionEntryAccessBlocked">
+		あなたのレーティング区分により、その地域(リージョン)へは入ることができません。 年齢を確認する際の情報に不足があったためと考えられます。
+
+最新ビューワがインストールされているかをご確認ください。このレーティング区分でのアクセスに関する詳細はナレッジベースをご覧ください。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="RegionEntryAccessBlocked_KB">
+		あなたのレーティング区分により、その地域(リージョン)へは入ることができません。
+
+ナレッジベースを開きレーティング区分について学びますか?
+		<url name="url">
+			http://wiki.secondlife.com/wiki/レーティング区分概要_(KB)
+		</url>
+		<usetemplate ignoretext="レーティング区分の制限のため、このリージョンに入ることができません" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
+	</notification>
+	<notification name="RegionEntryAccessBlocked_Notify">
+		あなたのレーティング区分により、その地域(リージョン)へは入ることができません。
+	</notification>
+	<notification name="RegionEntryAccessBlocked_Change">
+		あなたのレーティング区分設定により、その地域(リージョン)へは入ることができません。
+
+「設定を変更」をクリックするとあなたのレーティング区分が上がり、入れるようになります。 あなたは今後 [REGIONMATURITY] コンテンツの検索及びアクセスが可能となります。
+あとで設定を元に戻したい場合は、「編集」>「環境設定」>「一般」をご覧ください。
+		<form name="form">
+			<button name="OK" text="設定の変更"/>
+			<button default="true" name="Cancel" text="閉じる"/>
+			<ignore name="ignore" text="選択したレーティング区分が原因で、リージョンに入ることができません"/>
+		</form>
+	</notification>
+	<notification name="LandClaimAccessBlocked">
+		あなたのレーティング区分により、この土地を取得することはできません。 年齢を確認する際の情報に不足があったためと考えられます。
+
+最新ビューワがインストールされているかをご確認ください。このレーティング区分でのアクセスに関する詳細はナレッジベースをご覧ください。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="LandClaimAccessBlocked_KB">
+		あなたのレーティング区分により、この土地を取得することはできません。
+
+ナレッジベースを開きレーティング区分について学びますか?
+		<url name="url">
+			http://wiki.secondlife.com/wiki/レーティング区分概要_(KB)
+		</url>
+		<usetemplate ignoretext="レーティング区分の制限のため、この土地を取得できません" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
+	</notification>
+	<notification name="LandClaimAccessBlocked_Notify">
+		あなたのレーティング区分により、この土地を取得することはできません。
+	</notification>
+	<notification name="LandClaimAccessBlocked_Change">
+		あなたのレーティング区分設定により、この土地を取得することはできません。
+
+「設定を変更」をクリックするとあなたのレーティング区分が上がり、入れるようになります。 あなたは今後 [REGIONMATURITY] コンテンツの検索及びアクセスが可能となります。
+あとで設定を元に戻したい場合は、「編集」>「環境設定」>「一般」をご覧ください。
+		<usetemplate ignoretext="選択したレーティング区分が原因で、土地を取得できません" name="okcancelignore" notext="閉じる" yestext="設定の変更"/>
+	</notification>
+	<notification name="LandBuyAccessBlocked">
+		あなたのレーティング区分により、この土地を購入することはできません。 年齢を確認する際の情報に不足があったためと考えられます。
+
+最新ビューワがインストールされているかをご確認ください。このレーティング区分でのアクセスに関する詳細はナレッジベースをご覧ください。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="LandBuyAccessBlocked_KB">
+		あなたのレーティング区分により、この土地を購入することはできません。
+
+ナレッジベースを開きレーティング区分について学びますか?
+		<url name="url">
+			http://wiki.secondlife.com/wiki/レーティング区分概要_(KB)
+		</url>
+		<usetemplate ignoretext="レーティング区分の制限のため、この土地を購入できません" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
+	</notification>
+	<notification name="LandBuyAccessBlocked_Notify">
+		あなたのレーティング区分により、この土地を購入することはできません。
+	</notification>
+	<notification name="LandBuyAccessBlocked_Change">
+		あなたのレーティング区分設定により、この土地を購入することができません。
+
+「設定を変更」をクリックするとあなたのレーティング区分が上がり、入れるようになります。 あなたは今後 [REGIONMATURITY] コンテンツの検索及びアクセスが可能となります。
+あとで設定を元に戻したい場合は、「編集」>「環境設定」>「一般」をご覧ください。
+		<usetemplate ignoretext="選択したレーティング区分が原因で、土地を購入できません" name="okcancelignore" notext="閉じる" yestext="設定の変更"/>
+	</notification>
+	<notification name="TooManyPrimsSelected">
+		選択したプリムが多すぎます。
+[MAX_PRIM_COUNT] を選択するか、
+プリム数を減らしてもう一度お試しください。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="ProblemImportingEstateCovenant">
+		不動産約款のインポート時に問題発生。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="ProblemAddingEstateManager">
+		新しい不動産マネージャーの追加に関する問題:
+1つ以上の不動産で、マネージャーリストが満杯になっています。
+	</notification>
+	<notification name="ProblemAddingEstateGeneric">
+		不動産リストの追加に関する問題:
+1つ以上の不動産で、リストが満杯になっています。
+	</notification>
+	<notification name="UnableToLoadNotecardAsset">
+		現在ノートカードの資産IDを読み込むことができません。
+	</notification>
+	<notification name="NotAllowedToViewNotecard">
+		要求された資産IDに関するノートカードを閲覧するには権限が不十分です。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="MissingNotecardAssetID">
+		ノートカード用資産IDがデータベースに登録されていません。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="PublishClassified">
+		注意:クラシファイド広告の料金は払い戻しされません。
+
+L$[AMOUNT]で、このクラシファイド広告を今すぐ公開しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="SetClassifiedMature">
+		この広告にMatureコンテンツは含まれていますか?
+		<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="いいえ" yestext="はい"/>
+	</notification>
+	<notification name="SetGroupMature">
+		この広告にMatureコンテンツは含まれていますか?
+		<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="いいえ" yestext="はい"/>
+	</notification>
+	<notification label="再起動を確認" name="ConfirmRestart">
+		この地域を2分後に再起動しようとしています。
+操作を続行しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification label="この地域内の全員にメッセージを送信" name="MessageRegion">
+		この地域にいる人全員に送る
+短いメッセージを入力してください。
+		<form name="form">
+			<input name="message"/>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="取り消し"/>
+		</form>
+	</notification>
+	<notification label="地域のレーティング区分指定変更済み" name="RegionMaturityChange">
+		この地域のレーティング区分指定がアップデートされました。
+この変更が地図に反映されるまでにはしばらく時間がかかります。
+	</notification>
+	<notification label="ボイスバージョンの不一致" name="VoiceVersionMismatch">
+		このバージョンの [APP_NAME] は、
+この地域のボイスチャット機能に対応していません。
+ボイスチャットを正しく使用するには、
+[APP_NAME] のアップデートが必要です。
+	</notification>
+	<notification label="オブジェクトを購入できません" name="BuyObjectOneOwner">
+		複数のオーナーから同時にオブジェクトを購入することはできません。
+単一のオブジェクトを選択し、もう一度試してください。
+	</notification>
+	<notification label="コンテンツを購入できません" name="BuyContentsOneOnly">
+		一度に複数のオブジェクトのコンテンツは購入できません。
+選択するオブジェクトを1つだけにして、もう一度試してください。
+	</notification>
+	<notification label="コンテンツを購入できません" name="BuyContentsOneOwner">
+		複数のオーナーから同時にオブジェクトを購入することはできません。
+単一のオブジェクトを選択し、もう一度試してください。
+	</notification>
+	<notification name="BuyOriginal">
+		オリジナルのオブジェクトを[OWNER]からL$[PRICE]で購入しますか?
+これにより、あなたがオブジェクトのオーナーになります。
+可能な操作は、
+変更:[MODIFYPERM]、コピー:[COPYPERM]、
+再販/プレゼント[RESELLPERM]です。
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="BuyOriginalNoOwner">
+		L$[PRICE]でオリジナルのオブジェクトを購入しますか?
+これにより、あなたがオブジェクトのオーナーになります。
+可能な操作は、
+変更:[MODIFYPERM]、コピー:[COPYPERM]、
+再販/プレゼント[RESELLPERM]です。
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="BuyCopy">
+		コピーを[OWNER]からL$[PRICE]で購入しますか?
+購入したオブジェクトは、あなたの持ち物にコピーされます。
+可能な操作は、変更:[MODIFYPERM]、コピー:[COPYPERM]、
+再販/プレゼント[RESELLPERM]です。
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="BuyCopyNoOwner">
+		L$[PRICE]でコピーを購入しますか?
+購入したオブジェクトは、あなたの持ち物にコピーされます。
+可能な操作は、変更:[MODIFYPERM]、コピー:[COPYPERM]、
+再販/プレゼント[RESELLPERM]です。
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="BuyContents">
+		コンテンツを[OWNER]からL$[PRICE]で購入しますか?
+購入したコンテンツは、あなたの持ち物にコピーされます。
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="BuyContentsNoOwner">
+		L$[PRICE]でコンテンツを購入しますか?
+購入したコンテンツは、あなたの持ち物にコピーされます。
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmPurchase">
+		この取引は以下のとおり行われます:
+[ACTION]
+
+この購入を続行しますか?
+		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmPurchasePassword">
+		この取引は以下のとおり行われます:
+[ACTION]
+
+この購入を続行しますか?
+パスワードを再入力し、「OK」をクリックしてください。
+		<form name="form">
+			<input name="message"/>
+			<button name="ConfirmPurchase" text="OK"/>
+			<button name="Cancel" text="取り消し"/>
+		</form>
+	</notification>
+	<notification name="SetPickLocation">
+		メモ:
+本ピックのロケーションを更新しましたが、
+他の詳細は元の値のままになります。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="MoveInventoryFromObject">
+		「コピー禁止」の持ち物アイテムが選択されました。
+これらのアイテムはコピーされないまま、あなたの持ち物に移動されます。
+
+
+アイテムを動かしますか?
+		<usetemplate ignoretext="「コピー不可」のアイテムをオブジェクトから動かす前に警告する" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="MoveInventoryFromScriptedObject">
+		「コピー禁止」の持ち物アイテムが選択されました。
+これらのアイテムはコピーされるのではなく、あなたの持ち物に移動されます。
+このオブジェクトはスクリプト付きなので、持ち物に移動させると
+スクリプトに誤動作が起きる可能性があります。
+
+持ち物アイテムを移動しますか?
+		<usetemplate ignoretext="スクリプト入りのオブジェクトを壊す恐れのある「コピー不可」のアイテムを動かす前に警告する" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="ClickActionNotPayable">
+		警告: クリックで「オブジェクトに支払う」設定をしました。スクリプトに money()イベントが追加されると動作します。
+		<form name="form">
+			<ignore name="ignore" text="money() スクリプトを入れずにオブジェクトを制作中に、「オブジェクトに支払う」アクションを設定"/>
+		</form>
+	</notification>
+	<notification name="OpenObjectCannotCopy">
+		このオブジェクトには、あなたがコピーできるアイテムはありません。
+	</notification>
+	<notification name="WebLaunchAccountHistory">
+		secondlife.com でアカウント履歴を確認しますか?
+		<usetemplate ignoretext="ブラウザを起動してアカウント履歴を見る" name="okcancelignore" notext="取り消し" yestext="ページに移動"/>
+	</notification>
+	<notification name="ConfirmQuit">
+		終了しようとしています。操作を続行しますか?
+		<usetemplate ignoretext="終了時に確認する" name="okcancelignore" notext="終了しない" yestext="終了"/>
+	</notification>
+	<notification name="HelpReportAbuseEmailLL">
+		利用規約違反とコミュニティースタンダード違反の報告にこのツールをご使用ください。 参照:
+
+http://secondlife.com/corporate/tos.php
+http://secondlife.com/corporate/cs.php
+
+利用規約違反とコミュニティースタンダード違反に関する全てのレポートは、調査され、解決されます。
+以下のリンク先の被害報告にてその確認をすることができます。
+
+http://secondlife.com/support/incidentreport.php
+	</notification>
+	<notification name="HelpReportAbuseEmailEO">
+		重要: このレポートはLinden Lab 社ではなく、
+あなたが現在いる地域のオーナーに送られます。
+-
+あなたが今いる地域のオーナーは、
+住人と訪問者へのサービスの一環として、この地域からのレポートをすべて受け付け、解決することに同意しています。
+よってLinden Lab 社が、
+あなたがここから提出するレポートを調査することはありません。
+地域のオーナーは、不動産約款で指定している地元の規則を基に、報告された問題を解決します。
+(「世界」のメニューから「土地情報」を選ぶと、約款を閲覧できます)
+-
+このレポートに関する解決策は、この地域にだけ当てはまります。
+住人が[SECOND_LIFE] の他の地域へアクセスする際、
+このレポートの結果に影響されることはありません。
+Linden Lab 社だけが[SECOND_LIFE] 全域における
+アクセス制限権を持っています。
+	</notification>
+	<notification name="HelpReportAbuseSelectCategory">
+		嫌がらせ報告のカテゴリを選択してください。
+カテゴリを選択することにより、嫌がらせ報告の処理や保管に大変役立ちます。
+	</notification>
+	<notification name="HelpReportAbuseAbuserNameEmpty">
+		嫌がらせ行為をした人の名前を入力してください。
+正確な情報の入力により、嫌がらせ報告の処理や保管に大変役立ちます。
+	</notification>
+	<notification name="HelpReportAbuseAbuserLocationEmpty">
+		嫌がらせがあった場所を入力してください。
+正確な情報の入力により、嫌がらせ報告の処理や保管に大変役立ちます。
+	</notification>
+	<notification name="HelpReportAbuseSummaryEmpty">
+		嫌がらせの概要を入力してください。
+正確な概要の入力により、
+嫌がらせ報告の処理や保管に大変役立ちます。
+	</notification>
+	<notification name="HelpReportAbuseDetailsEmpty">
+		嫌がらせの詳細な説明を入力してください。
+名前や嫌がらせの詳細を、できるだけ具体的に入力してください。
+
+正確な説明の入力により、
+嫌がらせ報告の処理や保管に大変役立ちます。
+	</notification>
+	<notification name="HelpReportAbuseContainsCopyright">
+		住人の皆様へ、
+
+知的財産の侵害に関する報告を行う際には、以下の点に注意してください。
+
+(1) 嫌がらせの報告のプロセス
+[SECOND_LIFE] の権限システムを悪用している住人を見つけたら、
+嫌がらせの報告を行ってください。
+例えばコピーBotの使用、それに似たツールの使用による知的財産権の侵害があります。
+アビューズチームは調査に基づき、
+[SECOND_LIFE] のコミュニティースタンダードや
+利用規約に違反する行為と判断された場合には適切な処置を行っています。
+ただし、コンテンツを[SECOND_LIFE] から撤去してほしい、
+といった要望にはアビューズチームは応えることができません。
+
+(2) DMCA(デジタルミレニアム著作権法)及びコンテンツ撤去プロセス
+[SECOND_LIFE] からのコンテンツの撤去をリクエストするには、
+著作権侵害通知の提出を行う必要があります。
+参照: http://secondlife.com/corporate/dmca.php
+
+この件に関する嫌がらせの報告を続ける際は、このウィンドウを閉じてください。選択すべきカテゴリは「知的財産の侵害>コピーBot及び権限の悪用」のほうが適しているかもしれませんのでご確認ください。
+
+よろしくお願いします。
+
+Linden Lab
+	</notification>
+	<notification name="FailedRequirementsCheck">
+		以下の必要なコンポーネントが、[FLOATER]から抜け落ちています
+[COMPONENTS]
+	</notification>
+	<notification label="既存の付属品を置換" name="ReplaceAttachment">
+		体のこの部位にはオブジェクトが装着されています。
+選択されたオブジェクトと置き換えますか?
+		<form name="form">
+			<ignore name="ignore" save_option="true" text="装着しているアイテムと選択したアイテムを入れ替える"/>
+			<button ignore="自動的に交換" name="Yes" text="OK"/>
+			<button ignore="交換しない" name="No" text="キャンセル"/>
+		</form>
+	</notification>
+	<notification label="取り込み中の警告" name="BusyModePay">
+		現在、取り込み中のため、この支払いと
+引き換えのアイテムを受け取ることが
+できません。
+
+この取引を完了する前に、取り込み中の設定を解除しますか?
+		<form name="form">
+			<ignore name="ignore" save_option="true" text="取り込み中モードの時に支払をする"/>
+			<button ignore="常に取り込み中の設定" name="Yes" text="OK"/>
+			<button ignore="取り込み中の設定にしない" name="No" text="キャンセル"/>
+		</form>
+	</notification>
+	<notification name="ConfirmEmptyTrash">
+		ゴミ箱の項目をすべて削除しますか?
+		<usetemplate ignoretext="持ち物のゴミ箱フォルダを空にする前に確認する" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmClearBrowserCache">
+		トラベル、Web、検索の履歴をすべて削除しますか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="はい"/>
+	</notification>
+	<notification name="ConfirmClearCookies">
+		本当にクッキーをクリアしますか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="はい"/>
+	</notification>
+	<notification name="ConfirmClearMediaUrlList">
+		保存された URL のリストを消去します。よろしいですか?
+		<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="はい"/>
+	</notification>
+	<notification name="ConfirmEmptyLostAndFound">
+		紛失物の項目をすべて削除しますか?
+		<usetemplate ignoretext="紛失物フォルダを空にする前に確認する" name="okcancelignore" notext="いいえ" yestext="はい"/>
+	</notification>
+	<notification name="CopySLURL">
+		次の SLurl がクリップボードにコピーされました:
+ [SLURL]
+
+Webページにこれをリンクすると、他人がこの場所に簡単にアクセスできます。Webブラウザのアドレスバーに貼り付けて試してみてください。
+		<form name="form">
+			<ignore name="ignore" text="クリップボードに SLurl がコピーされる"/>
+		</form>
+	</notification>
+	<notification name="WLSavePresetAlert">
+		保存された事前設定を上書きしますか?
+		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+	</notification>
+	<notification name="WLDeletePresetAlert">
+		[SKY] を削除しますか?
+		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+	</notification>
+	<notification name="WLNoEditDefault">
+		デフォルトの設定を編集したり削除したりすることはできません。
+	</notification>
+	<notification name="WLMissingSky">
+		このデイ・サイクルのファイルは次の存在しない「空」ファイルを参照しています: [SKY]。
+	</notification>
+	<notification name="PPSaveEffectAlert">
+		ポストプロセス効果が存在します。 上書きしますか?
+		<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+	</notification>
+	<notification name="NewSkyPreset">
+		新しい空の名前を指定してください。
+		<form name="form">
+			<input name="message">
+				新しい事前設定
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="キャンセル"/>
+		</form>
+	</notification>
+	<notification name="ExistsSkyPresetAlert">
+		事前設定がすでに存在します!
+	</notification>
+	<notification name="NewWaterPreset">
+		新しい水の事前設定の名前を指定してください。
+		<form name="form">
+			<input name="message">
+				新しい事前設定
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="キャンセル"/>
+		</form>
+	</notification>
+	<notification name="ExistsWaterPresetAlert">
+		事前設定がすでに存在します!
+	</notification>
+	<notification name="WaterNoEditDefault">
+		デフォルトの設定を編集したり削除したりすることはできません。
+	</notification>
+	<notification name="ChatterBoxSessionStartError">
+		[RECIPIENT]との新しいチャットを開始することができません
+[REASON]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="ChatterBoxSessionEventError">
+		[EVENT]
+[REASON]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="ForceCloseChatterBoxSession">
+		[NAME]とのチャットセッションを閉じます。
+[REASON]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="Cannot_Purchase_an_Attachment">
+		オブジェクトが取り付けられているときは購入することができません。
+	</notification>
+	<notification label="デビット許可のリクエストについて" name="DebitPermissionDetails">
+		この要求を許可すると、スクリプトからあなたのアカウントにリンデンドルを課金できるようになります。
+この許可を取り消すには、オブジェクトのオーナーはオブジェクトを削除するか、オブジェクトのスクリプトをリセットしなければなりません。
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="AutoWearNewClothing">
+		作成しようとしている衣類を自動的に装着しますか?
+		<usetemplate ignoretext="容姿編集画面で作成する衣類を装着する" name="okcancelignore" notext="いいえ" yestext="はい"/>
+	</notification>
+	<notification name="NotAgeVerified">
+		年齢確認を済ませていないとこの区画を訪れることができません。  [SECOND_LIFE] サイトで年齢の確認を行いますか?
+
+[_URL]
+		<url name="url" option="0">
+			https://secondlife.com/account/verification.php?lang=ja
+		</url>
+		<usetemplate ignoretext="年齢の確認を済ませていません" name="okcancelignore" notext="いいえ" yestext="はい"/>
+	</notification>
+	<notification name="Cannot enter parcel: no payment info on file">
+		支払情報が登録されていないとこのエリアを訪れることができません。  [SECOND_LIFE] サイトで登録を行いますか?
+
+[_URL]
+		<url name="url" option="0">
+			https://secondlife.com/account/index.php?lang=ja
+		</url>
+		<usetemplate ignoretext="支払情報が登録されていません" name="okcancelignore" notext="いいえ" yestext="はい"/>
+	</notification>
+	<notification name="MissingString">
+		文字列[STRING_NAME]がstrings.xmlに含まれていません
+	</notification>
+	<notification name="SystemMessageTip">
+		[MESSAGE]
+	</notification>
+	<notification name="Cancelled">
+		取り消されました
+	</notification>
+	<notification name="CancelledSit">
+		座るのを取り消されました
+	</notification>
+	<notification name="CancelledAttach">
+		添付は取り消されました
+	</notification>
+	<notification name="ReplacedMissingWearable">
+		欠落している服/身体部位をデフォルトに置換します。
+	</notification>
+	<notification name="GroupNotice">
+		件名: [SUBJECT], メッセージ: [MESSAGE]
+	</notification>
+	<notification name="FriendOnline">
+		[FIRST] [LAST] はオンラインです。
+	</notification>
+	<notification name="FriendOffline">
+		[FIRST] [LAST] はオフラインです。
+	</notification>
+	<notification name="AddSelfFriend">
+		残念ながら自分自身をフレンドに追加することはできません。
+	</notification>
+	<notification name="UploadingAuctionSnapshot">
+		インワールドとウェブ・サイトのスナップショットをアップロード中です...
+(所要時間:約5分)
+	</notification>
+	<notification name="UploadPayment">
+		アップロードに L$[AMOUNT] 支払いました。
+	</notification>
+	<notification name="UploadWebSnapshotDone">
+		Webサイトのスナップショットがアップロードされました。
+	</notification>
+	<notification name="UploadSnapshotDone">
+		インワールドでのスナップショットのアップロードが完了しました。
+	</notification>
+	<notification name="TerrainDownloaded">
+		raw地形がダウンロードされました
+	</notification>
+	<notification name="GestureMissing">
+		ジェスチャー[NAME] がデータベースにありません。
+	</notification>
+	<notification name="UnableToLoadGesture">
+		ジェスチャー[NAME] を読み込むことができません。
+再度、試みてください。
+	</notification>
+	<notification name="LandmarkMissing">
+		データベースにランドマークがありません。
+	</notification>
+	<notification name="UnableToLoadLandmark">
+		ランドマークをロードできません。  もう一度試してください。
+	</notification>
+	<notification name="CapsKeyOn">
+		CapsLock キーが有効になっています。
+パスワードに影響があるかもしれません。
+	</notification>
+	<notification name="NotecardMissing">
+		ノートカードがデータベースにありません。
+	</notification>
+	<notification name="NotecardNoPermissions">
+		このノートカードを見る権限がありません。
+	</notification>
+	<notification name="RezItemNoPermissions">
+		オブジェクトをrezするにはパーミッション(承認)が不足してます。
+	</notification>
+	<notification name="UnableToLoadNotecard">
+		現在ノートカードの資産をロードできません。
+	</notification>
+	<notification name="ScriptMissing">
+		データベースにスクリプトがありません。
+	</notification>
+	<notification name="ScriptNoPermissions">
+		スクリプトを閲覧するには権限が不十分です。
+	</notification>
+	<notification name="UnableToLoadScript">
+		スクリプトをロードできません。  もう一度試してください。
+	</notification>
+	<notification name="IncompleteInventory">
+		あなたの提供するコンテンツは、この場所ではまだ全部揃いません。
+少ししてからもう一度試してください。
+	</notification>
+	<notification name="CannotModifyProtectedCategories">
+		保護されたカテゴリーは修正できません。
+	</notification>
+	<notification name="CannotRemoveProtectedCategories">
+		保護されたカテゴリーは削除できません。
+	</notification>
+	<notification name="OfferedCard">
+		あなたは[FIRST] [LAST] に
+コーリング・カードを送りました。
+	</notification>
+	<notification name="UnableToBuyWhileDownloading">
+		オブジェクトデータのダウンロード中は購入できません。
+もう一度試してください。
+	</notification>
+	<notification name="UnableToLinkWhileDownloading">
+		オブジェクトデータのウンロード中はリンクできません。
+もう一度試してください。
+	</notification>
+	<notification name="CannotBuyObjectsFromDifferentOwners">
+		オブジェクトは一度につき一人の所有者から購入できます。
+オブジェクトを 1 つだけ選んでください。
+	</notification>
+	<notification name="ObjectNotForSale">
+		このオブジェクトは販売対象ではありません。
+	</notification>
+	<notification name="EnteringGodMode">
+		レベル[LEVEL]のゴッド・モードに入ります
+	</notification>
+	<notification name="LeavingGodMode">
+		レベル [LEVEL] のゴッドモードを解除します
+	</notification>
+	<notification name="CopyFailed">
+		これをコピーする権限がありません。
+	</notification>
+	<notification name="InventoryAccepted">
+		[NAME]は、持ち物の提供を受け入れました。
+	</notification>
+	<notification name="InventoryDeclined">
+		[NAME]は、持ち物の提供を断りました。
+	</notification>
+	<notification name="ObjectMessage">
+		[NAME]: [MESSAGE]
+	</notification>
+	<notification name="CallingCardAccepted">
+		コーリング・カードが受理されました。
+	</notification>
+	<notification name="CallingCardDeclined">
+		コーリング・カードが拒否されました。
+	</notification>
+	<notification name="TeleportToLandmark">
+		本土に到達しました。
+[NAME]などの場所にテレポートするには、画面右下にある「持ち物」ボタンをクリックし、ランドマーク(Landmarks)フォルダを選択してください。
+ランドマークをダブルクリックした後「テレポート」をクリックするとその場所へ移動します。
+	</notification>
+	<notification name="TeleportToPerson">
+		本土に到達しました。
+住人の[NAME]と接触するには、画面右下にある「持ち物」ボタンをクリックし、コーリングカード(Calling Cards)フォルダを選択してください。
+カードをダブルクリックし、「IMを送る」をクリックし、メッセージを送信してください。
+	</notification>
+	<notification name="CantSelectLandFromMultipleRegions">
+		サーバーの境界を越えて土地を選択することできません。
+もっと小さな土地を選択してください。
+	</notification>
+	<notification name="SearchWordBanned">
+		コミュニティスタンダードに明記されているコンテンツ制限により、あなたの検索語の一部が除外されました。
+	</notification>
+	<notification name="NoContentToSearch">
+		少なくともどれか一つコンテンツの種類を選択して検索を行ってください。(PG, Mature, Adult)
+	</notification>
+	<notification name="GroupVote">
+		[NAME] は投票の申請をしています:
+[MESSAGE]
+		<form name="form">
+			<button name="VoteNow" text="今すぐ投票する"/>
+			<button name="Later" text="あとで"/>
+		</form>
+	</notification>
+	<notification name="SystemMessage">
+		[MESSAGE]
+	</notification>
+	<notification name="EventNotification">
+		イベント通知:
+
+[NAME]
+[DATE]
+		<form name="form">
+			<button name="Teleport" text="テレポート"/>
+			<button name="Description" text="説明"/>
+			<button name="Cancel" text="取り消し"/>
+		</form>
+	</notification>
+	<notification name="TransferObjectsHighlighted">
+		この区画上に存在するオブジェクトのうち、この区画の購入者に譲渡されるオブジェクトがすべて強調表示されます。
+
+
+*譲渡される樹木や植物は、強調表示されません。
+		<form name="form">
+			<button name="Done" text="完了"/>
+		</form>
+	</notification>
+	<notification name="DeactivatedGesturesTrigger">
+		同じトリガーでアクティブにしないジェスチャー:
+[NAMES]
+	</notification>
+	<notification name="NoQuickTime">
+		Apple社のQuickTimeがシステムにインストールされていないと思われます。
+ストリーミング・メディアの再生を行いたい場合は、QuickTimeのサイト(http://www.apple.com/quicktime)にアクセスして、QuickTime Player をインストールしてください。
+	</notification>
+	<notification name="NoPlugin">
+		「 [MIME_TYPE] 」の MIME タイプを扱うメディアプラグインが見つかりませんでした。  このタイプのメディアはご利用いただけません。
+	</notification>
+	<notification name="MediaPluginFailed">
+		次のメディアプラグインが実行できませんでした:
+    [PLUGIN]
+
+プラグインをインストールしなおすか、問題が解決しない場合はメーカーにお問い合わせください。
+		<form name="form">
+			<ignore name="ignore" text="メディアプラグインの実行に失敗"/>
+		</form>
+	</notification>
+	<notification name="OwnedObjectsReturned">
+		選択した土地の区画上にあったあなたのオブジェクトは、あなたの持ち物に返却されました。
+	</notification>
+	<notification name="OtherObjectsReturned">
+		選択されている土地の区画上にあった
+ [FIRST] [LAST]
+ が所有するオブジェクトは、オーナーの持ち物に返却されました。
+	</notification>
+	<notification name="OtherObjectsReturned2">
+		選択された土地の区画上にあり、
+住人の[NAME]の所有だったオブジェクトはオーナーに返却されました。
+	</notification>
+	<notification name="GroupObjectsReturned">
+		選択されている区画上にあり、[GROUPNAME] というグループと共有だったオブジェクトは、オーナーの持ち物に返却されました。
+譲渡されていた譲渡可能なオブジェクトは、前のオーナーに返却されました。
+グループに譲渡されていた譲渡不可能なオブジェクトは、削除されました。
+	</notification>
+	<notification name="UnOwnedObjectsReturned">
+		選択された土地の区画上にあり、あなたの所有で「なかった」オブジェクトは、本来のオーナーに返却されました。
+	</notification>
+	<notification name="NotSafe">
+		この土地ではダメージが有効です。
+ケガをするかもしれません。 死んでしまった場合はホームにテレポートされます。
+	</notification>
+	<notification name="NoFly">
+		このエリアでは飛行が禁止されています。
+ここでは飛べません。
+	</notification>
+	<notification name="PushRestricted">
+		このエリアではプッシュが制限されています。
+土地所有者以外は他人をプッシュすることはできません。
+	</notification>
+	<notification name="NoVoice">
+		このエリアではボイスチャットが無効です。 誰かが話しているのを聞くことはできません。
+	</notification>
+	<notification name="NoBuild">
+		このエリアでは制作が禁止されています。 オブジェクトを制作したり Rez することはできません。
+	</notification>
+	<notification name="ScriptsStopped">
+		管理者がこの地域内のスクリプトを一時停止させました。
+	</notification>
+	<notification name="ScriptsNotRunning">
+		この地域ではスクリプトの使用が禁止されています
+	</notification>
+	<notification name="NoOutsideScripts">
+		この土地では、外部のスクリプトが禁止されています。
+
+土地所有者のもの以外はスクリプトは実行されません。
+	</notification>
+	<notification name="ClaimPublicLand">
+		そのリージョンにいないと公共の土地を取得することはできません。
+	</notification>
+	<notification name="RegionTPAccessBlocked">
+		あなたのレーティング区分によりその地域(リージョン)へは入ることができません。 年齢確認を行うか、最新ビューワをインストールしてください。
+
+現在のレーティング区分でアクセス可能なエリアに関する詳細はナレッジベースを参照してください。
+	</notification>
+	<notification name="URBannedFromRegion">
+		あなたは地域(リージョン)への立入が禁止されています。
+	</notification>
+	<notification name="NoTeenGridAccess">
+		あなたのアカウントではティーングリッドに接続できません。
+	</notification>
+	<notification name="ImproperPaymentStatus">
+		この地域(リージョン)に入るために適した支払いステータスがありません。
+	</notification>
+	<notification name="MustGetAgeParcel">
+		この区画に入るには年齢確認済みである必要があります。
+	</notification>
+	<notification name="NoDestRegion">
+		目的地の地域(リージョン)が見つかりませんでした。
+	</notification>
+	<notification name="NotAllowedInDest">
+		目的地に入る許可がありません。
+	</notification>
+	<notification name="RegionParcelBan">
+		立入禁止された区画を横断することはできません。 別の方法をお試しください。
+	</notification>
+	<notification name="TelehubRedirect">
+		テレハブに転送されました。
+	</notification>
+	<notification name="CouldntTPCloser">
+		これ以上目的地に近い場所にテレポートができませんでした。
+	</notification>
+	<notification name="TPCancelled">
+		テレポートがキャンセルされました。
+	</notification>
+	<notification name="FullRegionTryAgain">
+		入ろうとしている地域(リージョン)は現在満員です。
+しばらくしてから再度お試しください。
+	</notification>
+	<notification name="GeneralFailure">
+		よくある失敗
+	</notification>
+	<notification name="RoutedWrongRegion">
+		異なる地域(リージョン)に迂回されました。 もう一度お試しください。
+	</notification>
+	<notification name="NoValidAgentID">
+		エージェントIDが無効です。
+	</notification>
+	<notification name="NoValidSession">
+		セッションIDが無効です。
+	</notification>
+	<notification name="NoValidCircuit">
+		回路コードが無効です。
+	</notification>
+	<notification name="NoValidTimestamp">
+		タイムスタンプが無効です。
+	</notification>
+	<notification name="NoPendingConnection">
+		接続を生成できません。
+	</notification>
+	<notification name="InternalUsherError">
+		内部エラーが発生しました。
+	</notification>
+	<notification name="NoGoodTPDestination">
+		この地域(リージョン)では適切なテレポート目的地が見つかりませんでした。
+	</notification>
+	<notification name="InternalErrorRegionResolver">
+		内部エラーが発生しました。
+	</notification>
+	<notification name="NoValidLanding">
+		有効な着地点が見つかりませんでした。
+	</notification>
+	<notification name="NoValidParcel">
+		有効な区画が見つかりませんでした。
+	</notification>
+	<notification name="ObjectGiveItem">
+		[FIRST] [LAST]所有の、
+[OBJECTFROMNAME]から、
+[OBJECTNAME]という[OBJECTTYPE]が送られてきました。
+		<form name="form">
+			<button name="Keep" text="受け取る"/>
+			<button name="Discard" text="破棄"/>
+			<button name="Mute" text="無視リストへ"/>
+		</form>
+	</notification>
+	<notification name="ObjectGiveItemUnknownUser">
+		(未知のユーザー) 所有の[OBJECTFROMNAME]から、
+あなたに[OBJECTNAME]という[OBJECTTYPE]が送られてきました。
+		<form name="form">
+			<button name="Keep" text="受け取る"/>
+			<button name="Discard" text="破棄"/>
+			<button name="Mute" text="無視リストへ"/>
+		</form>
+	</notification>
+	<notification name="UserGiveItem">
+		[NAME]は、あなたに[OBJECTNAME]という名前の[OBJECTTYPE]を渡しました。
+		<form name="form">
+			<button name="Keep" text="受け取る"/>
+			<button name="Discard" text="破棄"/>
+		</form>
+	</notification>
+	<notification name="GodMessage">
+		[NAME]
+[MESSAGE]
+	</notification>
+	<notification name="JoinGroup">
+		[MESSAGE]
+		<form name="form">
+			<button name="Join" text="参加"/>
+			<button name="Decline" text="辞退"/>
+			<button name="Info" text="情報"/>
+		</form>
+	</notification>
+	<notification name="TeleportOffered">
+		[NAME]はあなたをテレポートで呼び寄せようとしています:
+
+[MESSAGE]
+		<form name="form">
+			<button name="Teleport" text="テレポート"/>
+			<button name="Cancel" text="取り消し"/>
+		</form>
+	</notification>
+	<notification name="GotoURL">
+		[MESSAGE]
+[URL]
+		<form name="form">
+			<button name="Later" text="あとで"/>
+			<button name="GoNow..." text="今すぐ行く"/>
+		</form>
+	</notification>
+	<notification name="OfferFriendship">
+		[NAME]は、
+フレンド登録を申し込んでいます。
+
+[MESSAGE]
+
+(デフォルトでお互いのオンライン・ステータスを見ることができるようになります。)
+		<form name="form">
+			<button name="Accept" text="受け入れる"/>
+			<button name="Decline" text="辞退"/>
+		</form>
+	</notification>
+	<notification name="OfferFriendshipNoMessage">
+		[NAME]は、
+フレンド登録を申し込んでいます。
+
+(デフォルトでお互いのオンライン・ステータスを見ることができるようになります。)
+		<form name="form">
+			<button name="Accept" text="受け入れる"/>
+			<button name="Decline" text="拒否"/>
+		</form>
+	</notification>
+	<notification name="FriendshipAccepted">
+		[NAME]は、フレンド 登録を受け入れました。
+	</notification>
+	<notification name="FriendshipDeclined">
+		[NAME]は、フレンド 登録を断りました。
+	</notification>
+	<notification name="OfferCallingCard">
+		[FIRST] [LAST]が
+あなたにコーリングカードを送ってきました。
+これにより、あなたの持ち物にブックマークが追加され、この住人にすばやくIMすることができます。
+		<form name="form">
+			<button name="Accept" text="受け入れる"/>
+			<button name="Decline" text="辞退"/>
+		</form>
+	</notification>
+	<notification name="RegionRestartMinutes">
+		この地域は[MINUTES]分後に再起動されます。
+強制ログアウトとなりますので、この地域の外に出てください。
+	</notification>
+	<notification name="RegionRestartSeconds">
+		このリージョンは [SECONDS] 秒後に再起動されます。.
+このままここにいるとログアウトされます。
+	</notification>
+	<notification name="LoadWebPage">
+		ウェブ・ページ[URL]をロードしますか?
+
+[MESSAGE]
+
+ロード元のオブジェクト:[OBJECTNAME]、オーナー:[NAME]?
+		<form name="form">
+			<button name="Gotopage" text="移動"/>
+			<button name="Cancel" text="取り消し"/>
+		</form>
+	</notification>
+	<notification name="FailedToFindWearableUnnamed">
+		データベースに[TYPE]が見つかりませんでした
+	</notification>
+	<notification name="FailedToFindWearable">
+		データベースに[DESC]という名前の[TYPE]が見つかりませんでした。
+	</notification>
+	<notification name="InvalidWearable">
+		着用しようとしているアイテムはあなたのビューワでは読み込むことができません。 [APP_NAME]ビューワを最新のものにアップグレードしてからこのアイテムを着用してください。
+	</notification>
+	<notification name="ScriptQuestion">
+		「[NAME]」が所有するオブジェクト「[OBJECTNAME]」を:
+
+[QUESTIONS]
+よろしいですか?
+		<form name="form">
+			<button name="Yes" text="はい"/>
+			<button name="No" text="いいえ"/>
+			<button name="Mute" text="無視リストに追加"/>
+		</form>
+	</notification>
+	<notification name="ScriptQuestionCaution">
+		[NAME] 所有の「 [OBJECTNAME] 」 というオブジェクトが次のことをしようとしています:
+
+[QUESTIONS]
+このオブジェクトや制作者を信用できない場合は、このリクエストを拒否してください。
+
+リクエストを受けますか?
+		<form name="form">
+			<button name="Grant" text="許可"/>
+			<button name="Deny" text="拒否"/>
+			<button name="Details" text="詳細..."/>
+		</form>
+	</notification>
+	<notification name="ScriptDialog">
+		[FIRST] [LAST]の「[TITLE]」
+[MESSAGE]
+		<form name="form">
+			<button name="Ignore" text="無視する"/>
+		</form>
+	</notification>
+	<notification name="ScriptDialogGroup">
+		[GROUPNAME]の「[TITLE]」
+[MESSAGE]
+		<form name="form">
+			<button name="Ignore" text="無視する"/>
+		</form>
+	</notification>
+	<notification name="FirstBalanceIncrease">
+		L$[AMOUNT] を受け取りました。
+あなたの L$ 残高は画面右上に表示されています。
+	</notification>
+	<notification name="FirstBalanceDecrease">
+		L$[AMOUNT] を支払いました。
+あなたの L$ 残高は画面右上に表示されています。
+	</notification>
+	<notification name="FirstSit">
+		着席中です。
+周囲を見るには矢印キーか AWSD キーを使ってください。
+立つときには「立ち上がる」ボタンをクリックしてください。
+	</notification>
+	<notification name="FirstMap">
+		地図をクリック・ドラッグして周囲を見てください。
+ダブルクリックするとテレポートします。
+右側のコントロールで場所を探したり背景を変更してください。
+	</notification>
+	<notification name="FirstBuild">
+		制作ツールを開きました。 見るものすべてがこのツールで作成されたものです。
+	</notification>
+	<notification name="FirstTeleport">
+		このリージョンでは特定のエリアにのみテレポートできます。 矢印が目的地を指しています。 矢印をクリックすると消えます。
+	</notification>
+	<notification name="FirstOverrideKeys">
+		あなたの移動キーをオブジェクトが操作しています。
+矢印かAWSDのキーで動作を確認してください。
+銃などのオブジェクトだと、一人称視点(マウスルック)に変更する必要があります。
+Mキーを押して変更します。
+	</notification>
+	<notification name="FirstAppearance">
+		容姿を編集中です。
+周囲を見るには矢印キーを使ってください。
+終わったら「すべて保存」を押してください。
+	</notification>
+	<notification name="FirstInventory">
+		これはあなたの持ち物です。所有しているアイテムが入っています。
+
+* アイテムを自分にドラッグして装着してください。
+* アイテムを地面にドラッグして Rez してください。
+* ノートカードをダブルクリックして開いてください。
+	</notification>
+	<notification name="FirstSandbox">
+		ここはサンドボックスエリアです。住人が制作を学ぶことができます。
+
+ここで制作されたものは時間が経つと削除されます。制作したアイテムを右クリックして「取る」を選び、持ち物に入れてお持ち帰りするのをお忘れなく。
+	</notification>
+	<notification name="FirstFlexible">
+		このオブジェクトはフレキシブルです。 フレキシブルオブジェクトは、「物理」ではなく「ファントム」でなければなりません。
+	</notification>
+	<notification name="FirstDebugMenus">
+		アドバンスメニューを開きました。
+
+このメニューの有効・無効設定:
+  Windows: Ctrl+Alt+D
+  Mac: ⌘-Opt+D
+	</notification>
+	<notification name="FirstSculptedPrim">
+		スカルプトプリムを編集中です。 スカルプトプリムには形状の輪郭を指定するための特別なテクスチャが必要です。
+	</notification>
+	<notification name="MaxListSelectMessage">
+		このリストから[MAX_SELECT]個までのアイテムを選択できます。
+	</notification>
+	<notification name="VoiceInviteP2P">
+		[NAME]が、あなたをボイスチャットコールに招待しています。
+コールに参加するには「受け入れる」をクリックし、招待を断るときは「拒否」をクリックしてください。このコールをしている人をミュートにする場合は「ミュート」をクリックしてください。
+		<form name="form">
+			<button name="Accept" text="受け入れる"/>
+			<button name="Decline" text="拒否"/>
+			<button name="Mute" text="ミュート"/>
+		</form>
+	</notification>
+	<notification name="AutoUnmuteByIM">
+		[FIRST] [LAST]に
+インスタント・メッセージが送信され、無視設定は自動的に解除されました。
+	</notification>
+	<notification name="AutoUnmuteByMoney">
+		[FIRST] [LAST]にお金を渡したため、 無視設定が自動的に解除されました。
+	</notification>
+	<notification name="AutoUnmuteByInventory">
+		[FIRST] [LAST]に持ち物を渡したため、 無視設定が自動的に解除されました。
+	</notification>
+	<notification name="VoiceInviteGroup">
+		[NAME]が、 グループ[GROUP]とのボイスチャットコールに参加しました。
+コールに参加するには「受け入れる」をクリックし、招待を断るときは「拒否」をクリックしてください。このコールをしている人をミュートにする場合は「ミュート」をクリックしてください。
+		<form name="form">
+			<button name="Accept" text="受け入れる"/>
+			<button name="Decline" text="拒否"/>
+			<button name="Mute" text="ミュート"/>
+		</form>
+	</notification>
+	<notification name="VoiceInviteAdHoc">
+		[NAME]が、 会議チャットでボイスチャットコールに参加しました。
+コールに参加するには「受け入れる」をクリックし、招待を断るときは「拒否」をクリックしてください。 このユーザーをミュート(消声)する場合は「ミュート」をクリックしてください。
+		<form name="form">
+			<button name="Accept" text="受け入れる"/>
+			<button name="Decline" text="拒否"/>
+			<button name="Mute" text="ミュート"/>
+		</form>
+	</notification>
+	<notification name="InviteAdHoc">
+		[NAME]が、 あなたを会議チャットに招待しています。
+チャットに参加するには「受け入れる」をクリックし、招待を断るときは「拒否」をクリックしてください。このユーザーをミュート(消声)する場合は「ミュート」をクリックしてください。
+		<form name="form">
+			<button name="Accept" text="受け入れる"/>
+			<button name="Decline" text="拒否"/>
+			<button name="Mute" text="ミュート"/>
+		</form>
+	</notification>
+	<notification name="VoiceChannelFull">
+		あなたが参加しようとしているボイスコール[VOICE_CHANNEL_NAME]は、参加者が最大限に達しました。後でもう一度お試しください。
+	</notification>
+	<notification name="ProximalVoiceChannelFull">
+		このエリアのボイスチャットは、混雑のため容量を超えてしまっています。申し訳ありませんが、他のエリアでボイスチャットをお試しください。
+	</notification>
+	<notification name="VoiceChannelDisconnected">
+		[VOICE_CHANNEL_NAME]への接続が切断されました。空間ボイスチャットに再接続されます。
+	</notification>
+	<notification name="VoiceChannelDisconnectedP2P">
+		[VOICE_CHANNEL_NAME]は、コールを終了しました。空間ボイスチャットに再接続されます。
+	</notification>
+	<notification name="P2PCallDeclined">
+		[VOICE_CHANNEL_NAME]は、あなたのコールを拒否しました。空間ボイスチャットに再接続されます。
+	</notification>
+	<notification name="P2PCallNoAnswer">
+		[VOICE_CHANNEL_NAME]は、あなたのコールを受け取れません。空間ボイスチャットに再接続されます。
+	</notification>
+	<notification name="VoiceChannelJoinFailed">
+		[VOICE_CHANNEL_NAME]への接続に失敗しました。時間をおいて、再度、試みてください。空間ボイスチャットに再接続されます。
+	</notification>
+	<notification name="VoiceLoginRetry">
+		あなた用のボイスチャンネルを作成しています。1分ほどかかります。
+	</notification>
+	<notification name="Cannot enter parcel: not a group member">
+		特定のグループメンバーのみこのエリアを訪問することができます。
+	</notification>
+	<notification name="Cannot enter parcel: banned">
+		立入禁止されているため、区画に入ることができません。
+	</notification>
+	<notification name="Cannot enter parcel: not on access list">
+		アクセス・リストに含まれていないため、区画に入ることができません。
+	</notification>
+	<notification name="VoiceNotAllowed">
+		あなたには[VOICE_CHANNEL_NAME]のボイス・チャットに接続する権限がありません。
+	</notification>
+	<notification name="VoiceCallGenericError">
+		[VOICE_CHANNEL_NAME]のボイス・チャットに接続中に、エラーが発生しました。後でもう一度お試しください。
+	</notification>
+	<notification name="ServerVersionChanged">
+		異なるサーバーバージョンのリージョンに来ました。パフォーマンスに影響があるかもしれません。 クリックしてリリースノートを確認してみてください。
+	</notification>
+	<notification name="UnsupportedCommandSLURL">
+		クリックした SLurl はサポートされていません。
+	</notification>
+	<notification name="IMToast">
+		<form name="form">
+			<button name="respondbutton" text="返答"/>
+		</form>
+	</notification>
+	<notification name="AttachmentSaved">
+		付属物(アタッチメント)が保存されました。
+	</notification>
+	<notification name="UnableToFindHelpTopic">
+		ヘルプトピックが見つかりませんでした。
+	</notification>
+	<global name="UnsupportedCPU">
+		- あなたの CPU の速度は必須動作環境の条件を満たしていません。
+	</global>
+	<global name="UnsupportedGLRequirements">
+		[APP_NAME] に必要なハードウェアがないようです。 [APP_NAME] にはマルチテクスチャをサポートする OpenGL グラフィックカードが必要です。 お使いのグラフィックカードの最新ドライバがインストールされているかどうか、オペレーティングシステムのサービスパックとパッチが入っているかをご確認ください。
+
+この問題が何度も起きる場合は、[SUPPORT_SITE] へご連絡ください。
+	</global>
+	<global name="UnsupportedCPUAmount">
+		796
+	</global>
+	<global name="UnsupportedRAMAmount">
+		510
+	</global>
+	<global name="UnsupportedGPU">
+		- あなたのグラフィック・カードは必須動作環境の条件を満たしていません。
+	</global>
+	<global name="UnsupportedRAM">
+		- あなたのシステム・メモリは必須動作環境の条件を満たしていません。
+	</global>
+	<global name="PermYes">
+		はい
+	</global>
+	<global name="PermNo">
+		いいえ
+	</global>
+	<global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+		自分の土地をお持ちの場合、ホームロケーションに設定できます。 
+お持ちでない場合は、地図で「インフォハブ」を探してください。
+	</global>
+</notifications>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
index 75bf6ac7b67..56542455704 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
@@ -1,38 +1,38 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profile Edit" name="edit_profile_panel">
-	<string name="CaptionTextAcctInfo">
-		[ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-	</string>
-	<string name="AcctTypeResident" value="住人"/>
-	<string name="AcctTypeTrial" value="トライアル"/>
-	<string name="AcctTypeCharterMember" value="特権メンバー"/>
-	<string name="AcctTypeEmployee" value="Linden Lab従業員"/>
-	<string name="PaymentInfoUsed" value="支払い情報登録済"/>
-	<string name="PaymentInfoOnFile" value="支払い情報登録済み"/>
-	<string name="NoPaymentInfoOnFile" value="支払い情報未登録"/>
-	<string name="AgeVerified" value="年齢確認済み"/>
-	<string name="NotAgeVerified" value="年齢未確認"/>
-	<string name="partner_edit_link_url">
-		http://www.secondlife.com/account/partners.php?lang=ja
-	</string>
-	<string name="no_partner_text" value="なし"/>
-	<scroll_container name="profile_scroll">
-		<panel name="scroll_content_panel">
-			<panel name="data_panel">
-				<panel name="lifes_images_panel">
-					<icon label="" name="2nd_life_edit_icon" tool_tip="クリックして画像を選択"/>
-				</panel>
-				<icon label="" name="real_world_edit_icon" tool_tip="クリックして画像を選択"/>
-				<text name="title_homepage_text">
-					Web サイト:
-				</text>
-				<check_box label="検索結果に表示" name="show_in_search_checkbox"/>
-				<text name="title_acc_status_text" value="アカウントの状態:"/>
-			</panel>
-		</panel>
-	</scroll_container>
-	<panel name="profile_me_buttons_panel">
-		<button label="変更を保存" name="save_btn"/>
-		<button label="キャンセル" name="cancel_btn"/>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profile Edit" name="edit_profile_panel">
+	<string name="CaptionTextAcctInfo">
+		[ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+	</string>
+	<string name="AcctTypeResident" value="住人"/>
+	<string name="AcctTypeTrial" value="トライアル"/>
+	<string name="AcctTypeCharterMember" value="特権メンバー"/>
+	<string name="AcctTypeEmployee" value="Linden Lab従業員"/>
+	<string name="PaymentInfoUsed" value="支払い情報登録済"/>
+	<string name="PaymentInfoOnFile" value="支払い情報登録済み"/>
+	<string name="NoPaymentInfoOnFile" value="支払い情報未登録"/>
+	<string name="AgeVerified" value="年齢確認済み"/>
+	<string name="NotAgeVerified" value="年齢未確認"/>
+	<string name="partner_edit_link_url">
+		http://www.secondlife.com/account/partners.php?lang=ja
+	</string>
+	<string name="no_partner_text" value="なし"/>
+	<scroll_container name="profile_scroll">
+		<panel name="scroll_content_panel">
+			<panel name="data_panel">
+				<panel name="lifes_images_panel">
+					<icon label="" name="2nd_life_edit_icon" tool_tip="クリックして画像を選択"/>
+				</panel>
+				<icon label="" name="real_world_edit_icon" tool_tip="クリックして画像を選択"/>
+				<text name="title_homepage_text">
+					Web サイト:
+				</text>
+				<check_box label="検索結果に表示" name="show_in_search_checkbox"/>
+				<text name="title_acc_status_text" value="アカウントの状態:"/>
+			</panel>
+		</panel>
+	</scroll_container>
+	<panel name="profile_me_buttons_panel">
+		<button label="変更を保存" name="save_btn"/>
+		<button label="キャンセル" name="cancel_btn"/>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_invite.xml b/indra/newview/skins/default/xui/ja/panel_group_invite.xml
index 586eb4e6cca..815bb93e66b 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_invite.xml
@@ -1,30 +1,30 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="メンバーを招待" name="invite_panel">
-	<panel.string name="confirm_invite_owner_str">
-		本当に新しい所有者を招待しますか?この操作は取り消しできません。
-	</panel.string>
-	<panel.string name="loading">
-		(ローディング...)
-	</panel.string>
-	<panel.string name="already_in_group">
-		何人かのアバターは既にグループに入っているため招待されませんでした。
-	</panel.string>
-	<text bottom_delta="-96" font="SansSerifSmall" height="72" name="help_text">
-		あなたのグループに一度に複数の
-住人を招待することができます。
-「リストから住人を選択」
-をクリックしてください。
-	</text>
-	<button bottom_delta="-10" label="リストから住人を選択" name="add_button" tool_tip=""/>
-	<name_list bottom_delta="-160" height="156" name="invitee_list" tool_tip="複数の住人を選択するには、Ctrlキーを押しながら住人名をクリックします。"/>
-	<button label="リストから選択したものを削除" name="remove_button" tool_tip="上で選択した居住者を招待リストから削除します。"/>
-	<text name="role_text">
-		割り当て先の役割を選択:
-	</text>
-	<combo_box name="role_name" tool_tip="メンバーに割り当て可能な役割をリストから選択。"/>
-	<button label="招待を送信" name="ok_button"/>
-	<button label="取り消し" name="cancel_button"/>
-	<string name="GroupInvitation">
-		グループへの招待
-	</string>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="メンバーを招待" name="invite_panel">
+	<panel.string name="confirm_invite_owner_str">
+		本当に新しい所有者を招待しますか?この操作は取り消しできません。
+	</panel.string>
+	<panel.string name="loading">
+		(ローディング...)
+	</panel.string>
+	<panel.string name="already_in_group">
+		何人かのアバターは既にグループに入っているため招待されませんでした。
+	</panel.string>
+	<text bottom_delta="-96" font="SansSerifSmall" height="72" name="help_text">
+		あなたのグループに一度に複数の
+住人を招待することができます。
+「リストから住人を選択」
+をクリックしてください。
+	</text>
+	<button bottom_delta="-10" label="リストから住人を選択" name="add_button" tool_tip=""/>
+	<name_list bottom_delta="-160" height="156" name="invitee_list" tool_tip="複数の住人を選択するには、Ctrlキーを押しながら住人名をクリックします。"/>
+	<button label="リストから選択したものを削除" name="remove_button" tool_tip="上で選択した居住者を招待リストから削除します。"/>
+	<text name="role_text">
+		割り当て先の役割を選択:
+	</text>
+	<combo_box name="role_name" tool_tip="メンバーに割り当て可能な役割をリストから選択。"/>
+	<button label="招待を送信" name="ok_button"/>
+	<button label="取り消し" name="cancel_button"/>
+	<string name="GroupInvitation">
+		グループへの招待
+	</string>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
index 66662ec87a4..2b7292d8b2b 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
@@ -1,85 +1,85 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="土地とL$" name="land_money_tab">
-	<string name="help_text">
-		グループ所有地一覧は、寄付に関する詳細と一緒に表示されています。 「土地利用の合計」が「寄付総額」以下、または同じになるまで警告が表示されます。 「計画」、「詳細」、「販売」タブにはグループの資金に関する情報が掲載されています。
-	</string>
-	<button label="?" name="help_button"/>
-	<string name="cant_view_group_land_text">
-		あなたはグループ所有の土地表示を許されていません。
-	</string>
-	<string name="cant_view_group_accounting_text">
-		あなたはグループの会計情報の表示を許されていません。
-	</string>
-	<string name="loading_txt">
-		ロード中...
-	</string>
-	<text name="group_land_heading">
-		グループの保有地
-	</text>
-	<scroll_list name="group_parcel_list">
-		<column label="区画" name="name"/>
-		<column label="地域(リージョン)" name="location"/>
-		<column label="種類" name="type"/>
-		<column label="面積" name="area"/>
-		<column label="" name="hidden"/>
-	</scroll_list>
-	<button label="地図" label_selected="地図" name="map_button"/>
-	<text name="total_contributed_land_label">
-		寄付総額:
-	</text>
-	<text name="total_contributed_land_value" width="150">
-		[AREA]平方メートル
-	</text>
-	<text name="total_land_in_use_label">
-		土地利用の合計:
-	</text>
-	<text name="total_land_in_use_value" width="150">
-		[AREA]平方メートル
-	</text>
-	<text name="land_available_label">
-		利用可の土地:
-	</text>
-	<text name="land_available_value" width="150">
-		[AREA]平方メートル
-	</text>
-	<text name="your_contribution_label">
-		あなたの貢献:
-	</text>
-	<string name="land_contrib_error">
-		土地の出資設定を行うことができませんでした。
-	</string>
-	<text name="your_contribution_units">
-		(平方メートル)
-	</text>
-	<text name="your_contribution_max_value">
-		([AMOUNT]最大)
-	</text>
-	<text name="group_over_limit_text">
-		使用中の土地をサポートするには、グループ・メンバーがさらに多
-くの土地クレジットを提供する必要があります。
-	</text>
-	<text name="group_money_heading">
-		グループL$
-	</text>
-	<tab_container name="group_money_tab_container">
-		<panel label="計画" name="group_money_planning_tab">
-			<text_editor name="group_money_planning_text">
-				計算中...
-			</text_editor>
-		</panel>
-		<panel label="詳細" name="group_money_details_tab">
-			<text_editor name="group_money_details_text">
-				計算中…
-			</text_editor>
-			<button label="前の週" label_selected="前の週" name="earlier_details_button" tool_tip="前の週の履歴"/>
-			<button label="次の週" label_selected="次の週" name="later_details_button" tool_tip="次の週の履歴"/>
-		</panel>
-		<panel label="販売" name="group_money_sales_tab">
-			<text_editor name="group_money_sales_text">
-				計算中…
-			</text_editor>
-			<button label="前の週" label_selected="前の週" name="earlier_sales_button" tool_tip="前の週の履歴"/>
-			<button label="次の週" label_selected="次の週" name="later_sales_button" tool_tip="次の週の履歴"/>
-		</panel>
-	</tab_container>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="土地とL$" name="land_money_tab">
+	<string name="help_text">
+		グループ所有地一覧は、寄付に関する詳細と一緒に表示されています。 「土地利用の合計」が「寄付総額」以下、または同じになるまで警告が表示されます。 「計画」、「詳細」、「販売」タブにはグループの資金に関する情報が掲載されています。
+	</string>
+	<button label="?" name="help_button"/>
+	<string name="cant_view_group_land_text">
+		あなたはグループ所有の土地表示を許されていません。
+	</string>
+	<string name="cant_view_group_accounting_text">
+		あなたはグループの会計情報の表示を許されていません。
+	</string>
+	<string name="loading_txt">
+		ロード中...
+	</string>
+	<text name="group_land_heading">
+		グループの保有地
+	</text>
+	<scroll_list name="group_parcel_list">
+		<column label="区画" name="name"/>
+		<column label="地域(リージョン)" name="location"/>
+		<column label="種類" name="type"/>
+		<column label="面積" name="area"/>
+		<column label="" name="hidden"/>
+	</scroll_list>
+	<button label="地図" label_selected="地図" name="map_button"/>
+	<text name="total_contributed_land_label">
+		寄付総額:
+	</text>
+	<text name="total_contributed_land_value" width="150">
+		[AREA]平方メートル
+	</text>
+	<text name="total_land_in_use_label">
+		土地利用の合計:
+	</text>
+	<text name="total_land_in_use_value" width="150">
+		[AREA]平方メートル
+	</text>
+	<text name="land_available_label">
+		利用可の土地:
+	</text>
+	<text name="land_available_value" width="150">
+		[AREA]平方メートル
+	</text>
+	<text name="your_contribution_label">
+		あなたの貢献:
+	</text>
+	<string name="land_contrib_error">
+		土地の出資設定を行うことができませんでした。
+	</string>
+	<text name="your_contribution_units">
+		(平方メートル)
+	</text>
+	<text name="your_contribution_max_value">
+		([AMOUNT]最大)
+	</text>
+	<text name="group_over_limit_text">
+		使用中の土地をサポートするには、グループ・メンバーがさらに多
+くの土地クレジットを提供する必要があります。
+	</text>
+	<text name="group_money_heading">
+		グループL$
+	</text>
+	<tab_container name="group_money_tab_container">
+		<panel label="計画" name="group_money_planning_tab">
+			<text_editor name="group_money_planning_text">
+				計算中...
+			</text_editor>
+		</panel>
+		<panel label="詳細" name="group_money_details_tab">
+			<text_editor name="group_money_details_text">
+				計算中…
+			</text_editor>
+			<button label="前の週" label_selected="前の週" name="earlier_details_button" tool_tip="前の週の履歴"/>
+			<button label="次の週" label_selected="次の週" name="later_details_button" tool_tip="次の週の履歴"/>
+		</panel>
+		<panel label="販売" name="group_money_sales_tab">
+			<text_editor name="group_money_sales_text">
+				計算中…
+			</text_editor>
+			<button label="前の週" label_selected="前の週" name="earlier_sales_button" tool_tip="前の週の履歴"/>
+			<button label="次の週" label_selected="次の週" name="later_sales_button" tool_tip="次の週の履歴"/>
+		</panel>
+	</tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_list_item.xml b/indra/newview/skins/default/xui/ja/panel_group_list_item.xml
index 02ada7e6e58..a652e3bf11d 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_list_item.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_list_item.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="group_list_item">
-	<text name="group_name" value="不明"/>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="group_list_item">
+	<text name="group_name" value="不明"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_notices.xml b/indra/newview/skins/default/xui/ja/panel_group_notices.xml
index 382fd02d5fd..1146065cd1b 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_notices.xml
@@ -1,66 +1,66 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="通知" name="notices_tab">
-	<string name="help_text">
-		通知機能を使うと、グループ内ですばやく情報を伝達できます。
-複数のあて先にメッセージを送信できるほか、
-必要に応じてアイテムをメッセージに添付することもできます。 
-通知は、受信アビリティがある役割のグループ・メンバーにのみ配信されます。
-通知をオフにするには、一般タブを使います。
-	</string>
-	<string name="no_notices_text">
-		過去の通知はありません。
-	</string>
-	<button label="?" label_selected="?" name="help_button"/>
-	<text name="lbl">
-		グループ通知アーカイブ
-	</text>
-	<text name="lbl2">
-		通知は 14 日間保存されます。 通知リストは 1 つのグループにつき、1 日最大 200件 に制限されます。
-	</text>
-	<scroll_list name="notice_list">
-		<column label="" name="icon"/>
-		<column label="件名" name="subject"/>
-		<column label="送り主" name="from"/>
-		<column label="日付" name="date"/>
-	</scroll_list>
-	<text name="notice_list_none_found">
-		何も見つかりませんでした。
-	</text>
-	<button label="新しい通知" label_selected="新しい通知を作成" name="create_new_notice"/>
-	<button label="更新" label_selected="リスト更新" name="refresh_notices"/>
-	<panel label="新しい通知を作成" name="panel_create_new_notice">
-		<text name="lbl">
-			通知を作成
-		</text>
-		<text name="lbl2">
-			持ち物からこのパネルにアイテムを 1 つドラッグして添付できます。 添付するアイテムはコピーと再販・プレゼントが可能でなければなりません。また、フォルダは送れません。
-		</text>
-		<text name="lbl3">
-			件名:
-		</text>
-		<text name="lbl4">
-			メッセージ:
-		</text>
-		<text name="lbl5">
-			添付:
-		</text>
-		<button label="添付物を削除" label_selected="添付物を削除" name="remove_attachment"/>
-		<button label="送信" label_selected="通知を送信" name="send_notice"/>
-		<panel name="drop_target" tool_tip="持ち物からアイテムをメッセージ欄にドラッグしてください。通知と一緒に送信されます。送信するにはコピー、譲渡が可能なオブジェクトである必要があります。"/>
-	</panel>
-	<panel label="過去の通知を表示" name="panel_view_past_notice">
-		<text name="lbl">
-			アーカイブ通知
-		</text>
-		<text name="lbl2">
-			新しい通知の送信は、上の[新しい通知を作成する]をクリックしてください。
-		</text>
-		<text name="lbl3">
-			件名:
-		</text>
-		<text name="lbl4">
-			メッセージ:
-		</text>
-		<button label="添付物を開く" label_selected="添付物を開く" name="open_attachment"/>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="通知" name="notices_tab">
+	<string name="help_text">
+		通知機能を使うと、グループ内ですばやく情報を伝達できます。
+複数のあて先にメッセージを送信できるほか、
+必要に応じてアイテムをメッセージに添付することもできます。 
+通知は、受信アビリティがある役割のグループ・メンバーにのみ配信されます。
+通知をオフにするには、一般タブを使います。
+	</string>
+	<string name="no_notices_text">
+		過去の通知はありません。
+	</string>
+	<button label="?" label_selected="?" name="help_button"/>
+	<text name="lbl">
+		グループ通知アーカイブ
+	</text>
+	<text name="lbl2">
+		通知は 14 日間保存されます。 通知リストは 1 つのグループにつき、1 日最大 200件 に制限されます。
+	</text>
+	<scroll_list name="notice_list">
+		<column label="" name="icon"/>
+		<column label="件名" name="subject"/>
+		<column label="送り主" name="from"/>
+		<column label="日付" name="date"/>
+	</scroll_list>
+	<text name="notice_list_none_found">
+		何も見つかりませんでした。
+	</text>
+	<button label="新しい通知" label_selected="新しい通知を作成" name="create_new_notice"/>
+	<button label="更新" label_selected="リスト更新" name="refresh_notices"/>
+	<panel label="新しい通知を作成" name="panel_create_new_notice">
+		<text name="lbl">
+			通知を作成
+		</text>
+		<text name="lbl2">
+			持ち物からこのパネルにアイテムを 1 つドラッグして添付できます。 添付するアイテムはコピーと再販・プレゼントが可能でなければなりません。また、フォルダは送れません。
+		</text>
+		<text name="lbl3">
+			件名:
+		</text>
+		<text name="lbl4">
+			メッセージ:
+		</text>
+		<text name="lbl5">
+			添付:
+		</text>
+		<button label="添付物を削除" label_selected="添付物を削除" name="remove_attachment"/>
+		<button label="送信" label_selected="通知を送信" name="send_notice"/>
+		<panel name="drop_target" tool_tip="持ち物からアイテムをメッセージ欄にドラッグしてください。通知と一緒に送信されます。送信するにはコピー、譲渡が可能なオブジェクトである必要があります。"/>
+	</panel>
+	<panel label="過去の通知を表示" name="panel_view_past_notice">
+		<text name="lbl">
+			アーカイブ通知
+		</text>
+		<text name="lbl2">
+			新しい通知の送信は、上の[新しい通知を作成する]をクリックしてください。
+		</text>
+		<text name="lbl3">
+			件名:
+		</text>
+		<text name="lbl4">
+			メッセージ:
+		</text>
+		<button label="添付物を開く" label_selected="添付物を開く" name="open_attachment"/>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_roles.xml b/indra/newview/skins/default/xui/ja/panel_group_roles.xml
index c7e62635e46..963a4ba5e27 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_roles.xml
@@ -1,118 +1,118 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="メンバーと役割" name="roles_tab">
-	<panel.string name="default_needs_apply_text">
-		現在のサブタブに、未適用の変更があります。
-	</panel.string>
-	<panel.string name="want_apply_text">
-		これらの変更を適用しますか?
-	</panel.string>
-	<tab_container name="roles_tab_container">
-		<panel label="メンバー" name="members_sub_tab" tool_tip="メンバー">
-			<panel.string name="help_text">
-				あなたはメンバーに割り当てられた役割を付加、削除できます。
-Ctrl キーを押しながらメンバー名をクリックすると
-複数の人を選択できます。
-			</panel.string>
-			<filter_editor label="メンバーを選別" name="filter_input"/>
-			<name_list name="member_list">
-				<name_list.columns label="メンバー" name="name"/>
-				<name_list.columns label="寄付" name="donated"/>
-				<name_list.columns label="オンライン" name="online"/>
-			</name_list>
-			<button label="招待" name="member_invite"/>
-			<button label="追放" name="member_eject"/>
-		</panel>
-		<panel label="役割" name="roles_sub_tab">
-			<panel.string name="help_text">
-				役割にはタイトルがあり、メンバーが行使可能な
-能力のリストが定義されます。 メンバーは、
-1つまたは複数の役割に属することができます。 1つのグループに対し、
-「全員」と「オーナー」の役割を含めて最高で10の役割を持たせることができます。
-			</panel.string>
-			<panel.string name="cant_delete_role">
-				「全員」と「オーナー」は特別な役割なので、削除できません。
-			</panel.string>
-			<filter_editor label="役割を選別" name="filter_input"/>
-			<scroll_list name="role_list">
-				<scroll_list.columns label="役割" name="name"/>
-				<scroll_list.columns label="肩書き" name="title"/>
-				<scroll_list.columns label="メンバー" name="members"/>
-			</scroll_list>
-			<button label="役割を追加" name="role_create"/>
-			<button label="役割を削除" name="role_delete"/>
-		</panel>
-		<panel label="能力" name="actions_sub_tab" tool_tip="能力の説明文には、どの役割・メンバーがその能力を持つかが書かれています。">
-			<panel.string name="help_text">
-				このグループ内で役割を与えられているメンバーが実行できる操作は、
-能力によって決まります。 さまざまな能力が用意されています。
-			</panel.string>
-			<filter_editor label="能力を選別" name="filter_input"/>
-			<scroll_list name="action_list" tool_tip="能力を選択して詳細を表示します。">
-				<scroll_list.columns label="" name="icon"/>
-				<scroll_list.columns label="" name="action"/>
-			</scroll_list>
-		</panel>
-	</tab_container>
-	<panel name="members_footer">
-		<text name="static">
-			割当られた役割
-		</text>
-		<scroll_list name="member_assigned_roles">
-			<scroll_list.columns label="" name="checkbox"/>
-			<scroll_list.columns label="" name="role"/>
-		</scroll_list>
-		<text name="static2">
-			許可された能力
-		</text>
-		<scroll_list name="member_allowed_actions" tool_tip="許可された能力の詳細は「能力」タブをご覧ください。">
-			<scroll_list.columns label="" name="icon"/>
-			<scroll_list.columns label="" name="action"/>
-		</scroll_list>
-	</panel>
-	<panel name="roles_footer">
-		<text name="static">
-			名前
-		</text>
-		<line_editor name="role_name">
-			従業員
-		</line_editor>
-		<text name="static3">
-			肩書き
-		</text>
-		<line_editor name="role_title">
-			(待機中)
-		</line_editor>
-		<text name="static2">
-			説明
-		</text>
-		<text_editor name="role_description">
-			(待機中)
-		</text_editor>
-		<text name="static4">
-			割当られたメンバー
-		</text>
-		<check_box label="メンバーが公開状態" name="role_visible_in_list" tool_tip="この役割のメンバーをグループ外の人の一般タブに表示するかどうかを設定します。"/>
-		<text name="static5" tool_tip="現在選択されている役割で実行できる能力のリスト">
-			許可された能力
-		</text>
-		<scroll_list name="role_allowed_actions" tool_tip="許可された能力の詳細は「能力」タブをご覧ください。">
-			<scroll_list.columns label="" name="icon"/>
-			<scroll_list.columns label="" name="checkbox"/>
-			<scroll_list.columns label="" name="action"/>
-		</scroll_list>
-	</panel>
-	<panel name="actions_footer">
-		<text name="static">
-			説明
-		</text>
-		<text_editor name="action_description">
-			これは「グループからメンバーを追放する」能力です。 オーナーを追放できるのは、別のオーナーだけです。
-		</text_editor>
-		<text name="static2">
-			役割と能力
-		</text>
-		<text name="static3">
-			能力のあるメンバー
-		</text>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="メンバーと役割" name="roles_tab">
+	<panel.string name="default_needs_apply_text">
+		現在のサブタブに、未適用の変更があります。
+	</panel.string>
+	<panel.string name="want_apply_text">
+		これらの変更を適用しますか?
+	</panel.string>
+	<tab_container name="roles_tab_container">
+		<panel label="メンバー" name="members_sub_tab" tool_tip="メンバー">
+			<panel.string name="help_text">
+				あなたはメンバーに割り当てられた役割を付加、削除できます。
+Ctrl キーを押しながらメンバー名をクリックすると
+複数の人を選択できます。
+			</panel.string>
+			<filter_editor label="メンバーを選別" name="filter_input"/>
+			<name_list name="member_list">
+				<name_list.columns label="メンバー" name="name"/>
+				<name_list.columns label="寄付" name="donated"/>
+				<name_list.columns label="オンライン" name="online"/>
+			</name_list>
+			<button label="招待" name="member_invite"/>
+			<button label="追放" name="member_eject"/>
+		</panel>
+		<panel label="役割" name="roles_sub_tab">
+			<panel.string name="help_text">
+				役割にはタイトルがあり、メンバーが行使可能な
+能力のリストが定義されます。 メンバーは、
+1つまたは複数の役割に属することができます。 1つのグループに対し、
+「全員」と「オーナー」の役割を含めて最高で10の役割を持たせることができます。
+			</panel.string>
+			<panel.string name="cant_delete_role">
+				「全員」と「オーナー」は特別な役割なので、削除できません。
+			</panel.string>
+			<filter_editor label="役割を選別" name="filter_input"/>
+			<scroll_list name="role_list">
+				<scroll_list.columns label="役割" name="name"/>
+				<scroll_list.columns label="肩書き" name="title"/>
+				<scroll_list.columns label="メンバー" name="members"/>
+			</scroll_list>
+			<button label="役割を追加" name="role_create"/>
+			<button label="役割を削除" name="role_delete"/>
+		</panel>
+		<panel label="能力" name="actions_sub_tab" tool_tip="能力の説明文には、どの役割・メンバーがその能力を持つかが書かれています。">
+			<panel.string name="help_text">
+				このグループ内で役割を与えられているメンバーが実行できる操作は、
+能力によって決まります。 さまざまな能力が用意されています。
+			</panel.string>
+			<filter_editor label="能力を選別" name="filter_input"/>
+			<scroll_list name="action_list" tool_tip="能力を選択して詳細を表示します。">
+				<scroll_list.columns label="" name="icon"/>
+				<scroll_list.columns label="" name="action"/>
+			</scroll_list>
+		</panel>
+	</tab_container>
+	<panel name="members_footer">
+		<text name="static">
+			割当られた役割
+		</text>
+		<scroll_list name="member_assigned_roles">
+			<scroll_list.columns label="" name="checkbox"/>
+			<scroll_list.columns label="" name="role"/>
+		</scroll_list>
+		<text name="static2">
+			許可された能力
+		</text>
+		<scroll_list name="member_allowed_actions" tool_tip="許可された能力の詳細は「能力」タブをご覧ください。">
+			<scroll_list.columns label="" name="icon"/>
+			<scroll_list.columns label="" name="action"/>
+		</scroll_list>
+	</panel>
+	<panel name="roles_footer">
+		<text name="static">
+			名前
+		</text>
+		<line_editor name="role_name">
+			従業員
+		</line_editor>
+		<text name="static3">
+			肩書き
+		</text>
+		<line_editor name="role_title">
+			(待機中)
+		</line_editor>
+		<text name="static2">
+			説明
+		</text>
+		<text_editor name="role_description">
+			(待機中)
+		</text_editor>
+		<text name="static4">
+			割当られたメンバー
+		</text>
+		<check_box label="メンバーが公開状態" name="role_visible_in_list" tool_tip="この役割のメンバーをグループ外の人の一般タブに表示するかどうかを設定します。"/>
+		<text name="static5" tool_tip="現在選択されている役割で実行できる能力のリスト">
+			許可された能力
+		</text>
+		<scroll_list name="role_allowed_actions" tool_tip="許可された能力の詳細は「能力」タブをご覧ください。">
+			<scroll_list.columns label="" name="icon"/>
+			<scroll_list.columns label="" name="checkbox"/>
+			<scroll_list.columns label="" name="action"/>
+		</scroll_list>
+	</panel>
+	<panel name="actions_footer">
+		<text name="static">
+			説明
+		</text>
+		<text_editor name="action_description">
+			これは「グループからメンバーを追放する」能力です。 オーナーを追放できるのは、別のオーナーだけです。
+		</text_editor>
+		<text name="static2">
+			役割と能力
+		</text>
+		<text name="static3">
+			能力のあるメンバー
+		</text>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml b/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml
index 4182ca506fb..48f04b2b5db 100644
--- a/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
-	<button label="プロフィールの表示" name="view_profile_btn"/>
-	<button label="フレンドを追加" name="add_friend_btn"/>
-	<button label="共有" name="share_btn"/>
-	<panel name="panel_call_buttons">
-		<button label="コール" name="call_btn"/>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+	<button label="プロフィールの表示" name="view_profile_btn"/>
+	<button label="フレンドを追加" name="add_friend_btn"/>
+	<button label="共有" name="share_btn"/>
+	<panel name="panel_call_buttons">
+		<button label="コール" name="call_btn"/>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml
index d55a78297c8..00b9d5aa47d 100644
--- a/indra/newview/skins/default/xui/ja/panel_login.xml
+++ b/indra/newview/skins/default/xui/ja/panel_login.xml
@@ -1,19 +1,19 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_login">
-	<panel.string name="create_account_url">
-		http://jp.secondlife.com/registration/
-	</panel.string>
-	<panel.string name="forgot_password_url">
-		http://secondlife.com/account/request.php
-	</panel.string>
-	<panel name="login_widgets">
-		<line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] ファーストネーム"/>
-		<line_editor name="last_name_edit" tool_tip="[SECOND_LIFE] ラストネーム"/>
-		<text name="start_location_text">
-			開始位置:
-		</text>
-		<text name="create_new_account_text">
-			新規アカウントを作成
-		</text>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_login">
+	<panel.string name="create_account_url">
+		http://jp.secondlife.com/registration/
+	</panel.string>
+	<panel.string name="forgot_password_url">
+		http://secondlife.com/account/request.php
+	</panel.string>
+	<panel name="login_widgets">
+		<line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] ファーストネーム"/>
+		<line_editor name="last_name_edit" tool_tip="[SECOND_LIFE] ラストネーム"/>
+		<text name="start_location_text">
+			開始位置:
+		</text>
+		<text name="create_new_account_text">
+			新規アカウントを作成
+		</text>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml
index 159a63cd408..04822c8848c 100644
--- a/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="chat_bar">
-	<line_editor label="ここをクリックしてチャットを開始します。" name="chat_box" tool_tip="エンターを押して発言、Ctrl+エンターで叫ぶ。"/>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chat_bar">
+	<line_editor label="ここをクリックしてチャットを開始します。" name="chat_box" tool_tip="エンターを押して発言、Ctrl+エンターで叫ぶ。"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_pick_info.xml b/indra/newview/skins/default/xui/ja/panel_pick_info.xml
index 711a4cf47a3..30fd8d1adcd 100644
--- a/indra/newview/skins/default/xui/ja/panel_pick_info.xml
+++ b/indra/newview/skins/default/xui/ja/panel_pick_info.xml
@@ -1,16 +1,16 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_pick_info">
-	<text name="title" value="ピックの情報"/>
-	<scroll_container name="profile_scroll">
-		<panel name="scroll_content_panel">
-			<text name="pick_name" value="[name]"/>
-			<text name="pick_location" value="[loading...]"/>
-			<text name="pick_desc" value="[description]"/>
-		</panel>
-	</scroll_container>
-	<panel name="buttons">
-		<button label="テレポート" name="teleport_btn"/>
-		<button label="地図" name="show_on_map_btn"/>
-		<button label="編集" name="edit_btn"/>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+	<text name="title" value="ピックの情報"/>
+	<scroll_container name="profile_scroll">
+		<panel name="scroll_content_panel">
+			<text name="pick_name" value="[name]"/>
+			<text name="pick_location" value="[loading...]"/>
+			<text name="pick_desc" value="[description]"/>
+		</panel>
+	</scroll_container>
+	<panel name="buttons">
+		<button label="テレポート" name="teleport_btn"/>
+		<button label="地図" name="show_on_map_btn"/>
+		<button label="編集" name="edit_btn"/>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_picks.xml b/indra/newview/skins/default/xui/ja/panel_picks.xml
index 6a391957e99..984d5f72680 100644
--- a/indra/newview/skins/default/xui/ja/panel_picks.xml
+++ b/indra/newview/skins/default/xui/ja/panel_picks.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="ピック" name="panel_picks">
-	<panel label="bottom_panel" name="edit_panel">
-		<button name="new_btn" tool_tip="現在地を新規ピックに追加"/>
-	</panel>
-	<panel name="buttons_cucks">
-		<button label="地図" name="show_on_map_btn"/>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="ピック" name="panel_picks">
+	<panel label="bottom_panel" name="edit_panel">
+		<button name="new_btn" tool_tip="現在地を新規ピックに追加"/>
+	</panel>
+	<panel name="buttons_cucks">
+		<button label="地図" name="show_on_map_btn"/>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
index 88e10aa832e..193d43311c3 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
@@ -1,42 +1,42 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="チャット" name="chat">
-	<radio_group name="chat_font_size">
-		<radio_item label="小" name="radio"/>
-		<radio_item label="中" name="radio2"/>
-		<radio_item label="大" name="radio3"/>
-	</radio_group>
-	<color_swatch label="自分" name="user"/>
-	<text name="text_box1">
-		ミー
-	</text>
-	<color_swatch label="その他" name="agent"/>
-	<text name="text_box2">
-		その他
-	</text>
-	<color_swatch label="IM" name="im"/>
-	<text name="text_box3">
-		IM
-	</text>
-	<color_swatch label="システム" name="system"/>
-	<text name="text_box4">
-		システム
-	</text>
-	<color_swatch label="エラー" name="script_error"/>
-	<text name="text_box5">
-		エラー
-	</text>
-	<color_swatch label="オブジェクト" name="objects"/>
-	<text name="text_box6">
-		オブジェクト
-	</text>
-	<color_swatch label="所有者" name="owner"/>
-	<text name="text_box7">
-		所有者
-	</text>
-	<color_swatch label="URL" name="links"/>
-	<text name="text_box9">
-		URL
-	</text>
-	<check_box initial_value="true" label="チャット中はタイピング動作のアニメーションを再生" name="play_typing_animation"/>
-	<check_box label="オフライン時に受け取った IM をメールで送信" name="send_im_to_email"/>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="チャット" name="chat">
+	<radio_group name="chat_font_size">
+		<radio_item label="小" name="radio"/>
+		<radio_item label="中" name="radio2"/>
+		<radio_item label="大" name="radio3"/>
+	</radio_group>
+	<color_swatch label="自分" name="user"/>
+	<text name="text_box1">
+		ミー
+	</text>
+	<color_swatch label="その他" name="agent"/>
+	<text name="text_box2">
+		その他
+	</text>
+	<color_swatch label="IM" name="im"/>
+	<text name="text_box3">
+		IM
+	</text>
+	<color_swatch label="システム" name="system"/>
+	<text name="text_box4">
+		システム
+	</text>
+	<color_swatch label="エラー" name="script_error"/>
+	<text name="text_box5">
+		エラー
+	</text>
+	<color_swatch label="オブジェクト" name="objects"/>
+	<text name="text_box6">
+		オブジェクト
+	</text>
+	<color_swatch label="所有者" name="owner"/>
+	<text name="text_box7">
+		所有者
+	</text>
+	<color_swatch label="URL" name="links"/>
+	<text name="text_box9">
+		URL
+	</text>
+	<check_box initial_value="true" label="チャット中はタイピング動作のアニメーションを再生" name="play_typing_animation"/>
+	<check_box label="オフライン時に受け取った IM をメールで送信" name="send_im_to_email"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
index 7c02baedc0a..fba2c5f18da 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
@@ -1,116 +1,116 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="表示" name="Display panel">
-	<text name="WindowSizeLabel">
-		ウィンドウ・サイズ:
-	</text>
-	<check_box label="全画面" name="windowed mode"/>
-	<combo_box name="windowsize combo">
-		<combo_box.item label="640x480" name="640x480"/>
-		<combo_box.item label="800x600" name="800x600"/>
-		<combo_box.item label="720x480 (NTSC)" name="720x480"/>
-		<combo_box.item label="768x576 (PAL)" name="768x576"/>
-		<combo_box.item label="1024x768" name="1024x768"/>
-	</combo_box>
-	<text name="UI Size:">
-		UIサイズ:
-	</text>
-	<text name="QualitySpeed">
-		クオリティとスピード:
-	</text>
-	<text name="FasterText">
-		速い
-	</text>
-	<text name="BetterText">
-		速
-	</text>
-	<text name="ShadersPrefText">
-		低
-	</text>
-	<text name="ShadersPrefText2">
-		中
-	</text>
-	<text name="ShadersPrefText3">
-		高
-	</text>
-	<text name="ShadersPrefText4">
-		超高
-	</text>
-	<panel label="CustomGraphics" name="CustomGraphics Panel">
-		<text name="ShadersText">
-			シェーダー:
-		</text>
-		<check_box initial_value="true" label="バンプ・マッピングと光沢" name="BumpShiny"/>
-		<check_box initial_value="true" label="基本シェーダー" name="BasicShaders" tool_tip="このオプションを無効にするとグラフィック・カード・ドライバの種類によってはクラッシュ防止になります。"/>
-		<check_box initial_value="true" label="周囲(大気)シェーダー" name="WindLightUseAtmosShaders"/>
-		<check_box initial_value="true" label="水の反射" name="Reflections"/>
-		<text name="ReflectionDetailText">
-			反射詳細:
-		</text>
-		<radio_group name="ReflectionDetailRadio">
-			<radio_item label="地形と樹木" name="0"/>
-			<radio_item label="すべての静的オブジェクト" name="1"/>
-			<radio_item label="すべてのアバターとオブジェクト" name="2"/>
-			<radio_item label="すべて" name="3"/>
-		</radio_group>
-		<text name="AvatarRenderingText">
-			アバター表示:
-		</text>
-		<check_box initial_value="true" label="アバターの精度を下げる" name="AvatarImpostors"/>
-		<check_box initial_value="true" label="ハードウェア・スキニング" name="AvatarVertexProgram"/>
-		<check_box initial_value="true" label="アバターの服" name="AvatarCloth"/>
-		<slider label="描画距離:" name="DrawDistance"/>
-		<text name="DrawDistanceMeterText2">
-			m
-		</text>
-		<slider label="最大パーティクル数:" name="MaxParticleCount"/>
-		<slider label="ポストプロセス品質:" name="RenderPostProcess"/>
-		<text name="MeshDetailText">
-			メッシュ詳細:
-		</text>
-		<slider label="  オブジェクト:" name="ObjectMeshDetail"/>
-		<slider label="  フレキシプリム:" name="FlexibleMeshDetail"/>
-		<slider label="  樹木:" name="TreeMeshDetail"/>
-		<slider label="  アバター:" name="AvatarMeshDetail"/>
-		<slider label="  地形:" name="TerrainMeshDetail"/>
-		<slider label="  空:" name="SkyMeshDetail"/>
-		<text name="PostProcessText">
-			低
-		</text>
-		<text name="ObjectMeshDetailText">
-			低
-		</text>
-		<text name="FlexibleMeshDetailText">
-			低
-		</text>
-		<text name="TreeMeshDetailText">
-			低
-		</text>
-		<text name="AvatarMeshDetailText">
-			低
-		</text>
-		<text name="TerrainMeshDetailText">
-			低
-		</text>
-		<text name="SkyMeshDetailText">
-			低
-		</text>
-		<text name="LightingDetailText">
-			ライティング詳細:
-		</text>
-		<radio_group name="LightingDetailRadio">
-			<radio_item label="太陽と月のみ" name="SunMoon"/>
-			<radio_item label="近隣のローカル・ライト" name="LocalLights"/>
-		</radio_group>
-		<text name="TerrainDetailText">
-			地形詳細:
-		</text>
-		<radio_group name="TerrainDetailRadio">
-			<radio_item label="低" name="0"/>
-			<radio_item label="高" name="2"/>
-		</radio_group>
-	</panel>
-	<button label="適用" label_selected="適用" name="Apply"/>
-	<button label="リセット" name="Defaults"/>
-	<button label="詳しい設定" name="Advanced"/>
-	<button label="ハードウェア" label_selected="ハードウェア" name="GraphicsHardwareButton"/>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="表示" name="Display panel">
+	<text name="WindowSizeLabel">
+		ウィンドウ・サイズ:
+	</text>
+	<check_box label="全画面" name="windowed mode"/>
+	<combo_box name="windowsize combo">
+		<combo_box.item label="640x480" name="640x480"/>
+		<combo_box.item label="800x600" name="800x600"/>
+		<combo_box.item label="720x480 (NTSC)" name="720x480"/>
+		<combo_box.item label="768x576 (PAL)" name="768x576"/>
+		<combo_box.item label="1024x768" name="1024x768"/>
+	</combo_box>
+	<text name="UI Size:">
+		UIサイズ:
+	</text>
+	<text name="QualitySpeed">
+		クオリティとスピード:
+	</text>
+	<text name="FasterText">
+		速い
+	</text>
+	<text name="BetterText">
+		速
+	</text>
+	<text name="ShadersPrefText">
+		低
+	</text>
+	<text name="ShadersPrefText2">
+		中
+	</text>
+	<text name="ShadersPrefText3">
+		高
+	</text>
+	<text name="ShadersPrefText4">
+		超高
+	</text>
+	<panel label="CustomGraphics" name="CustomGraphics Panel">
+		<text name="ShadersText">
+			シェーダー:
+		</text>
+		<check_box initial_value="true" label="バンプ・マッピングと光沢" name="BumpShiny"/>
+		<check_box initial_value="true" label="基本シェーダー" name="BasicShaders" tool_tip="このオプションを無効にするとグラフィック・カード・ドライバの種類によってはクラッシュ防止になります。"/>
+		<check_box initial_value="true" label="周囲(大気)シェーダー" name="WindLightUseAtmosShaders"/>
+		<check_box initial_value="true" label="水の反射" name="Reflections"/>
+		<text name="ReflectionDetailText">
+			反射詳細:
+		</text>
+		<radio_group name="ReflectionDetailRadio">
+			<radio_item label="地形と樹木" name="0"/>
+			<radio_item label="すべての静的オブジェクト" name="1"/>
+			<radio_item label="すべてのアバターとオブジェクト" name="2"/>
+			<radio_item label="すべて" name="3"/>
+		</radio_group>
+		<text name="AvatarRenderingText">
+			アバター表示:
+		</text>
+		<check_box initial_value="true" label="アバターの精度を下げる" name="AvatarImpostors"/>
+		<check_box initial_value="true" label="ハードウェア・スキニング" name="AvatarVertexProgram"/>
+		<check_box initial_value="true" label="アバターの服" name="AvatarCloth"/>
+		<slider label="描画距離:" name="DrawDistance"/>
+		<text name="DrawDistanceMeterText2">
+			m
+		</text>
+		<slider label="最大パーティクル数:" name="MaxParticleCount"/>
+		<slider label="ポストプロセス品質:" name="RenderPostProcess"/>
+		<text name="MeshDetailText">
+			メッシュ詳細:
+		</text>
+		<slider label="  オブジェクト:" name="ObjectMeshDetail"/>
+		<slider label="  フレキシプリム:" name="FlexibleMeshDetail"/>
+		<slider label="  樹木:" name="TreeMeshDetail"/>
+		<slider label="  アバター:" name="AvatarMeshDetail"/>
+		<slider label="  地形:" name="TerrainMeshDetail"/>
+		<slider label="  空:" name="SkyMeshDetail"/>
+		<text name="PostProcessText">
+			低
+		</text>
+		<text name="ObjectMeshDetailText">
+			低
+		</text>
+		<text name="FlexibleMeshDetailText">
+			低
+		</text>
+		<text name="TreeMeshDetailText">
+			低
+		</text>
+		<text name="AvatarMeshDetailText">
+			低
+		</text>
+		<text name="TerrainMeshDetailText">
+			低
+		</text>
+		<text name="SkyMeshDetailText">
+			低
+		</text>
+		<text name="LightingDetailText">
+			ライティング詳細:
+		</text>
+		<radio_group name="LightingDetailRadio">
+			<radio_item label="太陽と月のみ" name="SunMoon"/>
+			<radio_item label="近隣のローカル・ライト" name="LocalLights"/>
+		</radio_group>
+		<text name="TerrainDetailText">
+			地形詳細:
+		</text>
+		<radio_group name="TerrainDetailRadio">
+			<radio_item label="低" name="0"/>
+			<radio_item label="高" name="2"/>
+		</radio_group>
+	</panel>
+	<button label="適用" label_selected="適用" name="Apply"/>
+	<button label="リセット" name="Defaults"/>
+	<button label="詳しい設定" name="Advanced"/>
+	<button label="ハードウェア" label_selected="ハードウェア" name="GraphicsHardwareButton"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
index f7b727de6c8..e0122d123f3 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
@@ -1,20 +1,20 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="チャット設定" name="im">
-	<panel.string name="log_in_to_change">
-		ログインして変更してください
-	</panel.string>
-	<button label="履歴の消去" name="clear_cache"/>
-	<text name="cache_size_label_l">
-		(位置、画像、web、検索履歴)
-	</text>
-	<check_box label="フレンドとグループのみオンライン状況の確認可能" name="online_visibility"/>
-	<check_box label="フレンドとグループのみコールとIMの受信可能" name="voice_call_friends_only_check"/>
-	<check_box label="コールが終了したらマイクのスイッチを切る" name="auto_disengage_mic_check"/>
-	<check_box label="Cookieを受け入れる" name="cookies_enabled"/>
-	<check_box label="コンピューターにログを保存" name="log_instant_messages"/>
-	<radio_group name="ChatIMLogs">
-		<radio_item label="チャット" name="radio1"/>
-		<radio_item label="IM" name="radio2"/>
-	</radio_group>
-	<button label="ブラウズ" label_selected="ブラウズ" name="log_path_button"/>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="チャット設定" name="im">
+	<panel.string name="log_in_to_change">
+		ログインして変更してください
+	</panel.string>
+	<button label="履歴の消去" name="clear_cache"/>
+	<text name="cache_size_label_l">
+		(位置、画像、web、検索履歴)
+	</text>
+	<check_box label="フレンドとグループのみオンライン状況の確認可能" name="online_visibility"/>
+	<check_box label="フレンドとグループのみコールとIMの受信可能" name="voice_call_friends_only_check"/>
+	<check_box label="コールが終了したらマイクのスイッチを切る" name="auto_disengage_mic_check"/>
+	<check_box label="Cookieを受け入れる" name="cookies_enabled"/>
+	<check_box label="コンピューターにログを保存" name="log_instant_messages"/>
+	<radio_group name="ChatIMLogs">
+		<radio_item label="チャット" name="radio1"/>
+		<radio_item label="IM" name="radio2"/>
+	</radio_group>
+	<button label="ブラウズ" label_selected="ブラウズ" name="log_path_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
index 59357a366e1..af8390ba5c3 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
@@ -1,46 +1,46 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="操作とカメラ" name="Input panel">
-	<button label="その他のディバイス" name="joystick_setup_button"/>
-	<text name="Mouselook:">
-		一人称視点:
-	</text>
-	<text name=" Mouse Sensitivity">
-		マウスの精度
-	</text>
-	<check_box label="切り替え" name="invert_mouse"/>
-	<text name="Network:">
-		ネットワーク:
-	</text>
-	<text name="Maximum bandwidth">
-		最大帯域幅
-	</text>
-	<text name="text_box2">
-		kbps
-	</text>
-	<check_box label="カスタムポート" name="connection_port_enabled"/>
-	<spinner label="ポート番号:" name="web_proxy_port"/>
-	<text name="cache_size_label_l">
-		キャッシュサイズ
-	</text>
-	<text name="text_box5">
-		MB
-	</text>
-	<button label="ブラウズ" label_selected="ブラウズ" name="set_cache"/>
-	<button label="リセット" label_selected="設定" name="reset_cache"/>
-	<text name="Cache location">
-		キャッシュの場所
-	</text>
-	<text name="Web:">
-		Web:
-	</text>
-	<radio_group name="use_external_browser">
-		<radio_item label="内蔵ブラウザを使用" name="internal" tool_tip="内蔵ブラウザでヘルプやWebリンクなどを見ます。[APP_NAME] 内に新しいウィンドウでこのブラウザが開きます。"/>
-		<radio_item label="外部ブラウザ(IEやFirefox)を使用" name="external" tool_tip="デフォルトのシステムWebブラウザでヘルプやWebリンク先などを見ます。全画面で起動中にはおすすめしません。"/>
-	</radio_group>
-	<check_box initial_value="false" label="Webプロキシ" name="web_proxy_enabled"/>
-	<line_editor name="web_proxy_editor" tool_tip="使用するプロキシ名またはIPアドレス"/>
-	<button label="ブラウズ" label_selected="ブラウズ" name="set_proxy"/>
-	<text name="Proxy location">
-		プロキシ
-	</text>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="操作とカメラ" name="Input panel">
+	<button label="その他のディバイス" name="joystick_setup_button"/>
+	<text name="Mouselook:">
+		一人称視点:
+	</text>
+	<text name=" Mouse Sensitivity">
+		マウスの精度
+	</text>
+	<check_box label="切り替え" name="invert_mouse"/>
+	<text name="Network:">
+		ネットワーク:
+	</text>
+	<text name="Maximum bandwidth">
+		最大帯域幅
+	</text>
+	<text name="text_box2">
+		kbps
+	</text>
+	<check_box label="カスタムポート" name="connection_port_enabled"/>
+	<spinner label="ポート番号:" name="web_proxy_port"/>
+	<text name="cache_size_label_l">
+		キャッシュサイズ
+	</text>
+	<text name="text_box5">
+		MB
+	</text>
+	<button label="ブラウズ" label_selected="ブラウズ" name="set_cache"/>
+	<button label="リセット" label_selected="設定" name="reset_cache"/>
+	<text name="Cache location">
+		キャッシュの場所
+	</text>
+	<text name="Web:">
+		Web:
+	</text>
+	<radio_group name="use_external_browser">
+		<radio_item label="内蔵ブラウザを使用" name="internal" tool_tip="内蔵ブラウザでヘルプやWebリンクなどを見ます。[APP_NAME] 内に新しいウィンドウでこのブラウザが開きます。"/>
+		<radio_item label="外部ブラウザ(IEやFirefox)を使用" name="external" tool_tip="デフォルトのシステムWebブラウザでヘルプやWebリンク先などを見ます。全画面で起動中にはおすすめしません。"/>
+	</radio_group>
+	<check_box initial_value="false" label="Webプロキシ" name="web_proxy_enabled"/>
+	<line_editor name="web_proxy_editor" tool_tip="使用するプロキシ名またはIPアドレス"/>
+	<button label="ブラウズ" label_selected="ブラウズ" name="set_proxy"/>
+	<text name="Proxy location">
+		プロキシ
+	</text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
index c4bd21a5baf..499f57d75e1 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
@@ -1,72 +1,72 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="音声とビデオ" name="Preference Media panel">
-	<slider label="音量" name="System Volume"/>
-	<slider label="風の音量" name="Wind Volume"/>
-	<slider label="サウンド" name="SFX Volume"/>
-	<slider label="メディア" name="Media Volume"/>
-	<slider label="UI" name="UI Volume"/>
-	<slider label="ミュージック" name="Music Volume"/>
-	<slider label="ボイス" name="Voice Volume"/>
-	<text_editor name="voice_unavailable">
-		ボイスチャットを利用できません
-	</text_editor>
-	<check_box label="ボイスチャット" name="enable_voice_check"/>
-	<radio_group name="ear_location">
-		<radio_item label="カメラの位置から聞く" name="0"/>
-		<radio_item label="アバターの位置から聞く" name="1"/>
-	</radio_group>
-	<button label="機器の設定" name="device_settings_btn"/>
-	<text name="muting_text">
-		ボリューム:
-	</text>
-	<check_box label="オーディオをミュート" name="disable audio"/>
-	<text name="streaming_prefs_text">
-		ストリーム環境設定:
-	</text>
-	<text name="audio_prefs_text">
-		オーディオ環境設定:
-	</text>
-	<panel label="ボリューム" name="Volume Panel"/>
-	<check_box label="メディアを自動再生" name="auto_streaming_video"/>
-	<check_box label="最小化でミュート" name="mute_when_minimized"/>
-	<text name="streaming_text">
-		ストリーミング:
-	</text>
-	<check_box label="音楽がある場合再生する" name="streaming_music"/>
-	<check_box label="ストリーミング・メディア使用可時に再生" name="streaming_video"/>
-	<text name="system_volume_text">
-		サウンド効果:
-	</text>
-	<text name="wind_volume_text">
-		風の音量:
-	</text>
-	<text name="footsteps_volume_text">
-		足音:
-	</text>
-	<text name="ui_volume_text">
-		UI音量:
-	</text>
-	<slider label="ドップラー効果" name="Doppler Effect"/>
-	<slider label="遠隔要因" name="Distance Factor"/>
-	<slider label="ロールオフ係数" name="Rolloff Factor"/>
-	<spinner label="L$変更基準点" name="L$ Change Threshold"/>
-	<spinner label="ヘルス変化基準点" name="Health Change Threshold"/>
-	<text name="doppler_effect_text">
-		オーディオ環境設定:
-	</text>
-	<text name="distance_factor_text">
-		距離係数:
-	</text>
-	<text name="rolloff_factor_text">
-		ロールオフ:
-	</text>
-	<text name="default_upload_bitrate_text">
-		デフォルトUL速度:
-	</text>
-	<radio_group name="bitrate">
-		<radio_item label="32kbps" name="32kbps"/>
-		<radio_item label="64kbps" name="64kbps"/>
-		<radio_item label="96kbps" name="96kbps"/>
-		<radio_item label="128kbps" name="128kbps"/>
-	</radio_group>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="音声とビデオ" name="Preference Media panel">
+	<slider label="音量" name="System Volume"/>
+	<slider label="風の音量" name="Wind Volume"/>
+	<slider label="サウンド" name="SFX Volume"/>
+	<slider label="メディア" name="Media Volume"/>
+	<slider label="UI" name="UI Volume"/>
+	<slider label="ミュージック" name="Music Volume"/>
+	<slider label="ボイス" name="Voice Volume"/>
+	<text_editor name="voice_unavailable">
+		ボイスチャットを利用できません
+	</text_editor>
+	<check_box label="ボイスチャット" name="enable_voice_check"/>
+	<radio_group name="ear_location">
+		<radio_item label="カメラの位置から聞く" name="0"/>
+		<radio_item label="アバターの位置から聞く" name="1"/>
+	</radio_group>
+	<button label="機器の設定" name="device_settings_btn"/>
+	<text name="muting_text">
+		ボリューム:
+	</text>
+	<check_box label="オーディオをミュート" name="disable audio"/>
+	<text name="streaming_prefs_text">
+		ストリーム環境設定:
+	</text>
+	<text name="audio_prefs_text">
+		オーディオ環境設定:
+	</text>
+	<panel label="ボリューム" name="Volume Panel"/>
+	<check_box label="メディアを自動再生" name="auto_streaming_video"/>
+	<check_box label="最小化でミュート" name="mute_when_minimized"/>
+	<text name="streaming_text">
+		ストリーミング:
+	</text>
+	<check_box label="音楽がある場合再生する" name="streaming_music"/>
+	<check_box label="ストリーミング・メディア使用可時に再生" name="streaming_video"/>
+	<text name="system_volume_text">
+		サウンド効果:
+	</text>
+	<text name="wind_volume_text">
+		風の音量:
+	</text>
+	<text name="footsteps_volume_text">
+		足音:
+	</text>
+	<text name="ui_volume_text">
+		UI音量:
+	</text>
+	<slider label="ドップラー効果" name="Doppler Effect"/>
+	<slider label="遠隔要因" name="Distance Factor"/>
+	<slider label="ロールオフ係数" name="Rolloff Factor"/>
+	<spinner label="L$変更基準点" name="L$ Change Threshold"/>
+	<spinner label="ヘルス変化基準点" name="Health Change Threshold"/>
+	<text name="doppler_effect_text">
+		オーディオ環境設定:
+	</text>
+	<text name="distance_factor_text">
+		距離係数:
+	</text>
+	<text name="rolloff_factor_text">
+		ロールオフ:
+	</text>
+	<text name="default_upload_bitrate_text">
+		デフォルトUL速度:
+	</text>
+	<radio_group name="bitrate">
+		<radio_item label="32kbps" name="32kbps"/>
+		<radio_item label="64kbps" name="64kbps"/>
+		<radio_item label="96kbps" name="96kbps"/>
+		<radio_item label="128kbps" name="128kbps"/>
+	</radio_group>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile.xml b/indra/newview/skins/default/xui/ja/panel_profile.xml
index ff82043a0d9..8c94833a54a 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile.xml
@@ -1,41 +1,41 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="プロフィール" name="panel_profile">
-	<string name="CaptionTextAcctInfo">
-		[ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-	</string>
-	<string name="payment_update_link_url">
-		http://www.secondlife.com/account/billing.php?lang=ja
-	</string>
-	<string name="my_account_link_url" value="http://secondlife.com/account"/>
-	<string name="no_partner_text" value="なし"/>
-	<scroll_container name="profile_scroll">
-		<panel name="scroll_content_panel">
-			<panel name="second_life_image_panel">
-				<text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
-			</panel>
-			<panel name="first_life_image_panel">
-				<text name="title_rw_descr_text" value="現実世界:"/>
-			</panel>
-			<text name="me_homepage_text">
-				Webサイト:
-			</text>
-			<text name="title_member_text" value="メンバー登録:"/>
-			<text name="title_acc_status_text" value="アカウントの状態:"/>
-			<text name="title_partner_text" value="パートナー:"/>
-			<panel name="partner_data_panel">
-				<text name="partner_text" value="[FIRST] [LAST]"/>
-			</panel>
-			<text name="title_groups_text" value="グループ:"/>
-		</panel>
-	</scroll_container>
-	<panel name="profile_buttons_panel">
-		<button label="フレンド登録" name="add_friend"/>
-		<button label="IM" name="im"/>
-		<button label="コール" name="call"/>
-		<button label="テレポート" name="teleport"/>
-	</panel>
-	<panel name="profile_me_buttons_panel">
-		<button label="プロフィールの編集" name="edit_profile_btn"/>
-		<button label="容姿の編集" name="edit_appearance_btn"/>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="プロフィール" name="panel_profile">
+	<string name="CaptionTextAcctInfo">
+		[ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+	</string>
+	<string name="payment_update_link_url">
+		http://www.secondlife.com/account/billing.php?lang=ja
+	</string>
+	<string name="my_account_link_url" value="http://secondlife.com/account"/>
+	<string name="no_partner_text" value="なし"/>
+	<scroll_container name="profile_scroll">
+		<panel name="scroll_content_panel">
+			<panel name="second_life_image_panel">
+				<text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+			</panel>
+			<panel name="first_life_image_panel">
+				<text name="title_rw_descr_text" value="現実世界:"/>
+			</panel>
+			<text name="me_homepage_text">
+				Webサイト:
+			</text>
+			<text name="title_member_text" value="メンバー登録:"/>
+			<text name="title_acc_status_text" value="アカウントの状態:"/>
+			<text name="title_partner_text" value="パートナー:"/>
+			<panel name="partner_data_panel">
+				<text name="partner_text" value="[FIRST] [LAST]"/>
+			</panel>
+			<text name="title_groups_text" value="グループ:"/>
+		</panel>
+	</scroll_container>
+	<panel name="profile_buttons_panel">
+		<button label="フレンド登録" name="add_friend"/>
+		<button label="IM" name="im"/>
+		<button label="コール" name="call"/>
+		<button label="テレポート" name="teleport"/>
+	</panel>
+	<panel name="profile_me_buttons_panel">
+		<button label="プロフィールの編集" name="edit_profile_btn"/>
+		<button label="容姿の編集" name="edit_appearance_btn"/>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile_view.xml b/indra/newview/skins/default/xui/ja/panel_profile_view.xml
index 7663851f61a..4aa2d5d9475 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile_view.xml
@@ -1,15 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
-	<string name="status_online">
-		オンライン
-	</string>
-	<string name="status_offline">
-		オフライン
-	</string>
-	<text name="user_name" value="(ローディング...)"/>
-	<text name="status" value="オンライン"/>
-	<tab_container name="tabs">
-		<panel label="プロフィール" name="panel_profile"/>
-		<panel label="ピック" name="panel_picks"/>
-	</tab_container>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_target_profile">
+	<string name="status_online">
+		オンライン
+	</string>
+	<string name="status_offline">
+		オフライン
+	</string>
+	<text name="user_name" value="(ローディング...)"/>
+	<text name="status" value="オンライン"/>
+	<tab_container name="tabs">
+		<panel label="プロフィール" name="panel_profile"/>
+		<panel label="ピック" name="panel_picks"/>
+	</tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_script_ed.xml b/indra/newview/skins/default/xui/ja/panel_script_ed.xml
index 596d59b5777..a7305fa7636 100644
--- a/indra/newview/skins/default/xui/ja/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/ja/panel_script_ed.xml
@@ -1,43 +1,43 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="script panel">
-	<panel.string name="loading">
-		ローディング...
-	</panel.string>
-	<panel.string name="can_not_view">
-		このスクリプトは「コピー不可」のため、表示・編集することができません。 オブジェクト内のスクリプトの表示・編集には、全権限が必要です。
-	</panel.string>
-	<panel.string name="public_objects_can_not_run">
-		公共のオブジェクトではスクリプトを実行できません
-	</panel.string>
-	<panel.string name="script_running">
-		実行中
-	</panel.string>
-	<panel.string name="Title">
-		スクリプト: [NAME]
-	</panel.string>
-	<text_editor name="Script Editor">
-		ローディング...
-	</text_editor>
-	<button label="保存" label_selected="保存" name="Save_btn"/>
-	<combo_box label="挿入..." name="Insert..."/>
-	<menu_bar name="script_menu">
-		<menu label="ファイル" name="File">
-			<menu_item_call label="保存" name="Save"/>
-			<menu_item_call label="変更を元に戻す" name="Revert All Changes"/>
-		</menu>
-		<menu label="編集" name="Edit">
-			<menu_item_call label="元に戻す" name="Undo"/>
-			<menu_item_call label="やり直し" name="Redo"/>
-			<menu_item_call label="切り取り" name="Cut"/>
-			<menu_item_call label="コピー" name="Copy"/>
-			<menu_item_call label="貼り付け" name="Paste"/>
-			<menu_item_call label="すべて選択" name="Select All"/>
-			<menu_item_call label="選択解除" name="Deselect"/>
-			<menu_item_call label="検索 / 再配置..." name="Search / Replace..."/>
-		</menu>
-		<menu label="ヘルプ" name="Help">
-			<menu_item_call label="ヘルプ..." name="Help..."/>
-			<menu_item_call label="キーワードヘルプ..." name="Keyword Help..."/>
-		</menu>
-	</menu_bar>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="script panel">
+	<panel.string name="loading">
+		ローディング...
+	</panel.string>
+	<panel.string name="can_not_view">
+		このスクリプトは「コピー不可」のため、表示・編集することができません。 オブジェクト内のスクリプトの表示・編集には、全権限が必要です。
+	</panel.string>
+	<panel.string name="public_objects_can_not_run">
+		公共のオブジェクトではスクリプトを実行できません
+	</panel.string>
+	<panel.string name="script_running">
+		実行中
+	</panel.string>
+	<panel.string name="Title">
+		スクリプト: [NAME]
+	</panel.string>
+	<text_editor name="Script Editor">
+		ローディング...
+	</text_editor>
+	<button label="保存" label_selected="保存" name="Save_btn"/>
+	<combo_box label="挿入..." name="Insert..."/>
+	<menu_bar name="script_menu">
+		<menu label="ファイル" name="File">
+			<menu_item_call label="保存" name="Save"/>
+			<menu_item_call label="変更を元に戻す" name="Revert All Changes"/>
+		</menu>
+		<menu label="編集" name="Edit">
+			<menu_item_call label="元に戻す" name="Undo"/>
+			<menu_item_call label="やり直し" name="Redo"/>
+			<menu_item_call label="切り取り" name="Cut"/>
+			<menu_item_call label="コピー" name="Copy"/>
+			<menu_item_call label="貼り付け" name="Paste"/>
+			<menu_item_call label="すべて選択" name="Select All"/>
+			<menu_item_call label="選択解除" name="Deselect"/>
+			<menu_item_call label="検索 / 再配置..." name="Search / Replace..."/>
+		</menu>
+		<menu label="ヘルプ" name="Help">
+			<menu_item_call label="ヘルプ..." name="Help..."/>
+			<menu_item_call label="キーワードヘルプ..." name="Keyword Help..."/>
+		</menu>
+	</menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml
index aea057657eb..2308aff19bd 100644
--- a/indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml
+++ b/indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
-<panel name="panel_stand_stop_flying">
-	<button label="立ち上がる" name="stand_btn" tool_tip="ここをクリックして立ち上がります。"/>
-	<button label="飛行停止" name="stop_fly_btn" tool_tip="飛行停止"/>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
+<panel name="panel_stand_stop_flying">
+	<button label="立ち上がる" name="stand_btn" tool_tip="ここをクリックして立ち上がります。"/>
+	<button label="飛行停止" name="stop_fly_btn" tool_tip="飛行停止"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_status_bar.xml b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
index 05f29b75908..a58a6d68aad 100644
--- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
@@ -1,22 +1,22 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="status">
-	<panel.string name="StatBarDaysOfWeek">
-		日曜日:月曜日:火曜日:水曜日:木曜日:金曜日:土曜日
-	</panel.string>
-	<panel.string name="StatBarMonthsOfYear">
-		1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月
-	</panel.string>
-	<panel.string name="packet_loss_tooltip">
-		パケット損失
-	</panel.string>
-	<panel.string name="bandwidth_tooltip">
-		帯域幅
-	</panel.string>
-	<panel.string name="buycurrencylabel">
-		L$ [AMT]
-	</panel.string>
-	<button label="" label_selected="" name="buycurrency" tool_tip="私の残高: ここをクリックして L$ を購入"/>
-	<text name="TimeText" tool_tip="現在時刻(太平洋時)">
-		12:00 AM
-	</text>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="status">
+	<panel.string name="StatBarDaysOfWeek">
+		日曜日:月曜日:火曜日:水曜日:木曜日:金曜日:土曜日
+	</panel.string>
+	<panel.string name="StatBarMonthsOfYear">
+		1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月
+	</panel.string>
+	<panel.string name="packet_loss_tooltip">
+		パケット損失
+	</panel.string>
+	<panel.string name="bandwidth_tooltip">
+		帯域幅
+	</panel.string>
+	<panel.string name="buycurrencylabel">
+		L$ [AMT]
+	</panel.string>
+	<button label="" label_selected="" name="buycurrency" tool_tip="私の残高: ここをクリックして L$ を購入"/>
+	<text name="TimeText" tool_tip="現在時刻(太平洋時)">
+		12:00 AM
+	</text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_world_map.xml b/indra/newview/skins/default/xui/ja/panel_world_map.xml
index 6cf008c5149..2f5c2bf6a18 100644
--- a/indra/newview/skins/default/xui/ja/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/ja/panel_world_map.xml
@@ -1,57 +1,57 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="world_map">
-	<panel.string name="Loading">
-		ローディング...
-	</panel.string>
-	<panel.string name="InvalidLocation">
-		無効な位置
-	</panel.string>
-	<panel.string name="world_map_north">
-		北
-	</panel.string>
-	<panel.string name="world_map_east">
-		東
-	</panel.string>
-	<panel.string name="world_map_west">
-		西
-	</panel.string>
-	<panel.string name="world_map_south">
-		南
-	</panel.string>
-	<panel.string name="world_map_southeast">
-		南東
-	</panel.string>
-	<panel.string name="world_map_northeast">
-		北東
-	</panel.string>
-	<panel.string name="world_map_southwest">
-		南西
-	</panel.string>
-	<panel.string name="world_map_northwest">
-		北西
-	</panel.string>
-	<text label="北" name="floater_map_north" text="北">
-		北
-	</text>
-	<text label="東" name="floater_map_east" text="東">
-		東
-	</text>
-	<text label="西" name="floater_map_west" text="西">
-		西
-	</text>
-	<text label="南" name="floater_map_south" text="南">
-		南
-	</text>
-	<text label="南東" name="floater_map_southeast" text="南東">
-		南東
-	</text>
-	<text label="北東" name="floater_map_northeast" text="北東">
-		北東
-	</text>
-	<text label="南西" name="floater_map_southwest" text="南西">
-		南西
-	</text>
-	<text label="北西" name="floater_map_northwest" text="北西">
-		北西
-	</text>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="world_map">
+	<panel.string name="Loading">
+		ローディング...
+	</panel.string>
+	<panel.string name="InvalidLocation">
+		無効な位置
+	</panel.string>
+	<panel.string name="world_map_north">
+		北
+	</panel.string>
+	<panel.string name="world_map_east">
+		東
+	</panel.string>
+	<panel.string name="world_map_west">
+		西
+	</panel.string>
+	<panel.string name="world_map_south">
+		南
+	</panel.string>
+	<panel.string name="world_map_southeast">
+		南東
+	</panel.string>
+	<panel.string name="world_map_northeast">
+		北東
+	</panel.string>
+	<panel.string name="world_map_southwest">
+		南西
+	</panel.string>
+	<panel.string name="world_map_northwest">
+		北西
+	</panel.string>
+	<text label="北" name="floater_map_north" text="北">
+		北
+	</text>
+	<text label="東" name="floater_map_east" text="東">
+		東
+	</text>
+	<text label="西" name="floater_map_west" text="西">
+		西
+	</text>
+	<text label="南" name="floater_map_south" text="南">
+		南
+	</text>
+	<text label="南東" name="floater_map_southeast" text="南東">
+		南東
+	</text>
+	<text label="北東" name="floater_map_northeast" text="北東">
+		北東
+	</text>
+	<text label="南西" name="floater_map_southwest" text="南西">
+		南西
+	</text>
+	<text label="北西" name="floater_map_northwest" text="北西">
+		北西
+	</text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index ad630ab5dcd..d6d41aecc0e 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -1,3149 +1,3149 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- This file contains strings that used to be hardcoded in the source.
-     It is only for those strings which do not belong in a floater.
-     For example, the strings used in avatar chat bubbles, and strings 
-     that are returned from one component and may appear in many places-->
-<strings>
-	<string name="SECOND_LIFE">
-		Second Life
-	</string>
-	<string name="APP_NAME">
-		Second Life
-	</string>
-	<string name="SECOND_LIFE_GRID">
-		Second Life Grid
-	</string>
-	<string name="SUPPORT_SITE">
-		Second Lifeサポートポータル
-	</string>
-	<string name="StartupDetectingHardware">
-		ハードウェアの検出中です...
-	</string>
-	<string name="StartupLoading">
-		ローディング
-	</string>
-	<string name="Fullbright">
-		明るさ全開(レガシー)
-	</string>
-	<string name="LoginInProgress">
-		ログイン中です。[APP_NAME]の表示がフリーズする場合があります。  しばらくお待ちください。
-	</string>
-	<string name="LoginInProgressNoFrozen">
-		ログイン中です...
-	</string>
-	<string name="LoginAuthenticating">
-		認証しています...
-	</string>
-	<string name="LoginMaintenance">
-		アカウント・メンテナンスを実行しています...
-	</string>
-	<string name="LoginAttempt">
-		前回のログインに失敗しました。 ログイン中です([NUMBER]回目)
-	</string>
-	<string name="LoginPrecaching">
-		ワールドをロードしています...
-	</string>
-	<string name="LoginInitializingBrowser">
-		埋め込みWebブラウザを初期化しています...
-	</string>
-	<string name="LoginInitializingMultimedia">
-		マルチメディアを初期化しています...
-	</string>
-	<string name="LoginVerifyingCache">
-		キャッシュ・ファイルを検証しています(所要時間は60~90秒)...
-	</string>
-	<string name="LoginProcessingResponse">
-		応答を処理しています...
-	</string>
-	<string name="LoginInitializingWorld">
-		ワールドを初期化しています...
-	</string>
-	<string name="LoginDecodingImages">
-		画像をデコードしています...
-	</string>
-	<string name="LoginInitializingQuicktime">
-		QuickTimeを初期化しています...
-	</string>
-	<string name="LoginQuicktimeNotFound">
-		QuickTimeが見つかりません。初期化に失敗しました。
-	</string>
-	<string name="LoginQuicktimeOK">
-		QuickTimeが正常に初期化されました。
-	</string>
-	<string name="LoginWaitingForRegionHandshake">
-		地域のハンドシェイクを待っています...
-	</string>
-	<string name="LoginConnectingToRegion">
-		地域に接続しています...
-	</string>
-	<string name="LoginDownloadingClothing">
-		服をダウンロードしています...
-	</string>
-	<string name="AgentLostConnection">
-		この地域には、問題が発生している可能性があります。  インターネット接続を確認してください。
-	</string>
-	<string name="TooltipPerson">
-		人
-	</string>
-	<string name="TooltipNoName">
-		(名前なし)
-	</string>
-	<string name="TooltipOwner">
-		オーナー:
-	</string>
-	<string name="TooltipPublic">
-		公共
-	</string>
-	<string name="TooltipIsGroup">
-		(グループ)
-	</string>
-	<string name="TooltipForSaleL$">
-		売り出し中:L$[AMOUNT]
-	</string>
-	<string name="TooltipFlagGroupBuild">
-		グループ作成
-	</string>
-	<string name="TooltipFlagNoBuild">
-		作成禁止
-	</string>
-	<string name="TooltipFlagNoEdit">
-		グループ作成
-	</string>
-	<string name="TooltipFlagNotSafe">
-		危険
-	</string>
-	<string name="TooltipFlagNoFly">
-		飛行禁止
-	</string>
-	<string name="TooltipFlagGroupScripts">
-		グループ・スクリプト
-	</string>
-	<string name="TooltipFlagNoScripts">
-		スクリプトなし
-	</string>
-	<string name="TooltipLand">
-		土地:
-	</string>
-	<string name="TooltipMustSingleDrop">
-		1つのアイテムのみをここにドラッグできます
-	</string>
-	<string name="TooltipHttpUrl">
-		クリックしてこのWebページを見る
-	</string>
-	<string name="TooltipSLURL">
-		クリックしてこの場所の情報を見る
-	</string>
-	<string name="TooltipAgentUrl">
-		クリックしてこの住人のプロフィールを見る
-	</string>
-	<string name="TooltipGroupUrl">
-		クリックしてこのグループの説明文を見る
-	</string>
-	<string name="TooltipEventUrl">
-		クリックしてこのグループの説明文を見る
-	</string>
-	<string name="TooltipClassifiedUrl">
-		クリックしてこのクラシファイド広告を見る
-	</string>
-	<string name="TooltipParcelUrl">
-		クリックしてこの区画の説明文を見る
-	</string>
-	<string name="TooltipTeleportUrl">
-		クリックしてこの場所にテレポートする
-	</string>
-	<string name="TooltipObjectIMUrl">
-		クリックしてこのオブジェクトの説明文を見る
-	</string>
-	<string name="TooltipSLAPP">
-		クリックして secondlife:// コマンドを出す
-	</string>
-	<string name="BUTTON_CLOSE_DARWIN">
-		閉じる (⌘-W)
-	</string>
-	<string name="BUTTON_CLOSE_WIN">
-		閉じる (Ctrl+W)
-	</string>
-	<string name="BUTTON_RESTORE">
-		復元
-	</string>
-	<string name="BUTTON_MINIMIZE">
-		元に戻す(縮小)
-	</string>
-	<string name="BUTTON_TEAR_OFF">
-		別ウィンドウで開く
-	</string>
-	<string name="BUTTON_DOCK">
-		ドッキング
-	</string>
-	<string name="BUTTON_UNDOCK">
-		切り離す
-	</string>
-	<string name="BUTTON_HELP">
-		ヘルプを表示
-	</string>
-	<string name="RetrievingData">
-		検索中...
-	</string>
-	<string name="ReleaseNotes">
-		リリースノート
-	</string>
-	<string name="LoadingData">
-		ロード中...
-	</string>
-	<string name="AvatarNameNobody">
-		(無人)
-	</string>
-	<string name="AvatarNameWaiting">
-		(待機中)
-	</string>
-	<string name="AvatarNameHippos">
-		(カバ)
-	</string>
-	<string name="GroupNameNone">
-		(なし)
-	</string>
-	<string name="AssetErrorNone">
-		エラーなし
-	</string>
-	<string name="AssetErrorRequestFailed">
-		資産の要求: 失敗
-	</string>
-	<string name="AssetErrorNonexistentFile">
-		資産の要求: 存在しないファイル
-	</string>
-	<string name="AssetErrorNotInDatabase">
-		資産の要求: データベースでは見つからない資産
-	</string>
-	<string name="AssetErrorEOF">
-		ファイルの終わり
-	</string>
-	<string name="AssetErrorCannotOpenFile">
-		ファイルを開くことができません
-	</string>
-	<string name="AssetErrorFileNotFound">
-		ファイルが見つかりません
-	</string>
-	<string name="AssetErrorTCPTimeout">
-		ファイル転送タイムアウトです
-	</string>
-	<string name="AssetErrorCircuitGone">
-		接続が解除されました
-	</string>
-	<string name="AssetErrorPriceMismatch">
-		ビューワとサーバーの価格が一致していません
-	</string>
-	<string name="AssetErrorUnknownStatus">
-		ステータスが不明です
-	</string>
-	<string name="texture">
-		テクスチャ
-	</string>
-	<string name="sound">
-		サウンド
-	</string>
-	<string name="calling card">
-		コーリングカード
-	</string>
-	<string name="landmark">
-		ランドマーク
-	</string>
-	<string name="legacy script">
-		レガシースクリプト
-	</string>
-	<string name="clothing">
-		衣類
-	</string>
-	<string name="object">
-		オブジェクト
-	</string>
-	<string name="note card">
-		ノートカード
-	</string>
-	<string name="folder">
-		フォルダ
-	</string>
-	<string name="root">
-		ルート
-	</string>
-	<string name="lsl2 script">
-		lsl2 スクリプト
-	</string>
-	<string name="lsl bytecode">
-		LSL バイトコード
-	</string>
-	<string name="tga texture">
-		tga テクスチャ
-	</string>
-	<string name="body part">
-		身体部位
-	</string>
-	<string name="snapshot">
-		スナップショット
-	</string>
-	<string name="lost and found">
-		紛失物
-	</string>
-	<string name="targa image">
-		targa 画像
-	</string>
-	<string name="trash">
-		ゴミ箱
-	</string>
-	<string name="jpeg image">
-		jpeg 画像
-	</string>
-	<string name="animation">
-		アニメーション
-	</string>
-	<string name="gesture">
-		ジェスチャー
-	</string>
-	<string name="simstate">
-		統計
-	</string>
-	<string name="favorite">
-		お気に入り
-	</string>
-	<string name="symbolic link">
-		リンク
-	</string>
-	<string name="AvatarAway">
-		退席中
-	</string>
-	<string name="AvatarBusy">
-		取り込み中
-	</string>
-	<string name="AvatarMuted">
-		ミュート
-	</string>
-	<string name="anim_express_afraid">
-		怖れ
-	</string>
-	<string name="anim_express_anger">
-		怒り
-	</string>
-	<string name="anim_away">
-		退席中
-	</string>
-	<string name="anim_backflip">
-		後ろ宙返り
-	</string>
-	<string name="anim_express_laugh">
-		大笑い
-	</string>
-	<string name="anim_express_toothsmile">
-		満面の笑顔
-	</string>
-	<string name="anim_blowkiss">
-		投げキッス
-	</string>
-	<string name="anim_express_bored">
-		退屈
-	</string>
-	<string name="anim_bow">
-		おじぎ
-	</string>
-	<string name="anim_clap">
-		拍手
-	</string>
-	<string name="anim_courtbow">
-		深いおじぎ
-	</string>
-	<string name="anim_express_cry">
-		泣く
-	</string>
-	<string name="anim_dance1">
-		ダンス1
-	</string>
-	<string name="anim_dance2">
-		ダンス2
-	</string>
-	<string name="anim_dance3">
-		ダンス3
-	</string>
-	<string name="anim_dance4">
-		ダンス4
-	</string>
-	<string name="anim_dance5">
-		ダンス5
-	</string>
-	<string name="anim_dance6">
-		ダンス6
-	</string>
-	<string name="anim_dance7">
-		ダンス7
-	</string>
-	<string name="anim_dance8">
-		ダンス8
-	</string>
-	<string name="anim_express_disdain">
-		侮蔑
-	</string>
-	<string name="anim_drink">
-		酔っぱらう
-	</string>
-	<string name="anim_express_embarrased">
-		困惑
-	</string>
-	<string name="anim_angry_fingerwag">
-		指を振る
-	</string>
-	<string name="anim_fist_pump">
-		ガッツポーズ
-	</string>
-	<string name="anim_yoga_float">
-		ヨガ浮遊
-	</string>
-	<string name="anim_express_frown">
-		しかめっ面
-	</string>
-	<string name="anim_impatient">
-		いらいらする
-	</string>
-	<string name="anim_jumpforjoy">
-		飛び上がって喜ぶ
-	</string>
-	<string name="anim_kissmybutt">
-		挑発ポーズ
-	</string>
-	<string name="anim_express_kiss">
-		キス
-	</string>
-	<string name="anim_laugh_short">
-		笑う
-	</string>
-	<string name="anim_musclebeach">
-		力こぶを見せる
-	</string>
-	<string name="anim_no_unhappy">
-		不満げに否定する
-	</string>
-	<string name="anim_no_head">
-		否定する
-	</string>
-	<string name="anim_nyanya">
-		冷やかす
-	</string>
-	<string name="anim_punch_onetwo">
-		ワンツー・パンチ
-	</string>
-	<string name="anim_express_open_mouth">
-		口を開けて驚く
-	</string>
-	<string name="anim_peace">
-		ピース・サイン
-	</string>
-	<string name="anim_point_you">
-		他人を指差す
-	</string>
-	<string name="anim_point_me">
-		自分を指差す
-	</string>
-	<string name="anim_punch_l">
-		左パンチ
-	</string>
-	<string name="anim_punch_r">
-		右パンチ
-	</string>
-	<string name="anim_rps_countdown">
-		じゃんけんポーズ
-	</string>
-	<string name="anim_rps_paper">
-		パー
-	</string>
-	<string name="anim_rps_rock">
-		グー
-	</string>
-	<string name="anim_rps_scissors">
-		チョキ
-	</string>
-	<string name="anim_express_repulsed">
-		嫌悪感
-	</string>
-	<string name="anim_kick_roundhouse_r">
-		まわし蹴り
-	</string>
-	<string name="anim_express_sad">
-		悲しむ
-	</string>
-	<string name="anim_salute">
-		敬礼する
-	</string>
-	<string name="anim_shout">
-		叫ぶ
-	</string>
-	<string name="anim_express_shrug">
-		肩をすくめる
-	</string>
-	<string name="anim_express_smile">
-		微笑む
-	</string>
-	<string name="anim_smoke_idle">
-		たばこをくゆらす
-	</string>
-	<string name="anim_smoke_inhale">
-		たばこを吸う
-	</string>
-	<string name="anim_smoke_throw_down">
-		たばこを捨てる
-	</string>
-	<string name="anim_express_surprise">
-		驚く
-	</string>
-	<string name="anim_sword_strike_r">
-		剣で斬りつける
-	</string>
-	<string name="anim_angry_tantrum">
-		じだんだを踏む
-	</string>
-	<string name="anim_express_tongue_out">
-		舌を出す
-	</string>
-	<string name="anim_hello">
-		手を振る
-	</string>
-	<string name="anim_whisper">
-		小声で話す
-	</string>
-	<string name="anim_whistle">
-		口笛を吹く
-	</string>
-	<string name="anim_express_wink">
-		ウィンク
-	</string>
-	<string name="anim_wink_hollywood">
-		ウィンク(ハリウッド)
-	</string>
-	<string name="anim_express_worry">
-		心配する
-	</string>
-	<string name="anim_yes_happy">
-		笑顔で頷く
-	</string>
-	<string name="anim_yes_head">
-		頷く
-	</string>
-	<string name="texture_loading">
-		ロード中...
-	</string>
-	<string name="worldmap_offline">
-		オフライン
-	</string>
-	<string name="Ok">
-		OK
-	</string>
-	<string name="Premature end of file">
-		不完全なファイル
-	</string>
-	<string name="ST_NO_JOINT">
-		ROOT または JOINT が見つかりません
-	</string>
-	<string name="whisper">
-		のささやき:
-	</string>
-	<string name="shout">
-		の叫び:
-	</string>
-	<string name="ringing">
-		インワールドボイスチャットに接続中...
-	</string>
-	<string name="connected">
-		接続しました
-	</string>
-	<string name="unavailable">
-		あなたの現在のロケーションでは、ボイスを利用できません。
-	</string>
-	<string name="hang_up">
-		インワールドボイスチャットの通話が切断されました
-	</string>
-	<string name="ScriptQuestionCautionChatGranted">
-		[REGIONNAME]の[REGIONPOS]という場所にある「[OWNERNAME]」所有の「[OBJECTNAME]」というオブジェクトは、次の権限を許可しました: [PERMISSIONS]
-	</string>
-	<string name="ScriptQuestionCautionChatDenied">
-		[REGIONNAME]の[REGIONPOS]という場所にある「[OWNERNAME]」所有の「[OBJECTNAME]」というオブジェクトは、次の権限を拒否しました: [PERMISSIONS]
-	</string>
-	<string name="ScriptTakeMoney">
-		リンデンドル(L$)を支払う
-	</string>
-	<string name="ActOnControlInputs">
-		制御入力に基づいて行動
-	</string>
-	<string name="RemapControlInputs">
-		制御入力のリマップ
-	</string>
-	<string name="AnimateYourAvatar">
-		アバターへのアニメーション動作
-	</string>
-	<string name="AttachToYourAvatar">
-		アバターに装着
-	</string>
-	<string name="ReleaseOwnership">
-		所有権を解放し公のものとする
-	</string>
-	<string name="LinkAndDelink">
-		他のオブジェクトのリンクとリンク解除
-	</string>
-	<string name="AddAndRemoveJoints">
-		他のオブジェクトとのジョイントの追加と削除
-	</string>
-	<string name="ChangePermissions">
-		権限の変更
-	</string>
-	<string name="TrackYourCamera">
-		カメラ追従
-	</string>
-	<string name="ControlYourCamera">
-		カメラのコントロール
-	</string>
-	<string name="SIM_ACCESS_PG">
-		PG
-	</string>
-	<string name="SIM_ACCESS_MATURE">
-		Mature
-	</string>
-	<string name="SIM_ACCESS_ADULT">
-		Adult
-	</string>
-	<string name="SIM_ACCESS_DOWN">
-		オフライン
-	</string>
-	<string name="SIM_ACCESS_MIN">
-		不明
-	</string>
-	<string name="land_type_unknown">
-		(不明)
-	</string>
-	<string name="all_files">
-		全てのファイル
-	</string>
-	<string name="sound_files">
-		サウンド
-	</string>
-	<string name="animation_files">
-		アニメーション
-	</string>
-	<string name="image_files">
-		画像
-	</string>
-	<string name="save_file_verb">
-		保存
-	</string>
-	<string name="load_file_verb">
-		ロード
-	</string>
-	<string name="targa_image_files">
-		Targa画像
-	</string>
-	<string name="bitmap_image_files">
-		ビットマップ画像
-	</string>
-	<string name="avi_movie_file">
-		AVIムービーファイル
-	</string>
-	<string name="xaf_animation_file">
-		XAFアニメーションファイル
-	</string>
-	<string name="xml_file">
-		XMLファイル
-	</string>
-	<string name="dot_raw_file">
-		RAWファイル
-	</string>
-	<string name="compressed_image_files">
-		圧縮画像
-	</string>
-	<string name="load_files">
-		ファイルのロード
-	</string>
-	<string name="choose_the_directory">
-		参照
-	</string>
-	<string name="AvatarSetNotAway">
-		一時退席中を解除
-	</string>
-	<string name="AvatarSetAway">
-		一時退席中
-	</string>
-	<string name="AvatarSetNotBusy">
-		取り込み中を解除
-	</string>
-	<string name="AvatarSetBusy">
-		取り込み中
-	</string>
-	<string name="shape">
-		シェイプ
-	</string>
-	<string name="skin">
-		スキン
-	</string>
-	<string name="hair">
-		髪型
-	</string>
-	<string name="eyes">
-		ç›®
-	</string>
-	<string name="shirt">
-		シャツ
-	</string>
-	<string name="pants">
-		ズボン
-	</string>
-	<string name="shoes">
-		靴
-	</string>
-	<string name="socks">
-		靴下
-	</string>
-	<string name="jacket">
-		上着
-	</string>
-	<string name="gloves">
-		手袋
-	</string>
-	<string name="undershirt">
-		下着シャツ
-	</string>
-	<string name="underpants">
-		下着パンツ
-	</string>
-	<string name="skirt">
-		スカート
-	</string>
-	<string name="invalid">
-		無効
-	</string>
-	<string name="BodyPartsRightArm">
-		右腕
-	</string>
-	<string name="BodyPartsHead">
-		é ­
-	</string>
-	<string name="BodyPartsLeftArm">
-		左腕
-	</string>
-	<string name="BodyPartsLeftLeg">
-		左脚
-	</string>
-	<string name="BodyPartsTorso">
-		é ­
-	</string>
-	<string name="BodyPartsRightLeg">
-		右脚
-	</string>
-	<string name="GraphicsQualityLow">
-		低
-	</string>
-	<string name="GraphicsQualityMid">
-		中
-	</string>
-	<string name="GraphicsQualityHigh">
-		高
-	</string>
-	<string name="LeaveMouselook">
-		ESC キーを押してワールドビューに戻る
-	</string>
-	<string name="InventoryNoMatchingItems">
-		一致するアイテムが持ち物にありませんでした
-	</string>
-	<string name="InventoryNoTexture">
-		持ち物内にこのテクスチャのコピーがありません
-	</string>
-	<string name="LoadingContents">
-		コンテンツをロード中です...
-	</string>
-	<string name="NoContents">
-		コンテンツなし
-	</string>
-	<string name="InvFolder My Inventory">
-		私の持ち物
-	</string>
-	<string name="InvFolder My Favorites">
-		お気に入り
-	</string>
-	<string name="InvFolder Library">
-		ライブラリ
-	</string>
-	<string name="InvFolder Textures">
-		テクスチャ
-	</string>
-	<string name="InvFolder Sounds">
-		サウンド
-	</string>
-	<string name="InvFolder Calling Cards">
-		コーリングカード
-	</string>
-	<string name="InvFolder Landmarks">
-		ランドマーク
-	</string>
-	<string name="InvFolder Scripts">
-		スクリプト
-	</string>
-	<string name="InvFolder Clothing">
-		衣類
-	</string>
-	<string name="InvFolder Objects">
-		オブジェクト
-	</string>
-	<string name="InvFolder Notecards">
-		ノートカード
-	</string>
-	<string name="InvFolder New Folder">
-		新規フォルダ
-	</string>
-	<string name="InvFolder Inventory">
-		持ち物
-	</string>
-	<string name="InvFolder Uncompressed Images">
-		圧縮されていない画像
-	</string>
-	<string name="InvFolder Body Parts">
-		身体部位
-	</string>
-	<string name="InvFolder Trash">
-		ゴミ箱
-	</string>
-	<string name="InvFolder Photo Album">
-		フォトアルバム
-	</string>
-	<string name="InvFolder Lost And Found">
-		紛失物
-	</string>
-	<string name="InvFolder Uncompressed Sounds">
-		圧縮されていないサウンド
-	</string>
-	<string name="InvFolder Animations">
-		アニメーション
-	</string>
-	<string name="InvFolder Gestures">
-		ジェスチャー
-	</string>
-	<string name="InvFolder favorite">
-		お気に入り
-	</string>
-	<string name="InvFolder Current Outfit">
-		着用中のアウトフィット
-	</string>
-	<string name="InvFolder My Outfits">
-		私のアウトフィット
-	</string>
-	<string name="InvFolder Friends">
-		フレンド
-	</string>
-	<string name="InvFolder All">
-		全員
-	</string>
-	<string name="Buy">
-		買う
-	</string>
-	<string name="BuyforL$">
-		Buy for L$
-	</string>
-	<string name="Stone">
-		石
-	</string>
-	<string name="Metal">
-		金属
-	</string>
-	<string name="Glass">
-		ガラス
-	</string>
-	<string name="Wood">
-		木
-	</string>
-	<string name="Flesh">
-		肌
-	</string>
-	<string name="Plastic">
-		プラスチック
-	</string>
-	<string name="Rubber">
-		ゴム
-	</string>
-	<string name="Light">
-		ライト
-	</string>
-	<string name="KBShift">
-		Shift
-	</string>
-	<string name="KBCtrl">
-		Ctrl
-	</string>
-	<string name="Chest">
-		胸部
-	</string>
-	<string name="Skull">
-		é ­è“‹
-	</string>
-	<string name="Left Shoulder">
-		左肩
-	</string>
-	<string name="Right Shoulder">
-		右肩
-	</string>
-	<string name="Left Hand">
-		左手
-	</string>
-	<string name="Right Hand">
-		右手
-	</string>
-	<string name="Left Foot">
-		左足
-	</string>
-	<string name="Right Foot">
-		右足
-	</string>
-	<string name="Spine">
-		背骨
-	</string>
-	<string name="Pelvis">
-		骨盤
-	</string>
-	<string name="Mouth">
-		口
-	</string>
-	<string name="Chin">
-		あご
-	</string>
-	<string name="Left Ear">
-		左耳
-	</string>
-	<string name="Right Ear">
-		右耳
-	</string>
-	<string name="Left Eyeball">
-		左目眼球
-	</string>
-	<string name="Right Eyeball">
-		右目眼球
-	</string>
-	<string name="Nose">
-		é¼»
-	</string>
-	<string name="R Upper Arm">
-		右上腕
-	</string>
-	<string name="R Forearm">
-		右前腕
-	</string>
-	<string name="L Upper Arm">
-		左上腕
-	</string>
-	<string name="L Forearm">
-		左前腕
-	</string>
-	<string name="Right Hip">
-		右腰
-	</string>
-	<string name="R Upper Leg">
-		右上脚
-	</string>
-	<string name="R Lower Leg">
-		右下脚
-	</string>
-	<string name="Left Hip">
-		左腰
-	</string>
-	<string name="L Upper Leg">
-		左上脚
-	</string>
-	<string name="L Lower Leg">
-		左下脚
-	</string>
-	<string name="Stomach">
-		è…¹
-	</string>
-	<string name="Left Pec">
-		左胸筋
-	</string>
-	<string name="Right Pec">
-		右胸筋
-	</string>
-	<string name="YearsMonthsOld">
-		[AGEYEARS] [AGEMONTHS]
-	</string>
-	<string name="YearsOld">
-		[AGEYEARS]
-	</string>
-	<string name="MonthsOld">
-		[AGEMONTHS]
-	</string>
-	<string name="WeeksOld">
-		[AGEWEEKS]
-	</string>
-	<string name="DaysOld">
-		[AGEDAYS]
-	</string>
-	<string name="TodayOld">
-		今日参加
-	</string>
-	<string name="AgeYearsA">
-		[COUNT] å¹´
-	</string>
-	<string name="AgeYearsB">
-		[COUNT] å¹´
-	</string>
-	<string name="AgeYearsC">
-		[COUNT] å¹´
-	</string>
-	<string name="AgeMonthsA">
-		[COUNT] ヶ月
-	</string>
-	<string name="AgeMonthsB">
-		[COUNT] ヶ月
-	</string>
-	<string name="AgeMonthsC">
-		[COUNT] ヶ月
-	</string>
-	<string name="AgeWeeksA">
-		[COUNT] 週間
-	</string>
-	<string name="AgeWeeksB">
-		[COUNT] 週間
-	</string>
-	<string name="AgeWeeksC">
-		[COUNT] 週間
-	</string>
-	<string name="AgeDaysA">
-		[COUNT] 日間
-	</string>
-	<string name="AgeDaysB">
-		[COUNT] 日間
-	</string>
-	<string name="AgeDaysC">
-		[COUNT] 日間
-	</string>
-	<string name="AcctTypeResident">
-		住人
-	</string>
-	<string name="AcctTypeTrial">
-		トライアル
-	</string>
-	<string name="AcctTypeCharterMember">
-		特権メンバー
-	</string>
-	<string name="AcctTypeEmployee">
-		Linden Lab従業員
-	</string>
-	<string name="PaymentInfoUsed">
-		支払い情報登録済
-	</string>
-	<string name="PaymentInfoOnFile">
-		支払い情報登録済み
-	</string>
-	<string name="NoPaymentInfoOnFile">
-		支払い情報未登録
-	</string>
-	<string name="AgeVerified">
-		年齢確認済み
-	</string>
-	<string name="NotAgeVerified">
-		年齢未確認
-	</string>
-	<string name="Center 2">
-		中心 2
-	</string>
-	<string name="Top Right">
-		右上
-	</string>
-	<string name="Top">
-		上部
-	</string>
-	<string name="Top Left">
-		左上
-	</string>
-	<string name="Center">
-		中心
-	</string>
-	<string name="Bottom Left">
-		Bottom Left
-	</string>
-	<string name="Bottom">
-		Bottom
-	</string>
-	<string name="Bottom Right">
-		Bottom Right
-	</string>
-	<string name="CompileQueueDownloadedCompiling">
-		ダウンロード完了、コンパイル中
-	</string>
-	<string name="CompileQueueScriptNotFound">
-		サーバー上にスクリプトが見つかりません。
-	</string>
-	<string name="CompileQueueProblemDownloading">
-		ダウンロードに問題があります
-	</string>
-	<string name="CompileQueueInsufficientPermDownload">
-		権限不足のためスクリプトをダウンロードできません。
-	</string>
-	<string name="CompileQueueInsufficientPermFor">
-		権限不足:
-	</string>
-	<string name="CompileQueueUnknownFailure">
-		原因不明の失敗によりダウンロードができません
-	</string>
-	<string name="CompileQueueTitle">
-		リコンパイル進行
-	</string>
-	<string name="CompileQueueStart">
-		リコンパイル
-	</string>
-	<string name="ResetQueueTitle">
-		進行をリセット
-	</string>
-	<string name="ResetQueueStart">
-		リセット
-	</string>
-	<string name="RunQueueTitle">
-		実行を続けるよう設定
-	</string>
-	<string name="RunQueueStart">
-		実行中に設定
-	</string>
-	<string name="NotRunQueueTitle">
-		実行を停止するよう設定
-	</string>
-	<string name="NotRunQueueStart">
-		実行停止に設定
-	</string>
-	<string name="CompileSuccessful">
-		コンパイルが完了しました!
-	</string>
-	<string name="CompileSuccessfulSaving">
-		コンパイル完了、保存中です...
-	</string>
-	<string name="SaveComplete">
-		保存完了。
-	</string>
-	<string name="ObjectOutOfRange">
-		スクリプト(オブジェクトが範囲外にあります)
-	</string>
-	<string name="GodToolsObjectOwnedBy">
-		[OWNER] 所有のオブジェクト「[OBJECT]」
-	</string>
-	<string name="GroupsNone">
-		なし
-	</string>
-	<string name="Unknown">
-		(不明)
-	</string>
-	<string name="Balance">
-		残高
-	</string>
-	<string name="Credits">
-		収入
-	</string>
-	<string name="Debits">
-		支出
-	</string>
-	<string name="Total">
-		合計
-	</string>
-	<string name="NoGroupDataFound">
-		グループのデータが見つかりませんでした
-	</string>
-	<string name="IMParentEstate">
-		parent estate
-	</string>
-	<string name="IMMainland">
-		メインランド
-	</string>
-	<string name="IMTeen">
-		ティーン
-	</string>
-	<string name="RegionInfoError">
-		エラー
-	</string>
-	<string name="RegionInfoAllEstatesOwnedBy">
-		[OWNER] が所有するすべての不動産
-	</string>
-	<string name="RegionInfoAllEstatesYouOwn">
-		あなたが所有するすべての不動産
-	</string>
-	<string name="RegionInfoAllEstatesYouManage">
-		あなたが [OWNER] のために管理するすべての不動産
-	</string>
-	<string name="RegionInfoAllowedResidents">
-		許可された住人: ([ALLOWEDAGENTS] 人、最大 [MAXACCESS] 人)
-	</string>
-	<string name="RegionInfoAllowedGroups">
-		許可されたグループ: ([ALLOWEDGROUPS]、最大 [MAXACCESS] グループ)
-	</string>
-	<string name="CursorPos">
-		[LINE] 行目、[COLUMN] 列目
-	</string>
-	<string name="PanelDirCountFound">
-		[COUNT] 件見つかりました
-	</string>
-	<string name="PanelContentsNewScript">
-		新規スクリプト
-	</string>
-	<string name="MuteByName">
-		(名称別)
-	</string>
-	<string name="MuteAgent">
-		(住人)
-	</string>
-	<string name="MuteObject">
-		(オブジェクト)
-	</string>
-	<string name="MuteGroup">
-		(グループ)
-	</string>
-	<string name="RegionNoCovenant">
-		この不動産には約款がありません。
-	</string>
-	<string name="RegionNoCovenantOtherOwner">
-		この不動産には約款がありません。 この不動産上の土地は不動産所有者により販売され、Linden Lab では販売していません。  販売に関するお問い合わせは、不動産所有者までお願い致します。
-	</string>
-	<string name="covenant_last_modified">
-		最終修正日:
-	</string>
-	<string name="GroupOwned">
-		グループ所有
-	</string>
-	<string name="Public">
-		パブリック
-	</string>
-	<string name="ClassifiedClicksTxt">
-		クリック数: [TELEPORT] テレポート、 [MAP] 地図、 [PROFILE] プロフィール
-	</string>
-	<string name="ClassifiedUpdateAfterPublish">
-		(掲載後更新)
-	</string>
-	<string name="GroupVoteYes">
-		はい
-	</string>
-	<string name="GroupVoteNo">
-		いいえ
-	</string>
-	<string name="GroupVoteNoActiveProposals">
-		継続中の提案は現在ありません
-	</string>
-	<string name="GroupVoteNoArchivedProposals">
-		提案のアーカイブは現在ありません
-	</string>
-	<string name="GroupVoteRetrievingArchivedProposals">
-		提案のアーカイブを取得中です
-	</string>
-	<string name="GroupVoteRetrievingActiveProposals">
-		継続中の提案を取得中です
-	</string>
-	<string name="MultiPreviewTitle">
-		プレビュー
-	</string>
-	<string name="MultiPropertiesTitle">
-		Properties
-	</string>
-	<string name="InvOfferAnObjectNamed">
-		オブジェクト名
-	</string>
-	<string name="InvOfferOwnedByGroup">
-		所有グループ
-	</string>
-	<string name="InvOfferOwnedByUnknownGroup">
-		不明なグループ所有
-	</string>
-	<string name="InvOfferOwnedBy">
-		所有者
-	</string>
-	<string name="InvOfferOwnedByUnknownUser">
-		不明なユーザー所有
-	</string>
-	<string name="InvOfferGaveYou">
-		gave you
-	</string>
-	<string name="InvOfferYouDecline">
-		You decline
-	</string>
-	<string name="InvOfferFrom">
-		from
-	</string>
-	<string name="GroupMoneyTotal">
-		合計
-	</string>
-	<string name="GroupMoneyBought">
-		bought
-	</string>
-	<string name="GroupMoneyPaidYou">
-		paid you
-	</string>
-	<string name="GroupMoneyPaidInto">
-		paid into
-	</string>
-	<string name="GroupMoneyBoughtPassTo">
-		bought pass to
-	</string>
-	<string name="GroupMoneyPaidFeeForEvent">
-		paid fee for event
-	</string>
-	<string name="GroupMoneyPaidPrizeForEvent">
-		paid prize for event
-	</string>
-	<string name="GroupMoneyBalance">
-		残高
-	</string>
-	<string name="GroupMoneyCredits">
-		収入
-	</string>
-	<string name="GroupMoneyDebits">
-		支出
-	</string>
-	<string name="ViewerObjectContents">
-		中身
-	</string>
-	<string name="AcquiredItems">
-		取得アイテム
-	</string>
-	<string name="Cancel">
-		キャンセル
-	</string>
-	<string name="UploadingCosts">
-		%s のアップロード代金:
-	</string>
-	<string name="UnknownFileExtension">
-		不明の拡張子: %s
-使用可能な拡張子: .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
-	</string>
-	<string name="AddLandmarkNavBarMenu">
-		ランドマークを追加...
-	</string>
-	<string name="EditLandmarkNavBarMenu">
-		ランドマークを編集...
-	</string>
-	<string name="accel-mac-control">
-		⌃
-	</string>
-	<string name="accel-mac-command">
-		⌘
-	</string>
-	<string name="accel-mac-option">
-		⌥
-	</string>
-	<string name="accel-mac-shift">
-		⇧
-	</string>
-	<string name="accel-win-control">
-		Ctrl+
-	</string>
-	<string name="accel-win-alt">
-		Alt+
-	</string>
-	<string name="accel-win-shift">
-		Shift+
-	</string>
-	<string name="FileSaved">
-		ファイルが保存されました
-	</string>
-	<string name="Receiving">
-		取得中
-	</string>
-	<string name="AM">
-		AM
-	</string>
-	<string name="PM">
-		PM
-	</string>
-	<string name="PST">
-		米国西部標準時
-	</string>
-	<string name="PDT">
-		米国西部夏時間
-	</string>
-	<string name="Forward">
-		前
-	</string>
-	<string name="Left">
-		å·¦
-	</string>
-	<string name="Right">
-		右
-	</string>
-	<string name="Back">
-		後ろ
-	</string>
-	<string name="North">
-		北
-	</string>
-	<string name="South">
-		南
-	</string>
-	<string name="West">
-		西
-	</string>
-	<string name="East">
-		東
-	</string>
-	<string name="Up">
-		上
-	</string>
-	<string name="Down">
-		下
-	</string>
-	<string name="Any Category">
-		全カテゴリ
-	</string>
-	<string name="Shopping">
-		ショッピング
-	</string>
-	<string name="Land Rental">
-		土地のレンタル
-	</string>
-	<string name="Property Rental">
-		建物のレンタル
-	</string>
-	<string name="Special Attraction">
-		特別アトラクション
-	</string>
-	<string name="New Products">
-		新製品
-	</string>
-	<string name="Employment">
-		雇用
-	</string>
-	<string name="Wanted">
-		求む
-	</string>
-	<string name="Service">
-		サービス
-	</string>
-	<string name="Personal">
-		パーソナル
-	</string>
-	<string name="None">
-		なし
-	</string>
-	<string name="Linden Location">
-		Linden所在地
-	</string>
-	<string name="Adult">
-		Adult
-	</string>
-	<string name="Arts&amp;Culture">
-		アートとカルチャー
-	</string>
-	<string name="Business">
-		ビジネス
-	</string>
-	<string name="Educational">
-		教育的
-	</string>
-	<string name="Gaming">
-		ゲーム
-	</string>
-	<string name="Hangout">
-		たまり場
-	</string>
-	<string name="Newcomer Friendly">
-		新住人に好意的
-	</string>
-	<string name="Parks&amp;Nature">
-		公園と自然
-	</string>
-	<string name="Residential">
-		住宅用
-	</string>
-	<string name="Stage">
-		ステージ
-	</string>
-	<string name="Other">
-		その他
-	</string>
-	<string name="Any">
-		全員
-	</string>
-	<string name="You">
-		あなた
-	</string>
-	<string name=":">
-		:
-	</string>
-	<string name=",">
-		,
-	</string>
-	<string name="...">
-		...
-	</string>
-	<string name="***">
-		***
-	</string>
-	<string name="(">
-		(
-	</string>
-	<string name=")">
-		)
-	</string>
-	<string name=".">
-		.
-	</string>
-	<string name="&apos;">
-		&apos;
-	</string>
-	<string name="---">
-		---
-	</string>
-	<string name="MBCmdLineError">
-		コマンドラインにエラーが見つかりました。
-リンク先を参照してください: http://wiki.secondlife.com/wiki/Client_parameters
-エラー:
-	</string>
-	<string name="MBCmdLineUsg">
-		[APP_NAME] コマンドライン使用:
-	</string>
-	<string name="MBUnableToAccessFile">
-		[APP_NAME] は必要なファイルにアクセスできません。
-
-複数のコピーを実行中か、ファイルが既に開いているとあなたのシステムが誤認識している可能性があります。
-このメッセージが何度も出る場合は、コンピューターを再起動してもう一度お試しください。
-それでも問題が続く場合、[APP_NAME] を完全にアンインストールして、再インストールをしてください。
-	</string>
-	<string name="MBFatalError">
-		致命的なエラー
-	</string>
-	<string name="MBRequiresAltiVec">
-		[APP_NAME] は、AltiVec搭載のプロセッサが必要です。(G4 以降)
-	</string>
-	<string name="MBAlreadyRunning">
-		[APP_NAME] はすでに実行中です。
-最小化されたプログラムのコピーをタスクバーで確認してください。
-このメッセージが何度も出る場合はコンピューターを再起動してください。
-	</string>
-	<string name="MBFrozenCrashed">
-		[APP_NAME] は前回の実行時にフリーズしています。
-クラッシュ報告を送信しますか?
-	</string>
-	<string name="MBAlert">
-		警告
-	</string>
-	<string name="MBNoDirectX">
-		[APP_NAME] は DirectX 9.0b 及びそれ以降のバージョンを検出することができませんでした。
-[APP_NAME] は DirectX を使用して安定性の問題、低パフォーマンス、クラッシュ等悪影響を与えるハードウェアや古いドライバを検出します。  DirectX 9.0b がなくても [APP_NAME] を実行できますが、DirectX 9.0bとのご使用を強く推奨します。
-
-続けますか?
-	</string>
-	<string name="MBWarning">
-		警告
-	</string>
-	<string name="MBNoAutoUpdate">
-		自動更新は現在 Linux には対応していません。
-www.secondlife.com から最新バージョンをダウンロードしてください。
-	</string>
-	<string name="MBRegClassFailed">
-		RegisterClass 失敗
-	</string>
-	<string name="MBError">
-		エラー
-	</string>
-	<string name="MBFullScreenErr">
-		[WIDTH] x [HEIGHT] では全画面で実行することができません。
-ウィンドウモードで実行中です。
-	</string>
-	<string name="MBDestroyWinFailed">
-		シャットダウンエラー(DestroyWindow() 失敗)
-	</string>
-	<string name="MBShutdownErr">
-		シャットダウンエラー
-	</string>
-	<string name="MBDevContextErr">
-		GL ディバイスコンテキストが作れません
-	</string>
-	<string name="MBPixelFmtErr">
-		適切なピクセル形式が見つかりません
-	</string>
-	<string name="MBPixelFmtDescErr">
-		ピクセル形式情報が見つかりません
-	</string>
-	<string name="MBTrueColorWindow">
-		[APP_NAME] をウィンドウで実行するには、True Color(32ビット)が必要です。
-「コントロールパネル」>「画面」>「設定」に行き、「最高 (32 ビット)」に設定してください。
-全画面を選択した場合、実行時に [APP_NAME] は自動的にスクリーンを調整します。
-	</string>
-	<string name="MBAlpha">
-		[APP_NAME] は 8 ビットのアルファチャンネルを取得できないため実行できません。  通常ビデオカードのドライバの問題で起こります。
-お使いのコンピューターに最新のビデオカードドライバがインストールされているかご確認ください。
-また、「コントロールパネル」>「画面」>「設定」内で、モニターが「最高 (32ビット)」に設定されていることもご確認ください。
-このメッセージが何度も出る場合は、[SUPPORT_SITE] へご連絡ください。
-	</string>
-	<string name="MBPixelFmtSetErr">
-		ピクセル形式が設定できません
-	</string>
-	<string name="MBGLContextErr">
-		GL レンダーコンテキストが作れません
-	</string>
-	<string name="MBGLContextActErr">
-		GL レンダーコンテキストをアクティベートできません
-	</string>
-	<string name="MBVideoDrvErr">
-		お使いのコンピューターのビデオカードドライバが正常にインストールできなかった、または古いかサポート対象外のため、[APP_NAME] は実行できません。 最新のビデオカードドライバがインストールされているのを確認し、されている場合は再インストールをお試しください。
-
-このメッセージが何度も出る場合は、[SUPPORT_SITE] へご連絡ください。
-	</string>
-	<string name="5 O&apos;Clock Shadow">
-		うっすらとしたヒゲ
-	</string>
-	<string name="All White">
-		真っ白
-	</string>
-	<string name="Anime Eyes">
-		アニメ風の目
-	</string>
-	<string name="Arced">
-		アーチ
-	</string>
-	<string name="Arm Length">
-		腕の長さ
-	</string>
-	<string name="Attached">
-		小
-	</string>
-	<string name="Attached Earlobes">
-		耳たぶ
-	</string>
-	<string name="Back Bangs">
-		後ろにかき上げた前髪
-	</string>
-	<string name="Back Bangs Down">
-		後ろにかき上げて下ろした前髪
-	</string>
-	<string name="Back Bangs Up">
-		後ろにかき上げて持ち上げた前髪
-	</string>
-	<string name="Back Fringe">
-		後ろ髪の毛先
-	</string>
-	<string name="Back Hair">
-		後ろ髪
-	</string>
-	<string name="Back Hair Down">
-		下ろした後ろ髪
-	</string>
-	<string name="Back Hair Up">
-		アップにした後ろ髪
-	</string>
-	<string name="Baggy">
-		たるんでいる
-	</string>
-	<string name="Bangs">
-		前髪
-	</string>
-	<string name="Bangs Down">
-		下ろした前髪
-	</string>
-	<string name="Bangs Up">
-		持ち上げた前髪
-	</string>
-	<string name="Beady Eyes">
-		ビーズのような目
-	</string>
-	<string name="Belly Size">
-		お腹の大きさ
-	</string>
-	<string name="Big">
-		大
-	</string>
-	<string name="Big Butt">
-		大
-	</string>
-	<string name="Big Eyeball">
-		大きい眼球
-	</string>
-	<string name="Big Hair Back">
-		髪の大部分: 後ろ
-	</string>
-	<string name="Big Hair Front">
-		髪の大部分: 前
-	</string>
-	<string name="Big Hair Top">
-		髪の大部分: 上部
-	</string>
-	<string name="Big Head">
-		大
-	</string>
-	<string name="Big Pectorals">
-		大
-	</string>
-	<string name="Big Spikes">
-		とげあり
-	</string>
-	<string name="Black">
-		é»’
-	</string>
-	<string name="Blonde">
-		ブロンド
-	</string>
-	<string name="Blonde Hair">
-		ブロンドの髪
-	</string>
-	<string name="Blush">
-		チーク
-	</string>
-	<string name="Blush Color">
-		チークカラー
-	</string>
-	<string name="Blush Opacity">
-		チークの濃さ
-	</string>
-	<string name="Body Definition">
-		体の精細度
-	</string>
-	<string name="Body Fat">
-		体脂肪
-	</string>
-	<string name="Body Freckles">
-		体のしみ・そばかす
-	</string>
-	<string name="Body Thick">
-		骨太
-	</string>
-	<string name="Body Thickness">
-		体の厚み
-	</string>
-	<string name="Body Thin">
-		細め
-	</string>
-	<string name="Bow Legged">
-		外股
-	</string>
-	<string name="Breast Buoyancy">
-		胸の重力
-	</string>
-	<string name="Breast Cleavage">
-		胸の谷間
-	</string>
-	<string name="Breast Size">
-		胸の大きさ
-	</string>
-	<string name="Bridge Width">
-		両目の間の幅
-	</string>
-	<string name="Broad">
-		広
-	</string>
-	<string name="Brow Size">
-		眉毛の大きさ
-	</string>
-	<string name="Bug Eyes">
-		Bug Eyes
-	</string>
-	<string name="Bugged Eyes">
-		突き出た目
-	</string>
-	<string name="Bulbous">
-		だんご
-	</string>
-	<string name="Bulbous Nose">
-		だんご鼻
-	</string>
-	<string name="Bushy Eyebrows">
-		太
-	</string>
-	<string name="Bushy Hair">
-		ぼさぼさヘア
-	</string>
-	<string name="Butt Size">
-		お尻の大きさ
-	</string>
-	<string name="bustle skirt">
-		後ろの膨らみ
-	</string>
-	<string name="no bustle">
-		膨らみなし
-	</string>
-	<string name="more bustle">
-		膨らみ大
-	</string>
-	<string name="Chaplin">
-		Chaplin
-	</string>
-	<string name="Cheek Bones">
-		ほお骨
-	</string>
-	<string name="Chest Size">
-		胸部の大きさ
-	</string>
-	<string name="Chin Angle">
-		あごの角度
-	</string>
-	<string name="Chin Cleft">
-		あごの先の割れ具合
-	</string>
-	<string name="Chin Curtains">
-		あごに沿ったひげ
-	</string>
-	<string name="Chin Depth">
-		あごの長さ
-	</string>
-	<string name="Chin Heavy">
-		あごに重点
-	</string>
-	<string name="Chin In">
-		ひいたあご
-	</string>
-	<string name="Chin Out">
-		突き出たあご
-	</string>
-	<string name="Chin-Neck">
-		あごと首
-	</string>
-	<string name="Clear">
-		クリア
-	</string>
-	<string name="Cleft">
-		割れた
-	</string>
-	<string name="Close Set Eyes">
-		顔の中心寄りの目
-	</string>
-	<string name="Closed">
-		クローズ
-	</string>
-	<string name="Closed Back">
-		後ろとじ
-	</string>
-	<string name="Closed Front">
-		前とじ
-	</string>
-	<string name="Closed Left">
-		左とじ
-	</string>
-	<string name="Closed Right">
-		右とじ
-	</string>
-	<string name="Coin Purse">
-		コイン入れ
-	</string>
-	<string name="Collar Back">
-		後ろえり
-	</string>
-	<string name="Collar Front">
-		前えり
-	</string>
-	<string name="Corner Down">
-		ダウン
-	</string>
-	<string name="Corner Normal">
-		ノーマル
-	</string>
-	<string name="Corner Up">
-		アップ
-	</string>
-	<string name="Creased">
-		重いまぶた
-	</string>
-	<string name="Crooked Nose">
-		曲がった鼻
-	</string>
-	<string name="Cropped Hair">
-		短く刈り込んだ髪
-	</string>
-	<string name="Cuff Flare">
-		袖口のフレア
-	</string>
-	<string name="Dark">
-		ダーク
-	</string>
-	<string name="Dark Green">
-		ダークグリーン
-	</string>
-	<string name="Darker">
-		ダーク
-	</string>
-	<string name="Deep">
-		尖った
-	</string>
-	<string name="Default Heels">
-		デフォルトのかかと
-	</string>
-	<string name="Default Toe">
-		デフォルトのつま先
-	</string>
-	<string name="Dense">
-		濃
-	</string>
-	<string name="Dense hair">
-		密度の多い髪
-	</string>
-	<string name="Double Chin">
-		二重あご
-	</string>
-	<string name="Downturned">
-		下向き
-	</string>
-	<string name="Duffle Bag">
-		ダッフルバッグ
-	</string>
-	<string name="Ear Angle">
-		耳の角度
-	</string>
-	<string name="Ear Size">
-		耳の大きさ
-	</string>
-	<string name="Ear Tips">
-		耳の先
-	</string>
-	<string name="Egg Head">
-		たまご頭
-	</string>
-	<string name="Eye Bags">
-		下まぶた
-	</string>
-	<string name="Eye Color">
-		瞳の色
-	</string>
-	<string name="Eye Depth">
-		目のくぼみ
-	</string>
-	<string name="Eye Lightness">
-		瞳の明るさ
-	</string>
-	<string name="Eye Opening">
-		見開き具合
-	</string>
-	<string name="Eye Pop">
-		両目の大きさの対称
-	</string>
-	<string name="Eye Size">
-		目の大きさ
-	</string>
-	<string name="Eye Spacing">
-		目と目のあいだの幅
-	</string>
-	<string name="Eyeball Size">
-		眼球の大きさ
-	</string>
-	<string name="Eyebrow Arc">
-		眉毛のアーチ
-	</string>
-	<string name="Eyebrow Density">
-		眉毛の密集度
-	</string>
-	<string name="Eyebrow Height">
-		眉毛の高さ
-	</string>
-	<string name="Eyebrow Points">
-		眉毛の角
-	</string>
-	<string name="Eyebrow Size">
-		眉毛の大きさ
-	</string>
-	<string name="Eyelash Length">
-		まつげの長さ
-	</string>
-	<string name="Eyeliner">
-		アイライナー
-	</string>
-	<string name="Eyeliner Color">
-		アイライナーの色
-	</string>
-	<string name="Eyes Back">
-		目・戻る
-	</string>
-	<string name="Eyes Bugged">
-		下まぶたがたるんだ目
-	</string>
-	<string name="Eyes Forward">
-		目・次へ
-	</string>
-	<string name="Eyes Long Head">
-		Eyes Long Head
-	</string>
-	<string name="Eyes Shear Left Up">
-		Eyes Shear Left Up
-	</string>
-	<string name="Eyes Shear Right Up">
-		Eyes Shear Right Up
-	</string>
-	<string name="Eyes Short Head">
-		Eyes Short Head
-	</string>
-	<string name="Eyes Spread">
-		離れた目
-	</string>
-	<string name="Eyes Sunken">
-		くぼんだ目
-	</string>
-	<string name="Eyes Together">
-		Eyes Together
-	</string>
-	<string name="Face Shear">
-		顔のゆがみ
-	</string>
-	<string name="Facial Definition">
-		顔の精細度
-	</string>
-	<string name="Far Set Eyes">
-		離れた目
-	</string>
-	<string name="Fat">
-		太った
-	</string>
-	<string name="Fat Head">
-		太めの頭
-	</string>
-	<string name="Fat Lips">
-		大
-	</string>
-	<string name="Fat Lower">
-		Fat Lower
-	</string>
-	<string name="Fat Lower Lip">
-		厚めの下唇
-	</string>
-	<string name="Fat Torso">
-		太めの頭部
-	</string>
-	<string name="Fat Upper">
-		Fat Upper
-	</string>
-	<string name="Fat Upper Lip">
-		厚めの上唇
-	</string>
-	<string name="Female">
-		女性
-	</string>
-	<string name="Fingerless">
-		指なし
-	</string>
-	<string name="Fingers">
-		指あり
-	</string>
-	<string name="Flared Cuffs">
-		広がった袖口
-	</string>
-	<string name="Flat">
-		平ら
-	</string>
-	<string name="Flat Butt">
-		小
-	</string>
-	<string name="Flat Head">
-		絶壁頭
-	</string>
-	<string name="Flat Toe">
-		フラット
-	</string>
-	<string name="Foot Size">
-		足の大きさ
-	</string>
-	<string name="Forehead Angle">
-		ひたいの角度
-	</string>
-	<string name="Forehead Heavy">
-		ひたいに重点
-	</string>
-	<string name="Freckles">
-		しみ・そばかす
-	</string>
-	<string name="Front Bangs Down">
-		下ろした前髪
-	</string>
-	<string name="Front Bangs Up">
-		上げた前髪
-	</string>
-	<string name="Front Fringe">
-		前髪の毛先
-	</string>
-	<string name="Front Hair">
-		前髪
-	</string>
-	<string name="Front Hair Down">
-		下ろした前髪
-	</string>
-	<string name="Front Hair Up">
-		アップにした前髪
-	</string>
-	<string name="Full Back">
-		刈られていない髪
-	</string>
-	<string name="Full Eyeliner">
-		あり
-	</string>
-	<string name="Full Front">
-		刈られていない髪
-	</string>
-	<string name="Full Hair Sides">
-		サイドの髪
-	</string>
-	<string name="Full Sides">
-		生え揃ったサイド
-	</string>
-	<string name="Glossy">
-		あり
-	</string>
-	<string name="Glove Fingers">
-		手袋の指
-	</string>
-	<string name="Glove Length">
-		手袋の長さ
-	</string>
-	<string name="Hair">
-		髪
-	</string>
-	<string name="Hair Back">
-		髪: 後ろ
-	</string>
-	<string name="Hair Front">
-		髪: 前
-	</string>
-	<string name="Hair Sides">
-		髪: サイド
-	</string>
-	<string name="Hair Sweep">
-		流す
-	</string>
-	<string name="Hair Thickess">
-		髪の量
-	</string>
-	<string name="Hair Thickness">
-		髪の量
-	</string>
-	<string name="Hair Tilt">
-		髪の向き
-	</string>
-	<string name="Hair Tilted Left">
-		左向き
-	</string>
-	<string name="Hair Tilted Right">
-		右向き
-	</string>
-	<string name="Hair Volume">
-		髪: ボリューム
-	</string>
-	<string name="Hand Size">
-		手の大きさ
-	</string>
-	<string name="Handlebars">
-		ハンドルバー
-	</string>
-	<string name="Head Length">
-		頭の長さ
-	</string>
-	<string name="Head Shape">
-		頭の形
-	</string>
-	<string name="Head Size">
-		頭の大きさ
-	</string>
-	<string name="Head Stretch">
-		頭の伸び具合
-	</string>
-	<string name="Heel Height">
-		ヒールの高さ
-	</string>
-	<string name="Heel Shape">
-		ヒールの形
-	</string>
-	<string name="Height">
-		身長
-	</string>
-	<string name="High">
-		高
-	</string>
-	<string name="High Heels">
-		ハイヒール
-	</string>
-	<string name="High Jaw">
-		高
-	</string>
-	<string name="High Platforms">
-		厚底
-	</string>
-	<string name="High and Tight">
-		高めでタイト
-	</string>
-	<string name="Higher">
-		高
-	</string>
-	<string name="Hip Length">
-		腰の長さ
-	</string>
-	<string name="Hip Width">
-		腰の幅
-	</string>
-	<string name="In">
-		内向き
-	</string>
-	<string name="In Shdw Color">
-		内側のシャドウカラー
-	</string>
-	<string name="In Shdw Opacity">
-		内側のシャドウの濃さ
-	</string>
-	<string name="Inner Eye Corner">
-		目頭
-	</string>
-	<string name="Inner Eye Shadow">
-		内側のアイシャドウ
-	</string>
-	<string name="Inner Shadow">
-		内側のシャドウ
-	</string>
-	<string name="Jacket Length">
-		ジャケット丈
-	</string>
-	<string name="Jacket Wrinkles">
-		ジャケットのしわ
-	</string>
-	<string name="Jaw Angle">
-		あごの角度
-	</string>
-	<string name="Jaw Jut">
-		あごの突出
-	</string>
-	<string name="Jaw Shape">
-		あごの形
-	</string>
-	<string name="Join">
-		寄せた
-	</string>
-	<string name="Jowls">
-		えら
-	</string>
-	<string name="Knee Angle">
-		膝の角度
-	</string>
-	<string name="Knock Kneed">
-		内股
-	</string>
-	<string name="Large">
-		大
-	</string>
-	<string name="Large Hands">
-		大
-	</string>
-	<string name="Left Part">
-		左分け
-	</string>
-	<string name="Leg Length">
-		脚の長さ
-	</string>
-	<string name="Leg Muscles">
-		脚の筋肉
-	</string>
-	<string name="Less">
-		小
-	</string>
-	<string name="Less Body Fat">
-		少なめ
-	</string>
-	<string name="Less Curtains">
-		少なめ
-	</string>
-	<string name="Less Freckles">
-		少なめ
-	</string>
-	<string name="Less Full">
-		薄い
-	</string>
-	<string name="Less Gravity">
-		å°‘
-	</string>
-	<string name="Less Love">
-		å°‘
-	</string>
-	<string name="Less Muscles">
-		少なめ
-	</string>
-	<string name="Less Muscular">
-		少なめ
-	</string>
-	<string name="Less Rosy">
-		少な目
-	</string>
-	<string name="Less Round">
-		丸み少な目
-	</string>
-	<string name="Less Saddle">
-		小
-	</string>
-	<string name="Less Square">
-		小
-	</string>
-	<string name="Less Volume">
-		ボリューム少な目
-	</string>
-	<string name="Less soul">
-		小
-	</string>
-	<string name="Lighter">
-		ライト
-	</string>
-	<string name="Lip Cleft">
-		唇の山
-	</string>
-	<string name="Lip Cleft Depth">
-		唇の山の高さ
-	</string>
-	<string name="Lip Fullness">
-		唇の厚み
-	</string>
-	<string name="Lip Pinkness">
-		唇の赤み
-	</string>
-	<string name="Lip Ratio">
-		上下唇の大きさ
-	</string>
-	<string name="Lip Thickness">
-		唇の前後幅
-	</string>
-	<string name="Lip Width">
-		口の大きさ
-	</string>
-	<string name="Lipgloss">
-		リップグロス
-	</string>
-	<string name="Lipstick">
-		口紅
-	</string>
-	<string name="Lipstick Color">
-		口紅の色
-	</string>
-	<string name="Long">
-		é•·
-	</string>
-	<string name="Long Head">
-		前後幅が広い頭
-	</string>
-	<string name="Long Hips">
-		é•·
-	</string>
-	<string name="Long Legs">
-		é•·
-	</string>
-	<string name="Long Neck">
-		é•·
-	</string>
-	<string name="Long Pigtails">
-		é•·
-	</string>
-	<string name="Long Ponytail">
-		é•·
-	</string>
-	<string name="Long Torso">
-		é•·
-	</string>
-	<string name="Long arms">
-		é•·
-	</string>
-	<string name="Longcuffs">
-		ロングカフス
-	</string>
-	<string name="Loose Pants">
-		ゆったり
-	</string>
-	<string name="Loose Shirt">
-		ゆるめ
-	</string>
-	<string name="Loose Sleeves">
-		ゆるめ
-	</string>
-	<string name="Love Handles">
-		ウエスト周り
-	</string>
-	<string name="Low">
-		低
-	</string>
-	<string name="Low Heels">
-		ローヒール
-	</string>
-	<string name="Low Jaw">
-		低
-	</string>
-	<string name="Low Platforms">
-		低め
-	</string>
-	<string name="Low and Loose">
-		低めでゆったり
-	</string>
-	<string name="Lower">
-		低
-	</string>
-	<string name="Lower Bridge">
-		鼻筋
-	</string>
-	<string name="Lower Cheeks">
-		ほおの下部
-	</string>
-	<string name="Male">
-		男性
-	</string>
-	<string name="Middle Part">
-		真ん中分け
-	</string>
-	<string name="More">
-		大
-	</string>
-	<string name="More Blush">
-		きつめ
-	</string>
-	<string name="More Body Fat">
-		多め
-	</string>
-	<string name="More Curtains">
-		多め
-	</string>
-	<string name="More Eyeshadow">
-		あり
-	</string>
-	<string name="More Freckles">
-		多め
-	</string>
-	<string name="More Full">
-		厚い
-	</string>
-	<string name="More Gravity">
-		大
-	</string>
-	<string name="More Lipstick">
-		あり
-	</string>
-	<string name="More Love">
-		大
-	</string>
-	<string name="More Lower Lip">
-		大
-	</string>
-	<string name="More Muscles">
-		多め
-	</string>
-	<string name="More Muscular">
-		筋骨隆々
-	</string>
-	<string name="More Rosy">
-		多め
-	</string>
-	<string name="More Round">
-		まる
-	</string>
-	<string name="More Saddle">
-		大
-	</string>
-	<string name="More Sloped">
-		なだらか
-	</string>
-	<string name="More Square">
-		四角
-	</string>
-	<string name="More Upper Lip">
-		大
-	</string>
-	<string name="More Vertical">
-		垂直
-	</string>
-	<string name="More Volume">
-		大
-	</string>
-	<string name="More soul">
-		大
-	</string>
-	<string name="Moustache">
-		口ひげ
-	</string>
-	<string name="Mouth Corner">
-		口角
-	</string>
-	<string name="Mouth Position">
-		口の位置
-	</string>
-	<string name="Mowhawk">
-		モヒカン
-	</string>
-	<string name="Muscular">
-		筋骨たくましい
-	</string>
-	<string name="Mutton Chops">
-		マトンチョップス
-	</string>
-	<string name="Nail Polish">
-		マニキュア
-	</string>
-	<string name="Nail Polish Color">
-		マニキュアの色
-	</string>
-	<string name="Narrow">
-		ç‹­
-	</string>
-	<string name="Narrow Back">
-		ç‹­
-	</string>
-	<string name="Narrow Front">
-		ç‹­
-	</string>
-	<string name="Narrow Lips">
-		おちょぼ口
-	</string>
-	<string name="Natural">
-		ナチュラル
-	</string>
-	<string name="Neck Length">
-		首の長さ
-	</string>
-	<string name="Neck Thickness">
-		首の太さ
-	</string>
-	<string name="No Blush">
-		なし
-	</string>
-	<string name="No Eyeliner">
-		なし
-	</string>
-	<string name="No Eyeshadow">
-		なし
-	</string>
-	<string name="No Heels">
-		なし
-	</string>
-	<string name="No Lipgloss">
-		なし
-	</string>
-	<string name="No Lipstick">
-		なし
-	</string>
-	<string name="No Part">
-		なし
-	</string>
-	<string name="No Polish">
-		なし
-	</string>
-	<string name="No Red">
-		なし
-	</string>
-	<string name="No Spikes">
-		なし
-	</string>
-	<string name="No White">
-		なし
-	</string>
-	<string name="No Wrinkles">
-		なし
-	</string>
-	<string name="Normal Lower">
-		Normal Lower
-	</string>
-	<string name="Normal Upper">
-		Normal Upper
-	</string>
-	<string name="Nose Left">
-		左曲がり
-	</string>
-	<string name="Nose Right">
-		右曲がり
-	</string>
-	<string name="Nose Size">
-		鼻の大きさ
-	</string>
-	<string name="Nose Thickness">
-		鼻の厚み
-	</string>
-	<string name="Nose Tip Angle">
-		鼻先の角度
-	</string>
-	<string name="Nose Tip Shape">
-		鼻先の形
-	</string>
-	<string name="Nose Width">
-		鼻の幅
-	</string>
-	<string name="Nostril Division">
-		鼻の穴の高さ
-	</string>
-	<string name="Nostril Width">
-		鼻の穴の幅
-	</string>
-	<string name="Old">
-		Old
-	</string>
-	<string name="Opaque">
-		濃いめ
-	</string>
-	<string name="Open">
-		オープン
-	</string>
-	<string name="Open Back">
-		後ろあき
-	</string>
-	<string name="Open Front">
-		前あき
-	</string>
-	<string name="Open Left">
-		左あき
-	</string>
-	<string name="Open Right">
-		右あき
-	</string>
-	<string name="Orange">
-		オレンジ
-	</string>
-	<string name="Out">
-		外向き
-	</string>
-	<string name="Out Shdw Color">
-		外側のシャドウカラー
-	</string>
-	<string name="Out Shdw Opacity">
-		外側のシャドウの濃さ
-	</string>
-	<string name="Outer Eye Corner">
-		目尻
-	</string>
-	<string name="Outer Eye Shadow">
-		外側のアイシャドウ
-	</string>
-	<string name="Outer Shadow">
-		外側のシャドウ
-	</string>
-	<string name="Overbite">
-		出っ歯
-	</string>
-	<string name="Package">
-		パッケージ
-	</string>
-	<string name="Painted Nails">
-		あり
-	</string>
-	<string name="Pale">
-		悪い
-	</string>
-	<string name="Pants Crotch">
-		パンツの股
-	</string>
-	<string name="Pants Fit">
-		パンツのフィット感
-	</string>
-	<string name="Pants Length">
-		パンツ丈
-	</string>
-	<string name="Pants Waist">
-		ウエスト
-	</string>
-	<string name="Pants Wrinkles">
-		パンツのしわ
-	</string>
-	<string name="Part">
-		あり
-	</string>
-	<string name="Part Bangs">
-		分けた前髪
-	</string>
-	<string name="Pectorals">
-		胸筋
-	</string>
-	<string name="Pigment">
-		色素
-	</string>
-	<string name="Pigtails">
-		下げ髪
-	</string>
-	<string name="Pink">
-		ピンク
-	</string>
-	<string name="Pinker">
-		ピンク
-	</string>
-	<string name="Platform Height">
-		靴底の高さ
-	</string>
-	<string name="Platform Width">
-		靴底の幅
-	</string>
-	<string name="Pointy">
-		尖った
-	</string>
-	<string name="Pointy Heels">
-		å¹…ç‹­
-	</string>
-	<string name="Pointy Toe">
-		先の細いつま先
-	</string>
-	<string name="Ponytail">
-		ポニーテール
-	</string>
-	<string name="Poofy Skirt">
-		ふんわり
-	</string>
-	<string name="Pop Left Eye">
-		左目を大きく
-	</string>
-	<string name="Pop Right Eye">
-		右目を大きく
-	</string>
-	<string name="Puffy">
-		ふっくら
-	</string>
-	<string name="Puffy Eyelids">
-		目の周りの膨らみ
-	</string>
-	<string name="Rainbow Color">
-		虹色
-	</string>
-	<string name="Red Hair">
-		赤毛
-	</string>
-	<string name="Red Skin">
-		赤い肌
-	</string>
-	<string name="Regular">
-		均整のとれた
-	</string>
-	<string name="Regular Muscles">
-		均整のとれた筋肉
-	</string>
-	<string name="Right Part">
-		右分け
-	</string>
-	<string name="Rosy Complexion">
-		ほおの赤らみ
-	</string>
-	<string name="Round">
-		まるっこい
-	</string>
-	<string name="Round Forehead">
-		丸みを帯びた額
-	</string>
-	<string name="Ruddiness">
-		血色
-	</string>
-	<string name="Ruddy">
-		良い
-	</string>
-	<string name="Rumpled Hair">
-		くしゃくしゃヘア
-	</string>
-	<string name="Saddle Bags">
-		腰回りの肉付き
-	</string>
-	<string name="Saddlebags">
-		腰回りの肉付き
-	</string>
-	<string name="Scrawny">
-		骨張った
-	</string>
-	<string name="Scrawny Leg">
-		骨張った脚
-	</string>
-	<string name="Separate">
-		離れた
-	</string>
-	<string name="Shading">
-		Shading
-	</string>
-	<string name="Shadow hair">
-		Shadow hair
-	</string>
-	<string name="Shallow">
-		なだらか
-	</string>
-	<string name="Shear Back">
-		後方を刈る
-	</string>
-	<string name="Shear Face">
-		顔のゆがみ
-	</string>
-	<string name="Shear Front">
-		前方を刈る
-	</string>
-	<string name="Shear Left">
-		左側
-	</string>
-	<string name="Shear Left Up">
-		左半分を上に
-	</string>
-	<string name="Shear Right">
-		右側
-	</string>
-	<string name="Shear Right Up">
-		右半分を上に
-	</string>
-	<string name="Sheared Back">
-		後ろを刈られた髪
-	</string>
-	<string name="Sheared Front">
-		前を刈られた髪
-	</string>
-	<string name="Shift Left">
-		左向き
-	</string>
-	<string name="Shift Mouth">
-		口の向き
-	</string>
-	<string name="Shift Right">
-		右向き
-	</string>
-	<string name="Shirt Bottom">
-		シャツの裾
-	</string>
-	<string name="Shirt Fit">
-		シャツのフィット感
-	</string>
-	<string name="Shirt Wrinkles">
-		シャツのしわ
-	</string>
-	<string name="Shoe Height">
-		靴の長さ
-	</string>
-	<string name="Short">
-		短
-	</string>
-	<string name="Short Arms">
-		短
-	</string>
-	<string name="Short Legs">
-		短
-	</string>
-	<string name="Short Neck">
-		短
-	</string>
-	<string name="Short Pigtails">
-		短
-	</string>
-	<string name="Short Ponytail">
-		短
-	</string>
-	<string name="Short Sideburns">
-		短め
-	</string>
-	<string name="Short Torso">
-		短
-	</string>
-	<string name="Short hips">
-		短
-	</string>
-	<string name="Shoulders">
-		è‚©
-	</string>
-	<string name="Side Bangs">
-		サイドに流した前髪
-	</string>
-	<string name="Side Bangs Down">
-		ダウン
-	</string>
-	<string name="Side Bangs Up">
-		アップ
-	</string>
-	<string name="Side Fringe">
-		サイドの毛先
-	</string>
-	<string name="Sideburns">
-		もみあげ
-	</string>
-	<string name="Sides Hair">
-		サイドの髪
-	</string>
-	<string name="Sides Hair Down">
-		ダウン
-	</string>
-	<string name="Sides Hair Up">
-		アップ
-	</string>
-	<string name="Skinny">
-		細身
-	</string>
-	<string name="Skinny Neck">
-		ç´°
-	</string>
-	<string name="Skirt Fit">
-		スカートのフィット感
-	</string>
-	<string name="Skirt Length">
-		スカート丈
-	</string>
-	<string name="Slanted Forehead">
-		傾斜した額
-	</string>
-	<string name="Sleeve Length">
-		袖丈
-	</string>
-	<string name="Sleeve Looseness">
-		袖のフィット感
-	</string>
-	<string name="Slit Back">
-		スリット: 後ろ
-	</string>
-	<string name="Slit Front">
-		スリット: 前
-	</string>
-	<string name="Slit Left">
-		スリット: 左
-	</string>
-	<string name="Slit Right">
-		スリット: 右
-	</string>
-	<string name="Small">
-		小
-	</string>
-	<string name="Small Hands">
-		小
-	</string>
-	<string name="Small Head">
-		小
-	</string>
-	<string name="Smooth">
-		滑らか
-	</string>
-	<string name="Smooth Hair">
-		スムーズ
-	</string>
-	<string name="Socks Length">
-		靴下丈
-	</string>
-	<string name="Some">
-		Some
-	</string>
-	<string name="Soulpatch">
-		ソウルパッチ
-	</string>
-	<string name="Sparse">
-		è–„
-	</string>
-	<string name="Spiked Hair">
-		とげとげヘア
-	</string>
-	<string name="Square">
-		角張った
-	</string>
-	<string name="Square Toe">
-		スクエアトゥ
-	</string>
-	<string name="Squash Head">
-		カボチャ型
-	</string>
-	<string name="Squash/Stretch Head">
-		カボチャ/縦長頭
-	</string>
-	<string name="Stretch Head">
-		縦長
-	</string>
-	<string name="Sunken">
-		こけた
-	</string>
-	<string name="Sunken Chest">
-		小
-	</string>
-	<string name="Sunken Eyes">
-		くぼんだ目
-	</string>
-	<string name="Sweep Back">
-		後ろへ
-	</string>
-	<string name="Sweep Forward">
-		前へ
-	</string>
-	<string name="Swept Back">
-		オールバック
-	</string>
-	<string name="Swept Back Hair">
-		オールバックヘア
-	</string>
-	<string name="Swept Forward">
-		前へ
-	</string>
-	<string name="Swept Forward Hair">
-		後ろへ
-	</string>
-	<string name="Tall">
-		高
-	</string>
-	<string name="Taper Back">
-		後ろに先細
-	</string>
-	<string name="Taper Front">
-		前に先細
-	</string>
-	<string name="Thick Heels">
-		幅広
-	</string>
-	<string name="Thick Neck">
-		太
-	</string>
-	<string name="Thick Toe">
-		厚め
-	</string>
-	<string name="Thickness">
-		厚み
-	</string>
-	<string name="Thin">
-		薄い
-	</string>
-	<string name="Thin Eyebrows">
-		ç´°
-	</string>
-	<string name="Thin Lips">
-		小
-	</string>
-	<string name="Thin Nose">
-		細い鼻
-	</string>
-	<string name="Tight Chin">
-		ひきしまったあご
-	</string>
-	<string name="Tight Cuffs">
-		タイト
-	</string>
-	<string name="Tight Pants">
-		タイト
-	</string>
-	<string name="Tight Shirt">
-		タイト
-	</string>
-	<string name="Tight Skirt">
-		タイト
-	</string>
-	<string name="Tight Sleeves">
-		タイト
-	</string>
-	<string name="Tilt Left">
-		左に傾斜
-	</string>
-	<string name="Tilt Right">
-		右に傾斜
-	</string>
-	<string name="Toe Shape">
-		つま先の形
-	</string>
-	<string name="Toe Thickness">
-		つま先の厚み
-	</string>
-	<string name="Torso Length">
-		上半身の長さ
-	</string>
-	<string name="Torso Muscles">
-		上半身の筋肉
-	</string>
-	<string name="Torso Scrawny">
-		上半身の骨張り
-	</string>
-	<string name="Unattached">
-		大
-	</string>
-	<string name="Uncreased">
-		軽いまぶた
-	</string>
-	<string name="Underbite">
-		受け口
-	</string>
-	<string name="Unnatural">
-		ユニーク
-	</string>
-	<string name="Upper Bridge">
-		両目のあいだ
-	</string>
-	<string name="Upper Cheeks">
-		ほおの上部
-	</string>
-	<string name="Upper Chin Cleft">
-		あご上部の割れ具合
-	</string>
-	<string name="Upper Eyelid Fold">
-		二重の幅
-	</string>
-	<string name="Upturned">
-		上向き
-	</string>
-	<string name="Very Red">
-		真っ赤
-	</string>
-	<string name="Waist Height">
-		ウエストの高さ
-	</string>
-	<string name="Well-Fed">
-		つまった
-	</string>
-	<string name="White Hair">
-		白髪
-	</string>
-	<string name="Wide">
-		広
-	</string>
-	<string name="Wide Back">
-		広
-	</string>
-	<string name="Wide Front">
-		広
-	</string>
-	<string name="Wide Lips">
-		大きい口
-	</string>
-	<string name="Wild">
-		ワイルド
-	</string>
-	<string name="Wrinkles">
-		しわあり
-	</string>
-	<string name="LocationCtrlAddLandmarkTooltip">
-		マイ ランドマークに追加
-	</string>
-	<string name="LocationCtrlEditLandmarkTooltip">
-		マイ ランドマークを編集
-	</string>
-	<string name="UpdaterWindowTitle">
-		[APP_NAME] アップデート
-	</string>
-	<string name="UpdaterNowUpdating">
-		只今 [APP_NAME] をアップデート中です...
-	</string>
-	<string name="UpdaterNowInstalling">
-		[APP_NAME] をインストール中です...
-	</string>
-	<string name="UpdaterUpdatingDescriptive">
-		お使いの [APP_NAME] ビューワが最新バージョンにアップデートされています。  数分かかることがありますのでしばらくお待ちください。
-	</string>
-	<string name="UpdaterProgressBarTextWithEllipses">
-		アップデートをダウンロード中です...
-	</string>
-	<string name="UpdaterProgressBarText">
-		アップデートをダウンロード中
-	</string>
-	<string name="UpdaterFailDownloadTitle">
-		アップデートのダウンロードに失敗しました
-	</string>
-	<string name="UpdaterFailUpdateDescriptive">
-		[APP_NAME] をアップデート中にエラーが発生しました。 www.secondlife.com から最新バージョンをダウンロードしてください。
-	</string>
-	<string name="UpdaterFailInstallTitle">
-		アップデートのインストールに失敗しました
-	</string>
-	<string name="UpdaterFailStartTitle">
-		ビューワの起動に失敗しました
-	</string>
-	<string name="only_user_message">
-		このセッションにいるユーザーはあなただけです。
-	</string>
-	<string name="offline_message">
-		[FIRST] [LAST]はオフラインです。
-	</string>
-	<string name="invite_message">
-		このボイスチャットに応答/接続する場合は、[BUTTON NAME]をクリックしてください。
-	</string>
-	<string name="generic_request_error">
-		要求中にエラーが発生しました。後でもう一度試してください。
-	</string>
-	<string name="insufficient_perms_error">
-		あなたには充分な権限がありません。
-	</string>
-	<string name="session_does_not_exist_error">
-		このセッションは既に切断されています。
-	</string>
-	<string name="no_ability_error">
-		あなたにはその能力がありません。
-	</string>
-	<string name="no_ability">
-		あなたにはその能力がありません。
-	</string>
-	<string name="not_a_mod_error">
-		あなたはセッション・モデレータではありません。
-	</string>
-	<string name="muted_error">
-		グループモデレータがあなたのテキストチャットを無効化しました
-	</string>
-	<string name="add_session_event">
-		[RECIPIENT] とのチャット・セッションにユーザーを追加することができません
-	</string>
-	<string name="message_session_event">
-		[RECIPIENT] とのチャット・セッションにメッセージを送ることができません
-	</string>
-	<string name="removed_from_group">
-		あなたはグループから削除されました。
-	</string>
-	<string name="close_on_no_ability">
-		このチャット・セッションを継続することはできません
-	</string>
-</strings>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- This file contains strings that used to be hardcoded in the source.
+     It is only for those strings which do not belong in a floater.
+     For example, the strings used in avatar chat bubbles, and strings 
+     that are returned from one component and may appear in many places-->
+<strings>
+	<string name="SECOND_LIFE">
+		Second Life
+	</string>
+	<string name="APP_NAME">
+		Second Life
+	</string>
+	<string name="SECOND_LIFE_GRID">
+		Second Life Grid
+	</string>
+	<string name="SUPPORT_SITE">
+		Second Lifeサポートポータル
+	</string>
+	<string name="StartupDetectingHardware">
+		ハードウェアの検出中です...
+	</string>
+	<string name="StartupLoading">
+		ローディング
+	</string>
+	<string name="Fullbright">
+		明るさ全開(レガシー)
+	</string>
+	<string name="LoginInProgress">
+		ログイン中です。[APP_NAME]の表示がフリーズする場合があります。  しばらくお待ちください。
+	</string>
+	<string name="LoginInProgressNoFrozen">
+		ログイン中です...
+	</string>
+	<string name="LoginAuthenticating">
+		認証しています...
+	</string>
+	<string name="LoginMaintenance">
+		アカウント・メンテナンスを実行しています...
+	</string>
+	<string name="LoginAttempt">
+		前回のログインに失敗しました。 ログイン中です([NUMBER]回目)
+	</string>
+	<string name="LoginPrecaching">
+		ワールドをロードしています...
+	</string>
+	<string name="LoginInitializingBrowser">
+		埋め込みWebブラウザを初期化しています...
+	</string>
+	<string name="LoginInitializingMultimedia">
+		マルチメディアを初期化しています...
+	</string>
+	<string name="LoginVerifyingCache">
+		キャッシュ・ファイルを検証しています(所要時間は60~90秒)...
+	</string>
+	<string name="LoginProcessingResponse">
+		応答を処理しています...
+	</string>
+	<string name="LoginInitializingWorld">
+		ワールドを初期化しています...
+	</string>
+	<string name="LoginDecodingImages">
+		画像をデコードしています...
+	</string>
+	<string name="LoginInitializingQuicktime">
+		QuickTimeを初期化しています...
+	</string>
+	<string name="LoginQuicktimeNotFound">
+		QuickTimeが見つかりません。初期化に失敗しました。
+	</string>
+	<string name="LoginQuicktimeOK">
+		QuickTimeが正常に初期化されました。
+	</string>
+	<string name="LoginWaitingForRegionHandshake">
+		地域のハンドシェイクを待っています...
+	</string>
+	<string name="LoginConnectingToRegion">
+		地域に接続しています...
+	</string>
+	<string name="LoginDownloadingClothing">
+		服をダウンロードしています...
+	</string>
+	<string name="AgentLostConnection">
+		この地域には、問題が発生している可能性があります。  インターネット接続を確認してください。
+	</string>
+	<string name="TooltipPerson">
+		人
+	</string>
+	<string name="TooltipNoName">
+		(名前なし)
+	</string>
+	<string name="TooltipOwner">
+		オーナー:
+	</string>
+	<string name="TooltipPublic">
+		公共
+	</string>
+	<string name="TooltipIsGroup">
+		(グループ)
+	</string>
+	<string name="TooltipForSaleL$">
+		売り出し中:L$[AMOUNT]
+	</string>
+	<string name="TooltipFlagGroupBuild">
+		グループ作成
+	</string>
+	<string name="TooltipFlagNoBuild">
+		作成禁止
+	</string>
+	<string name="TooltipFlagNoEdit">
+		グループ作成
+	</string>
+	<string name="TooltipFlagNotSafe">
+		危険
+	</string>
+	<string name="TooltipFlagNoFly">
+		飛行禁止
+	</string>
+	<string name="TooltipFlagGroupScripts">
+		グループ・スクリプト
+	</string>
+	<string name="TooltipFlagNoScripts">
+		スクリプトなし
+	</string>
+	<string name="TooltipLand">
+		土地:
+	</string>
+	<string name="TooltipMustSingleDrop">
+		1つのアイテムのみをここにドラッグできます
+	</string>
+	<string name="TooltipHttpUrl">
+		クリックしてこのWebページを見る
+	</string>
+	<string name="TooltipSLURL">
+		クリックしてこの場所の情報を見る
+	</string>
+	<string name="TooltipAgentUrl">
+		クリックしてこの住人のプロフィールを見る
+	</string>
+	<string name="TooltipGroupUrl">
+		クリックしてこのグループの説明文を見る
+	</string>
+	<string name="TooltipEventUrl">
+		クリックしてこのグループの説明文を見る
+	</string>
+	<string name="TooltipClassifiedUrl">
+		クリックしてこのクラシファイド広告を見る
+	</string>
+	<string name="TooltipParcelUrl">
+		クリックしてこの区画の説明文を見る
+	</string>
+	<string name="TooltipTeleportUrl">
+		クリックしてこの場所にテレポートする
+	</string>
+	<string name="TooltipObjectIMUrl">
+		クリックしてこのオブジェクトの説明文を見る
+	</string>
+	<string name="TooltipSLAPP">
+		クリックして secondlife:// コマンドを出す
+	</string>
+	<string name="BUTTON_CLOSE_DARWIN">
+		閉じる (⌘-W)
+	</string>
+	<string name="BUTTON_CLOSE_WIN">
+		閉じる (Ctrl+W)
+	</string>
+	<string name="BUTTON_RESTORE">
+		復元
+	</string>
+	<string name="BUTTON_MINIMIZE">
+		元に戻す(縮小)
+	</string>
+	<string name="BUTTON_TEAR_OFF">
+		別ウィンドウで開く
+	</string>
+	<string name="BUTTON_DOCK">
+		ドッキング
+	</string>
+	<string name="BUTTON_UNDOCK">
+		切り離す
+	</string>
+	<string name="BUTTON_HELP">
+		ヘルプを表示
+	</string>
+	<string name="RetrievingData">
+		検索中...
+	</string>
+	<string name="ReleaseNotes">
+		リリースノート
+	</string>
+	<string name="LoadingData">
+		ロード中...
+	</string>
+	<string name="AvatarNameNobody">
+		(無人)
+	</string>
+	<string name="AvatarNameWaiting">
+		(待機中)
+	</string>
+	<string name="AvatarNameHippos">
+		(カバ)
+	</string>
+	<string name="GroupNameNone">
+		(なし)
+	</string>
+	<string name="AssetErrorNone">
+		エラーなし
+	</string>
+	<string name="AssetErrorRequestFailed">
+		資産の要求: 失敗
+	</string>
+	<string name="AssetErrorNonexistentFile">
+		資産の要求: 存在しないファイル
+	</string>
+	<string name="AssetErrorNotInDatabase">
+		資産の要求: データベースでは見つからない資産
+	</string>
+	<string name="AssetErrorEOF">
+		ファイルの終わり
+	</string>
+	<string name="AssetErrorCannotOpenFile">
+		ファイルを開くことができません
+	</string>
+	<string name="AssetErrorFileNotFound">
+		ファイルが見つかりません
+	</string>
+	<string name="AssetErrorTCPTimeout">
+		ファイル転送タイムアウトです
+	</string>
+	<string name="AssetErrorCircuitGone">
+		接続が解除されました
+	</string>
+	<string name="AssetErrorPriceMismatch">
+		ビューワとサーバーの価格が一致していません
+	</string>
+	<string name="AssetErrorUnknownStatus">
+		ステータスが不明です
+	</string>
+	<string name="texture">
+		テクスチャ
+	</string>
+	<string name="sound">
+		サウンド
+	</string>
+	<string name="calling card">
+		コーリングカード
+	</string>
+	<string name="landmark">
+		ランドマーク
+	</string>
+	<string name="legacy script">
+		レガシースクリプト
+	</string>
+	<string name="clothing">
+		衣類
+	</string>
+	<string name="object">
+		オブジェクト
+	</string>
+	<string name="note card">
+		ノートカード
+	</string>
+	<string name="folder">
+		フォルダ
+	</string>
+	<string name="root">
+		ルート
+	</string>
+	<string name="lsl2 script">
+		lsl2 スクリプト
+	</string>
+	<string name="lsl bytecode">
+		LSL バイトコード
+	</string>
+	<string name="tga texture">
+		tga テクスチャ
+	</string>
+	<string name="body part">
+		身体部位
+	</string>
+	<string name="snapshot">
+		スナップショット
+	</string>
+	<string name="lost and found">
+		紛失物
+	</string>
+	<string name="targa image">
+		targa 画像
+	</string>
+	<string name="trash">
+		ゴミ箱
+	</string>
+	<string name="jpeg image">
+		jpeg 画像
+	</string>
+	<string name="animation">
+		アニメーション
+	</string>
+	<string name="gesture">
+		ジェスチャー
+	</string>
+	<string name="simstate">
+		統計
+	</string>
+	<string name="favorite">
+		お気に入り
+	</string>
+	<string name="symbolic link">
+		リンク
+	</string>
+	<string name="AvatarAway">
+		退席中
+	</string>
+	<string name="AvatarBusy">
+		取り込み中
+	</string>
+	<string name="AvatarMuted">
+		ミュート
+	</string>
+	<string name="anim_express_afraid">
+		怖れ
+	</string>
+	<string name="anim_express_anger">
+		怒り
+	</string>
+	<string name="anim_away">
+		退席中
+	</string>
+	<string name="anim_backflip">
+		後ろ宙返り
+	</string>
+	<string name="anim_express_laugh">
+		大笑い
+	</string>
+	<string name="anim_express_toothsmile">
+		満面の笑顔
+	</string>
+	<string name="anim_blowkiss">
+		投げキッス
+	</string>
+	<string name="anim_express_bored">
+		退屈
+	</string>
+	<string name="anim_bow">
+		おじぎ
+	</string>
+	<string name="anim_clap">
+		拍手
+	</string>
+	<string name="anim_courtbow">
+		深いおじぎ
+	</string>
+	<string name="anim_express_cry">
+		泣く
+	</string>
+	<string name="anim_dance1">
+		ダンス1
+	</string>
+	<string name="anim_dance2">
+		ダンス2
+	</string>
+	<string name="anim_dance3">
+		ダンス3
+	</string>
+	<string name="anim_dance4">
+		ダンス4
+	</string>
+	<string name="anim_dance5">
+		ダンス5
+	</string>
+	<string name="anim_dance6">
+		ダンス6
+	</string>
+	<string name="anim_dance7">
+		ダンス7
+	</string>
+	<string name="anim_dance8">
+		ダンス8
+	</string>
+	<string name="anim_express_disdain">
+		侮蔑
+	</string>
+	<string name="anim_drink">
+		酔っぱらう
+	</string>
+	<string name="anim_express_embarrased">
+		困惑
+	</string>
+	<string name="anim_angry_fingerwag">
+		指を振る
+	</string>
+	<string name="anim_fist_pump">
+		ガッツポーズ
+	</string>
+	<string name="anim_yoga_float">
+		ヨガ浮遊
+	</string>
+	<string name="anim_express_frown">
+		しかめっ面
+	</string>
+	<string name="anim_impatient">
+		いらいらする
+	</string>
+	<string name="anim_jumpforjoy">
+		飛び上がって喜ぶ
+	</string>
+	<string name="anim_kissmybutt">
+		挑発ポーズ
+	</string>
+	<string name="anim_express_kiss">
+		キス
+	</string>
+	<string name="anim_laugh_short">
+		笑う
+	</string>
+	<string name="anim_musclebeach">
+		力こぶを見せる
+	</string>
+	<string name="anim_no_unhappy">
+		不満げに否定する
+	</string>
+	<string name="anim_no_head">
+		否定する
+	</string>
+	<string name="anim_nyanya">
+		冷やかす
+	</string>
+	<string name="anim_punch_onetwo">
+		ワンツー・パンチ
+	</string>
+	<string name="anim_express_open_mouth">
+		口を開けて驚く
+	</string>
+	<string name="anim_peace">
+		ピース・サイン
+	</string>
+	<string name="anim_point_you">
+		他人を指差す
+	</string>
+	<string name="anim_point_me">
+		自分を指差す
+	</string>
+	<string name="anim_punch_l">
+		左パンチ
+	</string>
+	<string name="anim_punch_r">
+		右パンチ
+	</string>
+	<string name="anim_rps_countdown">
+		じゃんけんポーズ
+	</string>
+	<string name="anim_rps_paper">
+		パー
+	</string>
+	<string name="anim_rps_rock">
+		グー
+	</string>
+	<string name="anim_rps_scissors">
+		チョキ
+	</string>
+	<string name="anim_express_repulsed">
+		嫌悪感
+	</string>
+	<string name="anim_kick_roundhouse_r">
+		まわし蹴り
+	</string>
+	<string name="anim_express_sad">
+		悲しむ
+	</string>
+	<string name="anim_salute">
+		敬礼する
+	</string>
+	<string name="anim_shout">
+		叫ぶ
+	</string>
+	<string name="anim_express_shrug">
+		肩をすくめる
+	</string>
+	<string name="anim_express_smile">
+		微笑む
+	</string>
+	<string name="anim_smoke_idle">
+		たばこをくゆらす
+	</string>
+	<string name="anim_smoke_inhale">
+		たばこを吸う
+	</string>
+	<string name="anim_smoke_throw_down">
+		たばこを捨てる
+	</string>
+	<string name="anim_express_surprise">
+		驚く
+	</string>
+	<string name="anim_sword_strike_r">
+		剣で斬りつける
+	</string>
+	<string name="anim_angry_tantrum">
+		じだんだを踏む
+	</string>
+	<string name="anim_express_tongue_out">
+		舌を出す
+	</string>
+	<string name="anim_hello">
+		手を振る
+	</string>
+	<string name="anim_whisper">
+		小声で話す
+	</string>
+	<string name="anim_whistle">
+		口笛を吹く
+	</string>
+	<string name="anim_express_wink">
+		ウィンク
+	</string>
+	<string name="anim_wink_hollywood">
+		ウィンク(ハリウッド)
+	</string>
+	<string name="anim_express_worry">
+		心配する
+	</string>
+	<string name="anim_yes_happy">
+		笑顔で頷く
+	</string>
+	<string name="anim_yes_head">
+		頷く
+	</string>
+	<string name="texture_loading">
+		ロード中...
+	</string>
+	<string name="worldmap_offline">
+		オフライン
+	</string>
+	<string name="Ok">
+		OK
+	</string>
+	<string name="Premature end of file">
+		不完全なファイル
+	</string>
+	<string name="ST_NO_JOINT">
+		ROOT または JOINT が見つかりません
+	</string>
+	<string name="whisper">
+		のささやき:
+	</string>
+	<string name="shout">
+		の叫び:
+	</string>
+	<string name="ringing">
+		インワールドボイスチャットに接続中...
+	</string>
+	<string name="connected">
+		接続しました
+	</string>
+	<string name="unavailable">
+		あなたの現在のロケーションでは、ボイスを利用できません。
+	</string>
+	<string name="hang_up">
+		インワールドボイスチャットの通話が切断されました
+	</string>
+	<string name="ScriptQuestionCautionChatGranted">
+		[REGIONNAME]の[REGIONPOS]という場所にある「[OWNERNAME]」所有の「[OBJECTNAME]」というオブジェクトは、次の権限を許可しました: [PERMISSIONS]
+	</string>
+	<string name="ScriptQuestionCautionChatDenied">
+		[REGIONNAME]の[REGIONPOS]という場所にある「[OWNERNAME]」所有の「[OBJECTNAME]」というオブジェクトは、次の権限を拒否しました: [PERMISSIONS]
+	</string>
+	<string name="ScriptTakeMoney">
+		リンデンドル(L$)を支払う
+	</string>
+	<string name="ActOnControlInputs">
+		制御入力に基づいて行動
+	</string>
+	<string name="RemapControlInputs">
+		制御入力のリマップ
+	</string>
+	<string name="AnimateYourAvatar">
+		アバターへのアニメーション動作
+	</string>
+	<string name="AttachToYourAvatar">
+		アバターに装着
+	</string>
+	<string name="ReleaseOwnership">
+		所有権を解放し公のものとする
+	</string>
+	<string name="LinkAndDelink">
+		他のオブジェクトのリンクとリンク解除
+	</string>
+	<string name="AddAndRemoveJoints">
+		他のオブジェクトとのジョイントの追加と削除
+	</string>
+	<string name="ChangePermissions">
+		権限の変更
+	</string>
+	<string name="TrackYourCamera">
+		カメラ追従
+	</string>
+	<string name="ControlYourCamera">
+		カメラのコントロール
+	</string>
+	<string name="SIM_ACCESS_PG">
+		PG
+	</string>
+	<string name="SIM_ACCESS_MATURE">
+		Mature
+	</string>
+	<string name="SIM_ACCESS_ADULT">
+		Adult
+	</string>
+	<string name="SIM_ACCESS_DOWN">
+		オフライン
+	</string>
+	<string name="SIM_ACCESS_MIN">
+		不明
+	</string>
+	<string name="land_type_unknown">
+		(不明)
+	</string>
+	<string name="all_files">
+		全てのファイル
+	</string>
+	<string name="sound_files">
+		サウンド
+	</string>
+	<string name="animation_files">
+		アニメーション
+	</string>
+	<string name="image_files">
+		画像
+	</string>
+	<string name="save_file_verb">
+		保存
+	</string>
+	<string name="load_file_verb">
+		ロード
+	</string>
+	<string name="targa_image_files">
+		Targa画像
+	</string>
+	<string name="bitmap_image_files">
+		ビットマップ画像
+	</string>
+	<string name="avi_movie_file">
+		AVIムービーファイル
+	</string>
+	<string name="xaf_animation_file">
+		XAFアニメーションファイル
+	</string>
+	<string name="xml_file">
+		XMLファイル
+	</string>
+	<string name="dot_raw_file">
+		RAWファイル
+	</string>
+	<string name="compressed_image_files">
+		圧縮画像
+	</string>
+	<string name="load_files">
+		ファイルのロード
+	</string>
+	<string name="choose_the_directory">
+		参照
+	</string>
+	<string name="AvatarSetNotAway">
+		一時退席中を解除
+	</string>
+	<string name="AvatarSetAway">
+		一時退席中
+	</string>
+	<string name="AvatarSetNotBusy">
+		取り込み中を解除
+	</string>
+	<string name="AvatarSetBusy">
+		取り込み中
+	</string>
+	<string name="shape">
+		シェイプ
+	</string>
+	<string name="skin">
+		スキン
+	</string>
+	<string name="hair">
+		髪型
+	</string>
+	<string name="eyes">
+		ç›®
+	</string>
+	<string name="shirt">
+		シャツ
+	</string>
+	<string name="pants">
+		ズボン
+	</string>
+	<string name="shoes">
+		靴
+	</string>
+	<string name="socks">
+		靴下
+	</string>
+	<string name="jacket">
+		上着
+	</string>
+	<string name="gloves">
+		手袋
+	</string>
+	<string name="undershirt">
+		下着シャツ
+	</string>
+	<string name="underpants">
+		下着パンツ
+	</string>
+	<string name="skirt">
+		スカート
+	</string>
+	<string name="invalid">
+		無効
+	</string>
+	<string name="BodyPartsRightArm">
+		右腕
+	</string>
+	<string name="BodyPartsHead">
+		é ­
+	</string>
+	<string name="BodyPartsLeftArm">
+		左腕
+	</string>
+	<string name="BodyPartsLeftLeg">
+		左脚
+	</string>
+	<string name="BodyPartsTorso">
+		é ­
+	</string>
+	<string name="BodyPartsRightLeg">
+		右脚
+	</string>
+	<string name="GraphicsQualityLow">
+		低
+	</string>
+	<string name="GraphicsQualityMid">
+		中
+	</string>
+	<string name="GraphicsQualityHigh">
+		高
+	</string>
+	<string name="LeaveMouselook">
+		ESC キーを押してワールドビューに戻る
+	</string>
+	<string name="InventoryNoMatchingItems">
+		一致するアイテムが持ち物にありませんでした
+	</string>
+	<string name="InventoryNoTexture">
+		持ち物内にこのテクスチャのコピーがありません
+	</string>
+	<string name="LoadingContents">
+		コンテンツをロード中です...
+	</string>
+	<string name="NoContents">
+		コンテンツなし
+	</string>
+	<string name="InvFolder My Inventory">
+		私の持ち物
+	</string>
+	<string name="InvFolder My Favorites">
+		お気に入り
+	</string>
+	<string name="InvFolder Library">
+		ライブラリ
+	</string>
+	<string name="InvFolder Textures">
+		テクスチャ
+	</string>
+	<string name="InvFolder Sounds">
+		サウンド
+	</string>
+	<string name="InvFolder Calling Cards">
+		コーリングカード
+	</string>
+	<string name="InvFolder Landmarks">
+		ランドマーク
+	</string>
+	<string name="InvFolder Scripts">
+		スクリプト
+	</string>
+	<string name="InvFolder Clothing">
+		衣類
+	</string>
+	<string name="InvFolder Objects">
+		オブジェクト
+	</string>
+	<string name="InvFolder Notecards">
+		ノートカード
+	</string>
+	<string name="InvFolder New Folder">
+		新規フォルダ
+	</string>
+	<string name="InvFolder Inventory">
+		持ち物
+	</string>
+	<string name="InvFolder Uncompressed Images">
+		圧縮されていない画像
+	</string>
+	<string name="InvFolder Body Parts">
+		身体部位
+	</string>
+	<string name="InvFolder Trash">
+		ゴミ箱
+	</string>
+	<string name="InvFolder Photo Album">
+		フォトアルバム
+	</string>
+	<string name="InvFolder Lost And Found">
+		紛失物
+	</string>
+	<string name="InvFolder Uncompressed Sounds">
+		圧縮されていないサウンド
+	</string>
+	<string name="InvFolder Animations">
+		アニメーション
+	</string>
+	<string name="InvFolder Gestures">
+		ジェスチャー
+	</string>
+	<string name="InvFolder favorite">
+		お気に入り
+	</string>
+	<string name="InvFolder Current Outfit">
+		着用中のアウトフィット
+	</string>
+	<string name="InvFolder My Outfits">
+		私のアウトフィット
+	</string>
+	<string name="InvFolder Friends">
+		フレンド
+	</string>
+	<string name="InvFolder All">
+		全員
+	</string>
+	<string name="Buy">
+		買う
+	</string>
+	<string name="BuyforL$">
+		Buy for L$
+	</string>
+	<string name="Stone">
+		石
+	</string>
+	<string name="Metal">
+		金属
+	</string>
+	<string name="Glass">
+		ガラス
+	</string>
+	<string name="Wood">
+		木
+	</string>
+	<string name="Flesh">
+		肌
+	</string>
+	<string name="Plastic">
+		プラスチック
+	</string>
+	<string name="Rubber">
+		ゴム
+	</string>
+	<string name="Light">
+		ライト
+	</string>
+	<string name="KBShift">
+		Shift
+	</string>
+	<string name="KBCtrl">
+		Ctrl
+	</string>
+	<string name="Chest">
+		胸部
+	</string>
+	<string name="Skull">
+		é ­è“‹
+	</string>
+	<string name="Left Shoulder">
+		左肩
+	</string>
+	<string name="Right Shoulder">
+		右肩
+	</string>
+	<string name="Left Hand">
+		左手
+	</string>
+	<string name="Right Hand">
+		右手
+	</string>
+	<string name="Left Foot">
+		左足
+	</string>
+	<string name="Right Foot">
+		右足
+	</string>
+	<string name="Spine">
+		背骨
+	</string>
+	<string name="Pelvis">
+		骨盤
+	</string>
+	<string name="Mouth">
+		口
+	</string>
+	<string name="Chin">
+		あご
+	</string>
+	<string name="Left Ear">
+		左耳
+	</string>
+	<string name="Right Ear">
+		右耳
+	</string>
+	<string name="Left Eyeball">
+		左目眼球
+	</string>
+	<string name="Right Eyeball">
+		右目眼球
+	</string>
+	<string name="Nose">
+		é¼»
+	</string>
+	<string name="R Upper Arm">
+		右上腕
+	</string>
+	<string name="R Forearm">
+		右前腕
+	</string>
+	<string name="L Upper Arm">
+		左上腕
+	</string>
+	<string name="L Forearm">
+		左前腕
+	</string>
+	<string name="Right Hip">
+		右腰
+	</string>
+	<string name="R Upper Leg">
+		右上脚
+	</string>
+	<string name="R Lower Leg">
+		右下脚
+	</string>
+	<string name="Left Hip">
+		左腰
+	</string>
+	<string name="L Upper Leg">
+		左上脚
+	</string>
+	<string name="L Lower Leg">
+		左下脚
+	</string>
+	<string name="Stomach">
+		è…¹
+	</string>
+	<string name="Left Pec">
+		左胸筋
+	</string>
+	<string name="Right Pec">
+		右胸筋
+	</string>
+	<string name="YearsMonthsOld">
+		[AGEYEARS] [AGEMONTHS]
+	</string>
+	<string name="YearsOld">
+		[AGEYEARS]
+	</string>
+	<string name="MonthsOld">
+		[AGEMONTHS]
+	</string>
+	<string name="WeeksOld">
+		[AGEWEEKS]
+	</string>
+	<string name="DaysOld">
+		[AGEDAYS]
+	</string>
+	<string name="TodayOld">
+		今日参加
+	</string>
+	<string name="AgeYearsA">
+		[COUNT] å¹´
+	</string>
+	<string name="AgeYearsB">
+		[COUNT] å¹´
+	</string>
+	<string name="AgeYearsC">
+		[COUNT] å¹´
+	</string>
+	<string name="AgeMonthsA">
+		[COUNT] ヶ月
+	</string>
+	<string name="AgeMonthsB">
+		[COUNT] ヶ月
+	</string>
+	<string name="AgeMonthsC">
+		[COUNT] ヶ月
+	</string>
+	<string name="AgeWeeksA">
+		[COUNT] 週間
+	</string>
+	<string name="AgeWeeksB">
+		[COUNT] 週間
+	</string>
+	<string name="AgeWeeksC">
+		[COUNT] 週間
+	</string>
+	<string name="AgeDaysA">
+		[COUNT] 日間
+	</string>
+	<string name="AgeDaysB">
+		[COUNT] 日間
+	</string>
+	<string name="AgeDaysC">
+		[COUNT] 日間
+	</string>
+	<string name="AcctTypeResident">
+		住人
+	</string>
+	<string name="AcctTypeTrial">
+		トライアル
+	</string>
+	<string name="AcctTypeCharterMember">
+		特権メンバー
+	</string>
+	<string name="AcctTypeEmployee">
+		Linden Lab従業員
+	</string>
+	<string name="PaymentInfoUsed">
+		支払い情報登録済
+	</string>
+	<string name="PaymentInfoOnFile">
+		支払い情報登録済み
+	</string>
+	<string name="NoPaymentInfoOnFile">
+		支払い情報未登録
+	</string>
+	<string name="AgeVerified">
+		年齢確認済み
+	</string>
+	<string name="NotAgeVerified">
+		年齢未確認
+	</string>
+	<string name="Center 2">
+		中心 2
+	</string>
+	<string name="Top Right">
+		右上
+	</string>
+	<string name="Top">
+		上部
+	</string>
+	<string name="Top Left">
+		左上
+	</string>
+	<string name="Center">
+		中心
+	</string>
+	<string name="Bottom Left">
+		Bottom Left
+	</string>
+	<string name="Bottom">
+		Bottom
+	</string>
+	<string name="Bottom Right">
+		Bottom Right
+	</string>
+	<string name="CompileQueueDownloadedCompiling">
+		ダウンロード完了、コンパイル中
+	</string>
+	<string name="CompileQueueScriptNotFound">
+		サーバー上にスクリプトが見つかりません。
+	</string>
+	<string name="CompileQueueProblemDownloading">
+		ダウンロードに問題があります
+	</string>
+	<string name="CompileQueueInsufficientPermDownload">
+		権限不足のためスクリプトをダウンロードできません。
+	</string>
+	<string name="CompileQueueInsufficientPermFor">
+		権限不足:
+	</string>
+	<string name="CompileQueueUnknownFailure">
+		原因不明の失敗によりダウンロードができません
+	</string>
+	<string name="CompileQueueTitle">
+		リコンパイル進行
+	</string>
+	<string name="CompileQueueStart">
+		リコンパイル
+	</string>
+	<string name="ResetQueueTitle">
+		進行をリセット
+	</string>
+	<string name="ResetQueueStart">
+		リセット
+	</string>
+	<string name="RunQueueTitle">
+		実行を続けるよう設定
+	</string>
+	<string name="RunQueueStart">
+		実行中に設定
+	</string>
+	<string name="NotRunQueueTitle">
+		実行を停止するよう設定
+	</string>
+	<string name="NotRunQueueStart">
+		実行停止に設定
+	</string>
+	<string name="CompileSuccessful">
+		コンパイルが完了しました!
+	</string>
+	<string name="CompileSuccessfulSaving">
+		コンパイル完了、保存中です...
+	</string>
+	<string name="SaveComplete">
+		保存完了。
+	</string>
+	<string name="ObjectOutOfRange">
+		スクリプト(オブジェクトが範囲外にあります)
+	</string>
+	<string name="GodToolsObjectOwnedBy">
+		[OWNER] 所有のオブジェクト「[OBJECT]」
+	</string>
+	<string name="GroupsNone">
+		なし
+	</string>
+	<string name="Unknown">
+		(不明)
+	</string>
+	<string name="Balance">
+		残高
+	</string>
+	<string name="Credits">
+		収入
+	</string>
+	<string name="Debits">
+		支出
+	</string>
+	<string name="Total">
+		合計
+	</string>
+	<string name="NoGroupDataFound">
+		グループのデータが見つかりませんでした
+	</string>
+	<string name="IMParentEstate">
+		parent estate
+	</string>
+	<string name="IMMainland">
+		メインランド
+	</string>
+	<string name="IMTeen">
+		ティーン
+	</string>
+	<string name="RegionInfoError">
+		エラー
+	</string>
+	<string name="RegionInfoAllEstatesOwnedBy">
+		[OWNER] が所有するすべての不動産
+	</string>
+	<string name="RegionInfoAllEstatesYouOwn">
+		あなたが所有するすべての不動産
+	</string>
+	<string name="RegionInfoAllEstatesYouManage">
+		あなたが [OWNER] のために管理するすべての不動産
+	</string>
+	<string name="RegionInfoAllowedResidents">
+		許可された住人: ([ALLOWEDAGENTS] 人、最大 [MAXACCESS] 人)
+	</string>
+	<string name="RegionInfoAllowedGroups">
+		許可されたグループ: ([ALLOWEDGROUPS]、最大 [MAXACCESS] グループ)
+	</string>
+	<string name="CursorPos">
+		[LINE] 行目、[COLUMN] 列目
+	</string>
+	<string name="PanelDirCountFound">
+		[COUNT] 件見つかりました
+	</string>
+	<string name="PanelContentsNewScript">
+		新規スクリプト
+	</string>
+	<string name="MuteByName">
+		(名称別)
+	</string>
+	<string name="MuteAgent">
+		(住人)
+	</string>
+	<string name="MuteObject">
+		(オブジェクト)
+	</string>
+	<string name="MuteGroup">
+		(グループ)
+	</string>
+	<string name="RegionNoCovenant">
+		この不動産には約款がありません。
+	</string>
+	<string name="RegionNoCovenantOtherOwner">
+		この不動産には約款がありません。 この不動産上の土地は不動産所有者により販売され、Linden Lab では販売していません。  販売に関するお問い合わせは、不動産所有者までお願い致します。
+	</string>
+	<string name="covenant_last_modified">
+		最終修正日:
+	</string>
+	<string name="GroupOwned">
+		グループ所有
+	</string>
+	<string name="Public">
+		パブリック
+	</string>
+	<string name="ClassifiedClicksTxt">
+		クリック数: [TELEPORT] テレポート、 [MAP] 地図、 [PROFILE] プロフィール
+	</string>
+	<string name="ClassifiedUpdateAfterPublish">
+		(掲載後更新)
+	</string>
+	<string name="GroupVoteYes">
+		はい
+	</string>
+	<string name="GroupVoteNo">
+		いいえ
+	</string>
+	<string name="GroupVoteNoActiveProposals">
+		継続中の提案は現在ありません
+	</string>
+	<string name="GroupVoteNoArchivedProposals">
+		提案のアーカイブは現在ありません
+	</string>
+	<string name="GroupVoteRetrievingArchivedProposals">
+		提案のアーカイブを取得中です
+	</string>
+	<string name="GroupVoteRetrievingActiveProposals">
+		継続中の提案を取得中です
+	</string>
+	<string name="MultiPreviewTitle">
+		プレビュー
+	</string>
+	<string name="MultiPropertiesTitle">
+		Properties
+	</string>
+	<string name="InvOfferAnObjectNamed">
+		オブジェクト名
+	</string>
+	<string name="InvOfferOwnedByGroup">
+		所有グループ
+	</string>
+	<string name="InvOfferOwnedByUnknownGroup">
+		不明なグループ所有
+	</string>
+	<string name="InvOfferOwnedBy">
+		所有者
+	</string>
+	<string name="InvOfferOwnedByUnknownUser">
+		不明なユーザー所有
+	</string>
+	<string name="InvOfferGaveYou">
+		gave you
+	</string>
+	<string name="InvOfferYouDecline">
+		You decline
+	</string>
+	<string name="InvOfferFrom">
+		from
+	</string>
+	<string name="GroupMoneyTotal">
+		合計
+	</string>
+	<string name="GroupMoneyBought">
+		bought
+	</string>
+	<string name="GroupMoneyPaidYou">
+		paid you
+	</string>
+	<string name="GroupMoneyPaidInto">
+		paid into
+	</string>
+	<string name="GroupMoneyBoughtPassTo">
+		bought pass to
+	</string>
+	<string name="GroupMoneyPaidFeeForEvent">
+		paid fee for event
+	</string>
+	<string name="GroupMoneyPaidPrizeForEvent">
+		paid prize for event
+	</string>
+	<string name="GroupMoneyBalance">
+		残高
+	</string>
+	<string name="GroupMoneyCredits">
+		収入
+	</string>
+	<string name="GroupMoneyDebits">
+		支出
+	</string>
+	<string name="ViewerObjectContents">
+		中身
+	</string>
+	<string name="AcquiredItems">
+		取得アイテム
+	</string>
+	<string name="Cancel">
+		キャンセル
+	</string>
+	<string name="UploadingCosts">
+		%s のアップロード代金:
+	</string>
+	<string name="UnknownFileExtension">
+		不明の拡張子: %s
+使用可能な拡張子: .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
+	</string>
+	<string name="AddLandmarkNavBarMenu">
+		ランドマークを追加...
+	</string>
+	<string name="EditLandmarkNavBarMenu">
+		ランドマークを編集...
+	</string>
+	<string name="accel-mac-control">
+		⌃
+	</string>
+	<string name="accel-mac-command">
+		⌘
+	</string>
+	<string name="accel-mac-option">
+		⌥
+	</string>
+	<string name="accel-mac-shift">
+		⇧
+	</string>
+	<string name="accel-win-control">
+		Ctrl+
+	</string>
+	<string name="accel-win-alt">
+		Alt+
+	</string>
+	<string name="accel-win-shift">
+		Shift+
+	</string>
+	<string name="FileSaved">
+		ファイルが保存されました
+	</string>
+	<string name="Receiving">
+		取得中
+	</string>
+	<string name="AM">
+		AM
+	</string>
+	<string name="PM">
+		PM
+	</string>
+	<string name="PST">
+		米国西部標準時
+	</string>
+	<string name="PDT">
+		米国西部夏時間
+	</string>
+	<string name="Forward">
+		前
+	</string>
+	<string name="Left">
+		å·¦
+	</string>
+	<string name="Right">
+		右
+	</string>
+	<string name="Back">
+		後ろ
+	</string>
+	<string name="North">
+		北
+	</string>
+	<string name="South">
+		南
+	</string>
+	<string name="West">
+		西
+	</string>
+	<string name="East">
+		東
+	</string>
+	<string name="Up">
+		上
+	</string>
+	<string name="Down">
+		下
+	</string>
+	<string name="Any Category">
+		全カテゴリ
+	</string>
+	<string name="Shopping">
+		ショッピング
+	</string>
+	<string name="Land Rental">
+		土地のレンタル
+	</string>
+	<string name="Property Rental">
+		建物のレンタル
+	</string>
+	<string name="Special Attraction">
+		特別アトラクション
+	</string>
+	<string name="New Products">
+		新製品
+	</string>
+	<string name="Employment">
+		雇用
+	</string>
+	<string name="Wanted">
+		求む
+	</string>
+	<string name="Service">
+		サービス
+	</string>
+	<string name="Personal">
+		パーソナル
+	</string>
+	<string name="None">
+		なし
+	</string>
+	<string name="Linden Location">
+		Linden所在地
+	</string>
+	<string name="Adult">
+		Adult
+	</string>
+	<string name="Arts&amp;Culture">
+		アートとカルチャー
+	</string>
+	<string name="Business">
+		ビジネス
+	</string>
+	<string name="Educational">
+		教育的
+	</string>
+	<string name="Gaming">
+		ゲーム
+	</string>
+	<string name="Hangout">
+		たまり場
+	</string>
+	<string name="Newcomer Friendly">
+		新住人に好意的
+	</string>
+	<string name="Parks&amp;Nature">
+		公園と自然
+	</string>
+	<string name="Residential">
+		住宅用
+	</string>
+	<string name="Stage">
+		ステージ
+	</string>
+	<string name="Other">
+		その他
+	</string>
+	<string name="Any">
+		全員
+	</string>
+	<string name="You">
+		あなた
+	</string>
+	<string name=":">
+		:
+	</string>
+	<string name=",">
+		,
+	</string>
+	<string name="...">
+		...
+	</string>
+	<string name="***">
+		***
+	</string>
+	<string name="(">
+		(
+	</string>
+	<string name=")">
+		)
+	</string>
+	<string name=".">
+		.
+	</string>
+	<string name="&apos;">
+		&apos;
+	</string>
+	<string name="---">
+		---
+	</string>
+	<string name="MBCmdLineError">
+		コマンドラインにエラーが見つかりました。
+リンク先を参照してください: http://wiki.secondlife.com/wiki/Client_parameters
+エラー:
+	</string>
+	<string name="MBCmdLineUsg">
+		[APP_NAME] コマンドライン使用:
+	</string>
+	<string name="MBUnableToAccessFile">
+		[APP_NAME] は必要なファイルにアクセスできません。
+
+複数のコピーを実行中か、ファイルが既に開いているとあなたのシステムが誤認識している可能性があります。
+このメッセージが何度も出る場合は、コンピューターを再起動してもう一度お試しください。
+それでも問題が続く場合、[APP_NAME] を完全にアンインストールして、再インストールをしてください。
+	</string>
+	<string name="MBFatalError">
+		致命的なエラー
+	</string>
+	<string name="MBRequiresAltiVec">
+		[APP_NAME] は、AltiVec搭載のプロセッサが必要です。(G4 以降)
+	</string>
+	<string name="MBAlreadyRunning">
+		[APP_NAME] はすでに実行中です。
+最小化されたプログラムのコピーをタスクバーで確認してください。
+このメッセージが何度も出る場合はコンピューターを再起動してください。
+	</string>
+	<string name="MBFrozenCrashed">
+		[APP_NAME] は前回の実行時にフリーズしています。
+クラッシュ報告を送信しますか?
+	</string>
+	<string name="MBAlert">
+		警告
+	</string>
+	<string name="MBNoDirectX">
+		[APP_NAME] は DirectX 9.0b 及びそれ以降のバージョンを検出することができませんでした。
+[APP_NAME] は DirectX を使用して安定性の問題、低パフォーマンス、クラッシュ等悪影響を与えるハードウェアや古いドライバを検出します。  DirectX 9.0b がなくても [APP_NAME] を実行できますが、DirectX 9.0bとのご使用を強く推奨します。
+
+続けますか?
+	</string>
+	<string name="MBWarning">
+		警告
+	</string>
+	<string name="MBNoAutoUpdate">
+		自動更新は現在 Linux には対応していません。
+www.secondlife.com から最新バージョンをダウンロードしてください。
+	</string>
+	<string name="MBRegClassFailed">
+		RegisterClass 失敗
+	</string>
+	<string name="MBError">
+		エラー
+	</string>
+	<string name="MBFullScreenErr">
+		[WIDTH] x [HEIGHT] では全画面で実行することができません。
+ウィンドウモードで実行中です。
+	</string>
+	<string name="MBDestroyWinFailed">
+		シャットダウンエラー(DestroyWindow() 失敗)
+	</string>
+	<string name="MBShutdownErr">
+		シャットダウンエラー
+	</string>
+	<string name="MBDevContextErr">
+		GL ディバイスコンテキストが作れません
+	</string>
+	<string name="MBPixelFmtErr">
+		適切なピクセル形式が見つかりません
+	</string>
+	<string name="MBPixelFmtDescErr">
+		ピクセル形式情報が見つかりません
+	</string>
+	<string name="MBTrueColorWindow">
+		[APP_NAME] をウィンドウで実行するには、True Color(32ビット)が必要です。
+「コントロールパネル」>「画面」>「設定」に行き、「最高 (32 ビット)」に設定してください。
+全画面を選択した場合、実行時に [APP_NAME] は自動的にスクリーンを調整します。
+	</string>
+	<string name="MBAlpha">
+		[APP_NAME] は 8 ビットのアルファチャンネルを取得できないため実行できません。  通常ビデオカードのドライバの問題で起こります。
+お使いのコンピューターに最新のビデオカードドライバがインストールされているかご確認ください。
+また、「コントロールパネル」>「画面」>「設定」内で、モニターが「最高 (32ビット)」に設定されていることもご確認ください。
+このメッセージが何度も出る場合は、[SUPPORT_SITE] へご連絡ください。
+	</string>
+	<string name="MBPixelFmtSetErr">
+		ピクセル形式が設定できません
+	</string>
+	<string name="MBGLContextErr">
+		GL レンダーコンテキストが作れません
+	</string>
+	<string name="MBGLContextActErr">
+		GL レンダーコンテキストをアクティベートできません
+	</string>
+	<string name="MBVideoDrvErr">
+		お使いのコンピューターのビデオカードドライバが正常にインストールできなかった、または古いかサポート対象外のため、[APP_NAME] は実行できません。 最新のビデオカードドライバがインストールされているのを確認し、されている場合は再インストールをお試しください。
+
+このメッセージが何度も出る場合は、[SUPPORT_SITE] へご連絡ください。
+	</string>
+	<string name="5 O&apos;Clock Shadow">
+		うっすらとしたヒゲ
+	</string>
+	<string name="All White">
+		真っ白
+	</string>
+	<string name="Anime Eyes">
+		アニメ風の目
+	</string>
+	<string name="Arced">
+		アーチ
+	</string>
+	<string name="Arm Length">
+		腕の長さ
+	</string>
+	<string name="Attached">
+		小
+	</string>
+	<string name="Attached Earlobes">
+		耳たぶ
+	</string>
+	<string name="Back Bangs">
+		後ろにかき上げた前髪
+	</string>
+	<string name="Back Bangs Down">
+		後ろにかき上げて下ろした前髪
+	</string>
+	<string name="Back Bangs Up">
+		後ろにかき上げて持ち上げた前髪
+	</string>
+	<string name="Back Fringe">
+		後ろ髪の毛先
+	</string>
+	<string name="Back Hair">
+		後ろ髪
+	</string>
+	<string name="Back Hair Down">
+		下ろした後ろ髪
+	</string>
+	<string name="Back Hair Up">
+		アップにした後ろ髪
+	</string>
+	<string name="Baggy">
+		たるんでいる
+	</string>
+	<string name="Bangs">
+		前髪
+	</string>
+	<string name="Bangs Down">
+		下ろした前髪
+	</string>
+	<string name="Bangs Up">
+		持ち上げた前髪
+	</string>
+	<string name="Beady Eyes">
+		ビーズのような目
+	</string>
+	<string name="Belly Size">
+		お腹の大きさ
+	</string>
+	<string name="Big">
+		大
+	</string>
+	<string name="Big Butt">
+		大
+	</string>
+	<string name="Big Eyeball">
+		大きい眼球
+	</string>
+	<string name="Big Hair Back">
+		髪の大部分: 後ろ
+	</string>
+	<string name="Big Hair Front">
+		髪の大部分: 前
+	</string>
+	<string name="Big Hair Top">
+		髪の大部分: 上部
+	</string>
+	<string name="Big Head">
+		大
+	</string>
+	<string name="Big Pectorals">
+		大
+	</string>
+	<string name="Big Spikes">
+		とげあり
+	</string>
+	<string name="Black">
+		é»’
+	</string>
+	<string name="Blonde">
+		ブロンド
+	</string>
+	<string name="Blonde Hair">
+		ブロンドの髪
+	</string>
+	<string name="Blush">
+		チーク
+	</string>
+	<string name="Blush Color">
+		チークカラー
+	</string>
+	<string name="Blush Opacity">
+		チークの濃さ
+	</string>
+	<string name="Body Definition">
+		体の精細度
+	</string>
+	<string name="Body Fat">
+		体脂肪
+	</string>
+	<string name="Body Freckles">
+		体のしみ・そばかす
+	</string>
+	<string name="Body Thick">
+		骨太
+	</string>
+	<string name="Body Thickness">
+		体の厚み
+	</string>
+	<string name="Body Thin">
+		細め
+	</string>
+	<string name="Bow Legged">
+		外股
+	</string>
+	<string name="Breast Buoyancy">
+		胸の重力
+	</string>
+	<string name="Breast Cleavage">
+		胸の谷間
+	</string>
+	<string name="Breast Size">
+		胸の大きさ
+	</string>
+	<string name="Bridge Width">
+		両目の間の幅
+	</string>
+	<string name="Broad">
+		広
+	</string>
+	<string name="Brow Size">
+		眉毛の大きさ
+	</string>
+	<string name="Bug Eyes">
+		Bug Eyes
+	</string>
+	<string name="Bugged Eyes">
+		突き出た目
+	</string>
+	<string name="Bulbous">
+		だんご
+	</string>
+	<string name="Bulbous Nose">
+		だんご鼻
+	</string>
+	<string name="Bushy Eyebrows">
+		太
+	</string>
+	<string name="Bushy Hair">
+		ぼさぼさヘア
+	</string>
+	<string name="Butt Size">
+		お尻の大きさ
+	</string>
+	<string name="bustle skirt">
+		後ろの膨らみ
+	</string>
+	<string name="no bustle">
+		膨らみなし
+	</string>
+	<string name="more bustle">
+		膨らみ大
+	</string>
+	<string name="Chaplin">
+		Chaplin
+	</string>
+	<string name="Cheek Bones">
+		ほお骨
+	</string>
+	<string name="Chest Size">
+		胸部の大きさ
+	</string>
+	<string name="Chin Angle">
+		あごの角度
+	</string>
+	<string name="Chin Cleft">
+		あごの先の割れ具合
+	</string>
+	<string name="Chin Curtains">
+		あごに沿ったひげ
+	</string>
+	<string name="Chin Depth">
+		あごの長さ
+	</string>
+	<string name="Chin Heavy">
+		あごに重点
+	</string>
+	<string name="Chin In">
+		ひいたあご
+	</string>
+	<string name="Chin Out">
+		突き出たあご
+	</string>
+	<string name="Chin-Neck">
+		あごと首
+	</string>
+	<string name="Clear">
+		クリア
+	</string>
+	<string name="Cleft">
+		割れた
+	</string>
+	<string name="Close Set Eyes">
+		顔の中心寄りの目
+	</string>
+	<string name="Closed">
+		クローズ
+	</string>
+	<string name="Closed Back">
+		後ろとじ
+	</string>
+	<string name="Closed Front">
+		前とじ
+	</string>
+	<string name="Closed Left">
+		左とじ
+	</string>
+	<string name="Closed Right">
+		右とじ
+	</string>
+	<string name="Coin Purse">
+		コイン入れ
+	</string>
+	<string name="Collar Back">
+		後ろえり
+	</string>
+	<string name="Collar Front">
+		前えり
+	</string>
+	<string name="Corner Down">
+		ダウン
+	</string>
+	<string name="Corner Normal">
+		ノーマル
+	</string>
+	<string name="Corner Up">
+		アップ
+	</string>
+	<string name="Creased">
+		重いまぶた
+	</string>
+	<string name="Crooked Nose">
+		曲がった鼻
+	</string>
+	<string name="Cropped Hair">
+		短く刈り込んだ髪
+	</string>
+	<string name="Cuff Flare">
+		袖口のフレア
+	</string>
+	<string name="Dark">
+		ダーク
+	</string>
+	<string name="Dark Green">
+		ダークグリーン
+	</string>
+	<string name="Darker">
+		ダーク
+	</string>
+	<string name="Deep">
+		尖った
+	</string>
+	<string name="Default Heels">
+		デフォルトのかかと
+	</string>
+	<string name="Default Toe">
+		デフォルトのつま先
+	</string>
+	<string name="Dense">
+		濃
+	</string>
+	<string name="Dense hair">
+		密度の多い髪
+	</string>
+	<string name="Double Chin">
+		二重あご
+	</string>
+	<string name="Downturned">
+		下向き
+	</string>
+	<string name="Duffle Bag">
+		ダッフルバッグ
+	</string>
+	<string name="Ear Angle">
+		耳の角度
+	</string>
+	<string name="Ear Size">
+		耳の大きさ
+	</string>
+	<string name="Ear Tips">
+		耳の先
+	</string>
+	<string name="Egg Head">
+		たまご頭
+	</string>
+	<string name="Eye Bags">
+		下まぶた
+	</string>
+	<string name="Eye Color">
+		瞳の色
+	</string>
+	<string name="Eye Depth">
+		目のくぼみ
+	</string>
+	<string name="Eye Lightness">
+		瞳の明るさ
+	</string>
+	<string name="Eye Opening">
+		見開き具合
+	</string>
+	<string name="Eye Pop">
+		両目の大きさの対称
+	</string>
+	<string name="Eye Size">
+		目の大きさ
+	</string>
+	<string name="Eye Spacing">
+		目と目のあいだの幅
+	</string>
+	<string name="Eyeball Size">
+		眼球の大きさ
+	</string>
+	<string name="Eyebrow Arc">
+		眉毛のアーチ
+	</string>
+	<string name="Eyebrow Density">
+		眉毛の密集度
+	</string>
+	<string name="Eyebrow Height">
+		眉毛の高さ
+	</string>
+	<string name="Eyebrow Points">
+		眉毛の角
+	</string>
+	<string name="Eyebrow Size">
+		眉毛の大きさ
+	</string>
+	<string name="Eyelash Length">
+		まつげの長さ
+	</string>
+	<string name="Eyeliner">
+		アイライナー
+	</string>
+	<string name="Eyeliner Color">
+		アイライナーの色
+	</string>
+	<string name="Eyes Back">
+		目・戻る
+	</string>
+	<string name="Eyes Bugged">
+		下まぶたがたるんだ目
+	</string>
+	<string name="Eyes Forward">
+		目・次へ
+	</string>
+	<string name="Eyes Long Head">
+		Eyes Long Head
+	</string>
+	<string name="Eyes Shear Left Up">
+		Eyes Shear Left Up
+	</string>
+	<string name="Eyes Shear Right Up">
+		Eyes Shear Right Up
+	</string>
+	<string name="Eyes Short Head">
+		Eyes Short Head
+	</string>
+	<string name="Eyes Spread">
+		離れた目
+	</string>
+	<string name="Eyes Sunken">
+		くぼんだ目
+	</string>
+	<string name="Eyes Together">
+		Eyes Together
+	</string>
+	<string name="Face Shear">
+		顔のゆがみ
+	</string>
+	<string name="Facial Definition">
+		顔の精細度
+	</string>
+	<string name="Far Set Eyes">
+		離れた目
+	</string>
+	<string name="Fat">
+		太った
+	</string>
+	<string name="Fat Head">
+		太めの頭
+	</string>
+	<string name="Fat Lips">
+		大
+	</string>
+	<string name="Fat Lower">
+		Fat Lower
+	</string>
+	<string name="Fat Lower Lip">
+		厚めの下唇
+	</string>
+	<string name="Fat Torso">
+		太めの頭部
+	</string>
+	<string name="Fat Upper">
+		Fat Upper
+	</string>
+	<string name="Fat Upper Lip">
+		厚めの上唇
+	</string>
+	<string name="Female">
+		女性
+	</string>
+	<string name="Fingerless">
+		指なし
+	</string>
+	<string name="Fingers">
+		指あり
+	</string>
+	<string name="Flared Cuffs">
+		広がった袖口
+	</string>
+	<string name="Flat">
+		平ら
+	</string>
+	<string name="Flat Butt">
+		小
+	</string>
+	<string name="Flat Head">
+		絶壁頭
+	</string>
+	<string name="Flat Toe">
+		フラット
+	</string>
+	<string name="Foot Size">
+		足の大きさ
+	</string>
+	<string name="Forehead Angle">
+		ひたいの角度
+	</string>
+	<string name="Forehead Heavy">
+		ひたいに重点
+	</string>
+	<string name="Freckles">
+		しみ・そばかす
+	</string>
+	<string name="Front Bangs Down">
+		下ろした前髪
+	</string>
+	<string name="Front Bangs Up">
+		上げた前髪
+	</string>
+	<string name="Front Fringe">
+		前髪の毛先
+	</string>
+	<string name="Front Hair">
+		前髪
+	</string>
+	<string name="Front Hair Down">
+		下ろした前髪
+	</string>
+	<string name="Front Hair Up">
+		アップにした前髪
+	</string>
+	<string name="Full Back">
+		刈られていない髪
+	</string>
+	<string name="Full Eyeliner">
+		あり
+	</string>
+	<string name="Full Front">
+		刈られていない髪
+	</string>
+	<string name="Full Hair Sides">
+		サイドの髪
+	</string>
+	<string name="Full Sides">
+		生え揃ったサイド
+	</string>
+	<string name="Glossy">
+		あり
+	</string>
+	<string name="Glove Fingers">
+		手袋の指
+	</string>
+	<string name="Glove Length">
+		手袋の長さ
+	</string>
+	<string name="Hair">
+		髪
+	</string>
+	<string name="Hair Back">
+		髪: 後ろ
+	</string>
+	<string name="Hair Front">
+		髪: 前
+	</string>
+	<string name="Hair Sides">
+		髪: サイド
+	</string>
+	<string name="Hair Sweep">
+		流す
+	</string>
+	<string name="Hair Thickess">
+		髪の量
+	</string>
+	<string name="Hair Thickness">
+		髪の量
+	</string>
+	<string name="Hair Tilt">
+		髪の向き
+	</string>
+	<string name="Hair Tilted Left">
+		左向き
+	</string>
+	<string name="Hair Tilted Right">
+		右向き
+	</string>
+	<string name="Hair Volume">
+		髪: ボリューム
+	</string>
+	<string name="Hand Size">
+		手の大きさ
+	</string>
+	<string name="Handlebars">
+		ハンドルバー
+	</string>
+	<string name="Head Length">
+		頭の長さ
+	</string>
+	<string name="Head Shape">
+		頭の形
+	</string>
+	<string name="Head Size">
+		頭の大きさ
+	</string>
+	<string name="Head Stretch">
+		頭の伸び具合
+	</string>
+	<string name="Heel Height">
+		ヒールの高さ
+	</string>
+	<string name="Heel Shape">
+		ヒールの形
+	</string>
+	<string name="Height">
+		身長
+	</string>
+	<string name="High">
+		高
+	</string>
+	<string name="High Heels">
+		ハイヒール
+	</string>
+	<string name="High Jaw">
+		高
+	</string>
+	<string name="High Platforms">
+		厚底
+	</string>
+	<string name="High and Tight">
+		高めでタイト
+	</string>
+	<string name="Higher">
+		高
+	</string>
+	<string name="Hip Length">
+		腰の長さ
+	</string>
+	<string name="Hip Width">
+		腰の幅
+	</string>
+	<string name="In">
+		内向き
+	</string>
+	<string name="In Shdw Color">
+		内側のシャドウカラー
+	</string>
+	<string name="In Shdw Opacity">
+		内側のシャドウの濃さ
+	</string>
+	<string name="Inner Eye Corner">
+		目頭
+	</string>
+	<string name="Inner Eye Shadow">
+		内側のアイシャドウ
+	</string>
+	<string name="Inner Shadow">
+		内側のシャドウ
+	</string>
+	<string name="Jacket Length">
+		ジャケット丈
+	</string>
+	<string name="Jacket Wrinkles">
+		ジャケットのしわ
+	</string>
+	<string name="Jaw Angle">
+		あごの角度
+	</string>
+	<string name="Jaw Jut">
+		あごの突出
+	</string>
+	<string name="Jaw Shape">
+		あごの形
+	</string>
+	<string name="Join">
+		寄せた
+	</string>
+	<string name="Jowls">
+		えら
+	</string>
+	<string name="Knee Angle">
+		膝の角度
+	</string>
+	<string name="Knock Kneed">
+		内股
+	</string>
+	<string name="Large">
+		大
+	</string>
+	<string name="Large Hands">
+		大
+	</string>
+	<string name="Left Part">
+		左分け
+	</string>
+	<string name="Leg Length">
+		脚の長さ
+	</string>
+	<string name="Leg Muscles">
+		脚の筋肉
+	</string>
+	<string name="Less">
+		小
+	</string>
+	<string name="Less Body Fat">
+		少なめ
+	</string>
+	<string name="Less Curtains">
+		少なめ
+	</string>
+	<string name="Less Freckles">
+		少なめ
+	</string>
+	<string name="Less Full">
+		薄い
+	</string>
+	<string name="Less Gravity">
+		å°‘
+	</string>
+	<string name="Less Love">
+		å°‘
+	</string>
+	<string name="Less Muscles">
+		少なめ
+	</string>
+	<string name="Less Muscular">
+		少なめ
+	</string>
+	<string name="Less Rosy">
+		少な目
+	</string>
+	<string name="Less Round">
+		丸み少な目
+	</string>
+	<string name="Less Saddle">
+		小
+	</string>
+	<string name="Less Square">
+		小
+	</string>
+	<string name="Less Volume">
+		ボリューム少な目
+	</string>
+	<string name="Less soul">
+		小
+	</string>
+	<string name="Lighter">
+		ライト
+	</string>
+	<string name="Lip Cleft">
+		唇の山
+	</string>
+	<string name="Lip Cleft Depth">
+		唇の山の高さ
+	</string>
+	<string name="Lip Fullness">
+		唇の厚み
+	</string>
+	<string name="Lip Pinkness">
+		唇の赤み
+	</string>
+	<string name="Lip Ratio">
+		上下唇の大きさ
+	</string>
+	<string name="Lip Thickness">
+		唇の前後幅
+	</string>
+	<string name="Lip Width">
+		口の大きさ
+	</string>
+	<string name="Lipgloss">
+		リップグロス
+	</string>
+	<string name="Lipstick">
+		口紅
+	</string>
+	<string name="Lipstick Color">
+		口紅の色
+	</string>
+	<string name="Long">
+		é•·
+	</string>
+	<string name="Long Head">
+		前後幅が広い頭
+	</string>
+	<string name="Long Hips">
+		é•·
+	</string>
+	<string name="Long Legs">
+		é•·
+	</string>
+	<string name="Long Neck">
+		é•·
+	</string>
+	<string name="Long Pigtails">
+		é•·
+	</string>
+	<string name="Long Ponytail">
+		é•·
+	</string>
+	<string name="Long Torso">
+		é•·
+	</string>
+	<string name="Long arms">
+		é•·
+	</string>
+	<string name="Longcuffs">
+		ロングカフス
+	</string>
+	<string name="Loose Pants">
+		ゆったり
+	</string>
+	<string name="Loose Shirt">
+		ゆるめ
+	</string>
+	<string name="Loose Sleeves">
+		ゆるめ
+	</string>
+	<string name="Love Handles">
+		ウエスト周り
+	</string>
+	<string name="Low">
+		低
+	</string>
+	<string name="Low Heels">
+		ローヒール
+	</string>
+	<string name="Low Jaw">
+		低
+	</string>
+	<string name="Low Platforms">
+		低め
+	</string>
+	<string name="Low and Loose">
+		低めでゆったり
+	</string>
+	<string name="Lower">
+		低
+	</string>
+	<string name="Lower Bridge">
+		鼻筋
+	</string>
+	<string name="Lower Cheeks">
+		ほおの下部
+	</string>
+	<string name="Male">
+		男性
+	</string>
+	<string name="Middle Part">
+		真ん中分け
+	</string>
+	<string name="More">
+		大
+	</string>
+	<string name="More Blush">
+		きつめ
+	</string>
+	<string name="More Body Fat">
+		多め
+	</string>
+	<string name="More Curtains">
+		多め
+	</string>
+	<string name="More Eyeshadow">
+		あり
+	</string>
+	<string name="More Freckles">
+		多め
+	</string>
+	<string name="More Full">
+		厚い
+	</string>
+	<string name="More Gravity">
+		大
+	</string>
+	<string name="More Lipstick">
+		あり
+	</string>
+	<string name="More Love">
+		大
+	</string>
+	<string name="More Lower Lip">
+		大
+	</string>
+	<string name="More Muscles">
+		多め
+	</string>
+	<string name="More Muscular">
+		筋骨隆々
+	</string>
+	<string name="More Rosy">
+		多め
+	</string>
+	<string name="More Round">
+		まる
+	</string>
+	<string name="More Saddle">
+		大
+	</string>
+	<string name="More Sloped">
+		なだらか
+	</string>
+	<string name="More Square">
+		四角
+	</string>
+	<string name="More Upper Lip">
+		大
+	</string>
+	<string name="More Vertical">
+		垂直
+	</string>
+	<string name="More Volume">
+		大
+	</string>
+	<string name="More soul">
+		大
+	</string>
+	<string name="Moustache">
+		口ひげ
+	</string>
+	<string name="Mouth Corner">
+		口角
+	</string>
+	<string name="Mouth Position">
+		口の位置
+	</string>
+	<string name="Mowhawk">
+		モヒカン
+	</string>
+	<string name="Muscular">
+		筋骨たくましい
+	</string>
+	<string name="Mutton Chops">
+		マトンチョップス
+	</string>
+	<string name="Nail Polish">
+		マニキュア
+	</string>
+	<string name="Nail Polish Color">
+		マニキュアの色
+	</string>
+	<string name="Narrow">
+		ç‹­
+	</string>
+	<string name="Narrow Back">
+		ç‹­
+	</string>
+	<string name="Narrow Front">
+		ç‹­
+	</string>
+	<string name="Narrow Lips">
+		おちょぼ口
+	</string>
+	<string name="Natural">
+		ナチュラル
+	</string>
+	<string name="Neck Length">
+		首の長さ
+	</string>
+	<string name="Neck Thickness">
+		首の太さ
+	</string>
+	<string name="No Blush">
+		なし
+	</string>
+	<string name="No Eyeliner">
+		なし
+	</string>
+	<string name="No Eyeshadow">
+		なし
+	</string>
+	<string name="No Heels">
+		なし
+	</string>
+	<string name="No Lipgloss">
+		なし
+	</string>
+	<string name="No Lipstick">
+		なし
+	</string>
+	<string name="No Part">
+		なし
+	</string>
+	<string name="No Polish">
+		なし
+	</string>
+	<string name="No Red">
+		なし
+	</string>
+	<string name="No Spikes">
+		なし
+	</string>
+	<string name="No White">
+		なし
+	</string>
+	<string name="No Wrinkles">
+		なし
+	</string>
+	<string name="Normal Lower">
+		Normal Lower
+	</string>
+	<string name="Normal Upper">
+		Normal Upper
+	</string>
+	<string name="Nose Left">
+		左曲がり
+	</string>
+	<string name="Nose Right">
+		右曲がり
+	</string>
+	<string name="Nose Size">
+		鼻の大きさ
+	</string>
+	<string name="Nose Thickness">
+		鼻の厚み
+	</string>
+	<string name="Nose Tip Angle">
+		鼻先の角度
+	</string>
+	<string name="Nose Tip Shape">
+		鼻先の形
+	</string>
+	<string name="Nose Width">
+		鼻の幅
+	</string>
+	<string name="Nostril Division">
+		鼻の穴の高さ
+	</string>
+	<string name="Nostril Width">
+		鼻の穴の幅
+	</string>
+	<string name="Old">
+		Old
+	</string>
+	<string name="Opaque">
+		濃いめ
+	</string>
+	<string name="Open">
+		オープン
+	</string>
+	<string name="Open Back">
+		後ろあき
+	</string>
+	<string name="Open Front">
+		前あき
+	</string>
+	<string name="Open Left">
+		左あき
+	</string>
+	<string name="Open Right">
+		右あき
+	</string>
+	<string name="Orange">
+		オレンジ
+	</string>
+	<string name="Out">
+		外向き
+	</string>
+	<string name="Out Shdw Color">
+		外側のシャドウカラー
+	</string>
+	<string name="Out Shdw Opacity">
+		外側のシャドウの濃さ
+	</string>
+	<string name="Outer Eye Corner">
+		目尻
+	</string>
+	<string name="Outer Eye Shadow">
+		外側のアイシャドウ
+	</string>
+	<string name="Outer Shadow">
+		外側のシャドウ
+	</string>
+	<string name="Overbite">
+		出っ歯
+	</string>
+	<string name="Package">
+		パッケージ
+	</string>
+	<string name="Painted Nails">
+		あり
+	</string>
+	<string name="Pale">
+		悪い
+	</string>
+	<string name="Pants Crotch">
+		パンツの股
+	</string>
+	<string name="Pants Fit">
+		パンツのフィット感
+	</string>
+	<string name="Pants Length">
+		パンツ丈
+	</string>
+	<string name="Pants Waist">
+		ウエスト
+	</string>
+	<string name="Pants Wrinkles">
+		パンツのしわ
+	</string>
+	<string name="Part">
+		あり
+	</string>
+	<string name="Part Bangs">
+		分けた前髪
+	</string>
+	<string name="Pectorals">
+		胸筋
+	</string>
+	<string name="Pigment">
+		色素
+	</string>
+	<string name="Pigtails">
+		下げ髪
+	</string>
+	<string name="Pink">
+		ピンク
+	</string>
+	<string name="Pinker">
+		ピンク
+	</string>
+	<string name="Platform Height">
+		靴底の高さ
+	</string>
+	<string name="Platform Width">
+		靴底の幅
+	</string>
+	<string name="Pointy">
+		尖った
+	</string>
+	<string name="Pointy Heels">
+		å¹…ç‹­
+	</string>
+	<string name="Pointy Toe">
+		先の細いつま先
+	</string>
+	<string name="Ponytail">
+		ポニーテール
+	</string>
+	<string name="Poofy Skirt">
+		ふんわり
+	</string>
+	<string name="Pop Left Eye">
+		左目を大きく
+	</string>
+	<string name="Pop Right Eye">
+		右目を大きく
+	</string>
+	<string name="Puffy">
+		ふっくら
+	</string>
+	<string name="Puffy Eyelids">
+		目の周りの膨らみ
+	</string>
+	<string name="Rainbow Color">
+		虹色
+	</string>
+	<string name="Red Hair">
+		赤毛
+	</string>
+	<string name="Red Skin">
+		赤い肌
+	</string>
+	<string name="Regular">
+		均整のとれた
+	</string>
+	<string name="Regular Muscles">
+		均整のとれた筋肉
+	</string>
+	<string name="Right Part">
+		右分け
+	</string>
+	<string name="Rosy Complexion">
+		ほおの赤らみ
+	</string>
+	<string name="Round">
+		まるっこい
+	</string>
+	<string name="Round Forehead">
+		丸みを帯びた額
+	</string>
+	<string name="Ruddiness">
+		血色
+	</string>
+	<string name="Ruddy">
+		良い
+	</string>
+	<string name="Rumpled Hair">
+		くしゃくしゃヘア
+	</string>
+	<string name="Saddle Bags">
+		腰回りの肉付き
+	</string>
+	<string name="Saddlebags">
+		腰回りの肉付き
+	</string>
+	<string name="Scrawny">
+		骨張った
+	</string>
+	<string name="Scrawny Leg">
+		骨張った脚
+	</string>
+	<string name="Separate">
+		離れた
+	</string>
+	<string name="Shading">
+		Shading
+	</string>
+	<string name="Shadow hair">
+		Shadow hair
+	</string>
+	<string name="Shallow">
+		なだらか
+	</string>
+	<string name="Shear Back">
+		後方を刈る
+	</string>
+	<string name="Shear Face">
+		顔のゆがみ
+	</string>
+	<string name="Shear Front">
+		前方を刈る
+	</string>
+	<string name="Shear Left">
+		左側
+	</string>
+	<string name="Shear Left Up">
+		左半分を上に
+	</string>
+	<string name="Shear Right">
+		右側
+	</string>
+	<string name="Shear Right Up">
+		右半分を上に
+	</string>
+	<string name="Sheared Back">
+		後ろを刈られた髪
+	</string>
+	<string name="Sheared Front">
+		前を刈られた髪
+	</string>
+	<string name="Shift Left">
+		左向き
+	</string>
+	<string name="Shift Mouth">
+		口の向き
+	</string>
+	<string name="Shift Right">
+		右向き
+	</string>
+	<string name="Shirt Bottom">
+		シャツの裾
+	</string>
+	<string name="Shirt Fit">
+		シャツのフィット感
+	</string>
+	<string name="Shirt Wrinkles">
+		シャツのしわ
+	</string>
+	<string name="Shoe Height">
+		靴の長さ
+	</string>
+	<string name="Short">
+		短
+	</string>
+	<string name="Short Arms">
+		短
+	</string>
+	<string name="Short Legs">
+		短
+	</string>
+	<string name="Short Neck">
+		短
+	</string>
+	<string name="Short Pigtails">
+		短
+	</string>
+	<string name="Short Ponytail">
+		短
+	</string>
+	<string name="Short Sideburns">
+		短め
+	</string>
+	<string name="Short Torso">
+		短
+	</string>
+	<string name="Short hips">
+		短
+	</string>
+	<string name="Shoulders">
+		è‚©
+	</string>
+	<string name="Side Bangs">
+		サイドに流した前髪
+	</string>
+	<string name="Side Bangs Down">
+		ダウン
+	</string>
+	<string name="Side Bangs Up">
+		アップ
+	</string>
+	<string name="Side Fringe">
+		サイドの毛先
+	</string>
+	<string name="Sideburns">
+		もみあげ
+	</string>
+	<string name="Sides Hair">
+		サイドの髪
+	</string>
+	<string name="Sides Hair Down">
+		ダウン
+	</string>
+	<string name="Sides Hair Up">
+		アップ
+	</string>
+	<string name="Skinny">
+		細身
+	</string>
+	<string name="Skinny Neck">
+		ç´°
+	</string>
+	<string name="Skirt Fit">
+		スカートのフィット感
+	</string>
+	<string name="Skirt Length">
+		スカート丈
+	</string>
+	<string name="Slanted Forehead">
+		傾斜した額
+	</string>
+	<string name="Sleeve Length">
+		袖丈
+	</string>
+	<string name="Sleeve Looseness">
+		袖のフィット感
+	</string>
+	<string name="Slit Back">
+		スリット: 後ろ
+	</string>
+	<string name="Slit Front">
+		スリット: 前
+	</string>
+	<string name="Slit Left">
+		スリット: 左
+	</string>
+	<string name="Slit Right">
+		スリット: 右
+	</string>
+	<string name="Small">
+		小
+	</string>
+	<string name="Small Hands">
+		小
+	</string>
+	<string name="Small Head">
+		小
+	</string>
+	<string name="Smooth">
+		滑らか
+	</string>
+	<string name="Smooth Hair">
+		スムーズ
+	</string>
+	<string name="Socks Length">
+		靴下丈
+	</string>
+	<string name="Some">
+		Some
+	</string>
+	<string name="Soulpatch">
+		ソウルパッチ
+	</string>
+	<string name="Sparse">
+		è–„
+	</string>
+	<string name="Spiked Hair">
+		とげとげヘア
+	</string>
+	<string name="Square">
+		角張った
+	</string>
+	<string name="Square Toe">
+		スクエアトゥ
+	</string>
+	<string name="Squash Head">
+		カボチャ型
+	</string>
+	<string name="Squash/Stretch Head">
+		カボチャ/縦長頭
+	</string>
+	<string name="Stretch Head">
+		縦長
+	</string>
+	<string name="Sunken">
+		こけた
+	</string>
+	<string name="Sunken Chest">
+		小
+	</string>
+	<string name="Sunken Eyes">
+		くぼんだ目
+	</string>
+	<string name="Sweep Back">
+		後ろへ
+	</string>
+	<string name="Sweep Forward">
+		前へ
+	</string>
+	<string name="Swept Back">
+		オールバック
+	</string>
+	<string name="Swept Back Hair">
+		オールバックヘア
+	</string>
+	<string name="Swept Forward">
+		前へ
+	</string>
+	<string name="Swept Forward Hair">
+		後ろへ
+	</string>
+	<string name="Tall">
+		高
+	</string>
+	<string name="Taper Back">
+		後ろに先細
+	</string>
+	<string name="Taper Front">
+		前に先細
+	</string>
+	<string name="Thick Heels">
+		幅広
+	</string>
+	<string name="Thick Neck">
+		太
+	</string>
+	<string name="Thick Toe">
+		厚め
+	</string>
+	<string name="Thickness">
+		厚み
+	</string>
+	<string name="Thin">
+		薄い
+	</string>
+	<string name="Thin Eyebrows">
+		ç´°
+	</string>
+	<string name="Thin Lips">
+		小
+	</string>
+	<string name="Thin Nose">
+		細い鼻
+	</string>
+	<string name="Tight Chin">
+		ひきしまったあご
+	</string>
+	<string name="Tight Cuffs">
+		タイト
+	</string>
+	<string name="Tight Pants">
+		タイト
+	</string>
+	<string name="Tight Shirt">
+		タイト
+	</string>
+	<string name="Tight Skirt">
+		タイト
+	</string>
+	<string name="Tight Sleeves">
+		タイト
+	</string>
+	<string name="Tilt Left">
+		左に傾斜
+	</string>
+	<string name="Tilt Right">
+		右に傾斜
+	</string>
+	<string name="Toe Shape">
+		つま先の形
+	</string>
+	<string name="Toe Thickness">
+		つま先の厚み
+	</string>
+	<string name="Torso Length">
+		上半身の長さ
+	</string>
+	<string name="Torso Muscles">
+		上半身の筋肉
+	</string>
+	<string name="Torso Scrawny">
+		上半身の骨張り
+	</string>
+	<string name="Unattached">
+		大
+	</string>
+	<string name="Uncreased">
+		軽いまぶた
+	</string>
+	<string name="Underbite">
+		受け口
+	</string>
+	<string name="Unnatural">
+		ユニーク
+	</string>
+	<string name="Upper Bridge">
+		両目のあいだ
+	</string>
+	<string name="Upper Cheeks">
+		ほおの上部
+	</string>
+	<string name="Upper Chin Cleft">
+		あご上部の割れ具合
+	</string>
+	<string name="Upper Eyelid Fold">
+		二重の幅
+	</string>
+	<string name="Upturned">
+		上向き
+	</string>
+	<string name="Very Red">
+		真っ赤
+	</string>
+	<string name="Waist Height">
+		ウエストの高さ
+	</string>
+	<string name="Well-Fed">
+		つまった
+	</string>
+	<string name="White Hair">
+		白髪
+	</string>
+	<string name="Wide">
+		広
+	</string>
+	<string name="Wide Back">
+		広
+	</string>
+	<string name="Wide Front">
+		広
+	</string>
+	<string name="Wide Lips">
+		大きい口
+	</string>
+	<string name="Wild">
+		ワイルド
+	</string>
+	<string name="Wrinkles">
+		しわあり
+	</string>
+	<string name="LocationCtrlAddLandmarkTooltip">
+		マイ ランドマークに追加
+	</string>
+	<string name="LocationCtrlEditLandmarkTooltip">
+		マイ ランドマークを編集
+	</string>
+	<string name="UpdaterWindowTitle">
+		[APP_NAME] アップデート
+	</string>
+	<string name="UpdaterNowUpdating">
+		只今 [APP_NAME] をアップデート中です...
+	</string>
+	<string name="UpdaterNowInstalling">
+		[APP_NAME] をインストール中です...
+	</string>
+	<string name="UpdaterUpdatingDescriptive">
+		お使いの [APP_NAME] ビューワが最新バージョンにアップデートされています。  数分かかることがありますのでしばらくお待ちください。
+	</string>
+	<string name="UpdaterProgressBarTextWithEllipses">
+		アップデートをダウンロード中です...
+	</string>
+	<string name="UpdaterProgressBarText">
+		アップデートをダウンロード中
+	</string>
+	<string name="UpdaterFailDownloadTitle">
+		アップデートのダウンロードに失敗しました
+	</string>
+	<string name="UpdaterFailUpdateDescriptive">
+		[APP_NAME] をアップデート中にエラーが発生しました。 www.secondlife.com から最新バージョンをダウンロードしてください。
+	</string>
+	<string name="UpdaterFailInstallTitle">
+		アップデートのインストールに失敗しました
+	</string>
+	<string name="UpdaterFailStartTitle">
+		ビューワの起動に失敗しました
+	</string>
+	<string name="only_user_message">
+		このセッションにいるユーザーはあなただけです。
+	</string>
+	<string name="offline_message">
+		[FIRST] [LAST]はオフラインです。
+	</string>
+	<string name="invite_message">
+		このボイスチャットに応答/接続する場合は、[BUTTON NAME]をクリックしてください。
+	</string>
+	<string name="generic_request_error">
+		要求中にエラーが発生しました。後でもう一度試してください。
+	</string>
+	<string name="insufficient_perms_error">
+		あなたには充分な権限がありません。
+	</string>
+	<string name="session_does_not_exist_error">
+		このセッションは既に切断されています。
+	</string>
+	<string name="no_ability_error">
+		あなたにはその能力がありません。
+	</string>
+	<string name="no_ability">
+		あなたにはその能力がありません。
+	</string>
+	<string name="not_a_mod_error">
+		あなたはセッション・モデレータではありません。
+	</string>
+	<string name="muted_error">
+		グループモデレータがあなたのテキストチャットを無効化しました
+	</string>
+	<string name="add_session_event">
+		[RECIPIENT] とのチャット・セッションにユーザーを追加することができません
+	</string>
+	<string name="message_session_event">
+		[RECIPIENT] とのチャット・セッションにメッセージを送ることができません
+	</string>
+	<string name="removed_from_group">
+		あなたはグループから削除されました。
+	</string>
+	<string name="close_on_no_ability">
+		このチャット・セッションを継続することはできません
+	</string>
+</strings>
diff --git a/indra/newview/skins/default/xui/ja/teleport_strings.xml b/indra/newview/skins/default/xui/ja/teleport_strings.xml
index ef7571cac49..440704eafad 100644
--- a/indra/newview/skins/default/xui/ja/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/ja/teleport_strings.xml
@@ -1,79 +1,79 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<teleport_messages name="">
-	<message_set name="errors">
-		<message name="invalid_tport">
-			テレポート処理中に問題が発生しました。 ログインし直す必要があるかもしれません。
-このメッセージが何度も出る場合は、[SUPPORT_SITE] へご連絡ください。
-		</message>
-		<message name="invalid_region_handoff">
-			リージョン間の移動中に問題が発生しました。 ログインし直す必要があるかもしれません。
-このメッセージが何度も出る場合は、[SUPPORT_SITE] へご連絡ください。
-		</message>
-		<message name="blocked_tport">
-			申し訳ございません。テレポートは現在、ブロックされています。もう少し後でやり直してください。
-やり直してもテレポートできない場合は、いったんログアウトし、再度ログインして問題を解決してください。
-		</message>
-		<message name="nolandmark_tport">
-			残念ながら、システムはランドマーク目的地を探せませんでした。
-		</message>
-		<message name="timeout_tport">
-			申し訳ございません。システムはテレポート接続を完了できませんでした。
-もう少し後でやり直してください。
-		</message>
-		<message name="noaccess_tport">
-			残念ながら、そのテレポート目的地へのアクセスがありません。
-		</message>
-		<message name="missing_attach_tport">
-			添付物は、まだ到着していません。あと数秒間お待ちいただくか、いったんログアウトし、再度ログインしてからテレポートをやり直してださい。
-		</message>
-		<message name="too_many_uploads_tport">
-			この地域の資産キューが現在込み合っているため、テレポート・リクエストを時間通りに処理することが難しい状況です。
-数分後にやり直すか、または混雑していない他の地域をお試しください。
-		</message>
-		<message name="expired_tport">
-			申し訳ございません。システムはテレポート・リクエストを時間どおりに完了できませんでした。数分後にやり直してください。
-		</message>
-		<message name="expired_region_handoff">
-			申し訳ございません。システムは地域間の移動を時間どおりに完了できませんでした。
-数分後にやり直してください。
-		</message>
-		<message name="no_host">
-			テレポート目的地を見つけられません。目的地が一時的に利用できない状態か、またはすでに消滅している可能性があります。数分後にやり直してください。
-		</message>
-		<message name="no_inventory_host">
-			持ち物システムは現在利用できません。
-		</message>
-	</message_set>
-	<message_set name="progress">
-		<message name="sending_dest">
-			目的地に送信しています。
-		</message>
-		<message name="redirecting">
-			別の目的地に再案内しています。
-		</message>
-		<message name="relaying">
-			目的地に中継しています。
-		</message>
-		<message name="sending_home">
-			ホーム位置リクエストを送信しています。
-		</message>
-		<message name="sending_landmark">
-			ランドマーク位置リクエストを送信しています。
-		</message>
-		<message name="completing">
-			テレポートを完了しています。
-		</message>
-		<message name="resolving">
-			目的地を解決しています。
-		</message>
-		<message name="contacting">
-			新しい地域にコンタクトしています。
-		</message>
-		<message name="arriving">
-			到着...
-		</message>
-		<message name="requesting">
-			テレポートをリクエスト...
-		</message>
-	</message_set>
-</teleport_messages>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<teleport_messages name="">
+	<message_set name="errors">
+		<message name="invalid_tport">
+			テレポート処理中に問題が発生しました。 ログインし直す必要があるかもしれません。
+このメッセージが何度も出る場合は、[SUPPORT_SITE] へご連絡ください。
+		</message>
+		<message name="invalid_region_handoff">
+			リージョン間の移動中に問題が発生しました。 ログインし直す必要があるかもしれません。
+このメッセージが何度も出る場合は、[SUPPORT_SITE] へご連絡ください。
+		</message>
+		<message name="blocked_tport">
+			申し訳ございません。テレポートは現在、ブロックされています。もう少し後でやり直してください。
+やり直してもテレポートできない場合は、いったんログアウトし、再度ログインして問題を解決してください。
+		</message>
+		<message name="nolandmark_tport">
+			残念ながら、システムはランドマーク目的地を探せませんでした。
+		</message>
+		<message name="timeout_tport">
+			申し訳ございません。システムはテレポート接続を完了できませんでした。
+もう少し後でやり直してください。
+		</message>
+		<message name="noaccess_tport">
+			残念ながら、そのテレポート目的地へのアクセスがありません。
+		</message>
+		<message name="missing_attach_tport">
+			添付物は、まだ到着していません。あと数秒間お待ちいただくか、いったんログアウトし、再度ログインしてからテレポートをやり直してださい。
+		</message>
+		<message name="too_many_uploads_tport">
+			この地域の資産キューが現在込み合っているため、テレポート・リクエストを時間通りに処理することが難しい状況です。
+数分後にやり直すか、または混雑していない他の地域をお試しください。
+		</message>
+		<message name="expired_tport">
+			申し訳ございません。システムはテレポート・リクエストを時間どおりに完了できませんでした。数分後にやり直してください。
+		</message>
+		<message name="expired_region_handoff">
+			申し訳ございません。システムは地域間の移動を時間どおりに完了できませんでした。
+数分後にやり直してください。
+		</message>
+		<message name="no_host">
+			テレポート目的地を見つけられません。目的地が一時的に利用できない状態か、またはすでに消滅している可能性があります。数分後にやり直してください。
+		</message>
+		<message name="no_inventory_host">
+			持ち物システムは現在利用できません。
+		</message>
+	</message_set>
+	<message_set name="progress">
+		<message name="sending_dest">
+			目的地に送信しています。
+		</message>
+		<message name="redirecting">
+			別の目的地に再案内しています。
+		</message>
+		<message name="relaying">
+			目的地に中継しています。
+		</message>
+		<message name="sending_home">
+			ホーム位置リクエストを送信しています。
+		</message>
+		<message name="sending_landmark">
+			ランドマーク位置リクエストを送信しています。
+		</message>
+		<message name="completing">
+			テレポートを完了しています。
+		</message>
+		<message name="resolving">
+			目的地を解決しています。
+		</message>
+		<message name="contacting">
+			新しい地域にコンタクトしています。
+		</message>
+		<message name="arriving">
+			到着...
+		</message>
+		<message name="requesting">
+			テレポートをリクエスト...
+		</message>
+	</message_set>
+</teleport_messages>
diff --git a/indra/newview/skins/default/xui/nl/panel_edit_profile.xml b/indra/newview/skins/default/xui/nl/panel_edit_profile.xml
index 00f8c087de9..172395e20a2 100644
--- a/indra/newview/skins/default/xui/nl/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/nl/panel_edit_profile.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
-   <string name="CaptionTextAcctInfo">
-       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-   </string>
-   <string name="AcctTypeResident"
-    value="Inwoner" />
-   <string name="AcctTypeTrial"
-    value="Proef" />
-   <string name="AcctTypeCharterMember"
-    value="Charter lid" />
-   <string name="AcctTypeEmployee"
-    value="Linden Lab werknemer" />
-   <string name="PaymentInfoUsed"
-    value="Betalingsinformatie gebruikt" />
-   <string name="PaymentInfoOnFile"
-    value="Betalingsinformatie aanwezig" />
-   <string name="NoPaymentInfoOnFile"
-    value="Geen betalingsinfo aanwezig" />
-   <string name="AgeVerified"
-    value="Leeftijd geverifieerd" />
-   <string name="NotAgeVerified"
-    value="Leeftijd niet geverifieerd" />
-   <string name="partner_edit_link_url">
-       http://www.secondlife.com/account/partners.php?lang=nl
-   </string>
-    <panel name="scroll_content_panel">
-    <panel name="data_panel" >
-     <panel name="lifes_images_panel">
-          <panel name="second_life_image_panel">
-              <text name="second_life_photo_title_text">
-			[SECOND_LIFE]:
-              </text>
-          </panel>
-      </panel>
-        <text name="title_partner_text" value="Partner:"/>
-        <panel name="partner_data_panel">
-            <text name="partner_text" value="[FIRST] [LAST]"/>
-         </panel>
-      <text name="text_box3">
-	Antwoord bij Niet Storen:
-      </text>
-    </panel>
-    </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="edit_profile_panel">
+   <string name="CaptionTextAcctInfo">
+       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+   </string>
+   <string name="AcctTypeResident"
+    value="Inwoner" />
+   <string name="AcctTypeTrial"
+    value="Proef" />
+   <string name="AcctTypeCharterMember"
+    value="Charter lid" />
+   <string name="AcctTypeEmployee"
+    value="Linden Lab werknemer" />
+   <string name="PaymentInfoUsed"
+    value="Betalingsinformatie gebruikt" />
+   <string name="PaymentInfoOnFile"
+    value="Betalingsinformatie aanwezig" />
+   <string name="NoPaymentInfoOnFile"
+    value="Geen betalingsinfo aanwezig" />
+   <string name="AgeVerified"
+    value="Leeftijd geverifieerd" />
+   <string name="NotAgeVerified"
+    value="Leeftijd niet geverifieerd" />
+   <string name="partner_edit_link_url">
+       http://www.secondlife.com/account/partners.php?lang=nl
+   </string>
+    <panel name="scroll_content_panel">
+    <panel name="data_panel" >
+     <panel name="lifes_images_panel">
+          <panel name="second_life_image_panel">
+              <text name="second_life_photo_title_text">
+			[SECOND_LIFE]:
+              </text>
+          </panel>
+      </panel>
+        <text name="title_partner_text" value="Partner:"/>
+        <panel name="partner_data_panel">
+            <text name="partner_text" value="[FIRST] [LAST]"/>
+         </panel>
+      <text name="text_box3">
+	Antwoord bij Niet Storen:
+      </text>
+    </panel>
+    </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_profile.xml b/indra/newview/skins/default/xui/pl/panel_edit_profile.xml
index e449a92d7e5..97fa3118f8f 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_profile.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
-   <string name="CaptionTextAcctInfo">
-       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-   </string>
-   <string name="AcctTypeResident"
-    value="Rezydent" />
-   <string name="AcctTypeTrial"
-    value="Próbne" />
-   <string name="AcctTypeCharterMember"
-    value="Członek-zalożyciel" />
-   <string name="AcctTypeEmployee"
-    value="Pracownik Linden Lab" />
-   <string name="PaymentInfoUsed"
-    value="Dane Konta Używane" />
-   <string name="PaymentInfoOnFile"
-    value="Dane Konta Dostępne" />
-   <string name="NoPaymentInfoOnFile"
-    value="Brak Danych Konta" />
-   <string name="AgeVerified"
-    value="Wiek Zweryfikowany" />
-   <string name="NotAgeVerified"
-    value="Brak Weryfikacji Wieku" />
-   <string name="partner_edit_link_url">
-       http://www.secondlife.com/account/partners.php?lang=pl
-   </string>
-    <panel name="scroll_content_panel">
-    <panel name="data_panel" >
-     <panel name="lifes_images_panel">
-          <panel name="second_life_image_panel">
-              <text name="second_life_photo_title_text">
-			[SECOND_LIFE]:
-              </text>
-          </panel>
-      </panel>
-        <text name="title_partner_text" value="Partner:"/>
-        <panel name="partner_data_panel">
-            <text name="partner_text" value="[FIRST] [LAST]"/>
-         </panel>
-      <text name="text_box3">
-	Pracuś Mówi:
-      </text>
-    </panel>
-    </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="edit_profile_panel">
+   <string name="CaptionTextAcctInfo">
+       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+   </string>
+   <string name="AcctTypeResident"
+    value="Rezydent" />
+   <string name="AcctTypeTrial"
+    value="Próbne" />
+   <string name="AcctTypeCharterMember"
+    value="Członek-zalożyciel" />
+   <string name="AcctTypeEmployee"
+    value="Pracownik Linden Lab" />
+   <string name="PaymentInfoUsed"
+    value="Dane Konta Używane" />
+   <string name="PaymentInfoOnFile"
+    value="Dane Konta Dostępne" />
+   <string name="NoPaymentInfoOnFile"
+    value="Brak Danych Konta" />
+   <string name="AgeVerified"
+    value="Wiek Zweryfikowany" />
+   <string name="NotAgeVerified"
+    value="Brak Weryfikacji Wieku" />
+   <string name="partner_edit_link_url">
+       http://www.secondlife.com/account/partners.php?lang=pl
+   </string>
+    <panel name="scroll_content_panel">
+    <panel name="data_panel" >
+     <panel name="lifes_images_panel">
+          <panel name="second_life_image_panel">
+              <text name="second_life_photo_title_text">
+			[SECOND_LIFE]:
+              </text>
+          </panel>
+      </panel>
+        <text name="title_partner_text" value="Partner:"/>
+        <panel name="partner_data_panel">
+            <text name="partner_text" value="[FIRST] [LAST]"/>
+         </panel>
+      <text name="text_box3">
+	Pracuś Mówi:
+      </text>
+    </panel>
+    </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_profile.xml b/indra/newview/skins/default/xui/pt/panel_edit_profile.xml
index e97e77cfe6f..a989cab1671 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_profile.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
-   <string name="CaptionTextAcctInfo">
-       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-   </string>
-   <string name="AcctTypeResident"
-    value="Residente" />
-   <string name="AcctTypeTrial"
-    value="Teste" />
-   <string name="AcctTypeCharterMember"
-    value="Estatuto do membro" />
-   <string name="AcctTypeEmployee"
-    value="Contratado da Linden Lab" />
-   <string name="PaymentInfoUsed"
-    value="Infor. de pagamento utilizadas" />
-   <string name="PaymentInfoOnFile"
-    value="Infor. de pagamento no arquivo" />
-   <string name="NoPaymentInfoOnFile"
-    value="Sem infor. de pagamento no arquivo" />
-   <string name="AgeVerified"
-    value="Idade Verificada" />
-   <string name="NotAgeVerified"
-    value="Idade não Verificada" />
-   <string name="partner_edit_link_url">
-       http://www.secondlife.com/account/partners.php?lang=pt
-   </string>
-    <panel name="scroll_content_panel">
-    <panel name="data_panel" >
-     <panel name="lifes_images_panel">
-          <panel name="second_life_image_panel">
-              <text name="second_life_photo_title_text">
-			[SECOND_LIFE]:
-              </text>
-          </panel>
-      </panel>
-        <text name="title_partner_text" value="Parceiro:"/>
-        <panel name="partner_data_panel">
-            <text name="partner_text" value="[FIRST] [LAST]"/>
-         </panel>
-      <text name="text_box3">
-	Resposta no Modo Ocupado:
-      </text>
-    </panel>
-    </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="edit_profile_panel">
+   <string name="CaptionTextAcctInfo">
+       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+   </string>
+   <string name="AcctTypeResident"
+    value="Residente" />
+   <string name="AcctTypeTrial"
+    value="Teste" />
+   <string name="AcctTypeCharterMember"
+    value="Estatuto do membro" />
+   <string name="AcctTypeEmployee"
+    value="Contratado da Linden Lab" />
+   <string name="PaymentInfoUsed"
+    value="Infor. de pagamento utilizadas" />
+   <string name="PaymentInfoOnFile"
+    value="Infor. de pagamento no arquivo" />
+   <string name="NoPaymentInfoOnFile"
+    value="Sem infor. de pagamento no arquivo" />
+   <string name="AgeVerified"
+    value="Idade Verificada" />
+   <string name="NotAgeVerified"
+    value="Idade não Verificada" />
+   <string name="partner_edit_link_url">
+       http://www.secondlife.com/account/partners.php?lang=pt
+   </string>
+    <panel name="scroll_content_panel">
+    <panel name="data_panel" >
+     <panel name="lifes_images_panel">
+          <panel name="second_life_image_panel">
+              <text name="second_life_photo_title_text">
+			[SECOND_LIFE]:
+              </text>
+          </panel>
+      </panel>
+        <text name="title_partner_text" value="Parceiro:"/>
+        <panel name="partner_data_panel">
+            <text name="partner_text" value="[FIRST] [LAST]"/>
+         </panel>
+      <text name="text_box3">
+	Resposta no Modo Ocupado:
+      </text>
+    </panel>
+    </panel>
+</panel>
-- 
GitLab


From 5b2c91598dffe7d5c9d676dd866f438d3adb9989 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 18 Nov 2009 21:07:49 -0500
Subject: [PATCH 445/557] EXT-2636 : No "fetching inventory" or other
 indication that inventory is loading.

---
 indra/newview/llfloaterinventory.cpp | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp
index 92778510e70..db38fc0fb34 100644
--- a/indra/newview/llfloaterinventory.cpp
+++ b/indra/newview/llfloaterinventory.cpp
@@ -64,10 +64,7 @@ BOOL LLFloaterInventory::postBuild()
 
 void LLFloaterInventory::draw()
 {
- 	if (LLInventoryModel::isEverythingFetched())
-	{
-		updateTitle();
-	}
+	updateTitle();
 	LLFloater::draw();
 }
 
@@ -85,10 +82,14 @@ void LLFloaterInventory::updateTitle()
 	{
 		setTitle(getString("TitleFetching", string_args));
 	}
-	else
+	else if (LLInventoryModel::isEverythingFetched())
 	{
 		setTitle(getString("TitleCompleted", string_args));
 	}
+	else
+	{
+		setTitle(getString("Title"));
+	}
 }
 
 void LLFloaterInventory::changed(U32 mask)
-- 
GitLab


From ff6eea998daf353cfbff6b0323399bfd95492fcc Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Wed, 18 Nov 2009 18:08:32 -0800
Subject: [PATCH 446/557] Change close behavior to not end session. * NOTE:
 This is functional, but not ideal - it's still closing the floater; we really
 want to change the behavior of the X button instead. Also made the group IM
 floater a little less broken.

---
 indra/newview/llimfloater.cpp                                 | 2 --
 indra/newview/skins/default/xui/en/floater_im_session.xml     | 4 ++--
 .../skins/default/xui/en/panel_group_control_panel.xml        | 3 +--
 3 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index dbbf98ad08a..b7c614d09c3 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -106,8 +106,6 @@ void LLIMFloater::onFocusReceived()
 // virtual
 void LLIMFloater::onClose(bool app_quitting)
 {
-	if (!gIMMgr->hasSession(mSessionID)) return;
-	
 	setTyping(false);
 	gIMMgr->leaveSession(mSessionID);
 }
diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index e972cf39bf7..c20aaea2aa3 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -10,9 +10,9 @@
  top="0"
  can_close="true"
  can_dock="true"
- can_minimize="true"
+ can_minimize="false"
  visible="true"
- width="350"
+ width="300"
  can_resize="true"
  min_width="300"
  min_height="350">
diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
index 763dd7b9220..2fee2033f6f 100644
--- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
@@ -8,7 +8,7 @@
     <avatar_list
      color="DkGray2"
      follows="left|top|right|bottom"
-     height="130"
+     height="100"
      ignore_online_status="true"
      layout="topleft"
      left="3"
@@ -32,7 +32,6 @@
      background_visible="true"
      bg_alpha_color="0.2 0.2 0.2 1"
      border="false"
-     bottom="1"
      follows="left|bottom"
      height="70"
      left="0"
-- 
GitLab


From 5acb1650251138125781b7e21ca8998484f6db85 Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Wed, 18 Nov 2009 18:08:59 -0800
Subject: [PATCH 447/557] Change close behavior to not end session. * NOTE:
 This is functional, but not ideal - it's still closing the floater; we really
 want to change the behavior of the X button instead.

---
 indra/newview/llimfloater.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index b7c614d09c3..4a487bd5a7c 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -107,7 +107,9 @@ void LLIMFloater::onFocusReceived()
 void LLIMFloater::onClose(bool app_quitting)
 {
 	setTyping(false);
-	gIMMgr->leaveSession(mSessionID);
+	// SJB: We want the close button to hide the session window, not end it
+	// *NOTE: Yhis is functional, but not ideal - it's still closing the floater; we really want to change the behavior of the X button instead.
+	//gIMMgr->leaveSession(mSessionID);
 }
 
 /* static */
-- 
GitLab


From 7ab6dc37f8bcc348ecbdaddce4a32d068e344670 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Wed, 18 Nov 2009 19:21:09 -0800
Subject: [PATCH 448/557] EXT-1743 People inspectors should show Age, not Date
 born, fixed date math Changed date math to correctly account for month
 lengths and leap years. Extended unit test. Review pending.

---
 indra/newview/lldateutil.cpp            | 71 ++++++++++++++++++++++---
 indra/newview/llinspectavatar.cpp       |  3 +-
 indra/newview/tests/lldateutil_test.cpp | 26 +++++++--
 3 files changed, 90 insertions(+), 10 deletions(-)

diff --git a/indra/newview/lldateutil.cpp b/indra/newview/lldateutil.cpp
index 040fad3c4a2..1fe1715995b 100644
--- a/indra/newview/lldateutil.cpp
+++ b/indra/newview/lldateutil.cpp
@@ -66,23 +66,82 @@ static S32 age_days_from_date(const std::string& date_string,
 	return age_days;
 }
 
+static S32 DAYS_PER_MONTH_NOLEAP[] =
+	{ 31, 28, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+static S32 DAYS_PER_MONTH_LEAP[] =
+	{ 31, 29, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+
+static S32 days_from_month(S32 year, S32 month)
+{
+	if (year % 4 == 0 
+		&& year % 100 != 0)
+	{
+		// leap year
+		return DAYS_PER_MONTH_LEAP[month];
+	}
+	else
+	{
+		return DAYS_PER_MONTH_NOLEAP[month];
+	}
+}
+
 std::string LLDateUtil::ageFromDate(const std::string& date_string,
 									const LLDate& now)
 {
+#define BAD_DATE_MATH 0
+#if BAD_DATE_MATH
 	S32 age_days = age_days_from_date(date_string, now);
 	if (age_days == S32_MIN) return "???";
-
-	// Noun pluralization depends on language
-	std::string lang = LLUI::getLanguage();
-
-	// Try for age in round number of years
-	LLStringUtil::format_map_t args;
 	S32 age_years = age_days / 365;
 	age_days = age_days % 365;
 	// *NOTE: This is wrong.  Not all months have 30 days, but we don't have a library
 	// for relative date arithmetic. :-(  JC
 	S32 age_months = age_days / 30;
 	age_days = age_days % 30;
+#else
+	S32 born_month, born_day, born_year;
+	S32 matched = sscanf(date_string.c_str(), "%d/%d/%d", &born_month, &born_day, &born_year);
+	if (matched != 3) return "???";
+	LLDate born_date;
+	born_date.fromYMDHMS(born_year, born_month, born_day);
+	F64 born_date_secs_since_epoch = born_date.secondsSinceEpoch();
+	// Correct for the fact that account creation dates are in Pacific time,
+	// == UTC - 8
+	born_date_secs_since_epoch += 8.0 * 60.0 * 60.0;
+	born_date.secondsSinceEpoch(born_date_secs_since_epoch);
+	// explode out to month/day/year again
+	born_date.split(&born_year, &born_month, &born_day);
+
+	S32 now_year, now_month, now_day;
+	now.split(&now_year, &now_month, &now_day);
+
+	// Do grade-school subtraction, from right-to-left, borrowing from the left
+	// when things go negative
+	S32 age_days = (now_day - born_day);
+	if (age_days < 0)
+	{
+		now_month -= 1;
+		if (now_month == 0)
+		{
+			now_year -= 1;
+			now_month = 12;
+		}
+		age_days += days_from_month(now_year, now_month);
+	}
+	S32 age_months = (now_month - born_month);
+	if (age_months < 0)
+	{
+		now_year -= 1;
+		age_months += 12;
+	}
+	S32 age_years = (now_year - born_year);
+#endif
+
+	// Noun pluralization depends on language
+	std::string lang = LLUI::getLanguage();
+
+	// Try for age in round number of years
+	LLStringUtil::format_map_t args;
 
 	if (age_months > 0 || age_years > 0)
 	{
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index baddd90d460..866669f326e 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -39,6 +39,7 @@
 #include "llavataractions.h"
 #include "llavatarpropertiesprocessor.h"
 #include "llcallingcard.h"
+#include "lldateutil.h"
 #include "llfloaterreporter.h"
 #include "llfloaterworldmap.h"
 #include "llinspect.h"
@@ -351,7 +352,7 @@ void LLInspectAvatar::processAvatarData(LLAvatarData* data)
 {
 	LLStringUtil::format_map_t args;
 	args["[BORN_ON]"] = data->born_on;
-	args["[AGE]"] = data->born_on;
+	args["[AGE]"] = LLDateUtil::ageFromDate(data->born_on, LLDate::now());
 	args["[SL_PROFILE]"] = data->about_text;
 	args["[RW_PROFILE"] = data->fl_about_text;
 	args["[ACCTTYPE]"] = LLAvatarPropertiesProcessor::accountType(data);
diff --git a/indra/newview/tests/lldateutil_test.cpp b/indra/newview/tests/lldateutil_test.cpp
index ed753b6ff7a..142a5eb5e6a 100644
--- a/indra/newview/tests/lldateutil_test.cpp
+++ b/indra/newview/tests/lldateutil_test.cpp
@@ -60,6 +60,11 @@ std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::
 
 std::string LLTrans::getCountString(const std::string& language, const std::string& xml_desc, S32 count)
 {
+	count_string_t key(xml_desc, count);
+	if (gCountString.find(key) == gCountString.end())
+	{
+		return std::string("Couldn't find ") + xml_desc;
+	}
 	return gCountString[ count_string_t(xml_desc, count) ];
 }
 
@@ -91,8 +96,11 @@ namespace tut
 			gCountString[ count_string_t("AgeYears", 2) ]  = "2 years";
 			gCountString[ count_string_t("AgeMonths", 1) ] = "1 month";
 			gCountString[ count_string_t("AgeMonths", 2) ] = "2 months";
+			gCountString[ count_string_t("AgeMonths", 11) ]= "11 months";
 			gCountString[ count_string_t("AgeWeeks", 1) ]  = "1 week";
 			gCountString[ count_string_t("AgeWeeks", 2) ]  = "2 weeks";
+			gCountString[ count_string_t("AgeWeeks", 3) ]  = "3 weeks";
+			gCountString[ count_string_t("AgeWeeks", 4) ]  = "4 weeks";
 			gCountString[ count_string_t("AgeDays", 1) ]   = "1 day";
 			gCountString[ count_string_t("AgeDays", 2) ]   = "2 days";
 		}
@@ -113,12 +121,18 @@ namespace tut
 		ensure_equals("years",
 			LLDateUtil::ageFromDate("12/31/2007", mNow),
 			"2 years old" );
-		ensure_equals("single year",
-			LLDateUtil::ageFromDate("12/31/2008", mNow),
-			"1 year old" );
+		ensure_equals("years",
+			LLDateUtil::ageFromDate("1/1/2008", mNow),
+			"1 year 11 months old" );
+		ensure_equals("single year + one month",
+			LLDateUtil::ageFromDate("11/30/2008", mNow),
+			"1 year 1 month old" );
 		ensure_equals("single year + a bit",
 			LLDateUtil::ageFromDate("12/12/2008", mNow),
 			"1 year old" );
+		ensure_equals("single year",
+			LLDateUtil::ageFromDate("12/31/2008", mNow),
+			"1 year old" );
     }
 
 	template<> template<>
@@ -128,6 +142,9 @@ namespace tut
 		ensure_equals("months",
 			LLDateUtil::ageFromDate("10/30/2009", mNow),
 			"2 months old" );
+		ensure_equals("months 2",
+			LLDateUtil::ageFromDate("10/31/2009", mNow),
+			"2 months old" );
 		ensure_equals("single month",
 			LLDateUtil::ageFromDate("11/30/2009", mNow),
 			"1 month old" );
@@ -137,6 +154,9 @@ namespace tut
 	void dateutil_object_t::test<3>()
 	{
 		set_test_name("Weeks");
+		ensure_equals("4 weeks",
+			LLDateUtil::ageFromDate("12/1/2009", mNow),
+			"4 weeks old" );
 		ensure_equals("weeks",
 			LLDateUtil::ageFromDate("12/17/2009", mNow),
 			"2 weeks old" );
-- 
GitLab


From 884a9887a7a9e833478d266ddf8a7808cdba2ae6 Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Wed, 18 Nov 2009 21:42:27 -0800
Subject: [PATCH 449/557] Changes to IM Logging, includes preference changes

---
 indra/newview/app_settings/settings.xml       | 13 +---
 .../app_settings/settings_per_account.xml     | 24 +------
 indra/newview/llfloaterchat.cpp               | 66 +++++--------------
 indra/newview/llfloaterchat.h                 |  8 ---
 indra/newview/llfloaterpreference.cpp         | 29 ++------
 indra/newview/llfloaterpreference.h           |  1 -
 indra/newview/llimview.cpp                    | 20 ++----
 indra/newview/lllogchat.cpp                   |  3 -
 .../skins/default/xui/en/menu_viewer.xml      | 11 ++++
 .../xui/en/panel_preferences_privacy.xml      | 58 ++++------------
 10 files changed, 55 insertions(+), 178 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 74ae8db0c7a..c7279a2e333 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -3620,7 +3620,7 @@
       <key>Value</key>
       <string />
     </map>
-    <key>IMInChatConsole</key>
+    <key>IMInChat</key>
     <map>
       <key>Comment</key>
       <string>Copy IM into chat console</string>
@@ -3629,17 +3629,6 @@
       <key>Type</key>
       <string>Boolean</string>
       <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>IMInChatHistory</key>
-    <map>
-      <key>Comment</key>
-      <string>Copy IM into chat history</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
       <integer>0</integer>
     </map>
     <key>IMShowTimestamps</key>
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index 893e7acd7ad..af5fa4f3889 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -22,17 +22,6 @@
         <key>Value</key>
             <string>|TOKEN COPY BusyModeResponse|</string>
         </map>
-    <key>IMLogOptions</key>
-        <map>
-        <key>Comment</key>
-            <string>Log options for Instant Messages</string>
-        <key>Persist</key>
-            <integer>1</integer>
-        <key>Type</key>
-            <string>S32</string>
-        <key>Value</key>
-            <integer>2</integer>
-        </map>
     <key>InstantMessageLogFolder</key>
         <map>
         <key>Comment</key>
@@ -75,18 +64,7 @@
         <key>Type</key>
             <string>Boolean</string>
         <key>Value</key>
-            <integer>0</integer>
-        </map>
-    <key>LogChatIM</key>
-        <map>
-        <key>Comment</key>
-            <string>Log Incoming Instant Messages with Chat</string>
-        <key>Persist</key>
             <integer>1</integer>
-        <key>Type</key>
-            <string>Boolean</string>
-        <key>Value</key>
-            <integer>0</integer>
         </map>
     <key>LogTimestamp</key>
         <map>
@@ -97,7 +75,7 @@
         <key>Type</key>
             <string>Boolean</string>
         <key>Value</key>
-            <integer>0</integer>
+            <integer>1</integer>
         </map>
     <key>LogInstantMessages</key>
         <map>
diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp
index ed14079ae91..58025ef78be 100644
--- a/indra/newview/llfloaterchat.cpp
+++ b/indra/newview/llfloaterchat.cpp
@@ -180,16 +180,12 @@ void add_timestamped_line(LLViewerTextEditor* edit, LLChat chat, const LLColor4&
 	edit->blockUndo();
 }
 
-void log_chat_text(const LLChat& chat)
-{
-	LLLogChat::saveHistory(std::string("chat"), chat.mFromName, chat.mFromID, chat.mText);
-}
 // static
 void LLFloaterChat::addChatHistory(const LLChat& chat, bool log_to_file)
 {	
-	if ( (gSavedPerAccountSettings.getS32("IMLogOptions")!=LOG_IM) && log_to_file) 
+	if (log_to_file && (gSavedPerAccountSettings.getBOOL("LogChat"))) 
 	{
-		log_chat_text(chat);
+		LLLogChat::saveHistory("chat", chat.mFromName, chat.mFromID, chat.mText);
 	}
 	
 	LLColor4 color = get_text_color(chat);
@@ -305,55 +301,27 @@ void LLFloaterChat::onClickToggleShowMute(LLUICtrl* caller, void *data)
 }
 
 // Put a line of chat in all the right places
-void LLFloaterChat::addChat(const LLChat& chat, 
-			  BOOL from_instant_message, 
-			  BOOL local_agent)
+void LLFloaterChat::addChat(const LLChat& chat, BOOL from_instant_message, BOOL local_agent)
 {
-	LLColor4 text_color = get_text_color(chat);
-
-	BOOL invisible_script_debug_chat = ((gSavedSettings.getBOOL("ShowScriptErrors") == FALSE) ||
-			(chat.mChatType == CHAT_TYPE_DEBUG_MSG
-			&& (gSavedSettings.getS32("ShowScriptErrorsLocation") == 1)));
-
-	if (!invisible_script_debug_chat 
-		&& !chat.mMuted 
-		&& gConsole 
-		&& !local_agent)
-	{
-		F32 size = CHAT_MSG_SIZE;
-		if (chat.mSourceType == CHAT_SOURCE_SYSTEM)
-		{
-			text_color = LLUIColorTable::instance().getColor("SystemChatColor");
-		}
-		else if(from_instant_message)
-		{
-			text_color = LLUIColorTable::instance().getColor("IMChatColor");
-			size = INSTANT_MSG_SIZE;
-		}
-		// Disabling the console for 2.0 - SJB
-#if 0
-		// We display anything if it's not an IM. If it's an IM, check pref...
-		if	( !from_instant_message || gSavedSettings.getBOOL("IMInChatConsole") ) 
-		{
-			gConsole->addLine(chat.mText, size, text_color);
-		}
-#endif
-	}
-
-	if(from_instant_message && (gSavedPerAccountSettings.getS32("IMLogOptions")== LOG_BOTH_TOGETHER))
-		log_chat_text(chat);
-	
-	if(from_instant_message && gSavedSettings.getBOOL("IMInChatHistory")) 	 
-		addChatHistory(chat,false);
-
 	triggerAlerts(chat.mText);
 
 	// Add the sender to the list of people with which we've recently interacted.
 	if(chat.mSourceType == CHAT_SOURCE_AGENT && chat.mFromID.notNull())
 		LLRecentPeople::instance().add(chat.mFromID);
-
-	if(!from_instant_message)
-		addChatHistory(chat);
+	
+	bool add_chat = true;
+	bool log_chat = true;
+	if(from_instant_message)
+	{
+		if (!gSavedSettings.getBOOL("IMInChat"))
+			add_chat = false;
+		//log_chat = false;
+}
+	
+	if (add_chat)
+	{
+		addChatHistory(chat, log_chat);
+	}
 }
 
 // Moved from lltextparser.cpp to break llui/llaudio library dependency.
diff --git a/indra/newview/llfloaterchat.h b/indra/newview/llfloaterchat.h
index aed82a6781e..84fc199bfa9 100644
--- a/indra/newview/llfloaterchat.h
+++ b/indra/newview/llfloaterchat.h
@@ -45,14 +45,6 @@ class LLChat;
 class LLPanelActiveSpeakers;
 class LLLogChat;
 
-enum ELogOptions
-{
-	LOG_CHAT = 0,
-	LOG_IM = 1,
-	LOG_BOTH_TOGETHER = 2,
-	LOG_BOTH_SEPARATE = 3
-};
-
 class LLFloaterChat : public LLFloater
 {
 public:
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 4434a8013d6..7fc207d3950 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -338,7 +338,6 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
 	mCommitCallbackRegistrar.add("Pref.ClickEnablePopup",		boost::bind(&LLFloaterPreference::onClickEnablePopup, this));
 	mCommitCallbackRegistrar.add("Pref.ClickDisablePopup",		boost::bind(&LLFloaterPreference::onClickDisablePopup, this));	
 	mCommitCallbackRegistrar.add("Pref.LogPath",				boost::bind(&LLFloaterPreference::onClickLogPath, this));
-	mCommitCallbackRegistrar.add("Pref.Logging",				boost::bind(&LLFloaterPreference::onCommitLogging, this));
 	mCommitCallbackRegistrar.add("Pref.UpdateMeterText",		boost::bind(&LLFloaterPreference::updateMeterText, this, _1));	
 	mCommitCallbackRegistrar.add("Pref.HardwareSettings",       boost::bind(&LLFloaterPreference::onOpenHardwareSettings, this));	
 	mCommitCallbackRegistrar.add("Pref.HardwareDefaults",       boost::bind(&LLFloaterPreference::setHardwareDefaults, this));	
@@ -1133,27 +1132,6 @@ void LLFloaterPreference::onClickLogPath()
 	gSavedPerAccountSettings.setString("InstantMessageLogFolder",chat_log_top_folder);
 }
 
-void LLFloaterPreference::onCommitLogging()
-{
-	enableHistory();
-}
-
-void LLFloaterPreference::enableHistory()
-{
-	if (childGetValue("log_instant_messages").asBoolean())
-	{
-		childEnable("ChatIMLogs");
-		childEnable("log_path_button");
-		childEnable("show_timestamps_check_im");
-	}
-	else
-	{
-		childDisable("ChatIMLogs");
-		childDisable("log_path_button");
-		childDisable("show_timestamps_check_im");
-	}
-}
-
 void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email)
 {
 	mGotPersonalInfo = true;
@@ -1193,7 +1171,12 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im
 	
 //	childSetText("busy_response", gSavedSettings.getString("BusyModeResponse2"));
 	
-	enableHistory();
+	childEnable("log_nearby_chat");
+	childEnable("log_instant_messages");
+	childEnable("show_timestamps_check_im");
+	childEnable("log_path_string");
+	childEnable("log_path_button");
+	
 	std::string display_email(email);
 	childSetText("email_address",display_email);
 
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 10f39e46f14..41c8bb71247 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -115,7 +115,6 @@ class LLFloaterPreference : public LLFloater
 	void setAllIgnored();
 	void onClickLogPath();	
 	void enableHistory();
-	void onCommitLogging();
 	void setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email);
 	void refreshEnabledState();
 	void disableUnavailableSettings();
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 54b7c124e0a..c066f1f77ac 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -395,21 +395,15 @@ bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from,
 
 bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
 {
-	S32 im_log_option =  gSavedPerAccountSettings.getS32("IMLogOptions");
-	if (im_log_option != LOG_CHAT)
+	if (gSavedPerAccountSettings.getBOOL("LogInstantMessages"))
 	{
-		if(im_log_option == LOG_BOTH_TOGETHER)
-		{
-			LLLogChat::saveHistory(std::string("chat"), from, from_id, utf8_text);
-			return true;
-		}
-		else
-		{
-			LLLogChat::saveHistory(LLIMModel::getInstance()->getName(session_id), from, from_id, utf8_text);
-			return true;
-		}
+		LLLogChat::saveHistory(LLIMModel::getInstance()->getName(session_id), from, from_id, utf8_text);
+		return true;
+	}
+	else
+	{
+		return false;
 	}
-	return false;
 }
 
 bool LLIMModel::proccessOnlineOfflineNotification(
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index a16ffe19c6d..941ccc227cd 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -96,9 +96,6 @@ void LLLogChat::saveHistory(const std::string& filename,
 			    const LLUUID& from_id,
 			    const std::string& line)
 {
-	if (!gSavedPerAccountSettings.getBOOL("LogInstantMessages"))
-		return;
-
 	if(!filename.size())
 	{
 		llinfos << "Filename is Empty!" << llendl;
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index ccf6b08ed79..077667a3fc5 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -1642,6 +1642,17 @@
              function="ToggleControl"
              parameter="MouseSmooth" />
         </menu_item_check>
+        <menu_item_check
+         label="Show IMs in Nearby Chat"
+         layout="topleft"
+         name="IMInChat">
+            <menu_item_check.on_check
+             function="CheckControl"
+             parameter="IMInChat" />
+            <menu_item_check.on_click
+             function="ToggleControl"
+             parameter="IMInChat" />
+        </menu_item_check>
         <menu_item_separator
          layout="topleft" />
         <menu
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
index 8c22a5e4839..1b9a99f90b0 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -100,61 +100,27 @@
         Logs:
     </text>
     <check_box
-   
+	 enabled="false"
+     control_name="LogChat"
+     height="16"
+     label="Save nearby chat logs on my computer"
+     layout="topleft"
+     left="30"
+     name="log_nearby_chat"
+     top_pad="10"
+     width="350">
+    </check_box>
+    <check_box
 	 enabled="false"
      control_name="LogInstantMessages"
      height="16"
-     label="Save logs on my computer"
+     label="Save IM logs on my computer"
      layout="topleft"
      left="30"
      name="log_instant_messages"
      top_pad="10"
      width="350">
-        <check_box.commit_callback
-         function="Pref.Logging" />
     </check_box>
-   <radio_group
-     control_name="IMLogOptions"
-     enabled="false"
-     height="80"
-     layout="topleft"
-     left_delta="50"
-     name="ChatIMLogs"
-     width="350"
-     top_pad="0">
-        <radio_item
-         height="16"
-         label="Chat"
-         layout="topleft"
-         left="0"
-         name="radio1"
-         top="3"
-         width="200" />
-        <radio_item
-         height="16"
-         label="IM"
-         layout="topleft"
-         left_delta="0"
-         name="radio2"
-         top_pad="3"
-         width="200" />
-        <radio_item
-         height="16"
-         label="Both, together"
-         layout="topleft"
-         left_delta="0"
-         name="radio3"
-         top_pad="3"
-         width="200" />
-        <radio_item
-         height="16"
-         label="Both, separate"
-         layout="topleft"
-         left_delta="0"
-         name="radio4"
-         top_pad="3"
-         width="200" />
-    </radio_group>
     <check_box
      control_name="LogTimestamp"
 	 enabled="false"
-- 
GitLab


From b6ad65c04edc6e79637bf8ac9daf40b3654d80a6 Mon Sep 17 00:00:00 2001
From: angela <angela@lindenlab.com>
Date: Thu, 19 Nov 2009 15:02:05 +0800
Subject: [PATCH 450/557]   EXT-2094  Add click-to-zoom as a one-click settable
 option for objects

---
 indra/llcommon/llclickaction.h                | 11 ++-
 indra/lscript/lscript_compile/indra.l         |  2 +-
 indra/newview/app_settings/keywords.ini       |  2 +-
 indra/newview/llpanelpermissions.cpp          | 71 +++++++++++++++++--
 indra/newview/lltoolpie.cpp                   | 30 ++++++--
 .../skins/default/xui/en/floater_tools.xml    |  8 +--
 6 files changed, 101 insertions(+), 23 deletions(-)

diff --git a/indra/llcommon/llclickaction.h b/indra/llcommon/llclickaction.h
index 29c4df8df24..d4ffbf86345 100644
--- a/indra/llcommon/llclickaction.h
+++ b/indra/llcommon/llclickaction.h
@@ -33,16 +33,15 @@
 
 #ifndef LL_LLCLICKACTION_H
 #define LL_LLCLICKACTION_H
-
+// DO NOT CHANGE THE SEQUENCE OF THIS LIST!!
 const U8 CLICK_ACTION_NONE = 0;
 const U8 CLICK_ACTION_TOUCH = 0;
 const U8 CLICK_ACTION_SIT = 1;
 const U8 CLICK_ACTION_BUY = 2;
 const U8 CLICK_ACTION_PAY = 3;
 const U8 CLICK_ACTION_OPEN = 4;
-const U8 CLICK_ACTION_ZOOM = 5;
-const U8 CLICK_ACTION_PLAY = 6;
-const U8 CLICK_ACTION_OPEN_MEDIA = 7;
-
-
+const U8 CLICK_ACTION_PLAY = 5;
+const U8 CLICK_ACTION_OPEN_MEDIA = 6;
+const U8 CLICK_ACTION_ZOOM = 7;
+// DO NOT CHANGE THE SEQUENCE OF THIS LIST!!
 #endif
diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l
index e650c71beab..8fe9f5ed29c 100644
--- a/indra/lscript/lscript_compile/indra.l
+++ b/indra/lscript/lscript_compile/indra.l
@@ -611,9 +611,9 @@ extern "C" { int yyerror(const char *fmt, ...); }
 "CLICK_ACTION_BUY"        { count(); yylval.ival = CLICK_ACTION_BUY; return(INTEGER_CONSTANT); }
 "CLICK_ACTION_PAY"        { count(); yylval.ival = CLICK_ACTION_PAY; return(INTEGER_CONSTANT); }
 "CLICK_ACTION_OPEN"       { count(); yylval.ival = CLICK_ACTION_OPEN; return(INTEGER_CONSTANT); }
-"CLICK_ACTION_ZOOM"       { count(); yylval.ival = CLICK_ACTION_ZOOM; return(INTEGER_CONSTANT); }
 "CLICK_ACTION_PLAY"       { count(); yylval.ival = CLICK_ACTION_PLAY; return(INTEGER_CONSTANT); }
 "CLICK_ACTION_OPEN_MEDIA" { count(); yylval.ival = CLICK_ACTION_OPEN_MEDIA; return(INTEGER_CONSTANT); }
+"CLICK_ACTION_ZOOM"       { count(); yylval.ival = CLICK_ACTION_ZOOM; return(INTEGER_CONSTANT); }
 
 "TEXTURE_BLANK"           { yylval.sval = new char[UUID_STR_LENGTH]; strcpy(yylval.sval, "5748decc-f629-461c-9a36-a35a221fe21f"); return(STRING_CONSTANT); }
 "TEXTURE_DEFAULT"         { yylval.sval = new char[UUID_STR_LENGTH]; strcpy(yylval.sval, "89556747-24cb-43ed-920b-47caed15465f"); return(STRING_CONSTANT); }
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index 71ea12bacde..14025c8061c 100644
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -508,9 +508,9 @@ CLICK_ACTION_SIT        Used with llSetClickAction to set sit as the default act
 CLICK_ACTION_BUY        Used with llSetClickAction to set buy as the default action when object is clicked
 CLICK_ACTION_PAY        Used with llSetClickAction to set pay as the default action when object is clicked
 CLICK_ACTION_OPEN       Used with llSetClickAction to set open as the default action when object is clicked
-CLICK_ACTION_ZOOM       Used with llSetClickAction to set zoom in as the default action when object is clicked
 CLICK_ACTION_PLAY       Used with llSetClickAction to set play as the default action when object is clicked
 CLICK_ACTION_OPEN_MEDIA Used with llSetClickAction to set open-media as the default action when object is clicked
+CLICK_ACTION_ZOOM       Used with llSetClickAction to set zoom in as the default action when object is clicked
 
 TOUCH_INVALID_TEXCOORD  Value returned by llDetectedTouchUV() and llDetectedTouchST() when the touch position is not valid.
 TOUCH_INVALID_VECTOR    Value returned by llDetectedTouchPos(), llDetectedTouchNormal(), and llDetectedTouchBinormal() when the touch position is not valid.
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 0dc010e2e74..d8e0d91d885 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -66,6 +66,65 @@
 #include "roles_constants.h"
 #include "llgroupactions.h"
 
+
+U8 string_value_to_click_action(std::string p_value);
+std::string click_action_to_string_value( U8 action);
+
+U8 string_value_to_click_action(std::string p_value)
+{
+	if(p_value == "Touch")
+	{
+		return CLICK_ACTION_TOUCH;
+	}
+	if(p_value == "Sit")
+	{
+		return CLICK_ACTION_SIT;
+	}
+	if(p_value == "Buy")
+	{
+		return CLICK_ACTION_BUY;
+	}
+	if(p_value == "Pay")
+	{
+		return CLICK_ACTION_PAY;
+	}
+	if(p_value == "Open")
+	{
+		return CLICK_ACTION_OPEN;
+	}
+	if(p_value == "Zoom")
+	{
+		return CLICK_ACTION_ZOOM;
+	}
+	return CLICK_ACTION_TOUCH;
+}
+
+std::string click_action_to_string_value( U8 action)
+{
+	switch (action) 
+	{
+		case CLICK_ACTION_TOUCH:
+		default:	
+			return "Touch";
+			break;
+		case CLICK_ACTION_SIT:
+			return "Sit";
+			break;
+		case CLICK_ACTION_BUY:
+			return "Buy";
+			break;
+		case CLICK_ACTION_PAY:
+			return "Pay";
+			break;
+		case CLICK_ACTION_OPEN:
+			return "Open";
+			break;
+		case CLICK_ACTION_ZOOM:
+			return "Zoom";
+			break;
+	}
+}
+
 ///----------------------------------------------------------------------------
 /// Class llpanelpermissions
 ///----------------------------------------------------------------------------
@@ -774,7 +833,8 @@ void LLPanelPermissions::refresh()
 		LLComboBox*	ComboClickAction = getChild<LLComboBox>("clickaction");
 		if(ComboClickAction)
 		{
-			ComboClickAction->setCurrentByIndex((S32)click_action);
+			std::string combo_value = click_action_to_string_value(click_action);
+			ComboClickAction->setValue(LLSD(combo_value));
 		}
 	}
 	childSetEnabled("label click action",is_perm_modify && all_volume);
@@ -1015,8 +1075,9 @@ void LLPanelPermissions::onCommitClickAction(LLUICtrl* ctrl, void*)
 {
 	LLComboBox* box = (LLComboBox*)ctrl;
 	if (!box) return;
-
-	U8 click_action = (U8)box->getCurrentIndex();
+	std::string value = box->getValue().asString();
+	U8 click_action = string_value_to_click_action(value);
+	
 	if (click_action == CLICK_ACTION_BUY)
 	{
 		LLSaleInfo sale_info;
@@ -1028,8 +1089,8 @@ void LLPanelPermissions::onCommitClickAction(LLUICtrl* ctrl, void*)
 			// Set click action back to its old value
 			U8 click_action = 0;
 			LLSelectMgr::getInstance()->selectionGetClickAction(&click_action);
-			box->setCurrentByIndex((S32)click_action);
-
+			std::string item_value = click_action_to_string_value(click_action);
+			box->setValue(LLSD(item_value));
 			return;
 		}
 	}
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index d0350507ed2..5ed8dc5fb9a 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -253,12 +253,7 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
 					selectionPropertiesReceived();
 				}
 			}
-			return TRUE;
-		case CLICK_ACTION_ZOOM:
-				gAgent.setFocusOnAvatar(FALSE, FALSE);	
-				gAgent.setFocusGlobal(mPick);
-				gAgent.setCameraZoomFraction(0.9);
-				return TRUE;		
+			return TRUE;	
 		case CLICK_ACTION_PLAY:
 			handle_click_action_play();
 			return TRUE;
@@ -266,6 +261,29 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
 			// mClickActionObject = object;
 			handle_click_action_open_media(object);
 			return TRUE;
+		case CLICK_ACTION_ZOOM:
+			{	
+				const F32 PADDING_FACTOR = 2.f;
+				LLViewerObject* object = gObjectList.findObject(mPick.mObjectID);
+				
+				if (object)
+				{
+					gAgent.setFocusOnAvatar(FALSE, ANIMATE);
+					
+					LLBBox bbox = object->getBoundingBoxAgent() ;
+					F32 angle_of_view = llmax(0.1f, LLViewerCamera::getInstance()->getAspect() > 1.f ? LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect() : LLViewerCamera::getInstance()->getView());
+					F32 distance = bbox.getExtentLocal().magVec() * PADDING_FACTOR / atan(angle_of_view);
+				
+					LLVector3 obj_to_cam = LLViewerCamera::getInstance()->getOrigin() - bbox.getCenterAgent();
+					obj_to_cam.normVec();
+					
+					LLVector3d object_center_global = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent());
+					gAgent.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance), 
+													  object_center_global, 
+													  mPick.mObjectID );
+				}
+			}
+			return TRUE;			
 		default:
 			// nothing
 			break;
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 87d31b8f9b1..8b6f0f03fe2 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -968,19 +968,19 @@
                 <combo_box.item
                  label="Touch  (default)"
                  name="Touch/grab(default)"
-                 value="Touch/grab (default)" />
+                 value="Touch" />
                 <combo_box.item
                  label="Sit on object"
                  name="Sitonobject"
-                 value="Sit on object" />
+                 value="Sit" />
                 <combo_box.item
                  label="Buy object"
                  name="Buyobject"
-                 value="Buy object" />
+                 value="Buy" />
                 <combo_box.item
                  label="Pay object"
                  name="Payobject"
-                 value="Pay object" />
+                 value="Pay" />
                 <combo_box.item
                  label="Open"
                  name="Open"
-- 
GitLab


From 88cce61b09d225df0bcd8aab9dbd2c5a01ee7e19 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Thu, 19 Nov 2009 11:21:20 +0200
Subject: [PATCH 451/557] related to EXT-700 '"Offer" notifications should be
 accessible via chiclet' made 'FriendshipAccepted' notification show correct
 avatar icon; avoided empty avatar name on 'OfferFriendship' notifiaction;
 avoided creating IM session on offer from objects;

--HG--
branch : product-engine
---
 indra/newview/llnotificationofferhandler.cpp  | 26 +++++++++++++------
 indra/newview/llviewermessage.cpp             |  7 +++--
 .../skins/default/xui/en/notifications.xml    |  9 ++++---
 3 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index 94e733913d4..dea3a0c1692 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -92,16 +92,26 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
 	if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
 	{
 		// add message to IM
-		LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, notification->getPayload()["from_id"]);
-		if (!LLIMMgr::instance().hasSession(session_id))
+		const std::string
+				name =
+						notification->getSubstitutions().has("NAME") ? notification->getSubstitutions()["NAME"]
+								: notification->getSubstitutions()["[NAME]"];
+
+		// don't create IM session with objects
+		if (notification->getName() != "ObjectGiveItem"
+				&& notification->getName() != "ObjectGiveItemUnknownUser")
 		{
-			session_id = LLIMMgr::instance().addSession(
-					notification->getSubstitutions()["OBJECTFROMNAME"], IM_NOTHING_SPECIAL,
-					notification->getPayload()["from_id"]);
+			LLUUID from_id = notification->getPayload()["from_id"];
+			LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL,
+					from_id);
+			if (!LLIMMgr::instance().hasSession(session_id))
+			{
+				session_id = LLIMMgr::instance().addSession(name,
+						IM_NOTHING_SPECIAL, from_id);
+			}
+			LLIMMgr::instance().addMessage(session_id, LLUUID(), name,
+					notification->getMessage());
 		}
-		LLIMMgr::instance().addMessage(session_id, LLUUID(),
-				notification->getSubstitutions()["OBJECTFROMNAME"],
-				notification->getMessage());
 
 		LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
 
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 11b2f07f1bd..8db6d5917a8 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1372,7 +1372,8 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)
 
 	payload["from_id"] = info->mFromID;
 	args["OBJECTFROMNAME"] = info->mFromName;
-	args["NAME"] = LLSLURL::buildCommand("agent", info->mFromID, "about");
+	args["NAME"] = info->mFromName;
+	args["NAME_SLURL"] = LLSLURL::buildCommand("agent", info->mFromID, "about");
 	std::string verb = "highlight?name=" + msg;
 	args["ITEM_SLURL"] = LLSLURL::buildCommand("inventory", info->mObjectID, verb.c_str());
 
@@ -2115,7 +2116,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			send_generic_message("requestonlinenotification", strings);
 			
 			args["NAME"] = name;
-			LLNotifications::instance().add("FriendshipAccepted", args);
+			LLSD payload;
+			payload["from_id"] = from_id;
+			LLNotifications::instance().add("FriendshipAccepted", args, payload);
 		}
 		break;
 
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 56cb54c9753..4897a4c8abc 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -4959,7 +4959,7 @@ No valid parcel could be found.
    icon="notify.tga"
    name="ObjectGiveItem"
    type="offer">
-An object named [OBJECTFROMNAME] owned by [NAME] has offered you [OBJECTTYPE]:
+An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has offered you [OBJECTTYPE]:
 [ITEM_SLURL]
     <form name="form">
       <button
@@ -4980,8 +4980,9 @@ An object named [OBJECTFROMNAME] owned by [NAME] has offered you [OBJECTTYPE]:
   <notification
    icon="notify.tga"
    name="ObjectGiveItemUnknownUser"
-   type="notify">
-An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a [OBJECTTYPE] named [OBJECTNAME].
+   type="offer">
+An object named [OBJECTFROMNAME] owned by (an unknown Resident) has offered you [OBJECTTYPE]:
+[ITEM_SLURL]
     <form name="form">
       <button
        index="0"
@@ -5002,7 +5003,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a
    icon="notify.tga"
    name="UserGiveItem"
    type="offer">
-[NAME] has offered you [OBJECTTYPE]:
+[NAME_SLURL] has offered you [OBJECTTYPE]:
 [ITEM_SLURL]
     <form name="form">
       <button
-- 
GitLab


From ef292e6a8b19160de7cf91d07f48daa68a56453e Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Thu, 19 Nov 2009 15:19:49 +0200
Subject: [PATCH 452/557] Fixed major bug EXT-2620 (IM Chiclet Panel goes crazy
 when new IM chiclets are added (chiclet scrolling appears with no need))  -
 refactored algotithm of caclulating position of the first chiclet in the list
 when adding new one.  - added comments for LLChicketPanel::addChiclet() &
 LLChicketPanel::arrange() methods

--HG--
branch : product-engine
---
 indra/newview/llchiclet.cpp | 45 +++++++++++++++++++++++--------------
 indra/newview/llchiclet.h   | 23 ++++++++++++-------
 2 files changed, 43 insertions(+), 25 deletions(-)

diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index caf6917d90e..e27afc31e66 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -914,34 +914,45 @@ void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id)
 	s_previous_active_voice_session_id = session_id;
 }
 
-S32 LLChicletPanel::calcChickletPanleWidth()
-{
-	S32 res = 0;
-
-	for (chiclet_list_t::iterator it = mChicletList.begin(); it
-			!= mChicletList.end(); it++)
-	{
-		res = (*it)->getRect().getWidth() + getChicletPadding();
-	}
-	return res;
-}
-
 bool LLChicletPanel::addChiclet(LLChiclet* chiclet, S32 index)
 {
 	if(mScrollArea->addChild(chiclet))
 	{
-		// chicklets should be aligned to right edge of scroll panel
-		S32 offset = 0;
+		// chiclets should be aligned to right edge of scroll panel
+		S32 left_shift = 0;
 
 		if (!canScrollLeft())
 		{
-			offset = mScrollArea->getRect().getWidth()
-					- chiclet->getRect().getWidth() - calcChickletPanleWidth();
+			// init left shift for the first chiclet in the list...
+			if (mChicletList.empty())
+			{
+				// ...start from the right border of the scroll area for the first added chiclet 
+				left_shift = mScrollArea->getRect().getWidth();
+			}
+			else
+			{
+				// ... start from the left border of the first chiclet minus padding
+				left_shift = getChiclet(0)->getRect().mLeft - getChicletPadding();
+			}
+
+			// take into account width of the being added chiclet
+			left_shift -= chiclet->getRequiredRect().getWidth();
+
+			// if we overflow the scroll area we do not need to shift chiclets
+			if (left_shift < 0)
+			{
+				left_shift = 0;
+			}
 		}
 
 		mChicletList.insert(mChicletList.begin() + index, chiclet);
 
-		getChiclet(0)->translate(offset, 0);
+		// shift first chiclet to place it in correct position. 
+		// rest ones will be placed in arrange()
+		if (!canScrollLeft())
+		{
+			getChiclet(0)->translate(left_shift - getChiclet(0)->getRect().mLeft, 0);
+		}
 
 		chiclet->setLeftButtonClickCallback(boost::bind(&LLChicletPanel::onChicletClick, this, _1, _2));
 		chiclet->setChicletSizeChangedCallback(boost::bind(&LLChicletPanel::onChicletSizeChanged, this, _1, index));
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index bb5dc1e5500..c0e8a6c70fb 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -769,16 +769,23 @@ class LLChicletPanel : public LLPanel
 	LLChicletPanel(const Params&p);
 	friend class LLUICtrlFactory;
 
-	S32 calcChickletPanleWidth();
-
-	/*
-	 * Adds chiclet to list and rearranges all chiclets.
-	*/
+	/**
+	 * Adds chiclet to list and rearranges all chiclets. 
+	 * They should be right aligned, most recent right. See EXT-1293
+	 *
+	 * It calculates position of the first chiclet in the list. Other chiclets are placed in arrange().
+	 *
+	 * @see arrange()
+	 */
 	bool addChiclet(LLChiclet*, S32 index);
 
-	/*
-	 * Arranges chiclets.
-	*/
+	/**
+	 * Arranges chiclets to have them in correct positions.
+	 *
+	 * Method bases on assumption that first chiclet has correct rect and starts from the its position.
+	 *
+	 * @see addChiclet()
+	 */
 	void arrange();
 
 	/*
-- 
GitLab


From e40c3d247f9bc909de4f41d24c2b1e3288ec9540 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Thu, 19 Nov 2009 16:03:25 +0200
Subject: [PATCH 453/557] No ticket. Updated comments to conform to the doxygen
 style

--HG--
branch : product-engine
---
 indra/newview/llchiclet.cpp |  60 ++---
 indra/newview/llchiclet.h   | 464 ++++++++++++++++++------------------
 2 files changed, 262 insertions(+), 262 deletions(-)

diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index e27afc31e66..cdc8eb26edd 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -1,34 +1,34 @@
 /** 
-* @file llchiclet.cpp
-* @brief LLChiclet class implementation
-*
-* $LicenseInfo:firstyear=2002&license=viewergpl$
-* 
-* Copyright (c) 2002-2009, Linden Research, Inc.
-* 
-* Second Life Viewer Source Code
-* The source code in this file ("Source Code") is provided by Linden Lab
-* to you under the terms of the GNU General Public License, version 2.0
-* ("GPL"), unless you have obtained a separate licensing agreement
-* ("Other License"), formally executed by you and Linden Lab.  Terms of
-* the GPL can be found in doc/GPL-license.txt in this distribution, or
-* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
-* 
-* There are special exceptions to the terms and conditions of the GPL as
-* it is applied to this Source Code. View the full text of the exception
-* in the file doc/FLOSS-exception.txt in this software distribution, or
-* online at
-* http://secondlifegrid.net/programs/open_source/licensing/flossexception
-* 
-* By copying, modifying or distributing this software, you acknowledge
-* that you have read and understood your obligations described above,
-* and agree to abide by those obligations.
-* 
-* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
-* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
-* COMPLETENESS OR PERFORMANCE.
-* $/LicenseInfo$
-*/
+ * @file llchiclet.cpp
+ * @brief LLChiclet class implementation
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
 
 #include "llviewerprecompiledheaders.h" // must be first include
 #include "llchiclet.h"
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index c0e8a6c70fb..03935d21a6e 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -1,34 +1,34 @@
 /** 
-* @file llchiclet.h
-* @brief LLChiclet class header file
-*
-* $LicenseInfo:firstyear=2002&license=viewergpl$
-* 
-* Copyright (c) 2002-2009, Linden Research, Inc.
-* 
-* Second Life Viewer Source Code
-* The source code in this file ("Source Code") is provided by Linden Lab
-* to you under the terms of the GNU General Public License, version 2.0
-* ("GPL"), unless you have obtained a separate licensing agreement
-* ("Other License"), formally executed by you and Linden Lab.  Terms of
-* the GPL can be found in doc/GPL-license.txt in this distribution, or
-* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
-* 
-* There are special exceptions to the terms and conditions of the GPL as
-* it is applied to this Source Code. View the full text of the exception
-* in the file doc/FLOSS-exception.txt in this software distribution, or
-* online at
-* http://secondlifegrid.net/programs/open_source/licensing/flossexception
-* 
-* By copying, modifying or distributing this software, you acknowledge
-* that you have read and understood your obligations described above,
-* and agree to abide by those obligations.
-* 
-* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
-* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
-* COMPLETENESS OR PERFORMANCE.
-* $/LicenseInfo$
-*/
+ * @file llchiclet.h
+ * @brief LLChiclet class header file
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ *  the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
 
 #ifndef LL_LLCHICLET_H
 #define LL_LLCHICLET_H
@@ -44,9 +44,9 @@ class LLVoiceControlPanel;
 class LLMenuGL;
 class LLIMFloater;
 
-/*
+/**
  * Class for displaying amount of messages/notifications(unread).
-*/
+ */
 class LLChicletNotificationCounterCtrl : public LLTextBox
 {
 public:
@@ -57,30 +57,30 @@ class LLChicletNotificationCounterCtrl : public LLTextBox
 		{};
 	};
 
-	/*
+	/**
 	 * Sets number of notifications
-	*/
+	 */
 	virtual void setCounter(S32 counter);
 
-	/*
+	/**
 	 * Returns number of notifications
-	*/
+	 */
 	virtual S32 getCounter() const { return mCounter; }
 
-	/*
+	/**
 	 * Returns width, required to display amount of notifications in text form.
 	 * Width is the only valid value.
-	*/
+	 */
 	/*virtual*/ LLRect getRequiredRect();
 
-	/*
+	/**
 	 * Sets number of notifications using LLSD
-	*/
+	 */
 	/*virtual*/ void setValue(const LLSD& value);
 
-	/*
+	/**
 	 * Returns number of notifications wrapped in LLSD
-	*/
+	 */
 	/*virtual*/ LLSD getValue() const;
 
 protected:
@@ -94,9 +94,9 @@ class LLChicletNotificationCounterCtrl : public LLTextBox
 	S32 mInitialWidth;
 };
 
-/*
+/**
  * Class for displaying avatar's icon in P2P chiclet.
-*/
+ */
 class LLChicletAvatarIconCtrl : public LLAvatarIconCtrl
 {
 public:
@@ -147,9 +147,9 @@ class LLChicletGroupIconCtrl : public LLIconCtrl
 	std::string mDefaultIcon;
 };
 
-/*
+/**
  * Class for displaying of speaker's voice indicator 
-*/
+ */
 class LLChicletSpeakerCtrl : public LLOutputMonitorCtrl
 {
 public:
@@ -164,7 +164,7 @@ class LLChicletSpeakerCtrl : public LLOutputMonitorCtrl
 	friend class LLUICtrlFactory;
 };
 
-/*
+/**
  * Base class for all chiclets.
  */
 class LLChiclet : public LLUICtrl
@@ -180,59 +180,59 @@ class LLChiclet : public LLUICtrl
 
 	/*virtual*/ ~LLChiclet();
 
-	/*
+	/**
 	 * Associates chat session id with chiclet.
-	*/
+	 */
 	virtual void setSessionId(const LLUUID& session_id) { mSessionId = session_id; }
 
-	/*
+	/**
 	 * Returns associated chat session.
-	*/
+	 */
 	virtual const LLUUID& getSessionId() const { return mSessionId; }
 
-	/*
+	/**
 	 * Sets number of unread notifications.
-	*/
+	 */
 	virtual void setCounter(S32 counter) = 0;
 
-	/*
+	/**
 	 * Returns number of unread notifications.
-	*/
+	 */
 	virtual S32 getCounter() = 0;
 
-	/*
+	/**
 	 * Sets show counter state.
-	*/
+	 */
 	virtual void setShowCounter(bool show) { mShowCounter = show; }
 
-	/*
+	/**
 	 * Returns show counter state.
-	*/
+	 */
 	virtual bool getShowCounter() {return mShowCounter;};
 
-	/*
+	/**
 	 * Connects chiclet clicked event with callback.
-	*/
+	 */
 	/*virtual*/ boost::signals2::connection setLeftButtonClickCallback(
 		const commit_callback_t& cb);
 
 	typedef boost::function<void (LLChiclet* ctrl, const LLSD& param)> 
 		chiclet_size_changed_callback_t;
 
-	/*
+	/**
 	 * Connects chiclets size changed event with callback.
-	*/
+	 */
 	virtual boost::signals2::connection setChicletSizeChangedCallback(
 		const chiclet_size_changed_callback_t& cb);
 
-	/*
+	/**
 	 * Sets IM Session id using LLSD
-	*/
+	 */
 	/*virtual*/ LLSD getValue() const;
 
-	/*
+	/**
 	 * Returns IM Session id using LLSD
-	*/
+	 */
 	/*virtual*/ void setValue(const LLSD& value);
 
 protected:
@@ -240,14 +240,14 @@ class LLChiclet : public LLUICtrl
 	friend class LLUICtrlFactory;
 	LLChiclet(const Params& p);
 
-	/*
+	/**
 	 * Notifies subscribers about click on chiclet.
-	*/
+	 */
 	/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
 
-	/*
+	/**
 	 * Notifies subscribers about chiclet size changed event.
-	*/
+	 */
 	virtual void onChicletSizeChanged();
 
 private:
@@ -263,11 +263,11 @@ class LLChiclet : public LLUICtrl
 };
 
 
-/*
-* Base class for Instant Message chiclets.
-* IMChiclet displays icon, number of unread messages(optional)
-* and voice chat status(optional).
-*/
+/**
+ * Base class for Instant Message chiclets.
+ * IMChiclet displays icon, number of unread messages(optional)
+ * and voice chat status(optional).
+ */
 class LLIMChiclet : public LLChiclet
 {
 public:
@@ -288,50 +288,50 @@ class LLIMChiclet : public LLChiclet
 	
 	/*virtual*/ ~LLIMChiclet() {};
 
-	/*
+	/**
 	 * Sets IM session name. This name will be displayed in chiclet tooltip.
-	*/
+	 */
 	virtual void setIMSessionName(const std::string& name) { setToolTip(name); }
 
-	/*
+	/**
 	 * Sets id of person/group user is chatting with.
 	 * Session id should be set before calling this
-	*/
+	 */
 	virtual void setOtherParticipantId(const LLUUID& other_participant_id) { mOtherParticipantId = other_participant_id; }
 
-	/*
+	/**
 	 * Gets id of person/group user is chatting with.
 	 */
 	virtual LLUUID getOtherParticipantId() { return mOtherParticipantId; }
 
-	/*
-	* Init Speaker Control with speaker's ID
-	*/
+	/**
+	 * Init Speaker Control with speaker's ID
+	 */
 	virtual void initSpeakerControl();
 
-	/*
+	/**
 	 * set status (Shows/Hide) for voice control.
-	*/
+	 */
 	virtual void setShowSpeaker(bool show);
 
-	/*
+	/**
 	 * Returns voice chat status control visibility.
-	*/
+	 */
 	virtual bool getShowSpeaker() {return mShowSpeaker;};
 
-	/*
-	* Shows/Hides for voice control for a chiclet.
-	*/
+	/**
+	 * Shows/Hides for voice control for a chiclet.
+	 */
 	virtual void toggleSpeakerControl();
 
-	/*
-	* Shows/hides overlay icon concerning new unread messages.
-	*/
+	/**
+	 * Shows/hides overlay icon concerning new unread messages.
+	 */
 	virtual void setShowNewMessagesIcon(bool show);
 
-	/*
-	* Returns visibility of overlay icon concerning new unread messages.
-	*/
+	/**
+	 * Returns visibility of overlay icon concerning new unread messages.
+	 */
 	virtual bool getShowNewMessagesIcon();
 
 	virtual void draw();
@@ -418,45 +418,45 @@ class LLIMP2PChiclet : public LLIMChiclet
 
 	/* virtual */ void setOtherParticipantId(const LLUUID& other_participant_id);
 
-	/*
-	* Sets number of unread messages. Will update chiclet's width if number text 
-	* exceeds size of counter and notify it's parent about size change.
-	*/
+	/**
+	 * Sets number of unread messages. Will update chiclet's width if number text 
+	 * exceeds size of counter and notify it's parent about size change.
+	 */
 	/*virtual*/ void setCounter(S32);
 
-	/*
-	* Init Speaker Control with speaker's ID
-	*/
+	/**
+	 * Init Speaker Control with speaker's ID
+	 */
 	/*virtual*/ void initSpeakerControl();
 
-	/*
-	* Returns number of unread messages.
-	*/
+	/**
+	 * Returns number of unread messages.
+	 */
 	/*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
 
 protected:
 	LLIMP2PChiclet(const Params& p);
 	friend class LLUICtrlFactory;
 
-	/*
-	* Creates chiclet popup menu. Will create P2P or Group IM Chat menu 
-	* based on other participant's id.
-	*/
+	/**
+	 * Creates chiclet popup menu. Will create P2P or Group IM Chat menu 
+	 * based on other participant's id.
+	 */
 	virtual void createPopupMenu();
 
-	/*
-	* Processes clicks on chiclet popup menu.
-	*/
+	/**
+	 * Processes clicks on chiclet popup menu.
+	 */
 	virtual void onMenuItemClicked(const LLSD& user_data);
 
-	/*
-	* Displays popup menu.
-	*/
+	/**
+	 * Displays popup menu.
+	 */
 	/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
 
-	/* 
-	* Enables/disables menus based on relationship with other participant.
-	*/
+	/** 
+	 * Enables/disables menus based on relationship with other participant.
+	 */
 	virtual void updateMenuItems();
 
 private:
@@ -492,39 +492,39 @@ class LLAdHocChiclet : public LLIMChiclet
 	 */
 	/*virtual*/ void setSessionId(const LLUUID& session_id);
 
-	/*
-	* Sets number of unread messages. Will update chiclet's width if number text 
-	* exceeds size of counter and notify it's parent about size change.
-	*/
+	/**
+	 * Sets number of unread messages. Will update chiclet's width if number text 
+	 * exceeds size of counter and notify it's parent about size change.
+	 */
 	/*virtual*/ void setCounter(S32);
 
-	/*
-	* Keep Speaker Control with actual speaker's ID
-	*/
+	/**
+	 * Keep Speaker Control with actual speaker's ID
+	 */
 	/*virtual*/ void draw();
 
-	/*
-	* Init Speaker Control with speaker's ID
-	*/
+	/**
+	 * Init Speaker Control with speaker's ID
+	 */
 	/*virtual*/ void initSpeakerControl();
 
-	/*
-	* Returns number of unread messages.
-	*/
+	/**
+	 * Returns number of unread messages.
+	 */
 	/*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
 
 protected:
 	LLAdHocChiclet(const Params& p);
 	friend class LLUICtrlFactory;
 
-	/*
-	* Displays popup menu.
-	*/
+	/**
+	 * Displays popup menu.
+	 */
 	virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
 
-	/*
-	* Finds a current speaker and resets the SpeakerControl with speaker's ID
-	*/
+	/**
+	 * Finds a current speaker and resets the SpeakerControl with speaker's ID
+	 */
 	/*virtual*/ void switchToCurrentSpeaker();
 
 private:
@@ -559,9 +559,9 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver
 	 */
 	/*virtual*/ void setSessionId(const LLUUID& session_id);
 
-	/*
-	* Keep Speaker Control with actual speaker's ID
-	*/
+	/**
+	 * Keep Speaker Control with actual speaker's ID
+	 */
 	/*virtual*/ void draw();
 
 	/**
@@ -570,20 +570,20 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver
 	 */
 	/*virtual*/ void changed(LLGroupChange gc);
 
-	/*
-	* Sets number of unread messages. Will update chiclet's width if number text 
-	* exceeds size of counter and notify it's parent about size change.
-	*/
+	/**
+	 * Sets number of unread messages. Will update chiclet's width if number text 
+	 * exceeds size of counter and notify it's parent about size change.
+	 */
 	/*virtual*/ void setCounter(S32);
 
-	/*
-	* Init Speaker Control with speaker's ID
-	*/
+	/**
+	 * Init Speaker Control with speaker's ID
+	 */
 	/*virtual*/ void initSpeakerControl();
 
-	/*
-	* Returns number of unread messages.
-	*/
+	/**
+	 * Returns number of unread messages.
+	 */
 	/*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
 
 	~LLIMGroupChiclet();
@@ -592,25 +592,25 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver
 	LLIMGroupChiclet(const Params& p);
 	friend class LLUICtrlFactory;
 
-	/*
-	* Finds a current speaker and resets the SpeakerControl with speaker's ID
-	*/
+	/**
+	 * Finds a current speaker and resets the SpeakerControl with speaker's ID
+	 */
 	/*virtual*/ void switchToCurrentSpeaker();
 
-	/*
-	* Creates chiclet popup menu. Will create P2P or Group IM Chat menu 
-	* based on other participant's id.
-	*/
+	/**
+	 * Creates chiclet popup menu. Will create P2P or Group IM Chat menu 
+	 * based on other participant's id.
+	 */
 	virtual void createPopupMenu();
 
-	/*
-	* Processes clicks on chiclet popup menu.
-	*/
+	/**
+	 * Processes clicks on chiclet popup menu.
+	 */
 	virtual void onMenuItemClicked(const LLSD& user_data);
 
-	/*
-	* Displays popup menu.
-	*/
+	/**
+	 * Displays popup menu.
+	 */
 	/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
 
 private:
@@ -619,10 +619,10 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver
 	LLMenuGL* mPopupMenu;
 };
 
-/*
+/**
  * Implements notification chiclet. Used to display total amount of unread messages 
  * across all IM sessions, total amount of system notifications.
-*/
+ */
 class LLNotificationChiclet : public LLChiclet
 {
 public:
@@ -666,10 +666,10 @@ class LLNotificationChiclet : public LLChiclet
 	S32 mCounter;
 };
 
-/*
+/**
  * Storage class for all IM chiclets. Provides mechanism to display, 
  * scroll, create, remove chiclets.
-*/
+ */
 class LLChicletPanel : public LLPanel
 {
 public:
@@ -686,62 +686,62 @@ class LLChicletPanel : public LLPanel
 
 	virtual ~LLChicletPanel();
 
-	/*
+	/**
 	 * Creates chiclet and adds it to chiclet list at specified index.
-	*/
+	 */
 	template<class T> T* createChiclet(const LLUUID& session_id, S32 index);
 
-	/*
+	/**
 	 * Creates chiclet and adds it to chiclet list at right.
-	*/
+	 */
 	template<class T> T* createChiclet(const LLUUID& session_id);
 
-	/*
+	/**
 	 * Returns pointer to chiclet of specified type at specified index.
-	*/
+	 */
 	template<class T> T* getChiclet(S32 index);
 
-	/*
+	/**
 	 * Returns pointer to LLChiclet at specified index.
-	*/
+	 */
 	LLChiclet* getChiclet(S32 index) { return getChiclet<LLChiclet>(index); }
 
-	/*
+	/**
 	 * Searches a chiclet using IM session id.
-	*/
+	 */
 	template<class T> T* findChiclet(const LLUUID& im_session_id);
 
-	/*
+	/**
 	 * Returns number of hosted chiclets.
-	*/
+	 */
 	S32 getChicletCount() {return mChicletList.size();};
 
-	/*
+	/**
 	 * Returns index of chiclet in list.
-	*/
+	 */
 	S32 getChicletIndex(const LLChiclet* chiclet);
 
-	/*
+	/**
 	 * Removes chiclet by index.
-	*/
+	 */
 	void removeChiclet(S32 index);
 
-	/*
+	/**
 	 * Removes chiclet by pointer.
-	*/
+	 */
 	void removeChiclet(LLChiclet* chiclet);
 
-	/*
+	/**
 	 * Removes chiclet by IM session id.
-	*/
+	 */
 	void removeChiclet(const LLUUID& im_session_id);
 
-	/*
+	/**
 	 * Removes all chiclets.
-	*/
+	 */
 	void removeAll();
 
-	/*
+	/**
 	 * Scrolls the panel to the specified chiclet
 	 */
 	void scrollToChiclet(const LLChiclet* chiclet);
@@ -751,14 +751,14 @@ class LLChicletPanel : public LLPanel
 
 	/*virtual*/ BOOL postBuild();
 
-	/*
-	* Handler for the Voice Client's signal. Finds a corresponding chiclet and toggles its SpeakerControl
-	*/
+	/**
+	 * Handler for the Voice Client's signal. Finds a corresponding chiclet and toggles its SpeakerControl
+	 */
 	void onCurrentVoiceChannelChanged(const LLUUID& session_id);
 
-	/*
+	/**
 	 * Reshapes controls and rearranges chiclets if needed.
-	*/
+	 */
 	/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE );
 
 	/*virtual*/ void draw();
@@ -788,88 +788,88 @@ class LLChicletPanel : public LLPanel
 	 */
 	void arrange();
 
-	/*
+	/**
 	 * Returns true if chiclets can be scrolled right.
-	*/
+	 */
 	bool canScrollRight();
 
-	/*
-	* Returns true if chiclets can be scrolled left.
-	*/
+	/**
+	 * Returns true if chiclets can be scrolled left.
+	 */
 	bool canScrollLeft();
 
-	/*
-	* Shows or hides chiclet scroll buttons if chiclets can or can not be scrolled.
-	*/
+	/**
+	 * Shows or hides chiclet scroll buttons if chiclets can or can not be scrolled.
+	 */
 	void showScrollButtonsIfNeeded();
 
-	/*
+	/**
 	 * Shifts chiclets left or right.
-	*/
+	 */
 	void shiftChiclets(S32 offset, S32 start_index = 0);
 
-	/*
+	/**
 	 * Removes gaps between first chiclet and scroll area left side,
 	 * last chiclet and scroll area right side.
-	*/
+	 */
 	void trimChiclets();
 
-	/*
+	/**
 	 * Scrolls chiclets to right or left.
-	*/
+	 */
 	void scroll(S32 offset);
 
-	/*
+	/**
 	 * Verifies that chiclets can be scrolled left, then calls scroll()
-	*/
+	 */
 	void scrollLeft();
 
-	/*
+	/**
 	 * Verifies that chiclets can be scrolled right, then calls scroll()
-	*/
+	 */
 	void scrollRight();
 
-	/*
+	/**
 	 * Callback for left scroll button clicked
-	*/
+	 */
 	void onLeftScrollClick();
 
-	/*
-	* Callback for right scroll button clicked
-	*/
+	/**
+	 * Callback for right scroll button clicked
+	 */
 	void onRightScrollClick();
 
-	/*
-	* Callback for right scroll button held down event
-	*/
+	/**
+	 * Callback for right scroll button held down event
+	 */
 	void onLeftScrollHeldDown();
 
-	/*
+	/**
 	 * Callback for left scroll button held down event
 	 */
 	void onRightScrollHeldDown();
 
-	/*
+	/**
 	 * Callback for mouse wheel scrolled, calls scrollRight() or scrollLeft()
-	*/
+	 */
 	BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
 
-	/*
+	/**
 	 * Notifies subscribers about click on chiclet.
 	 * Do not place any code here, instead subscribe on event (see setChicletClickedCallback).
-	*/
+	 */
 	void onChicletClick(LLUICtrl*ctrl,const LLSD&param);
 
-	/*
+	/**
 	 * Callback for chiclet size changed event, rearranges chiclets.
-	*/
+	 */
 	void onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param);
 
 	typedef std::vector<LLChiclet*> chiclet_list_t;
 
-	/*
+	/**
 	 * Removes chiclet from scroll area and chiclet list.
-	*/
+	 */
 	void removeChiclet(chiclet_list_t::iterator it);
 
 	S32 getChicletPadding() { return mChicletPadding; }
-- 
GitLab


From 3e46ee6274d04d91657da92953b167fe94eb7f59 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Thu, 19 Nov 2009 14:22:08 +0000
Subject: [PATCH 454/557] Fix "Global Illumintation" typo in the menu text
 which was bugging me.

---
 indra/newview/skins/default/xui/en/menu_viewer.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 077667a3fc5..8ab5fb16596 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -2464,7 +2464,7 @@
                  function="Advanced.EnableRenderDeferred" />
           </menu_item_check>
           <menu_item_check
-                   label="Global Illumintation"
+                   label="Global Illumination"
                    name="Global Illumination">
             <menu_item_check.on_check
              function="CheckControl"
-- 
GitLab


From 910f25a32ce1d287788b0c184a530c2c450391fa Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Thu, 19 Nov 2009 18:41:41 +0200
Subject: [PATCH 455/557] fixed EXT-2515 "Docked floaters should be resizeable"
 undock floater when user resize floater by resize bar;

--HG--
branch : product-engine
---
 indra/llui/llresizebar.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/indra/llui/llresizebar.cpp b/indra/llui/llresizebar.cpp
index 304ac64f312..a7cf9be277a 100644
--- a/indra/llui/llresizebar.cpp
+++ b/indra/llui/llresizebar.cpp
@@ -143,6 +143,12 @@ BOOL LLResizeBar::handleHover(S32 x, S32 y, MASK mask)
 		
 		if( valid_rect.localPointInRect( screen_x, screen_y ) && mResizingView )
 		{
+			// undock floater when user resize it
+			if (((LLFloater*)getParent())->isDocked())
+			{
+				((LLFloater*)getParent())->setDocked(false, false);
+			}
+
 			// Resize the parent
 			LLRect orig_rect = mResizingView->getRect();
 			LLRect scaled_rect = orig_rect;
-- 
GitLab


From d974ad39347e75241f8b6ccc9fce8caf835c453e Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Thu, 19 Nov 2009 12:06:26 -0500
Subject: [PATCH 456/557] EXT-2562 : Somehow show cnotents of what I'm wearing

Added appearanceSP button to toggle folder closed/open state.
Also fixed up some bugs with current outfit title placement in appearanceSP.xml
Also added a generic call for getting the current outfit folder link
---
 indra/newview/llappearancemgr.cpp             | 43 ++++++++++-
 indra/newview/llappearancemgr.h               |  3 +
 indra/newview/llsidepanelappearance.cpp       | 76 +++++++++++--------
 indra/newview/llsidepanelappearance.h         |  7 +-
 .../default/xui/en/sidepanel_appearance.xml   | 35 +++++----
 5 files changed, 112 insertions(+), 52 deletions(-)

diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index d6265a85f63..1050deaa27d 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -363,6 +363,35 @@ LLUUID LLAppearanceManager::getCOF()
 	return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
 }
 
+
+const LLViewerInventoryItem* LLAppearanceManager::getCurrentOutfitLink()
+{
+	const LLUUID& current_outfit_cat = getCOF();
+	LLInventoryModel::cat_array_t cat_array;
+	LLInventoryModel::item_array_t item_array;
+	// Can't search on FT_OUTFIT since links to categories return FT_CATEGORY for type since they don't
+	// return preferred type.
+	LLIsType is_category( LLAssetType::AT_CATEGORY ); 
+	gInventory.collectDescendentsIf(current_outfit_cat,
+									cat_array,
+									item_array,
+									false,
+									is_category,
+									false);
+	for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin();
+		 iter != item_array.end();
+		 iter++)
+	{
+		const LLViewerInventoryItem *item = (*iter);
+		const LLViewerInventoryCategory *cat = item->getLinkedCategory();
+		if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT)
+		{
+			return item;
+		}
+	}
+	return NULL;
+}
+
 // Update appearance from outfit folder.
 void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, bool append)
 {
@@ -531,20 +560,28 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
 	linkAll(cof, gest_items, link_waiter);
 
 	// Add link to outfit if category is an outfit. 
-	LLViewerInventoryCategory* catp = gInventory.getCategory(category);
+	const LLViewerInventoryCategory* catp = gInventory.getCategory(category);
+	LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance *>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
+	
 	if (!append && catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT)
 	{
 		link_inventory_item(gAgent.getID(), category, cof, catp->getName(),
 							LLAssetType::AT_LINK_FOLDER, link_waiter);
 
 		// Update the current outfit name of the appearance sidepanel.
-		LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance *>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
 		if (panel_appearance)
 		{
 			panel_appearance->refreshCurrentOutfitName(catp->getName());
 		}
 	}
-							  
+	else
+	{
+		// Update the current outfit name of the appearance sidepanel.
+		if (panel_appearance)
+		{
+			panel_appearance->refreshCurrentOutfitName();
+		}
+	}
 }
 
 void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, bool append)
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 5daa6d067b6..7038d1a35b7 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -61,6 +61,9 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 	// Find the Current Outfit folder.
 	LLUUID getCOF();
 
+	// Finds the folder link to the currently worn outfit
+	const LLViewerInventoryItem *getCurrentOutfitLink();
+
 	void updateAgentWearables(LLWearableHoldingPattern* holder, bool append);
 
 	// For debugging - could be moved elsewhere.
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index aeab3e28761..0f8e86cb3ca 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -34,9 +34,12 @@
 
 #include "llagent.h"
 #include "llagentwearables.h"
+#include "llappearancemgr.h"
+#include "llinventorypanel.h"
 #include "llfiltereditor.h"
 #include "llfloaterreg.h"
 #include "llfloaterworldmap.h"
+#include "llfoldervieweventlistener.h"
 #include "llpaneleditwearable.h"
 #include "llpaneloutfitsinventory.h"
 #include "lltextbox.h"
@@ -68,7 +71,7 @@ LLSidepanelAppearance::LLSidepanelAppearance() :
 	mFilterSubString(LLStringUtil::null),
 	mFilterEditor(NULL),
 	mLookInfo(NULL),
-	mCurrLookPanel(NULL)
+	mCurrOutfitPanel(NULL)
 {
 	//LLUICtrlFactory::getInstance()->buildPanel(this, "panel_appearance.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
 	mFetchWorn = new LLCurrentlyWornFetchObserver(this);
@@ -81,6 +84,9 @@ LLSidepanelAppearance::~LLSidepanelAppearance()
 // virtual
 BOOL LLSidepanelAppearance::postBuild()
 {
+	mOpenOutfitBtn = getChild<LLButton>("openoutfit_btn");
+	mOpenOutfitBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onOpenOutfitButtonClicked, this));
+
 	mEditAppearanceBtn = getChild<LLButton>("editappearance_btn");
 	mEditAppearanceBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditAppearanceButtonClicked, this));
 
@@ -90,11 +96,9 @@ BOOL LLSidepanelAppearance::postBuild()
 	mEditBtn = getChild<LLButton>("edit_btn");
 	mEditBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditButtonClicked, this));
 
-	mNewLookBtn = getChild<LLButton>("newlook_btn");
-	mNewLookBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onNewOutfitButtonClicked, this));
-	mNewLookBtn->setEnabled(false);
-
-	mOverflowBtn = getChild<LLButton>("overflow_btn");
+	mNewOutfitBtn = getChild<LLButton>("newlook_btn");
+	mNewOutfitBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onNewOutfitButtonClicked, this));
+	mNewOutfitBtn->setEnabled(false);
 
 	mFilterEditor = getChild<LLFilterEditor>("Filter");
 	if (mFilterEditor)
@@ -114,8 +118,6 @@ BOOL LLSidepanelAppearance::postBuild()
 			back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onBackButtonClicked, this));
 		}
 
-		// *TODO: Assign the action to an appropriate event.
-		// mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::toggleMediaPanel, this));
 	}
 
 	mEditWearable = dynamic_cast<LLPanelEditWearable*>(getChild<LLPanel>("panel_edit_wearable"));
@@ -130,7 +132,7 @@ BOOL LLSidepanelAppearance::postBuild()
 
 	mCurrentLookName = getChild<LLTextBox>("currentlook_name");
 	
-	mCurrLookPanel = getChild<LLPanel>("panel_currentlook");
+	mCurrOutfitPanel = getChild<LLPanel>("panel_currentlook");
 
 	return TRUE;
 }
@@ -179,6 +181,27 @@ void LLSidepanelAppearance::onWearButtonClicked()
 	}
 }
 
+void LLSidepanelAppearance::onOpenOutfitButtonClicked()
+{
+	const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getCurrentOutfitLink();
+	if (!outfit_link)
+		return;
+	if (!outfit_link->getIsLinkType())
+		return;
+	LLInventoryPanel *inventory_panel = mPanelOutfitsInventory->getActivePanel();
+	if (inventory_panel)
+	{
+		LLFolderView *folder = inventory_panel->getRootFolder();
+		LLFolderViewItem *outfit_folder = folder->getItemByID(outfit_link->getLinkedUUID());
+		if (outfit_folder)
+		{
+			outfit_folder->setOpen(!outfit_folder->isOpen());
+			folder->setSelectionFromRoot(outfit_folder,TRUE);
+			folder->scrollToShowSelection();
+		}
+	}
+}
+
 void LLSidepanelAppearance::onEditAppearanceButtonClicked()
 {
 	if (gAgentWearables.areWearablesLoaded())
@@ -231,9 +254,8 @@ void LLSidepanelAppearance::toggleLookInfoPanel(BOOL visible)
 	mFilterEditor->setVisible(!visible);
 	mWearBtn->setVisible(!visible);
 	mEditBtn->setVisible(!visible);
-	mNewLookBtn->setVisible(!visible);
-	mOverflowBtn->setVisible(!visible);
-	mCurrLookPanel->setVisible(!visible);
+	mNewOutfitBtn->setVisible(!visible);
+	mCurrOutfitPanel->setVisible(!visible);
 }
 
 void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *wearable)
@@ -255,7 +277,6 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we
 void LLSidepanelAppearance::updateVerbs()
 {
 	bool is_look_info_visible = mLookInfo->getVisible();
-	mOverflowBtn->setEnabled(false);
 
 	if (!is_look_info_visible)
 	{
@@ -274,35 +295,24 @@ void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string name)
 {
 	if (name == "")
 	{
-		const LLUUID current_outfit_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
-		LLInventoryModel::cat_array_t cat_array;
-		LLInventoryModel::item_array_t item_array;
-		// Can't search on AT_OUTFIT since links to categories return AT_CATEGORY for type since they don't
-		// return preferred type.
-		LLIsType is_category( LLAssetType::AT_CATEGORY ); 
-		gInventory.collectDescendentsIf(current_outfit_cat,
-										cat_array,
-										item_array,
-										false,
-										is_category,
-										false);
-		for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin();
-			 iter != item_array.end();
-			 iter++)
+		const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getCurrentOutfitLink();
+		if (outfit_link)
 		{
-			const LLViewerInventoryItem *item = (*iter);
-			const LLViewerInventoryCategory *cat = item->getLinkedCategory();
+			const LLViewerInventoryCategory *cat = outfit_link->getLinkedCategory();
 			if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT)
 			{
 				mCurrentLookName->setText(cat->getName());
 				return;
 			}
 		}
-		mCurrentLookName->setText(std::string(""));
+		mCurrentLookName->setText(getString("No Outfit"));
+		mOpenOutfitBtn->setEnabled(FALSE);
 	}
 	else
 	{
 		mCurrentLookName->setText(name);
+		// Can't just call update verbs since the folder link may not have been created yet.
+		mOpenOutfitBtn->setEnabled(TRUE);
 	}
 }
 
@@ -319,7 +329,7 @@ void LLSidepanelAppearance::editWearable(LLWearable *wearable, void *data)
 void LLSidepanelAppearance::fetchInventory()
 {
 
-	mNewLookBtn->setEnabled(false);
+	mNewOutfitBtn->setEnabled(false);
 	LLInventoryFetchObserver::item_ref_t ids;
 	LLUUID item_id;
 	for(S32 type = (S32)WT_SHAPE; type < (S32)WT_COUNT; ++type)
@@ -368,5 +378,5 @@ void LLSidepanelAppearance::fetchInventory()
 
 void LLSidepanelAppearance::inventoryFetched()
 {
-	mNewLookBtn->setEnabled(true);
+	mNewOutfitBtn->setEnabled(true);
 }
diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h
index 496a1fef728..b335fd910d9 100644
--- a/indra/newview/llsidepanelappearance.h
+++ b/indra/newview/llsidepanelappearance.h
@@ -64,6 +64,7 @@ class LLSidepanelAppearance : public LLPanel
 private:
 	void onFilterEdit(const std::string& search_string);
 
+	void onOpenOutfitButtonClicked();
 	void onEditAppearanceButtonClicked();
 	void onWearButtonClicked();
 	void onEditButtonClicked();
@@ -78,12 +79,12 @@ class LLSidepanelAppearance : public LLPanel
 	LLPanelLookInfo*		mLookInfo;
 	LLPanelEditWearable*	mEditWearable;
 
+	LLButton*					mOpenOutfitBtn;
 	LLButton*					mEditAppearanceBtn;
 	LLButton*					mWearBtn;
 	LLButton*					mEditBtn;
-	LLButton*					mNewLookBtn;
-	LLButton*					mOverflowBtn;
-	LLPanel*					mCurrLookPanel;
+	LLButton*					mNewOutfitBtn;
+	LLPanel*					mCurrOutfitPanel;
 
 	LLTextBox*					mCurrentLookName;
 
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index 2ce156cfda7..14530518d8e 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -9,9 +9,9 @@
 	  min_width="240"
 	  name="appearance panel"
 	  width="333">
-     <string
-		 name="looks_tab_title"
-		 value="Outfits" />
+	 <string
+      name="No Outfit"
+	  value="No Outfit" />
      <panel
 		 left="5" width="320" height="55"
 		 background_visible="true"
@@ -19,25 +19,34 @@
 		 bg_alpha_color="0.2 0.2 0.2 1.0"
 		 name="panel_currentlook"
 		 follows="left|top|right">
+  	    <button
+  	     	 follows="left|right|top"
+  	     	 font="SansSerif"
+  	     	 top="28" right="-10" width="60" height="20"
+  	     	 layout="topleft"
+  		 	 label="Edit"
+  	     	 name="editappearance_btn"/>
+        <button
+	     follows="left|right|top"
+		 top="28" left="5" width="25" height="22"
+	     image_overlay="Inv_LookFolderOpen"
+	     layout="topleft"
+		 name="openoutfit_btn"
+	     picture_style="true" />
 		<text
-			 top="-5" width="200" left="5" height="10" follows="left|right|top"
+			 top="10" width="150" left="5" height="15" follows="left|right|top"
+			 layout="topleft"
         	 font="SansSerif" text_color="LtGray" word_wrap="true"
         	 mouse_opaque="false" name="currentlook_title">
-					Current Outfit
+					Current Outfit:
     	</text>
   		<text
-			 top="-30" left="8" height="10" follows="left|right|top"
+			 top="32" width="150" left="32" height="15" follows="left|right|top"
+			 layout="topleft"
       		 font="SansSerifBold" text_color="white" word_wrap="true"
       		 mouse_opaque="false" name="currentlook_name" >
 					MyOutfit
   		</text>
-  	    <button
-  	     	 follows="left|right|top"
-  	     	 font="SansSerif"
-  	     	 top="28" right="-105" width="60" height="20"
-  	     	 layout="topleft"
-  		 	 label="Edit"
-  	     	 name="editappearance_btn"/>
 	</panel>
 
     <filter_editor
-- 
GitLab


From 9b9c11778cd5d71f3b238ca5bd5b69e118d97be9 Mon Sep 17 00:00:00 2001
From: Andrew Polunin <apolunin@productengine.com>
Date: Thu, 19 Nov 2009 19:51:47 +0200
Subject: [PATCH 457/557] fixed minor bug EXT-1615 Landmark name is truncated
 before @ character after placing landmark on Favorites Bar

--HG--
branch : product-engine
---
 indra/newview/llpanellandmarkinfo.cpp | 2 ++
 indra/newview/llviewerinventory.cpp   | 6 ++++++
 indra/newview/llviewerinventory.h     | 1 +
 3 files changed, 9 insertions(+)

diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp
index f94a59ecef5..5de7c3f851e 100644
--- a/indra/newview/llpanellandmarkinfo.cpp
+++ b/indra/newview/llpanellandmarkinfo.cpp
@@ -352,6 +352,8 @@ void LLPanelLandmarkInfo::createLandmark(const LLUUID& folder_id)
 	}
 
 	LLStringUtil::replaceChar(desc, '\n', ' ');
+	LLViewerInventoryItem::insertDefaultSortField(name);
+
 	// If no folder chosen use the "Landmarks" folder.
 	LLLandmarkActions::createLandmarkHere(name, desc,
 		folder_id.notNull() ? folder_id : gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK));
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 089535dfab4..87d256b60a9 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -1336,6 +1336,12 @@ BOOL LLViewerInventoryItem::extractSortFieldAndDisplayName(const std::string& na
 	return result;
 }
 
+void LLViewerInventoryItem::insertDefaultSortField(std::string& name)
+{
+	name.insert(0, std::string("1") + getSeparator());
+}
+
+
 // This returns true if the item that this item points to 
 // doesn't exist in memory (i.e. LLInventoryModel).  The baseitem
 // might still be in the database but just not loaded yet.
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index 529425aa258..d27faffdd9e 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -81,6 +81,7 @@ class LLViewerInventoryItem : public LLInventoryItem, public boost::signals2::tr
 	virtual U32 getCRC32() const; // really more of a checksum.
 
 	static BOOL extractSortFieldAndDisplayName(const std::string& name, S32* sortField, std::string* displayName);
+	static void insertDefaultSortField(std::string& name);
 
 	// construct a complete viewer inventory item
 	LLViewerInventoryItem(const LLUUID& uuid, const LLUUID& parent_uuid,
-- 
GitLab


From dc215882165dd1e781db9f2d93dc1f5509430f5f Mon Sep 17 00:00:00 2001
From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com>
Date: Thu, 19 Nov 2009 15:03:03 -0500
Subject: [PATCH 458/557] Edited to have elements follow panel bottom.
 https://jira.secondlife.com/browse/EXT-2446

---
 indra/newview/skins/default/xui/en/floater_buy_contents.xml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_buy_contents.xml b/indra/newview/skins/default/xui/en/floater_buy_contents.xml
index 833e8beb8d4..77a0e9b91bf 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_contents.xml
@@ -56,7 +56,7 @@
     <text
      type="string"
      length="1"
-     follows="left|top"
+     follows="left|bottom"
      font="SansSerif"
      height="16"
      layout="topleft"
@@ -68,7 +68,7 @@
         Buy for L$[AMOUNT] from [NAME]?
     </text>
     <check_box
-     follows="left|top"
+     follows="left|bottom"
      height="16"
      label="Wear clothing now"
      layout="topleft"
-- 
GitLab


From f3c53a84d3e4605546fbe038ad8a2b863d2cc399 Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Thu, 19 Nov 2009 22:38:27 +0200
Subject: [PATCH 459/557] Fixed normal bug EXT-2348 "My Landmarks: Show On Map
 does nothing for landmarks from Library" - Added callback to ensure that a
 landmark is loaded from the global landmark list. - Added disabling "Map"
 button to indicate that a landmark info is being  loaded.

--HG--
branch : product-engine
---
 indra/newview/lllandmarkactions.cpp |  18 ++-
 indra/newview/lllandmarkactions.h   |   6 +-
 indra/newview/llpanellandmarks.cpp  | 198 +++++++++++++++-------------
 indra/newview/llpanellandmarks.h    |  13 +-
 4 files changed, 140 insertions(+), 95 deletions(-)

diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp
index 003afafa87a..70546ccae69 100644
--- a/indra/newview/lllandmarkactions.cpp
+++ b/indra/newview/lllandmarkactions.cpp
@@ -374,22 +374,34 @@ void LLLandmarkActions::onRegionResponseNameAndCoords(region_name_and_coords_cal
 
 bool LLLandmarkActions::getLandmarkGlobalPos(const LLUUID& landmarkInventoryItemID, LLVector3d& posGlobal)
 {
-	LLLandmark* landmark = LLLandmarkActions::getLandmark(landmarkInventoryItemID);
+	LLViewerInventoryItem* item = gInventory.getItem(landmarkInventoryItemID);
+	if (NULL == item)
+		return NULL;
+
+	const LLUUID& asset_id = item->getAssetUUID();
 
+	LLLandmark* landmark = gLandmarkList.getAsset(asset_id, NULL);
 	if (NULL == landmark)
 		return false;
 
 	return landmark->getGlobalPos(posGlobal);
 }
 
-LLLandmark* LLLandmarkActions::getLandmark(const LLUUID& landmarkInventoryItemID)
+LLLandmark* LLLandmarkActions::getLandmark(const LLUUID& landmarkInventoryItemID, LLLandmarkList::loaded_callback_t cb)
 {
 	LLViewerInventoryItem* item = gInventory.getItem(landmarkInventoryItemID);
 	if (NULL == item)
 		return NULL;
 
 	const LLUUID& asset_id = item->getAssetUUID();
-	return gLandmarkList.getAsset(asset_id, NULL);
+
+	LLLandmark* landmark = gLandmarkList.getAsset(asset_id, cb);
+	if (landmark)
+	{
+		return landmark;
+	}
+
+	return NULL;
 }
 
 void LLLandmarkActions::copySLURLtoClipboard(const LLUUID& landmarkInventoryItemID)
diff --git a/indra/newview/lllandmarkactions.h b/indra/newview/lllandmarkactions.h
index c65b831f3e6..987caf0936d 100644
--- a/indra/newview/lllandmarkactions.h
+++ b/indra/newview/lllandmarkactions.h
@@ -35,7 +35,10 @@
 
 #include "llinventorymodel.h"
 
+#include "lllandmarklist.h"
+
 class LLLandmark;
+
 /**
  * @brief Provides helper functions to manage landmarks
  */
@@ -112,10 +115,11 @@ class LLLandmarkActions
 
     /**
      * @brief Retrieve a landmark from gLandmarkList by inventory item's id
+     * If a landmark is not currently in the gLandmarkList a callback "cb" is called when it is loaded.
      * 
      * @return pointer to loaded landmark from gLandmarkList or NULL if landmark does not exist or wasn't loaded.
      */
-    static LLLandmark* getLandmark(const LLUUID& landmarkInventoryItemID);
+    static LLLandmark* getLandmark(const LLUUID& landmarkInventoryItemID, LLLandmarkList::loaded_callback_t cb = NULL);
 
     /**
      * @brief  Performs standard action of copying of SLURL from landmark to user's clipboard.
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index e199db37abd..10b419dfdbb 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -148,20 +148,13 @@ void LLLandmarksPanel::onShowOnMap()
 		llwarns << "There are no selected list. No actions are performed." << llendl;
 		return;
 	}
-	LLLandmark* landmark = getCurSelectedLandmark();
-	if (!landmark)
-		return;
 
-	LLVector3d landmark_global_pos;
-	if (!landmark->getGlobalPos(landmark_global_pos))
-		return;
-	
-	LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
-	if (!landmark_global_pos.isExactlyZero() && worldmap_instance)
-	{
-		worldmap_instance->trackLocation(landmark_global_pos);
-		LLFloaterReg::showInstance("world_map", "center");
-	}
+	// Disable the "Map" button because loading landmark can take some time.
+	// During this time the button is useless. It will be enabled on callback finish
+	// or upon switching to other item.
+	mShowOnMapBtn->setEnabled(FALSE);
+
+	doActionOnCurSelectedLandmark(boost::bind(&LLLandmarksPanel::doShowOnMap, this, _1));
 }
 
 // virtual
@@ -256,15 +249,18 @@ bool LLLandmarksPanel::isReceivedFolderSelected() const
 
 	return false;
 }
-LLLandmark* LLLandmarksPanel::getCurSelectedLandmark() const
-{
 
+void LLLandmarksPanel::doActionOnCurSelectedLandmark(LLLandmarkList::loaded_callback_t cb)
+{
 	LLFolderViewItem* cur_item = getCurSelectedItem();
 	if(cur_item && cur_item->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK)
 	{ 
-		return LLLandmarkActions::getLandmark(cur_item->getListener()->getUUID());
+		LLLandmark* landmark = LLLandmarkActions::getLandmark(cur_item->getListener()->getUUID(), cb);
+		if (landmark)
+		{
+			cb(landmark);
+		}
 	}
-	return NULL;
 }
 
 LLFolderViewItem* LLLandmarksPanel::getCurSelectedItem() const 
@@ -294,45 +290,11 @@ void LLLandmarksPanel::processParcelInfo(const LLParcelData& parcel_data)
 	// We have to make request to sever to get parcel_id and snaption_id. 
 	if(isLandmarkSelected())
 	{
-		LLLandmark* landmark  =  getCurSelectedLandmark();
 		LLFolderViewItem* cur_item = getCurSelectedItem();
 		LLUUID id = cur_item->getListener()->getUUID();
-		LLInventoryItem* inv_item =  mCurrentSelectedList->getModel()->getItem(id);
-		if(landmark)
-		{
-			LLPanelPickEdit* panel_pick = LLPanelPickEdit::create();
-			LLVector3d landmark_global_pos;
-			landmark->getGlobalPos(landmark_global_pos);
-
-			// let's toggle pick panel into  panel places
-			LLPanel* panel_places =  LLSideTray::getInstance()->getChild<LLPanel>("panel_places");//-> sidebar_places
-			panel_places->addChild(panel_pick);
-			LLRect paren_rect(panel_places->getRect());
-			panel_pick->reshape(paren_rect.getWidth(),paren_rect.getHeight(), TRUE);
-			panel_pick->setRect(paren_rect);
-			panel_pick->onOpen(LLSD());
-
-			LLPickData data;
-			data.pos_global = landmark_global_pos;
-			data.name = cur_item->getName();
-			data.desc = inv_item->getDescription();
-			data.snapshot_id = parcel_data.snapshot_id;
-			data.parcel_id = parcel_data.parcel_id;
-			panel_pick->setPickData(&data);
-
-			LLSD params;
-			params["parcel_id"] =parcel_data.parcel_id;
-			/* set exit callback to get back onto panel places  
-			 in callback we will make cleaning up( delete pick_panel instance, 
-			 remove landmark panel from observer list
-			*/ 
-			panel_pick->setExitCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this,
-					panel_pick, panel_places,params));
-			panel_pick->setSaveCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this,
-				panel_pick, panel_places,params));
-			panel_pick->setCancelCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this,
-							panel_pick, panel_places,params));
-		}
+		LLInventoryItem* inv_item = mCurrentSelectedList->getModel()->getItem(id);
+		doActionOnCurSelectedLandmark(boost::bind(
+				&LLLandmarksPanel::doProcessParcelInfo, this, _1, cur_item, inv_item, parcel_data));
 	}
 }
 
@@ -747,42 +709,7 @@ void LLLandmarksPanel::onCustomAction(const LLSD& userdata)
 	}
 	else if ("create_pick" == command_name)
 	{
-		LLLandmark* landmark = getCurSelectedLandmark();
-		if(!landmark) return;
-		
-		LLViewerRegion* region = gAgent.getRegion();
-		if (!region) return;
-
-		LLGlobalVec pos_global;
-		LLUUID region_id;
-		landmark->getGlobalPos(pos_global);
-		landmark->getRegionID(region_id);
-		LLVector3 region_pos((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
-						  (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
-						  (F32)pos_global.mdV[VZ]);
-
-		LLSD body;
-		std::string url = region->getCapability("RemoteParcelRequest");
-		if (!url.empty())
-		{
-			body["location"] = ll_sd_from_vector3(region_pos);
-			if (!region_id.isNull())
-			{
-				body["region_id"] = region_id;
-			}
-			if (!pos_global.isExactlyZero())
-			{
-				U64 region_handle = to_region_handle(pos_global);
-				body["region_handle"] = ll_sd_from_U64(region_handle);
-			}
-			LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle()));
-		}
-		else 
-		{
-			llwarns << "Can't create pick for landmark for region" << region_id 
-					<< ". Region: "	<< region->getName() 
-					<< " does not support RemoteParcelRequest" << llendl; 
-		}
+		doActionOnCurSelectedLandmark(boost::bind(&LLLandmarksPanel::doCreatePick, this, _1));
 	}
 }
 
@@ -931,6 +858,97 @@ void LLLandmarksPanel::updateFilteredAccordions()
 	mDirtyFilter = false;
 }
 
+void LLLandmarksPanel::doShowOnMap(LLLandmark* landmark)
+{
+	LLVector3d landmark_global_pos;
+	if (!landmark->getGlobalPos(landmark_global_pos))
+		return;
+
+	LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
+	if (!landmark_global_pos.isExactlyZero() && worldmap_instance)
+	{
+		worldmap_instance->trackLocation(landmark_global_pos);
+		LLFloaterReg::showInstance("world_map", "center");
+	}
+
+	mShowOnMapBtn->setEnabled(TRUE);
+}
+
+void LLLandmarksPanel::doProcessParcelInfo(LLLandmark* landmark,
+										   LLFolderViewItem* cur_item,
+										   LLInventoryItem* inv_item,
+										   const LLParcelData& parcel_data)
+{
+	LLPanelPickEdit* panel_pick = LLPanelPickEdit::create();
+	LLVector3d landmark_global_pos;
+	landmark->getGlobalPos(landmark_global_pos);
+
+	// let's toggle pick panel into  panel places
+	LLPanel* panel_places =  LLSideTray::getInstance()->getChild<LLPanel>("panel_places");//-> sidebar_places
+	panel_places->addChild(panel_pick);
+	LLRect paren_rect(panel_places->getRect());
+	panel_pick->reshape(paren_rect.getWidth(),paren_rect.getHeight(), TRUE);
+	panel_pick->setRect(paren_rect);
+	panel_pick->onOpen(LLSD());
+
+	LLPickData data;
+	data.pos_global = landmark_global_pos;
+	data.name = cur_item->getName();
+	data.desc = inv_item->getDescription();
+	data.snapshot_id = parcel_data.snapshot_id;
+	data.parcel_id = parcel_data.parcel_id;
+	panel_pick->setPickData(&data);
+
+	LLSD params;
+	params["parcel_id"] = parcel_data.parcel_id;
+	/* set exit callback to get back onto panel places
+	 in callback we will make cleaning up( delete pick_panel instance,
+	 remove landmark panel from observer list
+	*/
+	panel_pick->setExitCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this,
+			panel_pick, panel_places,params));
+	panel_pick->setSaveCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this,
+		panel_pick, panel_places,params));
+	panel_pick->setCancelCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this,
+					panel_pick, panel_places,params));
+}
+
+void LLLandmarksPanel::doCreatePick(LLLandmark* landmark)
+{
+	LLViewerRegion* region = gAgent.getRegion();
+	if (!region) return;
+
+	LLGlobalVec pos_global;
+	LLUUID region_id;
+	landmark->getGlobalPos(pos_global);
+	landmark->getRegionID(region_id);
+	LLVector3 region_pos((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
+					  (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
+					  (F32)pos_global.mdV[VZ]);
+
+	LLSD body;
+	std::string url = region->getCapability("RemoteParcelRequest");
+	if (!url.empty())
+	{
+		body["location"] = ll_sd_from_vector3(region_pos);
+		if (!region_id.isNull())
+		{
+			body["region_id"] = region_id;
+		}
+		if (!pos_global.isExactlyZero())
+		{
+			U64 region_handle = to_region_handle(pos_global);
+			body["region_handle"] = ll_sd_from_U64(region_handle);
+		}
+		LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle()));
+	}
+	else
+	{
+		llwarns << "Can't create pick for landmark for region" << region_id
+				<< ". Region: "	<< region->getName()
+				<< " does not support RemoteParcelRequest" << llendl;
+	}
+}
 
 //////////////////////////////////////////////////////////////////////////
 // HELPER FUNCTIONS
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index 097d79badf8..777ee562d23 100644
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -37,6 +37,7 @@
 
 // newview
 #include "llinventorymodel.h"
+#include "lllandmarklist.h"
 #include "llpanelplacestab.h"
 #include "llpanelpick.h"
 #include "llremoteparcelrequest.h"
@@ -68,7 +69,7 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
 	 */
 	bool isLandmarkSelected() const;
 	bool isReceivedFolderSelected() const;
-	LLLandmark* getCurSelectedLandmark() const;
+	void doActionOnCurSelectedLandmark(LLLandmarkList::loaded_callback_t cb);
 	LLFolderViewItem* getCurSelectedItem() const;
 	void updateSortOrder(LLInventoryPanel* panel, bool byDate);
 
@@ -127,6 +128,16 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
 	 */
 	void updateFilteredAccordions();
 
+	/**
+	 * Landmark actions callbacks. Fire when a landmark is loaded from the list.
+	 */
+	void doShowOnMap(LLLandmark* landmark);
+	void doProcessParcelInfo(LLLandmark* landmark,
+							 LLFolderViewItem* cur_item,
+							 LLInventoryItem* inv_item,
+							 const LLParcelData& parcel_data);
+	void doCreatePick(LLLandmark* landmark);
+
 private:
 	LLInventorySubTreePanel*	mFavoritesInventoryPanel;
 	LLInventorySubTreePanel*	mLandmarksInventoryPanel;
-- 
GitLab


From 7be953512ab67e5f7659547232462f4510179196 Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Thu, 19 Nov 2009 14:31:00 -0800
Subject: [PATCH 460/557] fix for disappearing scrollbar in im windows

---
 indra/newview/skins/default/xui/en/floater_im_session.xml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index c20aaea2aa3..01713cc003d 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -35,6 +35,7 @@
     <layout_panel
        left="0"
        top="0"
+	   width="180"
        user_resize="false">
         <button
           height="20"
-- 
GitLab


From d577b2a77e897203a2ad3fcf7746abc95b2f9923 Mon Sep 17 00:00:00 2001
From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com>
Date: Thu, 19 Nov 2009 17:39:54 -0500
Subject: [PATCH 461/557] Increased size of floater in floater_region_info.xml
 and modified layout in panel_region_estate.xml. Also made button sizes to
 spec and did a general clean-up of the layout.
 http://jira.secondlife.com/browse/EXT-2658

---
 .../default/xui/en/floater_region_info.xml    |   4 +-
 .../default/xui/en/panel_region_estate.xml    | 104 +++++++++---------
 2 files changed, 54 insertions(+), 54 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_region_info.xml b/indra/newview/skins/default/xui/en/floater_region_info.xml
index 9bb30f8e86d..262bcd07a0f 100644
--- a/indra/newview/skins/default/xui/en/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/en/floater_region_info.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <floater
  legacy_header_height="18"
- height="512"
+ height="555"
  help_topic="regioninfo"
  layout="topleft"
  name="regioninfo"
@@ -9,7 +9,7 @@
  title="REGION/ESTATE"
  width="480">
     <tab_container
-     bottom="512"
+     bottom="555"
      follows="left|right|top|bottom"
      layout="topleft"
      left="1"
diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml
index add14761791..e25ff0d5485 100644
--- a/indra/newview/skins/default/xui/en/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml
@@ -81,7 +81,7 @@ regions in the estate.
     <view_border
      bevel_style="in"
      follows="top|left"
-     height="290"
+     height="310"
      layout="topleft"
      left_delta="-4"
      top_pad="5"
@@ -185,48 +185,48 @@ regions in the estate.
      follows="left|top"
      height="20"
      layout="topleft"
-     left="10"
+     left="15"
      name="abuse_email_text"
-     top_pad="5"
+     top_pad="10"
      width="180">
         Abuse email address:
     </text>
     <line_editor
      follows="top|left"
-     height="19"
+     height="23"
      layout="topleft"
      left="15"
      name="abuse_email_address"
-     top_pad="5"
-     width="205" />
+     top_pad="-5"
+     width="230" />
     <button
      enabled="false"
      follows="left|top"
-     height="20"
+     height="23"
      label="Apply"
      layout="topleft"
      name="apply_btn"
-     right="250"
-     top_pad="4"
-     width="90" />
+     top_pad="10"
+     left="78"
+     width="97" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Send Message To Estate..."
      layout="topleft"
-     left="8"
+     left="50"
      name="message_estate_btn"
-     top_pad="5"
-     width="250" />
+     top_pad="20"
+     width="160" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Kick User from Estate..."
      layout="topleft"
-     left="8"
+     left="50"
      name="kick_user_from_estate_btn"
      top_pad="5"
-     width="250" />
+     width="160" />
 
     <text
      type="string"
@@ -243,14 +243,14 @@ regions in the estate.
     <view_border
      bevel_style="none"
      follows="top|left"
-     height="60"
+     height="71"
      layout="topleft"
      right="470"
-     top_pad="5"
+     top_pad="-5"
      width="200" />
     <name_list
      follows="left|top"
-     height="60"
+     height="71"
      layout="topleft"
      left_delta="0"
      multi_select="true"
@@ -259,22 +259,22 @@ regions in the estate.
      width="200" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Remove..."
      layout="topleft"
      name="remove_estate_manager_btn"
      right="470"
      top_pad="5"
-     width="90" />
+     width="97" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Add..."
      layout="topleft"
-     left_delta="-110"
+     left_delta="-103"
      name="add_estate_manager_btn"
      top_delta="0"
-     width="90" />
+     width="97" />
     <text
      type="string"
      length="1"
@@ -283,21 +283,21 @@ regions in the estate.
      layout="topleft"
      left_delta="0"
      name="allow_resident_label"
-     top_pad="5"
+     top_pad="10"
      width="200">
         Allowed Residents:
     </text>
     <view_border
      bevel_style="none"
      follows="top|left"
-     height="60"
+     height="71"
      layout="topleft"
      right="470"
-     top_pad="5"
+     top_pad="-5"
      width="200" />
     <name_list
      follows="left|top"
-     height="60"
+     height="71"
      layout="topleft"
      left_delta="0"
      multi_select="true"
@@ -306,22 +306,22 @@ regions in the estate.
      width="200" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Remove..."
      layout="topleft"
      name="remove_allowed_avatar_btn"
      right="470"
      top_pad="5"
-     width="90" />
+     width="97" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Add..."
      layout="topleft"
-     left_delta="-110"
+     left_delta="-103"
      name="add_allowed_avatar_btn"
      top_delta="0"
-     width="90" />
+     width="97" />
     <text
      type="string"
      length="1"
@@ -330,21 +330,21 @@ regions in the estate.
      layout="topleft"
      left_delta="0"
      name="allow_group_label"
-     top_pad="5"
+     top_pad="10"
      width="200">
         Allowed Groups:
     </text>
     <view_border
      bevel_style="none"
      follows="top|left"
-     height="60"
+     height="71"
      layout="topleft"
      right="470"
-     top_pad="5"
+     top_pad="-5"
      width="200" />
     <name_list
      follows="left|top"
-     height="60"
+     height="71"
      layout="topleft"
      left_delta="0"
      multi_select="true"
@@ -353,22 +353,22 @@ regions in the estate.
      width="200" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Remove..."
      layout="topleft"
      name="remove_allowed_group_btn"
      right="470"
      top_pad="5"
-     width="90" />
+     width="97" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Add..."
      layout="topleft"
-     left_delta="-110"
+     left_delta="-103"
      name="add_allowed_group_btn"
      top_delta="0"
-     width="90" />
+     width="97" />
     <text
      type="string"
      length="1"
@@ -377,21 +377,21 @@ regions in the estate.
      layout="topleft"
      left_delta="0"
      name="ban_resident_label"
-     top_pad="5"
+     top_pad="10"
      width="200">
         Banned Residents:
     </text>
     <view_border
      bevel_style="none"
      follows="top|left"
-     height="60"
+     height="71"
      layout="topleft"
      right="470"
-     top_pad="5"
+     top_pad="-5"
      width="200" />
     <name_list
      follows="left|top"
-     height="60"
+     height="71"
      layout="topleft"
      left_delta="0"
      multi_select="true"
@@ -400,20 +400,20 @@ regions in the estate.
      width="200" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Remove..."
      layout="topleft"
      name="remove_banned_avatar_btn"
      right="470"
      top_pad="5"
-     width="90" />
+     width="97" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Add..."
      layout="topleft"
-     left_delta="-110"
+     left_delta="-103"
      name="add_banned_avatar_btn"
      top_delta="0"
-     width="90" />
+     width="97" />
 </panel>
-- 
GitLab


From 320dfa1d72c2eab9c59daf6bb13cc5001162c7b0 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Thu, 19 Nov 2009 15:01:27 -0800
Subject: [PATCH 462/557] Added LLVOVolume::markDead(), which unhooks any prim
 media instances from the dead object.

---
 indra/newview/llvovolume.cpp | 22 ++++++++++++++++++++++
 indra/newview/llvovolume.h   |  1 +
 2 files changed, 23 insertions(+)

diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index e5531a14977..8bfbfcb9c32 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -183,6 +183,22 @@ LLVOVolume::~LLVOVolume()
 	}
 }
 
+void LLVOVolume::markDead()
+{
+	if (!mDead)
+	{
+		// TODO: tell LLMediaDataClient to remove this object from its queue
+		
+		// Detach all media impls from this object
+		for(U32 i = 0 ; i < mMediaImplList.size() ; i++)
+		{
+			removeMediaImpl(i);
+		}
+	}
+	
+	LLViewerObject::markDead();
+}
+
 
 // static
 void LLVOVolume::initClass()
@@ -1708,6 +1724,12 @@ void LLVOVolume::updateObjectMediaData(const LLSD &media_data_array)
 
 void LLVOVolume::syncMediaData(S32 texture_index, const LLSD &media_data, bool merge, bool ignore_agent)
 {
+	if(mDead)
+	{
+		// If the object has been marked dead, don't process media updates.
+		return;
+	}
+	
 	LLTextureEntry *te = getTE(texture_index);
 	//llinfos << "BEFORE: texture_index = " << texture_index
 	//	<< " hasMedia = " << te->hasMedia() << " : " 
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index fb543efc048..70d203daf2d 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -100,6 +100,7 @@ class LLVOVolume : public LLViewerObject
 
 public:
 						LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
+	/*virtual*/ void markDead();		// Override (and call through to parent) to clean up media references
 
 	/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
 
-- 
GitLab


From c994b57fa483d09367546d27434c25a316d86fe0 Mon Sep 17 00:00:00 2001
From: Leyla Farazha <leyla@lindenlab.com>
Date: Thu, 19 Nov 2009 16:29:20 -0800
Subject: [PATCH 463/557] EXT-2490 	 Right click context menu for objects
 should include build tools EXT-2541 	 Help > Report Abuse screenshot not
 showing up EXT-2549 	 Crash on exit from mouse-look (Mini Map related)
 EXT-2548 	 Viewer freezes when going out of the mouselook while there
 are more than two floaters EXT-1983 	 [BSI] Trying to edit a script in a no
 mod object pops up script editor with "object out of range" reviewed by
 Richard

---
 indra/llui/llfloater.cpp                          |  8 ++++++--
 indra/newview/llagent.cpp                         |  6 +++++-
 indra/newview/llpanelobjectinventory.cpp          | 13 ++++++++++---
 indra/newview/llviewermenu.cpp                    | 15 ++++++++++++++-
 .../skins/default/xui/en/floater_report_abuse.xml |  2 +-
 .../skins/default/xui/en/notifications.xml        |  7 +++++++
 6 files changed, 43 insertions(+), 8 deletions(-)

diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 2a0dcaf3336..bf965e8e28e 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -2526,8 +2526,12 @@ void LLFloaterView::pushVisibleAll(BOOL visible, const skip_list_t& skip_list)
 
 void LLFloaterView::popVisibleAll(const skip_list_t& skip_list)
 {
-	for (child_list_const_iter_t child_iter = getChildList()->begin();
-		 child_iter != getChildList()->end(); ++child_iter)
+	// make a copy of the list since some floaters change their
+	// order in the childList when changing visibility.
+	child_list_t child_list_copy = *getChildList();
+
+	for (child_list_const_iter_t child_iter = child_list_copy.begin();
+		 child_iter != child_list_copy.end(); ++child_iter)
 	{
 		LLView *view = *child_iter;
 		if (skip_list.find(view) == skip_list.end())
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 7a540a45c4c..e658b9af6a2 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -2810,7 +2810,11 @@ void LLAgent::endAnimationUpdateUI()
 			LLFloaterReg::restoreVisibleInstances();
 #else // Use this for now
 			LLFloaterView::skip_list_t skip_list;
-			skip_list.insert(LLFloaterReg::findInstance("mini_map"));
+			if (LLFloaterReg::findInstance("mini_map"))
+			{
+				skip_list.insert(LLFloaterReg::findInstance("mini_map"));
+			}
+		
 			gFloaterView->popVisibleAll(skip_list);
 #endif
 			mViewsPushed = FALSE;
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index b1fbf789c69..dbe0ec3b86e 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -1158,10 +1158,17 @@ void LLTaskLSLBridge::openItem()
 	{
 		return;
 	}
-	LLLiveLSLEditor* preview = LLFloaterReg::showTypedInstance<LLLiveLSLEditor>("preview_scriptedit", LLSD(mUUID), TAKE_FOCUS_YES);
-	if (preview && (object->permModify() || gAgent.isGodlike()))
+	if (object->permModify() || gAgent.isGodlike())
 	{
-		preview->setObjectID(mPanel->getTaskUUID());
+		LLLiveLSLEditor* preview = LLFloaterReg::showTypedInstance<LLLiveLSLEditor>("preview_scriptedit", LLSD(mUUID), TAKE_FOCUS_YES);
+		if (preview)
+		{
+			preview->setObjectID(mPanel->getTaskUUID());
+		}
+	}
+	else
+	{	
+		LLNotifications::instance().add("CannotOpenScriptObjectNoMod");
 	}
 }
 
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 6a6aa1061dc..c67af994a42 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -2733,15 +2733,26 @@ bool enable_object_edit()
 	// there.  Eventually this needs to be replaced with code that only 
 	// lets you edit objects if you have permission to do so (edit perms,
 	// group edit, god).  See also lltoolbar.cpp.  JC
-	bool enable = true;
+	bool enable = false;
 	if (gAgent.inPrelude())
 	{
 		enable = LLViewerParcelMgr::getInstance()->agentCanBuild()
 			|| LLSelectMgr::getInstance()->getSelection()->isAttachment();
+	} 
+	else if (LLSelectMgr::getInstance()->selectGetModify())
+	{
+		enable = true;
 	}
+
 	return enable;
 }
 
+// mutually exclusive - show either edit option or build in menu
+bool enable_object_build()
+{
+	return !enable_object_edit();
+}
+
 class LLSelfRemoveAllAttachments : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
@@ -8023,6 +8034,8 @@ void initialize_menus()
 	visible.add("VisiblePayObject", boost::bind(&enable_pay_object));
 	enable.add("EnablePayAvatar", boost::bind(&enable_pay_avatar));
 	enable.add("EnableEdit", boost::bind(&enable_object_edit));
+	visible.add("VisibleBuild", boost::bind(&enable_object_build));
+	visible.add("VisibleEdit", boost::bind(&enable_object_edit));
 	visible.add("Object.VisibleEdit", boost::bind(&enable_object_edit));
 
 	view_listener_t::addMenu(new LLFloaterVisible(), "FloaterVisible");
diff --git a/indra/newview/skins/default/xui/en/floater_report_abuse.xml b/indra/newview/skins/default/xui/en/floater_report_abuse.xml
index 696233676cd..91ca3ef27ad 100644
--- a/indra/newview/skins/default/xui/en/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/en/floater_report_abuse.xml
@@ -18,7 +18,7 @@
      height="150"
      layout="topleft"
      left="60"
-     name=""
+     name="screenshot"
      top="15"
      width="220" />
     <check_box
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 0d1ed6fc649..d955e875a7c 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -1434,6 +1434,13 @@ Not able to perform &apos;reset&apos;.
 Select objects with scripts that you have permission to modify.
   </notification>
 
+  <notification
+   icon="alertmodal.tga"
+   name="CannotOpenScriptObjectNoMod"
+   type="alertmodal">
+    Unable to open script in object without modify permissions.
+  </notification>
+
   <notification
    icon="alertmodal.tga"
    name="CannotSetRunningSelectObjectsNoScripts"
-- 
GitLab


From ba3f7965e35e4eb0d7fcecc7267ec3af5f2d8d87 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Thu, 19 Nov 2009 16:35:11 -0800
Subject: [PATCH 464/557] Made LLMediaDataClient not send requests on behalf of
 objects that are marked as dead.

When LLMediaDataClient::QueueTimer::tick() encounters an object at the head of the queue that's dead, it will now remove that object and loop, instead of sending a request and waiting for the tick timer to fire again.

Added an isDead() function to LLMediaDataClientObject, and an additional unit test that verifies the handling of dead objects.
---
 indra/newview/llmediadataclient.cpp           | 116 ++++++++++--------
 indra/newview/llmediadataclient.h             |   2 +
 indra/newview/llvovolume.cpp                  |   3 +
 .../newview/tests/llmediadataclient_test.cpp  |  66 +++++++++-
 4 files changed, 138 insertions(+), 49 deletions(-)

diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp
index 986c14acff7..6666a03ee45 100755
--- a/indra/newview/llmediadataclient.cpp
+++ b/indra/newview/llmediadataclient.cpp
@@ -371,67 +371,87 @@ BOOL LLMediaDataClient::QueueTimer::tick()
 	}
 	
 	LLMediaDataClient::PriorityQueue &queue = *(mMDC->pRequestQueue);
-	
-	if (queue.empty())
+
+	if(!queue.empty())
 	{
-		LL_DEBUGS("LLMediaDataClient") << "queue empty: " << queue << LL_ENDL;
-		return TRUE;
+		LL_INFOS("LLMediaDataClient") << "QueueTimer::tick() started, queue is:	  " << queue << LL_ENDL;
 	}
 
-	LL_INFOS("LLMediaDataClient") << "QueueTimer::tick() started, queue is:	  " << queue << LL_ENDL;
-
-	// Peel one off of the items from the queue, and execute request
-	request_ptr_t request = queue.top();
-	llassert(!request.isNull());
-	const LLMediaDataClientObject *object = (request.isNull()) ? NULL : request->getObject();
-	bool performed_request = false;
-	bool error = false;
-	llassert(NULL != object);
-	if (NULL != object && object->hasMedia())
+	// quick retry loop for cases where we shouldn't wait for the next timer tick
+	while(true)
 	{
-		std::string url = request->getCapability();
-		if (!url.empty())
+		if (queue.empty())
 		{
-			const LLSD &sd_payload = request->getPayload();
-			LL_INFOS("LLMediaDataClient") << "Sending request for " << *request << LL_ENDL;
-
-			// Call the subclass for creating the responder
-			LLHTTPClient::post(url, sd_payload, mMDC->createResponder(request));
-			performed_request = true;
+			LL_DEBUGS("LLMediaDataClient") << "queue empty: " << queue << LL_ENDL;
+			return TRUE;
 		}
-		else {
-			LL_INFOS("LLMediaDataClient") << "NOT Sending request for " << *request << ": empty cap url!" << LL_ENDL;
-		}
-	}
-	else {
-		if (request.isNull()) 
+	
+		// Peel one off of the items from the queue, and execute request
+		request_ptr_t request = queue.top();
+		llassert(!request.isNull());
+		const LLMediaDataClientObject *object = (request.isNull()) ? NULL : request->getObject();
+		bool performed_request = false;
+		bool error = false;
+		llassert(NULL != object);
+
+		if(object->isDead())
 		{
-			LL_WARNS("LLMediaDataClient") << "Not Sending request: NULL request!" << LL_ENDL;
+			// This object has been marked dead.  Pop it and move on to the next item in the queue immediately.
+			LL_INFOS("LLMediaDataClient") << "Skipping " << *request << ": object is dead!" << LL_ENDL;
+			queue.pop();
+			continue;	// jump back to the start of the quick retry loop
 		}
-		else if (NULL == object) 
+
+		if (NULL != object && object->hasMedia())
 		{
-			LL_WARNS("LLMediaDataClient") << "Not Sending request for " << *request << " NULL object!" << LL_ENDL;
+			std::string url = request->getCapability();
+			if (!url.empty())
+			{
+				const LLSD &sd_payload = request->getPayload();
+				LL_INFOS("LLMediaDataClient") << "Sending request for " << *request << LL_ENDL;
+
+				// Call the subclass for creating the responder
+				LLHTTPClient::post(url, sd_payload, mMDC->createResponder(request));
+				performed_request = true;
+			}
+			else {
+				LL_INFOS("LLMediaDataClient") << "NOT Sending request for " << *request << ": empty cap url!" << LL_ENDL;
+			}
 		}
-		else if (!object->hasMedia())
-		{
-			LL_WARNS("LLMediaDataClient") << "Not Sending request for " << *request << " hasMedia() is false!" << LL_ENDL;
+		else {
+			if (request.isNull()) 
+			{
+				LL_WARNS("LLMediaDataClient") << "Not Sending request: NULL request!" << LL_ENDL;
+			}
+			else if (NULL == object) 
+			{
+				LL_WARNS("LLMediaDataClient") << "Not Sending request for " << *request << " NULL object!" << LL_ENDL;
+			}
+			else if (!object->hasMedia())
+			{
+				LL_WARNS("LLMediaDataClient") << "Not Sending request for " << *request << " hasMedia() is false!" << LL_ENDL;
+			}
+			error = true;
 		}
-		error = true;
-	}
-	bool exceeded_retries = request->getRetryCount() > mMDC->mMaxNumRetries;
-	if (performed_request || exceeded_retries || error) // Try N times before giving up 
-	{
-		if (exceeded_retries)
+		bool exceeded_retries = request->getRetryCount() > mMDC->mMaxNumRetries;
+		if (performed_request || exceeded_retries || error) // Try N times before giving up 
 		{
-			LL_WARNS("LLMediaDataClient") << "Could not send request " << *request << " for " 
-										  << mMDC->mMaxNumRetries << " tries...popping object id " << object->getID() << LL_ENDL; 
-			// XXX Should we bring up a warning dialog??
+			if (exceeded_retries)
+			{
+				LL_WARNS("LLMediaDataClient") << "Could not send request " << *request << " for " 
+											  << mMDC->mMaxNumRetries << " tries...popping object id " << object->getID() << LL_ENDL; 
+				// XXX Should we bring up a warning dialog??
+			}
+			queue.pop();
 		}
-		queue.pop();
-	}
-	else {
-		request->incRetryCount();
-	}
+		else {
+			request->incRetryCount();
+		}
+		
+ 		// end of quick retry loop -- any cases where we want to loop will use 'continue' to jump back to the start.
+ 		break;
+	}  
+	
 	LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() finished, queue is now: " << (*(mMDC->pRequestQueue)) << LL_ENDL;
 
 	return queue.empty();
diff --git a/indra/newview/llmediadataclient.h b/indra/newview/llmediadataclient.h
index 0d1450ffbe5..d5dd050111f 100755
--- a/indra/newview/llmediadataclient.h
+++ b/indra/newview/llmediadataclient.h
@@ -62,6 +62,8 @@ class LLMediaDataClientObject : public LLRefCount
 	virtual F64 getTotalMediaInterest() const = 0;
 	// Return the given cap url
 	virtual std::string getCapabilityUrl(const std::string &name) const = 0;
+	// Return whether the object has been marked dead
+	virtual bool isDead() const = 0;
 
 	// smart pointer
 	typedef LLPointer<LLMediaDataClientObject> ptr_t;
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 8bfbfcb9c32..5a67e64bbd0 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -140,6 +140,9 @@ class LLMediaDataClientObjectImpl : public LLMediaDataClientObject
 	virtual std::string getCapabilityUrl(const std::string &name) const
 		{ return mObject->getRegion()->getCapability(name); }
 	
+	virtual bool isDead() const
+		{ return mObject->isDead(); }
+	
 private:
 	LLPointer<LLVOVolume> mObject;
 };
diff --git a/indra/newview/tests/llmediadataclient_test.cpp b/indra/newview/tests/llmediadataclient_test.cpp
index 3ac631d96e3..217889c3900 100644
--- a/indra/newview/tests/llmediadataclient_test.cpp
+++ b/indra/newview/tests/llmediadataclient_test.cpp
@@ -152,12 +152,13 @@ class LLMediaDataClientObjectTest : public LLMediaDataClientObject
 			std::istringstream d(data);
 			LLSDSerialize::fromXML(mRep, d);
 			mNumBounceBacks = 0;
+			mDead = false;
             
            // std::cout << ll_pretty_print_sd(mRep) << std::endl;
            // std::cout << "ID: " << getID() << std::endl;
 		}
 	LLMediaDataClientObjectTest(const LLSD &rep) 
-		: mRep(rep), mNumBounceBacks(0) {}
+		: mRep(rep), mNumBounceBacks(0), mDead(false) {}
 	~LLMediaDataClientObjectTest()
 		{ LL_DEBUGS("LLMediaDataClient") << "~LLMediaDataClientObjectTest" << LL_ENDL; }
 	
@@ -187,12 +188,18 @@ class LLMediaDataClientObjectTest : public LLMediaDataClientObject
 	virtual std::string getCapabilityUrl(const std::string &name) const 
 		{ return mRep["cap_urls"][name]; }
 
+	virtual bool isDead() const
+		{ return mDead; }
+
 	int getNumBounceBacks() const
 		{ return mNumBounceBacks; }
 	
+	void markDead()
+		{ mDead = true; }
 private:
 	LLSD mRep;
 	int mNumBounceBacks;
+	bool mDead;
 };
 
 // This special timer delay should ensure that the timer will fire on the very
@@ -531,4 +538,61 @@ namespace tut
 		ensure("REF COUNT", o1->getNumRefs(), num_refs_start);
 		
 	}
+
+	template<> template<>
+    void mediadataclient_object_t::test<8>()
+    {
+		// Test queue handling of objects that are marked dead.
+		LOG_TEST(8);
+		
+		LLMediaDataClientObject::ptr_t o1 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_1,"1.0","1.0"));
+		LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_2,"2.0","1.0"));
+		LLMediaDataClientObject::ptr_t o3 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_3,"3.0","1.0"));
+		LLMediaDataClientObject::ptr_t o4 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_4,"4.0","1.0"));
+		{
+			LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD);
+			
+			// queue up all 4 objects
+			mdc->fetchMedia(o1);
+			mdc->fetchMedia(o2);
+			mdc->fetchMedia(o3);
+			mdc->fetchMedia(o4);
+			
+			// and mark the second and fourth ones dead.
+			dynamic_cast<LLMediaDataClientObjectTest*>(static_cast<LLMediaDataClientObject*>(o2))->markDead();
+			dynamic_cast<LLMediaDataClientObjectTest*>(static_cast<LLMediaDataClientObject*>(o4))->markDead();
+
+			ensure("is in queue 1", mdc->isInQueue(o1));
+			ensure("is in queue 2", mdc->isInQueue(o2));
+			ensure("is in queue 3", mdc->isInQueue(o3));
+			ensure("is in queue 4", mdc->isInQueue(o4));
+			ensure("post records", gPostRecords->size(), 0);
+			
+			::pump_timers();
+			
+			// The first tick should remove the first one 
+			ensure("is not in queue 1", !mdc->isInQueue(o1));
+			ensure("is in queue 2", mdc->isInQueue(o2));
+			ensure("is in queue 3", mdc->isInQueue(o3));
+			ensure("is in queue 4", mdc->isInQueue(o4));
+			ensure("post records", gPostRecords->size(), 1);
+			
+			::pump_timers();
+			
+			// The second tick should skip the second and remove the third
+			ensure("is not in queue 2", !mdc->isInQueue(o2));
+			ensure("is not in queue 3", !mdc->isInQueue(o3));
+			ensure("is in queue 4", mdc->isInQueue(o4));
+			ensure("post records", gPostRecords->size(), 2);
+
+			::pump_timers();
+
+			// The third tick should skip the fourth one and empty the queue.
+			ensure("is not in queue 4", !mdc->isInQueue(o4));
+			ensure("post records", gPostRecords->size(), 2);
+
+			ensure("queue empty", mdc->isEmpty());
+		}
+		
+	}
 }
-- 
GitLab


From 98d54377f9a793ffc0ed0aff31e828ec772a8d10 Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Thu, 19 Nov 2009 16:47:29 -0800
Subject: [PATCH 465/557] Make time-based media "forward" and "back" different
 from navigate forward and navigate back

---
 indra/newview/llpanelprimmediacontrols.cpp    | 46 ++++++++++++++--
 indra/newview/llpanelprimmediacontrols.h      |  4 ++
 .../xui/en/panel_prim_media_controls.xml      | 53 ++++++++++++++++++-
 3 files changed, 98 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 12ad070efd5..80d2a9425c8 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -102,6 +102,8 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
 	mCommitCallbackRegistrar.add("MediaCtrl.CommitVolumeUp",	boost::bind(&LLPanelPrimMediaControls::onCommitVolumeUp, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.CommitVolumeDown",	boost::bind(&LLPanelPrimMediaControls::onCommitVolumeDown, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.ToggleMute",		boost::bind(&LLPanelPrimMediaControls::onToggleMute, this));
+	mCommitCallbackRegistrar.add("MediaCtrl.SkipBack",		boost::bind(&LLPanelPrimMediaControls::onClickSkipBack, this));
+	mCommitCallbackRegistrar.add("MediaCtrl.SkipForward",	boost::bind(&LLPanelPrimMediaControls::onClickSkipForward, this));
 	
 	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_prim_media_controls.xml");
 	mInactivityTimer.reset();
@@ -135,6 +137,8 @@ BOOL LLPanelPrimMediaControls::postBuild()
 	mMediaAddress			= getChild<LLUICtrl>("media_address_url");
 	mMediaPlaySliderPanel	= getChild<LLUICtrl>("media_play_position");
 	mMediaPlaySliderCtrl	= getChild<LLUICtrl>("media_play_slider");
+	mSkipFwdCtrl			= getChild<LLUICtrl>("skip_forward");
+	mSkipBackCtrl			= getChild<LLUICtrl>("skip_back");
 	mVolumeCtrl				= getChild<LLUICtrl>("media_volume");
 	mVolumeBtn				= getChild<LLButton>("media_volume_button");
 	mVolumeUpCtrl			= getChild<LLUICtrl>("volume_up");
@@ -329,12 +333,17 @@ void LLPanelPrimMediaControls::updateShape()
 			mReloadCtrl->setVisible(FALSE);
 			mMediaStopCtrl->setVisible(has_focus);
 			mHomeCtrl->setVisible(FALSE);
-			mBackCtrl->setEnabled(has_focus);
-			mFwdCtrl->setEnabled(has_focus);
+			// No nav controls
+			mBackCtrl->setVisible(FALSE);
+			mFwdCtrl->setEnabled(FALSE);
 			mMediaAddressCtrl->setVisible(false);
 			mMediaAddressCtrl->setEnabled(false);
 			mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
 			mMediaPlaySliderPanel->setEnabled(has_focus && !mini_controls);
+			mSkipFwdCtrl->setVisible(has_focus && !mini_controls);
+			mSkipFwdCtrl->setEnabled(has_focus && !mini_controls);
+			mSkipBackCtrl->setVisible(has_focus && !mini_controls);
+			mSkipBackCtrl->setEnabled(has_focus && !mini_controls);
 				
 			mVolumeCtrl->setVisible(has_focus);
 			mVolumeUpCtrl->setVisible(has_focus);
@@ -435,6 +444,10 @@ void LLPanelPrimMediaControls::updateShape()
 			mMediaAddressCtrl->setEnabled(has_focus && !mini_controls);
 			mMediaPlaySliderPanel->setVisible(FALSE);
 			mMediaPlaySliderPanel->setEnabled(FALSE);
+			mSkipFwdCtrl->setVisible(FALSE);
+			mSkipFwdCtrl->setEnabled(FALSE);
+			mSkipBackCtrl->setVisible(FALSE);
+			mSkipBackCtrl->setEnabled(FALSE);
 				
 			mVolumeCtrl->setVisible(FALSE);
 			mVolumeUpCtrl->setVisible(FALSE);
@@ -789,7 +802,7 @@ void LLPanelPrimMediaControls::onClickForward()
 	focusOnTarget();
 
 	LLViewerMediaImpl* impl = getTargetMediaImpl();
-	
+
 	if (impl)
 	{
 		impl->navigateForward();
@@ -866,12 +879,39 @@ void LLPanelPrimMediaControls::onClickStop()
 	}
 }
 
+void LLPanelPrimMediaControls::onClickSkipBack()
+{
+	focusOnTarget();
+
+	LLViewerMediaImpl* impl =getTargetMediaImpl();
+	
+	if (impl)
+	{
+		// XXX Oddly, the impl has the policy that "skipping" is really navigating
+		impl->navigateBack();
+	}
+}
+
+void LLPanelPrimMediaControls::onClickSkipForward()
+{
+	focusOnTarget();
+
+	LLViewerMediaImpl* impl = getTargetMediaImpl();
+
+	if (impl)
+	{
+		// XXX Oddly, the impl has the policy that "skipping" is really navigating
+		impl->navigateForward();
+	}
+}
+
 void LLPanelPrimMediaControls::onClickZoom()
 {
 	focusOnTarget();
 
 	nextZoomLevel();
 }
+
 void LLPanelPrimMediaControls::nextZoomLevel()
 {
 	int index = 0;
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index 124fa9cce48..aeee3685ed6 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -95,6 +95,8 @@ class LLPanelPrimMediaControls : public LLPanel
 	void onClickPause();
 	void onClickStop();
 	void onClickZoom();
+	void onClickSkipBack();
+	void onClickSkipForward();
 	void onCommitURL();
 	
 	void updateZoom();
@@ -137,6 +139,8 @@ class LLPanelPrimMediaControls : public LLPanel
 	LLUICtrl *mHomeCtrl;
 	LLUICtrl *mUnzoomCtrl;
 	LLUICtrl *mOpenCtrl;
+	LLUICtrl *mSkipBackCtrl;
+	LLUICtrl *mSkipFwdCtrl;
 	LLUICtrl *mZoomCtrl;
 	LLPanel  *mMediaProgressPanel;
 	LLProgressBar *mMediaProgressBar;
diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
index 98025e28db8..00e31162170 100644
--- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
@@ -86,7 +86,7 @@
 		  auto_resize="false"
 		  height="22"
 		  layout="topleft"
-		  tool_tip="Step back"
+		  tool_tip="Navigate back"
 		  width="22"
 		  left="0"
 		  top_delta="4">
@@ -111,7 +111,7 @@
 		  hover_glow_amount="0.15"
 		  height="22"
 		  layout="topleft"
-		  tool_tip="Step forward"
+		  tool_tip="Navigate forward"
 		  top_delta="0"
 		  min_width="22"
 		  width="22">
@@ -359,6 +359,55 @@ function="MediaCtrl.CommitURL" />
 			function="MediaCtrl.JumpProgress" />
 	  </slider_bar>
 	</layout_panel>
+	<layout_panel
+		name="skip_back"
+		auto_resize="false"
+		user_resize="false"
+		layout="topleft"
+		min_width="22"
+		width="22">
+	  <button
+		  image_overlay="SkipBackward_Off"
+		  image_disabled="PushButton_Disabled"
+		  image_disabled_selected="PushButton_Disabled"
+		  image_selected="PushButton_Selected"
+		  image_unselected="PushButton_Off"
+		  hover_glow_amount="0.15"
+		  auto_resize="false"
+		  height="22"
+		  layout="topleft"
+		  tool_tip="Step back"
+		  top="-14"
+		  width="22"
+		  left="0">
+		<button.commit_callback
+			function="MediaCtrl.SkipBack" />
+	  </button>
+	</layout_panel>
+	<layout_panel
+		name="skip_forward"
+		auto_resize="false"
+		user_resize="false"
+		layout="topleft"
+		min_width="22"
+		width="22">
+	  <button
+		  image_overlay="SkipForward_Off"
+		  image_disabled="PushButton_Disabled"
+		  image_disabled_selected="PushButton_Disabled"
+		  image_selected="PushButton_Selected"
+		  image_unselected="PushButton_Off"
+		  hover_glow_amount="0.15"
+		  height="22"
+		  layout="topleft"
+		  tool_tip="Step forward"
+		  top="-14"
+		  min_width="22"
+		  width="22">
+		<button.commit_callback
+			function="MediaCtrl.SkipForward" />
+	  </button>
+	</layout_panel>
 	<layout_panel
 		name="media_volume"
 		auto_resize="false"
-- 
GitLab


From 496ad115b102111cb394c09663d9da579f07b606 Mon Sep 17 00:00:00 2001
From: angela <angela@lindenlab.com>
Date: Fri, 20 Nov 2009 09:47:47 +0800
Subject: [PATCH 466/557] Fix EXT-2645 Ensure link colors applied consistently
 to all text sources

---
 indra/llui/lltextbase.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index cd795282f91..e210667764b 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1505,6 +1505,7 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c
 
 			LLStyle::Params link_params = style_params;
 			link_params.color = match.getColor();
+			link_params.readonly_color =  match.getColor();
 			// apply font name from requested style_params
 			std::string font_name = LLFontGL::nameFromFont(style_params.font());
 			std::string font_size = LLFontGL::sizeFromFont(style_params.font());
-- 
GitLab


From a8b603f33ef71ab8afae66236579d41a09b2fce1 Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Thu, 19 Nov 2009 18:34:37 -0800
Subject: [PATCH 467/557] Push the policy that "back", "forward" and "stop" do
 different things out of LLViewerMedia.

Now, LLViewerMedia has explicit skipBack() and skipForward()
functions, and the buttons in LLPanelPrimMediaControls now map
onto those functions neatly.
---
 indra/newview/llpanelprimmediacontrols.cpp    | 21 ++++-
 indra/newview/llpanelprimmediacontrols.h      |  2 +
 indra/newview/llviewermedia.cpp               | 79 +++++++++----------
 indra/newview/llviewermedia.h                 |  2 +
 indra/newview/llviewerparcelmedia.cpp         |  5 +-
 .../xui/en/panel_prim_media_controls.xml      |  3 +-
 6 files changed, 63 insertions(+), 49 deletions(-)

diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 80d2a9425c8..aca0e1d5c7e 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -54,6 +54,7 @@
 #include "llpanelprimmediacontrols.h"
 #include "llpluginclassmedia.h"
 #include "llprogressbar.h"
+#include "llstring.h"
 #include "llviewercontrol.h"
 #include "llviewerparcelmgr.h"
 #include "llviewermedia.h"
@@ -92,6 +93,7 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
 	mCommitCallbackRegistrar.add("MediaCtrl.Forward",	boost::bind(&LLPanelPrimMediaControls::onClickForward, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.Home",		boost::bind(&LLPanelPrimMediaControls::onClickHome, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.Stop",		boost::bind(&LLPanelPrimMediaControls::onClickStop, this));
+	mCommitCallbackRegistrar.add("MediaCtrl.MediaStop",		boost::bind(&LLPanelPrimMediaControls::onClickMediaStop, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.Reload",	boost::bind(&LLPanelPrimMediaControls::onClickReload, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.Play",		boost::bind(&LLPanelPrimMediaControls::onClickPlay, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.Pause",		boost::bind(&LLPanelPrimMediaControls::onClickPause, this));
@@ -149,6 +151,7 @@ BOOL LLPanelPrimMediaControls::postBuild()
 	mLeftBookend			= getChild<LLUICtrl>("left_bookend");
 	mRightBookend			= getChild<LLUICtrl>("right_bookend");
 	mBackgroundImage		= LLUI::getUIImage(getString("control_background_image_name"));
+	LLStringUtil::convertToF32(getString("skip_step"), mSkipStep);
 
 	// These are currently removed...but getChild creates a "dummy" widget.
 	// This class handles them missing.
@@ -873,6 +876,18 @@ void LLPanelPrimMediaControls::onClickStop()
 
 	LLViewerMediaImpl* impl = getTargetMediaImpl();
 
+	if(impl)
+	{
+		impl->navigateStop();
+	}
+}
+
+void LLPanelPrimMediaControls::onClickMediaStop()
+{
+	focusOnTarget();
+
+	LLViewerMediaImpl* impl = getTargetMediaImpl();
+
 	if(impl)
 	{
 		impl->stop();
@@ -887,8 +902,7 @@ void LLPanelPrimMediaControls::onClickSkipBack()
 	
 	if (impl)
 	{
-		// XXX Oddly, the impl has the policy that "skipping" is really navigating
-		impl->navigateBack();
+		impl->skipBack(mSkipStep);
 	}
 }
 
@@ -900,8 +914,7 @@ void LLPanelPrimMediaControls::onClickSkipForward()
 
 	if (impl)
 	{
-		// XXX Oddly, the impl has the policy that "skipping" is really navigating
-		impl->navigateForward();
+		impl->skipForward(mSkipStep);
 	}
 }
 
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index aeee3685ed6..54fc4e343fc 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -97,6 +97,7 @@ class LLPanelPrimMediaControls : public LLPanel
 	void onClickZoom();
 	void onClickSkipBack();
 	void onClickSkipForward();
+	void onClickMediaStop();
 	void onCommitURL();
 	
 	void updateZoom();
@@ -158,6 +159,7 @@ class LLPanelPrimMediaControls : public LLPanel
 	LLUICtrl *mLeftBookend;
 	LLUICtrl *mRightBookend;
 	LLUIImage* mBackgroundImage;
+	F32 mSkipStep;
 	
 	LLUICtrl *mMediaPanelScroll;
 	LLButton *mScrollUpCtrl;
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 3a7c54479b3..e55523c11e2 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -278,7 +278,7 @@ viewer_media_t LLViewerMedia::newMediaImpl(
 	}
 	else
 	{
-		media_impl->stop();
+		media_impl->unload();
 		media_impl->mTextureId = texture_id;
 		media_impl->mMediaWidth = media_width;
 		media_impl->mMediaHeight = media_height;
@@ -1092,15 +1092,7 @@ void LLViewerMediaImpl::stop()
 {
 	if(mMediaSource)
 	{
-		if(mMediaSource->pluginSupportsMediaBrowser())
-		{
-			mMediaSource->browse_stop();
-		}
-		else
-		{
-			mMediaSource->stop();
-		}
-
+		mMediaSource->stop();
 		// destroyMediaSource();
 	}
 }
@@ -1132,6 +1124,40 @@ void LLViewerMediaImpl::seek(F32 time)
 	}
 }
 
+//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::skipBack(F32 step_scale)
+{
+	if(mMediaSource)
+	{
+		if(mMediaSource->pluginSupportsMediaTime())
+		{
+			F64 back_step = mMediaSource->getCurrentTime() - (mMediaSource->getDuration()*step_scale);
+			if(back_step < 0.0)
+			{
+				back_step = 0.0;
+			}
+			mMediaSource->seek(back_step);
+		}
+	}
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::skipForward(F32 step_scale)
+{
+	if(mMediaSource)
+	{
+		if(mMediaSource->pluginSupportsMediaTime())
+		{
+			F64 forward_step = mMediaSource->getCurrentTime() + (mMediaSource->getDuration()*step_scale);
+			if(forward_step > mMediaSource->getDuration())
+			{
+				forward_step = mMediaSource->getDuration();
+			}
+			mMediaSource->seek(forward_step);
+		}
+	}
+}
+
 //////////////////////////////////////////////////////////////////////////////////////////
 void LLViewerMediaImpl::setVolume(F32 volume)
 {
@@ -1339,21 +1365,7 @@ void LLViewerMediaImpl::navigateBack()
 {
 	if (mMediaSource)
 	{
-		if(mMediaSource->pluginSupportsMediaTime())
-		{
-			F64 step_scale = 0.02; // temp , can be changed
-			F64 back_step = mMediaSource->getCurrentTime() - (mMediaSource->getDuration()*step_scale);
-			if(back_step < 0.0)
-			{
-				back_step = 0.0;
-			}
-			mMediaSource->seek(back_step);
-			//mMediaSource->start(-2.0);
-		}
-		else
-		{
-			mMediaSource->browse_back();
-		}
+		mMediaSource->browse_back();
 	}
 }
 
@@ -1362,21 +1374,7 @@ void LLViewerMediaImpl::navigateForward()
 {
 	if (mMediaSource)
 	{
-		if(mMediaSource->pluginSupportsMediaTime())
-		{
-			F64 step_scale = 0.02; // temp , can be changed
-			F64 forward_step = mMediaSource->getCurrentTime() + (mMediaSource->getDuration()*step_scale);
-			if(forward_step > mMediaSource->getDuration())
-			{
-				forward_step = mMediaSource->getDuration();
-			}
-			mMediaSource->seek(forward_step);
-			//mMediaSource->start(2.0);
-		}
-		else
-		{
-			mMediaSource->browse_forward();
-		}
+		mMediaSource->browse_forward();
 	}
 }
 
@@ -1525,7 +1523,6 @@ void LLViewerMediaImpl::navigateStop()
 	{
 		mMediaSource->browse_stop();
 	}
-
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index f4afce6c4c9..ac12112ed41 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -149,6 +149,8 @@ class LLViewerMediaImpl
 	void pause();
 	void start();
 	void seek(F32 time);
+	void skipBack(F32 step_scale);
+	void skipForward(F32 step_scale);
 	void setVolume(F32 volume);
 	void updateVolume();
 	F32 getVolume();
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index 7559fd8e72c..cb2099b3b03 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -218,7 +218,7 @@ void LLViewerParcelMedia::play(LLParcel* parcel)
 			LL_DEBUGS("Media") << "new media impl with mime type " << mime_type << ", url " << media_url << LL_ENDL;
 
 			// Delete the old one first so they don't fight over the texture.
-			sMediaImpl->stop();
+			sMediaImpl->unload();
 
 			sMediaImpl = LLViewerMedia::newMediaImpl(
 				placeholder_texture_id,
@@ -261,8 +261,7 @@ void LLViewerParcelMedia::stop()
 	// We need to remove the media HUD if it is up.
 	LLViewerMediaFocus::getInstance()->clearFocus();
 
-	// This will kill the media instance.
-	sMediaImpl->stop();
+	// This will unload & kill the media instance.
 	sMediaImpl = NULL;
 }
 
diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
index 00e31162170..88049fe7d11 100644
--- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
@@ -8,6 +8,7 @@
 	mouse_opaque="false"
 	width="800">
   <string name="control_background_image_name">Inspector_Background</string>
+  <string name="skip_step">0.2</string>
   <panel
 	  name="media_region"
 	  bottom="125"
@@ -165,7 +166,7 @@
 		  min_width="22"
 		  width="22">
 		<button.commit_callback
-			function="MediaCtrl.Stop" />
+			function="MediaCtrl.MediaStop" />
 	  </button>
 	</layout_panel>
 	<layout_panel
-- 
GitLab


From f6b718b6afebe3059f5c44546819e264ac5133e0 Mon Sep 17 00:00:00 2001
From: Erica <erica@lindenlab.com>
Date: Thu, 19 Nov 2009 18:39:11 -0800
Subject: [PATCH 468/557] Group profile - widen lists and optimise for
 sidepanel EXT-2676

---
 .../default/xui/en/panel_group_general.xml    |  22 +-
 .../xui/en/panel_group_info_sidetray.xml      |  76 ++---
 .../default/xui/en/panel_group_land_money.xml | 136 +++++----
 .../default/xui/en/panel_group_notices.xml    |  54 ++--
 .../default/xui/en/panel_group_notify.xml     |  18 +-
 .../default/xui/en/panel_group_roles.xml      | 259 ++++++++----------
 .../newview/skins/default/xui/en/strings.xml  | 245 ++++++++---------
 7 files changed, 377 insertions(+), 433 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml
index 58a78a0ab85..4c30db4034b 100644
--- a/indra/newview/skins/default/xui/en/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_general.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  follows="all"
-     height="380"
+     height="378"
  label="General"
  class="panel_group_general"
  layout="topleft"
@@ -40,13 +40,13 @@ Hover your mouse over the options for more help.
      column_padding="0"
      draw_heading="true"
      follows="left|top"
-     heading_height="16"
+     heading_height="20"
      height="130"
      layout="topleft"
-     left="5"
+     left="0"
      name="visible_members"
      top_pad="2"
-     width="305">
+     width="310">
         <name_list.columns
          label="Member"
          name="name"
@@ -59,9 +59,9 @@ Hover your mouse over the options for more help.
          <text
          follows="left|top"
          type="string"
-         height="14"
+         height="12"
          layout="topleft"
-         left_delta="0"
+         left="5"
          name="active_title_label"
          top_pad="5"
          width="300">
@@ -75,7 +75,7 @@ Hover your mouse over the options for more help.
          name="active_title"
          tool_tip="Sets the title that appears in your avatar&apos;s name tag when this group is active."
          top_pad="2"
-         width="305" />
+         width="300" />
         <check_box
          height="16"
          font="SansSerifSmall"
@@ -101,12 +101,12 @@ Hover your mouse over the options for more help.
          border="true"
          bg_alpha_color="FloaterUnfocusBorderColor"
          follows="left|top"
-         height="93"
+         height="90"
          layout="topleft"
          left="5"
          name="preferences_container"
          top_pad="5"
-         width="305">
+         width="300">
         <check_box
          follows="right|top"
          height="16"
@@ -140,7 +140,7 @@ Hover your mouse over the options for more help.
          left_pad="2"
          name="spin_enrollment_fee"
          tool_tip="New members must pay this fee to join the group when Enrollment Fee is checked."
-         width="105" />
+         width="100" />
         <check_box
          height="16"
          initial_value="true"
@@ -157,7 +157,7 @@ Hover your mouse over the options for more help.
          left_delta="0"
          name="group_mature_check"
          tool_tip="Sets whether your group information is considered mature"
-         top_pad="5"
+         top_pad="2"
          width="190">
             <combo_box.item
              label="PG Content"
diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
index 0082128ca42..c0db734f8c1 100644
--- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
@@ -2,10 +2,10 @@
 <panel
 background_visible="true"
  follows="all"
- height="570"
+ height="635"
  label="Group Info"
  layout="topleft"
- min_height="425"
+ min_height="460"
  left="0"
  top="20"
  name="GroupInfo"
@@ -116,44 +116,43 @@ background_visible="true"
      visible="true"
      width="120" />
    <accordion
+           single_expansion="true"
              follows="all"
-             height="405"
+             height="478"
              layout="topleft"
              left="0"
              name="groups_accordion"
-             top_pad="15"
+             top_pad="10"
              width="323">
              <accordion_tab
-                 expanded="true"
-                 layout="topleft"
-                 name="group_general_tab"
-                 title="General">
+            expanded="false"
+            layout="topleft"
+            name="group_general_tab"
+            title="General">
             <panel
-            border="false"
-         class="panel_group_general" 
+             border="false"
+             class="panel_group_general"
              filename="panel_group_general.xml"
              layout="topleft"
              left="0"
              help_topic="group_general_tab"
              name="group_general_tab_panel"
-             top="0"
-             width="300" />
+             top="0" />
          </accordion_tab>
          <accordion_tab
-                 expanded="false"
-                 layout="topleft"
-                 name="group_roles_tab"
-                 title="Roles">
-                 <panel
-                 border="false"
-         class="panel_group_roles"
-                  filename="panel_group_roles.xml"
-                  layout="topleft"
-                  left="0"
-                  help_topic="group_roles_tab"
-         name="group_roles_tab_panel"
-                  top="0"
-             width="303" />
+            expanded="true"
+            layout="topleft"
+            name="group_roles_tab"
+            title="Roles">
+            <panel
+            border="false"
+            class="panel_group_roles"
+             filename="panel_group_roles.xml"
+             layout="topleft"
+             left="0"
+             help_topic="group_roles_tab"
+             name="group_roles_tab_panel"
+             top="0" />
          </accordion_tab>
          <accordion_tab
                  expanded="false"
@@ -168,8 +167,7 @@ background_visible="true"
          left="0"
          help_topic="group_notices_tab"
          name="group_notices_tab_panel"
-         top="0"
-         width="303" />
+         top="0" />
          </accordion_tab>
         <accordion_tab
                  expanded="false"
@@ -184,21 +182,25 @@ background_visible="true"
          left="0"
          help_topic="group_land_money_tab"
          name="group_land_tab_panel"
-         top="0"
-         width="300" />
+         top="0" />
          </accordion_tab>
          </accordion>
+   <panel
+   name="button_row"
+   height="23"
+   follows="bottom|left"
+   top_pad="-1"
+   width="323">
    <button
      follows="top|left"
      height="22"
      image_overlay="Refresh_Off"
      layout="topleft"
-     left="5"
+     left="10"
      name="btn_refresh"
-     top_pad="-15"
      width="23" />
-         <button
-     height="20"
+    <button
+     height="22"
      label="Create"
      label_selected="New group"
      name="btn_create"
@@ -214,12 +216,12 @@ background_visible="true"
      visible="false"
      width="65" />-->
      <button
-     height="20"
-     font="SansSerifSmall"
+     height="22"
      label="Save"
      label_selected="Save"
      name="btn_apply"
      left_pad="10"
      right="-10"
-     width="65" />
+     width="100" />
+     </panel>
 </panel>
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
index 2c649642c33..2075d7e05b5 100644
--- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
@@ -2,7 +2,7 @@
 <panel
  border="false"
  follows="all"
- height="510"
+ height="380"
  label="Land &amp; L$"
  layout="topleft"
  left="0"
@@ -11,7 +11,7 @@
  width="310">
     <panel.string
      name="help_text">
-        Parcels owned by a group are listed along with contribution details. A warning appears until the Total Land in Use is less than or = to the Total Contribution.
+   A warning appears until the Total Land in Use is less than or = to the Total Contribution.
     </panel.string>
     <panel.string
      name="cant_view_group_land_text">
@@ -43,14 +43,14 @@
     </text> -->
     <scroll_list
      draw_heading="true"
-     follows="top"
+     follows="top|left|right"
      heading_height="20"
-     height="150"
+     height="130"
      layout="topleft"
-     left="2"
+     left="0"
+     top="0"
      name="group_parcel_list"
-     top_pad="0"
-     width="305">
+     width="310">
         <scroll_list.columns
          label="Parcel"
          name="name"
@@ -72,34 +72,22 @@
          name="hidden"
          width="-1" />
     </scroll_list>
-    <button
-     follows="top"
-     height="23"
-     label="Map"
-     label_selected="Map"
-     layout="topleft"
-     name="map_button"
-     right="-5"
-     top_pad="5"
-     width="95"
-     enabled="false" />
     <text
      type="string"
      follows="left|top"
      halign="right"
-     height="16"
+     height="15"
      layout="topleft"
-     left="5"
+     left="0"
      name="total_contributed_land_label"
-     top_pad="0"
      width="130">
-        Total Contribution:
+        Total contribution:
     </text>
     <text
     text_color="EmphasisColor"
      type="string"
      follows="left|top"
-     height="16"
+     height="15"
      layout="topleft"
      left_pad="5"
      name="total_contributed_land_value"
@@ -107,23 +95,34 @@
      width="120">
         [AREA] m²
     </text>
+    <button
+     follows="top"
+     height="20"
+     label="Map"
+     label_selected="Map"
+     layout="topleft"
+     name="map_button"
+     right="-5"
+     left_pad="0"
+     width="95"
+     enabled="false" />
     <text
      type="string"
      follows="left|top"
      halign="right"
-     height="16"
+     height="15"
      layout="topleft"
-     left="5"
+     left="0"
      name="total_land_in_use_label"
      top_pad="0"
      width="130">
-        Total Land In Use:
+        Total land in use:
     </text>
     <text
     text_color="EmphasisColor"
      type="string"
      follows="left|top"
-     height="16"
+     height="15"
      layout="topleft"
      left_pad="5"
      name="total_land_in_use_value"
@@ -135,19 +134,19 @@
      type="string"
      follows="left|top"
      halign="right"
-     height="16"
+     height="15"
      layout="topleft"
-     left="5"
+     left="0"
      name="land_available_label"
      top_pad="0"
      width="130">
-        Land Available:
+        Land available:
     </text>
     <text
     text_color="EmphasisColor"
      type="string"
      follows="left|top"
-     height="16"
+     height="15"
      layout="topleft"
      left_pad="5"
      name="land_available_value"
@@ -159,17 +158,15 @@
      type="string"
      follows="left|top"
      halign="right"
-     height="16"
+     height="15"
      layout="topleft"
-     left="5"
+     left="0"
      name="your_contribution_label"
      top_pad="0"
      width="130">
-        Your Contribution:
+        Your contribution:
     </text>
     <line_editor
-     border_style="line"
-     border_thickness="1"
      follows="left|top"
      height="19"
      layout="topleft"
@@ -177,7 +174,7 @@
      max_length="10"
      name="your_contribution_line_editor"
      top_delta="0"
-     width="95" />
+     width="80" />
     <text
      type="string"
      follows="left|top"
@@ -194,7 +191,7 @@
      type="string"
      follows="left|top"
      halign="right"
-     height="16"
+     height="12"
      layout="topleft"
      left="140"
      name="your_contribution_max_value"
@@ -203,27 +200,27 @@
         ([AMOUNT] max)
     </text>
     <icon
-     height="16"
-     image_name="notify_next"
+     height="18"
+     image_name="BuyArrow_Over"
      layout="topleft"
-     left="9"
+     left="75"
      name="group_over_limit_icon"
      top_pad="0"
-     visible="false"
-     width="16" />
+     visible="true"
+     width="18" />
     <text
      follows="left|top"
      type="string"
      word_wrap="true"
      font="SansSerifSmall"
-     height="35"
+     height="20"
      layout="topleft"
-     left_pad="5"
+     left_pad="2"
      name="group_over_limit_text"
      text_color="EmphasisColor"
      top_delta="0"
-     width="260">
-        Group members must contribute more land credits to support land in use
+     width="213">
+        More land credits are needed to support land in use
     </text>
     <text
      type="string"
@@ -231,29 +228,29 @@
      font="SansSerifBig"
      height="16"
      layout="topleft"
-     left="10"
+     left="0"
      name="group_money_heading"
      text_color="EmphasisColor"
-     top_pad="0"
-     width="150">
+     top_pad="-15"
+     width="100">
         Group L$
     </text>
     <tab_container
      follows="all"
-     height="200"
+     height="173"
      halign="center"
      layout="topleft"
-     left="5"
+     left="0"
      name="group_money_tab_container"
      tab_position="top"
      tab_height="20"
      top_pad="2"
-     tab_min_width="70"
-     width="300">
+     tab_min_width="75"
+     width="310">
         <panel
          border="false"
          follows="all"
-         height="180"
+         height="173"
          label="PLANNING"
          layout="topleft"
          left="0"
@@ -264,7 +261,6 @@
             <text_editor
              type="string"
              follows="all"
-             font="SansSerif"
              height="140"
              layout="topleft"
              left="0"
@@ -279,13 +275,13 @@
       <panel
          border="false"
          follows="all"
-         height="180"
+         height="173"
          label="DETAILS"
          layout="topleft"
          left="0"
          help_topic="group_money_details_tab"
          name="group_money_details_tab"
-         top="5"
+         top="0"
          width="300">
           <text_editor
              type="string"
@@ -302,34 +298,34 @@
             </text_editor>
             <button
 	     follows="left|top"
-	     height="23"
+	     height="18"
 	     image_overlay="Arrow_Left_Off"
 	     layout="topleft"
 	     name="earlier_details_button"
 	     tool_tip="Back"
-	     top_pad="5"
              right="-45"
-	     width="31" />
+             bottom="0"
+	     width="25" />
              <button
 	     follows="left|top"
-	     height="23"
+	     height="18"
 	     image_overlay="Arrow_Right_Off"
 	     layout="topleft"
 	     left_pad="10"
        name="later_details_button"
 	     tool_tip="Next"
-	     width="31" />
+	     width="25" />
         </panel>
       <panel
          border="false"
          follows="all"
-         height="180"
+         height="173"
          label="SALES"
          layout="topleft"
          left_delta="0"
          help_topic="group_money_sales_tab"
          name="group_money_sales_tab"
-         top="5"
+         top="0"
          width="300">
             <text_editor
              type="string"
@@ -345,24 +341,24 @@
                 Loading...
             </text_editor>
                          <button
+             bottom="0"
 	     follows="left|top"
-	     height="23"
+	     height="18"
 	     image_overlay="Arrow_Left_Off"
 	     layout="topleft"
 	     name="earlier_sales_button"
 	     tool_tip="Back"
-	     top_pad="5"
          right="-45"
-	     width="31" />
+	     width="25" />
              <button
 	     follows="left|top"
-	     height="23"
+	     height="18"
 	     image_overlay="Arrow_Right_Off"
 	     layout="topleft"
 	     left_pad="10"
          name="later_sales_button"
 	     tool_tip="Next"
-	     width="31" />
+	     width="25" />
         </panel>
     </tab_container>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml
index e56db6414f9..0dea81eefe0 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  follows="all"
- height="485"
+ height="463"
  label="Notices"
  layout="topleft"
  left="0"
@@ -10,11 +10,10 @@
  width="310">
     <panel.string
      name="help_text">
-        Notices are a quick way to communicate across a 
-group by broadcasting a message and delivering 
+        Notices let you send a message and
 an optionally attached item. Notices only go to
-group members in Roles granted the ability to 
-receive Notices. You can turn off Notices on 
+group members in Roles with the ability to
+receive Notices. You can turn off Notices on
 the General tab.
     </panel.string>
     <panel.string
@@ -25,14 +24,15 @@ the General tab.
       follows="left|top"
      type="string"
      word_wrap="true"
-     height="30"
+     height="24"
+     halign="right"
      layout="topleft"
      left="5"
      name="lbl2"
      top="5"
      width="300">
      Notices are kept for 14 days
-Groups are limited to 200 notices/group daily
+Maximum 200 per group daily
     </text>
     <scroll_list
       follows="left|top"
@@ -44,7 +44,7 @@ Groups are limited to 200 notices/group daily
      left="2"
      name="notice_list"
      top_pad="0"
-     width="305">
+     width="300">
         <scroll_list.columns
          label=""
          name="icon"
@@ -52,15 +52,15 @@ Groups are limited to 200 notices/group daily
         <scroll_list.columns
          label="Subject"
          name="subject"
-         width="125" />
+         width="110" />
         <scroll_list.columns
          label="From"
          name="from"
-         width="90" />
+         width="100" />
         <scroll_list.columns
          label="Date"
          name="date"
-         width="30" />
+         width="60" />
         <scroll_list.columns
          name="sort"
          width="-1" />
@@ -84,7 +84,7 @@ Groups are limited to 200 notices/group daily
        left="5"
        name="create_new_notice"
        tool_tip="Create a new notice"
-     top_delta="0"
+     top_delta="-3"
        width="18" />
      <button
      follows="top|left"
@@ -97,14 +97,14 @@ Groups are limited to 200 notices/group daily
      width="23" />
     <panel
      follows="left|top"
-     height="300"
+     height="280"
      label="Create New Notice"
      layout="topleft"
      left="0"
-     top_pad="10"
-     visible="false"
+     top_pad="0"
+     visible="true"
      name="panel_create_new_notice"
-     width="303">
+     width="300">
         <text
          follows="left|top"
          type="string"
@@ -216,31 +216,31 @@ Groups are limited to 200 notices/group daily
          follows="left|top"
          height="23"
          label="Send"
-         label_selected="Send Notice"
+         label_selected="Send"
          layout="topleft"
          right="-10"
          top_pad="10"
          name="send_notice"
          width="100" />
       <group_drop_target
-         height="466"
-         top="0"
-         left="0"
+         height="95"
+         top="160"
+         left="10"
          layout="topleft"
          name="drop_target"
          tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice."
-         width="295" />
-   </panel> 
+         width="280" />
+   </panel>
     <panel
      follows="left|top"
-     height="300"
+     height="280"
      label="View Past Notice"
      layout="topleft"
      left="0"
-     visible="true"
+     visible="false"
      name="panel_view_past_notice"
      top="180"
-     width="303">
+     width="300">
         <text
          type="string"
          font="SansSerifBig"
@@ -303,7 +303,7 @@ Groups are limited to 200 notices/group daily
         </text>
         <text_editor
          enabled="false"
-         height="205"
+         height="160"
          layout="topleft"
          left="10"
          max_length="511"
@@ -319,7 +319,7 @@ Groups are limited to 200 notices/group daily
          max_length="63"
          mouse_opaque="false"
          name="view_inventory_name"
-         top_pad="10"
+         top_pad="8"
          width="285" />
         <icon
          height="16"
diff --git a/indra/newview/skins/default/xui/en/panel_group_notify.xml b/indra/newview/skins/default/xui/en/panel_group_notify.xml
index d22d58329c4..96b16d01333 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notify.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notify.xml
@@ -1,8 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  background_visible="true"
- bevel_style="in"
- bg_alpha_color="0 0 0 0"
  height="90"
  label="instant_message"
  layout="topleft"
@@ -21,8 +19,6 @@
      value="SANSSERIF" />
     <panel
      background_visible="true"
-     bevel_style="in"
-     bg_alpha_color="black"
      follows="top"
      height="30"
      label="header"
@@ -32,7 +28,7 @@
      top="0"
      width="305">
         <icon
-         follows="left|top|right|bottom"
+         follows="all"
          height="20"
          layout="topleft"
          left="5"
@@ -41,8 +37,8 @@
          top="5"
          width="20" />
         <text
-         follows="left|top|right|bottom"
-         font="SansSerifBigBold"
+         follows="all"
+         font="SansSerifBig"
          height="20"
          layout="topleft"
          left_pad="10"
@@ -56,7 +52,7 @@
     <text_editor
      allow_html="true"
      enabled="true"
-     follows="left|top|bottom|right"
+     follows="all"
      height="0"
      layout="topleft"
      left="25"
@@ -69,7 +65,7 @@
      type="string"
      use_ellipses="true"
      value="message"
-     width="270" 
+     width="270"
 	 word_wrap="true" >
     </text_editor>
     <icon
@@ -97,9 +93,9 @@
      bottom="85"
      follows="bottom"
      height="20"
-     label="OK"
+     label="Ok"
      layout="topleft"
-     left="25"
+     right="-10"
      name="btn_ok"
      width="70" />
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml
index 604fb81c8e7..cdbd861efca 100644
--- a/indra/newview/skins/default/xui/en/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
- border="false"
+ follows="all"
  height="552"
  label="Members &amp; Roles"
  layout="topleft"
@@ -14,26 +14,27 @@
     </panel.string>
     <panel.string
      name="want_apply_text">
-        Do you want to save these changes?
+        Do you want to save your changes?
     </panel.string>
     <panel.string
      name="help_text" />
     <tab_container
     border="false"
      follows="left|top"
-     height="245"
+     height="552"
      halign="center"
      layout="topleft"
-     left="5"
+     left="0"
      name="roles_tab_container"
      tab_position="top"
      tab_height="20"
      tab_min_width="75"
-     top="3"
-     width="300">
+     top="0"
+     width="310">
         <panel
          border="false"
-         height="220"
+         follows="all"
+         height="303"
          label="MEMBERS"
          layout="topleft"
          left="0"
@@ -41,7 +42,7 @@
          name="members_sub_tab"
          tool_tip="Members"
          class="panel_group_members_subtab"
-         width="300">
+         width="310">
             <panel.string
              name="help_text">
                 You can add or remove Roles assigned to Members.
@@ -50,11 +51,11 @@ clicking on their names.
             </panel.string>
          <filter_editor
          layout="topleft"
-         top="10"
+         top="5"
          left="5"
          width="280"
          height="20"
-         follows="left|top|right"
+         follows="top"
          max_length="250"
          label="Filter Members"
          name="filter_input" />
@@ -62,7 +63,7 @@ clicking on their names.
              column_padding="0"
              draw_heading="true"
              heading_height="20"
-             height="160"
+             height="240"
              follows="left|top"
              layout="topleft"
              left="0"
@@ -73,30 +74,26 @@ clicking on their names.
                 <name_list.columns
                  label="Member"
                  name="name"
-               relative_width="0.45" />
+               relative_width="0.44" />
                 <name_list.columns
-                 label="Donations"
+                 label="Donation"
                  name="donated"
-         relative_width="0.3" />
+         relative_width="0.25" />
                 <name_list.columns
-                 label="Online"
+                 label="Status"
                  name="online"
-         relative_width="0.2" />
+         relative_width="0.15" />
             </name_list>
             <button
              height="20"
-             font="SansSerifSmall"
+             follows="bottom|left"
              label="Invite"
-             layout="topleft"
              left="5"
              name="member_invite"
-             top_pad="3"
              width="100" />
             <button
              height="20"
-             font="SansSerifSmall"
              label="Eject"
-             layout="topleft"
              left_pad="5"
              right="-5"
              name="member_eject"
@@ -104,14 +101,23 @@ clicking on their names.
         </panel>
         <panel
          border="false"
-         height="220"
+         height="230"
          label="ROLES"
          layout="topleft"
          left="0"
          help_topic="roles_roles_tab"
          name="roles_sub_tab"
          class="panel_group_roles_subtab"
-         width="300">
+         width="310">
+           <!-- <button
+             enabled="false"
+             height="20"
+             label="Show All"
+             layout="topleft"
+             top="-65"
+             right="-5"
+             name="show_all_button"
+             width="100" />-->
             <panel.string
              name="help_text">
                 Roles have a title and an allowed list of Abilities
@@ -121,7 +127,7 @@ including the Everyone and Owner Roles.
             </panel.string>
             <panel.string
              name="cant_delete_role">
-                The &apos;Everyone&apos; and &apos;Owners&apos; Roles are special and cannot be deleted.
+                The &apos;Everyone&apos; and &apos;Owners&apos; Roles are special and can't be deleted.
             </panel.string>
             <panel.string
              name="power_folder_icon">
@@ -129,15 +135,15 @@ including the Everyone and Owner Roles.
             </panel.string>
             <panel.string
              name="power_all_have_icon">
-                checkbox_enabled_true.tga
+                Checkbox_On
             </panel.string>
             <panel.string
              name="power_partial_icon">
-                checkbox_enabled_false.tga
+                Checkbox_Off
             </panel.string>
          <filter_editor
          layout="topleft"
-         top="10"
+         top="5"
          left="5"
          width="280"
          height="20"
@@ -145,61 +151,48 @@ including the Everyone and Owner Roles.
          max_length="250"
          label="Filter Roles"
          name="filter_input" />
-            <!--
-            <button
-             enabled="false"
-             height="20"
-             label="Show All"
-             layout="topleft"
-             left_pad="0"
-             name="show_all_button"
-             top_delta="0"
-             width="80" /> -->
             <scroll_list
              column_padding="0"
              draw_heading="true"
              draw_stripes="false"
              follows="left|top"
              heading_height="20"
-             height="160"
+             height="170"
              layout="topleft"
              search_column="1"
              left="0"
              name="role_list"
              top_pad="2"
-             width="300">
+             width="310">
                 <scroll_list.columns
                  label="Role"
                  name="name"
-                 width="80" />
+               relative_width="0.45"  />
                 <scroll_list.columns
                  label="Title"
                  name="title"
-                 width="90" />
+               relative_width="0.45"  />
                 <scroll_list.columns
-                 label="Members"
+                 label="#"
                  name="members"
-                 width="95" />
+               relative_width="0.15"  />
             </scroll_list>
             <button
+            follows="bottom|left"
              height="20"
-             font="SansSerifSmall"
-             label="Add Role"
+             label="New Role"
              layout="topleft"
              left="5"
              name="role_create"
-             top_pad="6"
-             width="125" />
+             width="100" />
             <button
              height="20"
-             font="SansSerifSmall"
              label="Delete Role"
              layout="topleft"
              left_pad="5"
              right="-5"
              name="role_delete"
-             top_delta="0"
-             width="125" />
+             width="100" />
         </panel>
         <panel
          border="false"
@@ -211,7 +204,7 @@ including the Everyone and Owner Roles.
          name="actions_sub_tab"
          class="panel_group_actions_subtab"
          tool_tip="You can view an Ability&apos;s Description and which Roles and Members can execute the Ability."
-         width="300">
+         width="310">
             <panel.string
              name="help_text">
                 Abilities allow Members in Roles to do specific
@@ -219,7 +212,7 @@ things in this group. There&apos;s a broad variety of Abilities.
             </panel.string>
          <filter_editor
          layout="topleft"
-         top="10"
+         top="5"
          left="5"
          width="280"
          height="20"
@@ -231,74 +224,63 @@ things in this group. There&apos;s a broad variety of Abilities.
              column_padding="0"
              draw_stripes="false"
              follows="left|top"
-             height="160"
+             height="200"
              layout="topleft"
              left="0"
              multi_select="true"
              name="action_list"
              search_column="1"
              tool_tip="Select an Ability to view more details"
-             top_pad="2"
+             top_pad="5"
              width="300">
                 <scroll_list.columns
-                 label=""
-                 name="icon"
-                 width="16" />
-                <scroll_list.columns
-                 label="Action"
                  name="action"
-                 width="247" />
+                 width="300" />
             </scroll_list>
-            <icon
-             height="16"
-             image_name="Inv_FolderClosed"
-             layout="topleft"
-             name="power_folder_icon"
-             visible="false"
-             width="16" />
         </panel>
     </tab_container>
     <panel
      height="252"
      layout="topleft"
      follows="left|top"
-     left="10"
+     left="0"
      name="members_footer"
-     top="245"
+     top="300"
      top_delta="0"
-     width="290">
+     visible="false"
+     width="310">
         <text
          type="string"
-         height="16"
+         height="14"
          layout="topleft"
          follows="left|top"
          left="0"
          name="static"
          top_pad="5"
-         width="285">
+         width="300">
             Assigned Roles
         </text>
         <scroll_list
-         draw_stripes="false"
+         draw_stripes="true"
          follows="left|top"
-         height="80"
+         height="90"
          layout="topleft"
          left="0"
          name="member_assigned_roles"
          top_pad="0"
-         width="285">
+         width="300">
             <scroll_list.columns
              label=""
              name="checkbox"
-             width="30" />
+             width="20" />
             <scroll_list.columns
              label=""
              name="role"
-             width="255" />
+             width="270" />
         </scroll_list>
                  <text
          type="string"
-         height="16"
+         height="14"
          layout="topleft"
          follows="left|top"
          left="0"
@@ -308,48 +290,42 @@ things in this group. There&apos;s a broad variety of Abilities.
             Allowed Abilities
         </text>
          <scroll_list
-         draw_stripes="false"
-         height="80"
+         draw_stripes="true"
+         height="90"
          layout="topleft"
          left="0"
          name="member_allowed_actions"
          search_column="2"
          tool_tip="For details of each allowed ability see the abilities tab"
          top_pad="0"
-         width="285">
-            <scroll_list.columns
-             label=""
-             name="icon"
-             width="20" />
+         width="300">
             <scroll_list.columns
              label=""
              name="action"
-             width="265" />
+             width="300" />
         </scroll_list>
     </panel>
     <panel
      height="297"
      layout="topleft"
-     left="10"
+     left="0"
      name="roles_footer"
      top_delta="0"
-     top="245"
+     top="220"
      visible="false"
-     width="290">
+     width="310">
         <text
          type="string"
-         height="16"
+         height="14"
          layout="topleft"
          left="0"
          name="static"
          top="0"
-         width="140">
-            Name
+         width="300">
+           Role Name
         </text>
         <line_editor
          type="string"
-         border_style="line"
-         border_thickness="1"
          follows="left|top"
          height="20"
          layout="topleft"
@@ -357,106 +333,97 @@ things in this group. There&apos;s a broad variety of Abilities.
          max_length="295"
          name="role_name"
          top_pad="0"
-         width="290">
-            Employees
+         width="300">
         </line_editor>
         <text
          type="string"
-         height="16"
+         height="14"
          layout="topleft"
          name="static3"
          top_pad="5"
-         width="290">
-            Title
+         width="300">
+           Role Title
         </text>
         <line_editor
          type="string"
-         border_style="line"
-         border_thickness="1"
          follows="left|top"
          height="20"
          layout="topleft"
          max_length="295"
          name="role_title"
          top_pad="0"
-         width="290">
-          (waiting)
+         width="300">
         </line_editor>
                 <text
          type="string"
-         height="16"
+         height="14"
          layout="topleft"
          left="0"
          name="static2"
          top_pad="5"
-         width="100">
+         width="200">
             Description
         </text>
         <text_editor
          type="string"
          halign="left"
-         height="35"
+         height="50"
          layout="topleft"
          left="0"
          max_length="295"
          name="role_description"
          top_pad="0"
-         width="295"
+         width="300"
          word_wrap="true">
-          (waiting)
         </text_editor>
         <text
          type="string"
-         height="16"
+         height="14"
          layout="topleft"
          follows="left|top"
          left="0"
          name="static4"
          top_pad="5"
-         width="290">
-            Assigned Roles
+         width="300">
+            Assigned Members
         </text>
         <name_list
-         draw_stripes="false"
-         height="50"
+         draw_stripes="true"
+         height="60"
          layout="topleft"
          left="0"
          name="role_assigned_members"
          top_pad="0"
-         width="290" />
+         width="300" />
         <check_box
          height="15"
          label="Reveal members"
          layout="topleft"
          name="role_visible_in_list"
          tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group."
-         top_pad="3"
-         width="290" />
+         top_pad="4"
+         width="300" />
          <text
          type="string"
-         height="16"
+         height="13"
          layout="topleft"
          follows="left|top"
          left="0"
          name="static5"
          top_pad="5"
-         width="290">
+         width="300">
             Allowed Abilities
         </text>
         <scroll_list
-         draw_stripes="false"
-         height="50"
+         draw_stripes="true"
+         height="60"
          layout="topleft"
          left="0"
          name="role_allowed_actions"
          search_column="2"
          tool_tip="For details of each allowed ability see the abilities tab"
          top_pad="0"
-         width="295">
-            <scroll_list.columns
-             label=""
-             name="icon"
-             width="20" />
+         width="300">
             <scroll_list.columns
              label=""
              name="checkbox"
@@ -464,33 +431,27 @@ things in this group. There&apos;s a broad variety of Abilities.
             <scroll_list.columns
              label=""
              name="action"
-             width="250" />
+             width="270" />
         </scroll_list>
     </panel>
    <panel
      height="303"
      layout="topleft"
-     left="10"
+     left="0"
      name="actions_footer"
      top_delta="0"
-     top="245"
+     top="255"
      visible="false"
-     width="290">
-        <text
-         type="string"
-         height="16"
-         layout="topleft"
-         name="static"
-         width="200">
-            Ability description
-        </text>
+     width="310">
         <text_editor
+       bg_readonly_color="Transparent"
+       text_readonly_color="EmphasisColor"
+       font="SansSerifSmall"
          type="string"
          enabled="false"
          halign="left"
-         height="80"
+         height="90"
          layout="topleft"
-         left_delta="0"
          max_length="512"
          name="action_description"
          top_pad="0"
@@ -500,28 +461,28 @@ things in this group. There&apos;s a broad variety of Abilities.
         </text_editor>
         <text
          type="string"
-         height="16"
+         height="14"
          layout="topleft"
-         left_delta="0"
+         left="5"
          name="static2"
          top_pad="5"
-         width="295">
+         width="300">
             Roles with this ability
         </text>
         <scroll_list
-         height="60"
+         height="65"
          layout="topleft"
-         left="0"
+         left="5"
          name="action_roles"
          top_pad="0"
-         width="295" />
-                 <text
+         width="300" />
+        <text
          type="string"
-         height="16"
+         height="14"
          layout="topleft"
          name="static3"
          top_pad="5"
-         width="290">
+         width="300">
             Members with this ability
         </text>
         <name_list
@@ -529,6 +490,6 @@ things in this group. There&apos;s a broad variety of Abilities.
          layout="topleft"
          name="action_members"
          top_pad="0"
-         width="290" />
+         width="300" />
     </panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index e76763d7ebc..9238b88d9b3 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <!-- This file contains strings that used to be hardcoded in the source.
      It is only for those strings which do not belong in a floater.
-     For example, the strings used in avatar chat bubbles, and strings 
+     For example, the strings used in avatar chat bubbles, and strings
      that are returned from one component and may appear in many places-->
 <strings>
 
@@ -44,8 +44,8 @@
 
 	<!-- Disconnection -->
 	<string name="AgentLostConnection">This region may be experiencing trouble.  Please check your connection to the Internet.</string>
-	
-	
+
+
 	<!-- Tooltip, lltooltipview.cpp -->
 	<string name="TooltipPerson">Person</string><!-- Object under mouse pointer is an avatar -->
 	<string name="TooltipNoName">(no name)</string> <!-- No name on an object -->
@@ -80,11 +80,11 @@
 	<!-- text for SLURL labels -->
 	<string name="SLurlLabelTeleport">Teleport to</string>
 	<string name="SLurlLabelShowOnMap">Show Map for</string>
-	
+
 	<!-- ButtonToolTips, llfloater.cpp -->
 	<string name="BUTTON_CLOSE_DARWIN">Close (&#8984;W)</string>
 	<string name="BUTTON_CLOSE_WIN">Close (Ctrl+W)</string>
-	<string name="BUTTON_RESTORE">Restore</string>			
+	<string name="BUTTON_RESTORE">Restore</string>
 	<string name="BUTTON_MINIMIZE">Minimize</string>
 	<string name="BUTTON_TEAR_OFF">Tear Off</string>
 	<string name="BUTTON_DOCK">Dock</string>
@@ -103,24 +103,24 @@
 
 	<!-- Indicates something is being loaded. Maybe should be merged with RetrievingData -->
 	<string name="LoadingData">Loading...</string>
-	
-	
+
+
 	<!-- namecache -->
 	<!-- Avatar name: text shown for LLUUID::null -->
 	<string name="AvatarNameNobody">(nobody)</string>
-	
+
 	<!-- Avatar name: text shown while fetching name -->
 	<string name="AvatarNameWaiting">(waiting)</string>
 
   <!-- Avatar name: More than one avatar is selected/used here -->
   <string name="AvatarNameMultiple">(multiple)</string>
-  
+
   <!-- Avatar name: text shown as an alternative to AvatarNameFetching, easter egg. -->
 	<string name="AvatarNameHippos">(hippos)</string>
-	
+
 	<!-- Group name: text shown for LLUUID::null -->
 	<string name="GroupNameNone">(none)</string>
-	
+
 	<!-- Asset errors. Used in llassetstorage.cpp, translation from error code to error message. -->
 	<string name="AssetErrorNone">No error</string>
 	<string name="AssetErrorRequestFailed">Asset request: failed</string>
@@ -133,7 +133,7 @@
 	<string name="AssetErrorCircuitGone">Circuit gone</string>
 	<string name="AssetErrorPriceMismatch">Viewer and server do not agree on price</string>
 	<string name="AssetErrorUnknownStatus">Unknown status</string>
-	
+
 	<!-- Asset Type human readable names:  these will replace variable [TYPE] in notification FailedToFindWearable* -->
 	<string name="texture">texture</string>
 	<string name="sound">sound</string>
@@ -159,7 +159,7 @@
 	<string name="simstate">simstate</string>
 	<string name="favorite">favorite</string>
 	<string name="symbolic link">link</string>
-	
+
 	<!-- llvoavatar. Displayed in the avatar chat bubble -->
 	<string name="AvatarEditingAppearance">(Editing Appearance)</string>
 	<string name="AvatarAway">Away</string>
@@ -236,17 +236,17 @@
 	<string name="anim_express_worry">Worry</string>
 	<string name="anim_yes_happy">Yes (Happy)</string>
 	<string name="anim_yes_head">Yes</string>
-	
+
 	<!-- world map -->
 	<string name="texture_loading">Loading...</string>
 	<string name="worldmap_offline">Offline</string>
 	<string name="worldmap_results_none_found">None found.</string>
-	
+
 	<!-- animations uploading status codes -->
 	<string name="Ok">OK</string>
 	<string name="Premature end of file">Premature end of file</string>
 	<string name="ST_NO_JOINT">Can't find ROOT or JOINT.</string>
-	
+
 	<!-- Chat -->
 	<string name="whisper">whispers:</string>
 	<string name="shout">shouts:</string>
@@ -274,7 +274,7 @@
 	<string name="SIM_ACCESS_ADULT">Adult</string>
 	<string name="SIM_ACCESS_DOWN">Offline</string>
 	<string name="SIM_ACCESS_MIN">Unknown</string>
-	
+
 	<!-- For use when we do not have land type back from the server -->
 	<string name="land_type_unknown">(unknown)</string>
 
@@ -294,14 +294,14 @@
 	<string name="compressed_image_files">Compressed Images</string>
 	<string name="load_files">Load Files</string>
 	<string name="choose_the_directory">Choose Directory</string>
-	
+
 	<!-- LSL Usage Hover Tips -->
 	<!-- NOTE: For now these are set as translate="false", until DEV-40761 is implemented (to internationalize the rest of tooltips in the same window).
              This has no effect on viewer code, but prevents Linden Lab internal localization tool from scraping these strings.  -->
 	<string name="LSLTipSleepTime" translate="false">
 Sleeps script for [SLEEP_TIME] seconds.
 	</string>
-	
+
 	<string name="LSLTipText_llSin" translate="false">
 float llSin(float theta)
 Returns the sine of theta (theta in radians)
@@ -1732,7 +1732,7 @@ Returns the value for header for request_id
 	</string>
   <string name="LSLTipText_llSetPrimMediaParams" translate="false">
 llSetPrimMediaParams(integer face, list params)
-Sets the media params for a particular face on an object. If media is not already on this object, add it. 
+Sets the media params for a particular face on an object. If media is not already on this object, add it.
 List is a set of name/value pairs in no particular order.  Params not specified are unchanged, or if new media is added then set to the default specified.
 The possible names are below, along with the types of values and what they mean.
   </string>
@@ -1751,7 +1751,7 @@ Clears (deletes) the media and all params from the given face.
 	<string name="AvatarSetAway">Away</string>
 	<string name="AvatarSetNotBusy">Not Busy</string>
 	<string name="AvatarSetBusy">Busy</string>
-	
+
 	<!-- Wearable Types -->
 	<string name="shape">Shape</string>
 	<string name="skin">Skin</string>
@@ -1769,7 +1769,7 @@ Clears (deletes) the media and all params from the given face.
 	<string name="alpha">Alpha</string>
 	<string name="tattoo">Tattoo</string>
 	<string name="invalid">invalid</string>
-	
+
 	<!-- notify -->
 	<string name="next">Next</string>
 	<string name="ok">OK</string>
@@ -1786,8 +1786,8 @@ Clears (deletes) the media and all params from the given face.
   <string name="StartUpNotifications">%d new notifications arrived while you were away...</string>
   <!-- overflow toast's string-->
   <string name="OverflowInfoChannelString">You have %d more notification</string>
-  
-  
+
+
 	<!-- body parts -->
 	<string name="BodyPartsRightArm">Right Arm</string>
 	<string name="BodyPartsHead">Head</string>
@@ -1800,10 +1800,10 @@ Clears (deletes) the media and all params from the given face.
 	<string name="GraphicsQualityLow">Low</string>
 	<string name="GraphicsQualityMid">Mid</string>
 	<string name="GraphicsQualityHigh">High</string>
-	
+
 	<!-- mouselook -->
 	<string name="LeaveMouselook">Press ESC to return to World View</string>
-	
+
 	<!-- inventory -->
 	<string name="InventoryNoMatchingItems">No matching items found in inventory.</string>
 	<string name="InventoryNoTexture">
@@ -1831,7 +1831,7 @@ this texture in your inventory
 	<string name="Wave"          value=" Wave " />
 	<string name="HelloAvatar"   value=" Hello, avatar! " />
 	<string name="ViewAllGestures"  value="  View All &gt;&gt;" />
-				
+
 	<!-- inventory filter -->
     <!-- use value="" because they have preceding spaces -->
 	<string name="Animations"    value=" Animations," />
@@ -1881,21 +1881,21 @@ this texture in your inventory
 	<!-- inventory FVBridge -->
 	<string name="Buy">Buy</string>
 	<string name="BuyforL$">Buy for L$</string>
-	
+
 	<string name="Stone">Stone</string>
 	<string name="Metal">Metal</string>
 	<string name="Glass">Glass</string>
 	<string name="Wood">Wood</string>
 	<string name="Flesh">Flesh</string>
 	<string name="Plastic">Plastic</string>
-	<string name="Rubber">Rubber</string>	
+	<string name="Rubber">Rubber</string>
 	<string name="Light">Light</string>
-	
+
 	<!-- keyboard -->
 	<string name="KBShift">Shift</string>
 	<string name="KBCtrl">Ctrl</string>
 
-	<!-- Avatar Skeleton --> 
+	<!-- Avatar Skeleton -->
 	<string name="Chest">Chest</string>
 	<string name="Skull">Skull</string>
 	<string name="Left Shoulder">Left Shoulder</string>
@@ -1925,7 +1925,7 @@ this texture in your inventory
 	<string name="L Lower Leg">L Lower Leg</string>
 	<string name="Stomach">Stomach</string>
 	<string name="Left Pec">Left Pec</string>
-	<string name="Right Pec">Right Pec</string>	
+	<string name="Right Pec">Right Pec</string>
 
   <!-- Avatar age computation, see LLDateUtil::ageFromDate -->
   <string name="YearsMonthsOld">[AGEYEARS] [AGEMONTHS] old</string>
@@ -1934,7 +1934,7 @@ this texture in your inventory
   <string name="WeeksOld">[AGEWEEKS] old</string>
   <string name="DaysOld">[AGEDAYS] old</string>
   <string name="TodayOld">Joined today</string>
-  
+
   <!-- AgeYearsA = singular,
        AgeYearsB = plural,
        AgeYearsC = plural for non-English languages like Russian
@@ -1967,16 +1967,16 @@ this texture in your inventory
   <string name="NoPaymentInfoOnFile">No Payment Info On File</string>
   <string name="AgeVerified">Age-verified</string>
   <string name="NotAgeVerified">Not Age-verified</string>
-  
-  <!-- HUD Position --> 
-	<string name="Center 2">Center 2</string>	
-	<string name="Top Right">Top Right</string>	
-	<string name="Top">Top</string>	
-	<string name="Top Left">Top Left</string>	
-	<string name="Center">Center</string>	
-	<string name="Bottom Left">Bottom Left</string>	
-	<string name="Bottom">Bottom</string>		
-	<string name="Bottom Right">Bottom Right</string>							
+
+  <!-- HUD Position -->
+	<string name="Center 2">Center 2</string>
+	<string name="Top Right">Top Right</string>
+	<string name="Top">Top</string>
+	<string name="Top Left">Top Left</string>
+	<string name="Center">Center</string>
+	<string name="Bottom Left">Bottom Left</string>
+	<string name="Bottom">Bottom</string>
+	<string name="Bottom Right">Bottom Right</string>
 
 	<!-- compile queue-->
 	<string name="CompileQueueDownloadedCompiling">Downloaded, now compiling</string>
@@ -1998,11 +1998,11 @@ this texture in your inventory
 	<string name="CompileSuccessful">Compile successful!</string>
 	<string name="CompileSuccessfulSaving">Compile successful, saving...</string>
 	<string name="SaveComplete">Save complete.</string>
-	<string name="ObjectOutOfRange">Script (object out of range)</string>    
-	
+	<string name="ObjectOutOfRange">Script (object out of range)</string>
+
 	<!-- god tools -->
 	<string name="GodToolsObjectOwnedBy">Object [OBJECT] owned by [OWNER]</string>
-	
+
 	<!-- groups -->
 	<string name="GroupsNone">none</string>
   <string name="Group" value=" (group)" />
@@ -2013,14 +2013,14 @@ this texture in your inventory
 	<string name="Balance">Balance</string>
 	<string name="Credits">Credits</string>
 	<string name="Debits">Debits</string>
-	<string name="Total">Total</string>	
-	<string name="NoGroupDataFound">No group data found for group </string>	
-		
+	<string name="Total">Total</string>
+	<string name="NoGroupDataFound">No group data found for group </string>
+
 	<!-- floater IM -->
 	<string name="IMParentEstate">parent estate</string>
 	<string name="IMMainland">mainland</string>
 	<string name="IMTeen">teen</string>
-	
+
 	<!-- floater region info -->
 	<!-- The following will replace variable [ALL_ESTATES] in notifications EstateAllowed*, EstateBanned*, EstateManager* -->
 	<string name="RegionInfoError">error</string>
@@ -2036,45 +2036,37 @@ this texture in your inventory
 
 	<!-- script editor -->
 	<string name="CursorPos">Line [LINE], Column [COLUMN]</string>
-	
+
 	<!-- panel dir browser -->
 	<string name="PanelDirCountFound">[COUNT] found</string>
 	<string name="PanelDirTimeStr">[hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt]</string>
 
 	<!-- panel dir events -->
 	<string name="PanelDirEventsDateText">[mthnum,datetime,slt]/[day,datetime,slt]</string>
-	
+
 	<!-- panel contents -->
 	<string name="PanelContentsNewScript">New Script</string>
-	
+
 	<!-- Mute -->
 	<string name="MuteByName">(by name)</string>
 	<string name="MuteAgent">(resident)</string>
 	<string name="MuteObject">(object)</string>
 	<string name="MuteGroup">(group)</string>
-	
+
 	<!-- Region/Estate Covenant -->
 	<string name="RegionNoCovenant">There is no Covenant provided for this Estate.</string>
 	<string name="RegionNoCovenantOtherOwner">There is no Covenant provided for this Estate. The land on this estate is being sold by the Estate owner, not Linden Lab.  Please contact the Estate Owner for sales details.</string>
 	<string name="covenant_last_modified">Last Modified:</string>
 	<string name="none_text"  value=" (none) " />
 	<string name="never_text" value=" (never) " />
-	
+
 	<!--Region Details-->
 	<string name="GroupOwned">Group Owned</string>
 	<string name="Public">Public</string>
-	
+
 	<!-- panel classified -->
 	<string name="ClassifiedClicksTxt">Clicks: [TELEPORT] teleport, [MAP] map, [PROFILE] profile</string>
 	<string name="ClassifiedUpdateAfterPublish">(will update after publish)</string>
-	
-	<!-- group voting dialog -->
-	<string name="GroupVoteYes">Yes</string>
-	<string name="GroupVoteNo">No</string>
-	<string name="GroupVoteNoActiveProposals">There are currently no active proposals</string>
-	<string name="GroupVoteNoArchivedProposals">There are currently no archived proposals</string>
-	<string name="GroupVoteRetrievingArchivedProposals">Retrieving archived proposals</string>
-	<string name="GroupVoteRetrievingActiveProposals">Retrieving active proposals</string>
 
 	<!-- Multi Preview Floater -->
 	<string name="MultiPreviewTitle">Preview</string>
@@ -2089,7 +2081,7 @@ this texture in your inventory
 	<string name="InvOfferGaveYou">gave you</string>
 	<string name="InvOfferYouDecline">You decline</string>
 	<string name="InvOfferFrom">from</string>
-	
+
 	<!-- group money -->
 	<string name="GroupMoneyTotal">Total</string>
 	<string name="GroupMoneyBought">bought</string>
@@ -2101,21 +2093,21 @@ this texture in your inventory
 	<string name="GroupMoneyBalance">Balance</string>
 	<string name="GroupMoneyCredits">Credits</string>
 	<string name="GroupMoneyDebits">Debits</string>
-	
+
 	<!-- viewer object -->
 	<string name="ViewerObjectContents">Contents</string>
-	
+
 	<!-- Viewer menu -->
 	<string name="AcquiredItems">Acquired Items</string>
-	<string name="Cancel">Cancel</string>	
-	<string name="UploadingCosts">Uploading %s costs</string>	
+	<string name="Cancel">Cancel</string>
+	<string name="UploadingCosts">Uploading %s costs</string>
 	<string name="UnknownFileExtension">
 		Unknown file extension .%s
 Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
-	</string>		
-	<string name="AddLandmarkNavBarMenu">Add Landmark...</string>	 
+	</string>
+	<string name="AddLandmarkNavBarMenu">Add Landmark...</string>
 	<string name="EditLandmarkNavBarMenu">Edit Landmark...</string>
-	
+
 	<!-- menu accelerators -->
 	<string name="accel-mac-control">&#8963;</string>
 	<string name="accel-mac-command">&#8984;</string>
@@ -2126,72 +2118,72 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
 	<string name="accel-win-shift">Shift+</string>
 
 	<!-- Previews -->
-	<string name="FileSaved">File Saved</string>	
-	<string name="Receiving">Receiving</string>	
-		
+	<string name="FileSaved">File Saved</string>
+	<string name="Receiving">Receiving</string>
+
 	<!-- status bar , Time -->
-	<string name="AM">AM</string>	
-	<string name="PM">PM</string>	
-	<string name="PST">PST</string>	
-	<string name="PDT">PDT</string>			
+	<string name="AM">AM</string>
+	<string name="PM">PM</string>
+	<string name="PST">PST</string>
+	<string name="PDT">PDT</string>
 
 	<!-- Directions, HUD -->
-	<string name="Forward">Forward</string>	
-	<string name="Left">Left</string>	
-	<string name="Right">Right</string>	
-	<string name="Back">Back</string>			
-	<string name="North">North</string>	
-	<string name="South">South</string>	
-	<string name="West">West</string>	
-	<string name="East">East</string>		
-	<string name="Up">Up</string>	
-	<string name="Down">Down</string>	
+	<string name="Forward">Forward</string>
+	<string name="Left">Left</string>
+	<string name="Right">Right</string>
+	<string name="Back">Back</string>
+	<string name="North">North</string>
+	<string name="South">South</string>
+	<string name="West">West</string>
+	<string name="East">East</string>
+	<string name="Up">Up</string>
+	<string name="Down">Down</string>
 
     <!-- Search Category Strings -->
-	<string name="Any Category">Any Category</string>	
-	<string name="Shopping">Shopping</string>	
-	<string name="Land Rental">Land Rental</string>	
-	<string name="Property Rental">Property Rental</string>	
-	<string name="Special Attraction">Special Attraction</string>	
-	<string name="New Products">New Products</string>	
-	<string name="Employment">Employment</string>	
-	<string name="Wanted">Wanted</string>	
-	<string name="Service">Service</string>	
-	<string name="Personal">Personal</string>	
+	<string name="Any Category">Any Category</string>
+	<string name="Shopping">Shopping</string>
+	<string name="Land Rental">Land Rental</string>
+	<string name="Property Rental">Property Rental</string>
+	<string name="Special Attraction">Special Attraction</string>
+	<string name="New Products">New Products</string>
+	<string name="Employment">Employment</string>
+	<string name="Wanted">Wanted</string>
+	<string name="Service">Service</string>
+	<string name="Personal">Personal</string>
 
 	<!-- PARCEL_CATEGORY_UI_STRING -->
-	<string name="None">None</string>	
-	<string name="Linden Location">Linden Location</string>	
-	<string name="Adult">Adult</string>	
-	<string name="Arts&amp;Culture">Arts &amp; Culture</string>			
-	<string name="Business">Business</string>	
-	<string name="Educational">Educational</string>	
-	<string name="Gaming">Gaming</string>	
-	<string name="Hangout">Hangout</string>		
-	<string name="Newcomer Friendly">Newcomer Friendly</string>	
+	<string name="None">None</string>
+	<string name="Linden Location">Linden Location</string>
+	<string name="Adult">Adult</string>
+	<string name="Arts&amp;Culture">Arts &amp; Culture</string>
+	<string name="Business">Business</string>
+	<string name="Educational">Educational</string>
+	<string name="Gaming">Gaming</string>
+	<string name="Hangout">Hangout</string>
+	<string name="Newcomer Friendly">Newcomer Friendly</string>
 	<string name="Parks&amp;Nature">Parks &amp; Nature</string>
-	<string name="Residential">Residential</string>	
+	<string name="Residential">Residential</string>
 	<!--<string name="Shopping">Shopping</string>	-->
-	<string name="Stage">Stage</string>	
-	<string name="Other">Other</string>	
-	<string name="Any">Any</string>	
-	<string name="You">You</string>							
-						
+	<string name="Stage">Stage</string>
+	<string name="Other">Other</string>
+	<string name="Any">Any</string>
+	<string name="You">You</string>
+
 	<!-- punctuations -->
-	<string name=":">:</string>			
-	<string name=",">,</string>					
-	<string name="...">...</string>					
-	<string name="***">***</string>					
-	<string name="(">(</string>					
+	<string name=":">:</string>
+	<string name=",">,</string>
+	<string name="...">...</string>
+	<string name="***">***</string>
+	<string name="(">(</string>
 	<string name=")">)</string>
-	<string name=".">.</string>		
-	<string name="'">'</string>	
-	<string name="---">---</string>										
+	<string name=".">.</string>
+	<string name="'">'</string>
+	<string name="---">---</string>
 
 	<!-- media -->
 	<string name="Multiple Media">Multiple Media</string>
 	<string name="Play Media">Play/Pause Media</string>
-	
+
 	<!-- OSMessageBox messages -->
 	<string name="MBCmdLineError">
 		An error was found parsing the command line.
@@ -2800,13 +2792,13 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Wide Lips">Wide Lips</string>
 <string name="Wild">Wild</string>
 <string name="Wrinkles">Wrinkles</string>
-  
+
   <!-- Favorites Bar -->
   <string name="LocationCtrlAddLandmarkTooltip">Add to My Landmarks</string>
   <string name="LocationCtrlEditLandmarkTooltip">Edit My Landmark</string>
   <string name="LocationCtrlInfoBtnTooltip">See more info about the current location</string>
   <string name="LocationCtrlComboBtnTooltip">My location history</string>
-  
+
   <!-- Strings used by the (currently Linux) auto-updater app -->
 	<string name="UpdaterWindowTitle">
 	  [APP_NAME] Update
@@ -2868,9 +2860,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
   <string name="inventory_item_offered-im">
     Inventory item offered
   </string>
-  <string name="share_alert">
-    Drag items from inventory here
-  </string>
 
   <string name="only_user_message">
     You are the only user in this session.
-- 
GitLab


From ba2e9f4495b2423e5a03a2136762a539c532710a Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Fri, 20 Nov 2009 12:19:29 +0200
Subject: [PATCH 469/557] fixed EXT-2457 "Remove unresolved notifications
 counter from the Login/Startup toast";

--HG--
branch : product-engine
---
 indra/newview/llscreenchannel.cpp              | 12 +-----------
 indra/newview/skins/default/xui/en/strings.xml |  3 +--
 2 files changed, 2 insertions(+), 13 deletions(-)

diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index d1cf4a08103..c4d3fb9d7d5 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -535,17 +535,7 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
 
 	std::string mStartUpFormatString;
 
-	if(notif_num == 1)
-	{
-		mStartUpFormatString = LLTrans::getString("StartUpNotification");
-	}
-	else
-	{
-		mStartUpFormatString = LLTrans::getString("StartUpNotifications");
-	}
-	
-
-	std::string	text = llformat(mStartUpFormatString.c_str(), notif_num);
+	std::string	text = LLTrans::getString("StartUpNotifications");
 
 	toast_rect = mStartUpToastPanel->getRect();
 	mStartUpToastPanel->reshape(getRect().getWidth(), toast_rect.getHeight(), true);
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index e76763d7ebc..b3728cb425f 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -1782,8 +1782,7 @@ Clears (deletes) the media and all params from the given face.
 	<string name="GroupNotifySaveAttachment">Save Attachment</string>
   <string name="TeleportOffer">Teleport offering</string>
   <!-- start-up toast's string-->
-  <string name="StartUpNotification">%d new notification arrived while you were away...</string>
-  <string name="StartUpNotifications">%d new notifications arrived while you were away...</string>
+  <string name="StartUpNotifications">New notifications arrived while you were away.</string>
   <!-- overflow toast's string-->
   <string name="OverflowInfoChannelString">You have %d more notification</string>
   
-- 
GitLab


From a995c494d4a3c7750532f01d2c8c693e7ff32ea3 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Fri, 20 Nov 2009 12:52:40 +0200
Subject: [PATCH 470/557] removed redundant local variable

--HG--
branch : product-engine
---
 indra/newview/llscreenchannel.cpp | 2 --
 1 file changed, 2 deletions(-)

diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index c4d3fb9d7d5..24505f6bd6f 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -533,8 +533,6 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
 
 	LLTextBox* text_box = mStartUpToastPanel->getChild<LLTextBox>("toast_text");
 
-	std::string mStartUpFormatString;
-
 	std::string	text = LLTrans::getString("StartUpNotifications");
 
 	toast_rect = mStartUpToastPanel->getRect();
-- 
GitLab


From 8dd743e783464f59b1d80763d8e2e8c52e048cb1 Mon Sep 17 00:00:00 2001
From: Denis Serdjuk <dserduk@productengine.com>
Date: Fri, 20 Nov 2009 13:53:23 +0200
Subject: [PATCH 471/557] implemented task EXT-1900  Add options to Gestures
 gear menu

--HG--
branch : product-engine
---
 indra/newview/llfloatergesture.cpp            | 313 +++++++++++++-----
 indra/newview/llfloatergesture.h              |  42 ++-
 .../skins/default/xui/en/floater_gesture.xml  |  12 +-
 .../default/xui/en/menu_gesture_gear.xml      |  75 +++++
 4 files changed, 350 insertions(+), 92 deletions(-)
 create mode 100644 indra/newview/skins/default/xui/en/menu_gesture_gear.xml

diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index af86274472a..0f8e4c10d78 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -34,32 +34,24 @@
 
 #include "llfloatergesture.h"
 
-#include "lldir.h"
 #include "llinventory.h"
-#include "llmultigesture.h"
+#include "llinventorybridge.h"
+#include "llinventorymodel.h"
+#include "llinventoryclipboard.h"
 
 #include "llagent.h"
-#include "llviewerwindow.h"
-#include "llbutton.h"
-#include "llcombobox.h"
+#include "llappearancemgr.h"
+#include "llclipboard.h"
 #include "llgesturemgr.h"
-#include "llinventorymodel.h"
-#include "llinventorypanel.h"
-#include "llfloaterinventory.h"
 #include "llkeyboard.h"
-#include "lllineeditor.h"
+#include "llmenugl.h"
+#include "llmultigesture.h"
 #include "llpreviewgesture.h"
-#include "llresizehandle.h"
-#include "llscrollbar.h"
-#include "llscrollcontainer.h"
 #include "llscrolllistctrl.h"
-#include "lltextbox.h"
 #include "lltrans.h"
-#include "lluictrlfactory.h"
 #include "llviewergesture.h"
-#include "llviewertexturelist.h"
+#include "llviewermenu.h" 
 #include "llviewerinventory.h"
-#include "llvoavatar.h"
 #include "llviewercontrol.h"
 
 BOOL item_name_precedes( LLInventoryItem* a, LLInventoryItem* b )
@@ -77,6 +69,35 @@ class LLFloaterGestureObserver : public LLGestureManagerObserver
 private:
 	LLFloaterGesture* mFloater;
 };
+//-----------------------------
+// GestureCallback
+//-----------------------------
+
+class GestureShowCallback : public LLInventoryCallback
+{
+public:
+	void fire(const LLUUID &inv_item)
+	{
+		LLPreviewGesture::show(inv_item, LLUUID::null);
+	}
+};
+
+class GestureCopiedCallback : public LLInventoryCallback
+{
+private:
+	LLFloaterGesture* mFloater;
+	
+public:
+	GestureCopiedCallback(LLFloaterGesture* floater): mFloater(floater)
+	{}
+	void fire(const LLUUID &inv_item)
+	{
+		if(mFloater)
+		{
+			mFloater->addGesture(inv_item,NULL,mFloater->getChild<LLScrollListCtrl>("gesture_list"));
+		}
+	}
+};
 
 //---------------------------------------------------------------------------
 // LLFloaterGesture
@@ -86,7 +107,13 @@ LLFloaterGesture::LLFloaterGesture(const LLSD& key)
 {
 	mObserver = new LLFloaterGestureObserver(this);
 	LLGestureManager::instance().addObserver(mObserver);
-	//LLUICtrlFactory::getInstance()->buildFloater(this, "floater_gesture.xml");
+
+	mCommitCallbackRegistrar.add("Gesture.Action.ToogleActiveState", boost::bind(&LLFloaterGesture::onActivateBtnClick, this));
+	mCommitCallbackRegistrar.add("Gesture.Action.ShowPreview", boost::bind(&LLFloaterGesture::onClickEdit, this));
+	mCommitCallbackRegistrar.add("Gesture.Action.CopyPast", boost::bind(&LLFloaterGesture::onCopyPastAction, this, _2));
+	mCommitCallbackRegistrar.add("Gesture.Action.SaveToCOF", boost::bind(&LLFloaterGesture::addToCurrentOutFit, this));
+
+	mEnableCallbackRegistrar.add("Gesture.EnableAction", boost::bind(&LLFloaterGesture::isActionEnabled, this, _2));
 }
 
 void LLFloaterGesture::done()
@@ -151,19 +178,18 @@ BOOL LLFloaterGesture::postBuild()
 	label = getTitle();
 	
 	setTitle(label);
-
-	getChild<LLUICtrl>("gesture_list")->setCommitCallback(boost::bind(&LLFloaterGesture::onCommitList, this));
-	getChild<LLScrollListCtrl>("gesture_list")->setDoubleClickCallback(boost::bind(&LLFloaterGesture::onClickPlay, this));
-
-	getChild<LLUICtrl>("inventory_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickInventory, this));
+	mGestureList = getChild<LLScrollListCtrl>("gesture_list");
+	mGestureList->setCommitCallback(boost::bind(&LLFloaterGesture::onCommitList, this));
+	mGestureList->setDoubleClickCallback(boost::bind(&LLFloaterGesture::onClickPlay, this));
 
 	getChild<LLUICtrl>("edit_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickEdit, this));
 
 	getChild<LLUICtrl>("play_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickPlay, this));
 	getChild<LLUICtrl>("stop_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickPlay, this));
 	getChild<LLButton>("activate_btn")->setClickedCallback(boost::bind(&LLFloaterGesture::onActivateBtnClick, this));
-
+	
 	getChild<LLUICtrl>("new_gesture_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickNew, this));
+	getChild<LLButton>("del_btn")->setClickedCallback(boost::bind(&LLFloaterGesture::onDeleteSelected, this));
 
 	childSetVisible("play_btn", true);
 	childSetVisible("stop_btn", false);
@@ -178,14 +204,13 @@ BOOL LLFloaterGesture::postBuild()
 
 	buildGestureList();
 	
-	childSetFocus("gesture_list");
+	mGestureList->setFocus(TRUE);
 
-	LLCtrlListInterface *list = getGestureList();
-	if (list)
+	if (mGestureList)
 	{
 		const BOOL ascending = TRUE;
-		list->sortByColumn(std::string("name"), ascending);
-		list->selectFirstItem();
+		mGestureList->sortByColumn(std::string("name"), ascending);
+		mGestureList->selectFirstItem();
 	}
 	
 	// Update button labels
@@ -199,18 +224,17 @@ void LLFloaterGesture::refreshAll()
 {
 	buildGestureList();
 
-	LLCtrlListInterface *list = getGestureList();
-	if (!list) return;
+	if (!mGestureList) return;
 
 	if (mSelectedID.isNull())
 	{
-		list->selectFirstItem();
+		mGestureList->selectFirstItem();
 	}
 	else
 	{
-		if (! list->setCurrentByID(mSelectedID))
+		if (! mGestureList->setCurrentByID(mSelectedID))
 		{
-			list->selectFirstItem();
+			mGestureList->selectFirstItem();
 		}
 	}
 
@@ -220,20 +244,16 @@ void LLFloaterGesture::refreshAll()
 
 void LLFloaterGesture::buildGestureList()
 {
-	LLCtrlListInterface *list = getGestureList();
-	LLCtrlScrollInterface *scroll = childGetScrollInterface("gesture_list");
-
-	if (! (list && scroll)) return;
-
-	LLUUID selected_item = list->getCurrentID();
+	std::vector<LLUUID> selected_items;
+	getSelectedIds(selected_items);
 	LL_DEBUGS("Gesture")<< "Rebuilding gesture list "<< LL_ENDL;
-	list->operateOnAll(LLCtrlListInterface::OP_DELETE);
+	mGestureList->deleteAllItems();
 
 	LLGestureManager::item_map_t::const_iterator it;
 	const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures();
 	for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
 	{
-		addGesture(it->first,it->second, list);
+		addGesture(it->first,it->second, mGestureList);
 	}
 	if (gInventory.isCategoryComplete(mGestureFolderID))
 	{
@@ -249,16 +269,17 @@ void LLFloaterGesture::buildGestureList()
 			if (active_gestures.find(item->getUUID()) == active_gestures.end())
 			{
 				// if gesture wasn't loaded yet, we can display only name
-				addGesture(item->getUUID(), NULL, list);
+				addGesture(item->getUUID(), NULL, mGestureList);
 			}
 		}
 	}
 	// attempt to preserve scroll position through re-builds
 	// since we do re-build any time anything dirties
-	if(list->selectByValue(LLSD(selected_item)))
+	for(std::vector<LLUUID>::iterator it = selected_items.begin(); it != selected_items.end(); it++)
 	{
-		scroll->scrollToShowSelected();
+		mGestureList->selectByID(*it);
 	}
+	mGestureList->scrollToShowSelected();
 }
 
 void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gesture,LLCtrlListInterface * list )
@@ -346,33 +367,59 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur
 	list->addElement(element, ADD_BOTTOM);
 }
 
-void LLFloaterGesture::onClickInventory()
+void LLFloaterGesture::getSelectedIds(std::vector<LLUUID>& ids)
+{
+	std::vector<LLScrollListItem*> items = mGestureList->getAllSelected();
+	for(std::vector<LLScrollListItem*>::const_iterator it = items.begin(); it != items.end(); it++)
+	{
+		ids.push_back((*it)->getUUID());
+	}
+}
+
+bool LLFloaterGesture::isActionEnabled(const LLSD& command)
 {
-	LLCtrlListInterface *list = getGestureList();
-	if (!list) return;
-	const LLUUID& item_id = list->getCurrentID();
+	// paste copy_uuid edit_gesture
+	std::string command_name = command.asString();
+	if("paste" == command_name)
+	{
+		if(!LLInventoryClipboard::instance().hasContents())
+			return false;
 
-	LLFloaterInventory* inv = LLFloaterInventory::showAgentInventory();
-	if (!inv) return;
-	inv->getPanel()->setSelection(item_id, TRUE);
+		LLDynamicArray<LLUUID> ids;
+		LLInventoryClipboard::instance().retrieve(ids);
+		for(LLDynamicArray<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++)
+		{
+			LLInventoryItem* item = gInventory.getItem(*it);
+			
+			if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
+			{
+				return true;
+			}
+		}
+		return false;
+	}
+	else if("copy_uuid" == command_name || "edit_gesture" == command_name 
+			|| "inspect" == command_name)
+	{
+		return	mGestureList->getAllSelected().size() == 1;
+	}
+	return true;
 }
 
 void LLFloaterGesture::onClickPlay()
 {
-	LLCtrlListInterface *list = getGestureList();
-	if (!list) return;
-	const LLUUID& item_id = list->getCurrentID();
+	const LLUUID& item_id = mGestureList->getCurrentID();
 	if(item_id.isNull()) return;
 
 	LL_DEBUGS("Gesture")<<" Trying to play gesture id: "<< item_id <<LL_ENDL;
 	if(!LLGestureManager::instance().isGestureActive(item_id))
 	{
-		// we need to inform server about gesture activating to be consistent with LLPreviewGesture.
+		// we need to inform server about gesture activating to be consistent with LLPreviewGesture and  LLGestureComboBox.
 		BOOL inform_server = TRUE;
 		BOOL deactivate_similar = FALSE;
+		LLGestureManager::instance().setGestureLoadedCallback(item_id, boost::bind(&LLFloaterGesture::playGesture, this, item_id));
 		LLGestureManager::instance().activateGestureWithAsset(item_id, gInventory.getItem(item_id)->getAssetUUID(), inform_server, deactivate_similar);
 		LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL;
-		LLGestureManager::instance().setGestureLoadedCallback(item_id, boost::bind(&LLFloaterGesture::playGesture, this, item_id));
 	}
 	else
 	{
@@ -380,15 +427,6 @@ void LLFloaterGesture::onClickPlay()
 	}
 }
 
-class GestureShowCallback : public LLInventoryCallback
-{
-public:
-	void fire(const LLUUID &inv_item)
-	{
-		LLPreviewGesture::show(inv_item, LLUUID::null);
-	}
-};
-
 void LLFloaterGesture::onClickNew()
 {
 	LLPointer<LLInventoryCallback> cb = new GestureShowCallback();
@@ -399,27 +437,96 @@ void LLFloaterGesture::onClickNew()
 
 void LLFloaterGesture::onActivateBtnClick()
 {
-	LLCtrlListInterface* list = getGestureList();
-	
-	LLUUID gesture_inv_id = list->getSelectedValue();
+	std::vector<LLUUID> ids;
+	getSelectedIds(ids);
+	if(ids.empty())
+		return;
+
 	LLGestureManager* gm = LLGestureManager::getInstance();
-	
-	if(gm->isGestureActive(gesture_inv_id))
+	std::vector<LLUUID>::const_iterator it = ids.begin();
+	BOOL first_gesture_state = gm->isGestureActive(*it);
+	BOOL is_mixed = FALSE;
+	while( ++it != ids.end() )
 	{
-		gm->deactivateGesture(gesture_inv_id);
+		if(first_gesture_state != gm->isGestureActive(*it))
+		{
+			is_mixed = TRUE;
+			break;
+		}
 	}
-	else
+	for(std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++)
 	{
-		gm->activateGesture(gesture_inv_id);
+		if(is_mixed)
+		{
+			gm->activateGesture(*it);
+		}
+		else
+		{
+			if(first_gesture_state)
+			{
+				gm->deactivateGesture(*it);
+			}
+			else
+			{
+				gm->activateGesture(*it);
+			}
+		}
 	}
 }
 
+void LLFloaterGesture::onCopyPastAction(const LLSD& command)
+{
+	std::string command_name  = command.asString();
+	// since we select this comman inventory item had  already arrived .
+	if("copy_gesture" == command_name)
+	{
+		std::vector<LLUUID> ids;
+		getSelectedIds(ids);
+		// make sure that clopboard is empty
+		LLInventoryClipboard::instance().reset();
+		for(std::vector<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++)
+		{
+			LLInventoryItem* item = gInventory.getItem(*it);
+			if(item  && item->getInventoryType() == LLInventoryType::IT_GESTURE)
+			{
+				LLInventoryClipboard::instance().add(item->getUUID());
+			}
+		}
+	}
+	else if ("paste" == command_name)
+	{
+		LLInventoryClipboard& clipbord = LLInventoryClipboard::instance();
+		LLDynamicArray<LLUUID> ids;
+		clipbord.retrieve(ids);
+		if(ids.empty() || !gInventory.isCategoryComplete(mGestureFolderID))
+			return;
+		LLInventoryCategory* gesture_dir = gInventory.getCategory(mGestureFolderID);
+		LLPointer<GestureCopiedCallback> cb = new GestureCopiedCallback(this);
+
+		for(LLDynamicArray<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++)
+		{
+			LLInventoryItem* item = gInventory.getItem(*it);
+			LLStringUtil::format_map_t string_args;
+			string_args["[COPY_NAME]"] = item->getName();
+			if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
+			{
+				LL_DEBUGS("Gesture")<< "Copying gesture " << item->getName() << "  "<< item->getUUID() << " into "
+										<< gesture_dir->getName() << "  "<< gesture_dir->getUUID() << LL_ENDL;
+				copy_inventory_item(gAgent.getID(), item->getPermissions().getOwner(), item->getUUID(), 
+						gesture_dir->getUUID(), getString("copy_name", string_args), cb);
+			}
+		}
+		clipbord.reset();
+	}
+	else if ("copy_uuid" == command_name)
+	{
+		gClipboard.copyFromString(utf8str_to_wstring(mGestureList->getCurrentID().asString()), mGestureList->getCurrentID());
+	}
+}
 
 void LLFloaterGesture::onClickEdit()
 {
-	LLCtrlListInterface *list = getGestureList();
-	if (!list) return;
-	const LLUUID& item_id = list->getCurrentID();
+	const LLUUID& item_id = mGestureList->getCurrentID();
 
 	LLInventoryItem* item = gInventory.getItem(item_id);
 	if (!item) return;
@@ -433,7 +540,7 @@ void LLFloaterGesture::onClickEdit()
 
 void LLFloaterGesture::onCommitList()
 {
-	const LLUUID& item_id = childGetValue("gesture_list").asUUID();
+	const LLUUID& item_id = mGestureList->getCurrentID();
 
 	mSelectedID = item_id;
 	if (LLGestureManager::instance().isGesturePlaying(item_id))
@@ -447,8 +554,60 @@ void LLFloaterGesture::onCommitList()
 		childSetVisible("stop_btn", false);
 	}
 }
+
+void LLFloaterGesture::onDeleteSelected()
+{
+	std::vector<LLUUID> ids;
+	getSelectedIds(ids);
+	if(ids.empty())
+		return;
+
+	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+	LLGestureManager* gm = LLGestureManager::getInstance();
+	for(std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++)
+	{
+		const LLUUID& selected_item = *it;
+		LLInventoryItem* inv_item = gInventory.getItem(selected_item);
+		if (inv_item && inv_item->getInventoryType() == LLInventoryType::IT_GESTURE)
+		{
+			if(gm->isGestureActive(selected_item))
+			{
+				gm->deactivateGesture(selected_item);
+			}
+			LLInventoryModel::update_list_t update;
+			LLInventoryModel::LLCategoryUpdate old_folder(inv_item->getParentUUID(), -1);
+			update.push_back(old_folder);
+			LLInventoryModel::LLCategoryUpdate new_folder(trash_id, 1);
+			update.push_back(new_folder);
+			gInventory.accountForUpdate(update);
+
+			LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(inv_item);
+			new_item->setParent(trash_id);
+			// no need to restamp it though it's a move into trash because
+			// it's a brand new item already.
+			new_item->updateParentOnServer(FALSE);
+			gInventory.updateItem(new_item);
+		}
+	}
+	gInventory.notifyObservers();
+	buildGestureList();
+}
+
+void LLFloaterGesture::addToCurrentOutFit()
+{
+	std::vector<LLUUID> ids;
+	getSelectedIds(ids);
+	LLAppearanceManager* am = LLAppearanceManager::getInstance();
+	for(std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++)
+	{
+		am->addCOFItemLink(*it);
+	}
+}
+
 void LLFloaterGesture::playGesture(LLUUID item_id)
 {
+	LL_DEBUGS("Gesture")<<"Playing gesture "<< item_id<<LL_ENDL;
+
 	if (LLGestureManager::instance().isGesturePlaying(item_id))
 	{
 		LLGestureManager::instance().stopGesture(item_id);
diff --git a/indra/newview/llfloatergesture.h b/indra/newview/llfloatergesture.h
index 50bef818daa..14e132900df 100644
--- a/indra/newview/llfloatergesture.h
+++ b/indra/newview/llfloatergesture.h
@@ -36,11 +36,10 @@
 
 #ifndef LL_LLFLOATERGESTURE_H
 #define LL_LLFLOATERGESTURE_H
+#include <vector> 
 
 #include "llfloater.h"
-#include "llinventorymodel.h"
 #include "llinventoryobserver.h"
-#include "lldarray.h"
 
 class LLScrollContainer;
 class LLView;
@@ -53,6 +52,7 @@ class LLScrollListCtrl;
 class LLFloaterGestureObserver;
 class LLFloaterGestureInventoryObserver;
 class LLMultiGesture;
+class LLMenuGL;
 
 class LLFloaterGesture
 :	public LLFloater, LLInventoryFetchDescendentsObserver
@@ -65,26 +65,46 @@ class LLFloaterGesture
 	virtual BOOL postBuild();
 	virtual void done ();
 	void refreshAll();
+	/**
+	 * @brief Add new scrolllistitem into gesture_list.
+	 * @param  item_id inventory id of gesture
+	 * @param  gesture can be NULL , if item was not loaded yet
+	 */
+	void addGesture(const LLUUID& item_id, LLMultiGesture* gesture, LLCtrlListInterface * list);
 
 protected:
 	// Reads from the gesture manager's list of active gestures
 	// and puts them in this list.
 	void buildGestureList();
-	void addGesture(const LLUUID& item_id, LLMultiGesture* gesture, LLCtrlListInterface * list);
-	void onClickInventory();
+	void playGesture(LLUUID item_id);
+private:
+	void addToCurrentOutFit();
+	/**
+	 * @brief  This method is using to collect selected items. 
+	 * In some places gesture_list can be rebuilt by gestureObservers during  iterating data from LLScrollListCtrl::getAllSelected().
+	 * Therefore we have to copy these items to avoid viewer crash.
+	 * @see LLFloaterGesture::onActivateBtnClick
+	 */
+	void getSelectedIds(std::vector<LLUUID>& ids);
+	bool isActionEnabled(const LLSD& command);
+	/**
+	 * @brief Activation rules:
+	 *  According to Gesture Spec:
+	 *  1. If all selected gestures are active: set to inactive
+	 *  2. If all selected gestures are inactive: set to active
+	 *  3. If selected gestures are in a mixed state: set all to active
+	 */
+	void onActivateBtnClick();
 	void onClickEdit();
 	void onClickPlay();
 	void onClickNew();
 	void onCommitList();
-	void playGesture(LLUUID item_id);
-	LLCtrlListInterface* getGestureList() const 
-	{
-		return childGetListInterface("gesture_list");
-	}
-	void onActivateBtnClick();
-protected:
+	void onCopyPastAction(const LLSD& command);
+	void onDeleteSelected();
+
 	LLUUID mSelectedID;
 	LLUUID mGestureFolderID;
+	LLScrollListCtrl* mGestureList;
 
 	LLFloaterGestureObserver* mObserver;
 };
diff --git a/indra/newview/skins/default/xui/en/floater_gesture.xml b/indra/newview/skins/default/xui/en/floater_gesture.xml
index 21d292847ab..9f5e6828d20 100644
--- a/indra/newview/skins/default/xui/en/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_gesture.xml
@@ -21,12 +21,16 @@
      name="playing">
         (Playing)
     </floater.string>
+    <!-- It's used to build new name for gesture created by "Copy" menu item -->
+    <floater.string
+     name="copy_name">Copy of [COPY_NAME]</floater.string>
     <scroll_list
      bottom_delta="400"
      draw_heading="true"
      follows="all"
      layout="topleft"
      left="0"
+     multi_select="true"
      top="20"
      name="gesture_list">
         <scroll_list.columns
@@ -57,18 +61,18 @@
              left="0"
              name="bottom_panel"
              width="313">
-               <button
+              <menu_button
                follows="bottom|left"
-               font="SansSerifBigBold"
-               tool_tip="Change sort and view of recent residents list"
                height="18"
                image_disabled="OptionsMenu_Disabled"
                image_selected="OptionsMenu_Press"
                image_unselected="OptionsMenu_Off"
                layout="topleft"
                left="10"
-               name="recent_viewsort_btn"
+               menu_filename="menu_gesture_gear.xml"
+               name="gear_btn"
                top="5"
+               tool_tip="More options"
                width="18" />
               <button
                  follows="bottom|left"
diff --git a/indra/newview/skins/default/xui/en/menu_gesture_gear.xml b/indra/newview/skins/default/xui/en/menu_gesture_gear.xml
new file mode 100644
index 00000000000..4642e82c0b2
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_gesture_gear.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu
+ layout="topleft"
+ mouse_opaque="false"
+ name="menu_gesture_gear"
+ visible="false">
+    <menu_item_call
+     font="SansSerifBold"
+     label="Add/Remove from Favorites"
+     layout="topleft"
+     name="activate">
+        <on_click
+         function="Gesture.Action.ToogleActiveState" />
+    </menu_item_call>
+    <menu_item_call
+     label="Copy"
+     layout="topleft"
+     name="copy_gesture">
+        <on_click
+         function="Gesture.Action.CopyPast"
+         parameter="copy_gesture" />
+        <on_enable
+         function="Gesture.EnableAction"
+         parameter="copy_gesture" />
+    </menu_item_call>
+    <menu_item_call
+     label="Paste"
+     layout="topleft"
+     name="paste">
+        <on_click
+         function="Gesture.Action.CopyPast"
+         parameter="paste" />
+        <on_enable
+         function="Gesture.EnableAction"
+         parameter="paste" />
+    </menu_item_call>
+    <menu_item_call
+     label="Copy UUID"
+     layout="topleft"
+     name="copy_uuid">
+        <on_click
+         function="Gesture.Action.CopyPast"
+         parameter="copy_uuid" />
+        <on_enable
+         function="Gesture.EnableAction"
+         parameter="copy_uuid" />
+    </menu_item_call>
+    <menu_item_call
+     label="Save to current outfit"
+     layout="topleft"
+     name="save_to_outfit">
+        <on_click
+         function="Gesture.Action.SaveToCOF" />
+    </menu_item_call>
+    <menu_item_call
+     label="Edit"
+     layout="topleft"
+     name="edit_gesture">
+        <on_click
+         function="Gesture.Action.ShowPreview" />
+        <on_enable
+         function="Gesture.EnableAction"
+         parameter="edit_gesture" />
+    </menu_item_call>
+    <menu_item_call
+     label="Inspect"
+     layout="topleft"
+     name="inspect">
+        <on_click
+         function="Gesture.Action.ShowPreview" />
+        <on_enable
+         function="Gesture.EnableAction"
+         parameter="inspect" />
+    </menu_item_call>
+</menu>
-- 
GitLab


From 91fdbd92c8e93e1676ba501bbc91ee56d38255c3 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Fri, 20 Nov 2009 14:39:27 +0200
Subject: [PATCH 472/557] Fixed normal bug EXT-2616 ("Speak" button isn't
 narrowed and has title when width of window is 800px) - updated resize
 behavior to shrink Snapshot button: only speaker is shown in this case. -
 updated LLSpeakButton to hide/show its labels - updated talk_button widget
 (talk_button.xml) to have correct follows attributes - also fixed bug with
 calculating necessary updates for children while extending bottom tray

--HG--
branch : product-engine
---
 indra/newview/llbottomtray.cpp                | 93 +++++++++++++++++--
 indra/newview/llbottomtray.h                  |  9 +-
 indra/newview/llspeakbutton.cpp               | 21 +++++
 indra/newview/llspeakbutton.h                 | 12 +++
 .../skins/default/xui/en/panel_bottomtray.xml |  4 +-
 .../default/xui/en/widgets/talk_button.xml    |  3 +
 6 files changed, 130 insertions(+), 12 deletions(-)

diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 7985ccc2a1d..c53a5152de7 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -48,6 +48,7 @@
 LLBottomTray::LLBottomTray(const LLSD&)
 :	mChicletPanel(NULL),
 	mSysWell(NULL),
+	mSpeakPanel(NULL),
 	mSpeakBtn(NULL),
 	mNearbyChatBar(NULL),
 	mToolbarStack(NULL)
@@ -304,6 +305,7 @@ BOOL LLBottomTray::postBuild()
 	mSnapshotPanel = getChild<LLPanel>("snapshot_panel");
 	setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4));
 
+	mSpeakPanel = getChild<LLPanel>("speak_panel");
 	mSpeakBtn = getChild<LLSpeakButton>("talk");
 
 	// Speak button should be initially disabled because
@@ -320,6 +322,7 @@ BOOL LLBottomTray::postBuild()
 	mObjectDefaultWidthMap[RS_BUTTON_GESTURES] = mGesturePanel->getRect().getWidth();
 	mObjectDefaultWidthMap[RS_BUTTON_MOVEMENT] = mMovementPanel->getRect().getWidth();
 	mObjectDefaultWidthMap[RS_BUTTON_CAMERA]   = mCamPanel->getRect().getWidth();
+	mObjectDefaultWidthMap[RS_BUTTON_SPEAK]	   = mSpeakPanel->getRect().getWidth();
 
 	return TRUE;
 }
@@ -476,7 +479,7 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width)
 	S32 buttons_freed_width = 0;
 	if (still_should_be_processed)
 	{
-		processShrinkButtons(&delta_width);
+		processShrinkButtons(&delta_width, &buttons_freed_width);
 
 		if (delta_width < 0)
 		{
@@ -532,9 +535,16 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
 	const S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width;
 
 	// how many room we have to show hidden buttons
-	S32 available_width = delta_width + chatbar_available_shrink_width + available_width_chiclet;
+	S32 total_available_width = delta_width + chatbar_available_shrink_width + available_width_chiclet;
 	S32 buttons_required_width = 0; //How many room will take shown buttons
 
+	lldebugs << "Processing extending, available width:"
+		<< ", chatbar - " << chatbar_available_shrink_width
+		<< ", chiclets - " << available_width_chiclet
+		<< ", total - " << total_available_width
+		<< llendl;
+
+	S32 available_width = total_available_width;
 	if (available_width > 0)
 	{
 		lldebugs << "Trying to process: RS_BUTTON_GESTURES" << llendl;
@@ -559,11 +569,14 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
 		processShowButton(RS_BUTTON_SNAPSHOT, &available_width, &buttons_required_width);
 	}
 
-	// if we have to show some buttons but width increasing is not enough...
-	if (buttons_required_width > 0 && delta_width < buttons_required_width)
+	processExtendButtons(&available_width);
+
+	// if we have to show/extend some buttons but resized delta width is not enough...
+	S32 processed_width = total_available_width - available_width;
+	if (processed_width > delta_width)
 	{
 		// ... let's shrink nearby chat & chiclet panels
-		S32 required_to_process_width = buttons_required_width;
+		S32 required_to_process_width = processed_width;
 
 		// 1. use delta width of resizing
 		required_to_process_width -= delta_width;
@@ -593,9 +606,8 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
 	}
 
 	// shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels
-	delta_width -= buttons_required_width;
+	delta_width -= processed_width;
 
-	processExtendButtons(&delta_width);
 
 	// how many space can nearby chatbar take?
 	S32 chatbar_panel_width_ = mNearbyChatBar->getRect().getWidth();
@@ -603,8 +615,14 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
 	{
 		S32 delta_panel_max = chatbar_panel_max_width - chatbar_panel_width_;
 		S32 delta_panel = llmin(delta_width, delta_panel_max);
+		lldebugs << "Unprocesed delta width: " << delta_width
+			<< ", can be applied to chatbar: " << delta_panel_max
+			<< ", will be applied: " << delta_panel
+			<< llendl;
+
 		delta_width -= delta_panel_max;
 		mNearbyChatBar->reshape(chatbar_panel_width_ + delta_panel, mNearbyChatBar->getRect().getHeight());
+		log(mNearbyChatBar, "applied unprocessed delta width");
 	}
 }
 
@@ -666,7 +684,7 @@ void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* re
 	}
 }
 
-void LLBottomTray::processShrinkButtons(S32* required_width)
+void LLBottomTray::processShrinkButtons(S32* required_width, S32* buttons_freed_width)
 {
 	processShrinkButton(RS_BUTTON_CAMERA, required_width);
 
@@ -678,9 +696,44 @@ void LLBottomTray::processShrinkButtons(S32* required_width)
 	{
 		processShrinkButton(RS_BUTTON_GESTURES, required_width);
 	}
+	if (*required_width < 0)
+	{
+
+		S32 panel_min_width = 0;
+		std::string panel_name = mSpeakPanel->getName();
+		bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width, NULL);
+		if (!success)
+		{
+			lldebugs << "Panel was not found to get its min width: " << panel_name << llendl;
+		}
+		else
+		{
+			//
+			mSpeakBtn->setLabelVisible(false);
+			S32 panel_width = mSpeakPanel->getRect().getWidth();
+			S32 possible_shrink_width = panel_width - panel_min_width;
+
+			if (possible_shrink_width > 0)
+			{
+				mSpeakPanel->reshape(panel_width - possible_shrink_width, mSpeakPanel->getRect().getHeight());
+
+				*required_width += possible_shrink_width;
+
+				if (*required_width > 0)
+				{
+					*buttons_freed_width += *required_width;
+				}
+
+				lldebugs << "Shrunk panel: " << panel_name
+					<< ", shrunk width: " << possible_shrink_width
+					<< ", rest width to process: " << *required_width
+					<< llendl;
+			}
+		}
+	}
 }
 
-void LLBottomTray::processShrinkButton(EResizeState processed_object_type, /*const std::string& panel_name, */S32* required_width)
+void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32* required_width)
 {
 	LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
 	if (NULL == panel)
@@ -729,6 +782,9 @@ void LLBottomTray::processShrinkButton(EResizeState processed_object_type, /*con
 
 void LLBottomTray::processExtendButtons(S32* available_width)
 {
+	// do not allow extending any buttons if we have some buttons hidden
+	if (mResizeState & RS_BUTTONS_CAN_BE_HIDDEN) return;
+
 	processExtendButton(RS_BUTTON_GESTURES, available_width);
 
 	if (*available_width > 0)
@@ -739,6 +795,25 @@ void LLBottomTray::processExtendButtons(S32* available_width)
 	{
 		processExtendButton(RS_BUTTON_MOVEMENT, available_width);
 	}
+	if (*available_width > 0)
+	{
+		S32 panel_max_width = mObjectDefaultWidthMap[RS_BUTTON_SPEAK];
+		S32 panel_width = mSpeakPanel->getRect().getWidth();
+		S32 possible_extend_width = panel_max_width - panel_width;
+		if (possible_extend_width > 0 && possible_extend_width <= *available_width)
+		{
+			mSpeakBtn->setLabelVisible(true);
+			mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight());
+			log(mSpeakBtn, "speak button is extended");
+
+			*available_width -= possible_extend_width;
+
+			lldebugs << "Extending panel: " << mSpeakPanel->getName()
+				<< ", extended width: " << possible_extend_width
+				<< ", rest width to process: " << *available_width
+				<< llendl;
+		}
+	}
 }
 
 void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32* available_width)
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 97bcc23403a..f4f8397799f 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -98,6 +98,12 @@ class LLBottomTray
 		, RS_BUTTON_MOVEMENT	= 0x0010
 		, RS_BUTTON_GESTURES	= 0x0020
 		, RS_BUTTON_SPEAK		= 0x0040
+
+		/**
+		 * Specifies buttons which can be hidden when bottom tray is shrunk.
+		 * They are: Gestures, Movement (Move), Camera (View), Snapshot
+		 */
+		, RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES
 	}EResizeState;
 
 	S32 processWidthDecreased(S32 delta_width);
@@ -112,7 +118,7 @@ class LLBottomTray
 	 * @param - required_width - width which buttons can use to be shrunk. It is a negative value.
 	 * It is increased on the value processed by buttons.
 	 */
-	void processShrinkButtons(S32* required_width);
+	void processShrinkButtons(S32* required_width, S32* buttons_freed_width);
 	void processShrinkButton(EResizeState processed_object_type, S32* required_width);
 
 	/**
@@ -175,6 +181,7 @@ class LLBottomTray
 
 	LLChicletPanel* 	mChicletPanel;
 	LLNotificationChiclet* 	mSysWell;
+	LLPanel*			mSpeakPanel;
 	LLSpeakButton* 		mSpeakBtn;
 	LLNearbyChatBar*	mNearbyChatBar;
 	LLLayoutStack*		mToolbarStack;
diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp
index 51d53b26740..54f776ca6a7 100644
--- a/indra/newview/llspeakbutton.cpp
+++ b/indra/newview/llspeakbutton.cpp
@@ -143,6 +143,27 @@ void LLSpeakButton::setShowToolTip(const std::string& msg)
 	mShowBtn->setToolTip(msg);
 }
 
+void LLSpeakButton::setLabelVisible(bool visible)
+{
+	static std::string label_selected = mSpeakBtn->getLabelSelected();
+	static std::string label_unselected = mSpeakBtn->getLabelUnselected();
+
+	if (visible)
+	{
+		mSpeakBtn->setLabelSelected(label_selected);
+		mSpeakBtn->setLabelUnselected(label_unselected);
+	}
+	else
+	{
+		static LLStringExplicit empty_string("");
+		mSpeakBtn->setLabelSelected(empty_string);
+		mSpeakBtn->setLabelUnselected(empty_string);
+	}
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// PROTECTED SECTION
+//////////////////////////////////////////////////////////////////////////
 void LLSpeakButton::onMouseDown_SpeakBtn()
 {
 	bool down = true;
diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h
index 02c8ab38909..424ee5357a4 100644
--- a/indra/newview/llspeakbutton.h
+++ b/indra/newview/llspeakbutton.h
@@ -67,6 +67,18 @@ class LLSpeakButton : public LLUICtrl
 	void setSpeakToolTip(const std::string& msg);
 	void setShowToolTip(const std::string& msg);
 
+	/**
+	 * Sets visibility of speak button's label according to passed parameter.
+	 *
+	 * It removes label/selected label if "visible" is false and restores otherwise.
+	 *
+	 * @param visible if true - show label and selected label.
+	 * 
+	 * @see mSpeakBtn
+	 * @see LLBottomTray::processShrinkButtons()
+	 */
+	void setLabelVisible(bool visible);
+
 protected:
 	friend class LLUICtrlFactory;
 	LLSpeakButton(const Params& p);
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 00711a29e01..6480469f43f 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -60,11 +60,11 @@
          min_height="28"
          width="104"
          top_delta="0"
-         min_width="104"
+         min_width="54"
          name="speak_panel"
          user_resize="false">
           <talk_button
-           follows="right"
+           follows="left|right"
            height="23"
            speak_button.tab_stop="true"
            show_button.tab_stop="true"
diff --git a/indra/newview/skins/default/xui/en/widgets/talk_button.xml b/indra/newview/skins/default/xui/en/widgets/talk_button.xml
index 1d8257fbc8a..64c2e65a6e0 100644
--- a/indra/newview/skins/default/xui/en/widgets/talk_button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/talk_button.xml
@@ -6,6 +6,7 @@
     image_unselected="SegmentedBtn_Left_Off"
   -->
   <speak_button
+    follows="left|right" 
     name="left"
     label="Speak"
     label_selected="Speak"
@@ -13,6 +14,7 @@
     tab_stop="false"
     />
   <show_button
+    follows="right" 
     name="right"
     label=""
     left="0"
@@ -25,6 +27,7 @@
     image_unselected="ComboButton_UpOff"
     />
   <monitor
+    follows="right" 
     name="monitor"
     left="0"
     top="18"
-- 
GitLab


From 0876df6eef35a88bc0804e1d8eb0f4471eeda9f2 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Fri, 20 Nov 2009 14:55:30 +0200
Subject: [PATCH 473/557] No ticket. Code to resize bottom tray is refuctored
 after the latest fix for EXT-2616:  - Removed unused param while extending
 bottom tray  - Moved some debug messages

--HG--
branch : product-engine
---
 indra/newview/llbottomtray.cpp | 24 +++++++++++-------------
 indra/newview/llbottomtray.h   |  2 +-
 2 files changed, 12 insertions(+), 14 deletions(-)

diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index c53a5152de7..c4f0fa53a79 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -536,7 +536,6 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
 
 	// how many room we have to show hidden buttons
 	S32 total_available_width = delta_width + chatbar_available_shrink_width + available_width_chiclet;
-	S32 buttons_required_width = 0; //How many room will take shown buttons
 
 	lldebugs << "Processing extending, available width:"
 		<< ", chatbar - " << chatbar_available_shrink_width
@@ -547,26 +546,22 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
 	S32 available_width = total_available_width;
 	if (available_width > 0)
 	{
-		lldebugs << "Trying to process: RS_BUTTON_GESTURES" << llendl;
-		processShowButton(RS_BUTTON_GESTURES, &available_width, &buttons_required_width);
+		processShowButton(RS_BUTTON_GESTURES, &available_width);
 	}
 
 	if (available_width > 0)
 	{
-		lldebugs << "Trying to process: RS_BUTTON_MOVEMENT" << llendl;
-		processShowButton(RS_BUTTON_MOVEMENT, &available_width, &buttons_required_width);
+		processShowButton(RS_BUTTON_MOVEMENT, &available_width);
 	}
 
 	if (available_width > 0)
 	{
-		lldebugs << "Trying to process: RS_BUTTON_CAMERA" << llendl;
-		processShowButton(RS_BUTTON_CAMERA, &available_width, &buttons_required_width);
+		processShowButton(RS_BUTTON_CAMERA, &available_width);
 	}
 
 	if (available_width > 0)
 	{
-		lldebugs << "Trying to process: RS_BUTTON_SNAPSHOT" << llendl;
-		processShowButton(RS_BUTTON_SNAPSHOT, &available_width, &buttons_required_width);
+		processShowButton(RS_BUTTON_SNAPSHOT, &available_width);
 	}
 
 	processExtendButtons(&available_width);
@@ -626,8 +621,10 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
 	}
 }
 
-bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* available_width, S32* buttons_required_width)
+bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* available_width)
 {
+	lldebugs << "Trying to show object type: " << shown_object_type << llendl;
+
 	LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
 	if (NULL == panel)
 	{
@@ -643,12 +640,11 @@ bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* availa
 		if (can_be_shown)
 		{
 			*available_width -= required_width;
-			*buttons_required_width += required_width;
 
 			setTrayButtonVisible(shown_object_type, true);
 
-			lldebugs << "processing object type: " << shown_object_type
-				<< ", buttons_required_width: " << *buttons_required_width
+			lldebugs << "processed object type: " << shown_object_type
+				<< ", rest available width: " << *available_width
 				<< llendl;
 			mResizeState &= ~shown_object_type;
 		}
@@ -658,6 +654,8 @@ bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* availa
 
 void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width)
 {
+	lldebugs << "Trying to hide object type: " << processed_object_type << llendl;
+
 	LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
 	if (NULL == panel)
 	{
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index f4f8397799f..7640cdcf9d5 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -109,7 +109,7 @@ class LLBottomTray
 	S32 processWidthDecreased(S32 delta_width);
 	void processWidthIncreased(S32 delta_width);
 	void log(LLView* panel, const std::string& descr);
-	bool processShowButton(EResizeState shown_object_type, S32* available_width, S32* buttons_required_width);
+	bool processShowButton(EResizeState shown_object_type, S32* available_width);
 	void processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width);
 
 	/**
-- 
GitLab


From 2d9202cb812dec65ec571035389aacd49d19e659 Mon Sep 17 00:00:00 2001
From: Dmitry Oleshko <doleshko@productengine.com>
Date: Fri, 20 Nov 2009 16:28:52 +0200
Subject: [PATCH 474/557] implemented low task (EXT-1476) Make layouts for
 Alert, Tip and Script notifications based on XML

- made XML-files for the following controls on the panel for alert toasts: button, check box, icon and line editor.
- changed creation of these controls in code: from XML vs. from Params in run-time
- added getFont method to the LLCheckBox control

--HG--
branch : product-engine
---
 indra/llui/llcheckboxctrl.h                   |   1 +
 indra/newview/lltoastalertpanel.cpp           | 104 +++++++++---------
 .../skins/default/xui/en/alert_button.xml     |  14 +++
 .../skins/default/xui/en/alert_check_box.xml  |   7 ++
 .../skins/default/xui/en/alert_icon.xml       |   8 ++
 .../default/xui/en/alert_line_editor.xml      |  11 ++
 6 files changed, 96 insertions(+), 49 deletions(-)
 create mode 100644 indra/newview/skins/default/xui/en/alert_button.xml
 create mode 100644 indra/newview/skins/default/xui/en/alert_check_box.xml
 create mode 100644 indra/newview/skins/default/xui/en/alert_icon.xml
 create mode 100644 indra/newview/skins/default/xui/en/alert_line_editor.xml

diff --git a/indra/llui/llcheckboxctrl.h b/indra/llui/llcheckboxctrl.h
index 2f8e8fdd234..b14e66b9150 100644
--- a/indra/llui/llcheckboxctrl.h
+++ b/indra/llui/llcheckboxctrl.h
@@ -107,6 +107,7 @@ class LLCheckBoxCtrl
 	std::string			getLabel() const;
 
 	void				setFont( const LLFontGL* font ) { mFont = font; }
+	const LLFontGL*		getFont() { return mFont; }
 	
 	virtual void		setControlName(const std::string& control_name, LLView* context);
 
diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp
index beb31bc8334..a4f5164a8dd 100644
--- a/indra/newview/lltoastalertpanel.cpp
+++ b/indra/newview/lltoastalertpanel.cpp
@@ -53,6 +53,7 @@
 #include "lluictrlfactory.h"
 #include "llnotifications.h"
 #include "llfunctorregistry.h"
+#include "llrootview.h"
 
 const S32 MAX_ALLOWED_MSG_WIDTH = 400;
 const F32 DEFAULT_BUTTON_DELAY = 0.5f;
@@ -220,16 +221,13 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
 	static LLUIColor alert_text_color = LLUIColorTable::instance().getColor("AlertTextColor");
 	if (mCaution)
 	{
-		LLIconCtrl::Params params;
-		params.name("icon");
-		params.rect(LLRect(msg_x, msg_y, msg_x+32, msg_y-32));
-		params.mouse_opaque(false);
-		params.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);
-		params.tab_stop(false);
-		LLIconCtrl * icon = LLUICtrlFactory::create<LLIconCtrl> (params);
-		icon->setValue ("notify_caution_icon.tga");
-		icon->setMouseOpaque(FALSE);
-		LLToastPanel::addChild(icon);
+		LLIconCtrl* icon = LLUICtrlFactory::getInstance()->createFromFile<LLIconCtrl>("alert_icon.xml", this, LLPanel::child_registry_t::instance());
+		if(icon)
+		{
+			icon->setRect(LLRect(msg_x, msg_y, msg_x+32, msg_y-32));
+			LLToastPanel::addChild(icon);
+		}
+		
 		msg_x += 32 + HPAD;
 		msg_box->setColor( alert_caution_text_color );
 	}
@@ -245,29 +243,30 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
 
 	// Buttons	
 	S32 button_left = (LLToastPanel::getRect().getWidth() - btn_total_width) / 2;
-
+	
 	for( S32 i = 0; i < num_options; i++ )
 	{
 		LLRect button_rect;
-		button_rect.setOriginAndSize( button_left, VPAD, button_width, BTN_HEIGHT );
-
-		LLButton::Params p;
-		p.name(options[i].first);
-		p.rect(button_rect);
-		p.click_callback.function(boost::bind(&LLToastAlertPanel::onButtonPressed, this, _2, i));
-		p.font(font);
-		p.label(options[i].second);
+		
+		LLButton* btn = LLUICtrlFactory::getInstance()->createFromFile<LLButton>("alert_button.xml", this, LLPanel::child_registry_t::instance());
+		if(btn)
+		{
+			btn->setName(options[i].first);
+			btn->setRect(button_rect.setOriginAndSize( button_left, VPAD, button_width, BTN_HEIGHT ));
+			btn->setLabel(options[i].second);
+			btn->setFont(font);
+			
+			btn->setClickedCallback(boost::bind(&LLToastAlertPanel::onButtonPressed, this, _2, i));
 
-		LLButton* btn = LLUICtrlFactory::create<LLButton>(p);
-		mButtonData[i].mButton = btn;
+			mButtonData[i].mButton = btn;
 
-		LLToastPanel::addChild(btn);
+			LLToastPanel::addChild(btn);
 
-		if( i == mDefaultOption )
-		{
-			btn->setFocus(TRUE);
+			if( i == mDefaultOption )
+			{
+				btn->setFocus(TRUE);
+			}
 		}
-
 		button_left += button_width + BTN_HPAD;
 	}
 
@@ -275,25 +274,26 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
 	if (!edit_text_name.empty())
 	{
 		S32 y = VPAD + BTN_HEIGHT + VPAD/2;
+		mLineEditor = LLUICtrlFactory::getInstance()->createFromFile<LLLineEditor>("alert_line_editor.xml", this, LLPanel::child_registry_t::instance());
+	
+		if (mLineEditor)
+		{
+			LLRect leditor_rect = LLRect( HPAD, y+EDITOR_HEIGHT, dialog_width-HPAD, y);
+			mLineEditor->setName(edit_text_name);
+			mLineEditor->reshape(leditor_rect.getWidth(), leditor_rect.getHeight());
+			mLineEditor->setRect(leditor_rect);
+			mLineEditor->setText(edit_text_contents);
+			mLineEditor->setMaxTextLength(STD_STRING_STR_LEN);
 
-		LLLineEditor::Params params;
-		params.name(edit_text_name);
-		params.rect(LLRect( HPAD, y+EDITOR_HEIGHT, dialog_width-HPAD, y));
-		params.default_text(edit_text_contents);
-		params.max_length_bytes(STD_STRING_STR_LEN);
-		mLineEditor = LLUICtrlFactory::create<LLLineEditor> (params);
+			// make sure all edit keys get handled properly (DEV-22396)
+			mLineEditor->setHandleEditKeysDirectly(TRUE);
 
-		// make sure all edit keys get handled properly (DEV-22396)
-		mLineEditor->setHandleEditKeysDirectly(TRUE);
+			LLToastPanel::addChild(mLineEditor);
 
-		LLToastPanel::addChild(mLineEditor);
-	}
-	
-	if (mLineEditor)
-	{
-		mLineEditor->setDrawAsterixes(is_password);
+			mLineEditor->setDrawAsterixes(is_password);
 
-		setEditTextArgs(notification->getSubstitutions());
+			setEditTextArgs(notification->getSubstitutions());
+		}
 	}
 
 	std::string ignore_label;
@@ -323,7 +323,14 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
 
 bool LLToastAlertPanel::setCheckBox( const std::string& check_title, const std::string& check_control )
 {
-	const LLFontGL* font = LLFontGL::getFontSansSerif();
+	mCheck = LLUICtrlFactory::getInstance()->createFromFile<LLCheckBoxCtrl>("alert_check_box.xml", this, LLPanel::child_registry_t::instance());
+
+	if(!mCheck)
+	{
+		return false;
+	}
+
+	const LLFontGL* font =  mCheck->getFont();
 	const S32 LINE_HEIGHT = llfloor(font->getLineHeight() + 0.99f);
 	
 	// Extend dialog for "check next time"
@@ -339,14 +346,13 @@ bool LLToastAlertPanel::setCheckBox( const std::string& check_title, const std::
 	LLToastPanel::reshape( dialog_width, dialog_height, FALSE );
 
 	S32 msg_x = (LLToastPanel::getRect().getWidth() - max_msg_width) / 2;
+
+	// set check_box's attributes
+	LLRect check_rect;
+	mCheck->setRect(check_rect.setOriginAndSize(msg_x, VPAD+BTN_HEIGHT+LINE_HEIGHT/2, max_msg_width, LINE_HEIGHT));
+	mCheck->setLabel(check_title);
+	mCheck->setCommitCallback(boost::bind(&LLToastAlertPanel::onClickIgnore, this, _1));
 	
-	LLCheckBoxCtrl::Params p;
-	p.name("check");
-	p.rect.left(msg_x).bottom(VPAD+BTN_HEIGHT+LINE_HEIGHT/2).width(max_msg_width).height(LINE_HEIGHT);
-	p.label(check_title);
-	p.font(font);
-	p.commit_callback.function(boost::bind(&LLToastAlertPanel::onClickIgnore, this, _1));
-	mCheck = LLUICtrlFactory::create<LLCheckBoxCtrl>(p);
 	LLToastPanel::addChild(mCheck);
 
 	return true;
diff --git a/indra/newview/skins/default/xui/en/alert_button.xml b/indra/newview/skins/default/xui/en/alert_button.xml
new file mode 100644
index 00000000000..48c67a3770b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/alert_button.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+
+<button
+  label_shadow="true"
+  auto_resize="false"
+  image_overlay_alignment="center"
+  use_ellipses="flse"
+  pad_right="10"
+  pad_left="10"
+  is_toggle="false"
+  scale_image="true"
+  commit_on_return="true"
+  font="SansSerifSmall"
+  follows="bottom"/>
diff --git a/indra/newview/skins/default/xui/en/alert_check_box.xml b/indra/newview/skins/default/xui/en/alert_check_box.xml
new file mode 100644
index 00000000000..9f1bdb51939
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/alert_check_box.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<check_box
+  text_enabled_color="LabelTextColor"
+  text_disabled_color="LabelDisabledColor"
+  font="SansSerif"
+  follows="left|top"
+  name="check"/>
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/alert_icon.xml b/indra/newview/skins/default/xui/en/alert_icon.xml
new file mode 100644
index 00000000000..b0886fce061
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/alert_icon.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<icon color="1.0 1.0 1.0 1.0"
+      tab_stop="false"
+      mouse_opaque="false"
+      name="icon"
+      image_name="notify_caution_icon.tga" 
+      follows="left|top">
+</icon>
diff --git a/indra/newview/skins/default/xui/en/alert_line_editor.xml b/indra/newview/skins/default/xui/en/alert_line_editor.xml
new file mode 100644
index 00000000000..ab708adb06b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/alert_line_editor.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<line_editor
+  select_on_focus="false"
+  handle_edit_keys_directly="false"
+  revert_on_esc="true"
+  commit_on_focus_lost="true"
+  ignore_tab="true"
+  max_length="254"
+  text_pad_right="0"
+  text_pad_left="0"
+  mouse_opaque="true"/>
-- 
GitLab


From 3c4a98ff3cdc756918a2dea0c5d3dd58aa08bca3 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Fri, 20 Nov 2009 17:14:50 +0200
Subject: [PATCH 475/557] Work on normal task EXT-2640 (Create a tabbed IM
 multifloater) - initial commit: added xml file and base implementation of the
 tabbed IM multifloater

--HG--
branch : product-engine
---
 indra/newview/CMakeLists.txt                  |  2 +
 indra/newview/llimfloatercontainer.cpp        | 97 +++++++++++++++++++
 indra/newview/llimfloatercontainer.h          | 61 ++++++++++++
 indra/newview/llviewerfloaterreg.cpp          |  2 +
 .../default/xui/en/floater_im_container.xml   | 38 ++++++++
 5 files changed, 200 insertions(+)
 create mode 100644 indra/newview/llimfloatercontainer.cpp
 create mode 100644 indra/newview/llimfloatercontainer.h
 create mode 100644 indra/newview/skins/default/xui/en/floater_im_container.xml

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index e7458529bee..e7ce6a8fbd1 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -239,6 +239,7 @@ set(viewer_SOURCE_FILES
     llhudtext.cpp
     llhudview.cpp
     llimfloater.cpp
+    llimfloatercontainer.cpp
     llimhandler.cpp
     llimpanel.cpp
     llimview.cpp
@@ -737,6 +738,7 @@ set(viewer_HEADER_FILES
     llhudtext.h
     llhudview.h
     llimfloater.h
+    llimfloatercontainer.h
     llimpanel.h
     llimview.h
     llinspect.h
diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp
new file mode 100644
index 00000000000..94017526c88
--- /dev/null
+++ b/indra/newview/llimfloatercontainer.cpp
@@ -0,0 +1,97 @@
+/** 
+ * @file llimfloatercontainer.cpp
+ * @brief Multifloater containing active IM sessions in separate tab container tabs
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llimfloatercontainer.h"
+
+// TODO: mantipov: replace with floater_im_session
+#include "llimpanel.h"
+
+//
+// LLIMFloaterContainer
+//
+LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed)
+:	LLMultiFloater(seed),
+	mActiveVoiceFloater(NULL)
+{
+	mAutoResize = FALSE;
+}
+
+LLIMFloaterContainer::~LLIMFloaterContainer()
+{
+}
+
+BOOL LLIMFloaterContainer::postBuild()
+{
+	// TODO: mantipov: verify if it is needed
+	mTabContainer->lockTabs();
+	return TRUE;
+}
+
+void LLIMFloaterContainer::onOpen(const LLSD& key)
+{
+	// TODO: mantipov: verify if it is needed
+	if (key.isDefined())
+	{
+		LLFloaterIMPanel* impanel = gIMMgr->findFloaterBySession(key.asUUID());
+		if (impanel)
+		{
+			impanel->openFloater();
+		}
+	}
+}
+
+void LLIMFloaterContainer::addFloater(LLFloater* floaterp, 
+									BOOL select_added_floater, 
+									LLTabContainer::eInsertionPoint insertion_point)
+{
+	if(!floaterp) return;
+
+	// already here
+	if (floaterp->getHost() == this)
+	{
+		openFloater(floaterp->getKey());
+		return;
+	}
+
+	LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point);
+
+	// make sure active voice icon shows up for new tab
+	if (floaterp == mActiveVoiceFloater)
+	{
+		mTabContainer->setTabImage(floaterp, "active_voice_tab.tga");	
+	}
+}
+
+// EOF
diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h
new file mode 100644
index 00000000000..10cde56c6ee
--- /dev/null
+++ b/indra/newview/llimfloatercontainer.h
@@ -0,0 +1,61 @@
+/** 
+ * @file llimfloatercontainer.h
+ * @brief Multifloater containing active IM sessions in separate tab container tabs
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLIMFLOATERCONTAINER_H
+#define LL_LLIMFLOATERCONTAINER_H
+
+#include "llfloater.h"
+#include "llmultifloater.h"
+
+class LLTabContainer;
+
+class LLIMFloaterContainer : public LLMultiFloater
+{
+public:
+	LLIMFloaterContainer(const LLSD& seed);
+	virtual ~LLIMFloaterContainer();
+	
+	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void onOpen(const LLSD& key);
+
+	/*virtual*/ void addFloater(LLFloater* floaterp, 
+								BOOL select_added_floater, 
+								LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END);
+
+	static LLFloater* getCurrentVoiceFloater();
+	
+protected:
+	
+	LLFloater* mActiveVoiceFloater;
+};
+
+#endif // LL_LLIMFLOATERCONTAINER_H
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 7772f613f0a..f84e3c99393 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -109,6 +109,7 @@
 #include "llfloaterwhitelistentry.h"
 #include "llfloaterwindlight.h"
 #include "llfloaterworldmap.h"
+#include "llimfloatercontainer.h"
 #include "llinspectavatar.h"
 #include "llinspectgroup.h"
 #include "llinspectobject.h"
@@ -171,6 +172,7 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("hud", "floater_hud.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHUD>);
 
 	LLFloaterReg::add("impanel", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloater>);
+	LLFloaterReg::add("im_container", "floater_im_container.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloaterContainer>);
 	LLFloaterReg::add("incoming_call", "floater_incoming_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIncomingCallDialog>);
 	LLFloaterReg::add("inventory", "floater_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInventory>);
 	LLFloaterReg::add("inspect", "floater_inspect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInspect>);
diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml
new file mode 100644
index 00000000000..a1a0aee97b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_im_container.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<multi_floater
+background_visible="true"
+bg_color="yellow" 
+ can_resize="true"
+ height="390"
+ layout="topleft"
+ name="floater_im_box"
+ help_topic="floater_im_box"
+ save_rect="true"
+ save_visibility="true"
+ single_instance="true"
+ title="Instant Messages"
+ width="392">
+    <tab_container
+background_visible="true"
+bg_alpha_color="green" 
+     follows="left|right|top|bottom"
+     height="390"
+     layout="topleft"
+     left="1"
+     name="im_box_tab_container"
+     tab_position="bottom"
+     tab_width="80"
+     top="0"
+     width="390" />
+    <icon
+     color="red"
+     enabled="false"
+     follows="left|right|bottom"
+     height="17"
+     image_name="tabarea.tga"
+     layout="bottomleft"
+     left="1"
+     name="im_box_tab_container_icon"
+     bottom="0"
+     width="390" />
+</multi_floater>
-- 
GitLab


From 0c468557b9e38ec4be201fa991499ed095a4d8c3 Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Fri, 20 Nov 2009 18:20:41 +0200
Subject: [PATCH 476/557] Build fix.

--HG--
branch : product-engine
---
 indra/newview/lllandmarkactions.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp
index 70546ccae69..d50b68b6240 100644
--- a/indra/newview/lllandmarkactions.cpp
+++ b/indra/newview/lllandmarkactions.cpp
@@ -376,7 +376,7 @@ bool LLLandmarkActions::getLandmarkGlobalPos(const LLUUID& landmarkInventoryItem
 {
 	LLViewerInventoryItem* item = gInventory.getItem(landmarkInventoryItemID);
 	if (NULL == item)
-		return NULL;
+		return false;
 
 	const LLUUID& asset_id = item->getAssetUUID();
 
-- 
GitLab


From 13a6077b780117be0fa3a054426d139ca1d35df9 Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Fri, 20 Nov 2009 19:17:38 +0200
Subject: [PATCH 477/557] Implemented normal task EXT-2081 - Object IM chiclets
 art needs to be hooked up to LLDialog chiclets. Implemented
 LLDialog(LLScriptFloater) and Script Chiclets.

--HG--
branch : product-engine
---
 indra/newview/CMakeLists.txt                  |   2 +
 indra/newview/llchiclet.cpp                   |  56 +++
 indra/newview/llchiclet.h                     |  34 ++
 indra/newview/llimview.cpp                    |   2 +-
 indra/newview/llnotificationscripthandler.cpp |  51 ++-
 indra/newview/llscreenchannel.cpp             |   4 +-
 indra/newview/llscriptfloater.cpp             | 335 ++++++++++++++++++
 indra/newview/llscriptfloater.h               | 114 ++++++
 indra/newview/llviewerfloaterreg.cpp          |   2 +
 indra/newview/llviewermessage.cpp             |  10 +
 .../skins/default/xui/en/floater_script.xml   |  19 +
 .../skins/default/xui/en/notifications.xml    |  23 +-
 12 files changed, 634 insertions(+), 18 deletions(-)
 create mode 100644 indra/newview/llscriptfloater.cpp
 create mode 100644 indra/newview/llscriptfloater.h
 create mode 100644 indra/newview/skins/default/xui/en/floater_script.xml

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index e7458529bee..8537c92ff74 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -364,6 +364,7 @@ set(viewer_SOURCE_FILES
     llremoteparcelrequest.cpp
     llsavedsettingsglue.cpp
     llscreenchannel.cpp
+    llscriptfloater.cpp
     llscrollingpanelparam.cpp
     llsearchcombobox.cpp
     llsearchhistory.cpp
@@ -860,6 +861,7 @@ set(viewer_HEADER_FILES
     llrootview.h
     llsavedsettingsglue.h
     llscreenchannel.h
+    llscriptfloater.h
     llscrollingpanelparam.h
     llsearchcombobox.h
     llsearchhistory.h
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index caf6917d90e..15c4c5f95d0 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -43,6 +43,7 @@
 #include "lllocalcliprect.h"
 #include "llmenugl.h"
 #include "lloutputmonitorctrl.h"
+#include "llscriptfloater.h"
 #include "lltextbox.h"
 #include "llvoiceclient.h"
 #include "llvoicecontrolpanel.h"
@@ -1392,3 +1393,58 @@ LLChicletSpeakerCtrl::LLChicletSpeakerCtrl(const Params&p)
  : LLOutputMonitorCtrl(p)
 {
 }
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLScriptChiclet::Params::Params()
+ : avatar_icon("avatar_icon")
+{
+	// *TODO Vadim: Get rid of hardcoded values.
+	rect(CHICLET_RECT);
+	name("dialog_chiclet");
+
+	avatar_icon.name("avatar_icon");
+	avatar_icon.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP | FOLLOWS_BOTTOM);
+
+	avatar_icon.rect(CHICLET_ICON_RECT);
+	avatar_icon.mouse_opaque(false);
+}
+
+LLScriptChiclet::LLScriptChiclet(const Params&p)
+ : LLIMChiclet(p)
+ , mChicletIconCtrl(NULL)
+{
+	mImage = LLUI::getUIImage("Generic_Object_Small");
+}
+
+void LLScriptChiclet::setSessionId(const LLUUID& session_id)
+{
+	setShowNewMessagesIcon( getSessionId() != session_id );
+
+	LLIMChiclet::setSessionId(session_id);
+	LLNotificationPtr notification = LLNotifications::getInstance()->find(
+		LLScriptFloaterManager::getInstance()->getNotificationId(session_id));
+	if(notification)
+	{
+		setToolTip(notification->getSubstitutions()["TITLE"].asString());
+	}
+}
+
+void LLScriptChiclet::draw()
+{
+	mImage->draw(getLocalRect());
+	LLIMChiclet::draw();
+}
+
+void LLScriptChiclet::onMouseDown()
+{
+	LLScriptFloaterManager::getInstance()->toggleScriptFloater(getSessionId());
+}
+
+BOOL LLScriptChiclet::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+	onMouseDown();
+	return LLChiclet::handleMouseDown(x, y, mask);
+}
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index bb5dc1e5500..a46f817c13b 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -533,6 +533,40 @@ class LLAdHocChiclet : public LLIMChiclet
 	LLMenuGL* mPopupMenu;
 };
 
+class LLScriptChiclet : public LLIMChiclet
+{
+public:
+
+	struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params>
+	{
+		Optional<LLChicletAvatarIconCtrl::Params> avatar_icon;
+
+		Params();
+	};
+
+	void setSessionId(const LLUUID& session_id);
+
+	void setCounter(S32 counter){}
+
+	S32 getCounter() { return 0; }
+
+	void onMouseDown();
+
+	BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+
+	void draw();
+
+protected:
+
+	LLScriptChiclet(const Params&);
+	friend class LLUICtrlFactory;
+
+private:
+
+	LLPointer<LLUIImage> mImage;
+	LLChicletAvatarIconCtrl* mChicletIconCtrl;
+};
+
 /**
  * Implements Group chat chiclet.
  */
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index dd78bb631fd..b509fe4043a 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -49,7 +49,7 @@
 #include "llbottomtray.h"
 #include "llcallingcard.h"
 #include "llchat.h"
-#include "llchiclet.h"
+#include "llchiclet.h"
 #include "llresmgr.h"
 #include "llfloaterchat.h"
 #include "llfloaterchatterbox.h"
diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp
index 70b86e8b976..84a81913757 100644
--- a/indra/newview/llnotificationscripthandler.cpp
+++ b/indra/newview/llnotificationscripthandler.cpp
@@ -38,6 +38,7 @@
 #include "llviewercontrol.h"
 #include "llviewerwindow.h"
 #include "llnotificationmanager.h"
+#include "llscriptfloater.h"
 
 using namespace LLNotificationsUI;
 
@@ -90,25 +91,37 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
 	
 	if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
 	{
-		LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
-
-		LLToast::Params p;
-		p.notif_id = notification->getID();
-		p.notification = notification;
-		p.panel = notify_box;	
-		p.on_delete_toast = boost::bind(&LLScriptHandler::onDeleteToast, this, _1);
-
-		LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
-		if(channel)
-			channel->addToast(p);
-
-		// send a signal to the counter manager
-		mNewNotificationSignal();
-
+		if("ScriptDialog" == notification->getName() || "ScriptDialogGroup" == notification->getName())
+		{
+			LLScriptFloaterManager::getInstance()->onAddNotification(notification->getID());
+		}
+		else
+		{
+			LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
+
+			LLToast::Params p;
+			p.notif_id = notification->getID();
+			p.notification = notification;
+			p.panel = notify_box;	
+			p.on_delete_toast = boost::bind(&LLScriptHandler::onDeleteToast, this, _1);
+
+			LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+			if(channel)
+			{
+				channel->addToast(p);
+			}
+
+			// send a signal to the counter manager
+			mNewNotificationSignal();
+		}
 	}
 	else if (notify["sigtype"].asString() == "delete")
 	{
 		mChannel->killToastByNotificationID(notification->getID());
+		if("ScriptDialog" == notification->getName())
+		{
+			LLScriptFloaterManager::getInstance()->removeNotification(notification->getID());
+		}
 	}
 	return true;
 }
@@ -123,6 +136,14 @@ void LLScriptHandler::onDeleteToast(LLToast* toast)
 	// send a signal to a listener to let him perform some action
 	// in this case listener is a SysWellWindow and it will remove a corresponding item from its list
 	mNotificationIDSignal(toast->getNotificationID());
+
+	LLNotificationPtr notification = LLNotifications::getInstance()->find(toast->getNotificationID());
+	
+	if( notification && ("ScriptDialog" == notification->getName() 
+		|| "ScriptDialogGroup" == notification->getName()) )
+	{
+		LLScriptFloaterManager::getInstance()->onRemoveNotification(notification->getID());
+	}
 }
 
 //--------------------------------------------------------------------------
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index 81eb133b07f..f033251831c 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -46,6 +46,7 @@
 #include "lldockablefloater.h"
 #include "llsyswellwindow.h"
 #include "llimfloater.h"
+#include "llscriptfloater.h"
 
 #include <algorithm>
 
@@ -698,7 +699,8 @@ void LLScreenChannel::updateShowToastsState()
 	}
 
 	// for IM floaters showed in a docked state - prohibit showing of ani toast
-	if(dynamic_cast<LLIMFloater*>(floater))
+	if(dynamic_cast<LLIMFloater*>(floater)
+		|| dynamic_cast<LLScriptFloater*>(floater) )
 	{
 		setShowToasts(!(floater->getVisible() && floater->isDocked()));
 		if (!getShowToasts())
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
new file mode 100644
index 00000000000..6fdde1df991
--- /dev/null
+++ b/indra/newview/llscriptfloater.cpp
@@ -0,0 +1,335 @@
+/** 
+ * @file llscriptfloater.cpp
+ * @brief LLScriptFloater class definition
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llscriptfloater.h"
+
+#include "llbottomtray.h"
+#include "llchannelmanager.h"
+#include "llchiclet.h"
+#include "llfloaterreg.h"
+#include "llscreenchannel.h"
+#include "lltoastnotifypanel.h"
+#include "llviewerwindow.h"
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLUUID notification_id_to_object_id(const LLUUID& notification_id)
+{
+	LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
+	if(notification)
+	{
+		return notification->getPayload()["object_id"].asUUID();
+	}
+	return LLUUID::null;
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLScriptFloater::LLScriptFloater(const LLSD& key)
+: LLTransientDockableFloater(NULL, true, key)
+, mObjectId(key.asUUID())
+{
+}
+
+bool LLScriptFloater::toggle(const LLUUID& object_id)
+{
+	LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", object_id);
+
+	// show existing floater
+	if(floater)
+	{
+		if(floater->getVisible())
+		{
+			floater->setVisible(false);
+			return false;
+		}
+		else
+		{
+			floater->setVisible(TRUE);
+			floater->setFocus(TRUE);
+			return true;
+		}
+	}
+	else
+	{
+		show(object_id);
+		return true;
+	}
+}
+
+LLScriptFloater* LLScriptFloater::show(const LLUUID& object_id)
+{
+	LLScriptFloater* floater = LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", object_id);
+	floater->createForm(object_id);
+
+	if (floater->getDockControl() == NULL)
+	{
+		LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(object_id);
+		if (chiclet == NULL)
+		{
+			llerror("Dock chiclet for LLScriptFloater doesn't exist", 0);
+		}
+		else
+		{
+			LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
+		}
+
+		floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(),
+			LLDockControl::TOP,  boost::bind(&LLScriptFloater::getAllowedRect, floater, _1)));
+	}
+
+	return floater;
+}
+
+void LLScriptFloater::getAllowedRect(LLRect& rect)
+{
+	rect = gViewerWindow->getWorldViewRectRaw();
+}
+
+void LLScriptFloater::createForm(const LLUUID& object_id)
+{
+	static const std::string PANEL_NAME = "_notification_panel_";
+
+	LLPanel* old_panel = findChild<LLPanel>(PANEL_NAME);
+	if(old_panel)
+	{
+		removeChild(old_panel);
+	}
+
+	LLNotificationPtr notification = LLNotifications::getInstance()->find(
+		LLScriptFloaterManager::getInstance()->getNotificationId(object_id));
+	if(NULL == notification)
+	{
+		return;
+	}
+	LLToastNotifyPanel* panel = new LLToastNotifyPanel(notification);
+	panel->setName(PANEL_NAME);
+	addChild(panel);
+
+	LLRect panel_rect;
+
+	panel_rect = panel->getRect();
+	panel_rect.setLeftTopAndSize(0, panel_rect.getHeight(), panel_rect.getWidth(), panel_rect.getHeight());
+	reshape(panel_rect.getWidth(), panel_rect.getHeight());
+	panel->setRect(panel_rect);
+
+	LLRect toast_rect = getRect();
+	toast_rect.setLeftTopAndSize(toast_rect.mLeft, toast_rect.mTop, panel_rect.getWidth(), panel_rect.getHeight() + getHeaderHeight());
+	reshape(toast_rect.getWidth(), toast_rect.getHeight());
+	setRect(toast_rect);
+}
+
+void LLScriptFloater::onClose(bool app_quitting)
+{
+	LLScriptFloaterManager::getInstance()->closeScriptFloater(getObjectId());
+	setObjectId(LLUUID::null);
+}
+
+void LLScriptFloater::setDocked(bool docked, bool pop_on_undock /* = true */)
+{
+	LLTransientDockableFloater::setDocked(docked, pop_on_undock);
+
+	updateToasts();
+}
+
+void LLScriptFloater::setVisible(BOOL visible)
+{
+	LLTransientDockableFloater::setVisible(visible);
+
+	updateToasts();
+}
+
+void LLScriptFloater::updateToasts()
+{
+	using namespace LLNotificationsUI;
+
+	// find channel
+	LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->findChannelByID(
+		LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
+	// update notification channel state
+	if(channel)
+	{
+		channel->updateShowToastsState();
+	}
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
+{
+	// get scripted Object's ID
+	LLUUID object_id = notification_id_to_object_id(notification_id);
+	if(object_id.isNull())
+	{
+		llerrs << "Invalid notification, no object id" << llendl;
+		return;
+	}
+
+	// If an Object spawns more-than-one floater, only the newest one is shown. 
+	// The other is automatically closed.
+	script_notification_map_t::iterator it = mNotifications.find(object_id);
+	if(it != mNotifications.end())
+	{
+		removeNotification(notification_id);
+	}
+
+	LLNotificationData nd = {notification_id};
+	mNotifications.insert(std::make_pair(object_id, nd));
+
+	LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(object_id);
+}
+
+void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
+{
+	LLUUID object_id = notification_id_to_object_id(notification_id);
+	if(object_id.isNull())
+	{
+		llerrs << "Invalid notification, no object id" << llendl;
+		return;
+	}
+
+	using namespace LLNotificationsUI;
+
+	// remove related toast
+	LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->findChannelByID(
+		LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
+	if(channel)
+	{
+		channel->killToastByNotificationID(getToastNotificationId(object_id));
+	}
+
+	mNotifications.erase(object_id);
+
+	// remove related chiclet
+	LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(object_id);
+
+	// close floater
+	LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", object_id);
+	if(floater)
+	{
+		floater->closeFloater();
+	}
+}
+
+void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& object_id)
+{
+	// hide "new message" icon from chiclet
+	LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(object_id);
+	if(chiclet)
+	{
+		chiclet->setShowNewMessagesIcon(false);
+	}
+
+	// kill toast
+	using namespace LLNotificationsUI;
+	LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->findChannelByID(
+		LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
+	if(channel)
+	{
+		channel->killToastByNotificationID(getToastNotificationId(object_id));
+	}
+
+	// toggle floater
+	LLScriptFloater::toggle(object_id);
+}
+
+void LLScriptFloaterManager::closeScriptFloater(const LLUUID& object_id)
+{
+	LLNotificationPtr notification = LLNotifications::getInstance()->find(
+		getNotificationId(object_id));
+	if(notification)
+	{
+		removeNotification(notification->getID());
+	}
+}
+
+void LLScriptFloaterManager::setToastNotificationId(const LLUUID& object_id, const LLUUID& notification_id)
+{
+	script_notification_map_t::iterator it = mNotifications.find(object_id);
+	if(mNotifications.end() != it)
+	{
+		it->second.toast_notification_id = notification_id;
+	}
+}
+
+const LLUUID& LLScriptFloaterManager::getNotificationId(const LLUUID& object_id)
+{
+	script_notification_map_t::const_iterator it = mNotifications.find(object_id);
+	if(mNotifications.end() != it)
+	{
+		return it->second.notification_id;
+	}
+	return LLUUID::null;
+}
+
+const LLUUID& LLScriptFloaterManager::getToastNotificationId(const LLUUID& object_id)
+{
+	script_notification_map_t::const_iterator it = mNotifications.find(object_id);
+	if(mNotifications.end() != it)
+	{
+		return it->second.toast_notification_id;
+	}
+	return LLUUID::null;
+}
+
+//static
+void LLScriptFloaterManager::onToastButtonClick(const LLSD&notification, const LLSD&response)
+{
+	S32 option = LLNotification::getSelectedOption(notification, response);
+	LLUUID object_id = notification["payload"]["object_id"].asUUID();
+
+	switch(option)
+	{
+	case 0: // "Open"
+		LLScriptFloaterManager::getInstance()->toggleScriptFloater(object_id);
+		break;
+	case 1: // "Ignore"
+		LLScriptFloaterManager::getInstance()->closeScriptFloater(object_id);
+		break;
+	case 2: // "Mute"
+		LLMuteList::getInstance()->add(LLMute(object_id, notification["substitutions"]["TITLE"], LLMute::OBJECT));
+		LLScriptFloaterManager::getInstance()->closeScriptFloater(object_id);
+		break;
+	default:
+		llwarns << "Unexpected value" << llendl;
+		break;
+	}
+}
+
+// EOF
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
new file mode 100644
index 00000000000..fc1d9a01866
--- /dev/null
+++ b/indra/newview/llscriptfloater.h
@@ -0,0 +1,114 @@
+/** 
+ * @file llscriptfloater.h
+ * @brief LLScriptFloater class definition
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_SCRIPTFLOATER_H
+#define LL_SCRIPTFLOATER_H
+
+#include "lltransientdockablefloater.h"
+
+/**
+ * This class manages Object script floaters.
+ */
+class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager>
+{
+public:
+
+	void onAddNotification(const LLUUID& notification_id);
+
+	void onRemoveNotification(const LLUUID& notification_id);
+
+	void toggleScriptFloater(const LLUUID& object_id);
+
+	void closeScriptFloater(const LLUUID& object_id);
+
+	const LLUUID& getNotificationId(const LLUUID& object_id);
+
+	const LLUUID& getToastNotificationId(const LLUUID& object_id);
+
+	void setToastNotificationId(const LLUUID& object_id, const LLUUID& notification_id);
+
+	static void onToastButtonClick(const LLSD&notification, const LLSD&response);
+
+private:
+
+	struct LLNotificationData
+	{
+		LLUUID notification_id;
+		LLUUID toast_notification_id;
+	};
+
+	typedef std::map<LLUUID, LLNotificationData> script_notification_map_t;
+
+	script_notification_map_t mNotifications;
+};
+
+/**
+ * Floater for displaying script forms
+ */
+class LLScriptFloater : public LLTransientDockableFloater
+{
+public:
+
+	/**
+	 * key - UUID of scripted Object
+	 */
+	LLScriptFloater(const LLSD& key);
+
+	virtual ~LLScriptFloater(){};
+
+	static bool toggle(const LLUUID& object_id);
+
+	static LLScriptFloater* show(const LLUUID& object_id);
+
+	const LLUUID& getObjectId() { return mObjectId; }
+
+	/*virtual*/ void onClose(bool app_quitting);
+
+	/*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
+
+	/*virtual*/ void setVisible(BOOL visible);
+
+protected:
+
+	void createForm(const LLUUID& object_id);
+
+	/*virtual*/ void getAllowedRect(LLRect& rect);
+
+	static void updateToasts();
+
+	void setObjectId(const LLUUID& id) { mObjectId = id; }
+
+private:
+	LLUUID mObjectId;
+};
+
+#endif //LL_SCRIPTFLOATER_H
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 7772f613f0a..812107dd72b 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -124,6 +124,7 @@
 #include "llpreviewsound.h"
 #include "llpreviewtexture.h"
 #include "llsyswellwindow.h"
+#include "llscriptfloater.h"
 // *NOTE: Please add files in alphabetical order to keep merges easy.
 
 
@@ -171,6 +172,7 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("hud", "floater_hud.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHUD>);
 
 	LLFloaterReg::add("impanel", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloater>);
+	LLFloaterReg::add("script_floater", "floater_script.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLScriptFloater>);
 	LLFloaterReg::add("incoming_call", "floater_incoming_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIncomingCallDialog>);
 	LLFloaterReg::add("inventory", "floater_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInventory>);
 	LLFloaterReg::add("inspect", "floater_inspect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInspect>);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 8db6d5917a8..ac1f366f9cd 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -101,6 +101,7 @@
 #include "llpanelgrouplandmoney.h"
 #include "llpanelplaces.h"
 #include "llrecentpeople.h"
+#include "llscriptfloater.h"
 #include "llselectmgr.h"
 #include "llsidetray.h"
 #include "llstartup.h"
@@ -5380,6 +5381,15 @@ void process_script_dialog(LLMessageSystem* msg, void**)
 		notification = LLNotifications::instance().add(
 			LLNotification::Params("ScriptDialogGroup").substitutions(args).payload(payload).form_elements(form.asLLSD()));
 	}
+
+	LLNotification::Params p("ScriptToast");
+	p.substitutions(args).payload(payload).functor.function(boost::bind(
+		LLScriptFloaterManager::onToastButtonClick, _1, _2));
+
+	notification = LLNotifications::instance().add(p);
+
+	LLScriptFloaterManager::getInstance()->setToastNotificationId(
+		object_id, notification->getID());
 }
 
 //---------------------------------------------------------------------------
diff --git a/indra/newview/skins/default/xui/en/floater_script.xml b/indra/newview/skins/default/xui/en/floater_script.xml
new file mode 100644
index 00000000000..f44ba6d873e
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_script.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ background_visible="true"
+ follows="left|top|right|bottom"
+ height="369"
+ layout="topleft"
+ left="0"
+ name="script_floater"
+ help_topic="script_floater"
+ top="0"
+ can_dock="true"
+ can_minimize="true"
+ visible="true" 
+ width="520"
+ can_resize="true"
+ min_width="350"
+ min_height="369">
+</floater>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 4897a4c8abc..af71ae09d20 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -5298,6 +5298,27 @@ Grant this request?
     </form>
   </notification>
 
+  <notification
+   icon="notify.tga"
+   name="ScriptToast"
+   type="notify">
+    [FIRST] [LAST]&apos;s &apos;[TITLE]&apos; is requesting user input.
+    <form name="form">
+      <button
+       index="0"
+       name="Open"
+       text="Open Dialog"/>
+      <button
+       index="1"
+       name="Ignore"
+       text="Ignore"/>
+      <button
+       index="2"
+       name="Mute"
+       text="Mute"/>
+    </form>
+  </notification>
+
   <notification
    icon="notify.tga"
    name="FirstBalanceIncrease"
@@ -5748,7 +5769,7 @@ Are you sure you want to delete your teleport history?
    name="BottomTrayButtonCanNotBeShown"
    type="alert">
 Selected button can not be shown right now.
-The button will be shown when there is enough space for it.
+The button will be shown when there is enough space for it.
   </notification>
 
 
-- 
GitLab


From 9d64bf132e27739dedeca17a1d952655c6b52ac3 Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Fri, 20 Nov 2009 19:23:22 +0200
Subject: [PATCH 478/557] Update for normal task EXT-2081 - Object IM chiclets
 art needs to be hooked up to LLDialog chiclets. Fixed function names.

--HG--
branch : product-engine
---
 indra/newview/llnotificationscripthandler.cpp | 2 +-
 indra/newview/llscriptfloater.cpp             | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp
index 84a81913757..6cd5ee8f43e 100644
--- a/indra/newview/llnotificationscripthandler.cpp
+++ b/indra/newview/llnotificationscripthandler.cpp
@@ -120,7 +120,7 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
 		mChannel->killToastByNotificationID(notification->getID());
 		if("ScriptDialog" == notification->getName())
 		{
-			LLScriptFloaterManager::getInstance()->removeNotification(notification->getID());
+			LLScriptFloaterManager::getInstance()->onRemoveNotification(notification->getID());
 		}
 	}
 	return true;
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
index 6fdde1df991..1bf6235d042 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -206,7 +206,7 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
 	script_notification_map_t::iterator it = mNotifications.find(object_id);
 	if(it != mNotifications.end())
 	{
-		removeNotification(notification_id);
+		onRemoveNotification(notification_id);
 	}
 
 	LLNotificationData nd = {notification_id};
@@ -275,7 +275,7 @@ void LLScriptFloaterManager::closeScriptFloater(const LLUUID& object_id)
 		getNotificationId(object_id));
 	if(notification)
 	{
-		removeNotification(notification->getID());
+		onRemoveNotification(notification->getID());
 	}
 }
 
-- 
GitLab


From 6016ac658835757583c80e1f12a52e9b9cc4adc9 Mon Sep 17 00:00:00 2001
From: "Mark Palange (Mani)" <palange@lindenlab.com>
Date: Fri, 20 Nov 2009 10:09:22 -0800
Subject: [PATCH 479/557] EXT-2618 Added code to determine if the viewer is
 running 'compatibility mode' OS version string reports compatibility mode and
 real os version number, if accessible. reviewed by Richard

---
 indra/llcommon/llsys.cpp     | 129 +++++++++++++++++++++++++++++------
 indra/newview/CMakeLists.txt |   2 +-
 2 files changed, 108 insertions(+), 23 deletions(-)

diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 3652eeba729..cba8cf85b02 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -76,6 +76,75 @@ extern int errno;
 static const S32 CPUINFO_BUFFER_SIZE = 16383;
 LLCPUInfo gSysCPU;
 
+#if LL_WINDOWS
+#ifndef DLLVERSIONINFO
+typedef struct _DllVersionInfo
+{
+    DWORD cbSize;
+    DWORD dwMajorVersion;
+    DWORD dwMinorVersion;
+    DWORD dwBuildNumber;
+    DWORD dwPlatformID;
+}DLLVERSIONINFO;
+#endif
+
+#ifndef DLLGETVERSIONPROC
+typedef int (FAR WINAPI *DLLGETVERSIONPROC) (DLLVERSIONINFO *);
+#endif
+
+bool get_shell32_dll_version(DWORD& major, DWORD& minor, DWORD& build_number)
+{
+	bool result = false;
+	const U32 BUFF_SIZE = 32767;
+	WCHAR tempBuf[BUFF_SIZE];
+	if(GetSystemDirectory((LPWSTR)&tempBuf, BUFF_SIZE))
+	{
+		
+		std::basic_string<WCHAR> shell32_path(tempBuf);
+
+		// Shell32.dll contains the DLLGetVersion function. 
+		// according to msdn its not part of the API
+		// so you have to go in and get it.
+		// http://msdn.microsoft.com/en-us/library/bb776404(VS.85).aspx
+		shell32_path += TEXT("\\shell32.dll");
+
+		HMODULE hDllInst = LoadLibrary(shell32_path.c_str());   //load the DLL
+		if(hDllInst) 
+		{  // Could successfully load the DLL
+			DLLGETVERSIONPROC pDllGetVersion;
+			/*
+			You must get this function explicitly because earlier versions of the DLL
+			don't implement this function. That makes the lack of implementation of the
+			function a version marker in itself.
+			*/
+			pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hDllInst, 
+																"DllGetVersion");
+
+			if(pDllGetVersion) 
+			{    
+				// DLL supports version retrieval function
+				DLLVERSIONINFO    dvi;
+
+				ZeroMemory(&dvi, sizeof(dvi));
+				dvi.cbSize = sizeof(dvi);
+				HRESULT hr = (*pDllGetVersion)(&dvi);
+
+				if(SUCCEEDED(hr)) 
+				{ // Finally, the version is at our hands
+					major = dvi.dwMajorVersion;
+					minor = dvi.dwMinorVersion;
+					build_number = dvi.dwBuildNumber;
+					result = true;
+				} 
+			} 
+
+			FreeLibrary(hDllInst);  // Release DLL
+		} 
+	}
+	return result;
+}
+#endif // LL_WINDOWS
+
 LLOSInfo::LLOSInfo() :
 	mMajorVer(0), mMinorVer(0), mBuild(0)
 {
@@ -98,6 +167,11 @@ LLOSInfo::LLOSInfo() :
 	mMinorVer = osvi.dwMinorVersion;
 	mBuild = osvi.dwBuildNumber;
 
+	DWORD shell32_major, shell32_minor, shell32_build;
+	bool got_shell32_version = get_shell32_dll_version(shell32_major, 
+													   shell32_minor, 
+													   shell32_build);
+
 	switch(osvi.dwPlatformId)
 	{
 	case VER_PLATFORM_WIN32_NT:
@@ -122,8 +196,22 @@ LLOSInfo::LLOSInfo() :
 				 else
 					 mOSStringSimple = "Microsoft Windows Server 2003 ";
 			}
-			else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0)
+			else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion <= 1)
 			{
+				if(osvi.dwMinorVersion == 0)
+				{
+					mOSStringSimple = "Microsoft Windows Vista ";
+				}
+				else if(osvi.dwMinorVersion == 1)
+				{
+					mOSStringSimple = "Microsoft Windows 7 ";
+				}
+
+				if(osvi.wProductType != VER_NT_WORKSTATION)
+				{
+					mOSStringSimple += "Server ";
+				}
+
 				///get native system info if available..
 				typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); ///function pointer for loading GetNativeSystemInfo
 				SYSTEM_INFO si; //System Info object file contains architecture info
@@ -141,32 +229,13 @@ LLOSInfo::LLOSInfo() :
 				//of windows than this code does (in case it is needed for the future)
 				if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 ) //check for 64 bit
 				{
-					 if(osvi.wProductType == VER_NT_WORKSTATION)
-						mOSStringSimple = "Microsoft Windows Vista 64-bit ";
-					 else 
-						mOSStringSimple = "Microsoft Windows Vista Server 64-bit ";
+					mOSStringSimple += "64-bit ";
 				}
 				else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )
 				{
-					 if(osvi.wProductType == VER_NT_WORKSTATION)
-						mOSStringSimple = "Microsoft Windows Vista 32-bit ";
-					 else 
-						mOSStringSimple = "Microsoft Windows Vista Server 32-bit ";
-				}
-				else // PROCESSOR_ARCHITECTURE_IA64 || PROCESSOR_ARCHITECTURE_UNKNOWN not checked
-				{
-					 if(osvi.wProductType == VER_NT_WORKSTATION)
-						mOSStringSimple = "Microsoft Windows Vista ";
-					 else 
-						mOSStringSimple = "Microsoft Windows Vista Server ";
+					mOSStringSimple += "32-bit ";
 				}
 			}
-			else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1)
-			{
-				 if(osvi.wProductType == VER_NT_WORKSTATION)
-					mOSStringSimple = "Microsoft Windows 7 ";
-				 else mOSStringSimple = "Microsoft Windows 7 Server ";
-			}
 			else   // Use the registry on early versions of Windows NT.
 			{
 				mOSStringSimple = "Microsoft Windows (unrecognized) ";
@@ -211,6 +280,7 @@ LLOSInfo::LLOSInfo() :
 								  csdversion.c_str(),
 								  (osvi.dwBuildNumber & 0xffff));
 			}
+
 			mOSString = mOSStringSimple + tmpstr;
 		}
 		break;
@@ -240,6 +310,21 @@ LLOSInfo::LLOSInfo() :
 		mOSString = mOSStringSimple;
 		break;
 	}
+
+	std::string compatibility_mode;
+	if(got_shell32_version)
+	{
+		if(osvi.dwMajorVersion != shell32_major 
+			|| osvi.dwMinorVersion != shell32_minor)
+		{
+			compatibility_mode = llformat(" compatibility mode. real ver: %d.%d (Build %d)", 
+											shell32_major,
+											shell32_minor,
+											shell32_build);
+		}
+	}
+	mOSString += compatibility_mode;
+
 #else
 	struct utsname un;
 	if(uname(&un) != -1)
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 4adef84cd39..0666ad1c2a5 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1378,7 +1378,7 @@ if (WINDOWS)
     # sets the 'working directory' for debugging from visual studio.
     if (NOT UNATTENDED)
         add_custom_command(
-            TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
+            TARGET ${VIEWER_BINARY_NAME} POST_BUILD
             COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe
             ARGS
               --solution 
-- 
GitLab


From c4298c4f378e90bffd13f81f33048483e49319fc Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Fri, 20 Nov 2009 10:25:02 -0800
Subject: [PATCH 480/557] Remove unused date code after review with Leyla. 
 Will unbreak Mac build.

---
 indra/newview/lldateutil.cpp | 41 ------------------------------------
 1 file changed, 41 deletions(-)

diff --git a/indra/newview/lldateutil.cpp b/indra/newview/lldateutil.cpp
index 1fe1715995b..10b7935caf0 100644
--- a/indra/newview/lldateutil.cpp
+++ b/indra/newview/lldateutil.cpp
@@ -37,35 +37,6 @@
 #include "lltrans.h"
 #include "llui.h"
 
-static S32 age_days_from_date(const std::string& date_string,
-							  const LLDate& now)
-{
-	// Convert string date to malleable representation
-	S32 month, day, year;
-	S32 matched = sscanf(date_string.c_str(), "%d/%d/%d", &month, &day, &year);
-	if (matched != 3) return S32_MIN;
-
-	// Create ISO-8601 date string
-	std::string iso8601_date_string =
-		llformat("%04d-%02d-%02dT00:00:00Z", year, month, day);
-	LLDate date(iso8601_date_string);
-
-	// Correct for the fact that account creation dates are in Pacific time,
-	// == UTC - 8
-	F64 date_secs_since_epoch = date.secondsSinceEpoch();
-	date_secs_since_epoch += 8.0 * 60.0 * 60.0;
-
-	// Convert seconds from epoch to seconds from now
-	F64 now_secs_since_epoch = now.secondsSinceEpoch();
-	F64 age_secs = now_secs_since_epoch - date_secs_since_epoch;
-
-	// We don't care about sub-day times
-	const F64 SEC_PER_DAY = 24.0 * 60.0 * 60.0;
-	S32 age_days = lltrunc(age_secs / SEC_PER_DAY);
-
-	return age_days;
-}
-
 static S32 DAYS_PER_MONTH_NOLEAP[] =
 	{ 31, 28, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
 static S32 DAYS_PER_MONTH_LEAP[] =
@@ -88,17 +59,6 @@ static S32 days_from_month(S32 year, S32 month)
 std::string LLDateUtil::ageFromDate(const std::string& date_string,
 									const LLDate& now)
 {
-#define BAD_DATE_MATH 0
-#if BAD_DATE_MATH
-	S32 age_days = age_days_from_date(date_string, now);
-	if (age_days == S32_MIN) return "???";
-	S32 age_years = age_days / 365;
-	age_days = age_days % 365;
-	// *NOTE: This is wrong.  Not all months have 30 days, but we don't have a library
-	// for relative date arithmetic. :-(  JC
-	S32 age_months = age_days / 30;
-	age_days = age_days % 30;
-#else
 	S32 born_month, born_day, born_year;
 	S32 matched = sscanf(date_string.c_str(), "%d/%d/%d", &born_month, &born_day, &born_year);
 	if (matched != 3) return "???";
@@ -135,7 +95,6 @@ std::string LLDateUtil::ageFromDate(const std::string& date_string,
 		age_months += 12;
 	}
 	S32 age_years = (now_year - born_year);
-#endif
 
 	// Noun pluralization depends on language
 	std::string lang = LLUI::getLanguage();
-- 
GitLab


From c9101f603a7969f4d46a7d8d911fa8805d926548 Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Fri, 20 Nov 2009 20:27:53 +0200
Subject: [PATCH 481/557] Implemented low task EXT-1153(FlatListView should
 support keyboard)

--HG--
branch : product-engine
---
 indra/llui/llflatlistview.cpp       | 241 ++++++++++++++++++++++++++++
 indra/llui/llflatlistview.h         |  25 +++
 indra/newview/llpanelpeople.cpp     |   7 +
 indra/newview/llparticipantlist.cpp |   3 +
 4 files changed, 276 insertions(+)

diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index 19f203b80c9..8de3a8a96f6 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -94,6 +94,9 @@ bool LLFlatListView::addItem(LLPanel * item, const LLSD& value /*= LLUUID::null*
 	item->setMouseDownCallback(boost::bind(&LLFlatListView::onItemMouseClick, this, new_pair, _4));
 	item->setRightMouseDownCallback(boost::bind(&LLFlatListView::onItemRightMouseClick, this, new_pair, _4));
 
+	// Children don't accept the focus
+	item->setTabStop(false);
+
 	rearrangeItems();
 	notifyParentItemsRectChanged();
 	return true;
@@ -282,6 +285,9 @@ void LLFlatListView::resetSelection(bool no_commit_on_deselection /*= false*/)
 	{
 		onCommit();
 	}
+
+	// Stretch selected items rect to ensure it won't be clipped
+	mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1));
 }
 
 void LLFlatListView::setNoItemsCommentText(const std::string& comment_text)
@@ -381,8 +387,34 @@ LLFlatListView::LLFlatListView(const LLFlatListView::Params& p)
 	//we don't need to stretch in vertical direction on reshaping by a parent
 	//no bottom following!
 	mItemsPanel->setFollows(FOLLOWS_LEFT | FOLLOWS_RIGHT | FOLLOWS_TOP);
+
+	LLViewBorder::Params params;
+	params.name("scroll border");
+	params.rect(getSelectedItemsRect());
+	params.visible(false);
+	params.bevel_style(LLViewBorder::BEVEL_IN);
+	mSelectedItemsBorder = LLUICtrlFactory::create<LLViewBorder> (params);
+	mItemsPanel->addChild( mSelectedItemsBorder );
 };
 
+// virtual
+void LLFlatListView::draw()
+{
+	// Highlight border if a child of this container has keyboard focus
+	if( mSelectedItemsBorder->getVisible() )
+	{
+		mSelectedItemsBorder->setKeyboardFocusHighlight( hasFocus() );
+	}
+	LLScrollContainer::draw();
+}
+
+// virtual
+BOOL LLFlatListView::postBuild()
+{
+	setTabStop(true);
+	return LLScrollContainer::postBuild();
+}
+
 void LLFlatListView::rearrangeItems()
 {
 	static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
@@ -444,6 +476,9 @@ void LLFlatListView::rearrangeItems()
 		// move top for next item in list
 		item_new_top -= (rc.getHeight() + mItemPad);
 	}
+
+	// Stretch selected items rect to ensure it won't be clipped
+	mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1));
 }
 
 void LLFlatListView::onItemMouseClick(item_pair_t* item_pair, MASK mask)
@@ -473,6 +508,64 @@ void LLFlatListView::onItemRightMouseClick(item_pair_t* item_pair, MASK mask)
 	onItemMouseClick(item_pair, mask);
 }
 
+BOOL LLFlatListView::handleKeyHere(KEY key, MASK mask)
+{
+	BOOL reset_selection = (mask != MASK_SHIFT);
+	BOOL handled = FALSE;
+	switch (key)
+	{
+		case KEY_RETURN:
+		{
+			if (mSelectedItemPairs.size() && mask == MASK_NONE)
+			{
+				mOnReturnSignal(this, getValue());
+				handled = TRUE;
+			}
+			break;
+		}
+		case KEY_UP:
+		{
+			if ( !selectNextItemPair(true, reset_selection) && reset_selection)
+			{
+				// If case we are in accordion tab notify parent to go to the previous accordion
+				notifyParent(LLSD().insert("action","select_prev"));
+			}
+			break;
+		}
+		case KEY_DOWN:
+		{
+			if ( !selectNextItemPair(false, reset_selection) && reset_selection)
+			{
+				// If case we are in accordion tab notify parent to go to the next accordion
+				notifyParent(LLSD().insert("action","select_next"));
+			}
+			break;
+		}
+		case 'A':
+		{
+			if(MASK_CONTROL & mask)
+			{
+				selectAll();
+				handled = TRUE;
+			}
+			break;
+		}
+		default:
+			break;
+	}
+
+	if ( key == KEY_UP || key == KEY_DOWN )
+	{
+		LLRect selcted_rect = getLastSelectedItemRect().stretch(1);
+		LLRect visible_rect = getVisibleContentRect();
+		if ( !visible_rect.contains (selcted_rect) )
+			scrollToShowRect(selcted_rect);
+		handled = TRUE;
+	}
+
+	return handled ? handled : LLScrollContainer::handleKeyHere(key, mask);
+}
+
 LLFlatListView::item_pair_t* LLFlatListView::getItemPair(LLPanel* item) const
 {
 	llassert(item);
@@ -552,6 +645,143 @@ bool LLFlatListView::selectItemPair(item_pair_t* item_pair, bool select)
 		onCommit();
 	}
 
+	setFocus(TRUE);
+
+	// Stretch selected items rect to ensure it won't be clipped
+	mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1));
+
+	return true;
+}
+
+LLRect LLFlatListView::getLastSelectedItemRect()
+{
+	if (!mSelectedItemPairs.size())
+	{
+		return LLRect::null;
+	}
+
+	return mSelectedItemPairs.back()->first->getRect();
+}
+
+LLRect LLFlatListView::getSelectedItemsRect()
+{
+	if (!mSelectedItemPairs.size())
+	{
+		return LLRect::null;
+	}
+	LLRect rc = getLastSelectedItemRect();
+	for ( pairs_const_iterator_t
+			  it = mSelectedItemPairs.begin(),
+			  it_end = mSelectedItemPairs.end();
+		  it != it_end; ++it )
+	{
+		rc.unionWith((*it)->first->getRect());
+	}
+	return rc;
+}
+
+// virtual
+bool LLFlatListView::selectNextItemPair(bool is_up_direction, bool reset_selection)
+{
+	// No items - no actions!
+	if ( !mItemPairs.size() )
+		return false;
+
+	item_pair_t* cur_sel_pair = NULL;
+	item_pair_t* to_sel_pair = NULL;
+
+	if ( mSelectedItemPairs.size() )
+	{
+		// Take the last selected pair
+		cur_sel_pair = mSelectedItemPairs.back();
+	}
+	else
+	{
+		// If there weren't selected items then choose the first one bases on given direction
+		cur_sel_pair = (is_up_direction) ? mItemPairs.back() : mItemPairs.front();
+		// Force selection to first item
+		to_sel_pair = cur_sel_pair;
+	}
+
+	// Bases on given direction choose next item to select
+	if ( is_up_direction )
+	{
+		// Find current selected item position in mItemPairs list
+		pairs_list_t::reverse_iterator sel_it = std::find(mItemPairs.rbegin(), mItemPairs.rend(), cur_sel_pair);
+
+		for (;++sel_it != mItemPairs.rend();)
+		{
+			// skip invisible items
+			if ( (*sel_it)->first->getVisible() )
+			{
+				to_sel_pair = *sel_it;
+				break;
+			}
+		}
+	}
+	else
+	{
+		// Find current selected item position in mItemPairs list
+		pairs_list_t::iterator sel_it = std::find(mItemPairs.begin(), mItemPairs.end(), cur_sel_pair);
+
+		for (;++sel_it != mItemPairs.end();)
+		{
+			// skip invisible items
+			if ( (*sel_it)->first->getVisible() )
+			{
+				to_sel_pair = *sel_it;
+				break;
+			}
+		}
+	}
+
+	if ( to_sel_pair )
+	{
+		bool select = true;
+
+		if ( reset_selection )
+		{
+			// Reset current selection if we were asked about it
+			resetSelection();
+		}
+		else
+		{
+			// If item already selected and no reset request than we should deselect last selected item.
+			select = (mSelectedItemPairs.end() == std::find(mSelectedItemPairs.begin(), mSelectedItemPairs.end(), to_sel_pair));
+		}
+
+		// Select/Deselect next item
+		selectItemPair(select ? to_sel_pair : cur_sel_pair, select);
+
+		return true;
+	}
+	return false;
+}
+
+bool LLFlatListView::selectAll()
+{
+	if (!mAllowSelection)
+		return false;
+
+	mSelectedItemPairs.clear();
+
+	for (pairs_const_iterator_t it= mItemPairs.begin(); it != mItemPairs.end(); ++it)
+	{
+		item_pair_t* item_pair = *it;
+		mSelectedItemPairs.push_back(item_pair);
+		//a way of notifying panel of selection state changes
+		LLPanel* item = item_pair->first;
+		item->setValue(SELECTED_EVENT);
+	}
+
+	if (mCommitOnSelectionChange)
+	{
+		onCommit();
+	}
+
+	// Stretch selected items rect to ensure it won't be clipped
+	mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1));
+
 	return true;
 }
 
@@ -670,4 +900,15 @@ void LLFlatListView::getValues(std::vector<LLSD>& values) const
 	}
 }
 
+// virtual
+void LLFlatListView::onFocusReceived()
+{
+	mSelectedItemsBorder->setVisible(TRUE);
+}
+// virtual
+void LLFlatListView::onFocusLost()
+{
+	mSelectedItemsBorder->setVisible(FALSE);
+}
+
 //EOF
diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h
index 97772bc677b..eac947a0d76 100644
--- a/indra/llui/llflatlistview.h
+++ b/indra/llui/llflatlistview.h
@@ -113,6 +113,10 @@ class LLFlatListView : public LLScrollContainer
 	
 	virtual ~LLFlatListView() { clear(); };
 
+	/**
+	 * Connects callback to signal called when Return key is pressed.
+	 */
+	boost::signals2::connection setReturnCallback( const commit_signal_t::slot_type& cb ) { return mOnReturnSignal.connect(cb); }
 
 	/** Overridden LLPanel's reshape, height is ignored, the list sets its height to accommodate all items */
 	virtual void reshape(S32 width, S32 height, BOOL called_from_parent  = TRUE);
@@ -318,6 +322,10 @@ class LLFlatListView : public LLScrollContainer
 
 	virtual bool selectItemPair(item_pair_t* item_pair, bool select);
 
+	virtual bool selectNextItemPair(bool is_up_direction, bool reset_selection);
+
+	virtual bool selectAll();
+
 	virtual bool isSelected(item_pair_t* item_pair) const;
 
 	virtual bool removeItemPair(item_pair_t* item_pair);
@@ -331,6 +339,19 @@ class LLFlatListView : public LLScrollContainer
 	 */
 	void notifyParentItemsRectChanged();
 
+	virtual BOOL handleKeyHere(KEY key, MASK mask);
+
+	virtual BOOL postBuild();
+
+	virtual void onFocusReceived();
+
+	virtual void onFocusLost();
+
+	virtual void draw();
+
+	LLRect getLastSelectedItemRect();
+
+	LLRect getSelectedItemsRect();
 
 private:
 
@@ -381,6 +402,10 @@ class LLFlatListView : public LLScrollContainer
 	LLRect mPrevNotifyParentRect;
 
 	LLTextBox* mNoItemsCommentTextbox;
+
+	LLViewBorder* mSelectedItemsBorder;
+
+	commit_signal_t	mOnReturnSignal;
 };
 
 #endif
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 4dc88725573..29f7cc18518 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -536,8 +536,15 @@ BOOL LLPanelPeople::postBuild()
 	mNearbyList->setCommitCallback(boost::bind(&LLPanelPeople::onAvatarListCommitted, this, mNearbyList));
 	mRecentList->setCommitCallback(boost::bind(&LLPanelPeople::onAvatarListCommitted, this, mRecentList));
 
+	// Set openning IM as default on return action for avatar lists
+	mOnlineFriendList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this));
+	mAllFriendList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this));
+	mNearbyList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this));
+	mRecentList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this));
+
 	mGroupList->setDoubleClickCallback(boost::bind(&LLPanelPeople::onChatButtonClicked, this));
 	mGroupList->setCommitCallback(boost::bind(&LLPanelPeople::updateButtons, this));
+	mGroupList->setReturnCallback(boost::bind(&LLPanelPeople::onChatButtonClicked, this));
 
 	LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>("tab_all");
 	accordion_tab->setDropDownStateChangedCallback(
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 13bd059d45e..4ee9cba69ca 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -65,6 +65,8 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
 	mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData"));
 	mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
 	mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2));
+    // Set onAvatarListDoubleClicked as default on_return action.
+	mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
 
 	mParticipantListMenu = new LLParticipantListMenu(*this);
 	mAvatarList->setContextMenu(mParticipantListMenu);
@@ -99,6 +101,7 @@ void LLParticipantList::setSpeakingIndicatorsVisible(BOOL visible)
 
 void LLParticipantList::onAvatarListDoubleClicked(LLAvatarList* list)
 {
+	// NOTE(EM): Should we check if there is multiple selection and start conference if it is so?
 	LLUUID clicked_id = list->getSelectedUUID();
 
 	if (clicked_id.isNull() || clicked_id == gAgent.getID())
-- 
GitLab


From 75138ddfb27416b8740df35fcc0eb6ed3643452f Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Fri, 20 Nov 2009 10:46:58 -0800
Subject: [PATCH 482/557] Fix main loop to llerrs on memory alloc failure, was
 masked by misuse of LLFLoaterReg with LLFloaterMemLeak. Reviewed with Bao

---
 indra/newview/llappviewer.cpp | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index a5ca06ce306..4f2d3e96455 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -985,7 +985,8 @@ bool LLAppViewer::mainLoop()
 			
 #endif
 			//memory leaking simulation
-			LLFloaterMemLeak* mem_leak_instance = LLFloaterReg::getTypedInstance<LLFloaterMemLeak>("mem_leaking");
+			LLFloaterMemLeak* mem_leak_instance =
+				LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
 			if(mem_leak_instance)
 			{
 				mem_leak_instance->idle() ;				
@@ -1171,7 +1172,8 @@ bool LLAppViewer::mainLoop()
 		catch(std::bad_alloc)
 		{			
 			//stop memory leaking simulation
-			LLFloaterMemLeak* mem_leak_instance = LLFloaterReg::getTypedInstance<LLFloaterMemLeak>("mem_leaking");
+			LLFloaterMemLeak* mem_leak_instance =
+				LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
 			if(mem_leak_instance)
 			{
 				mem_leak_instance->stop() ;				
@@ -1199,7 +1201,8 @@ bool LLAppViewer::mainLoop()
 			llwarns << "Bad memory allocation when saveFinalSnapshot() is called!" << llendl ;
 
 			//stop memory leaking simulation
-			LLFloaterMemLeak* mem_leak_instance = LLFloaterReg::getTypedInstance<LLFloaterMemLeak>("mem_leaking");
+			LLFloaterMemLeak* mem_leak_instance =
+				LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
 			if(mem_leak_instance)
 			{
 				mem_leak_instance->stop() ;				
-- 
GitLab


From 172cba3c42027c5abc277e571dcd18b6fcc5fe8c Mon Sep 17 00:00:00 2001
From: "Mark Palange (Mani)" <palange@lindenlab.com>
Date: Fri, 20 Nov 2009 11:21:24 -0800
Subject: [PATCH 483/557] Added two more procedurally created dirs to .hgignore
 to reduce the clutter of an hg status

---
 .hgignore | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/.hgignore b/.hgignore
index 4d98acf5d97..886af2b0079 100644
--- a/.hgignore
+++ b/.hgignore
@@ -13,6 +13,7 @@ LICENSES
 indra/.distcc
 indra/build-darwin-*
 indra/build-vc[0-9]*
+indra/CMakeFiles
 indra/lib/mono/1.0/*.dll
 indra/lib/mono/indra/*.dll
 indra/lib/mono/indra/*.exe
@@ -31,6 +32,7 @@ indra/newview/mozilla-universal-darwin.tgz
 indra/newview/res-sdl
 indra/newview/vivox-runtime
 indra/server-linux-*
+indra/temp
 indra/test/linden_file.dat
 indra/test_apps/llmediatest/dependencies/i686-win32
 indra/test_apps/terrain_mule/*.dll
-- 
GitLab


From f80b5ea3612fec02c9ed37e736774bde5ff43703 Mon Sep 17 00:00:00 2001
From: skolb <none@none>
Date: Fri, 20 Nov 2009 11:36:18 -0800
Subject: [PATCH 484/557] DEV-42556 Viewer Preference for Parcel media cannot
 be enabled/disabled

---
 .../default/xui/en/panel_preferences_privacy.xml      | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
index 1b9a99f90b0..23832ba120b 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -86,7 +86,16 @@
      name="autoplay_enabled"
      top_pad="10"
      width="350" />
-    <text
+    <check_box
+     control_name="ParcelMediaAutoPlayEnable"
+     height="16"
+     label="Automatically Play Parcel Media"
+     layout="topleft"
+     left="30"
+     name="parcel_autoplay_enabled"
+     top_pad="10"
+     width="350" />
+   <text
       type="string"
     length="1"
     follows="left|top"
-- 
GitLab


From f4913d55b035cfa7dd476dc6e880ba49a3046fb0 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Fri, 20 Nov 2009 12:24:37 -0800
Subject: [PATCH 485/557] Fix broken group "Invite" button from Erica's changes
 yesterday.

---
 indra/newview/skins/default/xui/en/panel_group_roles.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml
index cdbd861efca..5bae5c2711a 100644
--- a/indra/newview/skins/default/xui/en/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml
@@ -244,9 +244,9 @@ things in this group. There&apos;s a broad variety of Abilities.
      layout="topleft"
      follows="left|top"
      left="0"
+     mouse_opaque="false" 
      name="members_footer"
      top="300"
-     top_delta="0"
      visible="false"
      width="310">
         <text
-- 
GitLab


From dd3c7a1a25873755212ee7842cde01f5f244256a Mon Sep 17 00:00:00 2001
From: brad kittenbrink <brad@lindenlab.com>
Date: Fri, 20 Nov 2009 15:35:19 -0500
Subject: [PATCH 486/557] Fix for errors with integration tests failing to find
 libcrypto.so.0.9.7

---
 indra/cmake/Copy3rdPartyLibs.cmake | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index af407d52def..bbf31f92972 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -209,7 +209,7 @@ elseif(LINUX)
         libapr-1.so.0
         libaprutil-1.so.0
         libatk-1.0.so
-        libcrypto.so
+        libcrypto.so.0.9.7
         libdb-4.2.so
         libexpat.so
         libgmock_main.so
-- 
GitLab


From 70a0dbe8f8466438e12a45e70d0f901b9324f228 Mon Sep 17 00:00:00 2001
From: Vadim Savchuk <vsavchuk@productengine.com>
Date: Fri, 20 Nov 2009 22:57:59 +0200
Subject: [PATCH 487/557] Renamed classes and files for "Me" task panel for
 better readability.

Renamed files:
- indra/newview/llpanelmeprofile.{cpp,h} to llpanelme.{cpp,h}
- panel_me_profile.xml to panel_me.xml
- panel_profile_user.xml to panel_my_profile.xml

Renamed classes:
- LLPanelAvatarMeProfile to LLPanelMyProfile
- LLPanelMeProfile to LLPanelMe
- LLPanelMeProfileEdit to LLPanelMyProfileEdit

--HG--
branch : product-engine
---
 indra/llui/llflatlistview.h                   |   2 +-
 indra/newview/CMakeLists.txt                  |   4 +-
 indra/newview/llavataractions.cpp             |   2 +-
 indra/newview/llpanelavatar.cpp               |  22 +-
 indra/newview/llpanelavatar.h                 |   8 +-
 indra/newview/llpanelme.cpp                   | 233 ++++++++++
 indra/newview/llpanelme.h                     | 110 +++++
 indra/newview/llpanelpicks.h                  |   2 +-
 indra/newview/llpanelprofile.h                |   2 +-
 .../newview/skins/default/xui/de/panel_me.xml |   7 +
 .../newview/skins/default/xui/en/panel_me.xml |  52 +++
 .../skins/default/xui/en/panel_my_profile.xml | 426 ++++++++++++++++++
 .../skins/default/xui/en/panel_side_tray.xml  |   4 +-
 .../newview/skins/default/xui/fr/panel_me.xml |   7 +
 .../newview/skins/default/xui/ja/panel_me.xml |   7 +
 15 files changed, 865 insertions(+), 23 deletions(-)
 create mode 100644 indra/newview/llpanelme.cpp
 create mode 100644 indra/newview/llpanelme.h
 create mode 100644 indra/newview/skins/default/xui/de/panel_me.xml
 create mode 100644 indra/newview/skins/default/xui/en/panel_me.xml
 create mode 100644 indra/newview/skins/default/xui/en/panel_my_profile.xml
 create mode 100644 indra/newview/skins/default/xui/fr/panel_me.xml
 create mode 100644 indra/newview/skins/default/xui/ja/panel_me.xml

diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h
index 97772bc677b..8a357a49d02 100644
--- a/indra/llui/llflatlistview.h
+++ b/indra/llui/llflatlistview.h
@@ -50,7 +50,7 @@ class LLTextBox;
  * is ignored. The option "keep_one_selected" forces at least one item to be selected at any time (only for mouse events on items)
  * since any item of the list was selected.
  *
- * Examples of using this control are presented in Picks panel (Me Profile and Profile View), where this control is used to 
+ * Examples of using this control are presented in Picks panel (My Profile and Profile View), where this control is used to 
  * manage the list of pick items.
  *
  * ASSUMPTIONS AND STUFF
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index e7458529bee..3681f3eb930 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -324,7 +324,7 @@ set(viewer_SOURCE_FILES
     llpanelmediasettingsgeneral.cpp
     llpanelmediasettingspermissions.cpp
     llpanelmediasettingssecurity.cpp
-    llpanelmeprofile.cpp
+    llpanelme.cpp
     llpanelobject.cpp
     llpanelobjectinventory.cpp
     llpaneloutfitsinventory.cpp
@@ -818,7 +818,7 @@ set(viewer_HEADER_FILES
     llpanelmediasettingsgeneral.h
     llpanelmediasettingspermissions.h
     llpanelmediasettingssecurity.h
-    llpanelmeprofile.h
+    llpanelme.h
     llpanelobject.h
     llpanelobjectinventory.h
     llpaneloutfitsinventory.h
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 0844cca7662..130f729df07 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -297,7 +297,7 @@ void LLAvatarActions::showProfile(const LLUUID& id)
 		//Show own profile
 		if(gAgent.getID() == id)
 		{
-			LLSideTray::getInstance()->showPanel("panel_me_profile", params);
+			LLSideTray::getInstance()->showPanel("panel_me", params);
 		}
 		//Show other user profile
 		else
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 2254684f215..146be0df7f0 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -119,7 +119,7 @@ BOOL LLDropTarget::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
 static LLDefaultChildRegistry::Register<LLDropTarget> r("drop_target");
 
 static LLRegisterPanelClassWrapper<LLPanelAvatarProfile> t_panel_profile("panel_profile");
-static LLRegisterPanelClassWrapper<LLPanelAvatarMeProfile> t_panel_me_profile("panel_me_profile");
+static LLRegisterPanelClassWrapper<LLPanelMyProfile> t_panel_my_profile("panel_my_profile");
 static LLRegisterPanelClassWrapper<LLPanelAvatarNotes> t_panel_notes("panel_notes");
 
 //-----------------------------------------------------------------------------
@@ -585,19 +585,19 @@ void LLPanelAvatarProfile::onOverflowButtonClicked()
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 
-LLPanelAvatarMeProfile::LLPanelAvatarMeProfile()
+LLPanelMyProfile::LLPanelMyProfile()
 : LLPanelAvatarProfile()
 {
 }
 
-BOOL LLPanelAvatarMeProfile::postBuild()
+BOOL LLPanelMyProfile::postBuild()
 {
 	LLPanelAvatarProfile::postBuild();
 
 	mStatusCombobox = getChild<LLComboBox>("status_combo");
 
-	childSetCommitCallback("status_combo", boost::bind(&LLPanelAvatarMeProfile::onStatusChanged, this), NULL);
-	childSetCommitCallback("status_me_message_text", boost::bind(&LLPanelAvatarMeProfile::onStatusMessageChanged, this), NULL);
+	childSetCommitCallback("status_combo", boost::bind(&LLPanelMyProfile::onStatusChanged, this), NULL);
+	childSetCommitCallback("status_me_message_text", boost::bind(&LLPanelMyProfile::onStatusMessageChanged, this), NULL);
 
 	resetControls();
 	resetData();
@@ -605,12 +605,12 @@ BOOL LLPanelAvatarMeProfile::postBuild()
 	return TRUE;
 }
 
-void LLPanelAvatarMeProfile::onOpen(const LLSD& key)
+void LLPanelMyProfile::onOpen(const LLSD& key)
 {
 	LLPanelProfileTab::onOpen(key);
 }
 
-void LLPanelAvatarMeProfile::processProfileProperties(const LLAvatarData* avatar_data)
+void LLPanelMyProfile::processProfileProperties(const LLAvatarData* avatar_data)
 {
 	fillCommonData(avatar_data);
 
@@ -621,7 +621,7 @@ void LLPanelAvatarMeProfile::processProfileProperties(const LLAvatarData* avatar
 	fillAccountStatus(avatar_data);
 }
 
-void LLPanelAvatarMeProfile::fillStatusData(const LLAvatarData* avatar_data)
+void LLPanelMyProfile::fillStatusData(const LLAvatarData* avatar_data)
 {
 	std::string status;
 	if (gAgent.getAFK())
@@ -640,7 +640,7 @@ void LLPanelAvatarMeProfile::fillStatusData(const LLAvatarData* avatar_data)
 	mStatusCombobox->setValue(status);
 }
 
-void LLPanelAvatarMeProfile::resetControls()
+void LLPanelMyProfile::resetControls()
 {
 	childSetVisible("status_panel", false);
 	childSetVisible("profile_buttons_panel", false);
@@ -650,7 +650,7 @@ void LLPanelAvatarMeProfile::resetControls()
 	childSetVisible("profile_me_buttons_panel", true);
 }
 
-void LLPanelAvatarMeProfile::onStatusChanged()
+void LLPanelMyProfile::onStatusChanged()
 {
 	LLSD::String status = mStatusCombobox->getValue().asString();
 
@@ -672,7 +672,7 @@ void LLPanelAvatarMeProfile::onStatusChanged()
 	}
 }
 
-void LLPanelAvatarMeProfile::onStatusMessageChanged()
+void LLPanelMyProfile::onStatusMessageChanged()
 {
 	updateData();
 }
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index a0caf0c9156..f2a744dde0a 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -47,7 +47,7 @@ enum EOnlineStatus
 };
 
 /**
-* Base class for any Profile View or Me Profile Panel.
+* Base class for any Profile View or My Profile Panel.
 */
 class LLPanelProfileTab
 	: public LLPanel
@@ -148,7 +148,7 @@ class LLPanelAvatarProfile
 	virtual void processGroupProperties(const LLAvatarGroups* avatar_groups);
 
 	/**
-	 * Fills common for Avatar profile and Me Profile fields.
+	 * Fills common for Avatar profile and My Profile fields.
 	 */
 	virtual void fillCommonData(const LLAvatarData* avatar_data);
 
@@ -190,11 +190,11 @@ class LLPanelAvatarProfile
 /**
  * Panel for displaying own first and second life related info.
  */
-class LLPanelAvatarMeProfile
+class LLPanelMyProfile
 	: public LLPanelAvatarProfile
 {
 public:
-	LLPanelAvatarMeProfile();
+	LLPanelMyProfile();
 
 	/*virtual*/ BOOL postBuild();
 
diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp
new file mode 100644
index 00000000000..0c7da30b033
--- /dev/null
+++ b/indra/newview/llpanelme.cpp
@@ -0,0 +1,233 @@
+/** 
+ * @file llpanelme.cpp
+ * @brief Side tray "Me" (My Profile) panel
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelprofile.h"
+#include "llavatarconstants.h"
+#include "llpanelme.h"
+#include "llagent.h"
+#include "llagentwearables.h"
+#include "lliconctrl.h"
+#include "lltabcontainer.h"
+#include "lltexturectrl.h"
+
+#define PICKER_SECOND_LIFE "2nd_life_pic"
+#define PICKER_FIRST_LIFE "real_world_pic"
+#define PANEL_PROFILE "panel_profile"
+
+static LLRegisterPanelClassWrapper<LLPanelMyProfileEdit> t_panel_me_profile_edit("edit_profile_panel");
+static LLRegisterPanelClassWrapper<LLPanelMe> t_panel_me_profile("panel_me_profile_view");
+
+LLPanelMe::LLPanelMe(void) 
+ : LLPanelProfile()
+ , mEditPanel(NULL)
+{
+	setAvatarId(gAgent.getID());
+}
+
+BOOL LLPanelMe::postBuild()
+{
+	LLPanelProfile::postBuild();
+
+	getTabContainer()[PANEL_PROFILE]->childSetAction("edit_profile_btn", boost::bind(&LLPanelMe::onEditProfileClicked, this), this);
+	getTabContainer()[PANEL_PROFILE]->childSetAction("edit_appearance_btn", boost::bind(&LLPanelMe::onEditAppearanceClicked, this), this);
+
+	return TRUE;
+}
+
+void LLPanelMe::onOpen(const LLSD& key)
+{
+	LLPanelProfile::onOpen(key);
+}
+
+void LLPanelMe::buildEditPanel()
+{
+	if (NULL == mEditPanel)
+	{
+		mEditPanel = new LLPanelMyProfileEdit();
+		mEditPanel->childSetAction("save_btn", boost::bind(&LLPanelMe::onSaveChangesClicked, this), this);
+		mEditPanel->childSetAction("cancel_btn", boost::bind(&LLPanelMe::onCancelClicked, this), this);
+	}
+}
+
+
+void LLPanelMe::onEditProfileClicked()
+{
+	buildEditPanel();
+	togglePanel(mEditPanel);
+	mEditPanel->onOpen(getAvatarId());
+}
+
+void LLPanelMe::onEditAppearanceClicked()
+{
+	if (gAgentWearables.areWearablesLoaded())
+	{
+		gAgent.changeCameraToCustomizeAvatar();
+	}
+}
+
+void LLPanelMe::onSaveChangesClicked()
+{
+	LLAvatarData data = LLAvatarData();
+	data.avatar_id = gAgent.getID();
+	data.image_id = mEditPanel->getChild<LLTextureCtrl>(PICKER_SECOND_LIFE)->getImageAssetID();
+	data.fl_image_id = mEditPanel->getChild<LLTextureCtrl>(PICKER_FIRST_LIFE)->getImageAssetID();
+	data.about_text = mEditPanel->childGetValue("sl_description_edit").asString();
+	data.fl_about_text = mEditPanel->childGetValue("fl_description_edit").asString();
+	data.profile_url = mEditPanel->childGetValue("homepage_edit").asString();
+	data.allow_publish = mEditPanel->childGetValue("show_in_search_checkbox");
+
+	LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate(&data);
+	togglePanel(mEditPanel);
+	onOpen(getAvatarId());
+}
+
+void LLPanelMe::onCancelClicked()
+{
+	togglePanel(mEditPanel);
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLPanelMyProfileEdit::LLPanelMyProfileEdit() 
+ : LLPanelMyProfile()
+{
+	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_edit_profile.xml");
+
+	setAvatarId(gAgent.getID());
+}
+
+void LLPanelMyProfileEdit::onOpen(const LLSD& key)
+{
+	resetData();
+
+	// Disable editing until data is loaded, or edited fields will be overwritten when data
+	// is loaded.
+	enableEditing(false);
+	LLPanelMyProfile::onOpen(getAvatarId());
+}
+
+void LLPanelMyProfileEdit::processProperties(void* data, EAvatarProcessorType type)
+{
+	if(APT_PROPERTIES == type)
+	{
+		const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data);
+		if(avatar_data && getAvatarId() == avatar_data->avatar_id)
+		{
+			// *TODO dzaporozhan
+			// Workaround for ticket EXT-1099, waiting for fix for ticket EXT-1128
+			enableEditing(true);
+			processProfileProperties(avatar_data);
+			LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this);
+		}
+	}
+}
+
+void LLPanelMyProfileEdit::processProfileProperties(const LLAvatarData* avatar_data)
+{
+	fillCommonData(avatar_data);
+
+	fillOnlineStatus(avatar_data);
+
+	fillPartnerData(avatar_data);
+
+	fillAccountStatus(avatar_data);
+
+	childSetValue("show_in_search_checkbox", (BOOL)(avatar_data->flags & AVATAR_ALLOW_PUBLISH));
+
+	std::string first, last;
+	BOOL found = gCacheName->getName(avatar_data->avatar_id, first, last);
+	if (found)
+	{
+		childSetTextArg("name_text", "[FIRST]", first);
+		childSetTextArg("name_text", "[LAST]", last);
+	}
+}
+
+BOOL LLPanelMyProfileEdit::postBuild()
+{
+	initTexturePickerMouseEvents();
+
+	childSetTextArg("partner_edit_link", "[URL]", getString("partner_edit_link_url"));
+
+	return LLPanelAvatarProfile::postBuild();
+}
+/**
+ * Inits map with texture picker and appropriate edit icon.
+ * Sets callbacks of Mouse Enter and Mouse Leave signals of Texture Pickers 
+ */
+void LLPanelMyProfileEdit::initTexturePickerMouseEvents()
+{
+	LLTextureCtrl* text_pic = getChild<LLTextureCtrl>(PICKER_SECOND_LIFE);	
+	LLIconCtrl* text_icon = getChild<LLIconCtrl>("2nd_life_edit_icon");
+	mTextureEditIconMap[text_pic->getName()] = text_icon;
+	text_pic->setMouseEnterCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseEnter, this, _1));
+	text_pic->setMouseLeaveCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseLeave, this, _1));
+	text_icon->setVisible(FALSE);
+
+	text_pic = getChild<LLTextureCtrl>(PICKER_FIRST_LIFE);
+	text_icon = getChild<LLIconCtrl>("real_world_edit_icon");
+	mTextureEditIconMap[text_pic->getName()] = text_icon;
+	text_pic->setMouseEnterCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseEnter, this, _1));
+	text_pic->setMouseLeaveCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseLeave, this, _1));
+	text_icon->setVisible(FALSE);
+}
+
+void LLPanelMyProfileEdit::resetData()
+{
+	LLPanelMyProfile::resetData();
+
+	childSetTextArg("name_text", "[FIRST]", LLStringUtil::null);
+	childSetTextArg("name_text", "[LAST]", LLStringUtil::null);
+}
+
+void LLPanelMyProfileEdit::onTexturePickerMouseEnter(LLUICtrl* ctrl)
+{
+	mTextureEditIconMap[ctrl->getName()]->setVisible(TRUE);
+}
+void LLPanelMyProfileEdit::onTexturePickerMouseLeave(LLUICtrl* ctrl)
+{
+	mTextureEditIconMap[ctrl->getName()]->setVisible(FALSE);
+}
+
+void LLPanelMyProfileEdit::enableEditing(bool enable)
+{
+	childSetEnabled("2nd_life_pic", enable);
+	childSetEnabled("real_world_pic", enable);
+	childSetEnabled("sl_description_edit", enable);
+	childSetEnabled("fl_description_edit", enable);
+	childSetEnabled("homepage_edit", enable);
+	childSetEnabled("show_in_search_checkbox", enable);
+}
diff --git a/indra/newview/llpanelme.h b/indra/newview/llpanelme.h
new file mode 100644
index 00000000000..e16532a445c
--- /dev/null
+++ b/indra/newview/llpanelme.h
@@ -0,0 +1,110 @@
+/** 
+ * @file llpanelme.h
+ * @brief Side tray "Me" (My Profile) panel
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELMEPROFILE_H
+#define LL_LLPANELMEPROFILE_H
+
+#include "llpanel.h"
+#include "llpanelavatar.h"
+
+class LLPanelMyProfileEdit;
+class LLPanelProfile;
+class LLIconCtrl;
+
+/**
+* Panel for displaying Agent's profile, it consists of two sub panels - Profile
+* and Picks. 
+* LLPanelMe allows user to edit his profile and picks.
+*/
+class LLPanelMe : public LLPanelProfile
+{
+	LOG_CLASS(LLPanelMe);
+
+public:
+
+	LLPanelMe();
+
+	/*virtual*/ void onOpen(const LLSD& key);
+
+	/*virtual*/ BOOL postBuild();
+
+private:
+
+	void buildEditPanel();
+
+	void onEditProfileClicked();
+	void onEditAppearanceClicked();
+	void onSaveChangesClicked();
+	void onCancelClicked();
+
+	LLPanelMyProfileEdit *  mEditPanel;
+
+};
+
+class LLPanelMyProfileEdit : public LLPanelMyProfile
+{
+	LOG_CLASS(LLPanelMyProfileEdit);
+
+public:
+
+	LLPanelMyProfileEdit();
+
+	/*virtual*/void processProperties(void* data, EAvatarProcessorType type);
+	
+	/*virtual*/BOOL postBuild();
+
+	/*virtual*/ void onOpen(const LLSD& key);
+
+protected:	
+
+	/*virtual*/void resetData();
+
+	void processProfileProperties(const LLAvatarData* avatar_data);
+
+private:
+	void initTexturePickerMouseEvents();
+	void onTexturePickerMouseEnter(LLUICtrl* ctrl);
+	void onTexturePickerMouseLeave(LLUICtrl* ctrl);
+
+	/**
+	 * Enabled/disables controls to prevent overwriting edited data upon receiving
+	 * current data from server.
+	 */
+	void enableEditing(bool enable);
+
+private:
+	// map TexturePicker name => Edit Icon pointer should be visible while hovering Texture Picker
+	typedef std::map<std::string, LLIconCtrl*> texture_edit_icon_map_t;
+	texture_edit_icon_map_t mTextureEditIconMap;
+};
+
+#endif // LL_LLPANELMEPROFILE_H
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index 4b90ea5048b..b17b6d6fe94 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -83,7 +83,7 @@ class LLPanelPicks
 	LLClassifiedItem* getSelectedClassifiedItem();
 
 	//*NOTE top down approch when panel toggling is done only by 
-	// parent panels failed to work (picks related code was in me profile panel)
+	// parent panels failed to work (picks related code was in my profile panel)
 	void setProfilePanel(LLPanelProfile* profile_panel);
 
 private:
diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h
index e0b827c9865..e216eb70f26 100644
--- a/indra/newview/llpanelprofile.h
+++ b/indra/newview/llpanelprofile.h
@@ -40,7 +40,7 @@
 class LLTabContainer;
 
 /**
-* Base class for Profile View and Me Profile.
+* Base class for Profile View and My Profile.
 */
 class LLPanelProfile : public LLPanel
 {
diff --git a/indra/newview/skins/default/xui/de/panel_me.xml b/indra/newview/skins/default/xui/de/panel_me.xml
new file mode 100644
index 00000000000..a685a430f0b
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_me.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ich" name="panel_me">
+	<tab_container name="tabs">
+		<panel label="Mein Profil" name="panel_profile"/>
+		<panel label="Auswahl" name="panel_picks"/>
+	</tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_me.xml b/indra/newview/skins/default/xui/en/panel_me.xml
new file mode 100644
index 00000000000..a99777848b8
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_me.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ border="false"
+ follows="all"
+ height="570"
+ label="My Profile"
+ layout="topleft"
+ left="0"
+ name="panel_me"
+ top="0"
+ width="333">
+   <!--<text
+    type="string"
+    follows="top|left|right"
+    font="SansSerifHugeBold"
+    height="20"
+    layout="topleft"
+    left="15"
+    name="user_name"
+    text_color="white"
+    top="0"
+    mouse_opaque="true"
+    width="280">
+          (Loading...)
+   </text> -->
+    <tab_container
+     follows="all"
+     height="575"
+     halign="center"
+     layout="topleft"
+     left="10"
+     name="tabs"
+     tab_min_width="95"
+     tab_height="30"
+     tab_position="top"
+     top_pad="10"
+     width="313">
+      <panel
+         class="panel_my_profile"
+         filename="panel_my_profile.xml"
+         label="PROFILE"
+         help_topic="panel_my_profile_tab"
+         name="panel_profile" />
+      <panel
+         class="panel_picks"
+         filename="panel_picks.xml"
+         label="PICKS"
+         help_topic="panel_my_picks_tab"
+         name="panel_picks" />
+    </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml
new file mode 100644
index 00000000000..e04eda94649
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml
@@ -0,0 +1,426 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ follows="all"
+ height="535"
+ label="Profile"
+ layout="topleft"
+ left="0"
+ name="panel_profile"
+ top="0"
+ width="313">
+    <string
+     name="CaptionTextAcctInfo">
+        [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+    </string>
+    <string
+     name="payment_update_link_url">
+        http://www.secondlife.com/account/billing.php?lang=en
+    </string>
+    <string
+     name="partner_edit_link_url">
+        http://www.secondlife.com/account/partners.php?lang=en
+    </string>
+    <string
+     name="my_account_link_url"
+     value="http://secondlife.com/account" />
+    <string
+     name="no_partner_text"
+     value="None" />
+ <scroll_container
+     color="DkGray2"
+     follows="all"
+     height="485"
+     layout="topleft"
+     name="profile_scroll"
+     reserve_scroll_corner="true"
+     opaque="true"
+     top="0"
+     width="313">
+      <panel
+         name="scroll_content_panel"
+         follows="left|top|right"
+          height="485"
+         layout="topleft"
+         top="0"
+         left="0"
+         width="313">
+	 <panel
+         follows="left|top"
+         height="117"
+         layout="topleft"
+         left="10"
+         name="second_life_image_panel"
+         top="0"
+         width="280">
+            <texture_picker
+             allow_no_texture="true"
+             default_image_name="None"
+             enabled="false"
+             follows="top|left"
+             height="117"
+             layout="topleft"
+             left="0"
+             name="2nd_life_pic"
+             top="10"
+             width="102" />
+           <icon
+           height="102"
+           image_name="Blank"
+           layout="topleft"
+           name="2nd_life_edit_icon"
+           label=""
+           left="0"
+           tool_tip="Click the Edit Profile button below to change image"
+           top="10"
+           width="102" />
+            <text
+             follows="left|top|right"
+	     font.style="BOLD"
+             height="15"
+             layout="topleft"
+             left_pad="10"
+             name="title_sl_descr_text"
+             text_color="white"
+             top_delta="0"
+             value="[SECOND_LIFE]:"
+             width="165" />
+            <expandable_text
+             follows="left|top|right"
+             height="95"
+             layout="topleft"
+             left="107"
+             textbox.max_length="512"
+             name="sl_description_edit"
+             top_pad="-3"
+             width="173"
+             expanded_bg_visible="true"
+             expanded_bg_color="DkGray">
+                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum.
+            </expandable_text>
+        </panel>
+        <panel
+         follows="left|top"
+         height="117"
+         layout="topleft"
+	 top_pad="10"
+         left="10"
+         name="first_life_image_panel"
+         width="280">
+            <texture_picker
+             allow_no_texture="true"
+             default_image_name="None"
+             enabled="false"
+             follows="top|left"
+             height="117"
+             layout="topleft"
+             left="0"
+             name="real_world_pic"
+             width="102" />
+           <icon
+           height="102"
+           image_name="Blank"
+           layout="topleft"
+           name="real_world_edit_icon"
+           label=""
+           left="0"
+           tool_tip="Click the Edit Profile button below to change image"
+           top="4"
+           width="102" />
+            <text
+             follows="left|top|right"
+	     font.style="BOLD"
+             height="15"
+             layout="topleft"
+             left_pad="10"
+             name="title_rw_descr_text"
+             text_color="white"
+             top_delta="0"
+             value="Real World:"
+             width="165" />
+            <expandable_text
+             follows="left|top|right"
+             height="95"
+             layout="topleft"
+             left="107"
+             textbox.max_length="512"
+             name="fl_description_edit"
+             top_pad="-3"
+             width="173"
+             expanded_bg_visible="true"
+             expanded_bg_color="DkGray">
+                Lorem ipsum dolor sit amet, consectetur adlkjpiscing elit moose moose. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet. adipiscing elit. Aenean rigviverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet sorbet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum.
+            </expandable_text>
+        </panel>
+	
+	
+	<!-- <panel
+       name="lifes_images_panel"
+         follows="left|top|right"
+         height="244"
+         layout="topleft"
+         top="0"
+         left="0"
+         width="285">
+	 <panel
+         follows="left|top"
+         height="117"
+         layout="topleft"
+         left="10"
+         name="second_life_image_panel"
+         top="0"
+         width="285">
+          <text
+             follows="left|top|right"
+	     font.style="BOLD"
+             height="15"
+             layout="topleft"
+             left="0"
+            name="second_life_photo_title_text"
+             text_color="white"
+             value="[SECOND_LIFE]:"
+             width="170" />
+            <texture_picker
+             allow_no_texture="true"
+             default_image_name="None"
+             enabled="false"
+             follows="top|left"
+             height="117"
+             layout="topleft"
+             left="0"
+             name="2nd_life_pic"
+             top_pad="0"
+             width="102" />
+          </panel>
+           <icon
+           height="18"
+           image_name="AddItem_Off"
+           layout="topleft"
+           name="2nd_life_edit_icon"
+           label=""
+           left="87"
+           tool_tip="Click to select an image"
+           top="25"
+           width="18" />
+      </panel> -->
+	
+	
+	
+	
+        <text
+         type="string"
+         follows="left|top"
+         font="SansSerifSmall"
+	 font.style="BOLD"
+         height="15"
+         layout="topleft"
+         left="10"
+         name="me_homepage_text"
+         text_color="white"
+         top_pad="0"
+         width="280">
+             Homepage:
+        </text>
+        <text
+         follows="left|top"
+         height="15"
+         layout="topleft"
+         left="10"
+         name="homepage_edit"
+         top_pad="0"
+         value="http://librarianavengers.org"
+         width="280"
+         word_wrap="false"
+         use_ellipses="true"
+         />
+        <text
+         follows="left|top"
+	 font.style="BOLD"
+         height="10"
+         layout="topleft"
+         left="10"
+         name="title_member_text"
+         text_color="white"
+         top_pad="10"
+         value="Member Since:"
+         width="280" />
+        <text
+         follows="left|top"
+         height="15"
+         layout="topleft"
+         left="10"
+         name="register_date"
+         value="05/31/1976"
+         width="280"
+         word_wrap="true" />
+        <text
+         follows="left|top"
+	 font.style="BOLD"
+         height="15"
+         layout="topleft"
+         left="10"
+         name="title_acc_status_text"
+         text_color="white"
+         top_pad="10"
+         value="Account Status:"
+         width="280" />
+       <!-- <text
+         type="string"
+         follows="left|top"
+         font="SansSerifSmall"
+         height="15"
+         layout="topleft"
+         left_pad="10"
+         name="my_account_link"
+         top_delta="0"
+	 value="Go to Dashboard"
+         width="100"/> -->
+        <text
+         follows="left|top"
+         height="20"
+         layout="topleft"
+         left="10"
+         name="acc_status_text"
+         top_pad="0"
+         value="Resident. No payment info on file."
+         width="280"
+         word_wrap="true" />
+        <text
+         follows="left|top"
+	 font.style="BOLD"
+         height="15"
+         layout="topleft"
+         left="10"
+         name="title_partner_text"
+         text_color="white"
+         top_pad="5"
+         value="Partner:"
+         width="280" />
+        <panel
+         follows="left|top"
+         height="15"
+         layout="topleft"
+         left="10"
+         name="partner_data_panel"
+         top_pad="0"
+         width="280">
+            <text
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left="0"
+             name="partner_text"
+             top="0"
+             value="[FIRST] [LAST]"
+         width="280"
+             word_wrap="true" />
+         </panel>
+        <text
+         follows="left|top"
+	 font.style="BOLD"
+         height="15"
+         layout="topleft"
+         left="10"
+         name="title_groups_text"
+         text_color="white"
+         top_pad="8"
+         value="Groups:"
+         width="280" />
+                     <expandable_text
+         follows="left|top|bottom"
+         height="60"
+         layout="topleft"
+         left="10"
+             name="sl_groups"
+       top_pad="0"
+         width="280"
+             expanded_bg_visible="true"
+             expanded_bg_color="DkGray">
+            Lorem ipsum dolor sit amet, consectetur adlkjpiscing elit moose moose. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet. adipiscing elit. Aenean rigviverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet sorbet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum.
+        </expandable_text>
+      </panel>
+ </scroll_container>
+ <panel
+     follows="bottom|left"
+     layout="topleft"
+     left="0"
+     name="profile_buttons_panel"
+     top_pad="2"
+     bottom="10"
+     height="19"
+     width="303">
+        <button
+         follows="bottom|left"
+         height="19"
+         label="Add Friend"
+         layout="topleft"
+         left="0"
+         mouse_opaque="false"
+         name="add_friend"
+         top="5"
+         width="75" />
+        <button
+         follows="bottom|left"
+         height="19"
+         label="IM"
+         layout="topleft"
+         name="im"
+         top="5"
+         left_pad="5"
+         width="45" />
+        <button
+         follows="bottom|left"
+         height="19"
+         label="Call"
+         layout="topleft"
+         name="call"
+         left_pad="5"
+         top="5"
+         width="45" />
+        <button
+         enabled="false"
+         follows="bottom|left"
+         height="19"
+         label="Map"
+         layout="topleft"
+         name="show_on_map_btn"
+         top="5"
+         left_pad="5"
+         width="45" />
+        <button
+         follows="bottom|left"
+         height="19"
+         label="Teleport"
+         layout="topleft"
+         name="teleport"
+         left_pad="5"
+         top="5"
+         width="80" />
+ </panel>
+ <panel
+     follows="bottom|left"
+     layout="topleft"
+     left="0"
+     top_pad="-17"
+     name="profile_me_buttons_panel"
+     visible="false"
+     height="19"
+     width="303">
+        <button
+         follows="bottom|right"
+         font="SansSerifSmall"
+         height="19"
+         left="10"
+         label="Edit Profile"
+         name="edit_profile_btn"
+         width="130" />
+        <button
+         follows="bottom|right"
+         height="19"
+         label="Edit Appearance"
+         left_pad="10"
+         name="edit_appearance_btn"
+         right="-10"
+         width="130" />
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml
index d02354a6473..c4c8fa81451 100644
--- a/indra/newview/skins/default/xui/en/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml
@@ -103,8 +103,8 @@
   >
       <panel
         class="panel_me_profile_view"
-        name="panel_me_profile"
-        filename="panel_me_profile.xml"
+        name="panel_me"
+        filename="panel_me.xml"
         label="Me"
       />
   </sidetray_tab>
diff --git a/indra/newview/skins/default/xui/fr/panel_me.xml b/indra/newview/skins/default/xui/fr/panel_me.xml
new file mode 100644
index 00000000000..5bedee46161
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_me.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Moi" name="panel_me">
+	<tab_container name="tabs">
+		<panel label="Mon Profil" name="panel_profile"/>
+		<panel label="Préférences" name="panel_picks"/>
+	</tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_me.xml b/indra/newview/skins/default/xui/ja/panel_me.xml
new file mode 100644
index 00000000000..84151f43cfa
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_me.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="ミー" name="panel_me">
+	<tab_container name="tabs">
+		<panel label="プロフィール" name="panel_profile"/>
+		<panel label="ピック" name="panel_picks"/>
+	</tab_container>
+</panel>
-- 
GitLab


From 1c57d96aa747d6754de664c601ec40f688f5963e Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Fri, 20 Nov 2009 13:09:39 -0800
Subject: [PATCH 488/557] Delete the media impl instead of just unloading it.
 From Review #41 feedback.

---
 indra/newview/llviewerparcelmedia.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index cb2099b3b03..f61dbb1b391 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -218,7 +218,7 @@ void LLViewerParcelMedia::play(LLParcel* parcel)
 			LL_DEBUGS("Media") << "new media impl with mime type " << mime_type << ", url " << media_url << LL_ENDL;
 
 			// Delete the old one first so they don't fight over the texture.
-			sMediaImpl->unload();
+			sMediaImpl = NULL;
 
 			sMediaImpl = LLViewerMedia::newMediaImpl(
 				placeholder_texture_id,
-- 
GitLab


From 766af6102ec2f2d4f161966a39726af98ce4752f Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Fri, 20 Nov 2009 13:11:39 -0800
Subject: [PATCH 489/557] DEV-41991 DEV-42756 : un-do the "fix" for the race
 condition regarding media data overwriting.

I think the problem is that this floater's state is not updated
properly when the server response comes in.  This needs more thought.
---
 indra/newview/llfloatertools.cpp | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 9854d2594b2..386fb7f9094 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -43,6 +43,7 @@
 #include "llcheckboxctrl.h"
 #include "llcombobox.h"
 #include "lldraghandle.h"
+#include "llerror.h"
 #include "llfloaterbuildoptions.h"
 #include "llfloatermediasettings.h"
 #include "llfloateropenobject.h"
@@ -1122,11 +1123,27 @@ void LLFloaterTools::getMediaState()
 			LLVOVolume* object = dynamic_cast<LLVOVolume*>(node->getObject());
 			if (NULL != object)
 			{
-				if (!object->permModify() || object->isMediaDataBeingFetched())
+				if (!object->permModify())
 				{
+					LL_INFOS("LLFloaterTools: media")
+						<< "Selection not editable due to lack of modify permissions on object id "
+						<< object->getID() << LL_ENDL;
+					
 					editable = false;
 					break;
 				}
+				// XXX DISABLE this for now, because when the fetch finally 
+				// does come in, the state of this floater doesn't properly
+				// update.  This needs more thought.
+//				if (object->isMediaDataBeingFetched())
+//				{
+//					LL_INFOS("LLFloaterTools: media")
+//						<< "Selection not editable due to media data being fetched for object id "
+//						<< object->getID() << LL_ENDL;
+//						
+//					editable = false;
+//					break;
+//				}
 			}
 		}
 	}
-- 
GitLab


From ad02019d71741ce571599cdeef900430384b82dd Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Fri, 20 Nov 2009 13:27:17 -0800
Subject: [PATCH 490/557] Use "Select/Close" as button labels for avatar picker
 if choosing people repeatedly. Used by group member invitations, for example,
 where the "OK/Cancel" labels don't make much sense.  Reviewed with Richard.

---
 indra/newview/llfloateravatarpicker.cpp       | 34 ++++++++++++-------
 .../default/xui/en/floater_avatar_picker.xml  | 10 ++++--
 2 files changed, 30 insertions(+), 14 deletions(-)

diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp
index 8ac7f3fd7e1..07bb6f832bf 100644
--- a/indra/newview/llfloateravatarpicker.cpp
+++ b/indra/newview/llfloateravatarpicker.cpp
@@ -42,6 +42,7 @@
 #include "llworld.h"
 
 // Linden libraries
+#include "llbutton.h"
 #include "lllineeditor.h"
 #include "llscrolllistctrl.h"
 #include "llscrolllistitem.h"
@@ -56,7 +57,8 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(callback_t callback,
 												   BOOL closeOnSelect)
 {
 	// *TODO: Use a key to allow this not to be an effective singleton
-	LLFloaterAvatarPicker* floater = LLFloaterReg::showTypedInstance<LLFloaterAvatarPicker>("avatar_picker");
+	LLFloaterAvatarPicker* floater = 
+		LLFloaterReg::showTypedInstance<LLFloaterAvatarPicker>("avatar_picker");
 	
 	floater->mCallback = callback;
 	floater->mCallbackUserdata = userdata;
@@ -64,6 +66,15 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(callback_t callback,
 	floater->mNearMeListComplete = FALSE;
 	floater->mCloseOnSelect = closeOnSelect;
 	
+	if (!closeOnSelect)
+	{
+		// Use Select/Close
+		std::string select_string = floater->getString("Select");
+		std::string close_string = floater->getString("Close");
+		floater->getChild<LLButton>("ok_btn")->setLabel(select_string);
+		floater->getChild<LLButton>("cancel_btn")->setLabel(close_string);
+	}
+
 	return floater;
 }
 
@@ -102,10 +113,9 @@ BOOL LLFloaterAvatarPicker::postBuild()
 	friends->setDoubleClickCallback(onBtnSelect, this);
 	childSetCommitCallback("Friends", onList, this);
 
-	childSetAction("Select", onBtnSelect, this);
-	childDisable("Select");
-
-	childSetAction("Cancel", onBtnClose, this);
+	childSetAction("ok_btn", onBtnSelect, this);
+	childDisable("ok_btn");
+	childSetAction("cancel_btn", onBtnClose, this);
 
 	childSetFocus("Edit");
 
@@ -132,7 +142,7 @@ BOOL LLFloaterAvatarPicker::postBuild()
 
 void LLFloaterAvatarPicker::onTabChanged()
 {
-	childSetEnabled("Select", visibleItemsSelected());
+	childSetEnabled("ok_btn", visibleItemsSelected());
 }
 
 // Destroys the object
@@ -234,7 +244,7 @@ void LLFloaterAvatarPicker::onList(LLUICtrl* ctrl, void* userdata)
 	LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata;
 	if (self)
 	{
-		self->childSetEnabled("Select", self->visibleItemsSelected());
+		self->childSetEnabled("ok_btn", self->visibleItemsSelected());
 	}
 }
 
@@ -270,13 +280,13 @@ void LLFloaterAvatarPicker::populateNearMe()
 	if (empty)
 	{
 		childDisable("NearMe");
-		childDisable("Select");
+		childDisable("ok_btn");
 		near_me_scroller->setCommentText(getString("no_one_near"));
 	}
 	else 
 	{
 		childEnable("NearMe");
-		childEnable("Select");
+		childEnable("ok_btn");
 		near_me_scroller->selectFirstItem();
 		onList(near_me_scroller, this);
 		near_me_scroller->setFocus(TRUE);
@@ -357,7 +367,7 @@ void LLFloaterAvatarPicker::find()
 	getChild<LLScrollListCtrl>("SearchResults")->deleteAllItems();
 	getChild<LLScrollListCtrl>("SearchResults")->setCommentText(getString("searching"));
 	
-	childSetEnabled("Select", FALSE);
+	childSetEnabled("ok_btn", FALSE);
 	mNumResultsReturned = 0;
 }
 
@@ -414,7 +424,7 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void*
 			map["[TEXT]"] = floater->childGetText("Edit");
 			avatar_name = floater->getString("not_found", map);
 			search_results->setEnabled(FALSE);
-			floater->childDisable("Select");
+			floater->childDisable("ok_btn");
 		}
 		else
 		{
@@ -430,7 +440,7 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void*
 
 	if (found_one)
 	{
-		floater->childEnable("Select");
+		floater->childEnable("ok_btn");
 		search_results->selectFirstItem();
 		floater->onList(search_results, floater);
 		search_results->setFocus(TRUE);
diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
index 3a1499eaaaf..953bd08dd41 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
@@ -26,6 +26,12 @@
      name="searching">
         Searching...
     </floater.string>
+    <!-- For multiple person selection, use "Select" and "Close" 
+      instead of "OK" and "Cancel" because "Cancel" still keeps the ones 
+      you have already selected.  The code will show the appropriate
+      set of buttons. -->
+    <string name="Select">Select</string>
+    <string name="Close">Close</string>
     <tab_container
      follows="all"
      height="300"
@@ -205,7 +211,7 @@
      height="23"
      label="OK"
      label_selected="OK"
-     name="Select"
+     name="ok_btn"
      top_pad="3"
      left="46"
      width="100" />
@@ -214,7 +220,7 @@
      height="23"
      label="Cancel"
      label_selected="Cancel"
-     name="Cancel"
+     name="cancel_btn"
      width="100"
      left_pad="5" />
 </floater>
-- 
GitLab


From 3bb86f91bc345f74057debe1f8f680098895a40e Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Fri, 20 Nov 2009 14:01:49 -0800
Subject: [PATCH 491/557] Clean up some logging

---
 indra/newview/llmediadataclient.cpp |  3 +++
 indra/newview/llvoiceclient.cpp     |  2 +-
 indra/newview/llvovolume.cpp        | 14 +++++++-------
 3 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp
index 6666a03ee45..badef4c7ae8 100755
--- a/indra/newview/llmediadataclient.cpp
+++ b/indra/newview/llmediadataclient.cpp
@@ -637,6 +637,9 @@ void LLObjectMediaNavigateClient::navigate(LLMediaDataClientObject *object, U8 t
 	sd_payload[LLTextureEntry::OBJECT_ID_KEY] = object->getID();
 	sd_payload[LLMediaEntry::CURRENT_URL_KEY] = url;
 	sd_payload[LLTextureEntry::TEXTURE_INDEX_KEY] = (LLSD::Integer)texture_index;
+	
+	LL_INFOS("LLMediaDataClient") << "navigate() initiated: " << ll_print_sd(sd_payload) << LL_ENDL;
+	
 	request(object, sd_payload);
 }
 
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 5fedfc943bf..479cf5a04d0 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -1867,7 +1867,7 @@ void LLVoiceClient::stateMachine()
 					}
 					else
 					{
-						LL_WARNS("Voice") << "region doesn't have ProvisionVoiceAccountRequest capability!" << LL_ENDL;
+						LL_WARNS_ONCE("Voice") << "region doesn't have ProvisionVoiceAccountRequest capability!" << LL_ENDL;
 					}
 				}
 			}
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 5a67e64bbd0..428af5380c7 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -1734,9 +1734,9 @@ void LLVOVolume::syncMediaData(S32 texture_index, const LLSD &media_data, bool m
 	}
 	
 	LLTextureEntry *te = getTE(texture_index);
-	//llinfos << "BEFORE: texture_index = " << texture_index
-	//	<< " hasMedia = " << te->hasMedia() << " : " 
-	//	<< ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl;
+	LL_DEBUGS("MediaOnAPrim") << "BEFORE: texture_index = " << texture_index
+		<< " hasMedia = " << te->hasMedia() << " : " 
+		<< ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl;
 
 	std::string previous_url;
 	LLMediaEntry* mep = te->getMediaData();
@@ -1776,9 +1776,9 @@ void LLVOVolume::syncMediaData(S32 texture_index, const LLSD &media_data, bool m
 		removeMediaImpl(texture_index);
 	}
 
-	//llinfos << "AFTER: texture_index = " << texture_index
-	//	<< " hasMedia = " << te->hasMedia() << " : " 
-	//	<< ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl;
+	LL_DEBUGS("MediaOnAPrim") << "AFTER: texture_index = " << texture_index
+		<< " hasMedia = " << te->hasMedia() << " : " 
+		<< ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl;
 }
 
 void LLVOVolume::mediaNavigateBounceBack(U8 texture_index)
@@ -1801,7 +1801,7 @@ void LLVOVolume::mediaNavigateBounceBack(U8 texture_index)
         }
         if (! url.empty())
         {
-            LL_INFOS("LLMediaDataClient") << "bouncing back to URL: " << url << LL_ENDL;
+            LL_INFOS("MediaOnAPrim") << "bouncing back to URL: " << url << LL_ENDL;
             impl->navigateTo(url, "", false, true);
         }
     }
-- 
GitLab


From 67c832d94b53fb5d32ec27eebf7f57b668e899db Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Fri, 20 Nov 2009 14:39:46 -0800
Subject: [PATCH 492/557] EXT-1743 People inspectors should show Age, not Date
 born

---
 indra/newview/llpanelavatar.cpp                      | 8 ++++++--
 indra/newview/skins/default/xui/en/panel_profile.xml | 3 ++-
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 2254684f215..03401d934fa 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -38,6 +38,7 @@
 #include "llavatarconstants.h"	// AVATAR_ONLINE
 #include "llcallingcard.h"
 #include "llcombobox.h"
+#include "lldateutil.h"			// ageFromDate()
 #include "llimview.h"
 #include "lltexteditor.h"
 #include "lltexturectrl.h"
@@ -466,8 +467,11 @@ void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data)
 	//remove avatar id from cache to get fresh info
 	LLAvatarIconIDCache::getInstance()->remove(avatar_data->avatar_id);
 
-
-	childSetValue("register_date", avatar_data->born_on );
+	LLStringUtil::format_map_t args;
+	args["[REG_DATE]"] = avatar_data->born_on;
+	args["[AGE]"] = LLDateUtil::ageFromDate( avatar_data->born_on, LLDate::now());
+	std::string register_date = getString("RegisterDateFormat", args);
+	childSetValue("register_date", register_date );
 	childSetValue("sl_description_edit", avatar_data->about_text);
 	childSetValue("fl_description_edit",avatar_data->fl_about_text);
 	childSetValue("2nd_life_pic", avatar_data->image_id);
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 5110b6b2ef5..bf1d46451bc 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -27,7 +27,8 @@
     <string
      name="no_partner_text"
      value="None" />
- <scroll_container
+    <string name="RegisterDateFormat">[REG_DATE] ([AGE])</string>
+  <scroll_container
      color="DkGray2"
      follows="all"
      height="485"
-- 
GitLab


From 20bcd7efeb9302fc7fee442f9079fc208a2341fa Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Fri, 20 Nov 2009 15:07:48 -0800
Subject: [PATCH 493/557] Hopefully, really fix DEV-42093.

---
 indra/newview/llviewermedia.cpp | 29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index e55523c11e2..8c41133a3a8 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -293,7 +293,12 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
 {	
 	// Try to find media with the same media ID
 	viewer_media_t media_impl = getMediaImplFromTextureID(media_entry->getMediaID());
-
+	
+	lldebugs << "called, current URL is \"" << media_entry->getCurrentURL() 
+			<< "\", previous URL is \"" << previous_url 
+			<< "\", update_from_self is " << (update_from_self?"true":"false")
+			<< llendl;
+			
 	bool was_loaded = false;
 	bool needs_navigate = false;
 	
@@ -314,21 +319,32 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
 			media_impl->mMediaSource->setSize(media_entry->getWidthPixels(), media_entry->getHeightPixels());
 		}
 		
+		bool url_changed = (media_entry->getCurrentURL() != previous_url);
 		if(media_entry->getCurrentURL().empty())
 		{
-			// The current media URL is now empty.  Unload the media source.
-			media_impl->unload();
+			if(url_changed)
+			{
+				// The current media URL is now empty.  Unload the media source.
+				media_impl->unload();
+			
+				lldebugs << "Unloading media instance (new current URL is empty)." << llendl;
+			}
 		}
 		else
 		{
 			// The current media URL is not empty.
 			// If (the media was already loaded OR the media was set to autoplay) AND this update didn't come from this agent,
 			// do a navigate.
+			bool auto_play = (media_entry->getAutoPlay() && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING));
 			
-			if((was_loaded || (media_entry->getAutoPlay() && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING))) && !update_from_self)
+			if((was_loaded || auto_play) && !update_from_self)
 			{
-				needs_navigate = (media_entry->getCurrentURL() != previous_url);
+				needs_navigate = url_changed;
 			}
+			
+			lldebugs << "was_loaded is " << (was_loaded?"true":"false") 
+					<< ", auto_play is " << (auto_play?"true":"false") 
+					<< ", needs_navigate is " << (needs_navigate?"true":"false") << llendl;
 		}
 	}
 	else
@@ -354,6 +370,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
 		if(needs_navigate)
 		{
 			media_impl->navigateTo(url, "", true, true);
+			lldebugs << "navigating to URL " << url << llendl;
 		}
 		else if(!media_impl->mMediaURL.empty() && (media_impl->mMediaURL != url))
 		{
@@ -362,6 +379,8 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
 
 			// If this causes a navigate at some point (such as after a reload), it should be considered server-driven so it isn't broadcast.
 			media_impl->mNavigateServerRequest = true;
+
+			lldebugs << "updating URL in the media impl to " << url << llendl;
 		}
 	}
 	
-- 
GitLab


From daef055db99d79b700eb9aed63d869b64a45acb0 Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Fri, 20 Nov 2009 16:26:43 -0800
Subject: [PATCH 494/557] Add log warning if media cap is missing

---
 indra/newview/llfloatertools.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 386fb7f9094..88a98c3350d 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -1104,7 +1104,8 @@ void LLFloaterTools::getMediaState()
 		childSetEnabled("edit_media", FALSE);
 		childSetEnabled("media_info", FALSE);
 		media_info->setEnabled(FALSE);
-		media_info->clear();*/	
+		media_info->clear();*/
+		LL_WARNS("LLFloaterTools: media") << "Media not enabled (no capability) in this region!" << LL_ENDL;
 		clearMediaSettings();
 		return;
 	}
-- 
GitLab


From a3930c7ff754e09a686d4ec0eaeca0a7f752c008 Mon Sep 17 00:00:00 2001
From: "Eric M. Tulla (BigPapi)" <tulla@lindenlab.com>
Date: Fri, 20 Nov 2009 19:27:33 -0500
Subject: [PATCH 495/557] Inventory Offer changes and clickable inventory
 slurls

---
 indra/llui/llurlentry.cpp                     |  33 +++
 indra/llui/llurlentry.h                       |  13 ++
 indra/llui/llurlregistry.cpp                  |   1 +
 indra/newview/llinventoryobserver.h           |   2 +-
 indra/newview/llviewerinventory.cpp           |  32 +++
 indra/newview/llviewermessage.cpp             | 196 ++++++++++--------
 indra/newview/llviewermessage.h               |   5 +-
 .../default/xui/en/menu_url_inventory.xml     |  28 +++
 .../skins/default/xui/en/notifications.xml    |  32 ++-
 9 files changed, 239 insertions(+), 103 deletions(-)
 create mode 100644 indra/newview/skins/default/xui/en/menu_url_inventory.xml

diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index 219fae84be8..b51709e2086 100644
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -34,6 +34,7 @@
 #include "linden_common.h"
 #include "llurlentry.h"
 #include "lluri.h"
+
 #include "llcachename.h"
 #include "lltrans.h"
 #include "lluicolortable.h"
@@ -383,6 +384,38 @@ std::string LLUrlEntryGroup::getLabel(const std::string &url, const LLUrlLabelCa
 	}
 }
 
+//
+// LLUrlEntryInventory Describes a Second Life inventory Url, e.g.,
+// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/select
+//
+LLUrlEntryInventory::LLUrlEntryInventory()
+{
+	mPattern = boost::regex("secondlife:///app/inventory/[\\da-f-]+/\\w+",
+							boost::regex::perl|boost::regex::icase);
+	mMenuName = "menu_url_inventory.xml";
+}
+
+std::string LLUrlEntryInventory::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
+{
+	return unescapeUrl(url);
+	// TODO: Figure out if we can somehow access the inventory from here to get the actual item name
+	/*  
+	std::string inventory_id_string = getIDStringFromUrl(url);
+	if (inventory_id_string.empty())
+	{
+		// something went wrong, give raw url
+		return unescapeUrl(url);
+	}
+	LLUUID inventory_id(inventory_id_string);
+	LLInventoryItem* item = gInventory.getItem(inventory_id);
+	if(!item)
+	{
+		return unescapeUrl(url);
+	}
+	return item->getName(); */
+}
+
+
 ///
 /// LLUrlEntryParcel Describes a Second Life parcel Url, e.g.,
 /// secondlife:///app/parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/about
diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h
index 7970b48eb5a..b3fb333fdd8 100644
--- a/indra/llui/llurlentry.h
+++ b/indra/llui/llurlentry.h
@@ -173,6 +173,19 @@ class LLUrlEntryGroup : public LLUrlEntryBase
 							 const std::string& last, BOOL is_group);
 };
 
+///
+/// LLUrlEntryInventory Describes a Second Life inventory Url, e.g.,
+/// secondlife:///app/inventory/0e346d8b-4433-4d66-a6b0-fd37083abc4c/select
+///
+class LLUrlEntryInventory : public LLUrlEntryBase
+{
+public:
+	LLUrlEntryInventory();
+	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
+private:
+};
+
+
 ///
 /// LLUrlEntryParcel Describes a Second Life parcel Url, e.g.,
 /// secondlife:///app/parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/about
diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp
index a6922b019b5..b2f084e5acb 100644
--- a/indra/llui/llurlregistry.cpp
+++ b/indra/llui/llurlregistry.cpp
@@ -55,6 +55,7 @@ LLUrlRegistry::LLUrlRegistry()
 	registerUrl(new LLUrlEntryPlace());
 	registerUrl(new LLUrlEntrySL());
 	registerUrl(new LLUrlEntrySLLabel());
+	registerUrl(new LLUrlEntryInventory());
 }
 
 LLUrlRegistry::~LLUrlRegistry()
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
index 384e6292e8a..e908506b337 100644
--- a/indra/newview/llinventoryobserver.h
+++ b/indra/newview/llinventoryobserver.h
@@ -113,7 +113,7 @@ class LLInventoryFetchObserver : public LLInventoryObserver
 
 	bool isEverythingComplete() const;
 	void fetchItems(const item_ref_t& ids);
-	virtual void done() = 0;
+	virtual void done() {};
 
 protected:
 	item_ref_t mComplete;
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 1d62ead8437..bbdccad67b6 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -56,11 +56,43 @@
 #include "lltrans.h"
 #include "llappearancemgr.h"
 #include "llfloatercustomize.h"
+#include "llcommandhandler.h"
+#include "llviewermessage.h"
 
 ///----------------------------------------------------------------------------
 /// Local function declarations, constants, enums, and typedefs
 ///----------------------------------------------------------------------------
 
+class LLInventoryHandler : public LLCommandHandler
+{
+public:
+	// requires trusted browser to trigger
+	LLInventoryHandler() : LLCommandHandler("inventory", UNTRUSTED_THROTTLE) { }
+	
+	bool handle(const LLSD& params, const LLSD& query_map,
+				LLMediaCtrl* web)
+	{
+		if (params.size() < 2) return false;
+		LLUUID inventory_id;
+		if (!inventory_id.set(params[0], FALSE))
+		{
+			return false;
+		}
+		
+		const std::string verb = params[1].asString();
+		if (verb == "select")
+		{
+			std::vector<LLUUID> items_to_open;
+			items_to_open.push_back(inventory_id);
+			open_inventory_offer(items_to_open, "");
+			return true;
+		}
+		
+		return false;
+	}
+};
+LLInventoryHandler gInventoryHandler;
+
 ///----------------------------------------------------------------------------
 /// Class LLViewerInventoryItem
 ///----------------------------------------------------------------------------
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index ef6a621323b..d824b1d7082 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -726,7 +726,7 @@ class LLOpenAgentOffer : public LLInventoryFetchObserver
 	LLOpenAgentOffer(const std::string& from_name) : mFromName(from_name) {}
 	/*virtual*/ void done()
 	{
-		open_offer(mComplete, mFromName);
+		open_inventory_offer(mComplete, mFromName);
 		gInventory.removeObserver(this);
 		delete this;
 	}
@@ -875,7 +875,7 @@ bool check_offer_throttle(const std::string& from_name, bool check_only)
 	}
 }
  
-void open_offer(const std::vector<LLUUID>& items, const std::string& from_name)
+void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& from_name)
 {
 	std::vector<LLUUID>::const_iterator it = items.begin();
 	std::vector<LLUUID>::const_iterator end = items.end();
@@ -1060,22 +1060,8 @@ LLSD LLOfferInfo::asLLSD()
 	return sd;
 }
 
-bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& response)
- {
-	LLChat chat;
-	std::string log_message;
-	S32 button = LLNotification::getSelectedOption(notification, response);
-
-	// For muting, we need to add the mute, then decline the offer.
-	// This must be done here because:
-	// * callback may be called immediately,
-	// * adding the mute sends a message,
-	// * we can't build two messages at once.
-	if (2 == button)
-	{
-		gCacheName->get(mFromID, mFromGroup, &inventory_offer_mute_callback);
-	}
-
+void LLOfferInfo::send_auto_receive_response(void)
+{	
 	LLMessageSystem* msg = gMessageSystem;
 	msg->newMessageFast(_PREHASH_ImprovedInstantMessage);
 	msg->nextBlockFast(_PREHASH_AgentData);
@@ -1094,6 +1080,31 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
 	msg->addU32Fast(_PREHASH_ParentEstateID, 0);
 	msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null);
 	msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent());
+	
+	// Auto Receive Message. The math for the dialog works, because the accept
+	// for inventory_offered, task_inventory_offer or
+	// group_notice_inventory is 1 greater than the offer integer value.
+	// Generates IM_INVENTORY_ACCEPTED, IM_TASK_INVENTORY_ACCEPTED, 
+	// or IM_GROUP_NOTICE_INVENTORY_ACCEPTED
+	msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 1));
+	msg->addBinaryDataFast(_PREHASH_BinaryBucket, &(mFolderID.mData),
+						   sizeof(mFolderID.mData));
+	// send the message
+	msg->sendReliable(mHost);
+	
+	if(IM_INVENTORY_OFFERED == mIM)
+	{
+		// add buddy to recent people list
+		LLRecentPeople::instance().add(mFromID);
+	}
+}
+
+bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& response)
+{
+	LLChat chat;
+	std::string log_message;
+	S32 button = LLNotification::getSelectedOption(notification, response);
+	
 	LLInventoryObserver* opener = NULL;
 	LLViewerInventoryCategory* catp = NULL;
 	catp = (LLViewerInventoryCategory*)gInventory.getCategory(mObjectID);
@@ -1102,6 +1113,16 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
 	{
 		itemp = (LLViewerInventoryItem*)gInventory.getItem(mObjectID);
 	}
+	 
+	// For muting, we need to add the mute, then decline the offer.
+	// This must be done here because:
+	// * callback may be called immediately,
+	// * adding the mute sends a message,
+	// * we can't build two messages at once.
+	if (2 == button)
+	{
+		gCacheName->get(mFromID, mFromGroup, &inventory_offer_mute_callback);
+	}
 
 	std::string from_string; // Used in the pop-up.
 	std::string chatHistory_string;  // Used in chat history.
@@ -1152,64 +1173,54 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
 	
 	switch(button)
 	{
-	case IOR_ACCEPT:
-		// ACCEPT. The math for the dialog works, because the accept
-		// for inventory_offered, task_inventory_offer or
-		// group_notice_inventory is 1 greater than the offer integer value.
-		// Generates IM_INVENTORY_ACCEPTED, IM_TASK_INVENTORY_ACCEPTED, 
-		// or IM_GROUP_NOTICE_INVENTORY_ACCEPTED
-		msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 1));
-		msg->addBinaryDataFast(_PREHASH_BinaryBucket, &(mFolderID.mData),
-					 sizeof(mFolderID.mData));
-		// send the message
-		msg->sendReliable(mHost);
-
-		//don't spam them if they are getting flooded
-		if (check_offer_throttle(mFromName, true))
-		{
-			log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString(".");
- 			chat.mText = log_message;
- 			LLFloaterChat::addChatHistory(chat);
-		}
-
+	case IOR_SHOW:
 		// we will want to open this item when it comes back.
 		LL_DEBUGS("Messaging") << "Initializing an opener for tid: " << mTransactionID
 				 << LL_ENDL;
 		switch (mIM)
 		{
 		case IM_INVENTORY_OFFERED:
-		{
-			// This is an offer from an agent. In this case, the back
-			// end has already copied the items into your inventory,
-			// so we can fetch it out of our inventory.
-			LLInventoryFetchObserver::item_ref_t items;
-			items.push_back(mObjectID);
-			LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer(from_string);
-			open_agent_offer->fetchItems(items);
-			if(catp || (itemp && itemp->isComplete()))
-			{
-				open_agent_offer->done();
-			}
-			else
 			{
-				opener = open_agent_offer;
+				// This is an offer from an agent. In this case, the back
+				// end has already copied the items into your inventory,
+				// so we can fetch it out of our inventory.
+				LLInventoryFetchObserver::item_ref_t items;
+				items.push_back(mObjectID);
+				LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer(from_string);
+				open_agent_offer->fetchItems(items);
+				if(catp || (itemp && itemp->isComplete()))
+				{
+					open_agent_offer->done();
+				}
+				else
+				{
+					opener = open_agent_offer;
+				}
 			}
-		}
 			break;
 		case IM_TASK_INVENTORY_OFFERED:
 		case IM_GROUP_NOTICE:
 		case IM_GROUP_NOTICE_REQUESTED:
-		{
 			// This is an offer from a task or group.
 			// We don't use a new instance of an opener
 			// We instead use the singular observer gOpenTaskOffer
 			// Since it already exists, we don't need to actually do anything
-		}
-		break;
+			break;
 		default:
 			LL_WARNS("Messaging") << "inventory_offer_callback: unknown offer type" << LL_ENDL;
 			break;
 		}	// end switch (mIM)
+			
+		// Show falls through to accept.
+			
+	case IOR_ACCEPT:
+		//don't spam them if they are getting flooded
+		if (check_offer_throttle(mFromName, true))
+		{
+			log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString(".");
+			chat.mText = log_message;
+			LLFloaterChat::addChatHistory(chat);
+		}
 		break;
 
 	case IOR_BUSY:
@@ -1218,31 +1229,15 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
 	case IOR_MUTE:
 		// MUTE falls through to decline
 	case IOR_DECLINE:
-		// DECLINE. The math for the dialog works, because the decline
-		// for inventory_offered, task_inventory_offer or
-		// group_notice_inventory is 2 greater than the offer integer value.
-		// Generates IM_INVENTORY_DECLINED, IM_TASK_INVENTORY_DECLINED,
-		// or IM_GROUP_NOTICE_INVENTORY_DECLINED
-	default:
-		// close button probably (or any of the fall-throughs from above)
-		msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 2));
-		msg->addBinaryDataFast(_PREHASH_BinaryBucket, EMPTY_BINARY_BUCKET, EMPTY_BINARY_BUCKET_SIZE);
-		// send the message
-		msg->sendReliable(mHost);
-
-		log_message = LLTrans::getString("InvOfferYouDecline") + " " + mDesc + " " + LLTrans::getString("InvOfferFrom") + " " + mFromName +".";
-		chat.mText = log_message;
-		if( LLMuteList::getInstance()->isMuted(mFromID ) && ! LLMuteList::getInstance()->isLinden(mFromName) )  // muting for SL-42269
-		{
-			chat.mMuted = TRUE;
-		}
-		LLFloaterChat::addChatHistory(chat);
-
-		// If it's from an agent, we have to fetch the item to throw
-		// it away. If it's from a task or group, just denying the 
-		// request will suffice to discard the item.
-		if(IM_INVENTORY_OFFERED == mIM)
 		{
+			log_message = LLTrans::getString("InvOfferYouDecline") + " " + mDesc + " " + LLTrans::getString("InvOfferFrom") + " " + mFromName +".";
+			chat.mText = log_message;
+			if( LLMuteList::getInstance()->isMuted(mFromID ) && ! LLMuteList::getInstance()->isLinden(mFromName) )  // muting for SL-42269
+			{
+				chat.mMuted = TRUE;
+			}
+			LLFloaterChat::addChatHistory(chat);
+			
 			LLInventoryFetchComboObserver::folder_ref_t folders;
 			LLInventoryFetchComboObserver::item_ref_t items;
 			items.push_back(mObjectID);
@@ -1258,20 +1253,21 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
 				opener = discard_agent_offer;
 			}
 			
+			
+			if (busy &&	(!mFromGroup && !mFromObject))
+			{
+				busy_message(gMessageSystem, mFromID);
+			}
+			break;
 		}
-		if (busy &&	(!mFromGroup && !mFromObject))
-		{
-			busy_message(msg,mFromID);
-		}
+	default:
+		// close button probably
+		// The item has already been fetched and is in your inventory, we simply won't highlight it
+		// OR delete it if the notification gets killed, since we don't want that to be a vector for 
+		// losing inventory offers.
 		break;
 	}
 
-	if(IM_INVENTORY_OFFERED == mIM)
-	{
-		// add buddy to recent people list
-		LLRecentPeople::instance().add(mFromID);
-	}
-
 	if(opener)
 	{
 		gInventory.addObserver(opener);
@@ -1382,7 +1378,25 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)
 	{
 		p.name = "UserGiveItem";
 	}
-
+	
+	// Prefetch the item into your local inventory.
+	LLInventoryFetchObserver::item_ref_t items;
+	items.push_back(info->mObjectID);
+	LLInventoryFetchObserver* fetch_item = new LLInventoryFetchObserver();
+	fetch_item->fetchItems(items);
+	if(fetch_item->isEverythingComplete())
+	{
+		fetch_item->done();
+	}
+	else
+	{
+		gInventory.addObserver(fetch_item);
+	}
+	
+	// In viewer 2 we're now auto receiving inventory offers and messaging as such (not sending reject messages).
+	info->send_auto_receive_response();
+	
+	// Pop up inv offer notification and let the user accept (keep), or reject (and silently delete) the inventory.
 	LLNotifications::instance().add(p);
 }
 
diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h
index e24da2013d1..2d8930d2fe3 100644
--- a/indra/newview/llviewermessage.h
+++ b/indra/newview/llviewermessage.h
@@ -59,7 +59,8 @@ enum InventoryOfferResponse
 	IOR_ACCEPT,
 	IOR_DECLINE,
 	IOR_MUTE,
-	IOR_BUSY
+	IOR_BUSY,
+	IOR_SHOW
 };
 
 BOOL can_afford_transaction(S32 cost);
@@ -197,6 +198,7 @@ void invalid_message_callback(LLMessageSystem*, void*, EMessageException);
 
 void process_initiate_download(LLMessageSystem* msg, void**);
 void start_new_inventory_observer();
+void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& from_name);
 
 struct LLOfferInfo
 {
@@ -218,6 +220,7 @@ struct LLOfferInfo
 	LLHost mHost;
 
 	LLSD asLLSD();
+	void send_auto_receive_response(void);
 	bool inventory_offer_callback(const LLSD& notification, const LLSD& response);
 
 };
diff --git a/indra/newview/skins/default/xui/en/menu_url_inventory.xml b/indra/newview/skins/default/xui/en/menu_url_inventory.xml
new file mode 100644
index 00000000000..cf9d1d58817
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_url_inventory.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Url Popup">
+    <menu_item_call
+     label="Show Inventory Item"
+     layout="topleft"
+     name="show_item">
+        <menu_item_call.on_click
+         function="Url.Execute" />
+    </menu_item_call>
+    <menu_item_separator
+     layout="topleft" />
+    <menu_item_call
+     label="Copy Name to clipboard"
+     layout="topleft"
+     name="url_copy_label">
+        <menu_item_call.on_click
+         function="Url.CopyLabel" />
+    </menu_item_call>
+    <menu_item_call
+     label="Copy SLurl to clipboard"
+     layout="topleft"
+     name="url_copy">
+        <menu_item_call.on_click
+         function="Url.CopyUrl" />
+    </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 56cb54c9753..f9715050abf 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -4487,7 +4487,7 @@ You don&apos;t have permission to copy this.
    icon="notifytip.tga"
    name="InventoryAccepted"
    type="notifytip">
-[NAME] accepted your inventory offer.
+[NAME] received your inventory offer.
   </notification>
 
   <notification
@@ -4959,17 +4959,21 @@ No valid parcel could be found.
    icon="notify.tga"
    name="ObjectGiveItem"
    type="offer">
-An object named [OBJECTFROMNAME] owned by [NAME] has offered you [OBJECTTYPE]:
+An object named [OBJECTFROMNAME] owned by [NAME] has given you [OBJECTTYPE]:
 [ITEM_SLURL]
     <form name="form">
       <button
        index="0"
        name="Keep"
-       text="OK"/>
+       text="Keep"/>
+	  <button
+       index="4"
+       name="Show"
+       text="Show"/> 
       <button
        index="1"
        name="Discard"
-       text="Cancel"/>
+       text="Discard"/>
       <button
        index="2"
        name="Mute"
@@ -4986,11 +4990,15 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a
       <button
        index="0"
        name="Keep"
-       text="OK"/>
+       text="Keep"/>
+	  <button
+       index="4"
+       name="Show"
+       text="Show"/> 
       <button
        index="1"
        name="Discard"
-       text="Cancel"/>
+       text="Discard"/>
       <button
        index="2"
        name="Mute"
@@ -5002,17 +5010,21 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a
    icon="notify.tga"
    name="UserGiveItem"
    type="offer">
-[NAME] has offered you [OBJECTTYPE]:
+[NAME] has given you [OBJECTTYPE]:
 [ITEM_SLURL]
     <form name="form">
       <button
        index="0"
        name="Keep"
-       text="Accept"/>
+       text="Keep"/>
+      <button
+       index="4"
+       name="Show"
+       text="Show"/> 
       <button
        index="1"
        name="Discard"
-       text="No, thanks"/>
+       text="Discard"/>
     </form>
   </notification>
 
@@ -5747,7 +5759,7 @@ Are you sure you want to delete your teleport history?
    name="BottomTrayButtonCanNotBeShown"
    type="alert">
 Selected button can not be shown right now.
-The button will be shown when there is enough space for it.
+The button will be shown when there is enough space for it.
   </notification>
 
 
-- 
GitLab


From 1d5775a23fbcf00ad3e459393a7cf1d80a762bf8 Mon Sep 17 00:00:00 2001
From: Ramzi Linden <ramzi@lindenlab.com>
Date: Fri, 20 Nov 2009 17:16:26 -0800
Subject: [PATCH 496/557] - Changed the EN links used for the KnowledgeBase to
 its new home on the sl wiki. - DEV-43134 Insert localized hyperlinks for all
 places in XUI where viewer jumps to the web. (This will be needed for Phase 4
 Testing of QAR-1355)

---
 .../default/xui/de/floater_media_browser.xml  |  4 +--
 .../skins/default/xui/de/menu_viewer.xml      |  6 ++++
 .../skins/default/xui/de/notifications.xml    | 17 +++++------
 .../skins/default/xui/de/panel_login.xml      |  2 +-
 .../skins/default/xui/de/panel_profile.xml    |  6 +++-
 .../newview/skins/default/xui/de/strings.xml  | 11 +++----
 .../skins/default/xui/en/notifications.xml    | 10 +++----
 .../default/xui/es/floater_media_browser.xml  |  6 ++++
 .../skins/default/xui/es/menu_viewer.xml      |  6 ++++
 .../skins/default/xui/es/notifications.xml    | 27 +++++++++++------
 .../skins/default/xui/es/panel_login.xml      | 14 +++++----
 .../skins/default/xui/es/panel_profile.xml    | 14 +++++++++
 .../newview/skins/default/xui/es/strings.xml  |  1 +
 .../default/xui/fr/floater_media_browser.xml  |  4 +--
 .../skins/default/xui/fr/menu_viewer.xml      |  6 ++++
 .../skins/default/xui/fr/notifications.xml    | 21 ++++++--------
 .../skins/default/xui/fr/panel_login.xml      |  4 +--
 .../skins/default/xui/fr/panel_pick_info.xml  | 16 ++++++++++
 .../skins/default/xui/fr/panel_profile.xml    | 10 +++++--
 .../newview/skins/default/xui/fr/strings.xml  | 11 +++----
 .../default/xui/it/floater_media_browser.xml  |  6 ++++
 .../skins/default/xui/it/menu_viewer.xml      |  6 ++++
 .../skins/default/xui/it/notifications.xml    | 29 ++++++++++++-------
 .../skins/default/xui/it/panel_login.xml      | 14 +++++----
 .../skins/default/xui/it/panel_profile.xml    | 14 +++++++++
 .../newview/skins/default/xui/it/strings.xml  |  1 +
 .../skins/default/xui/ja/menu_viewer.xml      |  6 ++++
 .../skins/default/xui/ja/notifications.xml    | 12 ++++----
 .../skins/default/xui/ja/panel_login.xml      |  2 +-
 .../skins/default/xui/ja/panel_profile.xml    | 10 +++++--
 .../newview/skins/default/xui/ja/strings.xml  | 11 +++----
 .../skins/default/xui/nl/notifications.xml    |  5 +++-
 .../skins/default/xui/nl/panel_login.xml      | 14 +++++----
 .../newview/skins/default/xui/nl/strings.xml  |  1 +
 .../default/xui/pt/floater_media_browser.xml  |  6 ++++
 .../skins/default/xui/pt/menu_viewer.xml      |  6 ++++
 .../skins/default/xui/pt/notifications.xml    | 29 ++++++++++++-------
 .../skins/default/xui/pt/panel_login.xml      |  8 +++++
 .../skins/default/xui/pt/panel_profile.xml    | 14 +++++++++
 .../newview/skins/default/xui/pt/strings.xml  |  1 +
 40 files changed, 280 insertions(+), 111 deletions(-)
 create mode 100644 indra/newview/skins/default/xui/es/panel_profile.xml
 create mode 100644 indra/newview/skins/default/xui/fr/panel_pick_info.xml
 create mode 100644 indra/newview/skins/default/xui/it/panel_profile.xml
 create mode 100644 indra/newview/skins/default/xui/pt/panel_profile.xml

diff --git a/indra/newview/skins/default/xui/de/floater_media_browser.xml b/indra/newview/skins/default/xui/de/floater_media_browser.xml
index 1c580aa916d..89cce0f6dc8 100644
--- a/indra/newview/skins/default/xui/de/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/de/floater_media_browser.xml
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="floater_about" title="MEDIENBROWSER">
 	<floater.string name="home_page_url">
-		http://www.secondlife.com
+		http://de.secondlife.com
 	</floater.string>
 	<floater.string name="support_page_url">
-		http://support.secondlife.com
+		http://de.secondlife.com/support
 	</floater.string>
 	<layout_stack name="stack1">
 		<layout_panel name="nav_controls">
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index 62cd9828752..317b5250622 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu_bar name="Main Menu">
+	<menu name="Me">
+		<menu_item_call label="Einstellungen" name="Preferences"/>
+		<menu_item_call name="Manage My Account">
+			<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=de" />
+		</menu_item_call>
+	</menu>
 	<menu label="Datei" name="File">
 		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
 		<menu label="Hochladen" name="upload">
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index 7e3a6aaa932..8b8a0afa892 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -317,7 +317,7 @@ Gebühren werden nicht rückerstattet.
 	<notification name="PromptGoToEventsPage">
 		Zur [SECOND_LIFE] Events-Webseite?
 		<url name="url">
-			http://de.secondlife.com/events/
+			http://secondlife.com/events/?lang=de-DE
 		</url>
 		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
 	</notification>
@@ -498,7 +498,7 @@ Verschieben Sie alle betreffenden Objekte in dieselbe Region.
 
 [_URL] für Informationen zum Kauf von L$ öffnen?
 		<url name="url">
-			http://de.secondlife.com/app/currency/
+			http://secondlife.com/app/currency/?lang=de-DE
 		</url>
 		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
 	</notification>
@@ -1055,7 +1055,7 @@ Sie können [SECOND_LIFE] normal verwenden. Andere Benutzer können Sie korrekt
 		Die Installation von [APP_NAME] ist abgeschlossen.
 
 Wenn Sie [SECOND_LIFE] das erste Mal verwenden, müssen Sie ein Konto anlegen, bevor Sie sich anmelden können.
-Möchten Sie auf www.secondlife.com ein Konto erstellen?
+Möchten Sie auf [https://join.secondlife.com/index.php?lang=de-DE secondlife.com] ein Konto erstellen?
 		<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Neues Konto..."/>
 	</notification>
 	<notification name="LoginPacketNeverReceived">
@@ -1452,7 +1452,7 @@ Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben u
 
 Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten?
 		<url name="url">
-			http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB)
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/de
 		</url>
 		<usetemplate ignoretext="Ich kann diese Region aufgrund der Alterseinstufung nicht betreten" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
 	</notification>
@@ -1480,7 +1480,7 @@ Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben u
 
 Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten?
 		<url name="url">
-			http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB)
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/de
 		</url>
 		<usetemplate ignoretext="Ich habe aufgrund der Alterseinstufung keinen Anspruch auf dieses Land" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
 	</notification>
@@ -1504,7 +1504,7 @@ Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben u
 
 Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten?
 		<url name="url">
-			http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB)
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/de
 		</url>
 		<usetemplate ignoretext="Ich kann aufgrund der Alterseinstufung dieses Land nicht kaufen" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
 	</notification>
@@ -1690,10 +1690,7 @@ Inventarobjekt(e) verschieben?
 		<usetemplate ignoretext="Bestätigen, bevor Sitzung beendet wird" name="okcancelignore" notext="Nicht beenden" yestext="Beenden"/>
 	</notification>
 	<notification name="HelpReportAbuseEmailLL">
-		Verwenden Sie dieses Tool, um Verletzungen der Servicebedingungen und Community-Standards zu melden. Siehe:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
+		Verwenden Sie dieses Tool, um Verletzungen der [http://secondlife.com/corporate/tos.php?lang=de-DE Servicebedingungen] und [http://secondlife.com/corporate/cs.php?lang=de-DE Community-Standards] zu melden.
 
 Alle gemeldeten Verletzungen der Servicebedingungen und Community-Standards werden geprüft und geklärt Sie können den Prozess im Incident Report (Vorfallsbericht) verfolgen:
 
diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml
index 9a15795cbef..534bcfc82b3 100644
--- a/indra/newview/skins/default/xui/de/panel_login.xml
+++ b/indra/newview/skins/default/xui/de/panel_login.xml
@@ -4,7 +4,7 @@
 		http://de.secondlife.com/registration/
 	</panel.string>
 	<panel.string name="forgot_password_url">
-		http://secondlife.com/account/request.php
+		http://secondlife.com/account/request.php?lang=de
 	</panel.string>
 	<panel name="login_widgets">
 		<line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] Vorname"/>
diff --git a/indra/newview/skins/default/xui/de/panel_profile.xml b/indra/newview/skins/default/xui/de/panel_profile.xml
index b5fb2329c57..c3274acaae2 100644
--- a/indra/newview/skins/default/xui/de/panel_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_profile.xml
@@ -1,11 +1,15 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Profil" name="panel_profile">
 	<string name="CaptionTextAcctInfo">
-		[ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+		[ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
 	</string>
 	<string name="payment_update_link_url">
 		http://www.secondlife.com/account/billing.php?lang=de-DE
 	</string>
+	<string name="partner_edit_link_url">
+		http://www.secondlife.com/account/partners.php?lang=de
+	</string>
 	<string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=de-DE"/>
 	<string name="no_partner_text" value="Keiner"/>
 	<scroll_container name="profile_scroll">
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 9a0f5021d81..86eb8b1479b 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -4,6 +4,7 @@
      For example, the strings used in avatar chat bubbles, and strings 
      that are returned from one component and may appear in many places-->
 <strings>
+	<string name="create_account_url">http://join.secondlife.com/index.php?lang=de-DE</string>
 	<string name="SECOND_LIFE">
 		Second Life
 	</string>
@@ -158,7 +159,7 @@
 		Anklicken, um Befehl secondlife:// auszuführen
 	</string>
 	<string name="BUTTON_CLOSE_DARWIN">
-		Schließen (⌘-W)
+		Schließen (&#8984;W)
 	</string>
 	<string name="BUTTON_CLOSE_WIN">
 		Schließen (Strg+W)
@@ -1311,16 +1312,16 @@ Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh
 		Landmarke bearbeiten...
 	</string>
 	<string name="accel-mac-control">
-		⌃
+		&#8963;
 	</string>
 	<string name="accel-mac-command">
-		⌘
+		&#8984;
 	</string>
 	<string name="accel-mac-option">
-		⌥
+		&#8997;
 	</string>
 	<string name="accel-mac-shift">
-		⇧
+		&#8679;
 	</string>
 	<string name="accel-win-control">
 		Strg+
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 0d1ed6fc649..0f5342da3e1 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -722,7 +722,7 @@ You need an account to enter [SECOND_LIFE]. Would you like to create one now?
    icon="alertmodal.tga"
    name="AddClassified"
    type="alertmodal">
-Classified ads appear in the &apos;Classified&apos; section of the Search directory and on [http://www.secondlife.com secondlife.com] for one week.
+Classified ads appear in the &apos;Classified&apos; section of the Search directory and on [http://secondlife.com/community/classifieds secondlife.com] for one week.
 Fill out your ad, then click &apos;Publish...&apos; to add it to the directory.
 You&apos;ll be asked for a price to pay when clicking Publish.
 Paying more makes your ad appear higher in the list, and also appear higher when people search for keywords.
@@ -3261,7 +3261,7 @@ You are not allowed in that region due to your maturity Rating.
 
 Go to the Knowledge Base for more information about maturity Ratings?
     <url option="0" name="url">
-		https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+		http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
     </url>
     <usetemplate
      name="okcancelignore"
@@ -3318,7 +3318,7 @@ You cannot claim this land due to your maturity Rating.
 
 Go to the Knowledge Base for more information about maturity Ratings?
     <url option="0" name="url">
-		https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+		http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
     </url>
     <usetemplate
      name="okcancelignore"
@@ -3368,7 +3368,7 @@ You cannot buy this land due to your maturity Rating.
 
 Go to the Knowledge Base for more information about maturity Ratings?
     <url option="0" name="url">
-		https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+		http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
     </url>
     <usetemplate
      name="okcancelignore"
@@ -3765,7 +3765,7 @@ There are no items in this object that you are allowed to copy.
    icon="alertmodal.tga"
    name="WebLaunchAccountHistory"
    type="alertmodal">
-Go to  your [http://secondlife.com/account/ Dashboard] to see your account history?
+Go to your [http://secondlife.com/account/ Dashboard] to see your account history?
     <usetemplate
      ignoretext="Launch my browser to see my account history"
      name="okcancelignore"
diff --git a/indra/newview/skins/default/xui/es/floater_media_browser.xml b/indra/newview/skins/default/xui/es/floater_media_browser.xml
index ff50b56a32f..cdc7ae49ffe 100644
--- a/indra/newview/skins/default/xui/es/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/es/floater_media_browser.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="floater_about" title="NAVEGADOR">
+	<floater.string name="home_page_url">
+		http://es.secondlife.com
+	</floater.string>
+	<floater.string name="support_page_url">
+		http://es.secondlife.com/support
+	</floater.string>
 	<layout_stack name="stack1">
 		<layout_panel name="nav_controls">
 			<button label="Atrás" name="back" width="75"/>
diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index 33754f39356..fdb6a920841 100644
--- a/indra/newview/skins/default/xui/es/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/es/menu_viewer.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu_bar name="Main Menu">
+	<menu name="Me">
+		<menu_item_call label="Preferencias" name="Preferences"/>
+		<menu_item_call name="Manage My Account">
+			<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es" />
+		</menu_item_call>
+	</menu>
 	<menu label="Archivo" name="File">
 		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
 		<menu label="Subir" name="upload">
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index 86f3f1f1259..6b58bbea470 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -374,10 +374,13 @@ La carpeta del vestuario contiene partes del cuerpo, u objetos a anexar o que no
 Debe escribir tanto el nombre como el apellido de su avatar, los dos.
 
 Necesita una cuenta para entrar en [SECOND_LIFE]. ¿Quiere crear una ahora?
+		<url name="url">
+			https://join.secondlife.com/index.php?lang=es-ES
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Volver a intentarlo" yestext="Crear una cuenta nueva"/>
 	</notification>
 	<notification name="AddClassified">
-		Los anuncios clasificados aparecen durante una semana en la sección &apos;Clasificados&apos; del directorio Buscar y en www.secondlife.com.
+		Los anuncios clasificados aparecen durante una semana en la sección &apos;Clasificados&apos; del directorio Buscar y en [http://secondlife.com/community/classifieds/?lang=es-ES secondlife.com].
 Rellene su anuncio y pulse &apos;Publicar...&apos; para añadirlo al directorio.
 Cuando pulse Publicar, se le preguntará por un precio a pagar.
 El pagar más hará que su anuncio aparezca más arriba en la lista, y que también aparezca más arriba cuando la gente busque por palabras clave.
@@ -398,6 +401,9 @@ No se reembolsan las cuotas pagadas.
 	</notification>
 	<notification name="PromptGoToEventsPage">
 		¿Ir a la web de eventos de [SECOND_LIFE]?
+		<url name="url">
+			http://secondlife.com/events/?lang=es-ES
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
 	</notification>
 	<notification name="SelectProposalToView">
@@ -575,6 +581,9 @@ misma región.
 		[EXTRA]
 
 ¿Ir a [_URL] para informarse sobre la compra de L$?
+		<url name="url">
+			http://secondlife.com/app/currency/?lang=es-ES
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
 	</notification>
 	<notification name="UnableToLinkObjects">
@@ -1140,13 +1149,16 @@ Puede usar normalmente [SECOND_LIFE], los demás residentes le verán correctame
 		Se ha completado la instalación de [APP_NAME].
 
 Si esta es la primera vez que usa [SECOND_LIFE], deberá crear una cuenta antes de que pueda iniciar una sesión.
-¿Volver a www.secondlife.com para crear una cuenta nueva?
+¿Volver a [https://join.secondlife.com/index.php?lang=es-ES secondlife.com] para crear una cuenta nueva?
 		<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Cuenta nueva..."/>
 	</notification>
 	<notification name="LoginPacketNeverReceived">
 		Tenemos problemas de conexión. Puede deberse a un problema de su conexión a internet o de los servidores de [SECOND_LIFE].
 
 Puede revisar su conexión a internet y volver a intentarlo en unos minutos. Pulse Ayuda para conectarse a nuestro sitio de Sporte, o pulse Teleportar para intentar teleportarse a su Base.
+		<url name="url">
+			http://es.secondlife.com/support/
+		</url>
 		<form name="form">
 			<button name="OK" text="OK"/>
 			<button name="Help" text="Ayuda"/>
@@ -1520,7 +1532,7 @@ Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de C
 
 ¿Quiere ir a la Base de Conocimientos para aprender más sobre el nivel de calificación?
 		<url name="url">
-			https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
 		</url>
     <usetemplate
      name="okcancelignore"
@@ -1559,7 +1571,7 @@ Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de C
 
 ¿Quiere ir a la Base de Conocimientos para más información sobre el nivel de calificación?
 		<url name="url">
-			https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
 		</url>
     <usetemplate
      name="okcancelignore"
@@ -1593,7 +1605,7 @@ Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de C
 
 ¿Quiere ir a la Base de Conocimientos para más información sobre el nivel de calificación?
 		<url name="url">
-			https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
 		</url>
     <usetemplate
      name="okcancelignore"
@@ -2014,10 +2026,7 @@ Dado que estos objetos tienen scripts, moverlos a su inventario puede provocar u
 		<usetemplate ignoretext="Cuando esté saliendo de [APP_NAME]." name="okcancelignore" notext="Continuar" yestext="Salir"/>
 	</notification>
 	<notification name="HelpReportAbuseEmailLL">
-		Use esta herramienta para denunciar violaciones de las Normas de la Comunidad y las Condiciones del Servicio. Vea:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
+		Use esta herramienta para denunciar violaciones de las [http://secondlife.com/corporate/tos.php?lang=es-ES Condiciones del Servicio] y las [http://secondlife.com/corporate/cs.php?lang=es-ES Normas de la Comunidad].
 
 Se investigan y resuelven todas las infracciones denunciadas de las Normas de la Comunidad y las Condiciones del Servicio. Puede ver la resolución tomada en el Informe de Incidentes, en:
 
diff --git a/indra/newview/skins/default/xui/es/panel_login.xml b/indra/newview/skins/default/xui/es/panel_login.xml
index 6505424b35d..52c3855d6a3 100644
--- a/indra/newview/skins/default/xui/es/panel_login.xml
+++ b/indra/newview/skins/default/xui/es/panel_login.xml
@@ -1,11 +1,12 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="panel_login">
-	<string name="real_url">
-		http://secondlife.com/app/login/
-	</string>
-	<string name="forgot_password_url">
-		http://secondlife.com/account/request.php
-	</string>
+	<panel.string name="create_account_url">
+		http://join.secondlife.com/index.php?lang=es-ES
+	</panel.string>
+	<panel.string name="forgot_password_url">
+		http://secondlife.com/account/request.php?lang=es
+	</panel.string>
+<panel name="login_widgets">
 	<text name="first_name_text">
 		Nombre:
 	</text>
@@ -35,3 +36,4 @@
 		[VERSION]
 	</text>
 </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_profile.xml b/indra/newview/skins/default/xui/es/panel_profile.xml
new file mode 100644
index 00000000000..218e03dcce0
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_profile.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_profile">
+	<string name="CaptionTextAcctInfo">
+		[ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+	</string>
+	<string name="payment_update_link_url">
+		http://www.secondlife.com/account/billing.php?lang=es-ES
+	</string>
+	<string name="partner_edit_link_url">
+		http://www.secondlife.com/account/partners.php?lang=es
+	</string>
+	<string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=es-ES"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 294e407278f..dc508f7c374 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -4,6 +4,7 @@
      For example, the strings used in avatar chat bubbles, and strings 
      that are returned from one component and may appear in many places-->
 <strings>
+	<string name="create_account_url">http://join.secondlife.com/index.php?lang=es-ES</string>
 	<string name="LoginInProgress">
 		Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere.
 	</string>
diff --git a/indra/newview/skins/default/xui/fr/floater_media_browser.xml b/indra/newview/skins/default/xui/fr/floater_media_browser.xml
index 44ab075271b..986deaabc97 100644
--- a/indra/newview/skins/default/xui/fr/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/fr/floater_media_browser.xml
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="floater_about" title="NAVIGATEUR">
 	<floater.string name="home_page_url">
-		http://www.secondlife.com
+		http://fr.secondlife.com
 	</floater.string>
 	<floater.string name="support_page_url">
-		http://support.secondlife.com
+		http://fr.secondlife.com/support
 	</floater.string>
 	<layout_stack name="stack1">
 		<layout_panel name="nav_controls">
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index ea28b82d7e0..532714531b1 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu_bar name="Main Menu">
+	<menu name="Me">
+		<menu_item_call label="Préférences" name="Preferences"/>
+		<menu_item_call name="Manage My Account">
+			<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=fr" />
+		</menu_item_call>
+	</menu>
 	<menu label="Fichier" name="File">
 		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
 		<menu label="Importer" name="upload">
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index 7f6960c8fb9..558b04d68e3 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -285,7 +285,7 @@ Vous devez saisir le nom et le prénom de votre avatar.
 
 Pour entrer dans [SECOND_LIFE], vous devez avoir un compte. Voulez-vous en créer un maintenant ?
 		<url name="url">
-			http://join.secondlife.com/
+			https://join.secondlife.com/index.php?lang=fr-FR
 		</url>
 		<usetemplate name="okcancelbuttons" notext="Réessayer" yestext="Créer un compte"/>
 	</notification>
@@ -312,7 +312,7 @@ Une fois payés, les frais ne sont pas remboursables.
 	<notification name="PromptGoToEventsPage">
 		Aller à la page web de [SECOND_LIFE] réservée aux événements ?
 		<url name="url">
-			http://secondlife.com/events/
+			http://secondlife.com/events/?lang=fr-FR
 		</url>
 		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
 	</notification>
@@ -493,7 +493,7 @@ Veuillez mettre tous les objets que vous souhaitez acquérir dans la même régi
 
 Aller sur [_URL] pour obtenir des informations sur l&apos;achat de L$ ?
 		<url name="url">
-			http://secondlife.com/app/currency/
+			http://secondlife.com/app/currency/?lang=fr-FR
 		</url>
 		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
 	</notification>
@@ -1038,7 +1038,7 @@ Vous pouvez utiliser [SECOND_LIFE] normalement, les autres résidents vous voien
 		L&apos;installation de [APP_NAME] est terminée.
 
 S&apos;il s&apos;agit de la première fois que vous utilisez [SECOND_LIFE], vous devrez créer un compte avant de pouvoir vous connecter.
-Retourner sur www.secondlife.com pour créer un nouveau compte ?
+Retourner sur [https://join.secondlife.com/index.php?lang=fr-FR secondlife.com] pour créer un nouveau compte ?
 		<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Nouveau compte..."/>
 	</notification>
 	<notification name="LoginPacketNeverReceived">
@@ -1046,7 +1046,7 @@ Retourner sur www.secondlife.com pour créer un nouveau compte ?
 
 Vérifiez votre connextion Internet et réessayez dans quelques minutes, cliquez sur Aide pour consulter la page [SUPPORT_SITE] ou bien sur Téléporter pour essayer d&apos;aller chez vous.
 		<url name="url">
-			http://secondlife.com/support/
+			http://fr.secondlife.com/support/
 		</url>
 		<form name="form">
 			<button name="OK" text="OK"/>
@@ -1436,7 +1436,7 @@ Vérifiez que vous avez la toute dernière version du client et consultez les pa
 
 Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
 		<url name="url">
-			http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB)
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/fr
 		</url>
 		<usetemplate ignoretext="Je ne peux pas pénétrer dans cette région car je n&apos;ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
 	</notification>
@@ -1464,7 +1464,7 @@ Vérifiez que vous avez la toute dernière version du client et consultez les pa
 
 Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
 		<url name="url">
-			http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB)
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/fr
 		</url>
 		<usetemplate ignoretext="Je ne peux pas réclamer cette région car je n&apos;ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
 	</notification>
@@ -1488,7 +1488,7 @@ Vérifiez que vous avez la toute dernière version du client et consultez les pa
 
 Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
 		<url name="url">
-			http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB)
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/fr
 		</url>
 		<usetemplate ignoretext="Je ne peux pas acheter ce terrain car je n&apos;ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
 	</notification>
@@ -1672,10 +1672,7 @@ Déplacer les objets de l&apos;inventaire ?
 		<usetemplate ignoretext="Confirmer avant de quitter" name="okcancelignore" notext="Ne pas quitter" yestext="Quitter"/>
 	</notification>
 	<notification name="HelpReportAbuseEmailLL">
-		Utilisez cet outil pour signaler des infractions aux Conditions d&apos;utilisation et aux Règles de la communauté. Voir :
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
+		Utilisez cet outil pour signaler des infractions aux [http://secondlife.com/corporate/tos.php?lang=fr-FR Conditions d&apos;utilisation] et aux [http://secondlife.com/corporate/cs.php?lang=fr-FR Règles de la communauté].
 
 Lorsqu&apos;elles sont signalées, toutes les infractions aux Conditions d&apos;utilisation et aux Règles de la communauté font l&apos;objet d&apos;une enquête et sont résolues. Pour accéder aux détails de la résolution d&apos;un incident, allez sur :
 
diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml
index 284590cd5d7..f7ab2891e85 100644
--- a/indra/newview/skins/default/xui/fr/panel_login.xml
+++ b/indra/newview/skins/default/xui/fr/panel_login.xml
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="panel_login">
 	<panel.string name="create_account_url">
-		http://secondlife.com/registration/
+		http://fr.secondlife.com/registration/
 	</panel.string>
 	<panel.string name="forgot_password_url">
-		http://secondlife.com/account/request.php
+		http://secondlife.com/account/request.php?lang=fr
 	</panel.string>
 	<panel name="login_widgets">
 		<line_editor name="first_name_edit" tool_tip="Prénom sur [SECOND_LIFE]"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_pick_info.xml b/indra/newview/skins/default/xui/fr/panel_pick_info.xml
new file mode 100644
index 00000000000..642e31a2c36
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_pick_info.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+	<text name="title" value="Infos"/>
+	<scroll_container name="profile_scroll">
+		<panel name="scroll_content_panel">
+			<text name="pick_name" value="[name]"/>
+			<text name="pick_location" value="[chargement...]"/>
+			<text name="pick_desc" value="[description]"/>
+		</panel>
+	</scroll_container>
+	<panel name="buttons">
+		<button label="Téléporter" name="teleport_btn"/>
+		<button label="Carte" name="show_on_map_btn"/>
+		<button label="Éditer" name="edit_btn"/>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_profile.xml b/indra/newview/skins/default/xui/fr/panel_profile.xml
index e13de7a5d1f..dc28547cb49 100644
--- a/indra/newview/skins/default/xui/fr/panel_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_profile.xml
@@ -1,12 +1,16 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Profil" name="panel_profile">
 	<string name="CaptionTextAcctInfo">
-		[ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+		[ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
 	</string>
 	<string name="payment_update_link_url">
-		http://www.secondlife.com/account/billing.php?lang=en
+		http://www.secondlife.com/account/billing.php?lang=fr-FR
 	</string>
-	<string name="my_account_link_url" value="http://secondlife.com/account"/>
+	<string name="partner_edit_link_url">
+		http://www.secondlife.com/account/partners.php?lang=fr
+	</string>
+	<string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=fr-FR"/>
 	<string name="no_partner_text" value="Aucun"/>
 	<scroll_container name="profile_scroll">
 		<panel name="scroll_content_panel">
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 2d0df66f18b..c59e359d6ec 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -4,6 +4,7 @@
      For example, the strings used in avatar chat bubbles, and strings 
      that are returned from one component and may appear in many places-->
 <strings>
+	<string name="create_account_url">http://join.secondlife.com/index.php?lang=fr-FR</string>
 	<string name="SECOND_LIFE">
 		Second Life
 	</string>
@@ -158,7 +159,7 @@
 		Cliquez pour exécuter la commande secondlife:// command
 	</string>
 	<string name="BUTTON_CLOSE_DARWIN">
-		Fermer (⌘-W)
+		Fermer (&#8984;W)
 	</string>
 	<string name="BUTTON_CLOSE_WIN">
 		Fermer (Ctrl+W)
@@ -1311,16 +1312,16 @@
 		Modifier le repère...
 	</string>
 	<string name="accel-mac-control">
-		⌃
+		&#8963;
 	</string>
 	<string name="accel-mac-command">
-		⌘
+		&#8984;
 	</string>
 	<string name="accel-mac-option">
-		⌥
+		&#8997;
 	</string>
 	<string name="accel-mac-shift">
-		⇧
+		&#8679;
 	</string>
 	<string name="accel-win-control">
 		Ctrl+
diff --git a/indra/newview/skins/default/xui/it/floater_media_browser.xml b/indra/newview/skins/default/xui/it/floater_media_browser.xml
index 7a5f9c9fcbc..0e25cef60b7 100644
--- a/indra/newview/skins/default/xui/it/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/it/floater_media_browser.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="floater_about" title="BROWSER MULTIMEDIALE">
+	<floater.string name="home_page_url">
+		http://it.secondlife.com
+	</floater.string>
+	<floater.string name="support_page_url">
+		http://it.secondlife.com/support
+	</floater.string>
 	<layout_stack name="stack1">
 		<layout_panel name="nav_controls">
 			<button label="Indietro" name="back" width="75"/>
diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml
index 0010f42a12a..b1eb80149e9 100644
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu_bar name="Main Menu">
+	<menu name="Me">
+		<menu_item_call label="Preferenze" name="Preferences"/>
+		<menu_item_call name="Manage My Account">
+			<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=it" />
+		</menu_item_call>
+	</menu>
 	<menu label="File" name="File">
 		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
 		<menu label="Carica" name="upload">
diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml
index 8f8a969acef..26a64a49d39 100644
--- a/indra/newview/skins/default/xui/it/notifications.xml
+++ b/indra/newview/skins/default/xui/it/notifications.xml
@@ -379,10 +379,13 @@ La cartella equipaggiamento non contiene abbigliamento, parti del corpo o attach
 Devi inserire sia il nome che il cognome del tuo avatar.
 
 Hai bisogno di un account per entrare in [SECOND_LIFE]. Ne vuoi creare uno adesso?
+		<url name="url">
+			https://join.secondlife.com/index.php?lang=it-IT
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Riprova" yestext="Crea un nuovo account"/>
 	</notification>
 	<notification name="AddClassified">
-		Gli annunci appaiono nella sezione &apos;Annunci&apos; della ricerca nel database e su www.secondlife.com per una settimana.
+		Gli annunci appaiono nella sezione &apos;Annunci&apos; della ricerca nel database e su [http://secondlife.com/community/classifieds/?lang=it-IT secondlife.com] per una settimana.
 Compila il tuo annuncio e clicca &apos;Pubblica...&apos; per aggiungerlo al database.
 Ti verrà chiesto un prezzo da pagare quando clicchi su Pubblica.
 Pagare un prezzo più alto fa sì che il tuo annuncio compaia più in alto nella lista, e che sia più facile da trovare quando la gente ricerca per parole chiavi.
@@ -403,6 +406,9 @@ Non ci sono rimborsi per la tariffa pagata.
 	</notification>
 	<notification name="PromptGoToEventsPage">
 		Vai alla pagina degli eventi di [SECOND_LIFE]?
+		<url name="url">
+			http://secondlife.com/events/?lang=it-IT
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
 	</notification>
 	<notification name="SelectProposalToView">
@@ -575,6 +581,9 @@ Sposta tutti gli oggetti che vuoi acquisire su una sola regione.
 		[EXTRA]
 
 Vuoi andare su [_URL] per maggiori informazioni su come acquistare L$?
+		<url name="url">
+			http://secondlife.com/app/currency/?lang=it-IT
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
 	</notification>
 	<notification name="UnableToLinkObjects">
@@ -1128,13 +1137,16 @@ Puoi usare [SECOND_LIFE] normalmente e gli altri utenti ti vedranno correttament
 		L&apos;installazione di [APP_NAME] è completata.
 
 Se questa è la prima volta che usi [SECOND_LIFE], avari bisogno di creare un account prima di poterti collegare.
-Vai su www.secondlife.com per creare un nuovo account?
+Vai su [https://join.secondlife.com/index.php?lang=it-IT secondlife.com] per creare un nuovo account?
 		<usetemplate name="okcancelbuttons" notext="Continua" yestext="Nuovo Account..."/>
 	</notification>
 	<notification name="LoginPacketNeverReceived">
 		Ci sono stati problemi durante la connessione. Potrebbero esserci problemi con la tua connessione ad internet oppure con i server di [SECOND_LIFE].
 
 Puoi controllare la tua connessione internet e riprovare fra qualche minuto, oppure cliccare su Aiuto per collegarti al nostro sito di supporto, oppure cliccare teleporta per cercare di teleportarti a casa.
+		<url name="url">
+			http://it.secondlife.com/support/
+		</url>
 		<form name="form">
 			<button name="OK" text="OK"/>
 			<button name="Help" text="Aiuto"/>
@@ -1510,7 +1522,7 @@ Verifica di avere installato l&apos;ultima versione del programma e vai alla Kno
 
 Vuoi andare alla Knowledge Base per ulteriori informazioni sulle categorie di accesso?
 		<url name="url">
-			https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
 		</url>
     <usetemplate
      name="okcancelignore"
@@ -1549,7 +1561,7 @@ Verifica di avere installato l&apos;ultima versione del programma e vai alla Kno
 
 Vuoi andare alla Knowledge Base per maggiori informazioni sulle categorie di accesso?
 		<url name="url">
-			https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
 		</url>
     <usetemplate
      name="okcancelignore"
@@ -1583,7 +1595,7 @@ Verifica di avere installato l&apos;ultima versione del programma e vai alla Kno
 
 Vuoi andare alla Knowledge Base per maggiori informazioni sulle categorie di accesso?
 		<url name="url">
-			https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
 		</url>
     <usetemplate
      name="okcancelignore"
@@ -2008,10 +2020,7 @@ Trasferisci gli elementi nell&apos;inventario?
 		<usetemplate ignoretext="Quando esci da [APP_NAME]." name="okcancelignore" notext="Continua" yestext="Esci"/>
 	</notification>
 	<notification name="HelpReportAbuseEmailLL">
-		Usa questo strumento per segnalare violazioni ai Termini di Servizio e agli standard della Comunità. Vedi:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
+		Usa questo strumento per segnalare violazioni ai [http://secondlife.com/corporate/tos.php?lang=it-IT Termini di Servizio] e agli [http://secondlife.com/corporate/cs.php?lang=it-IT standard della Comunità].
 
 Tutte gli abusi ai Termini di Servizio e agli Standard della Comunità segnalati, sono indagati e risolti. Puoi controllare la risoluzione degli abusi visitando la pagina delle Risoluzioni degli Incidenti:
 
@@ -2366,7 +2375,7 @@ Vuoi visitare il sito di [SECOND_LIFE] per verificare la tua eta?
 
 [_URL]
 		<url name="url" option="0">
-			https://secondlife.com/account/verification.php
+			https://secondlife.com/account/verification.php?lang=it
 		</url>
 		<usetemplate ignoretext="Quando hai un avviso per mancanza della verifica dell&apos;età." name="okcancelignore" notext="No" yestext="Si"/>
 	</notification>
diff --git a/indra/newview/skins/default/xui/it/panel_login.xml b/indra/newview/skins/default/xui/it/panel_login.xml
index 17820890393..e3cb7473fc4 100644
--- a/indra/newview/skins/default/xui/it/panel_login.xml
+++ b/indra/newview/skins/default/xui/it/panel_login.xml
@@ -1,11 +1,12 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="panel_login">
-	<string name="real_url">
-		http://secondlife.com/app/login/
-	</string>
-	<string name="forgot_password_url">
-		http://secondlife.com/account/request.php
-	</string>
+	<panel.string name="create_account_url">
+		http://join.secondlife.com/index.php?lang=it-IT
+	</panel.string>
+	<panel.string name="forgot_password_url">
+		http://secondlife.com/account/request.php?lang=it
+	</panel.string>
+<panel name="login_widgets">
 	<text name="first_name_text" left="20">
 		Nome:
 	</text>
@@ -37,3 +38,4 @@
 		[VERSION]
 	</text>
 </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_profile.xml b/indra/newview/skins/default/xui/it/panel_profile.xml
new file mode 100644
index 00000000000..2aa8b7d0e4a
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_profile.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_profile">
+	<string name="CaptionTextAcctInfo">
+		[ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+	</string>
+	<string name="payment_update_link_url">
+		http://www.secondlife.com/account/billing.php?lang=it-IT
+	</string>
+	<string name="partner_edit_link_url">
+		http://www.secondlife.com/account/partners.php?lang=it
+	</string>
+	<string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=it-IT"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index bc3cc38a407..6e3301fdd91 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -4,6 +4,7 @@
      For example, the strings used in avatar chat bubbles, and strings 
      that are returned from one component and may appear in many places-->
 <strings>
+	<string name="create_account_url">http://join.secondlife.com/index.php?lang=it-IT</string>
 	<string name="LoginInProgress">
 		In connessione. [APP_NAME] può sembrare rallentata.  Attendi.
 	</string>
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index bb33a14be4a..77aeeefe02d 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu_bar name="Main Menu">
+	<menu name="Me">
+		<menu_item_call label="環境設定" name="Preferences"/>
+		<menu_item_call name="Manage My Account">
+			<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=ja" />
+		</menu_item_call>
+	</menu>
 	<menu label="ファイル" name="File">
 		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
 		<menu label="アップロード" name="upload">
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index 9962bedaf20..fca7c891835 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -340,7 +340,7 @@ L$が不足しているのでこのグループに参加することができま
 	<notification name="PromptGoToEventsPage">
 		[SECOND_LIFE]イベント・ウェブ・ページに移動しますか?
 		<url name="url">
-			http://jp.secondlife.com/events/
+			http://secondlife.com/events/?lang=ja-JP
 		</url>
 		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
 	</notification>
@@ -530,7 +530,7 @@ L$が不足しているのでこのグループに参加することができま
 
 [_URL] でリンデンドル購入に関する情報を確認しますか?
 		<url name="url">
-			http://jp.secondlife.com/currency/
+			http://secondlife.com/app/currency/?lang=ja-JP
 		</url>
 		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
 	</notification>
@@ -1113,7 +1113,7 @@ L$は返金されません。
 
 [SECOND_LIFE] の使用が初めての方は、
 ログイン前にアカウントの作成が必要です。
-www.secondlife.comに移動し、新規アカウントの作成を行いますか?
+[https://join.secondlife.com/index.php?lang=ja-JP secondlife.com]に移動し、新規アカウントの作成を行いますか?
 		<usetemplate name="okcancelbuttons" notext="続行" yestext="新規アカウント..."/>
 	</notification>
 	<notification name="LoginPacketNeverReceived">
@@ -1524,7 +1524,7 @@ F1キーを押してください。
 
 ナレッジベースを開きレーティング区分について学びますか?
 		<url name="url">
-			http://wiki.secondlife.com/wiki/レーティング区分概要_(KB)
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja
 		</url>
 		<usetemplate ignoretext="レーティング区分の制限のため、このリージョンに入ることができません" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
 	</notification>
@@ -1553,7 +1553,7 @@ F1キーを押してください。
 
 ナレッジベースを開きレーティング区分について学びますか?
 		<url name="url">
-			http://wiki.secondlife.com/wiki/レーティング区分概要_(KB)
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja
 		</url>
 		<usetemplate ignoretext="レーティング区分の制限のため、この土地を取得できません" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
 	</notification>
@@ -1578,7 +1578,7 @@ F1キーを押してください。
 
 ナレッジベースを開きレーティング区分について学びますか?
 		<url name="url">
-			http://wiki.secondlife.com/wiki/レーティング区分概要_(KB)
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja
 		</url>
 		<usetemplate ignoretext="レーティング区分の制限のため、この土地を購入できません" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
 	</notification>
diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml
index 00b9d5aa47d..27eed48d825 100644
--- a/indra/newview/skins/default/xui/ja/panel_login.xml
+++ b/indra/newview/skins/default/xui/ja/panel_login.xml
@@ -4,7 +4,7 @@
 		http://jp.secondlife.com/registration/
 	</panel.string>
 	<panel.string name="forgot_password_url">
-		http://secondlife.com/account/request.php
+		http://secondlife.com/account/request.php?lang=ja
 	</panel.string>
 	<panel name="login_widgets">
 		<line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] ファーストネーム"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile.xml b/indra/newview/skins/default/xui/ja/panel_profile.xml
index 8c94833a54a..a449c10e108 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile.xml
@@ -1,12 +1,16 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="プロフィール" name="panel_profile">
 	<string name="CaptionTextAcctInfo">
-		[ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+		[ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
 	</string>
 	<string name="payment_update_link_url">
-		http://www.secondlife.com/account/billing.php?lang=ja
+		http://www.secondlife.com/account/billing.php?lang=ja-JP
 	</string>
-	<string name="my_account_link_url" value="http://secondlife.com/account"/>
+	<string name="partner_edit_link_url">
+		http://www.secondlife.com/account/partners.php?lang=ja
+	</string>
+	<string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=ja-JP"/>
 	<string name="no_partner_text" value="なし"/>
 	<scroll_container name="profile_scroll">
 		<panel name="scroll_content_panel">
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index d6d41aecc0e..fc9e4b67b71 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -4,6 +4,7 @@
      For example, the strings used in avatar chat bubbles, and strings 
      that are returned from one component and may appear in many places-->
 <strings>
+	<string name="create_account_url">http://join.secondlife.com/index.php?lang=ja-JP</string>
 	<string name="SECOND_LIFE">
 		Second Life
 	</string>
@@ -158,7 +159,7 @@
 		クリックして secondlife:// コマンドを出す
 	</string>
 	<string name="BUTTON_CLOSE_DARWIN">
-		閉じる (⌘-W)
+		閉じる (&#8984;W)
 	</string>
 	<string name="BUTTON_CLOSE_WIN">
 		閉じる (Ctrl+W)
@@ -1311,16 +1312,16 @@
 		ランドマークを編集...
 	</string>
 	<string name="accel-mac-control">
-		⌃
+		&#8963;
 	</string>
 	<string name="accel-mac-command">
-		⌘
+		&#8984;
 	</string>
 	<string name="accel-mac-option">
-		⌥
+		&#8997;
 	</string>
 	<string name="accel-mac-shift">
-		⇧
+		&#8679;
 	</string>
 	<string name="accel-win-control">
 		Ctrl+
diff --git a/indra/newview/skins/default/xui/nl/notifications.xml b/indra/newview/skins/default/xui/nl/notifications.xml
index 9a83eaea614..a282c267a1c 100644
--- a/indra/newview/skins/default/xui/nl/notifications.xml
+++ b/indra/newview/skins/default/xui/nl/notifications.xml
@@ -380,6 +380,9 @@ De outfit folder bevat geen kleding, lichaamsdelen of externe bevestigingen.
 U moet zowel de voornaam als de achternaam van uw avatar opgeven.
 
 U heeft een account nodig om [SECOND_LIFE] binnen te gaan. Wilt u er nu een maken?
+		<url name="url">
+			https://join.secondlife.com/index.php?lang=nl-NL
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Probeer het opnieuw" yestext="Maak een nieuw account"/>
 	</notification>
 	<notification name="AddClassified">
@@ -1131,7 +1134,7 @@ U kunt [SECOND_LIFE] normaal gebruiken en anderen zullen u correct zien.
 		[APP_NAME] installatie compleet.
 
 Als dit de eerste keer is dat u [SECOND_LIFE] gebruikt, zult u een account aan moeten maken voordat u in kan loggen.
-Terugkeren naar www.secondlife.com om een nieuw account aan te maken?
+Terugkeren naar [https://join.secondlife.com/index.php?lang=nl-NL secondlife.com] om een nieuw account aan te maken?
 		<usetemplate name="okcancelbuttons" notext="Doorgaan" yestext="Nieuw Account..."/>
 	</notification>
 	<notification name="LoginPacketNeverReceived">
diff --git a/indra/newview/skins/default/xui/nl/panel_login.xml b/indra/newview/skins/default/xui/nl/panel_login.xml
index 5bfb9dd2358..235e15e7fbc 100644
--- a/indra/newview/skins/default/xui/nl/panel_login.xml
+++ b/indra/newview/skins/default/xui/nl/panel_login.xml
@@ -1,11 +1,12 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="panel_login">
-	<string name="real_url">
-		http://secondlife.com/app/login/
-	</string>
-	<string name="forgot_password_url">
-		http://secondlife.com/account/request.php
-	</string>
+	<panel.string name="create_account_url">
+		http://join.secondlife.com/index.php?lang=nl-NL
+	</panel.string>
+	<panel.string name="forgot_password_url">
+		http://secondlife.com/account/request.php?lang=nl-NL
+	</panel.string>
+<panel name="login_widgets">
 	<text name="first_name_text">
 		Voornaam:
 	</text>
@@ -35,3 +36,4 @@
 		[VERSION]
 	</text>
 </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/nl/strings.xml b/indra/newview/skins/default/xui/nl/strings.xml
index 49ebcd319ca..0be5ec9e869 100644
--- a/indra/newview/skins/default/xui/nl/strings.xml
+++ b/indra/newview/skins/default/xui/nl/strings.xml
@@ -4,6 +4,7 @@
      For example, the strings used in avatar chat bubbles, and strings 
      that are returned from one component and may appear in many places-->
 <strings>
+	<string name="create_account_url">http://join.secondlife.com/index.php?lang=nl-NL</string>
 	<string name="LoginInProgress">
 		Inloggen. Het kan lijken dat [APP_NAME] is vastgelopen. Wacht u alstublieft... .
 	</string>
diff --git a/indra/newview/skins/default/xui/pt/floater_media_browser.xml b/indra/newview/skins/default/xui/pt/floater_media_browser.xml
index 3437dfcdba3..1cd6d5662c2 100644
--- a/indra/newview/skins/default/xui/pt/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/pt/floater_media_browser.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater min_width="477" name="floater_about" title="NAVEGADOR DE MÍDIA" width="570">
+	<floater.string name="home_page_url">
+		http://br.secondlife.com
+	</floater.string>
+	<floater.string name="support_page_url">
+		http://br.secondlife.com/support
+	</floater.string>
 	<layout_stack name="stack1" width="550">
 		<layout_panel name="nav_controls">
 			<button label="Para trás" name="back" width="75"/>
diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml
index c476ef0bbcd..2c887fa50c0 100644
--- a/indra/newview/skins/default/xui/pt/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu_bar name="Main Menu">
+	<menu name="Me">
+		<menu_item_call label="Preferências" name="Preferences"/>
+		<menu_item_call name="Manage My Account">
+			<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=pt" />
+		</menu_item_call>
+	</menu>
 	<menu label="Arquivo" name="File">
 		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
 		<menu label="Upload" name="upload">
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index 0ee2c5cb849..c3ce53861f4 100644
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -377,10 +377,13 @@ Scripts devem ser permitidos para fazer as armas funcionarem.
 Você precisa entrar com ambos os Nome e Sobrenome do seu avatar.
 
 Você precisa de uma conta para entrar no [SECOND_LIFE]. Você gostaria de criar uma conta agora?
+		<url name="url">
+			https://join.secondlife.com/index.php?lang=pt-BR
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Tentar novamente" yestext="Criar uma nova conta"/>
 	</notification>
 	<notification name="AddClassified">
-		Anúncios classificados aparecem na seção &apos;Classificados&apos; do diretório de Busca e no www.secondlife.com por uma semana.
+		Anúncios classificados aparecem na seção &apos;Classificados&apos; do diretório de Busca e no [http://secondlife.com/community/classifieds/?lang=pt-BR secondlife.com] por uma semana.
 Preencha seu anúncio e então clique &apos;Publicar...&apos; para adicioná-lo ao diretório.
 Será solicitado a você um preço a ser pago, quando você clicar Publicar.
 Pagando mais, faz com que seu anúncio apareça em posição mais alta na lista e também em posição mais alta, quando as pessoas buscarem por palavras-chave.
@@ -401,6 +404,9 @@ Não há reembolso por taxas já pagas.
 	</notification>
 	<notification name="PromptGoToEventsPage">
 		Ir até a página web de enventos [SECOND_LIFE] ?
+		<url name="url">
+			http://secondlife.com/events/?lang=pt-BR
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir à página"/>
 	</notification>
 	<notification name="SelectProposalToView">
@@ -492,7 +498,7 @@ O objeto pode estar fora de alcance ou ter sido deletado.
 MINSPECS
 Você deseja visitar [_URL] para maiores informações?
 		<url name="url" option="0">
-			http://www.secondlife.com/corporate/sysreqs.php
+			http://secondlife.com/support/sysreqs.php?lang=pt
 		</url>
 		<usetemplate ignoretext="Ao detectar hardware não suportado" name="okcancelignore" notext="Não" yestext="Sim"/>
 	</notification>
@@ -571,6 +577,9 @@ Por favor, mova todos os objetos a serem adquiridos para uma mesma região.
 		[EXTRA]
 
 Vá para [_URL] para informação sobre compra de L$.
+		<url name="url">
+			http://secondlife.com/app/currency/?lang=pt-BR
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir até a página"/>
 	</notification>
 	<notification name="UnableToLinkObjects">
@@ -1115,13 +1124,16 @@ Você pode usar o [SECOND_LIFE] normalmente e os outros o visualizarão corretam
 		A instalação do [APP_NAME] está completa.
 
 Se esta é a primeira vez usando o[SECOND_LIFE], será necessário que você crie uma conta antes de poder se logar.
-Retornar a www.secondlife.com para criar uma nova conta?
+Retornar a [https://join.secondlife.com/index.php?lang=pt-BR secondlife.com] para criar uma nova conta?
 		<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Nova conta.."/>
 	</notification>
 	<notification name="LoginPacketNeverReceived">
 		Estamos com problemas de conexão. Pode ser problema com a conexão de sua internet ou com os servidores do [SECOND_LIFE].
 
 Voce tanto pode checar a conexão de sua internet e tentar novamente em alguns minutos, ou clicar em Teletransporte para tentar teletransportar-se para sua casa.
+		<url name="url">
+			http://br.secondlife.com/support/
+		</url>
 		<form name="form">
 			<button name="OK" text="OK"/>
 			<button name="Help" text="Ajuda"/>
@@ -1492,7 +1504,7 @@ Por favor, verifique se você está com o último Visualizador instalado e vá a
 
 Ir para o Banco de Conhecimento para maiores informações sobre Classificações de maturidade?
 		<url name="url">
-			https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt
 		</url>
     <usetemplate
      name="okcancelignore"
@@ -1531,7 +1543,7 @@ Por favor, verifique se você tem o último Visualizador instalado e vá para o
 
 Ir para a o Banco de Conhecimento para maiores informações sobre Classificações de maturidade?
 		<url name="url">
-			https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt
 		</url>
     <usetemplate
      name="okcancelignore"
@@ -1565,7 +1577,7 @@ Por favor, verifique se você tem o último Visualizador instalado e vá para o
 
 Ir para o Banco de Conhecimento para maiores informações sobre Classificações de Maturidade?
 		<url name="url">
-			https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt
 		</url>
     <usetemplate
      name="okcancelignore"
@@ -1975,10 +1987,7 @@ Mover para o inventário o(s) item(s)?
 		<usetemplate ignoretext="Quando Saindo do [APP_NAME]." name="okcancelignore" notext="Continuar" yestext="Sair"/>
 	</notification>
 	<notification name="HelpReportAbuseEmailLL">
-		Use esta ferramenta para reportar violações aos Termos de Serviço e aos Padrões da Comunidade. Veja:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
+		Use esta ferramenta para reportar violações aos [http://secondlife.com/corporate/tos.php?lang=pt-BR Termos de Serviço] e aos [http://secondlife.com/corporate/cs.php?lang=pt-BR Padrões da Comunidade].
 
 Todos os abusos aos Termos de Serviço e aos Padrões da Comunidade reportados, são investigados e resolvidos. Você pode ver a resolução do incidente na Reportagem de Incidentes em:
 
diff --git a/indra/newview/skins/default/xui/pt/panel_login.xml b/indra/newview/skins/default/xui/pt/panel_login.xml
index c6f1433440c..d7ff3f29df1 100644
--- a/indra/newview/skins/default/xui/pt/panel_login.xml
+++ b/indra/newview/skins/default/xui/pt/panel_login.xml
@@ -1,5 +1,12 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="panel_login">
+	<panel.string name="create_account_url">
+		http://join.secondlife.com/index.php?lang=pt-BR
+	</panel.string>
+	<panel.string name="forgot_password_url">
+		http://secondlife.com/account/request.php?lang=pt
+	</panel.string>
+<panel name="login_widgets">
 	<text name="first_name_text">
 		Primeiro nome:
 	</text>
@@ -29,3 +36,4 @@
 		[VERSION]
 	</text>
 </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_profile.xml b/indra/newview/skins/default/xui/pt/panel_profile.xml
new file mode 100644
index 00000000000..ff53aa6a41d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_profile.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_profile">
+	<string name="CaptionTextAcctInfo">
+		[ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+	</string>
+	<string name="payment_update_link_url">
+		http://www.secondlife.com/account/billing.php?lang=pt-BR
+	</string>
+	<string name="partner_edit_link_url">
+		http://www.secondlife.com/account/partners.php?lang=pt
+	</string>
+	<string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=pt-BR"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index 2d3514e5fe8..9acfce99dd1 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -4,6 +4,7 @@
      For example, the strings used in avatar chat bubbles, and strings 
      that are returned from one component and may appear in many places-->
 <strings>
+	<string name="create_account_url">http://join.secondlife.com/index.php?lang=pt-BR</string>
 	<string name="LoginInProgress">
 		Fazendo Login. [APP_NAME] pode parecer congelado. Por favor, aguarde.
 	</string>
-- 
GitLab


From 8f451be20e6ef4f9965a9f7f8dbd9145124956b3 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Fri, 20 Nov 2009 17:12:46 -0800
Subject: [PATCH 497/557] Change to fix DEV-43230 (Japanese input methods don't
 work with the web browser plugin on the Mac.)

Inside LLWindowMacOSX::allowLanguageTextInput(), tell the Text Services Manager to put up its own UI for input methods if language text input is being disallowed.  This means that the non-inline UI will come up when when entering text in a browser plugin instance with an interactive text input method selected.
---
 indra/llwindow/llwindowmacosx.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index 96e5a1b7ca2..af9a30cb257 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -522,7 +522,6 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
 		if (mTSMDocument)
 		{
 			ActivateTSMDocument(mTSMDocument);
-			UseInputWindow(mTSMDocument, FALSE);
 			allowLanguageTextInput(NULL, FALSE);
 		}
 	}
@@ -3317,6 +3316,8 @@ void LLWindowMacOSX::allowLanguageTextInput(LLPreeditor *preeditor, BOOL b)
 		return;
 	}
 
+	UseInputWindow(mTSMDocument, !b);
+	
 	// Take care of old and new preeditors.
 	if (preeditor != mPreeditor || !b)
 	{
-- 
GitLab


From 1b07c1d7fb5b6d3ce15083bc3dbb65a3f0ac8006 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Fri, 20 Nov 2009 17:49:52 -0800
Subject: [PATCH 498/557] Fix for DEV-43040 (Change media focus rules to be the
 same as alt-zoom).

Added an optional reset_camera parameter to LLPanelPrimMediaControls ::resetZoomLevel(). Default is true, but if false it prevents the reset from moving the camera, and just resets the internal state for zoom tracking.

Fixed zoom-related bugs in LLPanelPrimMediaControls::close() and LLPanelPrimMediaControls::onClickZoom().

Changed the zooming behavior in LLViewerMediaFocus to match the desired behavior.
---
 indra/newview/llpanelprimmediacontrols.cpp | 16 +++++++++----
 indra/newview/llpanelprimmediacontrols.h   |  2 +-
 indra/newview/llviewermediafocus.cpp       | 28 ++++++++++++++++++----
 3 files changed, 36 insertions(+), 10 deletions(-)

diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index aca0e1d5c7e..529912929d6 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -782,8 +782,8 @@ void LLPanelPrimMediaControls::onClickClose()
 
 void LLPanelPrimMediaControls::close()
 {
+	resetZoomLevel(true);
 	LLViewerMediaFocus::getInstance()->clearFocus();
-	resetZoomLevel();
 	setVisible(FALSE);
 }
 
@@ -921,8 +921,11 @@ void LLPanelPrimMediaControls::onClickSkipForward()
 void LLPanelPrimMediaControls::onClickZoom()
 {
 	focusOnTarget();
-
-	nextZoomLevel();
+	
+	if(mCurrentZoom == ZOOM_NONE)
+	{
+		nextZoomLevel();
+	}
 }
 
 void LLPanelPrimMediaControls::nextZoomLevel()
@@ -941,12 +944,15 @@ void LLPanelPrimMediaControls::nextZoomLevel()
 	updateZoom();
 }
 
-void LLPanelPrimMediaControls::resetZoomLevel()
+void LLPanelPrimMediaControls::resetZoomLevel(bool reset_camera)
 {
 	if(mCurrentZoom != ZOOM_NONE)
 	{
 		mCurrentZoom = ZOOM_NONE;
-		updateZoom();
+		if(reset_camera)
+		{
+			updateZoom();
+		}
 	}
 }
 
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index 54fc4e343fc..accfb72a049 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -58,7 +58,7 @@ class LLPanelPrimMediaControls : public LLPanel
 	void updateShape();
 	bool isMouseOver();
 	void nextZoomLevel();
-	void resetZoomLevel();
+	void resetZoomLevel(bool reset_camera = true);
 	void close();
 
 	LLHandle<LLPanelPrimMediaControls>	getHandle() const { return mPanelHandle; }
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index 70a7d835a36..fd74c9c2fca 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -120,10 +120,20 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
 		// We must do this before  processing the media HUD zoom, or it may zoom to the wrong face. 
 		update();
 
-		if(mMediaControls.get() && face_auto_zoom && ! parcel->getMediaPreventCameraZoom())
+		if(mMediaControls.get())
 		{
-			mMediaControls.get()->resetZoomLevel();
-			mMediaControls.get()->nextZoomLevel();
+			if(face_auto_zoom && ! parcel->getMediaPreventCameraZoom())
+			{
+				// Zoom in on this face
+				mMediaControls.get()->resetZoomLevel();
+				mMediaControls.get()->nextZoomLevel();
+			}
+			else
+			{
+				// Reset the controls' zoom level without moving the camera.
+				// This fixes the case where clicking focus between two non-autozoom faces doesn't change the zoom-out button back to a zoom-in button.
+				mMediaControls.get()->resetZoomLevel(false);
+			}
 		}
 	}
 	else
@@ -132,7 +142,8 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
 		{
 			if(mMediaControls.get())
 			{
-				mMediaControls.get()->resetZoomLevel();
+				// Don't reset camera zoom by default, just tell the controls they're no longer controlling zoom.
+				mMediaControls.get()->resetZoomLevel(false);
 			}
 		}
 
@@ -292,6 +303,15 @@ BOOL LLViewerMediaFocus::handleKey(KEY key, MASK mask, BOOL called_from_parent)
 
 		if (key == KEY_ESCAPE)
 		{
+			// Reset camera zoom in this case.
+			if(mFocusedImplID.notNull())
+			{
+				if(mMediaControls.get())
+				{
+					mMediaControls.get()->resetZoomLevel(true);
+				}
+			}
+			
 			clearFocus();
 		}
 	}
-- 
GitLab


From e367e2efc23321d94ec4a4ae0264f885b4f0333b Mon Sep 17 00:00:00 2001
From: angela <angela@lindenlab.com>
Date: Mon, 23 Nov 2009 13:52:40 +0800
Subject: [PATCH 499/557] EXT-2159 Create Vertical Slider to use for zoom in /
 out controls in view

---
 indra/llui/llsliderctrl.cpp                       |  3 ++-
 indra/llui/llsliderctrl.h                         |  4 +++-
 .../skins/default/xui/en/floater_test_slider.xml  | 15 ++++++++++++++-
 3 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/indra/llui/llsliderctrl.cpp b/indra/llui/llsliderctrl.cpp
index ed22c0a47f8..ac35bc79923 100644
--- a/indra/llui/llsliderctrl.cpp
+++ b/indra/llui/llsliderctrl.cpp
@@ -122,7 +122,8 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p)
 	slider_p.min_value.setIfNotProvided(p.min_value);
 	slider_p.max_value.setIfNotProvided(p.max_value);
 	slider_p.increment.setIfNotProvided(p.increment);
-
+	slider_p.orientation.setIfNotProvided(p.orientation);
+	
 	slider_p.commit_callback.function(&LLSliderCtrl::onSliderCommit);
 	slider_p.control_name(p.control_name);
 	slider_p.mouse_down_callback( p.mouse_down_callback );
diff --git a/indra/llui/llsliderctrl.h b/indra/llui/llsliderctrl.h
index 4a1574d5021..c4258497822 100644
--- a/indra/llui/llsliderctrl.h
+++ b/indra/llui/llsliderctrl.h
@@ -46,6 +46,7 @@ class LLSliderCtrl : public LLF32UICtrl
 public:
 	struct Params : public LLInitParam::Block<Params, LLF32UICtrl::Params>
 	{
+		Optional<std::string>   orientation;
 		Optional<S32>			label_width;
 		Optional<S32>			text_width;
 		Optional<bool>			show_text;
@@ -78,7 +79,8 @@ class LLSliderCtrl : public LLF32UICtrl
 			value_text("value_text"),
 			slider_label("slider_label"),
 			mouse_down_callback("mouse_down_callback"),
-			mouse_up_callback("mouse_up_callback")
+			mouse_up_callback("mouse_up_callback"),
+			orientation("orientation", std::string ("horizontal"))
 		{}
 	};
 protected:
diff --git a/indra/newview/skins/default/xui/en/floater_test_slider.xml b/indra/newview/skins/default/xui/en/floater_test_slider.xml
index 86ff82e01f2..85d8bb2bb1b 100644
--- a/indra/newview/skins/default/xui/en/floater_test_slider.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_slider.xml
@@ -2,7 +2,7 @@
 <floater
  legacy_header_height="18"
  can_resize="true"
- height="400"
+ height="500"
  layout="topleft"
  name="floater_test_slider"
  help_topic="floater_test_slider"
@@ -84,4 +84,17 @@
      name="red_slider"
      text_color="red"
      text_width="40" />
+	<slider
+	 width ="140"
+     bottom="490"
+     decimal_digits="1"
+     height="100"
+	 left="20"
+     label="Red Slider Vertical"
+     label_width="100"
+     layout="topleft"
+     name="red_slider_vertical"
+     text_color="red"
+	 orientation="vertical"
+     text_width="20" /> 
 </floater>
-- 
GitLab


From dd9b1f819de025f1a6caa37cfbd4fd3394f9fa9e Mon Sep 17 00:00:00 2001
From: angela <angela@lindenlab.com>
Date: Mon, 23 Nov 2009 17:33:03 +0800
Subject: [PATCH 500/557] EXT-2297 Functionality Loss - Ability to copy
 (control+c) residents name from their profile & local chat

---
 indra/newview/llchathistory.cpp               |  3 ++-
 indra/newview/llpanelprofileview.cpp          |  3 ++-
 .../default/xui/en/panel_chat_header.xml      | 23 ++++++++++---------
 .../default/xui/en/panel_profile_view.xml     |  7 +++---
 4 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 4ce3b50ed58..a95234099c1 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -34,6 +34,7 @@
 #include "llchathistory.h"
 #include "llpanel.h"
 #include "lltextbox.h"
+#include "lltexteditor.h"
 #include "lluictrlfactory.h"
 #include "llscrollcontainer.h"
 #include "llavatariconctrl.h"
@@ -185,7 +186,7 @@ class LLChatHistoryHeader: public LLPanel
 			mSourceType = CHAT_SOURCE_SYSTEM;
 		}
 
-		LLTextBox* userName = getChild<LLTextBox>("user_name");
+		LLTextEditor* userName = getChild<LLTextEditor>("user_name");
 
 		LLUIColor color = style_params.color;
 		userName->setReadOnlyColor(color);
diff --git a/indra/newview/llpanelprofileview.cpp b/indra/newview/llpanelprofileview.cpp
index d4ab5013f95..c7c2484be3d 100644
--- a/indra/newview/llpanelprofileview.cpp
+++ b/indra/newview/llpanelprofileview.cpp
@@ -43,6 +43,7 @@
 #include "llpanelpicks.h"
 #include "llpanelprofile.h"
 #include "llsidetraypanelcontainer.h"
+#include "lltexteditor.h"
 
 static LLRegisterPanelClassWrapper<LLPanelProfileView> t_panel_target_profile("panel_profile_view");
 
@@ -190,7 +191,7 @@ void LLPanelProfileView::processOnlineStatus(bool online)
 void LLPanelProfileView::onAvatarNameCached(const LLUUID& id, const std::string& first_name, const std::string& last_name, BOOL is_group)
 {
 	llassert(getAvatarId() == id);
-	getChild<LLTextBox>("user_name", FALSE)->setValue(first_name + " " + last_name);
+	getChild<LLTextEditor>("user_name", FALSE)->setValue(first_name + " " + last_name);
 }
 
 void LLPanelProfileView::togglePanel(LLPanel* panel)
diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml
index 7a3eae35a92..da175a75cd5 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml
@@ -1,15 +1,15 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
-      background_visible="true"
+	 background_visible="true"
      bevel_style="in"
      bg_alpha_color="black"
      follows="top|left|right"
      height="24"
      label="im_header"
-     layout="topleft"
+	 layout="topleft"
      name="im_header"
      width="300">
-            <avatar_icon
+		<avatar_icon
          follows="left"
          height="18"
          image_name="Generic_Person"
@@ -19,18 +19,19 @@
          name="avatar_icon"
          top="3"
          width="18" />
-    <text
+    <text_editor
+	 read_only = "true"
      follows="left|right"
-      font.style="BOLD"
-         height="12"
-         layout="topleft"
-         left_pad="5"
+	 font.style="BOLD"
+	 height="18"
+	 layout="topleft"
+	 left_pad="5"
      right="-50"
      name="user_name"
      text_color="white"
-         top="8"
-         use_ellipses="true"
-         value="Erica Vader" />
+	 top="5"
+	 use_ellipses="true"
+	 value="Erica Vader" />
     <text
             font="SansSerifSmall"
          follows="right"
diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml
index b015346a799..8e683bffc10 100644
--- a/indra/newview/skins/default/xui/en/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml
@@ -25,10 +25,11 @@
      tab_stop="false"
      top="2"
      width="23" />
-    <text
+    <text_editor
+	 read_only = "true"
      follows="top|left|right"
      font="SansSerifHugeBold"
-     height="26"
+     height="29"
      layout="topleft"
      left_pad="10"
      name="user_name"
@@ -52,7 +53,7 @@
      halign="center"
      layout="topleft"
      left="10"
- min_width="333"
+	 min_width="333"
      name="tabs"
      tab_min_width="80"
      tab_height="30"
-- 
GitLab


From d2cee29e8a039e3cac5c851b4e770b9c7e1095f0 Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Mon, 23 Nov 2009 14:44:07 +0200
Subject: [PATCH 501/557] Fixed normal bug ETX-2651 (Locations from teleport
 history are added to location history).

--HG--
branch : product-engine
---
 indra/newview/lllocationinputctrl.cpp |  1 -
 indra/newview/llnavigationbar.cpp     | 27 +++++++++++++++++++--------
 indra/newview/llnavigationbar.h       |  6 +++++-
 3 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 7e35cfa04c2..9aefbcbbb03 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -188,7 +188,6 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
 	params.rect(text_entry_rect);
 	params.default_text(LLStringUtil::null);
 	params.max_length_bytes(p.max_chars);
-	params.commit_callback.function(boost::bind(&LLComboBox::onTextCommit, this, _2));
 	params.keystroke_callback(boost::bind(&LLComboBox::onTextEntry, this, _1));
 	params.handle_edit_keys_directly(true);
 	params.commit_on_focus_lost(false);
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 114d26af8aa..c032d01d2f2 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -172,7 +172,8 @@ LLNavigationBar::LLNavigationBar()
 	mBtnHome(NULL),
 	mCmbLocation(NULL),
 	mSearchComboBox(NULL),
-	mPurgeTPHistoryItems(false)
+	mPurgeTPHistoryItems(false),
+	mSaveToLocationHistory(false)
 {
 	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_navigation_bar.xml");
 
@@ -186,6 +187,7 @@ LLNavigationBar::LLNavigationBar()
 LLNavigationBar::~LLNavigationBar()
 {
 	mTeleportFinishConnection.disconnect();
+	mTeleportFailedConnection.disconnect();
 }
 
 BOOL LLNavigationBar::postBuild()
@@ -220,6 +222,12 @@ BOOL LLNavigationBar::postBuild()
 	
 	mSearchComboBox->setCommitCallback(boost::bind(&LLNavigationBar::onSearchCommit, this));
 
+	mTeleportFinishConnection = LLViewerParcelMgr::getInstance()->
+		setTeleportFinishedCallback(boost::bind(&LLNavigationBar::onTeleportFinished, this, _1));
+
+	mTeleportFailedConnection = LLViewerParcelMgr::getInstance()->
+		setTeleportFailedCallback(boost::bind(&LLNavigationBar::onTeleportFailed, this));
+	
 	mDefaultNbRect = getRect();
 	mDefaultFpRect = getChild<LLFavoritesBarCtrl>("favorite")->getRect();
 
@@ -395,15 +403,19 @@ void LLNavigationBar::onLocationSelection()
 	LLWorldMapMessage::url_callback_t cb = boost::bind(
 			&LLNavigationBar::onRegionNameResponse, this,
 			typed_location, region_name, local_coords, _1, _2, _3, _4);
-	// connect the callback each time, when user enter new location to get real location of agent after teleport
-	mTeleportFinishConnection = LLViewerParcelMgr::getInstance()->
-			setTeleportFinishedCallback(boost::bind(&LLNavigationBar::onTeleportFinished, this, _1,typed_location));
+	mSaveToLocationHistory = true;
 	LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name, cb, std::string("unused"), false);
 }
 
-void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos, const std::string& typed_location)
+void LLNavigationBar::onTeleportFailed()
 {
-	// Location is valid. Add it to the typed locations history.
+	mSaveToLocationHistory = false;
+}
+
+void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos)
+{
+	if (!mSaveToLocationHistory)
+		return;
 	LLLocationHistory* lh = LLLocationHistory::getInstance();
 
 	//TODO*: do we need convert surl into readable format?
@@ -426,8 +438,7 @@ void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos, con
 
 	lh->save();
 	
-	if(mTeleportFinishConnection.connected())
-		mTeleportFinishConnection.disconnect();
+	mSaveToLocationHistory = false;
 	
 }
 
diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h
index 52f5a827e4b..cd3ba08db3c 100644
--- a/indra/newview/llnavigationbar.h
+++ b/indra/newview/llnavigationbar.h
@@ -81,7 +81,8 @@ class LLNavigationBar
 	void onLocationSelection();
 	void onLocationPrearrange(const LLSD& data);
 	void onSearchCommit();
-	void onTeleportFinished(const LLVector3d& global_agent_pos, const std::string& typed_location);
+	void onTeleportFinished(const LLVector3d& global_agent_pos);
+	void onTeleportFailed();
 	void onRegionNameResponse(
 			std::string typed_location,
 			std::string region_name,
@@ -99,8 +100,11 @@ class LLNavigationBar
 	LLLocationInputCtrl*		mCmbLocation;
 	LLRect						mDefaultNbRect;
 	LLRect						mDefaultFpRect;
+	boost::signals2::connection	mTeleportFailedConnection;
 	boost::signals2::connection	mTeleportFinishConnection;
 	bool						mPurgeTPHistoryItems;
+	// if true, save location to location history when teleport finishes
+	bool						mSaveToLocationHistory;
 };
 
 #endif
-- 
GitLab


From 9f0dbcf4c0c6c8621c377fd7f9e417aa76acd836 Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Mon, 23 Nov 2009 15:50:49 +0200
Subject: [PATCH 502/557] Update for task EXT-2081 - Object IM chiclets art
 needs to be hooked up to LLDialog chiclets. Cleaned code, added comments.

--HG--
branch : product-engine
---
 indra/newview/llchiclet.cpp                   | 30 +++----
 indra/newview/llchiclet.h                     | 26 +++---
 indra/newview/llnotificationscripthandler.cpp | 16 ++--
 indra/newview/llscriptfloater.cpp             | 88 +++++++++----------
 indra/newview/llscriptfloater.h               | 66 ++++++++++++--
 indra/newview/llviewermessage.cpp             |  4 +-
 .../skins/default/xui/en/notifications.xml    |  4 +-
 .../default/xui/en/widgets/chiclet_script.xml |  9 ++
 8 files changed, 155 insertions(+), 88 deletions(-)
 create mode 100644 indra/newview/skins/default/xui/en/widgets/chiclet_script.xml

diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index fd91da2de28..433f70700c7 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -56,6 +56,7 @@ static LLDefaultChildRegistry::Register<LLNotificationChiclet> t2("chiclet_notif
 static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t3("chiclet_im_p2p");
 static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t4("chiclet_im_group");
 static LLDefaultChildRegistry::Register<LLAdHocChiclet> t5("chiclet_im_adhoc");
+static LLDefaultChildRegistry::Register<LLScriptChiclet> t6("chiclet_script");
 
 static const LLRect CHICLET_RECT(0, 25, 25, 0);
 static const LLRect CHICLET_ICON_RECT(0, 22, 22, 0);
@@ -1418,24 +1419,21 @@ LLChicletSpeakerCtrl::LLChicletSpeakerCtrl(const Params&p)
 //////////////////////////////////////////////////////////////////////////
 
 LLScriptChiclet::Params::Params()
- : avatar_icon("avatar_icon")
+ : icon("icon")
 {
 	// *TODO Vadim: Get rid of hardcoded values.
-	rect(CHICLET_RECT);
-	name("dialog_chiclet");
-
-	avatar_icon.name("avatar_icon");
-	avatar_icon.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP | FOLLOWS_BOTTOM);
-
-	avatar_icon.rect(CHICLET_ICON_RECT);
-	avatar_icon.mouse_opaque(false);
+ 	rect(CHICLET_RECT);
+	icon.rect(CHICLET_ICON_RECT);
 }
 
 LLScriptChiclet::LLScriptChiclet(const Params&p)
  : LLIMChiclet(p)
  , mChicletIconCtrl(NULL)
 {
-	mImage = LLUI::getUIImage("Generic_Object_Small");
+	LLIconCtrl::Params icon_params = p.icon;
+	mChicletIconCtrl = LLUICtrlFactory::create<LLIconCtrl>(icon_params);
+	// Let "new message" icon be on top, else it will be hidden behind chiclet icon.
+	addChildInBack(mChicletIconCtrl);
 }
 
 void LLScriptChiclet::setSessionId(const LLUUID& session_id)
@@ -1443,20 +1441,14 @@ void LLScriptChiclet::setSessionId(const LLUUID& session_id)
 	setShowNewMessagesIcon( getSessionId() != session_id );
 
 	LLIMChiclet::setSessionId(session_id);
-	LLNotificationPtr notification = LLNotifications::getInstance()->find(
-		LLScriptFloaterManager::getInstance()->getNotificationId(session_id));
+	LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(session_id);
+	LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
 	if(notification)
 	{
 		setToolTip(notification->getSubstitutions()["TITLE"].asString());
 	}
 }
 
-void LLScriptChiclet::draw()
-{
-	mImage->draw(getLocalRect());
-	LLIMChiclet::draw();
-}
-
 void LLScriptChiclet::onMouseDown()
 {
 	LLScriptFloaterManager::getInstance()->toggleScriptFloater(getSessionId());
@@ -1467,3 +1459,5 @@ BOOL LLScriptChiclet::handleMouseDown(S32 x, S32 y, MASK mask)
 	onMouseDown();
 	return LLChiclet::handleMouseDown(x, y, mask);
 }
+
+// EOF
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index 56f164738eb..1ea141e6c47 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -533,28 +533,35 @@ class LLAdHocChiclet : public LLIMChiclet
 	LLMenuGL* mPopupMenu;
 };
 
+/**
+ * Chiclet for script floaters.
+ */
 class LLScriptChiclet : public LLIMChiclet
 {
 public:
 
 	struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params>
 	{
-		Optional<LLChicletAvatarIconCtrl::Params> avatar_icon;
+		Optional<LLIconCtrl::Params> icon;
 
 		Params();
 	};
 
-	void setSessionId(const LLUUID& session_id);
-
-	void setCounter(S32 counter){}
+	/*virtual*/ void setSessionId(const LLUUID& session_id);
 
-	S32 getCounter() { return 0; }
+	/*virtual*/ void setCounter(S32 counter){}
 
-	void onMouseDown();
+	/*virtual*/ S32 getCounter() { return 0; }
 
-	BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+	/**
+	 * Toggle script floater
+	 */
+	/*virtual*/ void onMouseDown();
 
-	void draw();
+	/**
+	 * Override default handler
+	 */
+	/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
 
 protected:
 
@@ -563,8 +570,7 @@ class LLScriptChiclet : public LLIMChiclet
 
 private:
 
-	LLPointer<LLUIImage> mImage;
-	LLChicletAvatarIconCtrl* mChicletIconCtrl;
+	LLIconCtrl* mChicletIconCtrl;
 };
 
 /**
diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp
index 2cac86cc0bc..f01f2e44414 100644
--- a/indra/newview/llnotificationscripthandler.cpp
+++ b/indra/newview/llnotificationscripthandler.cpp
@@ -42,6 +42,9 @@
 
 using namespace LLNotificationsUI;
 
+static const std::string SCRIPT_DIALOG				("ScriptDialog");
+static const std::string SCRIPT_DIALOG_GROUP		("ScriptDialogGroup");
+
 //--------------------------------------------------------------------------
 LLScriptHandler::LLScriptHandler(e_notification_type type, const LLSD& id)
 {
@@ -91,7 +94,7 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
 	
 	if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
 	{
-		if("ScriptDialog" == notification->getName() || "ScriptDialogGroup" == notification->getName())
+		if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName())
 		{
 			LLScriptFloaterManager::getInstance()->onAddNotification(notification->getID());
 		}
@@ -117,11 +120,14 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
 	}
 	else if (notify["sigtype"].asString() == "delete")
 	{
-		mChannel->killToastByNotificationID(notification->getID());
-		if("ScriptDialog" == notification->getName())
+		if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName())
 		{
 			LLScriptFloaterManager::getInstance()->onRemoveNotification(notification->getID());
 		}
+		else
+		{
+			mChannel->killToastByNotificationID(notification->getID());
+		}
 	}
 	return true;
 }
@@ -139,8 +145,8 @@ void LLScriptHandler::onDeleteToast(LLToast* toast)
 
 	LLNotificationPtr notification = LLNotifications::getInstance()->find(toast->getNotificationID());
 	
-	if( notification && ("ScriptDialog" == notification->getName() 
-		|| "ScriptDialogGroup" == notification->getName()) )
+	if( notification && 
+		(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName()) )
 	{
 		LLScriptFloaterManager::getInstance()->onRemoveNotification(notification->getID());
 	}
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
index 1bf6235d042..bdea6ff4594 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -61,6 +61,7 @@ LLUUID notification_id_to_object_id(const LLUUID& notification_id)
 
 LLScriptFloater::LLScriptFloater(const LLSD& key)
 : LLTransientDockableFloater(NULL, true, key)
+, mScriptForm(NULL)
 , mObjectId(key.asUUID())
 {
 }
@@ -84,6 +85,7 @@ bool LLScriptFloater::toggle(const LLUUID& object_id)
 			return true;
 		}
 	}
+	// create and show new floater
 	else
 	{
 		show(object_id);
@@ -122,58 +124,54 @@ void LLScriptFloater::getAllowedRect(LLRect& rect)
 
 void LLScriptFloater::createForm(const LLUUID& object_id)
 {
-	static const std::string PANEL_NAME = "_notification_panel_";
-
-	LLPanel* old_panel = findChild<LLPanel>(PANEL_NAME);
-	if(old_panel)
+	// delete old form
+	if(mScriptForm)
 	{
-		removeChild(old_panel);
+		removeChild(mScriptForm);
+		mScriptForm->die();
 	}
 
 	LLNotificationPtr notification = LLNotifications::getInstance()->find(
-		LLScriptFloaterManager::getInstance()->getNotificationId(object_id));
+		LLScriptFloaterManager::getInstance()->findNotificationId(object_id));
 	if(NULL == notification)
 	{
 		return;
 	}
-	LLToastNotifyPanel* panel = new LLToastNotifyPanel(notification);
-	panel->setName(PANEL_NAME);
-	addChild(panel);
 
-	LLRect panel_rect;
+	// create new form
+	mScriptForm = new LLToastNotifyPanel(notification);
+	addChild(mScriptForm);
 
-	panel_rect = panel->getRect();
-	panel_rect.setLeftTopAndSize(0, panel_rect.getHeight(), panel_rect.getWidth(), panel_rect.getHeight());
-	reshape(panel_rect.getWidth(), panel_rect.getHeight());
-	panel->setRect(panel_rect);
+	// position form on floater
+	mScriptForm->setOrigin(0, 0);
 
+	// make floater size fit form size
 	LLRect toast_rect = getRect();
+	LLRect panel_rect = mScriptForm->getRect();
 	toast_rect.setLeftTopAndSize(toast_rect.mLeft, toast_rect.mTop, panel_rect.getWidth(), panel_rect.getHeight() + getHeaderHeight());
-	reshape(toast_rect.getWidth(), toast_rect.getHeight());
-	setRect(toast_rect);
+	setShape(toast_rect);
 }
 
 void LLScriptFloater::onClose(bool app_quitting)
 {
-	LLScriptFloaterManager::getInstance()->closeScriptFloater(getObjectId());
-	setObjectId(LLUUID::null);
+	LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(getObjectId());
 }
 
 void LLScriptFloater::setDocked(bool docked, bool pop_on_undock /* = true */)
 {
 	LLTransientDockableFloater::setDocked(docked, pop_on_undock);
 
-	updateToasts();
+	hideToastsIfNeeded();
 }
 
 void LLScriptFloater::setVisible(BOOL visible)
 {
 	LLTransientDockableFloater::setVisible(visible);
 
-	updateToasts();
+	hideToastsIfNeeded();
 }
 
-void LLScriptFloater::updateToasts()
+void LLScriptFloater::hideToastsIfNeeded()
 {
 	using namespace LLNotificationsUI;
 
@@ -197,12 +195,12 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
 	LLUUID object_id = notification_id_to_object_id(notification_id);
 	if(object_id.isNull())
 	{
-		llerrs << "Invalid notification, no object id" << llendl;
+		llwarns << "Invalid notification, no object id" << llendl;
 		return;
 	}
 
 	// If an Object spawns more-than-one floater, only the newest one is shown. 
-	// The other is automatically closed.
+	// The previous is automatically closed.
 	script_notification_map_t::iterator it = mNotifications.find(object_id);
 	if(it != mNotifications.end())
 	{
@@ -220,18 +218,19 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
 	LLUUID object_id = notification_id_to_object_id(notification_id);
 	if(object_id.isNull())
 	{
-		llerrs << "Invalid notification, no object id" << llendl;
+		llwarns << "Invalid notification, no object id" << llendl;
 		return;
 	}
 
 	using namespace LLNotificationsUI;
 
 	// remove related toast
-	LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->findChannelByID(
-		LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
+	LLUUID channel_id(gSavedSettings.getString("NotificationChannelUUID"));
+	LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>
+		(LLChannelManager::getInstance()->findChannelByID(channel_id));
 	if(channel)
 	{
-		channel->killToastByNotificationID(getToastNotificationId(object_id));
+		channel->killToastByNotificationID(findNotificationToastId(object_id));
 	}
 
 	mNotifications.erase(object_id);
@@ -247,6 +246,17 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
 	}
 }
 
+void LLScriptFloaterManager::removeNotificationByObjectId(const LLUUID& object_id)
+{
+	// Check we have not removed notification yet
+	LLNotificationPtr notification = LLNotifications::getInstance()->find(
+		findNotificationId(object_id));
+	if(notification)
+	{
+		onRemoveNotification(notification->getID());
+	}
+}
+
 void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& object_id)
 {
 	// hide "new message" icon from chiclet
@@ -262,24 +272,14 @@ void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& object_id)
 		LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
 	if(channel)
 	{
-		channel->killToastByNotificationID(getToastNotificationId(object_id));
+		channel->killToastByNotificationID(findNotificationToastId(object_id));
 	}
 
 	// toggle floater
 	LLScriptFloater::toggle(object_id);
 }
 
-void LLScriptFloaterManager::closeScriptFloater(const LLUUID& object_id)
-{
-	LLNotificationPtr notification = LLNotifications::getInstance()->find(
-		getNotificationId(object_id));
-	if(notification)
-	{
-		onRemoveNotification(notification->getID());
-	}
-}
-
-void LLScriptFloaterManager::setToastNotificationId(const LLUUID& object_id, const LLUUID& notification_id)
+void LLScriptFloaterManager::setNotificationToastId(const LLUUID& object_id, const LLUUID& notification_id)
 {
 	script_notification_map_t::iterator it = mNotifications.find(object_id);
 	if(mNotifications.end() != it)
@@ -288,7 +288,7 @@ void LLScriptFloaterManager::setToastNotificationId(const LLUUID& object_id, con
 	}
 }
 
-const LLUUID& LLScriptFloaterManager::getNotificationId(const LLUUID& object_id)
+LLUUID LLScriptFloaterManager::findNotificationId(const LLUUID& object_id)
 {
 	script_notification_map_t::const_iterator it = mNotifications.find(object_id);
 	if(mNotifications.end() != it)
@@ -298,7 +298,7 @@ const LLUUID& LLScriptFloaterManager::getNotificationId(const LLUUID& object_id)
 	return LLUUID::null;
 }
 
-const LLUUID& LLScriptFloaterManager::getToastNotificationId(const LLUUID& object_id)
+LLUUID LLScriptFloaterManager::findNotificationToastId(const LLUUID& object_id)
 {
 	script_notification_map_t::const_iterator it = mNotifications.find(object_id);
 	if(mNotifications.end() != it)
@@ -320,11 +320,11 @@ void LLScriptFloaterManager::onToastButtonClick(const LLSD&notification, const L
 		LLScriptFloaterManager::getInstance()->toggleScriptFloater(object_id);
 		break;
 	case 1: // "Ignore"
-		LLScriptFloaterManager::getInstance()->closeScriptFloater(object_id);
+		LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(object_id);
 		break;
-	case 2: // "Mute"
+	case 2: // "Block"
 		LLMuteList::getInstance()->add(LLMute(object_id, notification["substitutions"]["TITLE"], LLMute::OBJECT));
-		LLScriptFloaterManager::getInstance()->closeScriptFloater(object_id);
+		LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(object_id);
 		break;
 	default:
 		llwarns << "Unexpected value" << llendl;
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
index fc1d9a01866..0e1a7f36b72 100644
--- a/indra/newview/llscriptfloater.h
+++ b/indra/newview/llscriptfloater.h
@@ -35,27 +35,52 @@
 
 #include "lltransientdockablefloater.h"
 
+class LLToastNotifyPanel;
+
 /**
- * This class manages Object script floaters.
+ * Handles script notifications ("ScriptDialog" and "ScriptDialogGroup")
+ * and manages Script Floaters.
  */
 class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager>
 {
 public:
 
+	/**
+	 * Handles new notifications.
+	 * Saves notification and object ids, removes old notification if needed, creates script chiclet
+	 * Note that one object can spawn one script floater.
+	 */
 	void onAddNotification(const LLUUID& notification_id);
 
+	/**
+	 * Handles notification removal.
+	 * Removes script notification toast, removes script chiclet, closes script floater
+	 */
 	void onRemoveNotification(const LLUUID& notification_id);
 
-	void toggleScriptFloater(const LLUUID& object_id);
+	/**
+	 * Wrapper for onRemoveNotification, removes notification by object id.
+	 */
+	void removeNotificationByObjectId(const LLUUID& object_id);
 
-	void closeScriptFloater(const LLUUID& object_id);
+	/**
+	 * Toggles script floater.
+	 * Removes "new message" icon from chiclet and removes notification toast.
+	 */
+	void toggleScriptFloater(const LLUUID& object_id);
 
-	const LLUUID& getNotificationId(const LLUUID& object_id);
+	LLUUID findNotificationId(const LLUUID& object_id);
 
-	const LLUUID& getToastNotificationId(const LLUUID& object_id);
+	LLUUID findNotificationToastId(const LLUUID& object_id);
 
-	void setToastNotificationId(const LLUUID& object_id, const LLUUID& notification_id);
+	/**
+	 * Associate notification toast id with object id.
+	 */
+	void setNotificationToastId(const LLUUID& object_id, const LLUUID& notification_id);
 
+	/**
+	* Callback for notification toast buttons.
+	*/
 	static void onToastButtonClick(const LLSD&notification, const LLSD&response);
 
 private:
@@ -66,13 +91,16 @@ class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager>
 		LLUUID toast_notification_id;
 	};
 
+	// <object_id, notification_data>
 	typedef std::map<LLUUID, LLNotificationData> script_notification_map_t;
 
 	script_notification_map_t mNotifications;
 };
 
 /**
- * Floater for displaying script forms
+ * Floater script forms.
+ * LLScriptFloater will create script form based on notification data and 
+ * will auto fit the form.
  */
 class LLScriptFloater : public LLTransientDockableFloater
 {
@@ -85,29 +113,51 @@ class LLScriptFloater : public LLTransientDockableFloater
 
 	virtual ~LLScriptFloater(){};
 
+	/**
+	 * Toggle existing floater or create and show a new one.
+	 */
 	static bool toggle(const LLUUID& object_id);
 
+	/**
+	 * Creates and shows floater
+	 */
 	static LLScriptFloater* show(const LLUUID& object_id);
 
 	const LLUUID& getObjectId() { return mObjectId; }
 
+	/**
+	 * Close notification if script floater is closed.
+	 */
 	/*virtual*/ void onClose(bool app_quitting);
 
+	/**
+	 * Hide all notification toasts when we show dockable floater
+	 */
 	/*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
 
+	/**
+	 * Hide all notification toasts when we show dockable floater
+	 */
 	/*virtual*/ void setVisible(BOOL visible);
 
 protected:
 
+	/**
+	 * Creates script form, will delete old form if floater is shown for same object.
+	 */
 	void createForm(const LLUUID& object_id);
 
 	/*virtual*/ void getAllowedRect(LLRect& rect);
 
-	static void updateToasts();
+	/**
+	 * Hide all notification toasts.
+	 */
+	static void hideToastsIfNeeded();
 
 	void setObjectId(const LLUUID& id) { mObjectId = id; }
 
 private:
+	LLToastNotifyPanel* mScriptForm;
 	LLUUID mObjectId;
 };
 
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index ac1f366f9cd..4d7d3ee8ac7 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -5382,13 +5382,15 @@ void process_script_dialog(LLMessageSystem* msg, void**)
 			LLNotification::Params("ScriptDialogGroup").substitutions(args).payload(payload).form_elements(form.asLLSD()));
 	}
 
+	// "ScriptDialog" and "ScriptDialogGroup" are handles by LLScriptFloaterManager.
+	// We want to inform user that there is a script floater, lets add "ScriptToast"
 	LLNotification::Params p("ScriptToast");
 	p.substitutions(args).payload(payload).functor.function(boost::bind(
 		LLScriptFloaterManager::onToastButtonClick, _1, _2));
 
 	notification = LLNotifications::instance().add(p);
 
-	LLScriptFloaterManager::getInstance()->setToastNotificationId(
+	LLScriptFloaterManager::getInstance()->setNotificationToastId(
 		object_id, notification->getID());
 }
 
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index af71ae09d20..238f3bdac83 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -5314,8 +5314,8 @@ Grant this request?
        text="Ignore"/>
       <button
        index="2"
-       name="Mute"
-       text="Mute"/>
+       name="Block"
+       text="Block"/>
     </form>
   </notification>
 
diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_script.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_script.xml
new file mode 100644
index 00000000000..5011bf6a61a
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/chiclet_script.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<chiclet_script
+ name="script_chiclet">
+ <icon
+  name="chiclet_icon"
+  follows="all"
+  mouse_opaque="false"
+  image_name="Generic_Object_Small" />
+</expandable_text>
\ No newline at end of file
-- 
GitLab


From 11ef9f3d41a2e628e1ded8dcb0a306fe328ae0ce Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Mon, 23 Nov 2009 16:29:10 +0200
Subject: [PATCH 503/557] Work on normal task EXT-2640 (Create a tabbed IM
 multifloater) - disabled Transient & Dockable functionality of IM Floaters to
 do not have collisions with multifloater - remove debug attributes in xml

--HG--
branch : product-engine
---
 indra/newview/llimfloater.cpp                 | 25 +++++++++++++++++++
 indra/newview/llimfloater.h                   |  5 ++++
 indra/newview/llimfloatercontainer.cpp        | 17 ++++++-------
 .../default/xui/en/floater_im_container.xml   |  6 ++---
 4 files changed, 40 insertions(+), 13 deletions(-)

diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 4a487bd5a7c..d789139aa88 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -53,6 +53,10 @@
 #include "lltransientfloatermgr.h"
 #include "llinventorymodel.h"
 
+#ifdef USE_IM_CONTAINER
+	#include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container
+#endif
+
 
 
 LLIMFloater::LLIMFloater(const LLUUID& session_id)
@@ -257,7 +261,11 @@ BOOL LLIMFloater::postBuild()
 	//*TODO if session is not initialized yet, add some sort of a warning message like "starting session...blablabla"
 	//see LLFloaterIMPanel for how it is done (IB)
 
+#ifdef USE_IM_CONTAINER
+	return LLFloater::postBuild();
+#else
 	return LLDockableFloater::postBuild();
+#endif
 }
 
 // virtual
@@ -318,6 +326,7 @@ void LLIMFloater::onSlide()
 //static
 LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
 {
+#ifndef USE_IM_CONTAINER
 	//hide all
 	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel");
 	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();
@@ -329,12 +338,23 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
 			floater->setVisible(false);
 		}
 	}
+#endif
 
 	LLIMFloater* floater = LLFloaterReg::showTypedInstance<LLIMFloater>("impanel", session_id);
 
 	floater->updateMessages();
 	floater->mInputEditor->setFocus(TRUE);
 
+#ifdef USE_IM_CONTAINER
+
+//		LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END;
+	// TODO: mantipov: use LLTabContainer::RIGHT_OF_CURRENT if it exists
+	LLTabContainer::eInsertionPoint i_pt = LLTabContainer::END;
+
+	// *TODO: mantipov: validate if floater was torn off. In this case it's no necessary to show container
+	LLIMFloaterContainer* floater_container = LLFloaterReg::showTypedInstance<LLIMFloaterContainer>("im_container");
+	floater_container->addFloater(floater, TRUE, i_pt);
+#else
 	if (floater->getDockControl() == NULL)
 	{
 		LLChiclet* chiclet =
@@ -352,6 +372,7 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
 		floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(),
 				LLDockControl::TOP,  boost::bind(&LLIMFloater::getAllowedRect, floater, _1)));
 	}
+#endif
 
 	return floater;
 }
@@ -368,7 +389,9 @@ void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
 		(LLNotificationsUI::LLChannelManager::getInstance()->
 											findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
 	
+#ifndef USE_IM_CONTAINER
 	LLTransientDockableFloater::setDocked(docked, pop_on_undock);
+#endif
 
 	// update notification channel state
 	if(channel)
@@ -394,6 +417,7 @@ void LLIMFloater::setVisible(BOOL visible)
 //static
 bool LLIMFloater::toggle(const LLUUID& session_id)
 {
+#ifndef USE_IM_CONTAINER
 	LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
 	if (floater && floater->getVisible() && floater->isDocked())
 	{
@@ -409,6 +433,7 @@ bool LLIMFloater::toggle(const LLUUID& session_id)
 		return true;
 	}
 	else
+#endif
 	{
 		// ensure the list of messages is updated when floater is made visible
 		show(session_id);
diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h
index e2d500d821e..32cba71f6ee 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llimfloater.h
@@ -33,6 +33,11 @@
 #ifndef LL_IMFLOATER_H
 #define LL_IMFLOATER_H
 
+// This variable is used to show floaters related to chiclets in a Multi Floater Container
+// So, this functionality does not require to have IM Floaters as Dockable & Transient
+// See EXT-2640.
+#define USE_IM_CONTAINER
+
 #include "lltransientdockablefloater.h"
 #include "lllogchat.h"
 #include "lltooldraganddrop.h"
diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp
index 94017526c88..6e4b3ae2140 100644
--- a/indra/newview/llimfloatercontainer.cpp
+++ b/indra/newview/llimfloatercontainer.cpp
@@ -35,9 +35,6 @@
 
 #include "llimfloatercontainer.h"
 
-// TODO: mantipov: replace with floater_im_session
-#include "llimpanel.h"
-
 //
 // LLIMFloaterContainer
 //
@@ -54,22 +51,24 @@ LLIMFloaterContainer::~LLIMFloaterContainer()
 
 BOOL LLIMFloaterContainer::postBuild()
 {
-	// TODO: mantipov: verify if it is needed
-	mTabContainer->lockTabs();
+	// Do not call base postBuild to not connect to mCloseSignal to not close all floaters via Close button
+	// mTabContainer will be initialized in LLMultiFloater::addChild()
 	return TRUE;
 }
 
 void LLIMFloaterContainer::onOpen(const LLSD& key)
 {
-	// TODO: mantipov: verify if it is needed
+	LLMultiFloater::onOpen(key);
+/*
 	if (key.isDefined())
 	{
-		LLFloaterIMPanel* impanel = gIMMgr->findFloaterBySession(key.asUUID());
-		if (impanel)
+		LLIMFloater* im_floater = LLIMFloater::findInstance(key.asUUID());
+		if (im_floater)
 		{
-			impanel->openFloater();
+			im_floater->openFloater();
 		}
 	}
+*/
 }
 
 void LLIMFloaterContainer::addFloater(LLFloater* floaterp, 
diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml
index a1a0aee97b6..cf6a4e45bd1 100644
--- a/indra/newview/skins/default/xui/en/floater_im_container.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_container.xml
@@ -13,8 +13,6 @@ bg_color="yellow"
  title="Instant Messages"
  width="392">
     <tab_container
-background_visible="true"
-bg_alpha_color="green" 
      follows="left|right|top|bottom"
      height="390"
      layout="topleft"
@@ -25,7 +23,7 @@ bg_alpha_color="green"
      top="0"
      width="390" />
     <icon
-     color="red"
+     color="DefaultShadowLight"
      enabled="false"
      follows="left|right|bottom"
      height="17"
@@ -33,6 +31,6 @@ bg_alpha_color="green"
      layout="bottomleft"
      left="1"
      name="im_box_tab_container_icon"
-     bottom="0"
+     bottom="10"
      width="390" />
 </multi_floater>
-- 
GitLab


From fb3b6145a880119999b66312275b1448da8a7e14 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Mon, 23 Nov 2009 17:47:40 +0200
Subject: [PATCH 504/557] Work on normal task EXT-2640 (Create a tabbed IM
 multifloater) - disable adding torn off IM Floaters into container when
 chiclet is clicked

--HG--
branch : product-engine
---
 indra/newview/llimfloater.cpp | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index d789139aa88..38a9fec1927 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -326,7 +326,11 @@ void LLIMFloater::onSlide()
 //static
 LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
 {
-#ifndef USE_IM_CONTAINER
+#ifdef USE_IM_CONTAINER
+	LLIMFloater* target_floater = findInstance(session_id);
+	bool not_existed = NULL == target_floater;
+
+#else
 	//hide all
 	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel");
 	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();
@@ -346,14 +350,16 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
 	floater->mInputEditor->setFocus(TRUE);
 
 #ifdef USE_IM_CONTAINER
+	// do not add existed floaters to avoid adding torn off instances
+	if (not_existed)
+	{
+		//		LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END;
+		// TODO: mantipov: use LLTabContainer::RIGHT_OF_CURRENT if it exists
+		LLTabContainer::eInsertionPoint i_pt = LLTabContainer::END;
 
-//		LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END;
-	// TODO: mantipov: use LLTabContainer::RIGHT_OF_CURRENT if it exists
-	LLTabContainer::eInsertionPoint i_pt = LLTabContainer::END;
-
-	// *TODO: mantipov: validate if floater was torn off. In this case it's no necessary to show container
-	LLIMFloaterContainer* floater_container = LLFloaterReg::showTypedInstance<LLIMFloaterContainer>("im_container");
-	floater_container->addFloater(floater, TRUE, i_pt);
+		LLIMFloaterContainer* floater_container = LLFloaterReg::showTypedInstance<LLIMFloaterContainer>("im_container");
+		floater_container->addFloater(floater, TRUE, i_pt);
+	}
 #else
 	if (floater->getDockControl() == NULL)
 	{
-- 
GitLab


From 2f8909209648630bde2200097f52002a1dfb76e1 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Mon, 23 Nov 2009 17:54:07 +0200
Subject: [PATCH 505/557] Work on normal task EXT-2640 (Create a tabbed IM
 multifloater) - hide Dock button for IM Floaters

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/floater_im_session.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index c20aaea2aa3..aae5c14a9d7 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -9,7 +9,7 @@
  name="panel_im"
  top="0"
  can_close="true"
- can_dock="true"
+ can_dock="false"
  can_minimize="false"
  visible="true"
  width="300"
-- 
GitLab


From 35ebf50ec7a0f11aade28130b5ed6c3263c92359 Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Mon, 23 Nov 2009 19:08:52 +0200
Subject: [PATCH 506/557] Fixed normal bug EXT-2668 (NONE group is present in
 the Group Chooser for which to send invitation).

--HG--
branch : product-engine
---
 indra/newview/llavataractions.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 0844cca7662..a133bd6fe6a 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -347,9 +347,9 @@ void LLAvatarActions::inviteToGroup(const LLUUID& id)
 	LLFloaterGroupPicker* widget = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(id));
 	if (widget)
 	{
-		widget->removeNoneOption();
 		widget->center();
 		widget->setPowersMask(GP_MEMBER_INVITE);
+		widget->removeNoneOption();
 		widget->setSelectGroupCallback(boost::bind(callback_invite_to_group, _1, id));
 	}
 }
-- 
GitLab


From a1dd97507c988da9338eea44a0960a2854b902ef Mon Sep 17 00:00:00 2001
From: Rick Pasetto <rick@lindenlab.com>
Date: Mon, 23 Nov 2009 10:08:35 -0800
Subject: [PATCH 507/557] DEV-42967: Fix prefs panel to not clobber changes to
 prefs made by other UI

The prefs floater was unilaterally reverting any changes
made by other UI.  This fixes that by making squirreling
away the current settings an explicit operation, and
cancel now happens explicitly on close(), but only if
a flag is not set (as is what happens when you hit OK).

Reviewed by James.
---
 indra/newview/llfloaterpreference.cpp | 38 ++++++++++++++++++++++++---
 indra/newview/llfloaterpreference.h   |  9 +++++++
 2 files changed, 43 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 7fc207d3950..6d2c35442aa 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -164,7 +164,6 @@ BOOL LLVoiceSetKeyDialog::handleKeyHere(KEY key, MASK mask)
 	{
 		mParent->setKey(key);
 	}
-	
 	closeFloater();
 	return result;
 }
@@ -310,7 +309,8 @@ F32 LLFloaterPreference::sAspectRatio = 0.0;
 LLFloaterPreference::LLFloaterPreference(const LLSD& key)
 	: LLFloater(key),
 	mGotPersonalInfo(false),
-	mOriginalIMViaEmail(false)
+	mOriginalIMViaEmail(false),
+	mCancelOnClose(true)
 {
 	//Build Floater is now Called from 	LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
 	
@@ -390,6 +390,20 @@ void LLFloaterPreference::draw()
 	LLFloater::draw();
 }
 
+void LLFloaterPreference::saveSettings()
+{
+	LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
+	child_list_t::const_iterator iter = tabcontainer->getChildList()->begin();
+	child_list_t::const_iterator end = tabcontainer->getChildList()->end();
+	for ( ; iter != end; ++iter)
+	{
+		LLView* view = *iter;
+		LLPanelPreference* panel = dynamic_cast<LLPanelPreference*>(view);
+		if (panel)
+			panel->saveSettings();
+	}
+}	
+
 void LLFloaterPreference::apply()
 {
 	LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
@@ -551,6 +565,11 @@ void LLFloaterPreference::onOpen(const LLSD& key)
 	
 	LLPanelLogin::setAlwaysRefresh(true);
 	refresh();
+	
+	// Make sure the current state of prefs are saved away when
+	// when the floater is opened.  That will make cancel do its
+	// job
+	saveSettings();
 }
 
 void LLFloaterPreference::onVertexShaderEnable()
@@ -569,7 +588,7 @@ void LLFloaterPreference::onClose(bool app_quitting)
 {
 	gSavedSettings.setS32("LastPrefTab", getChild<LLTabContainer>("pref core")->getCurrentPanelIndex());
 	LLPanelLogin::setAlwaysRefresh(false);
-	cancel(); // will be a no-op if OK or apply was performed just prior.
+	if (mCancelOnClose) cancel();
 }
 
 void LLFloaterPreference::onOpenHardwareSettings()
@@ -592,7 +611,11 @@ void LLFloaterPreference::onBtnOK()
 	if (canClose())
 	{
 		apply();
+		// Here we do not want to cancel on close, so we do this funny thing
+		// that prevents cancel from undoing our changes when we hit OK
+		mCancelOnClose = false;
 		closeFloater(false);
+		mCancelOnClose = true;
 		gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
 		LLUIColorTable::instance().saveUserSettings();
 		std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
@@ -620,6 +643,7 @@ void LLFloaterPreference::onBtnApply( )
 		}
 	}
 	apply();
+	saveSettings();
 
 	LLPanelLogin::refreshLocation( false );
 }
@@ -636,7 +660,8 @@ void LLFloaterPreference::onBtnCancel()
 		}
 		refresh();
 	}
-	closeFloater(); // side effect will also cancel any unsaved changes.
+	cancel();
+	closeFloater();
 }
 
 // static 
@@ -1492,6 +1517,11 @@ BOOL LLPanelPreference::postBuild()
 }
 
 void LLPanelPreference::apply()
+{
+	// no-op
+}
+
+void LLPanelPreference::saveSettings()
 {
 	// Save the value of all controls in the hierarchy
 	mSavedValues.clear();
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 41c8bb71247..a30422564ae 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -97,6 +97,10 @@ class LLFloaterPreference : public LLFloater
 	// callback for when client turns on shaders
 	void onVertexShaderEnable();
 	
+	// This function squirrels away the current values of the controls so that
+	// cancel() can restore them.	
+	void saveSettings();
+		
 
 public:
 
@@ -145,6 +149,7 @@ class LLFloaterPreference : public LLFloater
 	static std::string sSkin;
 	bool mGotPersonalInfo;
 	bool mOriginalIMViaEmail;
+	bool mCancelOnClose;
 	
 	bool mOriginalHideOnlineStatus;
 	std::string mDirectoryVisibility;
@@ -161,6 +166,10 @@ class LLPanelPreference : public LLPanel
 	virtual void cancel();
 	void setControlFalse(const LLSD& user_data);
 
+	// This function squirrels away the current values of the controls so that
+	// cancel() can restore them.
+	virtual void saveSettings();
+	
 private:
 	typedef std::map<LLControlVariable*, LLSD> control_values_map_t;
 	control_values_map_t mSavedValues;
-- 
GitLab


From c889fa9ee1b4fd033a9dab40c19a7d21eb00c82b Mon Sep 17 00:00:00 2001
From: Vadim Savchuk <vsavchuk@productengine.com>
Date: Mon, 23 Nov 2009 20:12:00 +0200
Subject: [PATCH 508/557] Renamed Me panel XUI class from
 "panel_me_profile_view" to "panel_me".

--HG--
branch : product-engine
---
 indra/newview/llpanelme.cpp                            | 2 +-
 indra/newview/skins/default/xui/en/panel_side_tray.xml | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp
index 0c7da30b033..e12da97f3bc 100644
--- a/indra/newview/llpanelme.cpp
+++ b/indra/newview/llpanelme.cpp
@@ -46,7 +46,7 @@
 #define PANEL_PROFILE "panel_profile"
 
 static LLRegisterPanelClassWrapper<LLPanelMyProfileEdit> t_panel_me_profile_edit("edit_profile_panel");
-static LLRegisterPanelClassWrapper<LLPanelMe> t_panel_me_profile("panel_me_profile_view");
+static LLRegisterPanelClassWrapper<LLPanelMe> t_panel_me_profile("panel_me");
 
 LLPanelMe::LLPanelMe(void) 
  : LLPanelProfile()
diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml
index c4c8fa81451..95242a96397 100644
--- a/indra/newview/skins/default/xui/en/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml
@@ -102,7 +102,7 @@
     background_visible="true"
   >
       <panel
-        class="panel_me_profile_view"
+        class="panel_me"
         name="panel_me"
         filename="panel_me.xml"
         label="Me"
-- 
GitLab


From 83237f875cb26d9f72055a5d47cdb928b30c0dc6 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Mon, 23 Nov 2009 10:15:00 -0800
Subject: [PATCH 509/557] Allow large paramblocks by converting
 mEnclosingBlockOffset to U16, needed for location_input.xml

---
 indra/llxuixml/llinitparam.cpp | 2 +-
 indra/llxuixml/llinitparam.h   | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp
index 318a0348a2a..4c050844f86 100644
--- a/indra/llxuixml/llinitparam.cpp
+++ b/indra/llxuixml/llinitparam.cpp
@@ -46,7 +46,7 @@ namespace LLInitParam
 	{
 		const U8* my_addr = reinterpret_cast<const U8*>(this);
 		const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block);
-		mEnclosingBlockOffset = (S16)(block_addr - my_addr);
+		mEnclosingBlockOffset = (U16)(my_addr - block_addr);
 	}
 
 	//
diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h
index 9fb464ca7b9..b563c6fe512 100644
--- a/indra/llxuixml/llinitparam.h
+++ b/indra/llxuixml/llinitparam.h
@@ -300,14 +300,14 @@ namespace LLInitParam
 			const U8* my_addr = reinterpret_cast<const U8*>(this);
 			// get address of enclosing BLOCK class using stored offset to enclosing BaseBlock class
 			return *const_cast<BaseBlock*>(
-							reinterpret_cast<const BaseBlock*>(my_addr + (ptrdiff_t)mEnclosingBlockOffset));
+							reinterpret_cast<const BaseBlock*>(my_addr - (ptrdiff_t)mEnclosingBlockOffset));
 		}
 
 	private:
 		friend class BaseBlock;
 
 		bool		mIsProvided;
-		S16			mEnclosingBlockOffset;
+		U16			mEnclosingBlockOffset;
 	};
 
 	// various callbacks and constraints associated with an individual param
-- 
GitLab


From 9e403da7b0fd013371e73820b8aa70820f4f620b Mon Sep 17 00:00:00 2001
From: Sergey Borushevsky <sborushevsky@productengine.com>
Date: Mon, 23 Nov 2009 20:34:06 +0200
Subject: [PATCH 510/557] Implemented major sub-task EXT-2517 (Add support for
 the viewer 1.23 chat history style (widget-less))

--HG--
branch : product-engine
---
 indra/newview/app_settings/settings.xml       | 13 +++
 indra/newview/llchathistory.cpp               | 94 +++++++++++--------
 indra/newview/llchathistory.h                 |  7 +-
 indra/newview/llfloaterpreference.cpp         |  7 ++
 indra/newview/llimfloater.cpp                 | 66 ++++++-------
 indra/newview/llimfloater.h                   |  3 +
 indra/newview/llnearbychat.cpp                |  4 +-
 .../default/xui/en/panel_preferences_chat.xml |  9 ++
 8 files changed, 123 insertions(+), 80 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index c7279a2e333..1eca897ea56 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -5371,6 +5371,19 @@
       <key>Value</key>
       <real>1.0</real>
     </map>
+    
+   <key>PlainTextChatHistory</key>
+    <map>
+      <key>Comment</key>
+      <string>Enable/Disable plain text chat history style</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    
     <key>PluginInstancesLow</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 4ce3b50ed58..422aae3c259 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -334,20 +334,14 @@ LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style
 	return header;
 }
 
-void LLChatHistory::appendWidgetMessage(const LLChat& chat, const LLStyle::Params& input_append_params)
+void LLChatHistory::clear()
 {
-	LLView* view = NULL;
-	std::string view_text = "\n[" + chat.mTimeStr + "] ";
-	if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM)
-		view_text += chat.mFromName + ": ";
-
-
-	LLInlineViewSegment::Params p;
-	p.force_newline = true;
-	p.left_pad = mLeftWidgetPad;
-	p.right_pad = mRightWidgetPad;
+	mLastFromName.clear();
+	LLTextEditor::clear();
+}
 
-	
+void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_chat_history, const LLStyle::Params& input_append_params)
+{
 	LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
 	LLViewerChat::getChatColor(chat,txt_color);
 	LLFontGL* fontp = LLViewerChat::getChatFont();	
@@ -360,39 +354,63 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat, const LLStyle::Param
 	style_params.font.size(font_size);	
 	style_params.font.style(input_append_params.font.style);
 	
-
+	std::string header_text = "[" + chat.mTimeStr + "] ";
+	if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM)
+		header_text += chat.mFromName + ": ";
 	
-	if (mLastFromName == chat.mFromName)
+	if (use_plain_text_chat_history)
 	{
-		view = getSeparator();
-		p.top_pad = mTopSeparatorPad;
-		p.bottom_pad = mBottomSeparatorPad;
+		appendText(header_text, getText().size() != 0, style_params);
 	}
 	else
 	{
-		view = getHeader(chat,style_params);
-		if (getText().size() == 0)
-			p.top_pad = 0;
+		LLView* view = NULL;
+		LLInlineViewSegment::Params p;
+		p.force_newline = true;
+		p.left_pad = mLeftWidgetPad;
+		p.right_pad = mRightWidgetPad;
+
+		if (mLastFromName == chat.mFromName)
+		{
+			view = getSeparator();
+			p.top_pad = mTopSeparatorPad;
+			p.bottom_pad = mBottomSeparatorPad;
+		}
 		else
-			p.top_pad = mTopHeaderPad;
-		p.bottom_pad = mBottomHeaderPad;
-		
+		{
+			view = getHeader(chat, style_params);
+			if (getText().size() == 0)
+				p.top_pad = 0;
+			else
+				p.top_pad = mTopHeaderPad;
+			p.bottom_pad = mBottomHeaderPad;
+			
+		}
+		p.view = view;
+
+		//Prepare the rect for the view
+		LLRect target_rect = getDocumentView()->getRect();
+		// squeeze down the widget by subtracting padding off left and right
+		target_rect.mLeft += mLeftWidgetPad + mHPad;
+		target_rect.mRight -= mRightWidgetPad;
+		view->reshape(target_rect.getWidth(), view->getRect().getHeight());
+		view->setOrigin(target_rect.mLeft, view->getRect().mBottom);
+
+		appendWidget(p, header_text, false);
+		mLastFromName = chat.mFromName;
 	}
-	p.view = view;
-
-	//Prepare the rect for the view
-	LLRect target_rect = getDocumentView()->getRect();
-	// squeeze down the widget by subtracting padding off left and right
-	target_rect.mLeft += mLeftWidgetPad + mHPad;
-	target_rect.mRight -= mRightWidgetPad;
-	view->reshape(target_rect.getWidth(), view->getRect().getHeight());
-	view->setOrigin(target_rect.mLeft, view->getRect().mBottom);
-
-	appendWidget(p, view_text, false);
-
-	//Append the text message
-	appendText(chat.mText, FALSE, style_params);
+	//Handle IRC styled /me messages.
+	std::string prefix = chat.mText.substr(0, 4);
+	if (prefix == "/me " || prefix == "/me'")
+	{
+		style_params.font.style = "ITALIC";
 
-	mLastFromName = chat.mFromName;
+		if (chat.mFromName.size() > 0)
+			appendText(chat.mFromName + " ", TRUE, style_params);
+		appendText(chat.mText.substr(4), FALSE, style_params);
+	}
+	else
+		appendText(chat.mText, FALSE, style_params);
 	blockUndo();
 }
+
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index c89d4b4ec67..ef5839ff2f7 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -106,10 +106,11 @@ class LLChatHistory : public LLTextEditor
 		 * If last user appended message, concurs with current user,
 		 * separator is added before the message, otherwise header is added.
 		 * @param chat - base chat message.
-		 * @param time time of a message.
-		 * @param message message itself.
+		 * @param use_plain_text_chat_history  - whether to add message as plain text.
+		 * @param input_append_params - font style.
 		 */
-		void appendWidgetMessage(const LLChat& chat, const LLStyle::Params& input_append_params = LLStyle::Params());
+		void appendMessage(const LLChat& chat, const bool use_plain_text_chat_history = false, const LLStyle::Params& input_append_params = LLStyle::Params());
+		/*virtual*/ void clear();
 
 	private:
 		std::string mLastFromName;
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 7fc207d3950..95e8adca81d 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -56,6 +56,7 @@
 #include "llfloaterabout.h"
 #include "llfloaterhardwaresettings.h"
 #include "llfloatervoicedevicesettings.h"
+#include "llimfloater.h"
 #include "llkeyboard.h"
 #include "llmodaldialog.h"
 #include "llnavigationbar.h"
@@ -357,6 +358,8 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
 
 BOOL LLFloaterPreference::postBuild()
 {
+	gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&LLIMFloater::processChatHistoryStyleUpdate, _2));
+
 	LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
 	if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
 		tabcontainer->selectFirstTab();
@@ -444,6 +447,8 @@ void LLFloaterPreference::apply()
 	
 //	LLWString busy_response = utf8str_to_wstring(getChild<LLUICtrl>("busy_response")->getValue().asString());
 //	LLWStringUtil::replaceTabsWithSpaces(busy_response, 4);
+
+	gSavedSettings.setBOOL("PlainTextChatHistory", childGetValue("plain_text_chat_history").asBoolean());
 	
 	if(mGotPersonalInfo)
 	{ 
@@ -1161,6 +1166,8 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im
 	childSetLabelArg("online_visibility", "[DIR_VIS]", mDirectoryVisibility);
 	childEnable("send_im_to_email");
 	childSetValue("send_im_to_email", im_via_email);
+	childEnable("plain_text_chat_history");
+	childSetValue("plain_text_chat_history", gSavedSettings.getBOOL("PlainTextChatHistory"));
 	childEnable("log_instant_messages");
 //	childEnable("log_chat");
 //	childEnable("busy_response");
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 38a9fec1927..795770d3dbc 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -110,10 +110,10 @@ void LLIMFloater::onFocusReceived()
 // virtual
 void LLIMFloater::onClose(bool app_quitting)
 {
+	if (!gIMMgr->hasSession(mSessionID)) return;
+	
 	setTyping(false);
-	// SJB: We want the close button to hide the session window, not end it
-	// *NOTE: Yhis is functional, but not ideal - it's still closing the floater; we really want to change the behavior of the X button instead.
-	//gIMMgr->leaveSession(mSessionID);
+	gIMMgr->leaveSession(mSessionID);
 }
 
 /* static */
@@ -385,7 +385,7 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
 
 void LLIMFloater::getAllowedRect(LLRect& rect)
 {
-	rect = gViewerWindow->getWorldViewRectScaled();
+	rect = gViewerWindow->getWorldViewRectRaw();
 }
 
 void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
@@ -482,6 +482,8 @@ void LLIMFloater::sessionInitReplyReceived(const LLUUID& im_session_id)
 
 void LLIMFloater::updateMessages()
 {
+	bool use_plain_text_chat_history = gSavedSettings.getBOOL("PlainTextChatHistory");
+
 	std::list<LLSD> messages;
 	LLIMModel::instance().getMessages(mSessionID, messages, mLastMessageIndex+1);
 
@@ -507,39 +509,7 @@ void LLIMFloater::updateMessages()
 			chat.mText = message;
 			chat.mTimeStr = time;
 			
-			//Handle IRC styled /me messages.
-			std::string prefix = message.substr(0, 4);
-			if (prefix == "/me " || prefix == "/me'")
-			{
-				
-				LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
-				LLViewerChat::getChatColor(chat,txt_color);
-				LLFontGL* fontp = LLViewerChat::getChatFont();
-				std::string font_name = LLFontGL::nameFromFont(fontp);
-				std::string font_size = LLFontGL::sizeFromFont(fontp);
-				LLStyle::Params append_style_params;
-				append_style_params.color(txt_color);
-				append_style_params.readonly_color(txt_color);
-				append_style_params.font.name(font_name);
-				append_style_params.font.size(font_size);
-				
-				if (from.size() > 0)
-				{
-					append_style_params.font.style = "ITALIC";
-					chat.mText = from;
-					mChatHistory->appendWidgetMessage(chat, append_style_params);
-				}
-				
-				message = message.substr(3);
-				append_style_params.font.style = "ITALIC";
-				mChatHistory->appendText(message, FALSE, append_style_params);
-			}
-			else
-			{
-				chat.mText = message;
-				mChatHistory->appendWidgetMessage(chat);
-			}
-
+			mChatHistory->appendMessage(chat, use_plain_text_chat_history);
 			mLastMessageIndex = msg["index"].asInteger();
 		}
 	}
@@ -670,6 +640,28 @@ void LLIMFloater::processAgentListUpdates(const LLSD& body)
 	}
 }
 
+void LLIMFloater::updateChatHistoryStyle()
+{
+	mChatHistory->clear();
+	mLastMessageIndex = -1;
+	updateMessages();
+}
+
+void LLIMFloater::processChatHistoryStyleUpdate(const LLSD& newvalue)
+{
+	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel");
+	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();
+		 iter != inst_list.end(); ++iter)
+	{
+		LLIMFloater* floater = dynamic_cast<LLIMFloater*>(*iter);
+		if (floater)
+		{
+			floater->updateChatHistoryStyle();
+		}
+	}
+
+}
+
 void LLIMFloater::processSessionUpdate(const LLSD& session_update)
 {
 	// *TODO : verify following code when moderated mode will be implemented
diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h
index 32cba71f6ee..9e1330ff497 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llimfloater.h
@@ -97,6 +97,9 @@ class LLIMFloater : public LLTransientDockableFloater
 	void processAgentListUpdates(const LLSD& body);
 	void processSessionUpdate(const LLSD& session_update);
 
+	void updateChatHistoryStyle();
+	static void processChatHistoryStyleUpdate(const LLSD& newvalue);
+
 	BOOL handleDragAndDrop(S32 x, S32 y, MASK mask,
 							   BOOL drop, EDragAndDropType cargo_type,
 							   void *cargo_data, EAcceptance *accept,
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 09fd9b29490..80a6cc343fa 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -173,7 +173,7 @@ void	LLNearbyChat::addMessage(const LLChat& chat)
 				append_style_params.font.style = "ITALIC";
 				LLChat add_chat=chat;
 				add_chat.mText = chat.mFromName + " ";
-				mChatHistory->appendWidgetMessage(add_chat, append_style_params);
+				mChatHistory->appendMessage(add_chat, false, append_style_params);
 			}
 			
 			message = message.substr(3);
@@ -182,7 +182,7 @@ void	LLNearbyChat::addMessage(const LLChat& chat)
 		}
 		else
 		{
-			mChatHistory->appendWidgetMessage(chat);
+			mChatHistory->appendMessage(chat);
 		}
 	}
 }
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index 5a4b0a3892d..fac0d5c60f0 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -309,4 +309,13 @@
      name="send_im_to_email"
      top_pad="5"
      width="400" />
+    <check_box
+     enabled="false"
+     height="16"
+     label="Enable plain text chat history"
+     layout="topleft"
+     left_delta="0"
+     name="plain_text_chat_history"
+     top_pad="5"
+     width="400" />
 </panel>
-- 
GitLab


From dc6216e77e84369450d3a9e2269bf4d03436a23d Mon Sep 17 00:00:00 2001
From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com>
Date: Mon, 23 Nov 2009 13:56:01 -0500
Subject: [PATCH 511/557] "Fit and finish" issues with bottom bar. See comments
 in JIRAs for details. http://jira.secondlife.com/browse/EXT-2537
 http://jira.secondlife.com/browse/EXT-2352

---
 .../textures/bottomtray/Notices_Unread.png    | Bin 333 -> 331 bytes
 .../skins/default/textures/textures.xml       |  11 +++-
 .../textures/widgets/Arrow_Small_Left.png     | Bin 0 -> 223 bytes
 .../textures/widgets/Arrow_Small_Right.png    | Bin 0 -> 217 bytes
 .../textures/widgets/Arrow_Small_Up.png       | Bin 0 -> 382 bytes
 .../widgets/ComboButton_Up_On_Selected.png    | Bin 0 -> 482 bytes
 .../skins/default/xui/en/panel_bottomtray.xml |  53 ++++++++++++------
 .../default/xui/en/panel_nearby_chat_bar.xml  |  12 ++--
 .../xui/en/widgets/gesture_combo_box.xml      |   4 +-
 .../default/xui/en/widgets/talk_button.xml    |  11 +++-
 10 files changed, 64 insertions(+), 27 deletions(-)
 create mode 100644 indra/newview/skins/default/textures/widgets/Arrow_Small_Left.png
 create mode 100644 indra/newview/skins/default/textures/widgets/Arrow_Small_Right.png
 create mode 100644 indra/newview/skins/default/textures/widgets/Arrow_Small_Up.png
 create mode 100644 indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png

diff --git a/indra/newview/skins/default/textures/bottomtray/Notices_Unread.png b/indra/newview/skins/default/textures/bottomtray/Notices_Unread.png
index 98f1f04b9a70d6eeb129a0f0355d220518b03d33..aa3898ca99f816f86ecb763761d43d91a3d7420a 100644
GIT binary patch
delta 239
zcmX@hbehSsGr-TCmrII^fq{Y7)59eQNJ{`Q9|tp#WKz@d0aA>`LGDfr>(0r%1adM1
zd_r7{QWGcorPV9lbbbqxFA4GsW^j0RBMr!D_H=O!k+>Xt`leX30*`ATN7JQMYv-zK
zJo#_G$<TxKeekuL+D;dKeJ<bp-K3mxe#H8{5p4hOg#Kj|HdtUi^-|ndUp0s8GS};_
zd;MbddilIh@<MCvtHoglA9H;<EM)bL^}>09#c%lTcrTcLQ1^LUWBFrm)0N>4N@p(#
kOZ*A8<7sBS!}Eq;{is~(_A34`pnDiRUHx3vIVCg!03nQ94FCWD

delta 241
zcmX@jbe74lGr-TCmrII^fq{Y7)59eQNQ(e59|tp#l#n`e2uMkmxJHx&=ckpFCl;kL
zIHu$$r7C#lCZ?wbr6#6S7M@JC0V+xh@Ck99Xqi^;pQ7~&$glNuaSW-r6?5vXSd)T?
z%f+1>UMo{G?+e`dUVl=c<;v&mYjMrre%<{l=ODj-t(@tb&l@(f^Rk#t-+FEG9>z1v
ztp2~%W6e3Rb=&5TJvny_BlTN1&oQW3yi4s?)5F`9{m(>nlYf+%MLTByn!aL^C=b_G
n3FpFxHX<e;rSvY@GqN!>*~<D(dZ)|@bP0o}tDnm{r-UW|OdDJ%

diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index f4a239be621..8469cf9e2d0 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -50,8 +50,12 @@ with the same filename but different name
   <texture name="Arrow_Right_Off" file_name="navbar/Arrow_Right_Off.png" preload="true" />
   <texture name="Arrow_Right_Press" file_name="navbar/Arrow_Right_Press.png" preload="true" />
 
-  <texture name="Arrow_Up" file_name="widgets/Arrow_Up.png" preload="true" />
-  <texture name="Arrow_Down" file_name="widgets/Arrow_Down.png" preload="true" />
+  <texture name="Arrow_Left" file_name="widgets/Arrow_Left.png" preload="true" />
+  <texture name="Arrow_Right" file_name="widgets/Arrow_Right.png" preload="true" />
+
+  <texture name="Arrow_Small_Up" file_name="widgets/Arrow_Small_Up.png" preload="true" />
+  <texture name="Arrow_Small_Left" file_name="widgets/Arrow_Small_Left.png" preload="true" />
+  <texture name="Arrow_Small_Right" file_name="widgets/Arrow_Small_Right.png" preload="true" />
 
   <texture name="AudioMute_Off" file_name="icons/AudioMute_Off.png" preload="false" />
   <texture name="AudioMute_Over" file_name="icons/AudioMute_Over.png" preload="false" />
@@ -120,6 +124,7 @@ with the same filename but different name
   <texture name="ComboButton_Press" file_name="widgets/ComboButton_Press.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
   <texture name="ComboButton_Selected" file_name="widgets/ComboButton_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
   <texture name="ComboButton_UpSelected" file_name="widgets/ComboButton_UpSelected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+  <texture name="ComboButton_Up_On_Selected" file_name="widgets/ComboButton_Up_On_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
   <texture name="ComboButton_Off" file_name="widgets/ComboButton_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
   <texture name="ComboButton_UpOff" file_name="widgets/ComboButton_UpOff.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
   <texture name="Container" file_name="containers/Container.png" preload="false" />
@@ -439,6 +444,7 @@ with the same filename but different name
   <texture name="Search" file_name="navbar/Search.png" preload="false" />
 
   <texture name="SegmentedBtn_Left_Off" file_name="widgets/SegmentedBtn_Left_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+  <texture name="SegmentedBtn_Left_Over" file_name="widgets/SegmentedBtn_Left_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
   <texture name="SegmentedBtn_Left_Press" file_name="widgets/SegmentedBtn_Left_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
   <texture name="SegmentedBtn_Left_Disabled" file_name="widgets/SegmentedBtn_Left_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
   <texture name="SegmentedBtn_Left_Selected" file_name="widgets/SegmentedBtn_Left_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
@@ -453,6 +459,7 @@ with the same filename but different name
   <texture name="SegmentedBtn_Middle_Selected_Disabled" file_name="widgets/SegmentedBtn_Middle_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
 
   <texture name="SegmentedBtn_Right_Off" file_name="widgets/SegmentedBtn_Right_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+  <texture name="SegmentedBtn_Right_Over" file_name="widgets/SegmentedBtn_Right_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
   <texture name="SegmentedBtn_Right_Press" file_name="widgets/SegmentedBtn_Right_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
   <texture name="SegmentedBtn_Right_Disabled" file_name="widgets/SegmentedBtn_Right_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
   <texture name="SegmentedBtn_Right_Selected" file_name="widgets/SegmentedBtn_Right_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
diff --git a/indra/newview/skins/default/textures/widgets/Arrow_Small_Left.png b/indra/newview/skins/default/textures/widgets/Arrow_Small_Left.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d624c377915f4622a4e4897c7099e147a7d8a10
GIT binary patch
literal 223
zcmeAS@N?(olHy`uVBq!ia0vp^{2<K11|+SoP4xm&k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*D5X8a-VcLn>}1{rUgjo_S|OXCsqC^x03JKE1P0b*wwqx^(H%
zyVuvnR`X7`@#~#5X;Pj-@9*#L|Mz?Ia+_WE@bK8-H`{D&JdhzgfBJ^3d8XN6=JN9M
z#UdGxoj?D7;+qTG*qPkijyb2ei=JRmC>2<rR};v3=)eWL2JgPYjAgkE49pBqZcKW%
U<fPRJpko+3UHx3vIVCg!02W(Ts{jB1

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/widgets/Arrow_Small_Right.png b/indra/newview/skins/default/textures/widgets/Arrow_Small_Right.png
new file mode 100644
index 0000000000000000000000000000000000000000..91c03c426e265431ed5cbf3136e61cac7ad3e50f
GIT binary patch
literal 217
zcmeAS@N?(olHy`uVBq!ia0vp^{2<K11|+SoP4xm&k|nMYCBgY=CFO}lsSJ)O`AMk?
zp1FzXsX?iUDV2pMQ*D5Xsy$sCLn>}1{rUgjo_S|OXCsq?^x03JKD}cpZT{24yFPaJ
zw^>`ZY_Zm>EQokG>Bj#0|Me3XCrz4^x8ur#ubU@KnDA_hX7Ddn6_uEiTm}mmqc*3V
zeWhl-<>$|z_LG**oH+601Y3a#i+?KU^;RtAlDNhG!Bv>UnD6WsUV#LL9-B!o(gVfZ
QfX-m>boFyt=akR{0D=8h{{R30

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/widgets/Arrow_Small_Up.png b/indra/newview/skins/default/textures/widgets/Arrow_Small_Up.png
new file mode 100644
index 0000000000000000000000000000000000000000..38aac0e5cabb91d65f455fc317c473281a870ffe
GIT binary patch
literal 382
zcmV-^0fGLBP)<h;3K|Lk000e1NJLTq000&M000*V1^@s659q(100001b5ch_0Itp)
z=>Px$I7vi7R5;7Els}4uFcikWJVh7_v5_fu4`VZ(-a^k};|0XbCA`ZlOuv>k{wYM0
zY$1_hP?u%ng9k~-`|`^dUVsxqDFr*rGDs<n2zFhEs;a;kgWYu<nx^@;C}Rw+>mm$8
zJfBb4LI?;Uj1fDIvsj^&GG>MLS4s(6N@<K3zzS*4^K4Xjp65kaN@>)JmH1REH2!<E
zZM%*+=if<^eCoO9d7CxUGywoepR$!i1R?_GyavEH=e1tjt5HfV#KSP4@B7`Wm1SA$
z%>YmoMV+SU$6k%Ll^A0y*?Zpa_xdmEIsqIvNEAh1dpEgWug8yfBpd|6?YGz8>bzC>
z)k704eZH{iPv|saB3c^6R9KdUaU9`!-tt#mE*B%hLI^w_55#e7j+Thv`#$nKhf)g6
cq`$B618*t#9qLHVtN;K207*qoM6N<$f?4jQN&o-=

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png b/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd1d11dd0b5f981513643df7c7fe497295e8447c
GIT binary patch
literal 482
zcmV<80UiE{P)<h;3K|Lk000e1NJLTq000&M000*V1^@s659q(10000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzgh@m}RCwC7mAg*EKoCV|myHC0jsQ{w
z;t?W5PnoZvrsE-$hCodLQmPa{NzaGy12oVfBv1-KNE8GT<JjIAW^ES{avl=HT33FJ
zkMCZOZ3O_=ATt8i4eOkU-qp(bTIcUf0&7tz0t}+?{^hB;X$p(Qwg8vGkqW%7X}4Od
zTI(G%U7YhJazJ+6X?+?Z9Oo!D%*51WBmzcMEa<kqh{5B02NHR5iWAnFl`}EWpcL7;
zCLl_A##$@I1&fx+2#I5q0~2SAm;|87`5!?i+XtnQYSU!3W$(jux?3x`Vz(Yvi>YPf
zd4pfPv)XaFcfY=OSU$R_KV;SVz6U`VB#xEV)K9;my*JCeMmed(@t|(os_nn_J2$($
zknv`_jFatw;F+cQuf83SbzOXnQZSHQyQNDE7UU*oQ=W!@8b<I_5$Ep2o#AUqD950q
z&{961zcttmb5h^qu=73k@%+}TR4P|W>SxN+kJ#y5wOYMwG#ZbJr%({=iIC;~q4*=f
Y0K~Xaj#XWwJpcdz07*qoM6N<$f*YaO{r~^~

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 00711a29e01..a8e659259e9 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -46,7 +46,7 @@
          left="0"
          min_height="23"
          width="310"
-         top="0"
+         top="4"
          min_width="192"
          name="chat_bar"
          user_resize="false"
@@ -58,9 +58,9 @@
          height="28"
          layout="topleft"
          min_height="28"
-         width="104"
+         width="100"
          top_delta="0"
-         min_width="104"
+         min_width="100"
          name="speak_panel"
          user_resize="false">
           <talk_button
@@ -71,7 +71,7 @@
            layout="topleft"
            left="0"
            name="talk"
-           top="3"
+           top="4"
           width="100" />
         </layout_panel>
         <icon
@@ -104,7 +104,7 @@
           layout="topleft"
           name="Gesture"
           left="0"
-          top="3"
+          top="4"
           width="82"
           tool_tip="Shows/hides gestures">
              <gesture_combo_box.drop_down_button
@@ -137,6 +137,9 @@
          width="80"
          min_width="49">
             <button
+                 image_selected="PushButton_Selected_Press"
+                 image_pressed="PushButton_Press"
+		 image_pressed_selected="PushButton_Selected_Press"
              follows="left|right"
              height="23"
              use_ellipses="true"
@@ -145,7 +148,7 @@
              layout="topleft"
              name="movement_btn"
              tool_tip="Shows/hides movement controls"
-             top="3"
+             top="4"
              width="80">
                 <button.init_callback
                  function="Button.SetDockableFloaterToggle"
@@ -176,6 +179,9 @@
          user_resize="false"
          width="80">
             <button
+                 image_selected="PushButton_Selected_Press"
+                 image_pressed="PushButton_Press"
+		 image_pressed_selected="PushButton_Selected_Press"
              follows="left|right"
              height="23"
              use_ellipses="true"
@@ -184,7 +190,7 @@
              layout="topleft"
              left="0"
              tool_tip="Shows/hides camera controls"
-             top="3"
+             top="4"
              name="camera_btn"
              width="80">
                 <button.init_callback
@@ -221,7 +227,7 @@
              layout="topleft"
              name="snapshots"
              width="36"
-             top="3"
+             top="4"
              image_overlay="Snapshot_Off"
              tool_tip="Take snapshot">
 				<button.commit_callback
@@ -245,37 +251,47 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
             <chiclet_panel
 	    mouse_opaque="false"
              follows="left|right"
-             height="28"
+             height="23"
              layout="topleft"
              left="0"
              min_width="180"
              name="chiclet_list"
-             top="0"
-             chiclet_padding="3"
+             top="4"
+             chiclet_padding="4"
              scrolling_offset="40"
              width="189">
                 <button
                  auto_resize="true"
                  follows="right"
                  height="23"
-                 image_selected="BottomTray_Scroll_Left"
-                 image_unselected="BottomTray_Scroll_Left"
+                 image_selected="SegmentedBtn_Left_Off"
+                 image_unselected="SegmentedBtn_Left_Off"
+		 image_hover_selected="SegmentedBtn_Left_Over"
+		 image_hover_unselected="SegmentedBtn_Left_Over"
+		 image_pressed="SegmentedBtn_Left_Press"
+		 image_pressed_selected="SegmentedBtn_Left_Press"
+		 image_overlay="Arrow_Small_Left"
                  layout="topleft"
                  name="chicklet_left_scroll_button"
                  tab_stop="false"
-                 top="3"
+                 top="0"
                  visible="false"
                  width="20" />
                 <button
                  auto_resize="true"
                  follows="right"
                  height="23"
-                 image_selected="BottomTray_Scroll_Right"
-                 image_unselected="BottomTray_Scroll_Right"
+                 image_selected="SegmentedBtn_Right_Off"
+                 image_unselected="SegmentedBtn_Right_Off"
+		 image_hover_selected="SegmentedBtn_Right_Over"
+		 image_hover_unselected="SegmentedBtn_Right_Over"
+		 image_pressed="SegmentedBtn_Right_Press"
+		 image_pressed_selected="SegmentedBtn_Right_Press"
+		 image_overlay="Arrow_Small_Right"
                  layout="topleft"
                  name="chicklet_right_scroll_button"
                  tab_stop="false"
-                 top="3"
+                 top="0"
                  visible="false"
                  width="20" />
             </chiclet_panel>
@@ -311,6 +327,9 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
              top="4"
              width="54">
               <button
+                 image_selected="PushButton_Selected_Press"
+                 image_pressed="PushButton_Press"
+		 image_pressed_selected="PushButton_Selected_Press"
               auto_resize="true"
                halign="right"
                height="23"
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
index ecf35523cd8..de612fbbc31 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
@@ -26,7 +26,7 @@
      max_length="512"
      name="chat_box"
      tool_tip="Press Enter to say, Ctrl+Enter to shout"
-     top="0"
+     top="1"
      width="279" />
     <output_monitor
      auto_update="true"
@@ -37,19 +37,21 @@
      left_pad="-24"
      mouse_opaque="true"
      name="chat_zone_indicator"
-     top="4"
+     top="1"
      visible="true"
      width="20" />
     <button
      follows="right"
      is_toggle="true"
      width="20"
-     top="0"
+     top="1"
      layout="topleft"
-     left_pad="4           "
+     left_pad="4"
      image_disabled="ComboButton_UpOff"
      image_unselected="ComboButton_UpOff"
-     image_selected="ComboButton_UpSelected"
+     image_selected="ComboButton_Up_On_Selected"
+     image_pressed="ComboButton_UpSelected"
+     image_pressed_selected="ComboButton_Up_On_Selected"
      height="23"
      name="show_nearby_chat"
      tool_tip="Shows/hides nearby chat log">
diff --git a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
index 6171be034f4..6ac654f14e6 100644
--- a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
+++ b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
@@ -19,8 +19,10 @@
                               hover_glow_amount="0.15"
                               font="SansSerif"
                               scale_image="true"
+                 image_selected="PushButton_Selected_Press"
+                 image_pressed="PushButton_Press"
+		 image_pressed_selected="PushButton_Selected_Press"
                               image_unselected="PushButton_Off"
-                              image_selected="PushButton_Selected"
                               image_disabled="PushButton_Disabled"
                               image_disabled_selected="PushButton_Selected_Disabled" />
   <gesture_combo_box.combo_list bg_writeable_color="MenuDefaultBgColor"
diff --git a/indra/newview/skins/default/xui/en/widgets/talk_button.xml b/indra/newview/skins/default/xui/en/widgets/talk_button.xml
index 1d8257fbc8a..bbc508de080 100644
--- a/indra/newview/skins/default/xui/en/widgets/talk_button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/talk_button.xml
@@ -6,6 +6,10 @@
     image_unselected="SegmentedBtn_Left_Off"
   -->
   <speak_button
+                 image_selected="SegmentedBtn_Left_Selected_Press"
+                 image_unselected="SegmentedBtn_Left_Off"
+		 image_pressed="SegmentedBtn_Left_Selected_Press"
+		 image_pressed_selected="SegmentedBtn_Left_Selected_Press"
     name="left"
     label="Speak"
     label_selected="Speak"
@@ -21,8 +25,11 @@
     bottom="0"
     tab_stop="false"
     is_toggle="true"
-    image_selected="ComboButton_UpSelected"
-    image_unselected="ComboButton_UpOff"
+                 image_selected="SegmentedBtn_Right_Selected_Press"
+                 image_unselected="SegmentedBtn_Right_Off"
+		 image_pressed="SegmentedBtn_Right_Press"
+		 image_pressed_selected="SegmentedBtn_Right_Selected_Press"
+		 image_overlay="Arrow_Small_Up"
     />
   <monitor
     name="monitor"
-- 
GitLab


From 8ef1dcf72ad2b425e7e849edb4e47d86bff23a0b Mon Sep 17 00:00:00 2001
From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com>
Date: Mon, 23 Nov 2009 14:16:31 -0500
Subject: [PATCH 512/557] Scrollbar was too dark and not matching other
 scrollbars. Switched scroll_bar_bg_visible attribute to false in
 gesture_combo_box.xml to fix. http://jira.secondlife.com/browse/EXT-1451

---
 .../newview/skins/default/xui/en/widgets/gesture_combo_box.xml  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
index 6ac654f14e6..b61f9fffffa 100644
--- a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
+++ b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
@@ -26,7 +26,7 @@
                               image_disabled="PushButton_Disabled"
                               image_disabled_selected="PushButton_Selected_Disabled" />
   <gesture_combo_box.combo_list bg_writeable_color="MenuDefaultBgColor"
-                                scroll_bar_bg_visible="true" />
+                                scroll_bar_bg_visible="false" />
   <gesture_combo_box.combo_editor name="Combo Text Entry"
                           select_on_focus="true"
                           font="SansSerifSmall" />
-- 
GitLab


From e0a364b7bf836191f25604ef9c3783be46c1ce55 Mon Sep 17 00:00:00 2001
From: richard <none@none>
Date: Mon, 23 Nov 2009 11:37:32 -0800
Subject: [PATCH 513/557] comverted mEnclosingBlockOffset from signed to
 unsigned to support param blocks up to 32k in size reviewed by James

---
 indra/llxuixml/llinitparam.cpp | 2 +-
 indra/llxuixml/llinitparam.h   | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp
index 318a0348a2a..4c050844f86 100644
--- a/indra/llxuixml/llinitparam.cpp
+++ b/indra/llxuixml/llinitparam.cpp
@@ -46,7 +46,7 @@ namespace LLInitParam
 	{
 		const U8* my_addr = reinterpret_cast<const U8*>(this);
 		const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block);
-		mEnclosingBlockOffset = (S16)(block_addr - my_addr);
+		mEnclosingBlockOffset = (U16)(my_addr - block_addr);
 	}
 
 	//
diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h
index 9fb464ca7b9..493ddaa3785 100644
--- a/indra/llxuixml/llinitparam.h
+++ b/indra/llxuixml/llinitparam.h
@@ -300,14 +300,14 @@ namespace LLInitParam
 			const U8* my_addr = reinterpret_cast<const U8*>(this);
 			// get address of enclosing BLOCK class using stored offset to enclosing BaseBlock class
 			return *const_cast<BaseBlock*>(
-							reinterpret_cast<const BaseBlock*>(my_addr + (ptrdiff_t)mEnclosingBlockOffset));
+							reinterpret_cast<const BaseBlock*>(my_addr - (ptrdiff_t)(S32)mEnclosingBlockOffset));
 		}
 
 	private:
 		friend class BaseBlock;
 
 		bool		mIsProvided;
-		S16			mEnclosingBlockOffset;
+		U16			mEnclosingBlockOffset;
 	};
 
 	// various callbacks and constraints associated with an individual param
-- 
GitLab


From 7fd1488c6218ddbd82de0eea86297e65f2561bc7 Mon Sep 17 00:00:00 2001
From: richard <none@none>
Date: Mon, 23 Nov 2009 11:42:32 -0800
Subject: [PATCH 514/557] convert signals to allocate on demand in order to
 speed up widget construction reviewed by James

---
 indra/llui/llbutton.cpp               |  51 ++++++--
 indra/llui/llbutton.h                 |   8 +-
 indra/llui/llfloater.cpp              |   8 +-
 indra/llui/llfocusmgr.cpp             |  43 ++++++-
 indra/llui/llfocusmgr.h               |  16 +--
 indra/llui/lllineeditor.cpp           |   6 +-
 indra/llui/llmenugl.cpp               |  17 ++-
 indra/llui/llmultislider.cpp          |  37 +++++-
 indra/llui/llmultislider.h            |   9 +-
 indra/llui/llmultisliderctrl.cpp      |   4 +-
 indra/llui/llpanel.cpp                |  25 +++-
 indra/llui/llpanel.h                  |   6 +-
 indra/llui/llslider.cpp               |  36 +++++-
 indra/llui/llslider.h                 |   9 +-
 indra/llui/llsliderctrl.cpp           |   4 +-
 indra/llui/llspinctrl.cpp             |   6 +-
 indra/llui/lltabcontainer.cpp         |   6 +-
 indra/llui/lluictrl.cpp               | 179 +++++++++++++++++++++-----
 indra/llui/lluictrl.h                 |  42 +++---
 indra/newview/llchiclet.cpp           |   9 +-
 indra/newview/llfavoritesbar.cpp      |   6 +-
 indra/newview/llfloaterbuyland.cpp    |   2 +-
 indra/newview/llfloaterchat.cpp       |   2 +-
 indra/newview/llfloaterchatterbox.cpp |   2 +-
 indra/newview/llfloaterland.cpp       |   2 +-
 indra/newview/llimpanel.cpp           |   2 +-
 indra/newview/llmediactrl.cpp         |   2 +-
 indra/newview/llpanelavatartag.cpp    |   2 +-
 indra/newview/llpanelpeople.cpp       |   2 +-
 indra/newview/llpreviewgesture.cpp    |   2 +-
 30 files changed, 409 insertions(+), 136 deletions(-)

diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index b65f248db27..8930e320558 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -147,7 +147,11 @@ LLButton::LLButton(const LLButton::Params& p)
 	mCommitOnReturn(p.commit_on_return),
 	mFadeWhenDisabled(FALSE),
 	mForcePressedState(false),
-	mLastDrawCharsCount(0)
+	mLastDrawCharsCount(0),
+	mMouseDownSignal(NULL),
+	mMouseUpSignal(NULL),
+	mHeldDownSignal(NULL)
+
 {
 	static LLUICachedControl<S32> llbutton_orig_h_pad ("UIButtonOrigHPad", 0);
 	static Params default_params(LLUICtrlFactory::getDefaultParams<LLButton>());
@@ -215,13 +219,28 @@ LLButton::LLButton(const LLButton::Params& p)
 	}
 	
 	if (p.click_callback.isProvided())
-		initCommitCallback(p.click_callback, mCommitSignal); // alias -> commit_callback
+	{
+		setCommitCallback(initCommitCallback(p.click_callback)); // alias -> commit_callback
+	}
 	if (p.mouse_down_callback.isProvided())
-		initCommitCallback(p.mouse_down_callback, mMouseDownSignal);
+	{
+		setMouseDownCallback(initCommitCallback(p.mouse_down_callback));
+	}
 	if (p.mouse_up_callback.isProvided())
-		initCommitCallback(p.mouse_up_callback, mMouseUpSignal);
+	{
+		setMouseUpCallback(initCommitCallback(p.mouse_up_callback));
+	}
 	if (p.mouse_held_callback.isProvided())
-		initCommitCallback(p.mouse_held_callback, mHeldDownSignal);
+	{
+		setHeldDownCallback(initCommitCallback(p.mouse_held_callback));
+	}
+}
+
+LLButton::~LLButton()
+{
+	delete mMouseDownSignal;
+	delete mMouseUpSignal;
+	delete mHeldDownSignal;
 }
 
 // HACK: Committing a button is the same as instantly clicking it.
@@ -232,9 +251,9 @@ void LLButton::onCommit()
 	// panel containing it.  Therefore we need to call 	LLUICtrl::onCommit()
 	// LAST, otherwise this becomes deleted memory.
 
-	mMouseDownSignal(this, LLSD());
+	if (mMouseDownSignal) (*mMouseDownSignal)(this, LLSD());
 	
-	mMouseUpSignal(this, LLSD());
+	if (mMouseUpSignal) (*mMouseUpSignal)(this, LLSD());
 
 	if (getSoundFlags() & MOUSE_DOWN)
 	{
@@ -257,19 +276,23 @@ void LLButton::onCommit()
 
 boost::signals2::connection LLButton::setClickedCallback( const commit_signal_t::slot_type& cb )
 {
-	return mCommitSignal.connect(cb);
+	if (!mCommitSignal) mCommitSignal = new commit_signal_t();
+	return mCommitSignal->connect(cb);
 }
 boost::signals2::connection LLButton::setMouseDownCallback( const commit_signal_t::slot_type& cb )
 {
-	return mMouseDownSignal.connect(cb);
+	if (!mMouseDownSignal) mMouseDownSignal = new commit_signal_t();
+	return mMouseDownSignal->connect(cb);
 }
 boost::signals2::connection LLButton::setMouseUpCallback( const commit_signal_t::slot_type& cb )
 {
-	return mMouseUpSignal.connect(cb);
+	if (!mMouseUpSignal) mMouseUpSignal = new commit_signal_t();
+	return mMouseUpSignal->connect(cb);
 }
 boost::signals2::connection LLButton::setHeldDownCallback( const commit_signal_t::slot_type& cb )
 {
-	return mHeldDownSignal.connect(cb);
+	if (!mHeldDownSignal) mHeldDownSignal = new commit_signal_t();
+	return mHeldDownSignal->connect(cb);
 }
 
 
@@ -351,7 +374,7 @@ BOOL LLButton::handleMouseDown(S32 x, S32 y, MASK mask)
 		 */
 		LLUICtrl::handleMouseDown(x, y, mask);
 
-		mMouseDownSignal(this, LLSD());
+		if(mMouseDownSignal) (*mMouseDownSignal)(this, LLSD());
 
 		mMouseDownTimer.start();
 		mMouseDownFrame = (S32) LLFrameTimer::getFrameCount();
@@ -383,7 +406,7 @@ BOOL LLButton::handleMouseUp(S32 x, S32 y, MASK mask)
 		LLUICtrl::handleMouseUp(x, y, mask);
 
 		// Regardless of where mouseup occurs, handle callback
-		mMouseUpSignal(this, LLSD());
+		if(mMouseUpSignal) (*mMouseUpSignal)(this, LLSD());
 
 		resetMouseDownTimer();
 
@@ -493,7 +516,7 @@ BOOL LLButton::handleHover(S32 x, S32 y, MASK mask)
 			{
 				LLSD param;
 				param["count"] = mMouseHeldDownCount++;
-				mHeldDownSignal(this, param);
+				if (mHeldDownSignal) (*mHeldDownSignal)(this, param);
 			}
 		}
 
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 3c1b57c4bef..8c3b4bd859e 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -128,6 +128,8 @@ class LLButton
 	LLButton(const Params&);
 
 public:
+
+	~LLButton();
 	// For backward compatability only
 	typedef boost::function<void(void*)> button_callback_t;
 
@@ -251,9 +253,9 @@ class LLButton
 	void			resetMouseDownTimer();
 
 private:
-	commit_signal_t 			mMouseDownSignal;
-	commit_signal_t 			mMouseUpSignal;
-	commit_signal_t 			mHeldDownSignal;
+	commit_signal_t* 			mMouseDownSignal;
+	commit_signal_t* 			mMouseUpSignal;
+	commit_signal_t* 			mHeldDownSignal;
 	
 	const LLFontGL*				mGLFont;
 	
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index bf965e8e28e..262afbe6615 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -2642,10 +2642,14 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
 	
 	// open callback 
 	if (p.open_callback.isProvided())
-		initCommitCallback(p.open_callback, mOpenSignal);
+	{
+		mOpenSignal.connect(initCommitCallback(p.open_callback));
+	}
 	// close callback 
 	if (p.close_callback.isProvided())
-		initCommitCallback(p.close_callback, mCloseSignal);
+	{
+		mCloseSignal.connect(initCommitCallback(p.close_callback));
+	}
 }
 
 LLFastTimer::DeclareTimer POST_BUILD("Floater Post Build");
diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp
index 00a80478cf4..35fbc7b0a88 100644
--- a/indra/llui/llfocusmgr.cpp
+++ b/indra/llui/llfocusmgr.cpp
@@ -41,6 +41,10 @@ const F32 FOCUS_FADE_TIME = 0.3f;
 // NOTE: the LLFocusableElement implementation has been moved here from lluictrl.cpp.
 
 LLFocusableElement::LLFocusableElement()
+:	mFocusLostCallback(NULL),
+	mFocusReceivedCallback(NULL),
+	mFocusChangedCallback(NULL),
+	mTopLostCallback(NULL)
 {
 }
 
@@ -59,23 +63,27 @@ BOOL LLFocusableElement::handleUnicodeChar(llwchar uni_char, BOOL called_from_pa
 // virtual
 LLFocusableElement::~LLFocusableElement()
 {
+	delete mFocusLostCallback;
+	delete mFocusReceivedCallback;
+	delete mFocusChangedCallback;
+	delete mTopLostCallback;
 }
 
 void LLFocusableElement::onFocusReceived()
 {
-	mFocusReceivedCallback(this);
-	mFocusChangedCallback(this);
+	if (mFocusReceivedCallback) (*mFocusReceivedCallback)(this);
+	if (mFocusChangedCallback) (*mFocusChangedCallback)(this);
 }
 
 void LLFocusableElement::onFocusLost()
 {
-	mFocusLostCallback(this);
-	mFocusChangedCallback(this);
+	if (mFocusLostCallback) (*mFocusLostCallback)(this);
+	if (mFocusChangedCallback) (*mFocusChangedCallback)(this);
 }
 
 void LLFocusableElement::onTopLost()
 {
-	mTopLostCallback(this);
+	if (mTopLostCallback) (*mTopLostCallback)(this);
 }
 
 BOOL LLFocusableElement::hasFocus() const
@@ -87,6 +95,31 @@ void LLFocusableElement::setFocus(BOOL b)
 {
 }
 
+boost::signals2::connection LLFocusableElement::setFocusLostCallback( const focus_signal_t::slot_type& cb)	
+{ 
+	if (!mFocusLostCallback) mFocusLostCallback = new focus_signal_t();
+	return mFocusLostCallback->connect(cb);
+}
+
+boost::signals2::connection	LLFocusableElement::setFocusReceivedCallback(const focus_signal_t::slot_type& cb)	
+{ 
+	if (!mFocusReceivedCallback) mFocusReceivedCallback = new focus_signal_t();
+	return mFocusReceivedCallback->connect(cb);
+}
+
+boost::signals2::connection	LLFocusableElement::setFocusChangedCallback(const focus_signal_t::slot_type& cb)	
+{
+	if (!mFocusChangedCallback) mFocusChangedCallback = new focus_signal_t();
+	return mFocusChangedCallback->connect(cb);
+}
+
+boost::signals2::connection	LLFocusableElement::setTopLostCallback(const focus_signal_t::slot_type& cb)	
+{ 
+	if (!mTopLostCallback) mTopLostCallback = new focus_signal_t();
+	return mTopLostCallback->connect(cb);
+}
+
+
 
 LLFocusMgr gFocusMgr;
 
diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h
index 2fa4e124fb8..83ecd1d301f 100644
--- a/indra/llui/llfocusmgr.h
+++ b/indra/llui/llfocusmgr.h
@@ -56,10 +56,10 @@ class LLFocusableElement
 
 	typedef boost::signals2::signal<void(LLFocusableElement*)> focus_signal_t;
 	
-	boost::signals2::connection setFocusLostCallback( const focus_signal_t::slot_type& cb)	{ return mFocusLostCallback.connect(cb);}
-	boost::signals2::connection	setFocusReceivedCallback(const focus_signal_t::slot_type& cb)	{ return mFocusReceivedCallback.connect(cb);}
-	boost::signals2::connection	setFocusChangedCallback(const focus_signal_t::slot_type& cb)	{ return mFocusChangedCallback.connect(cb);}
-	void	setTopLostCallback(const focus_signal_t::slot_type& cb)	{ mTopLostCallback.connect(cb);}
+	boost::signals2::connection setFocusLostCallback( const focus_signal_t::slot_type& cb);
+	boost::signals2::connection	setFocusReceivedCallback(const focus_signal_t::slot_type& cb);
+	boost::signals2::connection	setFocusChangedCallback(const focus_signal_t::slot_type& cb);
+	boost::signals2::connection	setTopLostCallback(const focus_signal_t::slot_type& cb);
 
 	// These were brought up the hierarchy from LLView so that we don't have to use dynamic_cast when dealing with keyboard focus.
 	virtual BOOL	handleKey(KEY key, MASK mask, BOOL called_from_parent);
@@ -69,10 +69,10 @@ class LLFocusableElement
 	virtual void	onFocusReceived();
 	virtual void	onFocusLost();
 	virtual void	onTopLost();	// called when registered as top ctrl and user clicks elsewhere
-	focus_signal_t  mFocusLostCallback;
-	focus_signal_t  mFocusReceivedCallback;
-	focus_signal_t  mFocusChangedCallback;
-	focus_signal_t  mTopLostCallback;
+	focus_signal_t*  mFocusLostCallback;
+	focus_signal_t*  mFocusReceivedCallback;
+	focus_signal_t*  mFocusChangedCallback;
+	focus_signal_t*  mTopLostCallback;
 };
 
 
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index c2f91ff7e01..406c77a365d 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -626,7 +626,8 @@ BOOL LLLineEditor::handleMouseDown(S32 x, S32 y, MASK mask)
 	// delay cursor flashing
 	mKeystrokeTimer.reset();
 	
-	mMouseDownSignal(this,x,y,mask);
+	if (mMouseDownSignal)
+		(*mMouseDownSignal)(this,x,y,mask);
 
 	return TRUE;
 }
@@ -742,7 +743,8 @@ BOOL LLLineEditor::handleMouseUp(S32 x, S32 y, MASK mask)
 	}
 	
 	// We won't call LLUICtrl::handleMouseUp to avoid double calls of  childrenHandleMouseUp().Just invoke the signal manually.
-	mMouseUpSignal(this,x,y, mask);
+	if (mMouseUpSignal)
+		(*mMouseUpSignal)(this,x,y, mask);
 	return handled;
 }
 
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index de9a854f637..f8935d03ac1 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -760,21 +760,25 @@ void LLMenuItemCallGL::initFromParams(const Params& p)
 {
 	if (p.on_visible.isProvided())
 	{
-		initVisibleCallback(p.on_visible, mVisibleSignal);
+		mVisibleSignal.connect(initVisibleCallback(p.on_visible));
 	}
 	if (p.on_enable.isProvided())
 	{
-		initEnableCallback(p.on_enable, mEnableSignal);
+		setEnableCallback(initEnableCallback(p.on_enable));
 		// Set the enabled control variable (for backwards compatability)
 		if (p.on_enable.control_name.isProvided() && !p.on_enable.control_name().empty())
 		{
 			LLControlVariable* control = findControl(p.on_enable.control_name());
 			if (control)
+			{
 				setEnabledControlVariable(control);
+			}
 		}
 	}
 	if (p.on_click.isProvided())
-		initCommitCallback(p.on_click, mCommitSignal);
+	{
+		setCommitCallback(initCommitCallback(p.on_click));
+	}
 		
 	LLUICtrl::initFromParams(p);
 }
@@ -795,7 +799,10 @@ void LLMenuItemCallGL::updateEnabled( void )
 		if (mEnabledControlVariable)
 		{
 			if (!enabled)
-				mEnabledControlVariable->set(false); // callback overrides control variable; this will call setEnabled()
+			{
+				// callback overrides control variable; this will call setEnabled()
+				mEnabledControlVariable->set(false); 
+			}
 		}
 		else
 		{
@@ -854,7 +861,7 @@ void LLMenuItemCheckGL::initFromParams(const Params& p)
 {
 	if (p.on_check.isProvided())
 	{
-		initEnableCallback(p.on_check, mCheckSignal);
+		setCheckCallback(initEnableCallback(p.on_check));
 		// Set the control name (for backwards compatability)
 		if (p.on_check.control_name.isProvided() && !p.on_check.control_name().empty())
 		{
diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp
index 68e496aed17..1891bca36cb 100644
--- a/indra/llui/llmultislider.cpp
+++ b/indra/llui/llmultislider.cpp
@@ -84,17 +84,30 @@ LLMultiSlider::LLMultiSlider(const LLMultiSlider::Params& p)
 	mThumbCenterSelectedColor(p.thumb_center_selected_color()),
 	mDisabledThumbColor(p.thumb_disabled_color()),
 	mTriangleColor(p.triangle_color()),
-	mThumbWidth(p.thumb_width)
+	mThumbWidth(p.thumb_width),
+	mMouseDownSignal(NULL),
+	mMouseUpSignal(NULL)
 {
 	mValue.emptyMap();
 	mCurSlider = LLStringUtil::null;
 	
 	if (p.mouse_down_callback.isProvided())
-		initCommitCallback(p.mouse_down_callback, mMouseDownSignal);
+	{
+		setMouseDownCallback(initCommitCallback(p.mouse_down_callback));
+	}
 	if (p.mouse_up_callback.isProvided())
-		initCommitCallback(p.mouse_up_callback, mMouseUpSignal);
+	{
+		setMouseUpCallback(initCommitCallback(p.mouse_up_callback));
+	}
+}
+
+LLMultiSlider::~LLMultiSlider()
+{
+	delete mMouseDownSignal;
+	delete mMouseUpSignal;
 }
 
+
 void LLMultiSlider::setSliderValue(const std::string& name, F32 value, BOOL from_event)
 {
 	// exit if not there
@@ -325,7 +338,8 @@ BOOL LLMultiSlider::handleMouseUp(S32 x, S32 y, MASK mask)
 	{
 		gFocusMgr.setMouseCapture( NULL );
 
-		mMouseUpSignal( this, LLSD() );
+		if (mMouseUpSignal)
+			(*mMouseUpSignal)( this, LLSD() );
 
 		handled = TRUE;
 		make_ui_sound("UISndClickRelease");
@@ -345,7 +359,8 @@ BOOL LLMultiSlider::handleMouseDown(S32 x, S32 y, MASK mask)
 	{
 		setFocus(TRUE);
 	}
-	mMouseDownSignal( this, LLSD() );
+	if (mMouseDownSignal)
+		(*mMouseDownSignal)( this, LLSD() );
 
 	if (MASK_CONTROL & mask) // if CTRL is modifying
 	{
@@ -557,3 +572,15 @@ void LLMultiSlider::draw()
 
 	LLF32UICtrl::draw();
 }
+
+boost::signals2::connection LLMultiSlider::setMouseDownCallback( const commit_signal_t::slot_type& cb ) 
+{ 
+	if (!mMouseDownSignal) mMouseDownSignal = new commit_signal_t();
+	return mMouseDownSignal->connect(cb); 
+}
+
+boost::signals2::connection LLMultiSlider::setMouseUpCallback(	const commit_signal_t::slot_type& cb )   
+{ 
+	if (!mMouseUpSignal) mMouseUpSignal = new commit_signal_t();
+	return mMouseUpSignal->connect(cb); 
+}
diff --git a/indra/llui/llmultislider.h b/indra/llui/llmultislider.h
index da633cc1cd5..f8e43a0470a 100644
--- a/indra/llui/llmultislider.h
+++ b/indra/llui/llmultislider.h
@@ -67,6 +67,7 @@ class LLMultiSlider : public LLF32UICtrl
 	LLMultiSlider(const Params&);
 	friend class LLUICtrlFactory;
 public:
+	virtual ~LLMultiSlider();
 	void			setSliderValue(const std::string& name, F32 value, BOOL from_event = FALSE);
 	F32				getSliderValue(const std::string& name) const;
 
@@ -78,8 +79,8 @@ class LLMultiSlider : public LLF32UICtrl
 	/*virtual*/ void	setValue(const LLSD& value);
 	/*virtual*/ LLSD	getValue() const		{ return mValue; }
 
-	boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb ) { return mMouseDownSignal.connect(cb); }
-	boost::signals2::connection setMouseUpCallback(	const commit_signal_t::slot_type& cb )   { return mMouseUpSignal.connect(cb); }
+	boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb );
+	boost::signals2::connection setMouseUpCallback(	const commit_signal_t::slot_type& cb );
 
 	bool			findUnusedValue(F32& initVal);
 	const std::string&	addSlider();
@@ -116,8 +117,8 @@ class LLMultiSlider : public LLF32UICtrl
 	LLUIColor		mDisabledThumbColor;
 	LLUIColor		mTriangleColor;
 	
-	commit_signal_t	mMouseDownSignal;
-	commit_signal_t	mMouseUpSignal;
+	commit_signal_t*	mMouseDownSignal;
+	commit_signal_t*	mMouseUpSignal;
 };
 
 #endif  // LL_MULTI_SLIDER_H
diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp
index a9f462173dd..87938c19d48 100644
--- a/indra/llui/llmultisliderctrl.cpp
+++ b/indra/llui/llmultisliderctrl.cpp
@@ -344,7 +344,7 @@ void LLMultiSliderCtrl::onEditorCommit( LLUICtrl* ctrl, const LLSD& userdata)
 		if( self->mMultiSlider->getMinValue() <= val && val <= self->mMultiSlider->getMaxValue() )
 		{
 			self->setCurSliderValue( val );  // set the value temporarily so that the callback can retrieve it.
-			if( self->mValidateSignal( self, val ) )
+			if( !self->mValidateSignal || (*(self->mValidateSignal))( self, val ) )
 			{
 				success = TRUE;
 			}
@@ -378,7 +378,7 @@ void LLMultiSliderCtrl::onSliderCommit(LLUICtrl* ctrl, const LLSD& userdata)
 	F32 new_val = self->mMultiSlider->getCurSliderValue();
 
 	self->mCurValue = new_val;  // set the value temporarily so that the callback can retrieve it.
-	if( self->mValidateSignal( self, new_val ) )
+	if( !self->mValidateSignal || (*(self->mValidateSignal))( self, new_val ) )
 	{
 		success = TRUE;
 	}
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 89c46562973..063822dd567 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -106,7 +106,8 @@ LLPanel::LLPanel(const LLPanel::Params& p)
 	mHelpTopic(p.help_topic),
 	mCommitCallbackRegistrar(false),
 	mEnableCallbackRegistrar(false),
-	mXMLFilename(p.filename)
+	mXMLFilename(p.filename),
+	mVisibleSignal(NULL)
 	// *NOTE: Be sure to also change LLPanel::initFromParams().  We have too
 	// many classes derived from LLPanel to retrofit them all to pass in params.
 {
@@ -118,6 +119,11 @@ LLPanel::LLPanel(const LLPanel::Params& p)
 	mPanelHandle.bind(this);
 }
 
+LLPanel::~LLPanel()
+{
+	delete mVisibleSignal;
+}
+
 // virtual
 BOOL LLPanel::isPanel() const
 {
@@ -332,7 +338,8 @@ BOOL LLPanel::handleKeyHere( KEY key, MASK mask )
 void LLPanel::handleVisibilityChange ( BOOL new_visibility )
 {
 	LLUICtrl::handleVisibilityChange ( new_visibility );
-	mVisibleSignal(this, LLSD(new_visibility) ); // Pass BOOL as LLSD
+	if (mVisibleSignal)
+		(*mVisibleSignal)(this, LLSD(new_visibility) ); // Pass BOOL as LLSD
 }
 
 void LLPanel::setFocus(BOOL b)
@@ -424,7 +431,9 @@ void LLPanel::initFromParams(const LLPanel::Params& p)
 	
 	// visible callback 
 	if (p.visible_callback.isProvided())
-		initCommitCallback(p.visible_callback, mVisibleSignal);
+	{
+		setVisibleCallback(initCommitCallback(p.visible_callback));
+	}
 	
 	for (LLInitParam::ParamIterator<LocalizedString>::const_iterator it = p.strings().begin();
 		it != p.strings().end();
@@ -907,3 +916,13 @@ void LLPanel::childSetControlName(const std::string& id, const std::string& cont
 		view->setControlName(control_name, NULL);
 	}
 }
+
+boost::signals2::connection LLPanel::setVisibleCallback( const commit_signal_t::slot_type& cb )
+{
+	if (!mVisibleSignal)
+	{
+		mVisibleSignal = new commit_signal_t();
+	}
+
+	return mVisibleSignal->connect(cb);
+}
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index c213809d685..0a0fed82fbd 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -109,7 +109,7 @@ class LLPanel : public LLUICtrl
 	
 public:
 // 	LLPanel(const std::string& name, const LLRect& rect = LLRect(), BOOL bordered = TRUE);
-	/*virtual*/ ~LLPanel() {}
+	/*virtual*/ ~LLPanel();
 
 	// LLView interface
 	/*virtual*/ BOOL 	isPanel() const;
@@ -241,6 +241,8 @@ class LLPanel : public LLUICtrl
 	void setXMLFilename(std::string filename) { mXMLFilename = filename; };
 	std::string getXMLFilename() { return mXMLFilename; };
 	
+	boost::signals2::connection setVisibleCallback( const commit_signal_t::slot_type& cb );
+
 protected:
 	// Override to set not found list
 	LLButton*		getDefaultButton() { return mDefaultBtn; }
@@ -249,7 +251,7 @@ class LLPanel : public LLUICtrl
 	EnableCallbackRegistry::ScopedRegistrar mEnableCallbackRegistrar;
 	VisibleCallbackRegistry::ScopedRegistrar mVisibleCallbackRegistrar;
 
-	commit_signal_t mVisibleSignal;		// Called when visibility changes, passes new visibility as LLSD()
+	commit_signal_t* mVisibleSignal;		// Called when visibility changes, passes new visibility as LLSD()
 
 	std::string		mHelpTopic;         // the name of this panel's help topic to display in the Help Viewer
 	
diff --git a/indra/llui/llslider.cpp b/indra/llui/llslider.cpp
index da2fc7c68b2..a6f729b396a 100644
--- a/indra/llui/llslider.cpp
+++ b/indra/llui/llslider.cpp
@@ -77,7 +77,9 @@ LLSlider::LLSlider(const LLSlider::Params& p)
 	mTrackImageHorizontal(p.track_image_horizontal),
 	mTrackImageVertical(p.track_image_vertical),
 	mTrackHighlightHorizontalImage(p.track_highlight_horizontal_image),
-	mTrackHighlightVerticalImage(p.track_highlight_vertical_image)
+	mTrackHighlightVerticalImage(p.track_highlight_vertical_image),
+	mMouseDownSignal(NULL),
+	mMouseUpSignal(NULL)
 {
     mViewModel->setValue(p.initial_value);
 	updateThumbRect();
@@ -86,9 +88,19 @@ LLSlider::LLSlider(const LLSlider::Params& p)
 	setValue(getValueF32());
 	
 	if (p.mouse_down_callback.isProvided())
-		initCommitCallback(p.mouse_down_callback, mMouseDownSignal);
+	{
+		setMouseDownCallback(initCommitCallback(p.mouse_down_callback));
+	}
 	if (p.mouse_up_callback.isProvided())
-		initCommitCallback(p.mouse_up_callback, mMouseUpSignal);
+	{
+		setMouseUpCallback(initCommitCallback(p.mouse_up_callback));
+	}
+}
+
+LLSlider::~LLSlider()
+{
+	delete mMouseDownSignal;
+	delete mMouseUpSignal;
 }
 
 void LLSlider::setValue(F32 value, BOOL from_event)
@@ -202,7 +214,8 @@ BOOL LLSlider::handleMouseUp(S32 x, S32 y, MASK mask)
 	{
 		gFocusMgr.setMouseCapture( NULL );
 
-		mMouseUpSignal( this, getValueF32() );
+		if (mMouseUpSignal)
+			(*mMouseUpSignal)( this, getValueF32() );
 
 		handled = TRUE;
 		make_ui_sound("UISndClickRelease");
@@ -222,7 +235,8 @@ BOOL LLSlider::handleMouseDown(S32 x, S32 y, MASK mask)
 	{
 		setFocus(TRUE);
 	}
-	mMouseDownSignal( this, getValueF32() );
+	if (mMouseDownSignal)
+		(*mMouseDownSignal)( this, getValueF32() );
 
 	if (MASK_CONTROL & mask) // if CTRL is modifying
 	{
@@ -364,3 +378,15 @@ void LLSlider::draw()
 	
 	LLUICtrl::draw();
 }
+
+boost::signals2::connection LLSlider::setMouseDownCallback( const commit_signal_t::slot_type& cb ) 
+{ 
+	if (!mMouseDownSignal) mMouseDownSignal = new commit_signal_t();
+	return mMouseDownSignal->connect(cb); 
+}
+
+boost::signals2::connection LLSlider::setMouseUpCallback(	const commit_signal_t::slot_type& cb )   
+{ 
+	if (!mMouseUpSignal) mMouseUpSignal = new commit_signal_t();
+	return mMouseUpSignal->connect(cb); 
+}
diff --git a/indra/llui/llslider.h b/indra/llui/llslider.h
index 6ab0ed79220..45f8f81e409 100644
--- a/indra/llui/llslider.h
+++ b/indra/llui/llslider.h
@@ -67,6 +67,7 @@ class LLSlider : public LLF32UICtrl
 	LLSlider(const Params&);
 	friend class LLUICtrlFactory;
 public:
+	virtual ~LLSlider();
 	void			setValue( F32 value, BOOL from_event = FALSE );
     // overrides for LLF32UICtrl methods
 	virtual void	setValue(const LLSD& value )	{ setValue((F32)value.asReal(), TRUE); }
@@ -76,8 +77,8 @@ class LLSlider : public LLF32UICtrl
 	virtual void	setMinValue(F32 min_value) { LLF32UICtrl::setMinValue(min_value); updateThumbRect(); }
 	virtual void	setMaxValue(F32 max_value) { LLF32UICtrl::setMaxValue(max_value); updateThumbRect(); }
 
-	boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb ) { return mMouseDownSignal.connect(cb); }
-	boost::signals2::connection setMouseUpCallback(	const commit_signal_t::slot_type& cb )   { return mMouseUpSignal.connect(cb); }
+	boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb );
+	boost::signals2::connection setMouseUpCallback(	const commit_signal_t::slot_type& cb );
 
 	virtual BOOL	handleHover(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleMouseUp(S32 x, S32 y, MASK mask);
@@ -109,8 +110,8 @@ class LLSlider : public LLF32UICtrl
 	LLUIColor	mThumbOutlineColor;
 	LLUIColor	mThumbCenterColor;
 	
-	commit_signal_t	mMouseDownSignal;
-	commit_signal_t	mMouseUpSignal;
+	commit_signal_t*	mMouseDownSignal;
+	commit_signal_t*	mMouseUpSignal;
 };
 
 #endif  // LL_LLSLIDER_H
diff --git a/indra/llui/llsliderctrl.cpp b/indra/llui/llsliderctrl.cpp
index ed22c0a47f8..a4f89ae1d38 100644
--- a/indra/llui/llsliderctrl.cpp
+++ b/indra/llui/llsliderctrl.cpp
@@ -260,7 +260,7 @@ void LLSliderCtrl::onEditorCommit( LLUICtrl* ctrl, const LLSD& userdata )
 		if( self->mSlider->getMinValue() <= val && val <= self->mSlider->getMaxValue() )
 		{
 			self->setValue( val );  // set the value temporarily so that the callback can retrieve it.
-			if( self->mValidateSignal( self, val ) )
+			if( !self->mValidateSignal || (*(self->mValidateSignal))( self, val ) )
 			{
 				success = TRUE;
 			}
@@ -294,7 +294,7 @@ void LLSliderCtrl::onSliderCommit( LLUICtrl* ctrl, const LLSD& userdata )
 	F32 new_val = self->mSlider->getValueF32();
 
 	self->mValue = new_val;  // set the value temporarily so that the callback can retrieve it.
-	if( self->mValidateSignal( self, new_val ) )
+	if( !self->mValidateSignal || (*(self->mValidateSignal))( self, new_val ) )
 	{
 		success = TRUE;
 	}
diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp
index bedf16a397d..d6d46654d57 100644
--- a/indra/llui/llspinctrl.cpp
+++ b/indra/llui/llspinctrl.cpp
@@ -190,7 +190,7 @@ void LLSpinCtrl::onUpBtn( const LLSD& data )
 		
 			F32 saved_val = (F32)getValue().asReal();
 			setValue(val);
-			if( !mValidateSignal( this, val ) )
+			if( mValidateSignal && !(*mValidateSignal)( this, val ) )
 			{
 				setValue( saved_val );
 				reportInvalidData();
@@ -224,7 +224,7 @@ void LLSpinCtrl::onDownBtn( const LLSD& data )
 			
 			F32 saved_val = (F32)getValue().asReal();
 			setValue(val);
-			if( !mValidateSignal( this, val ) )
+			if( mValidateSignal && !(*mValidateSignal)( this, val ) )
 			{
 				setValue( saved_val );
 				reportInvalidData();
@@ -316,7 +316,7 @@ void LLSpinCtrl::onEditorCommit( const LLSD& data )
 
 		F32 saved_val = getValueF32();
 		setValue(val);
-		if( mValidateSignal( this, val ) )
+		if( !mValidateSignal || (*mValidateSignal)( this, val ) )
 		{
 			success = TRUE;
 			onCommit();
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index f5d81748206..d7d61cf6cb1 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -1339,12 +1339,12 @@ BOOL LLTabContainer::selectTab(S32 which)
 		cbdata = selected_tuple->mTabPanel->getName();
 
 	BOOL res = FALSE;
-	if( mValidateSignal( this, cbdata ) )
+	if( !mValidateSignal || (*mValidateSignal)( this, cbdata ) )
 	{
 		res = setTab(which);
-		if (res)
+		if (res && mCommitSignal)
 		{
-			mCommitSignal(this, cbdata);
+			(*mCommitSignal)(this, cbdata);
 		}
 	}
 	
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index 08fc8fb7849..a30d5b4651d 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -78,7 +78,16 @@ LLUICtrl::LLUICtrl(const LLUICtrl::Params& p, const LLViewModelPtr& viewmodel)
 	mEnabledControlVariable(NULL),
 	mDisabledControlVariable(NULL),
 	mMakeVisibleControlVariable(NULL),
-	mMakeInvisibleControlVariable(NULL)
+	mMakeInvisibleControlVariable(NULL),
+	mCommitSignal(NULL),
+	mValidateSignal(NULL),
+	mMouseEnterSignal(NULL),
+	mMouseLeaveSignal(NULL),
+	mMouseDownSignal(NULL),
+	mMouseUpSignal(NULL),
+	mRightMouseDownSignal(NULL),
+	mRightMouseUpSignal(NULL),
+	mDoubleClickSignal(NULL)
 {
 	mUICtrlHandle.bind(this);
 }
@@ -129,10 +138,14 @@ void LLUICtrl::initFromParams(const Params& p)
 	}
 	
 	if (p.commit_callback.isProvided())
-		initCommitCallback(p.commit_callback, mCommitSignal);
+	{
+		setCommitCallback(initCommitCallback(p.commit_callback));
+	}
 	
 	if (p.validate_callback.isProvided())
-		initEnableCallback(p.validate_callback, mValidateSignal);
+	{
+		setValidateCallback(initEnableCallback(p.validate_callback));
+	}
 	
 	if (p.init_callback.isProvided())
 	{
@@ -151,10 +164,14 @@ void LLUICtrl::initFromParams(const Params& p)
 	}
 
 	if(p.mouseenter_callback.isProvided())
-		initCommitCallback(p.mouseenter_callback, mMouseEnterSignal);
+	{
+		setMouseEnterCallback(initCommitCallback(p.mouseenter_callback));
+	}
 
 	if(p.mouseleave_callback.isProvided())
-		initCommitCallback(p.mouseleave_callback, mMouseLeaveSignal);
+	{
+		setMouseLeaveCallback(initCommitCallback(p.mouseleave_callback));
+	}
 }
 
 
@@ -167,16 +184,40 @@ LLUICtrl::~LLUICtrl()
 		llwarns << "UI Control holding top ctrl deleted: " << getName() << ".  Top view removed." << llendl;
 		gFocusMgr.removeTopCtrlWithoutCallback( this );
 	}
+
+	delete mCommitSignal;
+	delete mValidateSignal;
+	delete mMouseEnterSignal;
+	delete mMouseLeaveSignal;
+	delete mMouseDownSignal;
+	delete mMouseUpSignal;
+	delete mRightMouseDownSignal;
+	delete mRightMouseUpSignal;
+	delete mDoubleClickSignal;
 }
 
-void LLUICtrl::initCommitCallback(const CommitCallbackParam& cb, commit_signal_t& sig)
+void default_commit_handler(LLUICtrl* ctrl, const LLSD& param)
+{}
+
+bool default_enable_handler(LLUICtrl* ctrl, const LLSD& param)
+{
+	return true;
+}
+
+bool default_visible_handler(LLUICtrl* ctrl, const LLSD& param)
+{
+	return true;
+}
+
+
+LLUICtrl::commit_signal_t::slot_type LLUICtrl::initCommitCallback(const CommitCallbackParam& cb)
 {
 	if (cb.function.isProvided())
 	{
 		if (cb.parameter.isProvided())
-			sig.connect(boost::bind(cb.function(), _1, cb.parameter));
+			return boost::bind(cb.function(), _1, cb.parameter);
 		else
-			sig.connect(cb.function());
+			return cb.function();
 	}
 	else
 	{
@@ -185,26 +226,27 @@ void LLUICtrl::initCommitCallback(const CommitCallbackParam& cb, commit_signal_t
 		if (func)
 		{
 			if (cb.parameter.isProvided())
-				sig.connect(boost::bind((*func), _1, cb.parameter));
+				return boost::bind((*func), _1, cb.parameter);
 			else
-				sig.connect(*func);
+				return commit_signal_t::slot_type(*func);
 		}
 		else if (!function_name.empty())
 		{
 			llwarns << "No callback found for: '" << function_name << "' in control: " << getName() << llendl;
 		}			
 	}
+	return default_commit_handler;
 }
 
-void LLUICtrl::initEnableCallback(const EnableCallbackParam& cb, enable_signal_t& sig)
+LLUICtrl::enable_signal_t::slot_type LLUICtrl::initEnableCallback(const EnableCallbackParam& cb)
 {
 	// Set the callback function
 	if (cb.function.isProvided())
 	{
 		if (cb.parameter.isProvided())
-			sig.connect(boost::bind(cb.function(), this, cb.parameter));
+			return boost::bind(cb.function(), this, cb.parameter);
 		else
-			sig.connect(cb.function());
+			return cb.function();
 	}
 	else
 	{
@@ -212,22 +254,23 @@ void LLUICtrl::initEnableCallback(const EnableCallbackParam& cb, enable_signal_t
 		if (func)
 		{
 			if (cb.parameter.isProvided())
-				sig.connect(boost::bind((*func), this, cb.parameter));
+				return boost::bind((*func), this, cb.parameter);
 			else
-				sig.connect(*func);
+				return enable_signal_t::slot_type(*func);
 		}
 	}
+	return default_enable_handler;
 }
 
-void LLUICtrl::initVisibleCallback(const VisibleCallbackParam& cb, visible_signal_t& sig)
+LLUICtrl::visible_signal_t::slot_type LLUICtrl::initVisibleCallback(const VisibleCallbackParam& cb)
 {
 	// Set the callback function
 	if (cb.function.isProvided())
 	{
 		if (cb.parameter.isProvided())
-			sig.connect(boost::bind(cb.function(), this, cb.parameter));
+			return boost::bind(cb.function(), this, cb.parameter);
 		else
-			sig.connect(cb.function());
+			return cb.function();
 	}
 	else
 	{
@@ -235,30 +278,40 @@ void LLUICtrl::initVisibleCallback(const VisibleCallbackParam& cb, visible_signa
 		if (func)
 		{
 			if (cb.parameter.isProvided())
-				sig.connect(boost::bind((*func), this, cb.parameter));
+				return boost::bind((*func), this, cb.parameter);
 			else
-				sig.connect(*func);
+				return visible_signal_t::slot_type(*func);
 		}
 	}
+	return default_visible_handler;
 }
 
 // virtual
 void LLUICtrl::onMouseEnter(S32 x, S32 y, MASK mask)
 {
-	mMouseEnterSignal(this, getValue());
+	if (mMouseEnterSignal)
+	{
+		(*mMouseEnterSignal)(this, getValue());
+	}
 }
 
 // virtual
 void LLUICtrl::onMouseLeave(S32 x, S32 y, MASK mask)
 {
-	mMouseLeaveSignal(this, getValue());
+	if(mMouseLeaveSignal)
+	{
+		(*mMouseLeaveSignal)(this, getValue());
+	}
 }
 
 //virtual 
 BOOL LLUICtrl::handleMouseDown(S32 x, S32 y, MASK mask)
 {
 	BOOL handled  = LLView::handleMouseDown(x,y,mask);
-	mMouseDownSignal(this,x,y,mask);
+	if (mMouseDownSignal)
+	{
+		(*mMouseDownSignal)(this,x,y,mask);
+	}
 	return handled;
 }
 
@@ -266,7 +319,10 @@ BOOL LLUICtrl::handleMouseDown(S32 x, S32 y, MASK mask)
 BOOL LLUICtrl::handleMouseUp(S32 x, S32 y, MASK mask)
 {
 	BOOL handled  = LLView::handleMouseUp(x,y,mask);
-	mMouseUpSignal(this,x,y,mask);
+	if (mMouseUpSignal)
+	{
+		(*mMouseUpSignal)(this,x,y,mask);
+	}
 	return handled;
 }
 
@@ -274,7 +330,10 @@ BOOL LLUICtrl::handleMouseUp(S32 x, S32 y, MASK mask)
 BOOL LLUICtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
 {
 	BOOL handled  = LLView::handleRightMouseDown(x,y,mask);
-	mRightMouseDownSignal(this,x,y,mask);
+	if (mRightMouseDownSignal)
+	{
+		(*mRightMouseDownSignal)(this,x,y,mask);
+	}
 	return handled;
 }
 
@@ -282,14 +341,20 @@ BOOL LLUICtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
 BOOL LLUICtrl::handleRightMouseUp(S32 x, S32 y, MASK mask)
 {
 	BOOL handled  = LLView::handleRightMouseUp(x,y,mask);
-	mRightMouseUpSignal(this,x,y,mask);
+	if(mRightMouseUpSignal)
+	{
+		(*mRightMouseUpSignal)(this,x,y,mask);
+	}
 	return handled;
 }
 
 BOOL LLUICtrl::handleDoubleClick(S32 x, S32 y, MASK mask)
 {
 	BOOL handled = LLView::handleDoubleClick(x, y, mask);
-	mDoubleClickSignal(this, x, y, mask);
+	if (mDoubleClickSignal)
+	{
+		(*mDoubleClickSignal)(this, x, y, mask);
+	}
 	return handled;
 }
 
@@ -302,7 +367,8 @@ BOOL LLUICtrl::canFocusChildren() const
 
 void LLUICtrl::onCommit()
 {
-	mCommitSignal(this, getValue());
+	if (mCommitSignal)
+	(*mCommitSignal)(this, getValue());
 }
 
 //virtual
@@ -832,7 +898,8 @@ boost::signals2::connection LLUICtrl::setCommitCallback( boost::function<void (L
 }
 boost::signals2::connection LLUICtrl::setValidateBeforeCommit( boost::function<bool (const LLSD& data)> cb )
 {
-	return mValidateSignal.connect(boost::bind(cb, _2));
+	if (!mValidateSignal) mValidateSignal = new enable_signal_t();
+	return mValidateSignal->connect(boost::bind(cb, _2));
 }
 
 // virtual
@@ -850,3 +917,57 @@ BOOL LLUICtrl::getTentative() const
 // virtual
 void LLUICtrl::setColor(const LLColor4& color)							
 { }
+
+boost::signals2::connection LLUICtrl::setCommitCallback( const commit_signal_t::slot_type& cb ) 
+{ 
+	if (!mCommitSignal) mCommitSignal = new commit_signal_t();
+	return mCommitSignal->connect(cb); 
+}
+
+boost::signals2::connection LLUICtrl::setValidateCallback( const enable_signal_t::slot_type& cb ) 
+{ 
+	if (!mValidateSignal) mValidateSignal = new enable_signal_t();
+	return mValidateSignal->connect(cb); 
+}
+
+boost::signals2::connection LLUICtrl::setMouseEnterCallback( const commit_signal_t::slot_type& cb ) 
+{ 
+	if (!mMouseEnterSignal) mMouseEnterSignal = new commit_signal_t();
+	return mMouseEnterSignal->connect(cb); 
+}
+
+boost::signals2::connection LLUICtrl::setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) 
+{ 
+	if (!mMouseLeaveSignal) mMouseLeaveSignal = new commit_signal_t();
+	return mMouseLeaveSignal->connect(cb); 
+}
+
+boost::signals2::connection LLUICtrl::setMouseDownCallback( const mouse_signal_t::slot_type& cb ) 
+{ 
+	if (!mMouseDownSignal) mMouseDownSignal = new mouse_signal_t();
+	return mMouseDownSignal->connect(cb); 
+}
+
+boost::signals2::connection LLUICtrl::setMouseUpCallback( const mouse_signal_t::slot_type& cb ) 
+{ 
+	if (!mMouseUpSignal) mMouseUpSignal = new mouse_signal_t();
+	return mMouseUpSignal->connect(cb); 
+}
+
+boost::signals2::connection LLUICtrl::setRightMouseDownCallback( const mouse_signal_t::slot_type& cb ) 
+{ 
+	if (!mRightMouseDownSignal) mRightMouseDownSignal = new mouse_signal_t();
+	return mRightMouseDownSignal->connect(cb); 
+}
+
+boost::signals2::connection LLUICtrl::setRightMouseUpCallback( const mouse_signal_t::slot_type& cb ) 
+{ 
+	if (!mRightMouseUpSignal) mRightMouseUpSignal = new mouse_signal_t();
+	return mRightMouseUpSignal->connect(cb); 
+}
+
+boost::signals2::connection LLUICtrl::setDoubleClickCallback( const mouse_signal_t::slot_type& cb ) 
+{ 
+	if (!mDoubleClickSignal) mDoubleClickSignal = new mouse_signal_t();
+	return mDoubleClickSignal->connect(cb); 
+}
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index dd22851100b..aef1bcd5194 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -162,9 +162,9 @@ class LLUICtrl
 	LLUICtrl(const Params& p = getDefaultParams(),
              const LLViewModelPtr& viewmodel=LLViewModelPtr(new LLViewModel));
 	
-	void initCommitCallback(const CommitCallbackParam& cb, commit_signal_t& sig);
-	void initEnableCallback(const EnableCallbackParam& cb, enable_signal_t& sig);
-	void initVisibleCallback(const VisibleCallbackParam& cb, visible_signal_t& sig);
+	commit_signal_t::slot_type initCommitCallback(const CommitCallbackParam& cb);
+	enable_signal_t::slot_type initEnableCallback(const EnableCallbackParam& cb);
+	visible_signal_t::slot_type initVisibleCallback(const VisibleCallbackParam& cb);
 
 	// We need this virtual so we can override it with derived versions
 	virtual LLViewModel* getViewModel() const;
@@ -254,18 +254,18 @@ class LLUICtrl
 	// topic then put in help_topic_out
 	bool                    findHelpTopic(std::string& help_topic_out);
 
-	boost::signals2::connection setCommitCallback( const commit_signal_t::slot_type& cb ) { return mCommitSignal.connect(cb); }
-	boost::signals2::connection setValidateCallback( const enable_signal_t::slot_type& cb ) { return mValidateSignal.connect(cb); }
+	boost::signals2::connection setCommitCallback( const commit_signal_t::slot_type& cb );
+	boost::signals2::connection setValidateCallback( const enable_signal_t::slot_type& cb );
 
-	boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb ) { return mMouseEnterSignal.connect(cb); }
-	boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) { return mMouseLeaveSignal.connect(cb); }
+	boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb );
+	boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb );
 	
-	boost::signals2::connection setMouseDownCallback( const mouse_signal_t::slot_type& cb ) { return mMouseDownSignal.connect(cb); }
-	boost::signals2::connection setMouseUpCallback( const mouse_signal_t::slot_type& cb ) { return mMouseUpSignal.connect(cb); }
-	boost::signals2::connection setRightMouseDownCallback( const mouse_signal_t::slot_type& cb ) { return mRightMouseDownSignal.connect(cb); }
-	boost::signals2::connection setRightMouseUpCallback( const mouse_signal_t::slot_type& cb ) { return mRightMouseUpSignal.connect(cb); }
+	boost::signals2::connection setMouseDownCallback( const mouse_signal_t::slot_type& cb );
+	boost::signals2::connection setMouseUpCallback( const mouse_signal_t::slot_type& cb );
+	boost::signals2::connection setRightMouseDownCallback( const mouse_signal_t::slot_type& cb );
+	boost::signals2::connection setRightMouseUpCallback( const mouse_signal_t::slot_type& cb );
 	
-	boost::signals2::connection setDoubleClickCallback( const mouse_signal_t::slot_type& cb ) { return mDoubleClickSignal.connect(cb); }
+	boost::signals2::connection setDoubleClickCallback( const mouse_signal_t::slot_type& cb );
 
 	// *TODO: Deprecate; for backwards compatability only:
 	boost::signals2::connection setCommitCallback( boost::function<void (LLUICtrl*,void*)> cb, void* data);	
@@ -293,18 +293,18 @@ class LLUICtrl
 
 	static bool controlListener(const LLSD& newvalue, LLHandle<LLUICtrl> handle, std::string type);
 
-	commit_signal_t		mCommitSignal;
-	enable_signal_t		mValidateSignal;
+	commit_signal_t*		mCommitSignal;
+	enable_signal_t*		mValidateSignal;
 
-	commit_signal_t		mMouseEnterSignal;
-	commit_signal_t		mMouseLeaveSignal;
+	commit_signal_t*		mMouseEnterSignal;
+	commit_signal_t*		mMouseLeaveSignal;
 	
-	mouse_signal_t		mMouseDownSignal;
-	mouse_signal_t		mMouseUpSignal;
-	mouse_signal_t		mRightMouseDownSignal;
-	mouse_signal_t		mRightMouseUpSignal;
+	mouse_signal_t*		mMouseDownSignal;
+	mouse_signal_t*		mMouseUpSignal;
+	mouse_signal_t*		mRightMouseDownSignal;
+	mouse_signal_t*		mRightMouseUpSignal;
 
-	mouse_signal_t		mDoubleClickSignal;
+	mouse_signal_t*		mDoubleClickSignal;
 	
     LLViewModelPtr  mViewModel;
 
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 9845664c749..5fd4dcd3430 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -163,7 +163,7 @@ LLChiclet::~LLChiclet()
 boost::signals2::connection LLChiclet::setLeftButtonClickCallback(
 	const commit_callback_t& cb)
 {
-	return mCommitSignal.connect(cb);
+	return setCommitCallback(cb);
 }
 
 BOOL LLChiclet::handleMouseDown(S32 x, S32 y, MASK mask)
@@ -972,7 +972,10 @@ void LLChicletPanel::onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param)
 
 void LLChicletPanel::onChicletClick(LLUICtrl*ctrl,const LLSD&param)
 {
-	mCommitSignal(ctrl,param);
+	if (mCommitSignal)
+	{
+		(*mCommitSignal)(ctrl,param);
+	}
 }
 
 void LLChicletPanel::removeChiclet(chiclet_list_t::iterator it)
@@ -1277,7 +1280,7 @@ void LLChicletPanel::onRightScrollHeldDown()
 boost::signals2::connection LLChicletPanel::setChicletClickedCallback(
 	const commit_callback_t& cb)
 {
-	return mCommitSignal.connect(cb);
+	return setCommitCallback(cb);
 }
 
 BOOL LLChicletPanel::handleScrollWheel(S32 x, S32 y, S32 clicks)
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index ae5be8cc7c9..8406ddeeca0 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -232,13 +232,15 @@ class LLFavoriteLandmarkMenuItem : public LLMenuItemCallGL
 
 	virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask)
 	{
-		mMouseDownSignal(this, x, y, mask);
+		if (mMouseDownSignal)
+			(*mMouseDownSignal)(this, x, y, mask);
 		return LLMenuItemCallGL::handleMouseDown(x, y, mask);
 	}
 
 	virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask)
 	{
-		mMouseUpSignal(this, x, y, mask);
+		if (mMouseUpSignal)
+			(*mMouseUpSignal)(this, x, y, mask);
 		return LLMenuItemCallGL::handleMouseUp(x, y, mask);
 	}
 
diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp
index 467796b4a39..976aaf80447 100644
--- a/indra/newview/llfloaterbuyland.cpp
+++ b/indra/newview/llfloaterbuyland.cpp
@@ -903,7 +903,7 @@ void LLFloaterBuyLandUI::tellUserError(
 // virtual
 BOOL LLFloaterBuyLandUI::postBuild()
 {
-	mVisibleSignal.connect(boost::bind(&LLFloaterBuyLandUI::onVisibilityChange, this, _2));
+	setVisibleCallback(boost::bind(&LLFloaterBuyLandUI::onVisibilityChange, this, _2));
 	
 	mCurrency.prepare();
 	
diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp
index 58025ef78be..57bb93d81af 100644
--- a/indra/newview/llfloaterchat.cpp
+++ b/indra/newview/llfloaterchat.cpp
@@ -129,7 +129,7 @@ void LLFloaterChat::draw()
 BOOL LLFloaterChat::postBuild()
 {
 	// Hide the chat overlay when our history is visible.
-	mVisibleSignal.connect(boost::bind(&LLFloaterChat::updateConsoleVisibility, this));
+	setVisibleCallback(boost::bind(&LLFloaterChat::updateConsoleVisibility, this));
 	
 	mPanel = (LLPanelActiveSpeakers*)getChild<LLPanel>("active_speakers_panel");
 
diff --git a/indra/newview/llfloaterchatterbox.cpp b/indra/newview/llfloaterchatterbox.cpp
index fbf09207fea..1b14ca573ab 100644
--- a/indra/newview/llfloaterchatterbox.cpp
+++ b/indra/newview/llfloaterchatterbox.cpp
@@ -114,7 +114,7 @@ LLFloaterChatterBox::~LLFloaterChatterBox()
 
 BOOL LLFloaterChatterBox::postBuild()
 {
-	mVisibleSignal.connect(boost::bind(&LLFloaterChatterBox::onVisibilityChange, this, _2));
+	setVisibleCallback(boost::bind(&LLFloaterChatterBox::onVisibilityChange, this, _2));
 	
 	if (gSavedSettings.getBOOL("ContactsTornOff"))
 	{
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 22d6098d5bc..d855ab1dfa7 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -239,7 +239,7 @@ LLFloaterLand::LLFloaterLand(const LLSD& seed)
 
 BOOL LLFloaterLand::postBuild()
 {	
-	mVisibleSignal.connect(boost::bind(&LLFloaterLand::onVisibilityChange, this, _2));
+	setVisibleCallback(boost::bind(&LLFloaterLand::onVisibilityChange, this, _2));
 	
 	LLTabContainer* tab = getChild<LLTabContainer>("landtab");
 
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index 87b801d73b6..e6ded5f371b 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -216,7 +216,7 @@ LLFloaterIMPanel::~LLFloaterIMPanel()
 
 BOOL LLFloaterIMPanel::postBuild() 
 {
-	mVisibleSignal.connect(boost::bind(&LLFloaterIMPanel::onVisibilityChange, this, _2));
+	setVisibleCallback(boost::bind(&LLFloaterIMPanel::onVisibilityChange, this, _2));
 	
 	mInputEditor = getChild<LLLineEditor>("chat_editor");
 	mInputEditor->setFocusReceivedCallback( boost::bind(onInputEditorFocusReceived, _1, this) );
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index 5cd40273f61..2376a3581db 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -356,7 +356,7 @@ void LLMediaCtrl::onFocusLost()
 //
 BOOL LLMediaCtrl::postBuild ()
 {
-	mVisibleSignal.connect(boost::bind(&LLMediaCtrl::onVisibilityChange, this, _2));
+	setVisibleCallback(boost::bind(&LLMediaCtrl::onVisibilityChange, this, _2));
 	return TRUE;
 }
 
diff --git a/indra/newview/llpanelavatartag.cpp b/indra/newview/llpanelavatartag.cpp
index 03ad19f9118..7563cc7f61c 100644
--- a/indra/newview/llpanelavatartag.cpp
+++ b/indra/newview/llpanelavatartag.cpp
@@ -92,7 +92,7 @@ void LLPanelAvatarTag::setAvatarId(const LLUUID& avatar_id)
 boost::signals2::connection LLPanelAvatarTag::setLeftButtonClickCallback(
 																  const commit_callback_t& cb)
 {
-	return mCommitSignal.connect(cb);
+	return setCommitCallback(cb);
 }
 
 BOOL LLPanelAvatarTag::handleMouseDown(S32 x, S32 y, MASK mask)
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 4dc88725573..03421ce4f0b 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -483,7 +483,7 @@ void LLPanelPeople::onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAva
 
 BOOL LLPanelPeople::postBuild()
 {
-	mVisibleSignal.connect(boost::bind(&LLPanelPeople::onVisibilityChange, this, _2));
+	setVisibleCallback(boost::bind(&LLPanelPeople::onVisibilityChange, this, _2));
 	
 	mFilterEditor = getChild<LLFilterEditor>("filter_input");
 	mFilterEditor->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index 49a2a3723d2..3d2c529dda6 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -355,7 +355,7 @@ LLPreviewGesture::~LLPreviewGesture()
 
 BOOL LLPreviewGesture::postBuild()
 {
-	mVisibleSignal.connect(boost::bind(&LLPreviewGesture::onVisibilityChange, this, _2));
+	setVisibleCallback(boost::bind(&LLPreviewGesture::onVisibilityChange, this, _2));
 	
 	LLLineEditor* edit;
 	LLComboBox* combo;
-- 
GitLab


From dc88effc24e533bd96c5e88de07720b347689f14 Mon Sep 17 00:00:00 2001
From: richard <none@none>
Date: Mon, 23 Nov 2009 11:44:03 -0800
Subject: [PATCH 515/557] fix for infinite loop when doing /me emotes reviewed
 by Mark

---
 indra/llui/lltextbase.cpp | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index e210667764b..3619b36c0d8 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -60,6 +60,11 @@ LLTextBase::line_info::line_info(S32 index_start, S32 index_end, LLRect rect, S3
 
 bool LLTextBase::compare_segment_end::operator()(const LLTextSegmentPtr& a, const LLTextSegmentPtr& b) const
 {
+	// sort empty spans (e.g. 11-11) after previous non-empty spans (e.g. 5-11)
+	if (a->getEnd() == b->getEnd())
+	{
+		return a->getStart() < b->getStart();
+	}
 	return a->getEnd() < b->getEnd();
 }
 
-- 
GitLab


From d4dc4cfddcc3faf17df992fd0ffae9ea18adf19f Mon Sep 17 00:00:00 2001
From: richard <none@none>
Date: Mon, 23 Nov 2009 11:46:35 -0800
Subject: [PATCH 516/557] EXT-2460 - mouselook mode - remove unused UI elements
 EXT-2504 - black bars present at top and bottom when in mouselook

reviewed by Leyla
---
 .hgignore                                     |   5 +
 indra/llrender/llrendertarget.cpp             |  26 -----
 indra/newview/llagent.cpp                     |   6 +-
 indra/newview/llmoveview.cpp                  |   3 +-
 indra/newview/llnavigationbar.cpp             |  10 ++
 indra/newview/llnavigationbar.h               |   1 +
 indra/newview/llsidetray.cpp                  |   3 +-
 indra/newview/llsidetray.h                    |   8 +-
 indra/newview/llviewerwindow.cpp              |   3 +-
 indra/newview/pipeline.cpp                    | 101 ++++++++++++++----
 indra/newview/pipeline.h                      |   5 +
 .../skins/default/xui/en/main_view.xml        |  32 +++---
 12 files changed, 131 insertions(+), 72 deletions(-)

diff --git a/.hgignore b/.hgignore
index 4d98acf5d97..0f1dd28bcf0 100644
--- a/.hgignore
+++ b/.hgignore
@@ -53,3 +53,8 @@ glob:*.cpp.orig
 glob:*.cpp.bak
 glob:*.h.bak
 glob:*.h.orig
+glob:indra/newview/typed_locations.txt
+glob:indra/newview/teleport_history.txt
+glob:indra/newview/search_history.txt
+glob:indra/newview/filters.xml
+glob:indra/newview/avatar_icons_cache.txt
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index f0df3bcf90c..bab5cfd56ed 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -89,19 +89,6 @@ void LLRenderTarget::setSampleBuffer(LLMultisampleBuffer* buffer)
 
 void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, BOOL stencil, LLTexUnit::eTextureType usage, BOOL use_fbo)
 {
-	// only reallocate if something changed
-	if (mResX == resx
-		&& mResY == resy
-		&& mUseDepth == depth
-		&& mStencil == stencil
-		&& mUsage == usage
-		&& (mFBO != 0) == ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject)
-		&& mColorFmt == color_fmt)
-	{
-		// nothing to do
-		return;
-	}
-		
 	stop_glerror();
 	mResX = resx;
 	mResY = resy;
@@ -620,19 +607,6 @@ void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth
 
 void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, BOOL stencil,  LLTexUnit::eTextureType usage, BOOL use_fbo, U32 samples )
 {
-	if (mResX == resx
-		&& mResY == resy
-		&& mUseDepth == depth
-		&& mStencil == stencil
-		&& mUsage == usage
-		&& (mFBO != 0) == ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject)
-		&& mColorFmt == color_fmt
-		&& mSamples == samples)
-	{
-		// nothing to do
-		return;
-	}
-
 	stop_glerror();
 	mResX = resx;
 	mResY = resy;
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 4dd569e2fab..eb5d172ff7d 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -2795,7 +2795,8 @@ void LLAgent::endAnimationUpdateUI()
 
 		LLBottomTray::getInstance()->setVisible(TRUE);
 
-		LLSideTray::getInstance()->setVisible(TRUE);
+		LLSideTray::getInstance()->getButtonsPanel()->setVisible(TRUE);
+		LLSideTray::getInstance()->updateSidetrayVisibility();
 
 		LLPanelStandStopFlying::getInstance()->setVisible(TRUE);
 
@@ -2893,7 +2894,8 @@ void LLAgent::endAnimationUpdateUI()
 
 		LLBottomTray::getInstance()->setVisible(FALSE);
 
-		LLSideTray::getInstance()->setVisible(FALSE);
+		LLSideTray::getInstance()->getButtonsPanel()->setVisible(FALSE);
+		LLSideTray::getInstance()->updateSidetrayVisibility();
 
 		LLPanelStandStopFlying::getInstance()->setVisible(FALSE);
 
diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp
index 93db3370531..9e46a4422a6 100644
--- a/indra/newview/llmoveview.cpp
+++ b/indra/newview/llmoveview.cpp
@@ -586,7 +586,8 @@ void LLPanelStandStopFlying::setVisible(BOOL visible)
 		updatePosition();
 	}
 
-	LLPanel::setVisible(visible);
+	//change visibility of parent layout_panel to animate in/out
+	if (getParent()) getParent()->setVisible(visible);
 }
 
 BOOL LLPanelStandStopFlying::handleToolTip(S32 x, S32 y, MASK mask)
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 114d26af8aa..c1bd4dd5800 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -230,6 +230,16 @@ BOOL LLNavigationBar::postBuild()
 	return TRUE;
 }
 
+void LLNavigationBar::setVisible(BOOL visible)
+{
+	// change visibility of grandparent layout_panel to animate in and out
+	if (getParent() && getParent()->getParent()) 
+	{
+		getParent()->getParent()->setVisible(visible);	
+	}
+}
+
+
 void LLNavigationBar::fillSearchComboBox()
 {
 	if(!mSearchComboBox)
diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h
index 52f5a827e4b..6f5175d1ae3 100644
--- a/indra/newview/llnavigationbar.h
+++ b/indra/newview/llnavigationbar.h
@@ -56,6 +56,7 @@ class LLNavigationBar
 	/*virtual*/ void	draw();
 	/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
 	/*virtual*/ BOOL	postBuild();
+	/*virtual*/ void	setVisible(BOOL visible);
 
 	void handleLoginComplete();
 	void clearHistoryCache();
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 7711f3c7330..2f98435b831 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -34,6 +34,7 @@
 
 #include "lltextbox.h"
 
+#include "llagent.h"
 #include "llbottomtray.h"
 #include "llsidetray.h"
 #include "llviewerwindow.h"
@@ -700,7 +701,7 @@ void	LLSideTray::updateSidetrayVisibility()
 	// set visibility of parent container based on collapsed state
 	if (getParent())
 	{
-		getParent()->setVisible(!mCollapsed);
+		getParent()->setVisible(!mCollapsed && !gAgent.cameraMouselook());
 	}
 }
 
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index 54652c11085..73215746819 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -120,7 +120,7 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>
 
 	void		setVisible(BOOL visible)
 	{
-		LLPanel::setVisible(visible);
+		if (getParent()) getParent()->setVisible(visible);
 	}
 
 	LLPanel*	getButtonsPanel() { return mButtonsPanel; }
@@ -141,6 +141,7 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>
 
 	void		processTriState ();
 	
+	void		updateSidetrayVisibility();
 
 protected:
 	LLSideTrayTab* getTab		(const std::string& name);
@@ -153,10 +154,6 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>
 
 	void		toggleTabButton	(LLSideTrayTab* tab);
 
-	void		updateSidetrayVisibility();
-
-	
-
 private:
 	// Implementation of LLDestroyClass<LLSideTray>
 	static void destroyClass()
@@ -166,7 +163,6 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>
 			LLSideTray::getInstance()->setEnabled(FALSE);
 	}
 	
-
 private:
 
 	LLPanel*						mButtonsPanel;
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index db66faef813..29d40d073ce 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1573,7 +1573,8 @@ void LLViewerWindow::initWorldUI()
 	LLPanel* side_tray_container = getRootView()->getChild<LLPanel>("side_tray_container");
 	LLSideTray* sidetrayp = LLSideTray::getInstance();
 	sidetrayp->setShape(side_tray_container->getLocalRect());
-	sidetrayp->setFollowsAll();
+	// don't follow right edge to avoid spurious resizes, since we are using a fixed width layout
+	sidetrayp->setFollows(FOLLOWS_LEFT|FOLLOWS_TOP|FOLLOWS_BOTTOM);
 	side_tray_container->addChild(sidetrayp);
 	side_tray_container->setVisible(FALSE);
 	
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 507c726e02d..5aad87630d5 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -344,7 +344,12 @@ LLPipeline::LLPipeline() :
 	mWLSkyPool(NULL),
 	mLightMask(0),
 	mLightMovingMask(0),
-	mLightingDetail(0)
+	mLightingDetail(0),
+	mScreenWidth(0),
+	mScreenHeight(0),
+	mViewportWidth(0),
+	mViewportHeight(0)
+
 {
 	mNoiseMap = 0;
 	mTrueNoiseMap = 0;
@@ -518,13 +523,29 @@ void LLPipeline::resizeScreenTexture()
 		GLuint view_height = gViewerWindow->getWorldViewHeightRaw();
 	
 		allocateScreenBuffer(resX, resY, view_width, view_height);
-
-		llinfos << "RESIZED SCREEN TEXTURE: " << resX << "x" << resY << llendl;
 	}
 }
 
 void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 viewport_width, U32 viewport_height)
 {
+	bool screen_size_changed = resX != mScreenWidth || resY != mScreenHeight;
+	bool viewport_size_changed = viewport_width != mViewportWidth || viewport_height != mViewportHeight;
+
+	if (!screen_size_changed
+		&& !viewport_size_changed)
+	{
+		// nothing to do
+		return;
+	}
+
+	// remember these dimensions
+	mScreenWidth = resX;
+	mScreenHeight = resY;
+	mViewportWidth = viewport_width;
+	mViewportHeight = viewport_height;
+
+	llinfos << "RESIZED SCREEN TEXTURE: " << resX << "x" << resY << llendl;
+
 	U32 samples = gSavedSettings.getU32("RenderFSAASamples");
 
 	U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor");
@@ -534,7 +555,8 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 viewport_width, U3
 		resY /= res_mod;
 	}
 
-	if (gSavedSettings.getBOOL("RenderUIBuffer"))
+	if (gSavedSettings.getBOOL("RenderUIBuffer") 
+		&& screen_size_changed)
 	{
 		mUIScreen.allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
 	}	
@@ -542,25 +564,39 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 viewport_width, U3
 	if (LLPipeline::sRenderDeferred)
 	{
 		//allocate deferred rendering color buffers
-		mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
-		mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+		if (screen_size_changed)
+		{
+			mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+			mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+			addDeferredAttachments(mDeferredScreen);
+		}
+		// always set viewport to desired size, since allocate resets the viewport
 		mDeferredScreen.setViewport(viewport_width, viewport_height);
 		mDeferredDepth.setViewport(viewport_width, viewport_height);
-		addDeferredAttachments(mDeferredScreen);
-		mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);		
-		mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+
+		if (screen_size_changed)
+		{
+			mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);		
+			mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+		}
 		mScreen.setViewport(viewport_width, viewport_height);
 		mEdgeMap.setViewport(viewport_width, viewport_height);
 
 		for (U32 i = 0; i < 3; i++)
 		{
-			mDeferredLight[i].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+			if (screen_size_changed)
+			{
+				mDeferredLight[i].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+			}
 			mDeferredLight[i].setViewport(viewport_width, viewport_height);
 		}
 
 		for (U32 i = 0; i < 2; i++)
 		{
-			mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+			if (screen_size_changed)
+			{
+				mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+			}
 			mGIMapPost[i].setViewport(viewport_width, viewport_height);
 		}
 
@@ -568,7 +604,10 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 viewport_width, U3
 
 		for (U32 i = 0; i < 4; i++)
 		{
-			mShadow[i].allocate(U32(resX*scale),U32(resY*scale), 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+			if (screen_size_changed)
+			{
+				mShadow[i].allocate(U32(resX*scale),U32(resY*scale), 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+			}
 			mShadow[i].setViewport(viewport_width, viewport_height);
 		}
 
@@ -578,7 +617,10 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 viewport_width, U3
 
 		for (U32 i = 4; i < 6; i++)
 		{
-			mShadow[i].allocate(width, height, 0, TRUE, FALSE);
+			if (screen_size_changed)
+			{
+				mShadow[i].allocate(width, height, 0, TRUE, FALSE);
+			}
 			mShadow[i].setViewport(viewport_width, viewport_height);
 		}
 
@@ -586,32 +628,41 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 viewport_width, U3
 
 		width = nhpo2(resX)/2;
 		height = nhpo2(resY)/2;
-		mLuminanceMap.allocate(width,height, GL_RGBA, FALSE, FALSE);
+		if (screen_size_changed)
+		{
+			mLuminanceMap.allocate(width,height, GL_RGBA, FALSE, FALSE);
+		}
 		mLuminanceMap.setViewport(viewport_width, viewport_height);
 	}
 	else
 	{
-		mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);		
+		if (screen_size_changed)
+		{
+			mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);		
+		}
 		mScreen.setViewport(viewport_width, viewport_height);
 	}
 	
 
 	if (gGLManager.mHasFramebufferMultisample && samples > 1)
 	{
-		mSampleBuffer.allocate(resX,resY,GL_RGBA,TRUE,TRUE,LLTexUnit::TT_RECT_TEXTURE,FALSE,samples);
-		mSampleBuffer.setViewport(viewport_width, viewport_height);
-		mScreen.setSampleBuffer(&mSampleBuffer);
-
-		if (LLPipeline::sRenderDeferred)
+		if (screen_size_changed)
 		{
-			addDeferredAttachments(mSampleBuffer);
-			mDeferredScreen.setSampleBuffer(&mSampleBuffer);
+			mSampleBuffer.allocate(resX,resY,GL_RGBA,TRUE,TRUE,LLTexUnit::TT_RECT_TEXTURE,FALSE,samples);
+			if (LLPipeline::sRenderDeferred)
+			{
+				addDeferredAttachments(mSampleBuffer);
+				mDeferredScreen.setSampleBuffer(&mSampleBuffer);
+			}
 		}
+		mSampleBuffer.setViewport(viewport_width, viewport_height);
+		mScreen.setSampleBuffer(&mSampleBuffer);
 
 		stop_glerror();
 	}
 	
-	if (LLPipeline::sRenderDeferred)
+	if (LLPipeline::sRenderDeferred 
+		&& screen_size_changed)
 	{ //share depth buffer between deferred targets
 		mDeferredScreen.shareDepthBuffer(mScreen);
 		for (U32 i = 0; i < 3; i++)
@@ -726,6 +777,10 @@ void LLPipeline::createGLBuffers()
 			mGlow[i].allocate(512,glow_res,GL_RGBA,FALSE,FALSE);
 		}
 
+		// force reallocation of buffers by clearing known dimensions
+		mScreenWidth = 0;
+		mScreenHeight = 0;
+
 		allocateScreenBuffer(resX,resY, viewport_width, viewport_height);
 	}
 	
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 9193e19bb1a..11b7b55f20b 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -467,6 +467,11 @@ class LLPipeline
 	static F32				sMinRenderSize;
 
 	//screen texture
+	U32 					mScreenWidth;
+	U32 					mScreenHeight;
+	U32 					mViewportWidth;
+	U32 					mViewportHeight;
+
 	LLRenderTarget			mScreen;
 	LLRenderTarget			mUIScreen;
 	LLRenderTarget			mDeferredScreen;
diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
index 14a4949df7f..3bf7f50a2c2 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -15,19 +15,19 @@
                 orientation="vertical"
                 top="0">
     <layout_panel auto_resize="false"
-                  min_height="19"
+                  height="84"
                   mouse_opaque="false"
-                  name="status_bar_container"
-                  height="19"
+                  name="nav_and_status_bar_region"
                   width="1024"
-                  visible="false"/>
-    <layout_panel auto_resize="false"
-                  height="65"
-                  mouse_opaque="false"
-                  name="nav_bar_container"
-                  width="1024"
-                  visible="false"/>
-    <panel        auto_resize="true"
+                  visible="false">
+      <panel follows="left|right|bottom"
+             left="0"
+             name="nav_bar_container"
+             right="1024"
+             top="19"
+             height="65"/>
+    </layout_panel>
+    <layout_panel auto_resize="true"
                   follows="all"
                   height="500"
                   layout="topleft"
@@ -124,8 +124,16 @@
                   height="500"
                   name="DebugView"
                   width="1024"/>
-  </panel>
+    </layout_panel>
   </layout_stack>
+  <panel mouse_opaque="false"
+         follows="left|right|top" 
+         name="status_bar_container"
+         height="19"
+         left="0" 
+         top="0" 
+         width="1024"
+         visible="false"/>
   <notify_box_view top="0"
                    follows="all"
                    height="768"
-- 
GitLab


From 3119468d06f38cc4a5b9535fc8eeb943d794dd2e Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Mon, 23 Nov 2009 21:47:59 +0200
Subject: [PATCH 517/557] Fixed normal bug EXT-2346 "My Landmarks accordion
 panels shouldn't be displayed if there are no landmarks in respective
 folders". - Added inventory observer to Landmarks Panel to update accordion
 tabs visibility upon inventory changes. - Added accordions contents
 refreshing upon filter edit to fix updating accordion items when filter
 becomes less restrictive.

--HG--
branch : product-engine
---
 indra/newview/llpanellandmarks.cpp | 84 +++++++++++++++++++++---------
 indra/newview/llpanellandmarks.h   | 18 ++++---
 2 files changed, 68 insertions(+), 34 deletions(-)

diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 10b419dfdbb..e24fa14e1e9 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -67,6 +67,27 @@ static const std::string TRASH_BUTTON_NAME = "trash_btn";
 // helper functions
 static void filter_list(LLInventorySubTreePanel* inventory_list, const std::string& string);
 
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLLandmarksPanelObserver
+//
+// Bridge to support knowing when the inventory has changed to update
+// landmarks accordions visibility.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLLandmarksPanelObserver : public LLInventoryObserver
+{
+public:
+	LLLandmarksPanelObserver(LLLandmarksPanel* lp) : mLP(lp) {}
+	virtual ~LLLandmarksPanelObserver() {}
+	/*virtual*/ void changed(U32 mask);
+
+private:
+	LLLandmarksPanel* mLP;
+};
+
+void LLLandmarksPanelObserver::changed(U32 mask)
+{
+	mLP->updateFilteredAccordions();
+}
 
 LLLandmarksPanel::LLLandmarksPanel()
 	:	LLPanelPlacesTab()
@@ -80,11 +101,16 @@ LLLandmarksPanel::LLLandmarksPanel()
 	,	mGearLandmarkMenu(NULL)
 	,	mDirtyFilter(false)
 {
+	mInventoryObserver = new LLLandmarksPanelObserver(this);
+	gInventory.addObserver(mInventoryObserver);
+
 	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_landmarks.xml");
 }
 
 LLLandmarksPanel::~LLLandmarksPanel()
 {
+	if (gInventory.containsObserver(mInventoryObserver))
+		gInventory.removeObserver(mInventoryObserver);
 }
 
 BOOL LLLandmarksPanel::postBuild()
@@ -135,8 +161,14 @@ void LLLandmarksPanel::onSearchEdit(const std::string& string)
 		LLAccordionCtrlTab* tab = *iter;
 		tab->setVisible(true);
 
-		// expand accordion to see matched items in all ones. See EXT-2014.
+		// expand accordion to see matched items in each one. See EXT-2014.
 		tab->changeOpenClose(false);
+
+		// refresh all accordions to display their contents in case of less restrictive filter
+		LLInventorySubTreePanel* inventory_list = dynamic_cast<LLInventorySubTreePanel*>(tab->getAccordionView());
+		if (NULL == inventory_list) continue;
+		LLFolderView* fv = inventory_list->getRootFolder();
+		fv->refresh();
 	}
 }
 
@@ -223,6 +255,31 @@ void LLLandmarksPanel::onSelectorButtonClicked()
 	}
 }
 
+void LLLandmarksPanel::updateFilteredAccordions()
+{
+	LLInventoryPanel* inventory_list = NULL;
+	LLAccordionCtrlTab* accordion_tab = NULL;
+	for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter)
+	{
+		accordion_tab = *iter;
+		inventory_list = dynamic_cast<LLInventorySubTreePanel*> (accordion_tab->getAccordionView());
+		if (NULL == inventory_list) continue;
+		LLFolderView* fv = inventory_list->getRootFolder();
+
+		bool has_descendants = fv->hasFilteredDescendants();
+
+		accordion_tab->setVisible(has_descendants);
+	}
+
+	// we have to arrange accordion tabs for cases when filter string is less restrictive but
+	// all items are still filtered.
+	static LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion");
+	accordion->arrange();
+
+	// now filter state is applied to accordion tabs
+	mDirtyFilter = false;
+}
+
 //////////////////////////////////////////////////////////////////////////
 // PROTECTED METHODS
 //////////////////////////////////////////////////////////////////////////
@@ -833,31 +890,6 @@ void LLLandmarksPanel::doIdle(void* landmarks_panel)
 
 }
 
-void LLLandmarksPanel::updateFilteredAccordions()
-{
-	LLInventoryPanel* inventory_list = NULL;
-	LLAccordionCtrlTab* accordion_tab = NULL;
-	for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter)
-	{
-		accordion_tab = *iter;
-		inventory_list = dynamic_cast<LLInventorySubTreePanel*> (accordion_tab->getAccordionView());
-		if (NULL == inventory_list) continue;
-		LLFolderView* fv = inventory_list->getRootFolder();
-
-		bool has_visible_children = fv->hasVisibleChildren();
-
-		accordion_tab->setVisible(has_visible_children);
-	}
-
-	// we have to arrange accordion tabs for cases when filter string is less restrictive but 
-	// all items are still filtered.
-	static LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion");
-	accordion->arrange();
-
-	// now filter state is applied to accordion tabs
-	mDirtyFilter = false;
-}
-
 void LLLandmarksPanel::doShowOnMap(LLLandmark* landmark)
 {
 	LLVector3d landmark_global_pos;
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index 777ee562d23..c65abc178b8 100644
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -46,6 +46,7 @@ class LLAccordionCtrlTab;
 class LLFolderViewItem;
 class LLMenuGL;
 class LLInventoryPanel;
+class LLInventoryObserver;
 class LLInventorySubTreePanel;
 
 class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
@@ -62,7 +63,14 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
 
 	void onSelectionChange(LLInventorySubTreePanel* inventory_list, const std::deque<LLFolderViewItem*> &items, BOOL user_action);
 	void onSelectorButtonClicked();
-	
+
+	/**
+	 * Updates accordions according to filtered items in lists.
+	 *
+	 * It hides accordion for empty lists
+	 */
+	void updateFilteredAccordions();
+
 protected:
 	/**
 	 * @return true - if current selected panel is not null and selected item is a landmark
@@ -121,13 +129,6 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
 	 */
 	static void doIdle(void* landmarks_panel);
 
-	/**
-	 * Updates accordions according to filtered items in lists.
-	 *
-	 * It hides accordion for empty lists
-	 */
-	void updateFilteredAccordions();
-
 	/**
 	 * Landmark actions callbacks. Fire when a landmark is loaded from the list.
 	 */
@@ -147,6 +148,7 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
 	LLMenuGL*					mGearFolderMenu;
 	LLMenuGL*					mMenuAdd;
 	LLInventorySubTreePanel*	mCurrentSelectedList;
+	LLInventoryObserver*		mInventoryObserver;
 
 	LLPanel*					mListCommands;
 	bool 						mSortByDate;
-- 
GitLab


From a8126a82cfa5e5f6625d78ecdb1199a88f512b91 Mon Sep 17 00:00:00 2001
From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com>
Date: Mon, 23 Nov 2009 15:21:59 -0500
Subject: [PATCH 518/557] Removed font references to SansSerifSmall.
 http://jira.secondlife.com/browse/EXT-1315

---
 indra/newview/skins/default/xui/en/panel_bottomtray.xml    | 1 -
 indra/newview/skins/default/xui/en/widgets/button.xml      | 1 -
 .../skins/default/xui/en/widgets/gesture_combo_box.xml     | 7 ++-----
 indra/newview/skins/default/xui/en/widgets/menu_item.xml   | 4 +---
 indra/newview/skins/default/xui/en/widgets/talk_button.xml | 1 -
 5 files changed, 3 insertions(+), 11 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index a8e659259e9..91e041fd7c8 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -108,7 +108,6 @@
           width="82"
           tool_tip="Shows/hides gestures">
              <gesture_combo_box.drop_down_button
-              font="SansSerifSmall"
               pad_right="10" 
               use_ellipses="true" />
          </gesture_combo_box>
diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml
index 6b11e722474..7c54e618ef6 100644
--- a/indra/newview/skins/default/xui/en/widgets/button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/button.xml
@@ -15,7 +15,6 @@
         image_color="ButtonImageColor"
         image_color_disabled="ButtonImageColor"
         flash_color="ButtonFlashBgColor"
-        font="SansSerifSmall"
         hover_glow_amount="0.15"
         halign="center"
         scale_image="true">
diff --git a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
index b61f9fffffa..4229f34c09f 100644
--- a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
+++ b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<gesture_combo_box font="SansSerifSmall"
+<gesture_combo_box
            label="Gestures" 
            list_position="below"
            max_chars="20"
@@ -7,7 +7,6 @@
   <gesture_combo_box.combo_button name="Combobox Button"
                           label=""
                           hover_glow_amount="0.15"
-                          font="SansSerifSmall"
                           scale_image="true"
                           image_unselected="ComboButton_Off"
                           image_selected="ComboButton_Selected"
@@ -17,7 +16,6 @@
                               label=""
                               halign="center"
                               hover_glow_amount="0.15"
-                              font="SansSerif"
                               scale_image="true"
                  image_selected="PushButton_Selected_Press"
                  image_pressed="PushButton_Press"
@@ -28,6 +26,5 @@
   <gesture_combo_box.combo_list bg_writeable_color="MenuDefaultBgColor"
                                 scroll_bar_bg_visible="false" />
   <gesture_combo_box.combo_editor name="Combo Text Entry"
-                          select_on_focus="true"
-                          font="SansSerifSmall" />
+                          select_on_focus="true" />
 </gesture_combo_box>
diff --git a/indra/newview/skins/default/xui/en/widgets/menu_item.xml b/indra/newview/skins/default/xui/en/widgets/menu_item.xml
index c98e9cb6b83..2bbaa6233ff 100644
--- a/indra/newview/skins/default/xui/en/widgets/menu_item.xml
+++ b/indra/newview/skins/default/xui/en/widgets/menu_item.xml
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <!-- Use this for the top-level menu styling -->
-<menu_item
-  font="SansSerifSmall"
-  >
+<menu_item>
 </menu_item>
diff --git a/indra/newview/skins/default/xui/en/widgets/talk_button.xml b/indra/newview/skins/default/xui/en/widgets/talk_button.xml
index bbc508de080..ea0a213c79c 100644
--- a/indra/newview/skins/default/xui/en/widgets/talk_button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/talk_button.xml
@@ -13,7 +13,6 @@
     name="left"
     label="Speak"
     label_selected="Speak"
-    font="SansSerifSmall"
     tab_stop="false"
     />
   <show_button
-- 
GitLab


From 9135bb7b0f7d194b8ffc0db3374a7e882fe39a94 Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Mon, 23 Nov 2009 23:03:08 +0200
Subject: [PATCH 519/557] Implemented normal task EXT-2739 (Ctrl-I should open
 Inventory side panel, Ctrl-Shift-I should open Inventory floater).

--HG--
branch : product-engine
---
 indra/newview/llviewermenu.cpp                     | 11 +++++++++++
 indra/newview/skins/default/xui/en/menu_viewer.xml | 11 ++++++++++-
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index c67af994a42..625b8161250 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -5678,6 +5678,16 @@ class LLFloaterVisible : public view_listener_t
 	}
 };
 
+class LLShowSidetrayPanel : public view_listener_t
+{
+	bool handleEvent(const LLSD& userdata)
+	{
+		std::string panel_name = userdata.asString();
+		LLSideTray::getInstance()->showPanel(panel_name, LLSD());
+		return true;
+	}
+};
+
 bool callback_show_url(const LLSD& notification, const LLSD& response)
 {
 	S32 option = LLNotification::getSelectedOption(notification, response);
@@ -8039,6 +8049,7 @@ void initialize_menus()
 	visible.add("Object.VisibleEdit", boost::bind(&enable_object_edit));
 
 	view_listener_t::addMenu(new LLFloaterVisible(), "FloaterVisible");
+	view_listener_t::addMenu(new LLShowSidetrayPanel(), "ShowSidetrayPanel");
 	view_listener_t::addMenu(new LLSomethingSelected(), "SomethingSelected");
 	view_listener_t::addMenu(new LLSomethingSelectedNoHUD(), "SomethingSelectedNoHUD");
 	view_listener_t::addMenu(new LLEditableSelected(), "EditableSelected");
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 8ab5fb16596..e19e11a1b84 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -59,7 +59,7 @@
          label="My Inventory"
          layout="topleft"
          name="Inventory"
-         shortcut="control|I">
+         shortcut="control|shift|I">
             <menu_item_check.on_check
              function="Floater.Visible"
              parameter="inventory" />
@@ -67,6 +67,15 @@
              function="Floater.Toggle"
              parameter="inventory" />
         </menu_item_check>
+        <menu_item_call
+         label="Show Sidetray Inventory"
+         name="ShowSidetrayInventory"
+         shortcut="control|I"
+         visible="false">
+            <menu_item_call.on_click
+             function="ShowSidetrayPanel"
+             parameter="sidepanel_inventory" />
+        </menu_item_call>
         <menu_item_call
          label="My Gestures"
          layout="topleft"
-- 
GitLab


From 347562844dc2be598f39138a39eaacaff6b4e323 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Mon, 23 Nov 2009 14:23:51 -0800
Subject: [PATCH 520/557] Initial implementation of parcel property icons and
 maturity string on nav bar Added new LLAgentUI location format, renamed
 unclear old one Renamed ShowCoordinatesOption to NavBarShowCoordinates
 Extended LLLocationInputCtrl to show icons. Reviewed with Rick

---
 indra/newview/app_settings/settings.xml       |   2 +-
 indra/newview/llagentui.cpp                   |  19 ++-
 indra/newview/llagentui.h                     |   9 +-
 indra/newview/llglsandbox.cpp                 |   5 +-
 indra/newview/lllocationinputctrl.cpp         | 112 +++++++++++++++---
 indra/newview/lllocationinputctrl.h           |  27 ++++-
 indra/newview/llnavigationbar.cpp             |   2 +-
 indra/newview/llteleporthistory.cpp           |   4 +-
 indra/newview/llteleporthistory.h             |   3 +-
 indra/newview/lltoolmgr.cpp                   |   2 +-
 indra/newview/llviewermenu.cpp                |   4 +-
 indra/newview/llviewerparcelmgr.cpp           |  42 +++++--
 indra/newview/llviewerparcelmgr.h             |  30 +++--
 .../default/xui/en/widgets/location_input.xml |  48 +++++++-
 14 files changed, 256 insertions(+), 53 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index c7279a2e333..21ccf2ac913 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -7709,7 +7709,7 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
-    <key>ShowCoordinatesOption</key>
+    <key>NavBarShowCoordinates</key>
     <map>
       <key>Comment</key>
       <string>Show Coordinates in  Location Input Field</string>
diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp
index 568ac4164ac..7404fe5bc47 100644
--- a/indra/newview/llagentui.cpp
+++ b/indra/newview/llagentui.cpp
@@ -130,6 +130,7 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
 	// create a default name and description for the landmark
 	std::string parcel_name = LLViewerParcelMgr::getInstance()->getAgentParcelName();
 	std::string region_name = region->getName();
+	std::string sim_access_string = region->getSimAccessString();
 	std::string buffer;
 	if( parcel_name.empty() )
 	{
@@ -142,7 +143,13 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
 		case LOCATION_FORMAT_NORMAL:
 			buffer = llformat("%s", region_name.c_str());
 			break;
-		case LOCATION_FORMAT_WITHOUT_SIM:
+		case LOCATION_FORMAT_NO_COORDS:
+			buffer = llformat("%s%s%s",
+				region_name.c_str(),
+				sim_access_string.empty() ? "" : " - ",
+				sim_access_string.c_str());
+			break;
+		case LOCATION_FORMAT_NO_MATURITY:
 		case LOCATION_FORMAT_FULL:
 			buffer = llformat("%s (%d, %d, %d)",
 				region_name.c_str(),
@@ -161,14 +168,20 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
 		case LOCATION_FORMAT_NORMAL:
 			buffer = llformat("%s, %s", parcel_name.c_str(), region_name.c_str());
 			break;
-		case LOCATION_FORMAT_WITHOUT_SIM:
+		case LOCATION_FORMAT_NO_MATURITY:
 			buffer = llformat("%s, %s (%d, %d, %d)",
 				parcel_name.c_str(),
 				region_name.c_str(),
 				pos_x, pos_y, pos_z);
 			break;
+		case LOCATION_FORMAT_NO_COORDS:
+			buffer = llformat("%s, %s%s%s",
+							  parcel_name.c_str(),
+							  region_name.c_str(),
+							  sim_access_string.empty() ? "" : " - ",
+							  sim_access_string.c_str());
+				break;
 		case LOCATION_FORMAT_FULL:
-			std::string sim_access_string = region->getSimAccessString();
 			buffer = llformat("%s, %s (%d, %d, %d)%s%s",
 				parcel_name.c_str(),
 				region_name.c_str(),
diff --git a/indra/newview/llagentui.h b/indra/newview/llagentui.h
index c7aafb71e7b..3478793e38f 100644
--- a/indra/newview/llagentui.h
+++ b/indra/newview/llagentui.h
@@ -38,10 +38,11 @@ class LLAgentUI
 public:
 	enum ELocationFormat
 	{
-		LOCATION_FORMAT_NORMAL,
-		LOCATION_FORMAT_LANDMARK,
-		LOCATION_FORMAT_WITHOUT_SIM,
-		LOCATION_FORMAT_FULL,
+		LOCATION_FORMAT_NORMAL,			// Parcel
+		LOCATION_FORMAT_LANDMARK,		// Parcel, Region
+		LOCATION_FORMAT_NO_MATURITY,	// Parcel, Region (x, y, z)
+		LOCATION_FORMAT_NO_COORDS,		// Parcel, Region - Maturity
+		LOCATION_FORMAT_FULL,			// Parcel, Region (x, y, z) - Maturity
 	};
 
 	static void buildName(std::string& name);
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index 43fbe362d59..750a9d478fe 100644
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -67,7 +67,10 @@
 #include "llresmgr.h"
 #include "pipeline.h"
 #include "llspatialpartition.h"
- 
+
+// Height of the yellow selection highlight posts for land
+const F32 PARCEL_POST_HEIGHT = 0.666f;
+
 BOOL LLAgent::setLookAt(ELookAtType target_type, LLViewerObject *object, LLVector3 position)
 {
 	if(object && object->isAttachment())
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 7e35cfa04c2..be96d7b43a0 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -157,15 +157,21 @@ LLLocationInputCtrl::Params::Params()
 	add_landmark_image_disabled("add_landmark_image_disabled"),
 	add_landmark_image_hover("add_landmark_image_hover"),
 	add_landmark_image_selected("add_landmark_image_selected"),
+	icon_hpad("icon_hpad", 0),
 	add_landmark_button("add_landmark_button"),
-	add_landmark_hpad("add_landmark_hpad", 0),
-	info_button("info_button")
+	info_button("info_button"),
+	voice_icon("voice_icon"),
+	fly_icon("fly_icon"),
+	push_icon("push_icon"),
+	build_icon("build_icon"),
+	scripts_icon("scripts_icon"),
+	damage_icon("damage_icon")
 {
 }
 
 LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
 :	LLComboBox(p),
-	mAddLandmarkHPad(p.add_landmark_hpad),
+	mIconHPad(p.icon_hpad),
 	mInfoBtn(NULL),
 	mLocationContextMenu(NULL),
 	mAddLandmarkBtn(NULL),
@@ -230,6 +236,32 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
 	mAddLandmarkBtn = LLUICtrlFactory::create<LLButton>(al_params);
 	enableAddLandmarkButton(true);
 	addChild(mAddLandmarkBtn);
+
+	// Parcel property icons
+	LLIconCtrl::Params voice_icon = p.voice_icon;
+	mParcelIcon[VOICE_ICON] = LLUICtrlFactory::create<LLIconCtrl>(voice_icon);
+	addChild(mParcelIcon[VOICE_ICON]);
+
+	LLIconCtrl::Params fly_icon = p.fly_icon;
+	mParcelIcon[FLY_ICON] = LLUICtrlFactory::create<LLIconCtrl>(fly_icon);
+	addChild(mParcelIcon[FLY_ICON]);
+
+	LLIconCtrl::Params push_icon = p.push_icon;
+	mParcelIcon[PUSH_ICON] = LLUICtrlFactory::create<LLIconCtrl>(push_icon);
+	addChild(mParcelIcon[PUSH_ICON]);
+
+	LLIconCtrl::Params build_icon = p.build_icon;
+	mParcelIcon[BUILD_ICON] = LLUICtrlFactory::create<LLIconCtrl>(build_icon);
+	addChild(mParcelIcon[BUILD_ICON]);
+
+	LLIconCtrl::Params scripts_icon = p.scripts_icon;
+	mParcelIcon[SCRIPTS_ICON] = LLUICtrlFactory::create<LLIconCtrl>(scripts_icon);
+	addChild(mParcelIcon[SCRIPTS_ICON]);
+
+	LLIconCtrl::Params damage_icon = p.damage_icon;
+	mParcelIcon[DAMAGE_ICON] = LLUICtrlFactory::create<LLIconCtrl>(damage_icon);
+	addChild(mParcelIcon[DAMAGE_ICON]);
+	// TODO: health number?
 	
 	// Register callbacks and load the location field context menu (NB: the order matters).
 	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Navbar.Action", boost::bind(&LLLocationInputCtrl::onLocationContextMenuItemClicked, this, _2));
@@ -410,9 +442,10 @@ void LLLocationInputCtrl::onFocusLost()
 		mTextEntry->deselect();
 	}
 }
-void	LLLocationInputCtrl::draw(){
-	
-	if(!hasFocus() && gSavedSettings.getBOOL("ShowCoordinatesOption")){
+
+void LLLocationInputCtrl::draw()
+{	
+	if(!hasFocus() && gSavedSettings.getBOOL("NavBarShowCoordinates")){
 		refreshLocation();
 	}
 	LLComboBox::draw();
@@ -532,6 +565,7 @@ void LLLocationInputCtrl::onTextEditorRightClicked(S32 x, S32 y, MASK mask)
 void LLLocationInputCtrl::refresh()
 {
 	refreshLocation();			// update location string
+	refreshParcelIcons();
 	updateAddLandmarkButton();	// indicate whether current parcel has been landmarked 
 }
 
@@ -548,13 +582,57 @@ void LLLocationInputCtrl::refreshLocation()
 
 	// Update location field.
 	std::string location_name;
-	LLAgentUI::ELocationFormat format =  (gSavedSettings.getBOOL("ShowCoordinatesOption") ? 
-			LLAgentUI::LOCATION_FORMAT_WITHOUT_SIM: LLAgentUI::LOCATION_FORMAT_NORMAL);
+	LLAgentUI::ELocationFormat format =
+		(gSavedSettings.getBOOL("NavBarShowCoordinates")
+			? LLAgentUI::LOCATION_FORMAT_FULL
+			: LLAgentUI::LOCATION_FORMAT_NO_COORDS);
 
-	if (!LLAgentUI::buildLocationString(location_name, format)) location_name = "Unknown";
+	if (!LLAgentUI::buildLocationString(location_name, format)) 
+	{
+		location_name = "???";
+	}
 	setText(location_name);
 }
 
+void LLLocationInputCtrl::refreshParcelIcons()
+{
+	LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance();
+	// *TODO buy
+	//bool allow_buy      = vpm->canAgentBuyParcel( vpm->getAgentParcel(), false);
+	bool allow_voice	= vpm->allowAgentVoice();
+	bool allow_fly		= vpm->allowAgentFly();
+	bool allow_push		= vpm->allowAgentPush();
+	bool allow_build	= vpm->allowAgentBuild();
+	bool allow_scripts	= vpm->allowAgentScripts();
+	bool allow_damage	= vpm->allowAgentDamage();
+
+	// Most icons are "block this ability"
+	mParcelIcon[VOICE_ICON]->setVisible(   !allow_voice );
+	mParcelIcon[FLY_ICON]->setVisible(     !allow_fly );
+	mParcelIcon[PUSH_ICON]->setVisible(    !allow_push );
+	mParcelIcon[BUILD_ICON]->setVisible(   !allow_build );
+	mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts );
+	mParcelIcon[DAMAGE_ICON]->setVisible(  allow_damage );
+	// *TODO damage meter
+
+	// Slide the parcel icons rect from right to left, adjusting rectangles of
+	// visible icons.  Assumes all icon rects are the same.
+	LLRect icon_rect = mParcelIcon[0]->getRect();
+	S32 icon_width = icon_rect.getWidth();
+	icon_rect.mRight = mAddLandmarkBtn->getRect().mLeft - mIconHPad;
+	icon_rect.mLeft = icon_rect.mRight - icon_width;
+	
+	for (S32 i = 0; i < ICON_COUNT; ++i)
+	{
+		if (mParcelIcon[i]->getVisible())
+		{
+			mParcelIcon[i]->setRect( icon_rect );
+			icon_rect.translate( -icon_width - mIconHPad, 0);
+		}
+	}
+	// *TODO: health meter
+}
+
 void LLLocationInputCtrl::rebuildLocationHistory(std::string filter)
 {
 	LLLocationHistory::location_list_t filtered_items;
@@ -651,13 +729,11 @@ void LLLocationInputCtrl::updateWidgetlayout()
 	mInfoBtn->setRect(info_btn_rect);
 
 	// "Add Landmark" button
-	{
-		LLRect al_btn_rect = mAddLandmarkBtn->getRect();
-		al_btn_rect.translate(
-			hist_btn_rect.mLeft - mAddLandmarkHPad - al_btn_rect.getWidth(),
-			(rect.getHeight() - al_btn_rect.getHeight()) / 2);
-		mAddLandmarkBtn->setRect(al_btn_rect);
-	}
+	LLRect al_btn_rect = mAddLandmarkBtn->getRect();
+	al_btn_rect.translate(
+		hist_btn_rect.mLeft - mIconHPad - al_btn_rect.getWidth(),
+		(rect.getHeight() - al_btn_rect.getHeight()) / 2);
+	mAddLandmarkBtn->setRect(al_btn_rect);
 }
 
 void LLLocationInputCtrl::changeLocationPresentation()
@@ -680,7 +756,7 @@ void LLLocationInputCtrl::onLocationContextMenuItemClicked(const LLSD& userdata)
 
 	if (item == std::string("show_coordinates"))
 	{
-		gSavedSettings.setBOOL("ShowCoordinatesOption",!gSavedSettings.getBOOL("ShowCoordinatesOption"));
+		gSavedSettings.setBOOL("NavBarShowCoordinates",!gSavedSettings.getBOOL("NavBarShowCoordinates"));
 	}
 	else if (item == std::string("landmark"))
 	{
@@ -744,7 +820,7 @@ bool LLLocationInputCtrl::onLocationContextMenuItemEnabled(const LLSD& userdata)
 	}
 	else if(item == std::string("show_coordinates")){
 	
-		return gSavedSettings.getBOOL("ShowCoordinatesOption");
+		return gSavedSettings.getBOOL("NavBarShowCoordinates");
 	}
 
 	return false;
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h
index 44dc0cb2510..fefd0f7fec6 100644
--- a/indra/newview/lllocationinputctrl.h
+++ b/indra/newview/lllocationinputctrl.h
@@ -33,7 +33,8 @@
 #ifndef LL_LLLOCATIONINPUTCTRL_H
 #define LL_LLLOCATIONINPUTCTRL_H
 
-#include <llcombobox.h>
+#include "llcombobox.h"
+#include "lliconctrl.h"		// Params
 
 class LLLandmark;
 
@@ -63,9 +64,15 @@ class LLLocationInputCtrl
 											add_landmark_image_disabled,
 											add_landmark_image_hover,
 											add_landmark_image_selected;
-		Optional<S32>						add_landmark_hpad;
+		Optional<S32>						icon_hpad;
 		Optional<LLButton::Params>			add_landmark_button,
 											info_button;
+		Optional<LLIconCtrl::Params>		voice_icon,
+											fly_icon,
+											push_icon,
+											build_icon,
+											scripts_icon,
+											damage_icon;
 		Params();
 	};
 
@@ -103,6 +110,7 @@ class LLLocationInputCtrl
 	void					enableAddLandmarkButton(bool val);
 	void					refresh();
 	void					refreshLocation();
+	void					refreshParcelIcons();
 	void					rebuildLocationHistory(std::string filter = "");
 	bool 					findTeleportItemsByTitle(const LLTeleportHistoryItem& item, const std::string& filter);
 	void					setText(const LLStringExplicit& text);
@@ -126,7 +134,20 @@ class LLLocationInputCtrl
 	LLMenuGL*				mLocationContextMenu;
 	LLButton*				mAddLandmarkBtn;
 	LLButton*				mInfoBtn;
-	S32						mAddLandmarkHPad;
+	S32						mIconHPad;
+	
+	enum EParcelIcon
+	{
+		VOICE_ICON = 0,
+		FLY_ICON,
+		PUSH_ICON,
+		BUILD_ICON,
+		SCRIPTS_ICON,
+		DAMAGE_ICON,
+		ICON_COUNT
+	};
+	LLIconCtrl*	mParcelIcon[ICON_COUNT];
+	// TODO: Health meter?
 
 	LLAddLandmarkObserver*		mAddLandmarkObserver;
 	LLRemoveLandmarkObserver*	mRemoveLandmarkObserver;
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 114d26af8aa..46d64c34163 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -413,7 +413,7 @@ void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos, con
 	 * At this moment gAgent.getPositionAgent() contains previous coordinates.
 	 * according to EXT-65 agent position is being reseted on each frame.  
 	 */
-		LLAgentUI::buildLocationString(location, LLAgentUI::LOCATION_FORMAT_WITHOUT_SIM,
+		LLAgentUI::buildLocationString(location, LLAgentUI::LOCATION_FORMAT_NO_MATURITY,
 					gAgent.getPosAgentFromGlobal(global_agent_pos));
 	std::string tooltip (LLSLURL::buildSLURLfromPosGlobal(gAgent.getRegion()->getName(), global_agent_pos, false));
 	
diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp
index bc886d57432..cc4689062eb 100644
--- a/indra/newview/llteleporthistory.cpp
+++ b/indra/newview/llteleporthistory.cpp
@@ -52,7 +52,7 @@
 
 const std::string& LLTeleportHistoryItem::getTitle() const
 {
-	return gSavedSettings.getBOOL("ShowCoordinatesOption") ? mFullTitle : mTitle;
+	return gSavedSettings.getBOOL("NavBarShowCoordinates") ? mFullTitle : mTitle;
 }
 
 //////////////////////////////////////////////////////////////////////////////
@@ -177,7 +177,7 @@ void LLTeleportHistory::purgeItems()
 std::string LLTeleportHistory::getCurrentLocationTitle(bool full, const LLVector3& local_pos_override)
 {
 	std::string location_name;
-	LLAgentUI::ELocationFormat fmt = full ? LLAgentUI::LOCATION_FORMAT_WITHOUT_SIM : LLAgentUI::LOCATION_FORMAT_NORMAL;
+	LLAgentUI::ELocationFormat fmt = full ? LLAgentUI::LOCATION_FORMAT_NO_MATURITY : LLAgentUI::LOCATION_FORMAT_NORMAL;
 
 	if (!LLAgentUI::buildLocationString(location_name, fmt, local_pos_override)) location_name = "Unknown";
 	return location_name;
diff --git a/indra/newview/llteleporthistory.h b/indra/newview/llteleporthistory.h
index 9f5563ed0b4..a82bec7c4f4 100644
--- a/indra/newview/llteleporthistory.h
+++ b/indra/newview/llteleporthistory.h
@@ -57,7 +57,8 @@ class LLTeleportHistoryItem
 	{}
 
 	/**
-	 * @return title formatted according to the current value of the ShowCoordinatesOption setting.
+	 * @return title formatted according to the current value of the 
+	 * NavBarShowCoordinates setting.
 	 */
 	const std::string& getTitle() const;
 	
diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp
index ded83debad8..26b3bdb82e2 100644
--- a/indra/newview/lltoolmgr.cpp
+++ b/indra/newview/lltoolmgr.cpp
@@ -247,7 +247,7 @@ bool LLToolMgr::inEdit()
 
 bool LLToolMgr::canEdit()
 {
-	return LLViewerParcelMgr::getInstance()->agentCanBuild();
+	return LLViewerParcelMgr::getInstance()->allowAgentBuild();
 }
 
 void LLToolMgr::toggleBuildMode()
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index c67af994a42..ee1a469bbd9 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -2736,7 +2736,7 @@ bool enable_object_edit()
 	bool enable = false;
 	if (gAgent.inPrelude())
 	{
-		enable = LLViewerParcelMgr::getInstance()->agentCanBuild()
+		enable = LLViewerParcelMgr::getInstance()->allowAgentBuild()
 			|| LLSelectMgr::getInstance()->getSelection()->isAttachment();
 	} 
 	else if (LLSelectMgr::getInstance()->selectGetModify())
@@ -6096,7 +6096,7 @@ class LLAttachmentEnableDrop : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
 	{
-		BOOL can_build   = gAgent.isGodlike() || (LLViewerParcelMgr::getInstance()->agentCanBuild());
+		BOOL can_build   = gAgent.isGodlike() || (LLViewerParcelMgr::getInstance()->allowAgentBuild());
 
 		//Add an inventory observer to only allow dropping the newly attached item
 		//once it exists in your inventory.  Look at Jira 2422.
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index aa0987aa7d1..fcaf49c8849 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -650,7 +650,7 @@ LLParcel *LLViewerParcelMgr::getAgentParcel() const
 }
 
 // Return whether the agent can build on the land they are on
-bool LLViewerParcelMgr::agentCanBuild() const
+bool LLViewerParcelMgr::allowAgentBuild() const
 {
 	if (mAgentParcel)
 	{
@@ -664,19 +664,47 @@ bool LLViewerParcelMgr::agentCanBuild() const
 	}
 }
 
-BOOL LLViewerParcelMgr::agentCanTakeDamage() const
+bool LLViewerParcelMgr::allowAgentVoice() const
 {
-	return mAgentParcel->getAllowDamage();
+	LLViewerRegion* region = gAgent.getRegion();
+	return region && region->isVoiceEnabled()
+		&& mAgentParcel	&& mAgentParcel->getParcelFlagAllowVoice();
 }
 
-BOOL LLViewerParcelMgr::agentCanFly() const
+bool LLViewerParcelMgr::allowAgentFly() const
 {
-	return TRUE;
+	LLViewerRegion* region = gAgent.getRegion();
+	return region && !region->getBlockFly()
+		&& mAgentParcel && mAgentParcel->getAllowFly();
 }
 
-F32 LLViewerParcelMgr::agentDrawDistance() const
+// Can the agent be pushed around by LLPushObject?
+bool LLViewerParcelMgr::allowAgentPush() const
 {
-	return 512.f;
+	LLViewerRegion* region = gAgent.getRegion();
+	return region && !region->getRestrictPushObject()
+		&& mAgentParcel && !mAgentParcel->getRestrictPushObject();
+}
+
+bool LLViewerParcelMgr::allowAgentScripts() const
+{
+	LLViewerRegion* region = gAgent.getRegion();
+	// *NOTE: This code does not take into account group-owned parcels
+	// and the flag to allow group-owned scripted objects to run.
+	// This mirrors the traditional menu bar parcel icon code, but is not
+	// technically correct.
+	return region
+		&& !(region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS)
+		&& !(region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS)
+		&& mAgentParcel
+		&& mAgentParcel->getAllowOtherScripts();
+}
+
+bool LLViewerParcelMgr::allowAgentDamage() const
+{
+	LLViewerRegion* region = gAgent.getRegion();
+	return region && region->getAllowDamage()
+		&& mAgentParcel && mAgentParcel->getAllowDamage();
 }
 
 BOOL LLViewerParcelMgr::isOwnedAt(const LLVector3d& pos_global) const
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index 1c8fe23dba1..379190789b0 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -56,9 +56,6 @@ class LLViewerRegion;
 //							  | EAST_MASK 
 //							  | WEST_MASK);
 
-const F32 PARCEL_POST_HEIGHT = 0.666f;
-//const F32 PARCEL_POST_HEIGHT = 20.f;
-
 // Specify the type of land transfer taking place
 //enum ELandTransferType
 //{
@@ -171,10 +168,29 @@ class LLViewerParcelMgr : public LLSingleton<LLViewerParcelMgr>
 
 	LLParcel*	getCollisionParcel() const;
 
-	BOOL	agentCanTakeDamage() const;
-	BOOL	agentCanFly() const;
-	F32		agentDrawDistance() const;
-	bool	agentCanBuild() const;
+	// Can this agent build on the parcel he is on?
+	// Used for parcel property icons in nav bar.
+	bool	allowAgentBuild() const;
+	
+	// Can this agent speak on the parcel he is on?
+	// Used for parcel property icons in nav bar.
+	bool	allowAgentVoice() const;
+	
+	// Can this agent start flying on this parcel?
+	// Used for parcel property icons in nav bar.
+	bool	allowAgentFly() const;
+	
+	// Can this agent be pushed by llPushObject() on this parcel?
+	// Used for parcel property icons in nav bar.
+	bool	allowAgentPush() const;
+	
+	// Can scripts written by non-parcel-owners run on the agent's current
+	// parcel?  Used for parcel property icons in nav bar.
+	bool	allowAgentScripts() const;
+	
+	// Can the agent be damaged here?
+	// Used for parcel property icons in nav bar.
+	bool	allowAgentDamage() const;
 
 	F32		getHoverParcelWidth() const		
 				{ return F32(mHoverEastNorth.mdV[VX] - mHoverWestSouth.mdV[VX]); }
diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml
index d88bcfab1d7..1fed1c075a6 100644
--- a/indra/newview/skins/default/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml
@@ -11,7 +11,7 @@
                 add_landmark_image_disabled="Favorite_Star_Off"
                 add_landmark_image_hover="Favorite_Star_Over"
                 add_landmark_image_selected="Favorite_Star_Press"
-                add_landmark_hpad="2"
+                icon_hpad="2"
                 allow_text_entry="true"
                 list_position="below"
       	        show_text_as_tentative="false"
@@ -38,7 +38,51 @@
                           scale_image="false"
 			  top="19"
 			  left="-3" />
-  <combo_button name="Location History"
+  <voice_icon
+    name="voice_icon"
+    width="22"
+    height="18"
+	top="21"
+    image_name="parcel_lght_VoiceNo"
+    />
+  <fly_icon
+    name="fly_icon"
+    width="22"
+    height="18"
+	top="21"
+    image_name="parcel_lght_FlyNo"
+    />
+  <push_icon
+    name="push_icon"
+    width="22"
+    height="18"
+	top="21"
+    image_name="parcel_lght_PushNo"
+    />
+  <build_icon
+    name="build_icon"
+    width="22"
+    height="18"
+	top="21"
+    image_name="parcel_lght_BuildNo"
+    />
+  <scripts_icon
+    name="scripts_icon"
+    width="22"
+    height="18"
+	top="21"
+    image_name="parcel_lght_ScriptsNo"
+    />
+  <!-- NOTE: Placeholder icon, there is no dark grayscale version -->
+  <damage_icon
+    name="damage_icon"
+    width="22"
+    height="18"
+	top="21"
+    image_name="parcel_lght_Damage"
+    />
+
+    <combo_button name="Location History"
                           label=""
                           pad_right="0"/>
   <combo_list bg_writeable_color="MenuDefaultBgColor" page_lines="10"
-- 
GitLab


From a19d849e9b47a517b296c582126eda6a8b4cea49 Mon Sep 17 00:00:00 2001
From: Ramzi Linden <ramzi@lindenlab.com>
Date: Mon, 23 Nov 2009 14:50:26 -0800
Subject: [PATCH 521/557] DEV-43298 Expand widgets slightly in EN: 
 floater_animation_preview.xml

---
 .../xui/en/floater_animation_preview.xml      | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_animation_preview.xml b/indra/newview/skins/default/xui/en/floater_animation_preview.xml
index ebce758d3d7..41b1f99d419 100644
--- a/indra/newview/skins/default/xui/en/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_animation_preview.xml
@@ -163,7 +163,7 @@ Maximum animation length is [MAX_LENGTH] seconds.
      follows="top|left|right"
      height="23"
      layout="topleft"
-     left="85"
+     left="100"
      name="name_form"
      right="-10" />
     <text
@@ -182,7 +182,7 @@ Maximum animation length is [MAX_LENGTH] seconds.
      follows="top|left|right"
      height="23"
      layout="topleft"
-     left="85"
+     left="100"
      name="description_form"
      right="-10" />
     <spinner
@@ -192,7 +192,7 @@ Maximum animation length is [MAX_LENGTH] seconds.
      increment="1"
      initial_value="0"
      label="Priority"
-     label_width="90"
+     label_width="88"
      layout="topleft"
      left="10"
      max_val="4"
@@ -214,14 +214,14 @@ Maximum animation length is [MAX_LENGTH] seconds.
      increment="1"
      initial_value="0"
      label="In(%)"
-     label_width="35"
+     label_width="49"
      layout="topleft"
      top_pad="5"
      left="30"
      max_val="100"
      name="loop_in_point"
      tool_tip="Sets point in animation that looping returns to"
-     width="110" />
+     width="115" />
     <spinner
      bottom_delta="0"
      follows="left|top"
@@ -234,8 +234,8 @@ Maximum animation length is [MAX_LENGTH] seconds.
      max_val="100"
      name="loop_out_point"
      tool_tip="Sets point in animation that ends a loop"
-     label_width="45"
-     width="120" />
+     label_width="49"
+     width="115" />
     <text
      type="string"
      length="1"
@@ -243,6 +243,7 @@ Maximum animation length is [MAX_LENGTH] seconds.
      follows="top|left"
      height="23"
      width="110"
+     word_wrap="true"
      layout="topleft"
      left="10"
      name="hand_label">
@@ -315,6 +316,7 @@ Maximum animation length is [MAX_LENGTH] seconds.
      follows="top|left"
      height="23"
      width="110"
+     word_wrap="true"
      layout="topleft"
      left="10"
      name="emote_label">
@@ -395,6 +397,7 @@ Maximum animation length is [MAX_LENGTH] seconds.
      follows="top|left"
      height="23"
      width="110"
+     word_wrap="true"
      layout="topleft"
      left="10"
      name="preview_label">
@@ -482,6 +485,8 @@ Maximum animation length is [MAX_LENGTH] seconds.
     <text
      type="string"
      length="1"
+     height="72"
+     word_wrap="true"
      top_pad="5"
      text_color="EmphasisColor"
      follows="top|left"
-- 
GitLab


From 78bbe3f5b1791484ed02408015f5277596f37db4 Mon Sep 17 00:00:00 2001
From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com>
Date: Mon, 23 Nov 2009 17:51:32 -0500
Subject: [PATCH 522/557] Updated graphic from 80/20. Changed references in
 xml. http://jira.secondlife.com/browse/EXT-2642

---
 .../default/textures/bottomtray/Unread_IM.png   | Bin 297 -> 416 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)

diff --git a/indra/newview/skins/default/textures/bottomtray/Unread_IM.png b/indra/newview/skins/default/textures/bottomtray/Unread_IM.png
index a355917fcaf9b823436942abfd08af3726af2f9b..598342ea805b903d7e1b5bc9b25d86d41d2d9c96 100644
GIT binary patch
delta 388
zcmV-~0ek+b0-ysSiBL{Q4GJ0x0000DNk~Le0000D0000D2nGNE0CMZ(e32n1e*r>C
zL_t(|+G70w|33q%fCWS_GBPqOxqh4n$P5HxHy}0#Vnran55y;dcoz__kI}UJ0<we=
zL@d2=LgCNv-?c2PtVy^`2g=U_$~Q-ASUg|?3A}y%y5JupL(;E5zZr00kUU5o+<CwL
z{t5r_`zJxafYbr00<fk}Up{g&e{!-A)C5uoqQTC)a_sb@uRp&t5W*mJaOa)hd2s1J
zW`;a<J5woKw%j~)`q@RGI)*l=rU&P)E`0yuHJgN?T0JuxD>GOXFjT*N`26G5okt&^
zT)6S>&XIFVzP<an5N;C?yl`*Gxb^e@ALhSbe*C+->A?MS%XfgB@(PGAS^@DHAU+Jl
z-;p&j{QUhh_2aGkA5P9(clpD^=aYd#t8s=1C~|`qH!$l)x~&ItCjhZDz7PZ_J80Si
ig`x*B=?<hGAiw}H62nAWfSY6h0000<MNUMnLSTYFX{%xY

delta 268
zcmV+n0rUQ#1E~TbiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyxe*nu#
zL_t(|+N_f?4gx_4MH#{xYqN=`*mKx;1sm^RZ*OmD<&8Xr%@!smvoe6-33iDjOhNKL
z55koF^}Jhm-31E{uprd*QJGKFxZPjOeQh5v+AJ}a0&7|g2<1*yxaZcuz~*=Nd`pFn
zs3#Kz5rIrlK_FEDRZSU$mZG~RVhO}|@f#s)U@<}vNSeS6>NLUBI7i_01hK&65<^F(
zegSGZ0@snhc>?<nfs4(O1Yw{yBEV+pH6mhs$<as910mkLvR&B!>DuF0fB^v7D1_;x
S;L(Zz0000<MNUMnLSTYNU~PK<

-- 
GitLab


From fef0d16a158a8b534a0008b9d62da4bfeb7da4e9 Mon Sep 17 00:00:00 2001
From: Ramzi Linden <ramzi@lindenlab.com>
Date: Mon, 23 Nov 2009 14:57:01 -0800
Subject: [PATCH 523/557] DEV-43298 Expand widgets slightly in EN: 
 floater_build_options.xml

---
 .../skins/default/xui/en/floater_build_options.xml        | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_build_options.xml b/indra/newview/skins/default/xui/en/floater_build_options.xml
index f0e678af003..56230e912c2 100644
--- a/indra/newview/skins/default/xui/en/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/en/floater_build_options.xml
@@ -15,14 +15,14 @@
      height="23"
      initial_value="1"
      label="Grid Units (meters)"
-     label_width="130"
+     label_width="160"
      layout="topleft"
      left="10"
      max_val="5"
      min_val="0.01"
      name="GridResolution"
      top="25"
-     width="200" />
+     width="230" />
     <spinner
      control_name="GridDrawSize"
      decimal_digits="1"
@@ -31,14 +31,14 @@
      increment="0.5"
      initial_value="5"
      label="Grid Extents (meters)"
-     label_width="130"
+     label_width="160"
      layout="topleft"
      left_delta="0"
      max_val="50"
      min_val="1"
      name="GridDrawSize"
      top_pad="0"
-     width="200" />
+     width="230" />
     <check_box
      control_name="GridSubUnit"
      height="16"
-- 
GitLab


From 47f9da8544a22657a6d3efa7b63604399c45e398 Mon Sep 17 00:00:00 2001
From: Ramzi Linden <ramzi@lindenlab.com>
Date: Mon, 23 Nov 2009 15:18:12 -0800
Subject: [PATCH 524/557] DEV-43298 Expand widgets slightly in EN: 
 floater_image_preview.xml

---
 .../skins/default/xui/en/floater_image_preview.xml   | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_image_preview.xml b/indra/newview/skins/default/xui/en/floater_image_preview.xml
index 2562daf4b3d..6f8f2721281 100644
--- a/indra/newview/skins/default/xui/en/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_image_preview.xml
@@ -47,9 +47,11 @@
     <text
      type="string"
      length="1"
-     bottom_delta="20"
+     bottom_delta="30"
      follows="top|left"
-     height="15"
+     height="25"
+     width="105"
+     word_wrap="true"
      layout="topleft"
      name="preview_label">
         Preview image as:
@@ -96,7 +98,9 @@
     <text
      type="string"
      length="1"
-     bottom="190"
+     bottom="225"
+     height="45"
+     word_wrap="true"
      follows="top|left"
      layout="topleft"
      left="10"
@@ -114,7 +118,7 @@ Try saving image as 24 bit Targa (.tga).
      layout="topleft"
      left_delta="2"
      name="lossless_check"
-     top_pad="197"
+     top_pad="162"
      width="280" />
     <button
      follows="bottom|right"
-- 
GitLab


From 2ede27a5e266794fc3d034f12344a580260a3546 Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Mon, 23 Nov 2009 15:29:01 -0800
Subject: [PATCH 525/557] Context menu item to show/hide nav bar parcel
 property icons.

---
 indra/newview/app_settings/settings.xml       | 13 +++++-
 indra/newview/lllocationinputctrl.cpp         | 44 +++++++++++++------
 .../skins/default/xui/en/menu_navbar.xml      | 17 +++----
 3 files changed, 51 insertions(+), 23 deletions(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 21ccf2ac913..85a465c0739 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -7712,7 +7712,7 @@
     <key>NavBarShowCoordinates</key>
     <map>
       <key>Comment</key>
-      <string>Show Coordinates in  Location Input Field</string>
+      <string>Show coordinates in navigation bar</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
@@ -7720,6 +7720,17 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <key>NavBarShowParcelProperties</key>
+    <map>
+      <key>Comment</key>
+      <string>Show parcel property icons in navigation bar</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
     <key>ShowCrosshairs</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index be96d7b43a0..5d2a0aa3824 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -596,6 +596,16 @@ void LLLocationInputCtrl::refreshLocation()
 
 void LLLocationInputCtrl::refreshParcelIcons()
 {
+	static LLUICachedControl<bool> show_properties("NavBarShowParcelProperties", false);
+	if (!show_properties)
+	{
+		for (S32 i = 0; i < ICON_COUNT; ++i)
+		{
+			mParcelIcon[i]->setVisible(false);
+		}
+		return;
+	}
+	
 	LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance();
 	// *TODO buy
 	//bool allow_buy      = vpm->canAgentBuyParcel( vpm->getAgentParcel(), false);
@@ -754,11 +764,17 @@ void LLLocationInputCtrl::onLocationContextMenuItemClicked(const LLSD& userdata)
 {
 	std::string item = userdata.asString();
 
-	if (item == std::string("show_coordinates"))
+	if (item == "show_coordinates")
 	{
 		gSavedSettings.setBOOL("NavBarShowCoordinates",!gSavedSettings.getBOOL("NavBarShowCoordinates"));
 	}
-	else if (item == std::string("landmark"))
+	else if (item == "show_properties")
+	{
+		gSavedSettings.setBOOL("NavBarShowParcelProperties",
+			!gSavedSettings.getBOOL("NavBarShowParcelProperties"));
+		refreshParcelIcons();
+	}
+	else if (item == "landmark")
 	{
 		LLViewerInventoryItem* landmark = LLLandmarkActions::findLandmarkForAgentPos();
 		
@@ -772,23 +788,23 @@ void LLLocationInputCtrl::onLocationContextMenuItemClicked(const LLSD& userdata)
 					LLSD().insert("type", "landmark").insert("id",landmark->getUUID()));
 		}
 	}
-	else if (item == std::string("cut"))
+	else if (item == "cut")
 	{
 		mTextEntry->cut();
 	}
-	else if (item == std::string("copy"))
+	else if (item == "copy")
 	{
 		mTextEntry->copy();
 	}
-	else if (item == std::string("paste"))
+	else if (item == "paste")
 	{
 		mTextEntry->paste();
 	}
-	else if (item == std::string("delete"))
+	else if (item == "delete")
 	{
 		mTextEntry->deleteSelection();
 	}
-	else if (item == std::string("select_all"))
+	else if (item == "select_all")
 	{
 		mTextEntry->selectAll();
 	}
@@ -798,28 +814,28 @@ bool LLLocationInputCtrl::onLocationContextMenuItemEnabled(const LLSD& userdata)
 {
 	std::string item = userdata.asString();
 	
-	if (item == std::string("can_cut"))
+	if (item == "can_cut")
 	{
 		return mTextEntry->canCut();
 	}
-	else if (item == std::string("can_copy"))
+	else if (item == "can_copy")
 	{
 		return mTextEntry->canCopy();
 	}
-	else if (item == std::string("can_paste"))
+	else if (item == "can_paste")
 	{
 		return mTextEntry->canPaste();
 	}
-	else if (item == std::string("can_delete"))
+	else if (item == "can_delete")
 	{
 		return mTextEntry->canDeselect();
 	}
-	else if (item == std::string("can_select_all"))
+	else if (item == "can_select_all")
 	{
 		return mTextEntry->canSelectAll();
 	}
-	else if(item == std::string("show_coordinates")){
-	
+	else if(item == "show_coordinates")
+	{
 		return gSavedSettings.getBOOL("NavBarShowCoordinates");
 	}
 
diff --git a/indra/newview/skins/default/xui/en/menu_navbar.xml b/indra/newview/skins/default/xui/en/menu_navbar.xml
index 89469fb0136..e17eeb46f67 100644
--- a/indra/newview/skins/default/xui/en/menu_navbar.xml
+++ b/indra/newview/skins/default/xui/en/menu_navbar.xml
@@ -10,7 +10,6 @@
  width="128">
     <menu_item_check
          label="Show Coordinates"
-         layout="topleft"
          name="Show Coordinates">
            <menu_item_check.on_click
              function="Navbar.Action"
@@ -19,22 +18,28 @@
              function="Navbar.EnableMenuItem"
              parameter="show_coordinates" />
     </menu_item_check>
+    <menu_item_check
+      label="Show Parcel Properties"
+      name="Show Parcel Properties">
+      <menu_item_check.on_click
+        function="Navbar.Action"
+        parameter="show_properties" />
+      <menu_item_check.on_check
+        control="NavBarShowParcelProperties" />
+    </menu_item_check>
     <!-- Label of 'Landmark' item is changing in runtime, 
     see  AddLandmarkNavBarMenu/EditLandmarkNavBarMenu in strings.xml -->
     <menu_item_call
      label="Landmark"
-     layout="topleft"
      name="Landmark">
         <menu_item_call.on_click
          function="Navbar.Action"
          parameter="landmark" />
     </menu_item_call>
     <menu_item_separator
-     layout="topleft"
      name="Separator" />
     <menu_item_call
      label="Cut"
-     layout="topleft"
      name="Cut">
         <menu_item_call.on_click
          function="Navbar.Action"
@@ -45,7 +50,6 @@
     </menu_item_call>
     <menu_item_call
      label="Copy"
-     layout="topleft"
      name="Copy">
         <menu_item_call.on_click
          function="Navbar.Action"
@@ -56,7 +60,6 @@
     </menu_item_call>
     <menu_item_call
      label="Paste"
-     layout="topleft"
      name="Paste">
         <menu_item_call.on_click
          function="Navbar.Action"
@@ -67,7 +70,6 @@
     </menu_item_call>
     <menu_item_call
      label="Delete"
-     layout="topleft"
      name="Delete">
         <menu_item_call.on_click
          function="Navbar.Action"
@@ -78,7 +80,6 @@
     </menu_item_call>
     <menu_item_call
      label="Select All"
-     layout="topleft"
      name="Select All">
         <menu_item_call.on_click
          function="Navbar.Action"
-- 
GitLab


From c9a1d3040e4ec8fde7bc1d69ea0509f0f7d288a1 Mon Sep 17 00:00:00 2001
From: Lis Pardi <lis@lindenlab.com>
Date: Mon, 23 Nov 2009 18:35:21 -0500
Subject: [PATCH 526/557] http://jira.secondlife.com/browse/EXT-2557 Buttons
 should not be bolded-- This Jira also illuminated that buttons should be
 Medium, instead of Small

---
 .../default/xui/en/floater_about_land.xml     | 20 +------------------
 .../default/xui/en/floater_customize.xml      | 17 ----------------
 .../default/xui/en/floater_env_settings.xml   |  3 ---
 .../default/xui/en/floater_god_tools.xml      | 15 --------------
 .../en/floater_inventory_item_properties.xml  |  2 --
 .../skins/default/xui/en/floater_moveview.xml |  3 +--
 .../default/xui/en/floater_openobject.xml     |  2 --
 .../xui/en/floater_preview_animation.xml      |  2 --
 .../default/xui/en/floater_preview_sound.xml  |  1 -
 .../default/xui/en/floater_sell_land.xml      |  4 ----
 .../skins/default/xui/en/floater_snapshot.xml |  2 --
 .../skins/default/xui/en/floater_telehub.xml  |  4 ----
 .../default/xui/en/floater_test_button.xml    |  1 -
 .../default/xui/en/floater_texture_ctrl.xml   |  3 ---
 .../skins/default/xui/en/floater_tools.xml    |  4 ----
 .../default/xui/en/floater_url_entry.xml      |  3 ---
 .../xui/en/floater_whitelist_entry.xml        |  4 ++--
 .../default/xui/en/floater_world_map.xml      |  1 -
 .../default/xui/en/panel_classified_info.xml  |  3 ---
 .../default/xui/en/panel_group_invite.xml     |  4 ----
 .../default/xui/en/panel_navigation_bar.xml   |  3 ---
 .../skins/default/xui/en/panel_people.xml     |  7 -------
 .../skins/default/xui/en/panel_pick_info.xml  |  3 ---
 .../skins/default/xui/en/panel_picks.xml      |  4 ----
 .../skins/default/xui/en/panel_places.xml     |  7 -------
 .../skins/default/xui/en/panel_profile.xml    |  2 --
 .../default/xui/en/panel_region_covenant.xml  |  1 -
 .../default/xui/en/panel_region_debug.xml     |  7 -------
 .../skins/default/xui/en/panel_status_bar.xml |  1 -
 .../default/xui/en/sidepanel_appearance.xml   |  2 --
 .../default/xui/en/sidepanel_inventory.xml    |  5 -----
 .../default/xui/en/sidepanel_item_info.xml    |  5 -----
 .../default/xui/en/sidepanel_task_info.xml    |  7 -------
 33 files changed, 4 insertions(+), 148 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index 615d1bf18d4..4f1024f56d9 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <floater
  can_tear_off="false"
  height="420"
@@ -215,7 +215,6 @@ Go to World menu &gt; About Land or select another parcel to show its details.
             </text>
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Profile..."
              label_selected="Profile..."
@@ -247,7 +246,6 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              width="250" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Set..."
              label_selected="Set..."
@@ -269,7 +267,6 @@ Go to World menu &gt; About Land or select another parcel to show its details.
             <button
              enabled="false"
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Deed..."
              label_selected="Deed..."
@@ -928,7 +925,6 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              bottom="100"
              enabled="false"
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Show"
              label_selected="Show"
@@ -940,7 +936,6 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              bottom="100"
              enabled="false"
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Return..."
              label_selected="Return..."
@@ -977,7 +972,6 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              bottom="120"
              enabled="false"
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Show"
              label_selected="Show"
@@ -989,7 +983,6 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              bottom="120"
              enabled="false"
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Return..."
              label_selected="Return..."
@@ -1026,7 +1019,6 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              bottom="140"
              enabled="false"
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Show"
              label_selected="Show"
@@ -1038,7 +1030,6 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              bottom="140"
              enabled="false"
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Return..."
              label_selected="Return..."
@@ -1108,7 +1099,6 @@ Go to World menu &gt; About Land or select another parcel to show its details.
             </text>
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Refresh List"
              label_selected="Refresh List"
@@ -1120,7 +1110,6 @@ Go to World menu &gt; About Land or select another parcel to show its details.
             <button
              enabled="false"
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Return objects..."
              label_selected="Return objects..."
@@ -1531,7 +1520,6 @@ Only large parcels can be listed in search.
             </text>
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Set"
              label_selected="Set"
@@ -1543,7 +1531,6 @@ Only large parcels can be listed in search.
              width="50" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Clear"
              label_selected="Clear"
@@ -1654,7 +1641,6 @@ Only large parcels can be listed in search.
              text_readonly_color="0.576471 0.662745 0.835294 1" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Set..."
              label_selected="Set..."
@@ -1685,7 +1671,6 @@ Only large parcels can be listed in search.
              width="300" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Reset..."
              label_selected="Reset..."
@@ -2119,7 +2104,6 @@ Texture:
              width="80" />
             <button
              follows="bottom"
-             font="SansSerifSmall"
              height="16"
              label="Remove"
              label_selected="Remove"
@@ -2155,7 +2139,6 @@ Texture:
              width="195" />
             <button
              follows="bottom"
-             font="SansSerifSmall"
              height="16"
              label="Add..."
              label_selected="Add..."
@@ -2167,7 +2150,6 @@ Texture:
             <button
              enabled="false"
              follows="bottom"
-             font="SansSerifSmall"
              height="16"
              label="Remove"
              label_selected="Remove"
diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml
index 9d2a811d9fc..275ab5bb8be 100644
--- a/indra/newview/skins/default/xui/en/floater_customize.xml
+++ b/indra/newview/skins/default/xui/en/floater_customize.xml
@@ -64,7 +64,6 @@
              width="82" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Body"
              label_selected="Body"
@@ -75,7 +74,6 @@
              width="82" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Head"
              label_selected="Head"
@@ -86,7 +84,6 @@
              width="82" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Eyes"
              label_selected="Eyes"
@@ -97,7 +94,6 @@
              width="82" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Ears"
              label_selected="Ears"
@@ -108,7 +104,6 @@
              width="82" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Nose"
              label_selected="Nose"
@@ -119,7 +114,6 @@
              width="82" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Mouth"
              label_selected="Mouth"
@@ -130,7 +124,6 @@
              width="82" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Chin"
              label_selected="Chin"
@@ -141,7 +134,6 @@
              width="82" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Torso"
              label_selected="Torso"
@@ -152,7 +144,6 @@
              width="82" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Legs"
              label_selected="Legs"
@@ -351,7 +342,6 @@ scratch and wear it.
              width="16" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Skin Color"
              label_selected="Skin Color"
@@ -362,7 +352,6 @@ scratch and wear it.
              width="82" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Face Detail"
              label_selected="Face Detail"
@@ -373,7 +362,6 @@ scratch and wear it.
              width="82" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Makeup"
              label_selected="Makeup"
@@ -384,7 +372,6 @@ scratch and wear it.
              width="82" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Body Detail"
              label_selected="Body Detail"
@@ -606,7 +593,6 @@ scratch and wear it.
              width="16" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Color"
              label_selected="Color"
@@ -617,7 +603,6 @@ scratch and wear it.
              width="82" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Style"
              label_selected="Style"
@@ -628,7 +613,6 @@ scratch and wear it.
              width="82" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Eyebrows"
              label_selected="Eyebrows"
@@ -639,7 +623,6 @@ scratch and wear it.
              width="82" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="16"
              label="Facial"
              label_selected="Facial"
diff --git a/indra/newview/skins/default/xui/en/floater_env_settings.xml b/indra/newview/skins/default/xui/en/floater_env_settings.xml
index 5233cb023d4..5e78037ee16 100644
--- a/indra/newview/skins/default/xui/en/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_env_settings.xml
@@ -136,7 +136,6 @@
      width="210" />
     <button
      follows="left|top"
-     font="SansSerifSmall"
      height="20"
      label="Use Estate Time"
      layout="topleft"
@@ -146,7 +145,6 @@
      width="137" />
     <button
      follows="left|top"
-     font="SansSerifSmall"
      height="20"
      label="Advanced Sky"
      layout="topleft"
@@ -156,7 +154,6 @@
      width="137" />
     <button
      follows="left|top"
-     font="SansSerifSmall"
      height="20"
      label="Advanced Water"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_god_tools.xml b/indra/newview/skins/default/xui/en/floater_god_tools.xml
index 79eed52fbfa..b01c0edc8bc 100644
--- a/indra/newview/skins/default/xui/en/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_god_tools.xml
@@ -191,7 +191,6 @@
 			</check_box>
             <button
              follows="top|right"
-             font="SansSerifSmall"
              height="22"
              label="Bake Terrain"
              label_selected="Bake Terrain"
@@ -206,7 +205,6 @@
 			</button>
             <button
              follows="top|right"
-             font="SansSerifSmall"
              height="22"
              label="Revert Terrain"
              label_selected="Revert Terrain"
@@ -220,7 +218,6 @@
 			</button>
             <button
              follows="top|right"
-             font="SansSerifSmall"
              height="22"
              label="Swap Terrain"
              label_selected="Swap Terrain"
@@ -419,7 +416,6 @@
 
             <button
              follows="top|right"
-             font="SansSerifSmall"
              height="22"
              label="Refresh"
              label_selected="Refresh"
@@ -434,7 +430,6 @@
 			</button>
             <button
              follows="top|right"
-             font="SansSerifSmall"
              height="22"
              label="Apply"
              label_selected="Apply"
@@ -449,7 +444,6 @@
 			</button>
             <button
              follows="top|right"
-             font="SansSerifSmall"
              height="22"
              label="Select Region"
              label_selected="Select Region"
@@ -464,7 +458,6 @@
 			</button>
             <button
              follows="top|right"
-             font="SansSerifSmall"
              height="22"
              label="Autosave now"
              label_selected="Autosave now"
@@ -556,7 +549,6 @@
 			</check_box>
             <button
              follows="top|right"
-             font="SansSerifSmall"
              height="22"
              label="Apply"
              label_selected="Apply"
@@ -571,7 +563,6 @@
 			</button>
 			<button
              follows="top|right"
-             font="SansSerifSmall"
              height="22"
              label="Set Target"
              label_selected="Set Target"
@@ -598,7 +589,6 @@
             </text>
             <button
              follows="top|right"
-             font="SansSerifSmall"
              height="22"
              label="Delete Target&apos;s Scripted Objects On Others Land"
              label_selected="Delete Target&apos;s Scripted Objects On Others Land"
@@ -613,7 +603,6 @@
 			</button>
             <button
              follows="top|right"
-             font="SansSerifSmall"
              height="22"
              label="Delete Target&apos;s Scripted Objects On *Any* Land"
              label_selected="Delete Target&apos;s Scripted Objects On *Any* Land"
@@ -628,7 +617,6 @@
 			</button>
             <button
              follows="top|right"
-             font="SansSerifSmall"
              height="22"
              label="Delete *ALL* Of Target&apos;s Objects"
              label_selected="Delete *ALL* Of Target&apos;s Objects"
@@ -643,7 +631,6 @@
 			</button>
 			<button
              follows="top|right"
-             font="SansSerifSmall"
              height="20"
              label="Get Top Colliders"
              label_selected="Get Top Colliders"
@@ -658,7 +645,6 @@
 			</button>
             <button
              follows="top|right"
-             font="SansSerifSmall"
              height="20"
              label="Get Top Scripts"
              label_selected="Get Top Scripts"
@@ -673,7 +659,6 @@
 			</button>
             <button
              follows="top|right"
-             font="SansSerifSmall"
              height="20"
              label="Scripts digest"
              label_selected="Scripts digest"
diff --git a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
index 4ca6002c13e..d34820347de 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
@@ -111,7 +111,6 @@
     </text>
     <button
      follows="top|right"
-     font="SansSerifSmall"
      height="16"
      label="Profile..."
      layout="topleft"
@@ -145,7 +144,6 @@
     </text>
     <button
      follows="top|right"
-     font="SansSerifSmall"
      height="16"
      label="Profile..."
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_moveview.xml b/indra/newview/skins/default/xui/en/floater_moveview.xml
index 5a8ffcebea5..cff0c29dfc3 100644
--- a/indra/newview/skins/default/xui/en/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/en/floater_moveview.xml
@@ -151,8 +151,7 @@
          top="2"
          width="31" />
         <button
-         follows="left|bottom"
-         font="SansSerifSmall" 
+         follows="left|bottom" 
          height="23"
          image_overlay="Move_Run_Off"
          image_selected="PushButton_Selected_Press" 
diff --git a/indra/newview/skins/default/xui/en/floater_openobject.xml b/indra/newview/skins/default/xui/en/floater_openobject.xml
index 3fd118df1c3..41a440aaa0b 100644
--- a/indra/newview/skins/default/xui/en/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/en/floater_openobject.xml
@@ -38,7 +38,6 @@
      width="284" />
     <button
      follows="bottom|left"
-     font="SansSerifSmall"
      height="23"
      label="Copy To Inventory"
      label_selected="Copy To Inventory"
@@ -53,7 +52,6 @@
     </button>
     <button
      follows="bottom|left"
-     font="SansSerifSmall"
      height="23"
      label="Copy And Wear"
      label_selected="Copy And Wear"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_animation.xml b/indra/newview/skins/default/xui/en/floater_preview_animation.xml
index 3b843584845..bbfb3623376 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_animation.xml
@@ -38,7 +38,6 @@
      width="170" />
     <button
      height="20"
-     font="SansSerifSmall"
      label="Play in World"
      label_selected="Stop"
      layout="topleft"
@@ -49,7 +48,6 @@
      width="125" />
     <button
      height="20"
-     font="SansSerifSmall"
      label="Play Locally"
      label_selected="Stop"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_sound.xml b/indra/newview/skins/default/xui/en/floater_preview_sound.xml
index 95347f0dff6..68a78d50170 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_sound.xml
@@ -50,7 +50,6 @@
     <button
      follows="left|top"
      height="22"
-     font="SansSerifSmall"
      label="Play Locally"
      label_selected="Play Locally"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_sell_land.xml b/indra/newview/skins/default/xui/en/floater_sell_land.xml
index 2cf800fb155..e6a78563f39 100644
--- a/indra/newview/skins/default/xui/en/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_sell_land.xml
@@ -205,7 +205,6 @@
      width="130" />
     <button
      height="20"
-     font="SansSerifSmall"
      label="Select"
      layout="topleft"
      left_pad="5"
@@ -267,7 +266,6 @@
     </radio_group>
     <button
      height="20"
-     font="SansSerifSmall"
      label="Show Objects"
      layout="topleft"
      name="show_objects"
@@ -290,7 +288,6 @@
     <button
      follows="bottom|left"
      height="20"
-     font="SansSerifSmall"
      label="Set Land For Sale"
      layout="topleft"
      left_delta="0"
@@ -300,7 +297,6 @@
     <button
      follows="bottom|right"
      height="20"
-     font="SansSerifSmall"
      label="Cancel"
      layout="topleft"
      left_pad="30"
diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml
index 95a40e27f75..8860ac1e500 100644
--- a/indra/newview/skins/default/xui/en/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml
@@ -120,7 +120,6 @@
      width="85" />
     <button
      follows="left|top"
-     font="SansSerifSmall"
      height="20"
      label="More &gt;&gt;"
      layout="topleft"
@@ -131,7 +130,6 @@
      width="80" />
     <button
      follows="left|top"
-     font="SansSerifSmall"
      height="20"
      label="&lt;&lt; Less"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_telehub.xml b/indra/newview/skins/default/xui/en/floater_telehub.xml
index cc0ab8c57e8..374f0149081 100644
--- a/indra/newview/skins/default/xui/en/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/en/floater_telehub.xml
@@ -57,7 +57,6 @@
     </text>
     <button
      follows="top|left"
-     font="SansSerifSmall"
      height="20"
      label="Connect Telehub"
      layout="topleft"
@@ -67,7 +66,6 @@
      width="110" />
     <button
      follows="top|left"
-     font="SansSerifSmall"
      height="20"
      label="Disconnect"
      layout="topleft"
@@ -97,7 +95,6 @@
      width="230" />
     <button
      follows="top|left"
-     font="SansSerifSmall"
      height="20"
      label="Add Spawn"
      layout="topleft"
@@ -107,7 +104,6 @@
      width="110" />
     <button
      follows="top|left"
-     font="SansSerifSmall"
      height="20"
      label="Remove Spawn"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_test_button.xml b/indra/newview/skins/default/xui/en/floater_test_button.xml
index 2bd0d1a0fab..8c6ad5c0f7f 100644
--- a/indra/newview/skins/default/xui/en/floater_test_button.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_button.xml
@@ -23,7 +23,6 @@
      name="bottom_delta_button" />
     <button
      bottom_delta="30"
-     font="SansSerifSmall"
      height="23"
      label="SansSerifSmall"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
index 4679ae467df..113da9ea4db 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
@@ -49,7 +49,6 @@
     <button
      enabled="false"
      follows="left|bottom"
-     font="SansSerifSmall"
      height="20"
      label="Default"
      label_selected="Default"
@@ -61,7 +60,6 @@
     <button
      enabled="false"
      follows="left|bottom"
-     font="SansSerifSmall"
      height="20"
      label="None"
      label_selected="None"
@@ -72,7 +70,6 @@
      width="80" />
     <button
      follows="left|bottom"
-     font="SansSerifSmall"
      height="20"
      label="Blank"
      label_selected="Blank"
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 8b6f0f03fe2..636e9d465ac 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -701,7 +701,6 @@
     </slider_bar>
     <button
      follows="left|top"
-     font="SansSerifSmall"
      height="19"
      label="Apply"
      label_selected="Apply"
@@ -927,7 +926,6 @@
              width="150" />
             <button
              follows="top|left"
-             font="SansSerifSmall"
              height="20"
              label="Deed"
              label_selected="Deed"
@@ -2606,7 +2604,6 @@ even though the user gets a free copy.
              width="170" />
             <button
              follows="left|top"
-             font="SansSerifSmall"
              height="19"
              label="Apply"
              label_selected="Apply"
@@ -2742,7 +2739,6 @@ even though the user gets a free copy.
         decouple_texture_size="true" />
      <button
 			 follows="left|top"
-			 font="SansSerifSmall"
 			 height="19"
 			 label="Align"
 			 label_selected="Align Media"
diff --git a/indra/newview/skins/default/xui/en/floater_url_entry.xml b/indra/newview/skins/default/xui/en/floater_url_entry.xml
index 1ab42cb1406..29fb29fabf8 100644
--- a/indra/newview/skins/default/xui/en/floater_url_entry.xml
+++ b/indra/newview/skins/default/xui/en/floater_url_entry.xml
@@ -32,7 +32,6 @@
     <button
      follows="top|left"
      height="20"
-     font="SansSerifSmall"
      label="OK"
      layout="topleft"
      left="10"
@@ -42,7 +41,6 @@
     <button
      follows="top|left"
      height="20"
-     font="SansSerifSmall"
      label="Cancel"
      layout="topleft"
      left_pad="5"
@@ -52,7 +50,6 @@
     <button
      follows="top|right"
      height="20"
-     font="SansSerifSmall"
      label="Clear"
      layout="topleft"
      left_pad="65"
diff --git a/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml
index ef68d03a450..4ece0fa3bae 100644
--- a/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml
+++ b/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml
@@ -17,9 +17,9 @@
 	     tool_tip="Enter a URL or URL pattern to White List"
 	     width="350" />
 
-  <button follows="top|left" height="20" font="SansSerifSmall" label="OK"
+  <button follows="top|left" height="20" label="OK"
      layout="topleft" left="10" name="ok_btn" bottom_delta="28" width="64" />
   
-  <button follows="top|left" height="20" font="SansSerifSmall" label="Cancel"
+  <button follows="top|left" height="20" label="Cancel"
      layout="topleft" left_pad="5" name="cancel_btn" bottom_delta="0" width="64" />
 </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml
index c60cc163c88..e3db0972ec7 100644
--- a/indra/newview/skins/default/xui/en/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_world_map.xml
@@ -116,7 +116,6 @@
     </text>
     <button
      follows="top|right"
-     font="SansSerifSmall"
      height="16"
      label="Go Home"
      label_selected="Go Home"
diff --git a/indra/newview/skins/default/xui/en/panel_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml
index bdca8531dc5..df889e87c3a 100644
--- a/indra/newview/skins/default/xui/en/panel_classified_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml
@@ -151,7 +151,6 @@
      name="buttons">
         <button
          follows="bottom|left"
-         font="SansSerifSmall"
          height="19"
          label="Teleport"
          layout="topleft"
@@ -161,7 +160,6 @@
          width="90" />
         <button
          follows="bottom|left"
-         font="SansSerifSmall"
          height="19"
          label="Map"
          layout="topleft"
@@ -171,7 +169,6 @@
          width="90" />
         <button
          follows="bottom|left"
-         font="SansSerifSmall"
          height="19"
          label="Edit"
          layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_group_invite.xml b/indra/newview/skins/default/xui/en/panel_group_invite.xml
index 1996977acb5..37578eae703 100644
--- a/indra/newview/skins/default/xui/en/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_invite.xml
@@ -33,7 +33,6 @@ invite to your group. Click &apos;Open
 Resident Chooser&apos; to start.
     </text>
     <button
-     font="SansSerifSmall"
      height="20"
      label="Open Resident Chooser"
      layout="topleft"
@@ -53,7 +52,6 @@ Resident Chooser&apos; to start.
      top_pad="4"
      width="200" />
     <button
-     font="SansSerifSmall"
      height="20"
      label="Remove Selected from List"
      layout="topleft"
@@ -82,7 +80,6 @@ Resident Chooser&apos; to start.
      top_delta="16"
      width="196" />
     <button
-     font="SansSerifSmall"
      height="20"
      label="Send Invitations"
      layout="topleft"
@@ -91,7 +88,6 @@ Resident Chooser&apos; to start.
      top="356"
      width="130" />
     <button
-     font="SansSerifSmall"
      height="20"
      label="Cancel"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
index a90337d31a2..bf33b752d9c 100644
--- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
@@ -41,7 +41,6 @@
 	 width="600">
 	     <button
 	     follows="left|top"
-	     font="SansSerifSmall"
 	     height="23"
 	     image_disabled="PushButton_Disabled"
 	     image_disabled_selected="PushButton_Disabled"
@@ -58,7 +57,6 @@
 
 	    <button
 	     follows="left|top"
-	     font="SansSerifSmall"
 	     height="23"
 	     image_disabled="PushButton_Disabled"
 	     image_disabled_selected="PushButton_Disabled"
@@ -74,7 +72,6 @@
 	     width="31" />
 	    <button
 	     follows="left|top"
-	     font="SansSerifSmall"
 	     height="23"
 	     image_disabled="PushButton_Disabled"
 	     image_disabled_selected="PushButton_Disabled"
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index a370b450e9a..87861e79018 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -344,7 +344,6 @@ background_visible="true"
      width="313">
         <button
          follows="bottom|left"
-         font="SansSerifSmall"
          top="4"
          left="0"
          height="19"
@@ -355,7 +354,6 @@ background_visible="true"
          width="70" />
         <button
          follows="bottom|left"
-         font="SansSerifSmall"
          top="4"
          left_pad="2"
          height="19"
@@ -366,7 +364,6 @@ background_visible="true"
          width="45" />
         <button
          follows="bottom|left"
-         font="SansSerifSmall"
          top="4"
          left_pad="2"
          height="19"
@@ -377,7 +374,6 @@ background_visible="true"
          width="50" />
         <button
          follows="left|top"
-         font="SansSerifSmall"
          top="4"
          left_pad="2"
          height="19"
@@ -387,7 +383,6 @@ background_visible="true"
          width="60" />
         <button
          follows="bottom|left"
-         font="SansSerifSmall"
          top="4"
          left_pad="2"
          height="19"
@@ -398,7 +393,6 @@ background_visible="true"
          width="75" />
         <button
          follows="bottom|left"
-         font="SansSerifSmall"
          top="4"
          left="0"
          height="19"
@@ -409,7 +403,6 @@ background_visible="true"
          width="110" />
         <button
          follows="bottom|left"
-         font="SansSerifSmall"
          top="4"
          left_pad="2"
          height="19"
diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml
index cf18aa2d393..0cf2a7afc31 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml
@@ -103,7 +103,6 @@
      name="buttons">
         <button
          follows="bottom|left"
-         font="SansSerifSmall"
          height="19"
          label="Teleport"
          layout="topleft"
@@ -113,7 +112,6 @@
          width="90" />
         <button
          follows="bottom|left"
-         font="SansSerifSmall"
          height="19"
          label="Map"
          layout="topleft"
@@ -123,7 +121,6 @@
          width="90" />
         <button
          follows="bottom|left"
-         font="SansSerifSmall"
          height="19"
          label="Edit"
          layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index 5cefe3e4ab5..69a81adecd0 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -131,7 +131,6 @@
        <button
          enabled="false"
          follows="bottom|left"
-         font="SansSerifSmall"
          height="25"
          label="Info"
          layout="topleft"
@@ -143,7 +142,6 @@
         <button
          enabled="false"
          follows="bottom|left"
-         font="SansSerifSmall"
          height="25"
          label="Teleport"
          layout="topleft"
@@ -155,7 +153,6 @@
         <button
          enabled="false"
          follows="bottom|left"
-         font="SansSerifSmall"
          height="25"
          label="Map"
          layout="topleft"
@@ -167,7 +164,6 @@
         <button
          enabled="false"
          follows="bottom|right"
-         font="SansSerifSmall"
          height="25"
          label="â–¼"
          layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index 5efacb68bea..88df529ec1f 100644
--- a/indra/newview/skins/default/xui/en/panel_places.xml
+++ b/indra/newview/skins/default/xui/en/panel_places.xml
@@ -72,7 +72,6 @@ background_visible="true"
      width="313">
         <button
          follows="bottom|left"
-         font="SansSerifSmall"
          height="19"
          label="Teleport"
          layout="topleft"
@@ -82,7 +81,6 @@ background_visible="true"
          width="100" />
         <button
          follows="bottom|left"
-         font="SansSerifSmall"
          height="19"
          label="Map"
          layout="topleft"
@@ -92,7 +90,6 @@ background_visible="true"
          width="70" />
         <button
          follows="bottom|left"
-         font="SansSerifSmall"
          height="19"
          label="Edit"
          layout="topleft"
@@ -102,7 +99,6 @@ background_visible="true"
          width="70" />
         <button
          follows="bottom|right"
-         font="SansSerifSmall"
          height="19"
          image_disabled="ForwardArrow_Off"
          image_selected="ForwardArrow_Press"
@@ -114,7 +110,6 @@ background_visible="true"
          width="18" />
         <button
          follows="bottom|right"
-         font="SansSerifSmall"
          height="19"
          label="Close"
          layout="topleft"
@@ -124,7 +119,6 @@ background_visible="true"
          width="60" />
         <button
          follows="bottom|right"
-         font="SansSerifSmall"
          height="19"
          label="Cancel"
          layout="topleft"
@@ -134,7 +128,6 @@ background_visible="true"
          width="60" />
         <button
          follows="bottom|right"
-         font="SansSerifSmall"
          height="19"
          label="Save"
          layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index bf1d46451bc..d2feaeba31f 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -324,7 +324,6 @@
          width="64" />
         <button
          follows="bottom|right"
-         font="SansSerifSmall"
          height="19"
          label="â–¼"
          layout="topleft"
@@ -344,7 +343,6 @@
      width="303">
         <button
          follows="bottom|right"
-         font="SansSerifSmall"
          height="19"
          left="10"
          label="Edit Profile"
diff --git a/indra/newview/skins/default/xui/en/panel_region_covenant.xml b/indra/newview/skins/default/xui/en/panel_region_covenant.xml
index 49fc930cd8a..75d7d85505f 100644
--- a/indra/newview/skins/default/xui/en/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_covenant.xml
@@ -119,7 +119,6 @@
     </text_editor>
     <button
      follows="left|top"
-     font="SansSerifSmall"
      height="18"
      label="Reset"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_region_debug.xml b/indra/newview/skins/default/xui/en/panel_region_debug.xml
index a1bca4229dc..e07585d285e 100644
--- a/indra/newview/skins/default/xui/en/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_debug.xml
@@ -61,7 +61,6 @@
     <button
      enabled="false"
      follows="left|top"
-     font="SansSerifSmall"
      height="20"
      label="Apply"
      layout="topleft"
@@ -109,7 +108,6 @@
     <button
      follows="left|top"
      height="20"
-     font="SansSerifSmall"
      label="Choose"
      layout="topleft"
      left_pad="5"
@@ -156,7 +154,6 @@
     <button
      follows="left|top"
      height="20"
-     font="SansSerifSmall"
      label="Return"
      layout="topleft"
      left="20"
@@ -165,7 +162,6 @@
      width="80" />
     <button
      follows="left|top"
-     font="SansSerifSmall"
      height="20"
      label="Get Top Colliders..."
      layout="topleft"
@@ -176,7 +172,6 @@
      width="150" />
     <button
      follows="left|top"
-     font="SansSerifSmall"
      height="20"
      label="Get Top Scripts..."
      layout="topleft"
@@ -187,7 +182,6 @@
      width="150" />
     <button
      follows="left|top"
-     font="SansSerifSmall"
      height="20"
      label="Restart Region"
      layout="topleft"
@@ -198,7 +192,6 @@
      width="130" />
     <button
      follows="left|top"
-     font="SansSerifSmall"
      height="20"
      label="Delay Restart"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index b1afe76500d..65bc48265dd 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -43,7 +43,6 @@
      auto_resize="true"
      halign="right"
      follows="right|bottom"
-     font="SansSerifSmall"
      image_selected="BuyArrow_Over"
      image_unselected="BuyArrow_Off"
      image_pressed="BuyArrow_Press"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index b9a89a2ebcc..4dae8e48a0b 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -71,7 +71,6 @@
   	     width="313" />
     <button
   	     follows="bottom|left"
-     font="SansSerifSmall"
   	     height="25"
   	     label="Wear"
   	     layout="topleft"
@@ -81,7 +80,6 @@
        	 width="80" />
     <button
     	 follows="bottom|left"
-     font="SansSerifSmall"
   	     height="25"
   	     label="New Outfit"
   	     layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
index b8b3d993bd1..51b74307c8a 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -41,7 +41,6 @@
 			<button
 				 enabled="true"
 				 follows="bottom|left"
-				 font="SansSerifSmall"
 				 height="25"
 				 label="Info"
 				 layout="topleft"
@@ -52,7 +51,6 @@
 			<button
 				 enabled="true"
 				 follows="bottom|left"
-				 font="SansSerifSmall"
 				 height="25"
 				 label="Share"
 				 layout="topleft"
@@ -63,7 +61,6 @@
 			<button
 				 enabled="false"
 				 follows="bottom|left"
-				 font="SansSerifSmall"
 				 height="25"
 				 label="Wear"
 				 layout="topleft"
@@ -74,7 +71,6 @@
 			<button
 				 enabled="false"
 				 follows="bottom|left"
-				 font="SansSerifSmall"
 				 height="25"
 				 label="Play"
 				 layout="topleft"
@@ -85,7 +81,6 @@
 			<button
 				 enabled="false"
 				 follows="bottom|left"
-				 font="SansSerifSmall"
 				 height="25"
 				 label="Teleport"
 				 layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index 6ae24773041..544d91fc51a 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -131,7 +131,6 @@
 	     </text>
 	     <button
 			 follows="top|right"
-			 font="SansSerifSmall"
 			 height="16"
 			 label="Profile..."
 			 layout="topleft"
@@ -165,7 +164,6 @@
 	     </text>
 	     <button
 			 follows="top|right"
-			 font="SansSerifSmall"
 			 height="16"
 			 label="Profile..."
 			 layout="topleft"
@@ -479,7 +477,6 @@
 		 width="313">
 	    <button
 		     follows="bottom|left"
-		     font="SansSerifSmall"
 		     height="25"
 		     label="Edit"
 		     layout="topleft"
@@ -489,7 +486,6 @@
 		     width="50" />
 	    <button
 		     follows="bottom|right"
-		     font="SansSerifSmall"
 		     height="25"
 		     label="Cancel"
 		     layout="topleft"
@@ -499,7 +495,6 @@
 		     width="70" />
 	    <button
 		     follows="bottom|right"
-		     font="SansSerifSmall"
 		     height="25"
 		     label="Save"
 		     layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
index 7647be78306..348f0dfc095 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
@@ -203,7 +203,6 @@
              width="150" />
             <button
              follows="top|left"
-             font="SansSerifSmall"
              height="20"
              label="Deed"
              label_selected="Deed"
@@ -485,7 +484,6 @@
 		 width="313">
 	    <button
 		     follows="bottom|left"
-		     font="SansSerifSmall"
 		     height="25"
 		     label="Edit"
 		     layout="topleft"
@@ -495,7 +493,6 @@
 		     width="50" />
 	    <button
 		     follows="bottom|left"
-		     font="SansSerifSmall"
 		     height="25"
 		     label="Open"
 		     layout="topleft"
@@ -505,7 +502,6 @@
 		     width="60" />
 	    <button
 		     follows="bottom|left"
-		     font="SansSerifSmall"
 		     height="25"
 		     label="Pay"
 		     layout="topleft"
@@ -515,7 +511,6 @@
 		     width="50" />
 	    <button
 		     follows="bottom|left"
-		     font="SansSerifSmall"
 		     height="25"
 		     label="Buy"
 		     layout="topleft"
@@ -525,7 +520,6 @@
 		     width="60" />
 	    <button
 		     follows="bottom|right"
-		     font="SansSerifSmall"
 		     height="25"
 		     label="Cancel"
 		     layout="topleft"
@@ -535,7 +529,6 @@
 		     width="70" />
 	    <button
 		     follows="bottom|right"
-		     font="SansSerifSmall"
 		     height="25"
 		     label="Save"
 		     layout="topleft"
-- 
GitLab


From d9accaab817e9aa1a298cbdccc8b32a4098124de Mon Sep 17 00:00:00 2001
From: Ramzi Linden <ramzi@lindenlab.com>
Date: Mon, 23 Nov 2009 15:41:35 -0800
Subject: [PATCH 527/557] DEV-43298 Expand widgets slightly in EN, make the
 currency symbol movable to the end:  floater_inventory_item_properties.xml

---
 .../en/floater_inventory_item_properties.xml  | 27 ++++++++++++++-----
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
index 4ca6002c13e..89e5b81da28 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
@@ -106,7 +106,7 @@
      left_delta="78"
      name="LabelCreatorName"
      top_delta="0"
-     width="200">
+     width="170">
         Nicole Linden
     </text>
     <button
@@ -140,7 +140,7 @@
      left_delta="78"
      name="LabelOwnerName"
      top_delta="0"
-     width="200">
+     width="170">
         Thrax Linden
     </text>
     <button
@@ -257,12 +257,13 @@
      type="string"
      length="1"
      follows="left|top"
-     height="10"
+     height="25"
      layout="topleft"
      left="10"
      name="NextOwnerLabel"
      top_pad="5"
-     width="78">
+     width="78"
+     word_wrap="true">
         Next owner:
     </text>
     <check_box
@@ -303,7 +304,7 @@
      layout="topleft"
      follows="left|top"
      name="combobox sale copy"
-     width="90">
+     width="110">
         <combo_box.item
          label="Copy"
          name="Copy"
@@ -320,13 +321,25 @@
         control_name="Edit Cost"
         name="Edit Cost"
         label="Price: L$"
-        label_width="60"
+        label_width="100"
         left="10"
-        width="180"
+        width="192"
         min_val="1"
         height="19"
         max_val="999999999"
         top_pad="5"/>
+    <text
+        type="string"
+        length="1"
+        height="15"
+        follows="left|top"
+        layout="topleft"
+        left_delta="82"
+        name="CurrencySymbol"
+        top_delta="1"
+        width="18">
+      L$
+    </text>
 
     <!--line_editor
      border_style="line"
-- 
GitLab


From 58eab5547fcd5f665c5254f31afd778797e5c84c Mon Sep 17 00:00:00 2001
From: Ramzi Linden <ramzi@lindenlab.com>
Date: Mon, 23 Nov 2009 15:55:41 -0800
Subject: [PATCH 528/557] DEV-43298 Expand widgets slightly in EN, make the
 currency symbol movable to the end:  sidepanel_item_info.xml

---
 .../default/xui/en/sidepanel_item_info.xml    | 31 +++++++++++++------
 1 file changed, 22 insertions(+), 9 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index 6ae24773041..b1a553d852f 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -126,7 +126,7 @@
 		     left_delta="78"
 		     name="LabelCreatorName"
 		     top_delta="0"
-		     width="200">
+		     width="140">
 	        Nicole Linden
 	     </text>
 	     <button
@@ -160,7 +160,7 @@
 			 left_delta="78"
 			 name="LabelOwnerName"
 			 top_delta="0"
-			 width="200">
+			 width="140">
 			    Thrax Linden
 	     </text>
 	     <button
@@ -194,7 +194,7 @@
 			 left_delta="78"
 			 name="LabelAcquiredDate"
 			 top_delta="0"
-			 width="252">
+			 width="222">
 			Wed May 24 12:50:46 2006
 	    </text>
 	    <text
@@ -277,12 +277,13 @@
 			 type="string"
 			 length="1"
 			 follows="left|top"
-			 height="10"
+			 height="25"
 			 layout="topleft"
 			 left="10"
 			 name="NextOwnerLabel"
 			 top_pad="5"
-			 width="78">
+			 width="78"
+			 word_wrap="true">
 			Next owner:
 	    </text>
 	    <check_box
@@ -323,7 +324,7 @@
 			 layout="topleft"
 			 follows="left|top"
 			 name="combobox sale copy"
-			 width="90">
+			 width="110">
 			<combo_box.item
 			     label="Copy"
 			     name="Copy"
@@ -339,14 +340,26 @@
 			    increment="1"
 			    control_name="Edit Cost"
 			    name="Edit Cost"
-			    label="Price: L$"
-			    label_width="60"
+			    label="Price:"
+			    label_width="100"
 			    left="10"
-			    width="180"
+			    width="192"
 			    min_val="1"
 			    height="19"
 			    max_val="999999999"
 			    top_pad="5"/>
+	    <text
+			    type="string"
+			    length="1"
+			    height="15"
+			    follows="left|top"
+			    layout="topleft"
+			    left_delta="82"
+			    name="CurrencySymbol"
+			    top_delta="1"
+			    width="18">
+			L$
+	    </text>
 	    <!--line_editor
 			 border_style="line"
 			 border_thickness="1"
-- 
GitLab


From 65fd784f136d4fc2183b97b6c15bd0c338bdb833 Mon Sep 17 00:00:00 2001
From: Ramzi Linden <ramzi@lindenlab.com>
Date: Mon, 23 Nov 2009 16:21:10 -0800
Subject: [PATCH 529/557] DEV-43298 Eliminate the second "L$" texts in my
 previous commit for:  floater_inventory_item_properties.xml

---
 .../skins/default/xui/en/floater_inventory_item_properties.xml  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
index 5287ece2273..366098013b5 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
@@ -318,7 +318,7 @@
         increment="1"
         control_name="Edit Cost"
         name="Edit Cost"
-        label="Price: L$"
+        label="Price:"
         label_width="100"
         left="10"
         width="192"
-- 
GitLab


From 2bdf430de13577e855a7a1f400173f6cd4ab8ac6 Mon Sep 17 00:00:00 2001
From: "Eric M. Tulla (BigPapi)" <tulla@lindenlab.com>
Date: Mon, 23 Nov 2009 19:59:47 -0500
Subject: [PATCH 530/557] small fixes for inv slurl functionality

---
 indra/newview/llviewerinventory.cpp | 2 +-
 indra/newview/llviewermessage.cpp   | 3 +--
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index c6ec25c1cb3..ad3828bba60 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -80,7 +80,7 @@ class LLInventoryHandler : public LLCommandHandler
 		}
 		
 		const std::string verb = params[1].asString();
-		if (verb == "select")
+		//if (verb == "select")
 		{
 			std::vector<LLUUID> items_to_open;
 			items_to_open.push_back(inventory_id);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index b2693c799c9..7eed40589b6 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -169,7 +169,6 @@ static const F32 LLREQUEST_PERMISSION_THROTTLE_INTERVAL	= 10.0f; // seconds
 extern BOOL gDebugClicks;
 
 // function prototypes
-void open_offer(const std::vector<LLUUID>& items, const std::string& from_name);
 bool check_offer_throttle(const std::string& from_name, bool check_only);
 
 //inventory offer throttle globals
@@ -744,7 +743,7 @@ class LLOpenTaskOffer : public LLInventoryAddedObserver
 protected:
 	/*virtual*/ void done()
 	{
-		open_offer(mAdded, "");
+		open_inventory_offer(mAdded, "");
 		mAdded.clear();
 	}
  };
-- 
GitLab


From 9730dd6a940a478046cf590b06513829d469bb82 Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Mon, 23 Nov 2009 17:00:53 -0800
Subject: [PATCH 531/557] Added some threading debugging code. Should catch any
 recursive mutex locks in non Release builds.

---
 indra/llcommon/llthread.cpp      | 18 ++++++++++--
 indra/llcommon/llthread.h        |  5 ++++
 indra/newview/llappviewer.cpp    | 48 +++++++++++++++++++++-----------
 indra/newview/lltexturefetch.cpp |  8 ++++++
 4 files changed, 61 insertions(+), 18 deletions(-)

diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp
index 920d8c09777..37370e44e78 100644
--- a/indra/llcommon/llthread.cpp
+++ b/indra/llcommon/llthread.cpp
@@ -291,8 +291,8 @@ LLMutex::LLMutex(apr_pool_t *poolp) :
 
 LLMutex::~LLMutex()
 {
-#if _DEBUG
-	llassert(!isLocked()); // better not be locked!
+#if MUTEX_DEBUG
+	llassert_always(!isLocked()); // better not be locked!
 #endif
 	apr_thread_mutex_destroy(mAPRMutexp);
 	mAPRMutexp = NULL;
@@ -306,10 +306,24 @@ LLMutex::~LLMutex()
 void LLMutex::lock()
 {
 	apr_thread_mutex_lock(mAPRMutexp);
+#if MUTEX_DEBUG
+	// Have to have the lock before we can access the debug info
+	U32 id = LLThread::currentID();
+	if (mIsLocked[id] != FALSE)
+		llerrs << "Already locked in Thread: " << id << llendl;
+	mIsLocked[id] = TRUE;
+#endif
 }
 
 void LLMutex::unlock()
 {
+#if MUTEX_DEBUG
+	// Access the debug info while we have the lock
+	U32 id = LLThread::currentID();
+	if (mIsLocked[id] != TRUE)
+		llerrs << "Not locked in Thread: " << id << llendl;	
+	mIsLocked[id] = FALSE;
+#endif
 	apr_thread_mutex_unlock(mAPRMutexp);
 }
 
diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h
index 932d96d9406..d8aa90de2e8 100644
--- a/indra/llcommon/llthread.h
+++ b/indra/llcommon/llthread.h
@@ -128,6 +128,8 @@ class LL_COMMON_API LLThread
 
 //============================================================================
 
+#define MUTEX_DEBUG (LL_DEBUG || LL_RELEASE_WITH_DEBUG_INFO)
+
 class LL_COMMON_API LLMutex
 {
 public:
@@ -142,6 +144,9 @@ class LL_COMMON_API LLMutex
 	apr_thread_mutex_t *mAPRMutexp;
 	apr_pool_t			*mAPRPoolp;
 	BOOL				mIsLocalPool;
+#if MUTEX_DEBUG
+	std::map<U32, BOOL> mIsLocked;
+#endif
 };
 
 // Actually a condition/mutex pair (since each condition needs to be associated with a mutex).
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index a5ca06ce306..9f4e1f90c98 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -1357,19 +1357,25 @@ bool LLAppViewer::cleanup()
 		llinfos << "Waiting for pending IO to finish: " << pending << llendflush;
 		ms_sleep(100);
 	}
-	llinfos << "Shutting down." << llendflush;
+	llinfos << "Shutting down Views" << llendflush;
 
 	// Destroy the UI
 	if( gViewerWindow)
 		gViewerWindow->shutdownViews();
+
+	llinfos << "Cleaning up Inevntory" << llendflush;
 	
 	// Cleanup Inventory after the UI since it will delete any remaining observers
 	// (Deleted observers should have already removed themselves)
 	gInventory.cleanupInventory();
+
+	llinfos << "Cleaning up Selections" << llendflush;
 	
 	// Clean up selection managers after UI is destroyed, as UI may be observing them.
 	// Clean up before GL is shut down because we might be holding on to objects with texture references
 	LLSelectMgr::cleanupGlobals();
+	
+	llinfos << "Shutting down OpenGL" << llendflush;
 
 	// Shut down OpenGL
 	if( gViewerWindow)
@@ -1383,11 +1389,18 @@ bool LLAppViewer::cleanup()
 		gViewerWindow = NULL;
 		llinfos << "ViewerWindow deleted" << llendflush;
 	}
+
+	llinfos << "Cleaning up Keyboard & Joystick" << llendflush;
 	
 	// viewer UI relies on keyboard so keep it aound until viewer UI isa gone
 	delete gKeyboard;
 	gKeyboard = NULL;
 
+	// Turn off Space Navigator and similar devices
+	LLViewerJoystick::getInstance()->terminate();
+	
+	llinfos << "Cleaning up Objects" << llendflush;
+	
 	LLViewerObject::cleanupVOClasses();
 
 	LLWaterParamManager::cleanupClass();
@@ -1410,6 +1423,8 @@ bool LLAppViewer::cleanup()
 	}
 	LLPrimitive::cleanupVolumeManager();
 
+	llinfos << "Additional Cleanup..." << llendflush;	
+	
 	LLViewerParcelMgr::cleanupGlobals();
 
 	// *Note: this is where gViewerStats used to be deleted.
@@ -1429,9 +1444,11 @@ bool LLAppViewer::cleanup()
 	// Also after shutting down the messaging system since it has VFS dependencies
 
 	//
+	llinfos << "Cleaning up VFS" << llendflush;
 	LLVFile::cleanupClass();
-	llinfos << "VFS cleaned up" << llendflush;
 
+	llinfos << "Saving Data" << llendflush;
+	
 	// Quitting with "Remember Password" turned off should always stomp your
 	// saved password, whether or not you successfully logged in.  JC
 	if (!gSavedSettings.getBOOL("RememberPassword"))
@@ -1473,13 +1490,16 @@ bool LLAppViewer::cleanup()
 		gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""),mask);
 	}
 
-	// Turn off Space Navigator and similar devices
-	LLViewerJoystick::getInstance()->terminate();
-
 	removeMarkerFile(); // Any crashes from here on we'll just have to ignore
 	
 	writeDebugInfo();
 
+	LLLocationHistory::getInstance()->save();
+
+	LLAvatarIconIDCache::getInstance()->save();
+
+	llinfos << "Shutting down Threads" << llendflush;
+	
 	// Let threads finish
 	LLTimer idleTimer;
 	idleTimer.reset();
@@ -1512,14 +1532,9 @@ bool LLAppViewer::cleanup()
     sTextureFetch = NULL;
 	delete sImageDecodeThread;
     sImageDecodeThread = NULL;
-
-	LLLocationHistory::getInstance()->save();
-
-	LLAvatarIconIDCache::getInstance()->save();
-
 	delete mFastTimerLogThread;
 	mFastTimerLogThread = NULL;
-
+	
 	if (LLFastTimerView::sAnalyzePerformance)
 	{
 		llinfos << "Analyzing performance" << llendl;
@@ -1541,6 +1556,8 @@ bool LLAppViewer::cleanup()
 	}
 	LLMetricPerformanceTester::cleanClass() ;
 
+	llinfos << "Cleaning up Media and Textures" << llendflush;
+
 	//Note:
 	//LLViewerMedia::cleanupClass() has to be put before gTextureList.shutdown()
 	//because some new image might be generated during cleaning up media. --bao
@@ -1554,13 +1571,13 @@ bool LLAppViewer::cleanup()
 	LLVFSThread::cleanupClass();
 	LLLFSThread::cleanupClass();
 
-	llinfos << "VFS Thread finished" << llendflush;
-
 #ifndef LL_RELEASE_FOR_DOWNLOAD
 	llinfos << "Auditing VFS" << llendl;
 	gVFS->audit();
 #endif
 
+	llinfos << "Misc Cleanup" << llendflush;
+	
 	// For safety, the LLVFS has to be deleted *after* LLVFSThread. This should be cleaned up.
 	// (LLVFS doesn't know about LLVFSThread so can't kill pending requests) -Steve
 	delete gStaticVFS;
@@ -1574,12 +1591,11 @@ bool LLAppViewer::cleanup()
 
 	LLWatchdog::getInstance()->cleanup();
 
+	llinfos << "Shutting down message system" << llendflush;
 	end_messaging_system();
-	llinfos << "Message system deleted." << llendflush;
 
 	// *NOTE:Mani - The following call is not thread safe. 
 	LLCurl::cleanupClass();
-	llinfos << "LLCurl cleaned up." << llendflush;
 
 	// If we're exiting to launch an URL, do that here so the screen
 	// is at the right resolution before we launch IE.
@@ -1600,7 +1616,7 @@ bool LLAppViewer::cleanup()
 
 	ll_close_fail_log();
 
-    llinfos << "Goodbye" << llendflush;
+    llinfos << "Goodbye!" << llendflush;
 
 	// return 0;
 	return true;
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 6f3dabe5a73..9bb2a4ad0a9 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -931,6 +931,14 @@ bool LLTextureFetchWorker::doWork(S32 param)
 	
 	if (mState == DECODE_IMAGE)
 	{
+		if (mDesiredDiscard < 0)
+		{
+			// We aborted, don't decode
+			mState = DONE;
+			setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
+			return true;
+		}
+		
 		if (mFormattedImage->getDataSize() <= 0)
 		{
 			llerrs << "Decode entered with invalid mFormattedImage. ID = " << mID << llendl;
-- 
GitLab


From 699fc13edba0f777ba1bf3de443f3ac10564722e Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Mon, 23 Nov 2009 17:01:45 -0800
Subject: [PATCH 532/557] Added reverse LLCacheName lookup.

---
 indra/llmessage/llcachename.cpp | 36 +++++++++++++++++++++++++++++++--
 indra/llmessage/llcachename.h   |  4 ++++
 2 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp
index a403c44b71f..3078d80552b 100644
--- a/indra/llmessage/llcachename.cpp
+++ b/indra/llmessage/llcachename.cpp
@@ -189,6 +189,7 @@ typedef std::set<LLUUID>					AskQueue;
 typedef std::list<PendingReply*>			ReplyQueue;
 typedef std::map<LLUUID,U32>				PendingQueue;
 typedef std::map<LLUUID, LLCacheNameEntry*> Cache;
+typedef std::map<std::string, LLUUID> 		ReverseCache;
 
 class LLCacheName::Impl
 {
@@ -198,7 +199,9 @@ class LLCacheName::Impl
 
 	Cache				mCache;
 		// the map of UUIDs to names
-
+	ReverseCache   	  	mReverseCache;
+		// map of names to UUIDs
+	
 	AskQueue			mAskNameQueue;
 	AskQueue			mAskGroupQueue;
 		// UUIDs to ask our upstream host about
@@ -371,7 +374,9 @@ void LLCacheName::importFile(LLFILE* fp)
 		entry->mFirstName = firstname;
 		entry->mLastName = lastname;
 		impl.mCache[id] = entry;
-
+		std::string fullname = entry->mFirstName + " " + entry->mLastName;
+		impl.mReverseCache[fullname] = id;
+		
 		count++;
 	}
 
@@ -407,6 +412,8 @@ bool LLCacheName::importFile(std::istream& istr)
 		entry->mFirstName = agent[FIRST].asString();
 		entry->mLastName = agent[LAST].asString();
 		impl.mCache[id] = entry;
+		std::string fullname = entry->mFirstName + " " + entry->mLastName;
+		impl.mReverseCache[fullname] = id;
 
 		++count;
 	}
@@ -428,6 +435,7 @@ bool LLCacheName::importFile(std::istream& istr)
 		entry->mCreateTime = ctime;
 		entry->mGroupName = group[NAME].asString();
 		impl.mCache[id] = entry;
+		impl.mReverseCache[entry->mGroupName] = id;
 		++count;
 	}
 	llinfos << "LLCacheName loaded " << count << " group names" << llendl;
@@ -548,6 +556,27 @@ BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group)
 		return FALSE;
 	}
 }
+
+BOOL LLCacheName::getUUID(const std::string& first, const std::string& last, LLUUID& id)
+{
+	std::string fullname = first + " " + last;
+	return getUUID(fullname, id);
+}
+
+BOOL LLCacheName::getUUID(const std::string& fullname, LLUUID& id)
+{
+	ReverseCache::iterator iter = impl.mReverseCache.find(fullname);
+	if (iter != impl.mReverseCache.end())
+	{
+		id = iter->second;
+		return TRUE;
+	}
+	else
+	{
+		return FALSE;
+	}
+}
+
 // This is a little bit kludgy. LLCacheNameCallback is a slot instead of a function pointer.
 //  The reason it is a slot is so that the legacy get() function below can bind an old callback
 //  and pass it as a slot. The reason it isn't a boost::function is so that trackable behavior
@@ -897,10 +926,13 @@ void LLCacheName::Impl::processUUIDReply(LLMessageSystem* msg, bool isGroup)
 		if (!isGroup)
 		{
 			mSignal(id, entry->mFirstName, entry->mLastName, FALSE);
+			std::string fullname = entry->mFirstName + " " + entry->mLastName;
+			mReverseCache[fullname] = id;
 		}
 		else
 		{
 			mSignal(id, entry->mGroupName, "", TRUE);
+			mReverseCache[entry->mGroupName] = id;
 		}
 	}
 }
diff --git a/indra/llmessage/llcachename.h b/indra/llmessage/llcachename.h
index 8641437d862..29601ddc63b 100644
--- a/indra/llmessage/llcachename.h
+++ b/indra/llmessage/llcachename.h
@@ -86,6 +86,10 @@ class LLCacheName
 	BOOL getName(const LLUUID& id, std::string& first, std::string& last);
 	BOOL getFullName(const LLUUID& id, std::string& fullname);
 	
+	// Reverse lookup of UUID from name
+	BOOL LLCacheName::getUUID(const std::string& first, const std::string& last, LLUUID& id);
+	BOOL LLCacheName::getUUID(const std::string& fullname, LLUUID& id);
+	
 	// If available, this method copies the group name into the string
 	// provided. The caller must allocate at least
 	// DB_GROUP_NAME_BUF_SIZE characters. If not available, this
-- 
GitLab


From db79b2d0920bff9bf4f36e8249c0a243581d4c44 Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Mon, 23 Nov 2009 17:39:38 -0800
Subject: [PATCH 533/557] Change IM windows to minimize isntead of close. Need
 to make the icons overridable so that the minimize button can use the close
 art.

---
 indra/newview/skins/default/xui/en/floater_im_session.xml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index c20aaea2aa3..7e454d07a32 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -8,9 +8,9 @@
  left="0"
  name="panel_im"
  top="0"
- can_close="true"
+ can_close="false"
  can_dock="true"
- can_minimize="false"
+ can_minimize="true"
  visible="true"
  width="300"
  can_resize="true"
-- 
GitLab


From db1631e4c0986a07cb9290ff4e910ba1d15f5fe9 Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Mon, 23 Nov 2009 18:10:47 -0800
Subject: [PATCH 534/557] Fix for gcc warning

---
 indra/llmessage/llcachename.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/llmessage/llcachename.h b/indra/llmessage/llcachename.h
index 29601ddc63b..111cc8b650a 100644
--- a/indra/llmessage/llcachename.h
+++ b/indra/llmessage/llcachename.h
@@ -87,8 +87,8 @@ class LLCacheName
 	BOOL getFullName(const LLUUID& id, std::string& fullname);
 	
 	// Reverse lookup of UUID from name
-	BOOL LLCacheName::getUUID(const std::string& first, const std::string& last, LLUUID& id);
-	BOOL LLCacheName::getUUID(const std::string& fullname, LLUUID& id);
+	BOOL getUUID(const std::string& first, const std::string& last, LLUUID& id);
+	BOOL getUUID(const std::string& fullname, LLUUID& id);
 	
 	// If available, this method copies the group name into the string
 	// provided. The caller must allocate at least
-- 
GitLab


From 6634d3c1ccbe13d3c0cdd17b60628eabe633ea7d Mon Sep 17 00:00:00 2001
From: James Cook <james@lindenlab.com>
Date: Mon, 23 Nov 2009 18:16:03 -0800
Subject: [PATCH 535/557] Add damage % text to nav bar, clip text entry to
 avoid overlapping icons Fixed includes of llmenugl.h / llnotifications.h
 Note: Clipping is incorrect, I think due to line editor bug.

---
 indra/llui/lllineeditor.cpp                   |  13 ++
 indra/llui/lllineeditor.h                     |   3 +
 indra/newview/llgroupmgr.cpp                  |   1 +
 indra/newview/lllocationinputctrl.cpp         | 129 ++++++++++++------
 indra/newview/lllocationinputctrl.h           |   7 +-
 indra/newview/llpanelobjectinventory.cpp      |   1 +
 indra/newview/llstatusbar.h                   |   1 -
 .../default/xui/en/widgets/location_input.xml |  12 +-
 8 files changed, 121 insertions(+), 46 deletions(-)

diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index 406c77a365d..bd5734312a3 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -323,6 +323,19 @@ void LLLineEditor::setMaxTextLength(S32 max_text_length)
 	mMaxLengthBytes = max_len;
 } 
 
+void LLLineEditor::getTextPadding(S32 *left, S32 *right)
+{
+	*left = mTextPadLeft;
+	*right = mTextPadRight;
+}
+
+void LLLineEditor::setTextPadding(S32 left, S32 right)
+{
+	mTextPadLeft = left;
+	mTextPadRight = right;
+	updateTextPadding();
+}
+
 void LLLineEditor::updateTextPadding()
 {
 	static LLUICachedControl<S32> line_editor_hpad ("UILineEditorHPad", 0);
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index 4474963b1af..4c4b00094d4 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -226,6 +226,9 @@ class LLLineEditor
 	void			setKeystrokeCallback(callback_t callback, void* user_data);
 
 	void			setMaxTextLength(S32 max_text_length);
+	// Manipulate left and right padding for text
+	void getTextPadding(S32 *left, S32 *right);
+	void setTextPadding(S32 left, S32 right);
 
 	// Prevalidation controls which keystrokes can affect the editor
 	void			setPrevalidate( LLLinePrevalidateFunc func );
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index 0626a5c3d31..59537c1e651 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -52,6 +52,7 @@
 #include "llviewerwindow.h"
 #include "llpanelgroup.h"
 #include "llgroupactions.h"
+#include "llnotifications.h"
 #include "lluictrlfactory.h"
 #include <boost/regex.hpp>
 
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 5d2a0aa3824..063e98a8119 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -52,6 +52,7 @@
 #include "llteleporthistory.h"
 #include "llsidetray.h"
 #include "llslurl.h"
+#include "llstatusbar.h"			// getHealth()
 #include "lltrans.h"
 #include "llviewerinventory.h"
 #include "llviewerparcelmgr.h"
@@ -165,7 +166,8 @@ LLLocationInputCtrl::Params::Params()
 	push_icon("push_icon"),
 	build_icon("build_icon"),
 	scripts_icon("scripts_icon"),
-	damage_icon("damage_icon")
+	damage_icon("damage_icon"),
+	damage_text("damage_text")
 {
 }
 
@@ -200,7 +202,7 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
 	params.commit_on_focus_lost(false);
 	params.follows.flags(FOLLOWS_ALL);
 	mTextEntry = LLUICtrlFactory::create<LLURLLineEditor>(params);
-	this->addChild(mTextEntry);
+	addChild(mTextEntry);
 	// LLLineEditor is replaced with LLLocationLineEditor
 
 	// "Place information" button.
@@ -261,7 +263,10 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
 	LLIconCtrl::Params damage_icon = p.damage_icon;
 	mParcelIcon[DAMAGE_ICON] = LLUICtrlFactory::create<LLIconCtrl>(damage_icon);
 	addChild(mParcelIcon[DAMAGE_ICON]);
-	// TODO: health number?
+	
+	LLTextBox::Params damage_text = p.damage_text;
+	mDamageText = LLUICtrlFactory::create<LLTextBox>(damage_text);
+	addChild(mDamageText);
 	
 	// Register callbacks and load the location field context menu (NB: the order matters).
 	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Navbar.Action", boost::bind(&LLLocationInputCtrl::onLocationContextMenuItemClicked, this, _2));
@@ -405,11 +410,8 @@ void LLLocationInputCtrl::onTextEntry(LLLineEditor* line_editor)
  */
 void LLLocationInputCtrl::setText(const LLStringExplicit& text)
 {
-	if (mTextEntry)
-	{
-		mTextEntry->setText(text);
-		mHasAutocompletedText = FALSE;
-	}
+	mTextEntry->setText(text);
+	mHasAutocompletedText = FALSE;
 }
 
 void LLLocationInputCtrl::setFocus(BOOL b)
@@ -444,10 +446,18 @@ void LLLocationInputCtrl::onFocusLost()
 }
 
 void LLLocationInputCtrl::draw()
-{	
-	if(!hasFocus() && gSavedSettings.getBOOL("NavBarShowCoordinates")){
+{
+	static LLUICachedControl<bool> show_coords("NavBarShowCoordinates", false);
+	if(!hasFocus() && show_coords)
+	{
 		refreshLocation();
 	}
+	
+	static LLUICachedControl<bool> show_icons("NavBarShowParcelProperties", false);
+	if (show_icons)
+	{
+		refreshHealth();
+	}
 	LLComboBox::draw();
 }
 
@@ -544,10 +554,12 @@ void LLLocationInputCtrl::onLocationPrearrange(const LLSD& data)
 	
 	mList->mouseOverHighlightNthItem(-1); // Clear highlight on the last selected item.
 }
+
 bool LLLocationInputCtrl::findTeleportItemsByTitle(const LLTeleportHistoryItem& item, const std::string& filter)
 {
 	return item.mTitle.find(filter) != std::string::npos;
 }
+
 void LLLocationInputCtrl::onTextEditorRightClicked(S32 x, S32 y, MASK mask)
 {
 	if (mLocationContextMenu)
@@ -596,51 +608,82 @@ void LLLocationInputCtrl::refreshLocation()
 
 void LLLocationInputCtrl::refreshParcelIcons()
 {
+	// Our "cursor" moving right to left
+	S32 x = mAddLandmarkBtn->getRect().mLeft - mIconHPad;
+	
 	static LLUICachedControl<bool> show_properties("NavBarShowParcelProperties", false);
-	if (!show_properties)
+	if (show_properties)
+	{
+		LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance();
+		// *TODO buy
+		//bool allow_buy      = vpm->canAgentBuyParcel( vpm->getAgentParcel(), false);
+		bool allow_voice	= vpm->allowAgentVoice();
+		bool allow_fly		= vpm->allowAgentFly();
+		bool allow_push		= vpm->allowAgentPush();
+		bool allow_build	= vpm->allowAgentBuild();
+		bool allow_scripts	= vpm->allowAgentScripts();
+		bool allow_damage	= vpm->allowAgentDamage();
+		
+		// Most icons are "block this ability"
+		mParcelIcon[VOICE_ICON]->setVisible(   !allow_voice );
+		mParcelIcon[FLY_ICON]->setVisible(     !allow_fly );
+		mParcelIcon[PUSH_ICON]->setVisible(    !allow_push );
+		mParcelIcon[BUILD_ICON]->setVisible(   !allow_build );
+		mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts );
+		mParcelIcon[DAMAGE_ICON]->setVisible(  allow_damage );
+		mDamageText->setVisible(allow_damage);
+		
+		// Slide the parcel icons rect from right to left, adjusting rectangles of
+		// visible icons.  Assumes all icon rects are the same.
+		for (S32 i = 0; i < ICON_COUNT; ++i)
+		{
+			LLIconCtrl* icon = mParcelIcon[i];
+			if (icon->getVisible())
+			{
+				LLRect r = icon->getRect();
+				r.mLeft = x - r.getWidth();
+				r.mRight = x;
+				icon->setRect( r );
+				x -= r.getWidth() + mIconHPad;
+			}
+		}
+		LLRect text_rect = mDamageText->getRect();
+		text_rect.mLeft = x - text_rect.getWidth();
+		text_rect.mRight = x;
+		mDamageText->setRect(text_rect);
+		x -= text_rect.getWidth() + mIconHPad;
+	}
+	else
 	{
 		for (S32 i = 0; i < ICON_COUNT; ++i)
 		{
 			mParcelIcon[i]->setVisible(false);
 		}
-		return;
+		mDamageText->setVisible(false);
 	}
 	
-	LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance();
-	// *TODO buy
-	//bool allow_buy      = vpm->canAgentBuyParcel( vpm->getAgentParcel(), false);
-	bool allow_voice	= vpm->allowAgentVoice();
-	bool allow_fly		= vpm->allowAgentFly();
-	bool allow_push		= vpm->allowAgentPush();
-	bool allow_build	= vpm->allowAgentBuild();
-	bool allow_scripts	= vpm->allowAgentScripts();
-	bool allow_damage	= vpm->allowAgentDamage();
-
-	// Most icons are "block this ability"
-	mParcelIcon[VOICE_ICON]->setVisible(   !allow_voice );
-	mParcelIcon[FLY_ICON]->setVisible(     !allow_fly );
-	mParcelIcon[PUSH_ICON]->setVisible(    !allow_push );
-	mParcelIcon[BUILD_ICON]->setVisible(   !allow_build );
-	mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts );
-	mParcelIcon[DAMAGE_ICON]->setVisible(  allow_damage );
-	// *TODO damage meter
-
-	// Slide the parcel icons rect from right to left, adjusting rectangles of
-	// visible icons.  Assumes all icon rects are the same.
-	LLRect icon_rect = mParcelIcon[0]->getRect();
-	S32 icon_width = icon_rect.getWidth();
-	icon_rect.mRight = mAddLandmarkBtn->getRect().mLeft - mIconHPad;
-	icon_rect.mLeft = icon_rect.mRight - icon_width;
-	
-	for (S32 i = 0; i < ICON_COUNT; ++i)
+	S32 left_pad, right_pad;
+	mTextEntry->getTextPadding(&left_pad, &right_pad);
+	right_pad = mTextEntry->getRect().mRight - x;
+	llinfos << "JAMESDEBUG text entry rect " << mTextEntry->getRect()
+	<< " x " << x << " left_pad " << left_pad << " right_pad " << right_pad << llendl;
+	mTextEntry->setTextPadding(left_pad, right_pad);
+}
+
+void LLLocationInputCtrl::refreshHealth()
+{
+	// *FIXME: Status bar owns health information, should be in agent
+	if (gStatusBar)
 	{
-		if (mParcelIcon[i]->getVisible())
+		static S32 last_health = -1;
+		S32 health = gStatusBar->getHealth();
+		if (health != last_health)
 		{
-			mParcelIcon[i]->setRect( icon_rect );
-			icon_rect.translate( -icon_width - mIconHPad, 0);
+			std::string text = llformat("%d%%", health);
+			mDamageText->setText(text);
+			last_health = health;
 		}
 	}
-	// *TODO: health meter
 }
 
 void LLLocationInputCtrl::rebuildLocationHistory(std::string filter)
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h
index fefd0f7fec6..3bd23e80a98 100644
--- a/indra/newview/lllocationinputctrl.h
+++ b/indra/newview/lllocationinputctrl.h
@@ -35,6 +35,7 @@
 
 #include "llcombobox.h"
 #include "lliconctrl.h"		// Params
+#include "lltextbox.h"		// Params
 
 class LLLandmark;
 
@@ -73,6 +74,7 @@ class LLLocationInputCtrl
 											build_icon,
 											scripts_icon,
 											damage_icon;
+		Optional<LLTextBox::Params>			damage_text;
 		Params();
 	};
 
@@ -111,6 +113,9 @@ class LLLocationInputCtrl
 	void					refresh();
 	void					refreshLocation();
 	void					refreshParcelIcons();
+	// Refresh the value in the health percentage text field
+	void					refreshHealth();
+	
 	void					rebuildLocationHistory(std::string filter = "");
 	bool 					findTeleportItemsByTitle(const LLTeleportHistoryItem& item, const std::string& filter);
 	void					setText(const LLStringExplicit& text);
@@ -147,7 +152,7 @@ class LLLocationInputCtrl
 		ICON_COUNT
 	};
 	LLIconCtrl*	mParcelIcon[ICON_COUNT];
-	// TODO: Health meter?
+	LLTextBox* mDamageText;
 
 	LLAddLandmarkObserver*		mAddLandmarkObserver;
 	LLRemoveLandmarkObserver*	mRemoveLandmarkObserver;
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index dbe0ec3b86e..4237681c800 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -41,6 +41,7 @@
 
 #include "llpanelobjectinventory.h"
 
+#include "llmenugl.h"
 #include "roles_constants.h"
 
 #include "llagent.h"
diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h
index 3ce35499615..bdaacce981d 100644
--- a/indra/newview/llstatusbar.h
+++ b/indra/newview/llstatusbar.h
@@ -34,7 +34,6 @@
 #define LL_LLSTATUSBAR_H
 
 #include "llpanel.h"
-#include <llmenugl.h>
 
 // "Constants" loaded from settings.xml at start time
 extern S32 STATUS_BAR_HEIGHT;
diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml
index 1fed1c075a6..17b1479ec4d 100644
--- a/indra/newview/skins/default/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml
@@ -81,8 +81,18 @@
 	top="21"
     image_name="parcel_lght_Damage"
     />
+  <!-- Default text color is invisible on top of nav bar background -->
+  <damage_text
+    name="damage_text"
+	width="50"
+	height="18"
+	top="16"
+	halign="right"
+	font="SansSerifSmall"
+	text_color="TextFgColor"
+	/>
 
-    <combo_button name="Location History"
+  <combo_button name="Location History"
                           label=""
                           pad_right="0"/>
   <combo_list bg_writeable_color="MenuDefaultBgColor" page_lines="10"
-- 
GitLab


From cfccf4d5145274f7bfe1c88b7e51c000461226e8 Mon Sep 17 00:00:00 2001
From: angela <angela@lindenlab.com>
Date: Tue, 24 Nov 2009 11:54:33 +0800
Subject: [PATCH 536/557]   EXT-2780  allow_scroll = false in LLTextEditor will
 crash the viewer

---
 indra/llui/lltexteditor.cpp                   | 26 ++++++++++++++-----
 indra/newview/llchathistory.cpp               | 11 +++-----
 indra/newview/llpanelprofileview.cpp          |  3 +--
 .../default/xui/en/panel_chat_header.xml      |  7 ++---
 4 files changed, 28 insertions(+), 19 deletions(-)

diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 224f066968e..3f4ef24f82a 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -750,8 +750,10 @@ BOOL LLTextEditor::handleHover(S32 x, S32 y, MASK mask)
 	{
 		if( mIsSelecting ) 
 		{
-			mScroller->autoScroll(x, y);
-
+			if(mScroller)
+			{	
+				mScroller->autoScroll(x, y);
+			}
 			S32 clamped_x = llclamp(x, mTextRect.mLeft, mTextRect.mRight);
 			S32 clamped_y = llclamp(y, mTextRect.mBottom, mTextRect.mTop);
 			setCursorAtLocalPos( clamped_x, clamped_y, true );
@@ -799,7 +801,10 @@ BOOL LLTextEditor::handleMouseUp(S32 x, S32 y, MASK mask)
 	{
 		if( mIsSelecting )
 		{
-			mScroller->autoScroll(x, y);
+			if(mScroller)
+			{
+				mScroller->autoScroll(x, y);
+			}
 			S32 clamped_x = llclamp(x, mTextRect.mLeft, mTextRect.mRight);
 			S32 clamped_y = llclamp(y, mTextRect.mBottom, mTextRect.mTop);
 			setCursorAtLocalPos( clamped_x, clamped_y, true );
@@ -1696,7 +1701,15 @@ BOOL LLTextEditor::handleKeyHere(KEY key, MASK mask )
 	*/
 	if (mReadOnly)
 	{
-		handled = mScroller->handleKeyHere( key, mask );
+		if(mScroller)
+		{
+			handled = mScroller->handleKeyHere( key, mask );
+		}
+		else 
+		{
+			handled = handleNavigationKey( key, mask );
+		}
+
 	}
 	else
 	{
@@ -2135,9 +2148,8 @@ void LLTextEditor::drawPreeditMarker()
 void LLTextEditor::drawLineNumbers()
 {
 	LLGLSUIDefault gls_ui;
-
-	LLRect scrolled_view_rect = mScroller->getVisibleContentRect();
-	LLRect content_rect = mScroller->getContentWindowRect();
+	LLRect scrolled_view_rect = getVisibleDocumentRect();
+	LLRect content_rect = getTextRect();	
 	LLLocalClipRect clip(content_rect);
 	S32 first_line = getFirstVisibleLine();
 	S32 num_lines = getLineCount();
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index a95234099c1..24fa28c6cd1 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -33,12 +33,10 @@
 #include "llviewerprecompiledheaders.h"
 #include "llchathistory.h"
 #include "llpanel.h"
-#include "lltextbox.h"
-#include "lltexteditor.h"
 #include "lluictrlfactory.h"
 #include "llscrollcontainer.h"
 #include "llavatariconctrl.h"
-
+#include "lltexteditor.h"
 #include "llimview.h"
 #include "llcallingcard.h" //for LLAvatarTracker
 #include "llagentdata.h"
@@ -188,9 +186,8 @@ class LLChatHistoryHeader: public LLPanel
 
 		LLTextEditor* userName = getChild<LLTextEditor>("user_name");
 
-		LLUIColor color = style_params.color;
-		userName->setReadOnlyColor(color);
-		userName->setColor(color);
+		userName->setReadOnlyColor(style_params.readonly_color());
+		userName->setColor(style_params.color());
 		
 		if(!chat.mFromName.empty())
 		{
@@ -204,7 +201,7 @@ class LLChatHistoryHeader: public LLPanel
 		}
 
 		
-		LLTextBox* timeBox = getChild<LLTextBox>("time_box");
+		LLUICtrl* timeBox = getChild<LLUICtrl>("time_box");
 		timeBox->setValue(chat.mTimeStr);
 
 		LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
diff --git a/indra/newview/llpanelprofileview.cpp b/indra/newview/llpanelprofileview.cpp
index c7c2484be3d..bcf5b16aa65 100644
--- a/indra/newview/llpanelprofileview.cpp
+++ b/indra/newview/llpanelprofileview.cpp
@@ -43,7 +43,6 @@
 #include "llpanelpicks.h"
 #include "llpanelprofile.h"
 #include "llsidetraypanelcontainer.h"
-#include "lltexteditor.h"
 
 static LLRegisterPanelClassWrapper<LLPanelProfileView> t_panel_target_profile("panel_profile_view");
 
@@ -191,7 +190,7 @@ void LLPanelProfileView::processOnlineStatus(bool online)
 void LLPanelProfileView::onAvatarNameCached(const LLUUID& id, const std::string& first_name, const std::string& last_name, BOOL is_group)
 {
 	llassert(getAvatarId() == id);
-	getChild<LLTextEditor>("user_name", FALSE)->setValue(first_name + " " + last_name);
+	getChild<LLUICtrl>("user_name", FALSE)->setValue(first_name + " " + last_name);
 }
 
 void LLPanelProfileView::togglePanel(LLPanel* panel)
diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml
index da175a75cd5..692461b1a25 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml
@@ -20,18 +20,19 @@
          top="3"
          width="18" />
     <text_editor
+	 v_pad = "0"
 	 read_only = "true"
      follows="left|right"
 	 font.style="BOLD"
-	 height="18"
+	 height="12"
 	 layout="topleft"
 	 left_pad="5"
      right="-50"
      name="user_name"
      text_color="white"
-	 top="5"
+	 top="8"
 	 use_ellipses="true"
-	 value="Erica Vader" />
+	 value="Ericag Vader" />
     <text
             font="SansSerifSmall"
          follows="right"
-- 
GitLab


From d93cece450b0f3897fa472d86db837274d35643b Mon Sep 17 00:00:00 2001
From: angela <angela@lindenlab.com>
Date: Tue, 24 Nov 2009 15:01:51 +0800
Subject: [PATCH 537/557] fix crash error for missing string RegisterDateFormat
 in panel_profile_user.xml

---
 indra/newview/llchathistory.cpp                           | 1 -
 indra/newview/skins/default/xui/en/panel_edit_profile.xml | 4 ++++
 indra/newview/skins/default/xui/en/panel_profile.xml      | 5 ++++-
 3 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 24fa28c6cd1..1d4878dc50d 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -36,7 +36,6 @@
 #include "lluictrlfactory.h"
 #include "llscrollcontainer.h"
 #include "llavatariconctrl.h"
-#include "lltexteditor.h"
 #include "llimview.h"
 #include "llcallingcard.h" //for LLAvatarTracker
 #include "llagentdata.h"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_profile.xml b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
index 2378ae518bf..a833ad97d9d 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
@@ -15,6 +15,10 @@
        [ACCTTYPE]
 [PAYMENTINFO] [AGEVERIFICATION]
    </string>
+   <string 
+    name="RegisterDateFormat">
+	[REG_DATE] ([AGE])
+   </string> 
    <string
     name="AcctTypeResident"
     value="Resident" />
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index d2feaeba31f..947bb67152a 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -27,7 +27,10 @@
     <string
      name="no_partner_text"
      value="None" />
-    <string name="RegisterDateFormat">[REG_DATE] ([AGE])</string>
+    <string 
+	 name="RegisterDateFormat">
+	 [REG_DATE] ([AGE])
+	</string>
   <scroll_container
      color="DkGray2"
      follows="all"
-- 
GitLab


From 06f638abdfdbd0a55087fe5ce0d90e261138758e Mon Sep 17 00:00:00 2001
From: Dmitry Oleshko <doleshko@productengine.com>
Date: Tue, 24 Nov 2009 11:44:55 +0200
Subject: [PATCH 538/557] fixed normal bug  (EXT-2653) Undocked IM floater
 blinks each time notification toasts fade away

- reduced a number of show-hide cycles for toasts
- only toasts showed for the first time will appear in foreground now (using of mFirstLook from LLFloater)

--HG--
branch : product-engine
---
 indra/llui/llfloater.h            |  1 +
 indra/newview/llscreenchannel.cpp | 20 +++++++++++++++++---
 indra/newview/lltoast.cpp         |  2 +-
 3 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 95c8dd84f65..1b98dddddc5 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -195,6 +195,7 @@ friend class LLMultiFloater;
 	/// The static isShown() can accept a NULL pointer (which of course
 	/// returns false). When non-NULL, it calls the non-static isShown().
 	static bool		isShown(const LLFloater* floater);
+	BOOL			isFirstLook() { return mFirstLook; } // EXT-2653: This function is necessary to prevent overlapping for secondary showed toasts
 	BOOL			isFrontmost();
 	BOOL			isDependent()					{ return !mDependeeHandle.isDead(); }
 	void			setCanMinimize(BOOL can_minimize);
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index fb9db42cf6e..ce89866b416 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -358,8 +358,6 @@ void LLScreenChannel::redrawToasts()
 	if(mToastList.size() == 0 || isHovering())
 		return;
 
-	hideToastsFromScreen();
-
 	switch(mToastAlignment)
 	{
 	case NA_TOP : 
@@ -383,6 +381,8 @@ void LLScreenChannel::showToastsBottom()
 	S32		toast_margin = 0;
 	std::vector<ToastElem>::reverse_iterator it;
 
+	closeOverflowToastPanel();
+
 	for(it = mToastList.rbegin(); it != mToastList.rend(); ++it)
 	{
 		if(it != mToastList.rbegin())
@@ -408,7 +408,20 @@ void LLScreenChannel::showToastsBottom()
 		if(stop_showing_toasts)
 			break;
 
-		(*it).toast->setVisible(TRUE);	
+		if( !(*it).toast->getVisible() )
+		{
+			if((*it).toast->isFirstLook())
+			{
+				(*it).toast->setVisible(TRUE);
+			}
+			else
+			{
+				// HACK
+				// EXT-2653: it is necessary to prevent overlapping for secondary showed toasts
+				(*it).toast->setVisible(TRUE);
+				gFloaterView->sendChildToBack((*it).toast);
+			}
+		}		
 	}
 
 	if(it != mToastList.rend() && !mOverflowToastHidden)
@@ -417,6 +430,7 @@ void LLScreenChannel::showToastsBottom()
 		for(; it != mToastList.rend(); it++)
 		{
 			(*it).toast->stopTimer();
+			(*it).toast->setVisible(FALSE);
 			mHiddenToastsNum++;
 		}
 		createOverflowToast(bottom, gSavedSettings.getS32("NotificationTipToastLifeTime"));
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index ed2cedbd10d..f9cbdc20d60 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -227,7 +227,7 @@ void LLToast::setVisible(BOOL show)
 		}
 		LLModalDialog::setFrontmost(FALSE);
 	}
-	LLPanel::setVisible(show);
+	LLFloater::setVisible(show);
 	if(mPanel)
 	{
 		if(!mPanel->isDead())
-- 
GitLab


From c004ddeab2b373f92f66f599ac91b0c17ac0202a Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Tue, 24 Nov 2009 12:59:02 +0200
Subject: [PATCH 539/557] Additional commit for low sub-task EXT-1153
 (FlatListView should support keyboard) - implemented "default ENTER" action
 for teleport history list.

--HG--
branch : product-engine
---
 indra/newview/llpanelteleporthistory.cpp | 7 +++++++
 indra/newview/llpanelteleporthistory.h   | 1 +
 2 files changed, 8 insertions(+)

diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 057cdde6f05..67d0e137863 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -262,6 +262,7 @@ BOOL LLTeleportHistoryPanel::postBuild()
 					fl->setCommitOnSelectionChange(true);
 					fl->setDoubleClickCallback(boost::bind(&LLTeleportHistoryPanel::onDoubleClickItem, this));
 					fl->setCommitCallback(boost::bind(&LLTeleportHistoryPanel::handleItemSelect, this, fl));
+					fl->setReturnCallback(boost::bind(&LLTeleportHistoryPanel::onReturnKeyPressed, this));
 				}
 			}
 		}
@@ -636,6 +637,12 @@ void LLTeleportHistoryPanel::handleItemSelect(LLFlatListView* selected)
 	updateVerbs();
 }
 
+void LLTeleportHistoryPanel::onReturnKeyPressed()
+{
+	// Teleport to selected region as default action on return key pressed
+	onTeleport();
+}
+
 void LLTeleportHistoryPanel::onDoubleClickItem()
 {
 	// If item got doubleclick, then that item is already selected
diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h
index b34d9e876c7..a31ff34cb6a 100644
--- a/indra/newview/llpanelteleporthistory.h
+++ b/indra/newview/llpanelteleporthistory.h
@@ -80,6 +80,7 @@ class LLTeleportHistoryPanel : public LLPanelPlacesTab
 private:
 
 	void onDoubleClickItem();
+	void onReturnKeyPressed();
 	void onAccordionTabRightClick(LLView *view, S32 x, S32 y, MASK mask);
 	void onAccordionTabOpen(LLAccordionCtrlTab *tab);
 	void onAccordionTabClose(LLAccordionCtrlTab *tab);
-- 
GitLab


From 0ef5b128aa4076be7cad424337d52ca5577aebdf Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Tue, 24 Nov 2009 13:17:19 +0200
Subject: [PATCH 540/557] Work on critical sub-task EXT-2615 (IM Chat History
 is severely broken)  -- Improved calculating of the LLTextBase::mContentsRect
 to take into account "left" coordinate. 	Previous implementation just
 ignored it.

--HG--
branch : product-engine
---
 indra/llui/lltextbase.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index e210667764b..ab1006ffd74 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -2060,16 +2060,16 @@ void LLTextBase::updateRects()
 			mContentsRect.unionWith(line_iter->mRect);
 		}
 
-		mContentsRect.mLeft = 0;
+		S32 delta_pos_x = -mContentsRect.mLeft;
 		mContentsRect.mTop += mVPad;
 
 		S32 delta_pos = -mContentsRect.mBottom;
 		// move line segments to fit new document rect
 		for (line_list_t::iterator it = mLineInfoList.begin(); it != mLineInfoList.end(); ++it)
 		{
-			it->mRect.translate(0, delta_pos);
+			it->mRect.translate(delta_pos_x, delta_pos);
 		}
-		mContentsRect.translate(0, delta_pos);
+		mContentsRect.translate(delta_pos_x, delta_pos);
 	}
 
 	// update document container dimensions according to text contents
-- 
GitLab


From 67ef3059b5a0084c6e501ae088cedf79d97f4277 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Tue, 24 Nov 2009 13:20:31 +0200
Subject: [PATCH 541/557] Work on critical sub-task EXT-2615 (IM Chat History
 is severely broken)  -- Implemented fitting of the timestamp in Chat History
 header panel depend on time string width

--HG--
branch : product-engine
---
 indra/newview/llchathistory.cpp               | 28 ++++++++++++++++---
 .../default/xui/en/panel_chat_header.xml      |  4 +--
 2 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 422aae3c259..dbb8e0fef4f 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -202,10 +202,8 @@ class LLChatHistoryHeader: public LLPanel
 			userName->setValue(SL);
 		}
 
+		setTimeField(chat.mTimeStr);
 		
-		LLTextBox* timeBox = getChild<LLTextBox>("time_box");
-		timeBox->setValue(chat.mTimeStr);
-
 		LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
 
 		if(mSourceType != CHAT_SOURCE_AGENT)
@@ -271,7 +269,29 @@ class LLChatHistoryHeader: public LLPanel
 		}
 	}
 
-	
+private:
+	void setTimeField(const std::string& time_value)
+	{
+		LLTextBox* time_box = getChild<LLTextBox>("time_box");
+
+		LLRect rect_before = time_box->getRect();
+		time_box->setValue(time_value);
+
+		// set necessary textbox width to fit all text
+		time_box->reshapeToFitText();
+		LLRect rect_after = time_box->getRect();
+
+		// move rect to the left to correct position...
+		llinfos << "WWW: " << rect_before << rect_after << llendl;
+		S32 delta_pos_x = rect_before.getWidth() - rect_after.getWidth();
+		S32 delta_pos_y = rect_before.getHeight() - rect_after.getHeight();
+		time_box->translate(delta_pos_x, delta_pos_y);
+
+		//... & change width of the name control
+		LLTextBox* user_name = getChild<LLTextBox>("user_name");
+		const LLRect& user_rect = user_name->getRect();
+		user_name->reshape(user_rect.getWidth() + delta_pos_x, user_rect.getHeight());
+	}
 
 protected:
 	LLHandle<LLView>	mPopupMenuHandleAvatar;
diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml
index 7a3eae35a92..96e5b4d4138 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml
@@ -25,7 +25,7 @@
          height="12"
          layout="topleft"
          left_pad="5"
-     right="-50"
+     right="-60"
      name="user_name"
      text_color="white"
          top="8"
@@ -39,7 +39,7 @@
          layout="topleft"
          left_pad="5"
      name="time_box"
-     right="-10"
+     right="-5"
      top="8"
          value="23:30"
          width="50" />
-- 
GitLab


From 96199e2d90eb5c8c5da04ab40b3c41ca3fd5eddc Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Tue, 24 Nov 2009 13:22:56 +0200
Subject: [PATCH 542/557] Remove unnecessary log message

--HG--
branch : product-engine
---
 indra/newview/llchathistory.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index dbb8e0fef4f..533940943ea 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -282,7 +282,6 @@ class LLChatHistoryHeader: public LLPanel
 		LLRect rect_after = time_box->getRect();
 
 		// move rect to the left to correct position...
-		llinfos << "WWW: " << rect_before << rect_after << llendl;
 		S32 delta_pos_x = rect_before.getWidth() - rect_after.getWidth();
 		S32 delta_pos_y = rect_before.getHeight() - rect_after.getHeight();
 		time_box->translate(delta_pos_x, delta_pos_y);
-- 
GitLab


From 76be5ddc7022508e7d3fcb04165b4a6f64f1d58d Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Tue, 24 Nov 2009 11:23:00 +0000
Subject: [PATCH 543/557] DEV-43332 New 'final' help URL format, as spec'd by
 enkidu.

---
 indra/newview/app_settings/settings.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 1eca897ea56..994e546bd03 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -3585,7 +3585,7 @@
       <key>Type</key>
       <string>String</string>
       <key>Value</key>
-      <string>http://docs.lindenlab.com/help/helpfloater.php?topic=[TOPIC]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;os=[OS]&amp;language=[LANGUAGE]&amp;version_major=[VERSION_MAJOR]&amp;version_minor=[VERSION_MINOR]&amp;version_patch=[VERSION_PATCH]&amp;version_build=[VERSION_BUILD]</string>
+      <string>http://viewer-help.secondlife.com/[LANGUAGE]/[CHANNEL]/[VERSION]/[TOPIC]</string>
     </map>
     <key>HighResSnapshot</key>
     <map>
-- 
GitLab


From c4a10e9a53bd8f55b63b28783fa3758c21f6a122 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Tue, 24 Nov 2009 13:28:14 +0200
Subject: [PATCH 544/557] fixed EXT-2684 "Notification toasts position is
 incorrect"

--HG--
branch : product-engine
---
 indra/newview/llviewerwindow.cpp | 27 +++++++++++++++++++--------
 indra/newview/llviewerwindow.h   |  1 +
 2 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index db66faef813..3840f337d4f 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1347,6 +1347,7 @@ LLViewerWindow::LLViewerWindow(
 
 	mDebugText = new LLDebugText(this);
 
+	mWorldViewRectScaled = calcScaledRect(mWorldViewRectRaw, mDisplayScale);
 }
 
 void LLViewerWindow::initGLDefaults()
@@ -2867,19 +2868,17 @@ void LLViewerWindow::updateWorldViewRect(bool use_full_window)
 
 	if (mWorldViewRectRaw != new_world_rect)
 	{
-		// sending a signal with a new WorldView rect
-		mOnWorldViewRectUpdated(mWorldViewRectRaw, new_world_rect);
-
+		LLRect old_world_rect = mWorldViewRectRaw;
 		mWorldViewRectRaw = new_world_rect;
 		gResizeScreenTexture = TRUE;
 		LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRectRaw.getHeight() );
 		LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() );
 
-		mWorldViewRectScaled = mWorldViewRectRaw;
-		mWorldViewRectScaled.mLeft = llround((F32)mWorldViewRectScaled.mLeft / mDisplayScale.mV[VX]);
-		mWorldViewRectScaled.mRight = llround((F32)mWorldViewRectScaled.mRight / mDisplayScale.mV[VX]);
-		mWorldViewRectScaled.mBottom = llround((F32)mWorldViewRectScaled.mBottom / mDisplayScale.mV[VY]);
-		mWorldViewRectScaled.mTop = llround((F32)mWorldViewRectScaled.mTop / mDisplayScale.mV[VY]);
+		mWorldViewRectScaled = calcScaledRect(mWorldViewRectRaw, mDisplayScale);
+
+		// sending a signal with a new WorldView rect
+		old_world_rect = calcScaledRect(old_world_rect, mDisplayScale);
+		mOnWorldViewRectUpdated(old_world_rect, mWorldViewRectScaled);
 	}
 }
 
@@ -4794,6 +4793,18 @@ void LLViewerWindow::calcDisplayScale()
 	}
 }
 
+//static
+LLRect 	LLViewerWindow::calcScaledRect(const LLRect & rect, const LLVector2& display_scale)
+{
+	LLRect res = rect;
+	res.mLeft = llround((F32)res.mLeft / display_scale.mV[VX]);
+	res.mRight = llround((F32)res.mRight / display_scale.mV[VX]);
+	res.mBottom = llround((F32)res.mBottom / display_scale.mV[VY]);
+	res.mTop = llround((F32)res.mTop / display_scale.mV[VY]);
+
+	return res;
+}
+
 S32 LLViewerWindow::getChatConsoleBottomPad()
 {
 	S32 offset = 0;
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 517993182be..747fd3b2536 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -391,6 +391,7 @@ class LLViewerWindow : public LLWindowCallbacks
 	F32				getWorldViewAspectRatio() const;
 	const LLVector2& getDisplayScale() const { return mDisplayScale; }
 	void			calcDisplayScale();
+	static LLRect 	calcScaledRect(const LLRect & rect, const LLVector2& display_scale);
 
 private:
 	bool                    shouldShowToolTipFor(LLMouseHandler *mh);
-- 
GitLab


From b79b8f81ea55a78fbf108107fd33fcb1a7933e99 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Tue, 24 Nov 2009 15:25:23 +0200
Subject: [PATCH 545/557] Work on critical sub-task EXT-2615 (IM Chat History
 is severely broken)  -- updated layout for P2P IM chat

--HG--
branch : product-engine
---
 .../skins/default/xui/en/floater_im_session.xml   | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index 7f2f37409c3..645c2973d88 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -18,7 +18,7 @@
  min_height="350">
   <layout_stack
   follows="all"
-  height="350"
+  height="320"
   width="300"
   layout="topleft"
   orientation="horizontal"
@@ -35,7 +35,8 @@
     <layout_panel
        left="0"
        top="0"
-	   width="180"
+       height="200"
+	     width="185"
        user_resize="false">
         <button
           height="20"
@@ -55,10 +56,9 @@
           width="25"
           name="slide_right_btn" />
         <chat_history
-         length="1"
 	 font="SansSerifSmall"
-         follows="left|right|top"
-         height="280"
+         follows="left|right|top|bottom"
+         height="150"
          name="chat_history"
          parse_highlights="true"
          allow_html="true"
@@ -66,12 +66,13 @@
          width="180">
         </chat_history>
         <line_editor
-         follows="left|right|top"
+         bottom="0" 
+         follows="left|right|bottom"
 	 font="SansSerifSmall"
          height="20"
          label="To"
+         layout="bottomleft"
          name="chat_editor"
-         top_pad="1"
          width="180">
         </line_editor>
     </layout_panel>
-- 
GitLab


From c4a676941f5d8625af967322a513a552715b526b Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Tue, 24 Nov 2009 15:51:31 +0200
Subject: [PATCH 546/557] Work on critical sub-task EXT-2615 (IM Chat History
 is severely broken)  -- updated layout for Group IM chat: added follows for
 left panel & its buttons.      Buttons were not centered when IM container
 was minimized & restored.

--HG--
branch : product-engine
---
 .../skins/default/xui/en/panel_group_control_panel.xml     | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
index 2fee2033f6f..41b210557e2 100644
--- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  border="false"
+ follows="left|top|right|bottom"
  height="238"
  name="panel_im_control_panel"
  width="180">
@@ -22,6 +23,7 @@
 
     <button
      bottom_pad="0"
+     follows="left|right|bottom" 
      height="20"
      label="Group Info"
      left_delta="28"
@@ -32,7 +34,7 @@
      background_visible="true"
      bg_alpha_color="0.2 0.2 0.2 1"
      border="false"
-     follows="left|bottom"
+     follows="left|right|bottom"
      height="70"
      left="0"
      left_pad="0"
@@ -42,6 +44,7 @@
 
         <button
          bottom="10"
+         follows="all" 
          height="20"
          label="Call Group"
          left_delta="28"
@@ -50,6 +53,7 @@
 
         <button
          bottom="40"
+         follows="all" 
          height="20"
          label="Leave Call"
          name="end_call_btn"
@@ -59,6 +63,7 @@
         <button
          enabled="false"
          bottom="10"
+         follows="all" 
          height="20"
          label="Open Voice Controls"
          name="voice_ctrls_btn"
-- 
GitLab


From ac52668b069deb61751c509794722a9fc1a7e86f Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Tue, 24 Nov 2009 16:00:20 +0200
Subject: [PATCH 547/557] Work on critical sub-task EXT-2615 (IM Chat History
 is severely broken)  -- updated layout for Ad-hoc IM chat: added follows for
 left panel & its buttons.      Buttons were not centered when IM container
 was minimized & restored.

--HG--
branch : product-engine
---
 .../skins/default/xui/en/panel_adhoc_control_panel.xml      | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
index a283cff5b37..368ab176894 100644
--- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  border="false"
+ follows="all"
  height="215"
  name="panel_im_control_panel"
  width="180">
@@ -23,7 +24,7 @@
      bg_alpha_color="DkGray2"
      border="false"
      bottom="1"
-     follows="left|bottom"
+     follows="left|right|bottom"
      height="70"
      left="0"
      left_pad="0"
@@ -32,6 +33,7 @@
      width="180">
         <button
          bottom="10"
+         follows="all"
          height="20"
          label="Call"
          left_delta="40"
@@ -39,6 +41,7 @@
          width="100" />
         <button
          bottom="40"
+         follows="all"
          height="20"
          label="Leave Call"
          name="end_call_btn"
@@ -46,6 +49,7 @@
          width="100" />
         <button
          enabled="false"
+         follows="all"
          bottom="10"
          height="20"
          label="Voice Controls"
-- 
GitLab


From 614865edae734d8f8c4ad6b22eee928ec0f08d61 Mon Sep 17 00:00:00 2001
From: Dmitry Oleshko <doleshko@productengine.com>
Date: Tue, 24 Nov 2009 17:38:15 +0200
Subject: [PATCH 548/557] fixed major bug (EXT-2748) Crash on exit from viewer
 without log in

When a focused control is being destroyed, focus gets passed to the login panel, that leads to crash if the panel has been destroyed already.
Made the focus manager reset keyboard focus in this case.

Found unreachable code in llstartup.cpp!

--HG--
branch : product-engine
---
 indra/newview/llpanellogin.cpp | 6 ++++--
 indra/newview/llstartup.cpp    | 2 +-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 78f3469f0e7..ec0f8e303c4 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -391,6 +391,10 @@ LLPanelLogin::~LLPanelLogin()
 
 	//// We know we're done with the image, so be rid of it.
 	//gTextureList.deleteImage( mLogoImage );
+
+	// Controls having keyboard focus by default
+	// must reset it on destroy. (EXT-2748)
+	gFocusMgr.setDefaultKeyboardFocus(NULL);
 }
 
 // virtual
@@ -682,8 +686,6 @@ void LLPanelLogin::closePanel()
 	if (sInstance)
 	{
 		gViewerWindow->getRootView()->removeChild( LLPanelLogin::sInstance );
-		
-		gFocusMgr.setDefaultKeyboardFocus(NULL);
 
 		delete sInstance;
 		sInstance = NULL;
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index d36ff1605e9..736be677104 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -2153,7 +2153,7 @@ void login_callback(S32 option, void *userdata)
 		LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
 		return;
 	}
-	else if (QUIT_OPTION == option)
+	else if (QUIT_OPTION == option) // *TODO: THIS CODE SEEMS TO BE UNREACHABLE!!!!! login_callback is never called with option equal to QUIT_OPTION
 	{
 		// Make sure we don't save the password if the user is trying to clear it.
 		std::string first, last, password;
-- 
GitLab


From 156ced177d22623f0b5291f043636b7d32f69470 Mon Sep 17 00:00:00 2001
From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com>
Date: Tue, 24 Nov 2009 11:16:34 -0500
Subject: [PATCH 549/557] Set global fontsize for tabs to SansSerifSmall
 http://jira.secondlife.com/browse/EXT-2731

---
 indra/newview/skins/default/xui/en/widgets/tab_container.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
index f1401140deb..477c6fb8b8a 100644
--- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml
+++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
@@ -2,7 +2,7 @@
 <tab_container tab_min_width="60"
                tab_max_width="150"
                font_halign="center"
-               font="SansSerif" 
+               font="SansSerifSmall" 
                tab_height="21">
   <first_tab tab_top_image_unselected="TabTop_Left_Off"
                tab_top_image_selected="TabTop_Left_Selected"
-- 
GitLab


From b0704256918d4576730ab324e1d67fe8fdd787c0 Mon Sep 17 00:00:00 2001
From: Dmitry Oleshko <doleshko@productengine.com>
Date: Tue, 24 Nov 2009 18:22:06 +0200
Subject: [PATCH 550/557] No ticket. A pointer member must be initialized in
 constructor.

--HG--
branch : product-engine
---
 indra/newview/llscreenchannel.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index ce89866b416..24ba288c49d 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -115,7 +115,9 @@ void LLScreenChannelBase::init(S32 channel_left, S32 channel_right)
 // LLScreenChannel
 //////////////////////
 //--------------------------------------------------------------------------
-LLScreenChannel::LLScreenChannel(LLUUID& id):	LLScreenChannelBase(id)
+LLScreenChannel::LLScreenChannel(LLUUID& id):	
+LLScreenChannelBase(id)
+,mStartUpToastPanel(NULL)
 {	
 }
 
-- 
GitLab


From 417bba0957d9d0e86c28e357e8409c6ef5ce1cae Mon Sep 17 00:00:00 2001
From: Vadim Savchuk <vsavchuk@productengine.com>
Date: Tue, 24 Nov 2009 19:35:24 +0200
Subject: [PATCH 551/557] Fixed a minor grammatical mistake.

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_picks.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index 5cefe3e4ab5..ece58180f72 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -24,7 +24,7 @@
   top="10"
   visible="false" 
   width="313">
-   There are no any picks/classifieds here
+   There are no picks/classifieds here
  </text>
  <accordion
   follows="all"
-- 
GitLab


From c227f93b1a6f89847242261f634079d4d6bfbf08 Mon Sep 17 00:00:00 2001
From: Sergey Borushevsky <sborushevsky@productengine.com>
Date: Tue, 24 Nov 2009 20:27:56 +0200
Subject: [PATCH 552/557] Fixed minor bug EXT-2745 (Contents of Groups field
 duplicates after IM session has been started)

--HG--
branch : product-engine
---
 indra/newview/llpanelavatar.cpp | 30 ++++++++++++++++++------------
 indra/newview/llpanelavatar.h   |  4 +++-
 2 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 03401d934fa..ed1d93db78c 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -359,7 +359,7 @@ void LLPanelAvatarProfile::onOpen(const LLSD& key)
 {
 	LLPanelProfileTab::onOpen(key);
 
-	mGroups.erase();
+	mGroups.clear();
 
 	//Disable "Add Friend" button for friends.
 	childSetEnabled("add_friend", !LLAvatarActions::isFriend(getAvatarId()));
@@ -391,7 +391,7 @@ void LLPanelAvatarProfile::resetControls()
 
 void LLPanelAvatarProfile::resetData()
 {
-	mGroups.erase();
+	mGroups.clear();
 	childSetValue("2nd_life_pic",LLUUID::null);
 	childSetValue("real_world_pic",LLUUID::null);
 	childSetValue("online_status",LLStringUtil::null);
@@ -443,23 +443,29 @@ void LLPanelAvatarProfile::processGroupProperties(const LLAvatarGroups* avatar_g
 	// Group properties may arrive in two callbacks, we need to save them across
 	// different calls. We can't do that in textbox as textbox may change the text.
 
-	std::string groups = mGroups;
 	LLAvatarGroups::group_list_t::const_iterator it = avatar_groups->group_list.begin();
 	const LLAvatarGroups::group_list_t::const_iterator it_end = avatar_groups->group_list.end();
 
-	if(groups.empty() && it_end != it)
-	{
-		groups = (*it).group_name;
-		++it;
-	}
 	for(; it_end != it; ++it)
 	{
 		LLAvatarGroups::LLGroupData group_data = *it;
-		groups += ", ";
-		groups += group_data.group_name;
+
+		// Check if there is no duplicates for this group
+		if (std::find(mGroups.begin(), mGroups.end(), group_data.group_name) == mGroups.end())
+			mGroups.push_back(group_data.group_name);
+	}
+
+	// Creating string, containing group list
+	std::string groups = "";
+	for (group_list_t::const_iterator it = mGroups.begin(); it != mGroups.end(); ++it)
+	{
+		if (it != mGroups.begin())
+			groups += ", ";
+
+		groups += *it;
 	}
-	mGroups = groups;
-	childSetValue("sl_groups",mGroups);
+
+	childSetValue("sl_groups", groups);
 }
 
 void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data)
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index a0caf0c9156..8e0965e0b77 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -183,7 +183,9 @@ class LLPanelAvatarProfile
 
 private:
 
-	std::string 			mGroups;
+	typedef std::list<std::string>	group_list_t;
+	group_list_t 			mGroups;
+
 	LLToggleableMenu*		mProfileMenu;
 };
 
-- 
GitLab


From 240c21cc2dd82dd41a664ec225fafb24bab44ca6 Mon Sep 17 00:00:00 2001
From: Sergey Borushevsky <sborushevsky@productengine.com>
Date: Tue, 24 Nov 2009 20:34:05 +0200
Subject: [PATCH 553/557] Related to implementation of EXT-2517 (Add support
 for the viewer 1.23 chat history style (widget-less)) - reverted changes in
 session processing code in LLIMFloater::onClose in rev. bd3f78cc1c42.

--HG--
branch : product-engine
---
 indra/newview/llimfloater.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 795770d3dbc..ee93a9349ae 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -110,10 +110,10 @@ void LLIMFloater::onFocusReceived()
 // virtual
 void LLIMFloater::onClose(bool app_quitting)
 {
-	if (!gIMMgr->hasSession(mSessionID)) return;
-	
 	setTyping(false);
-	gIMMgr->leaveSession(mSessionID);
+	// SJB: We want the close button to hide the session window, not end it
+	// *NOTE: Yhis is functional, but not ideal - it's still closing the floater; we really want to change the behavior of the X button instead.
+	//gIMMgr->leaveSession(mSessionID);
 }
 
 /* static */
-- 
GitLab


From 3d2fbad4cafae520f790f97dad6b4eb6a0363751 Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Tue, 24 Nov 2009 20:57:41 +0200
Subject: [PATCH 554/557] Fixed normal bug EXT-2570 (There is no
 connecting/leaving spatial voice chat notifications in the nearby chat)

--HG--
branch : product-engine
---
 indra/newview/llimview.cpp | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index c066f1f77ac..ffa943092f4 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -71,6 +71,7 @@
 #include "llviewermessage.h"
 #include "llviewerwindow.h"
 #include "llnotify.h"
+#include "llnearbychat.h"
 #include "llviewerregion.h"
 #include "llvoicechannel.h"
 #include "lltrans.h"
@@ -1611,6 +1612,12 @@ void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& mess
 		LLChat chat(message);
 		chat.mSourceType = CHAT_SOURCE_SYSTEM;
 		LLFloaterChat::addChatHistory(chat);
+
+		LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+		if(nearby_chat)
+		{
+			nearby_chat->addMessage(chat);
+		}
 	}
 	else // going to IM session
 	{
-- 
GitLab


From 87d7c6d6f962281f11b35e02a399e3d0e1dd9e12 Mon Sep 17 00:00:00 2001
From: Vadim Savchuk <vsavchuk@productengine.com>
Date: Tue, 24 Nov 2009 21:18:09 +0200
Subject: [PATCH 555/557] Work on task EXT-2092 (Task Panel tabs should toggle
 visibility of the panel). Made the People and Me task panels support the
 desired tri-state behavior. Until all the other task panels support that
 behavior, it is disabled.

--HG--
branch : product-engine
---
 indra/newview/llpanelme.cpp          | 47 +++++++++++++++++++++++++---
 indra/newview/llpanelme.h            |  1 +
 indra/newview/llpanelpeople.cpp      | 27 ++++++++++++++++
 indra/newview/llpanelpeople.h        |  4 +--
 indra/newview/llpanelprofile.cpp     | 18 ++---------
 indra/newview/llpanelprofile.h       |  2 +-
 indra/newview/llpanelprofileview.cpp |  4 ++-
 indra/newview/llpanelprofileview.h   |  2 +-
 indra/newview/llsidetray.cpp         | 39 ++++++-----------------
 9 files changed, 90 insertions(+), 54 deletions(-)

diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp
index e12da97f3bc..046118cf75b 100644
--- a/indra/newview/llpanelme.cpp
+++ b/indra/newview/llpanelme.cpp
@@ -38,6 +38,7 @@
 #include "llagent.h"
 #include "llagentwearables.h"
 #include "lliconctrl.h"
+#include "llsidetray.h"
 #include "lltabcontainer.h"
 #include "lltexturectrl.h"
 
@@ -70,6 +71,45 @@ void LLPanelMe::onOpen(const LLSD& key)
 	LLPanelProfile::onOpen(key);
 }
 
+void LLPanelMe::notifyChildren(const LLSD& info)
+{
+	if (info.has("task-panel-action") && info["task-panel-action"].asString() == "handle-tri-state")
+	{
+		// Implement task panel tri-state behavior.
+		//
+		// When the button of an active open task panel is clicked, side tray
+		// calls notifyChildren() on the panel, passing task-panel-action=>handle-tri-state as an argument.
+		// The task panel is supposed to handle this by reverting to the default view,
+		// i.e. closing any dependent panels like "pick info" or "profile edit".
+
+		bool on_default_view = true;
+
+		const LLRect& task_panel_rect = getRect();
+		for (LLView* child = getFirstChild(); child; child = findNextSibling(child))
+		{
+			LLPanel* panel = dynamic_cast<LLPanel*>(child);
+			if (!panel)
+				continue;
+
+			// *HACK: implement panel stack instead (e.g. me->pick_info->pick_edit).
+			if (panel->getRect().getWidth()  == task_panel_rect.getWidth()  &&
+				panel->getRect().getHeight() == task_panel_rect.getHeight() &&
+				panel->getVisible())
+			{
+				panel->setVisible(FALSE);
+				on_default_view = false;
+			}
+		}
+		
+		if (on_default_view)
+			LLSideTray::getInstance()->collapseSideBar();
+
+		return; // this notification is only supposed to be handled by task panels 
+	}
+
+	LLPanel::notifyChildren(info);
+}
+
 void LLPanelMe::buildEditPanel()
 {
 	if (NULL == mEditPanel)
@@ -84,8 +124,7 @@ void LLPanelMe::buildEditPanel()
 void LLPanelMe::onEditProfileClicked()
 {
 	buildEditPanel();
-	togglePanel(mEditPanel);
-	mEditPanel->onOpen(getAvatarId());
+	togglePanel(mEditPanel, getAvatarId()); // open
 }
 
 void LLPanelMe::onEditAppearanceClicked()
@@ -108,13 +147,13 @@ void LLPanelMe::onSaveChangesClicked()
 	data.allow_publish = mEditPanel->childGetValue("show_in_search_checkbox");
 
 	LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate(&data);
-	togglePanel(mEditPanel);
+	togglePanel(mEditPanel); // close
 	onOpen(getAvatarId());
 }
 
 void LLPanelMe::onCancelClicked()
 {
-	togglePanel(mEditPanel);
+	togglePanel(mEditPanel); // close
 }
 
 //////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelme.h b/indra/newview/llpanelme.h
index e16532a445c..17d367132ed 100644
--- a/indra/newview/llpanelme.h
+++ b/indra/newview/llpanelme.h
@@ -54,6 +54,7 @@ class LLPanelMe : public LLPanelProfile
 	LLPanelMe();
 
 	/*virtual*/ void onOpen(const LLSD& key);
+	/*virtual*/ void notifyChildren(const LLSD& info);
 
 	/*virtual*/ BOOL postBuild();
 
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 4dc88725573..2ccd10a0657 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -56,6 +56,8 @@
 #include "llgrouplist.h"
 #include "llinventoryobserver.h"
 #include "llpanelpeoplemenus.h"
+#include "llsidetray.h"
+#include "llsidetraypanelcontainer.h"
 #include "llrecentpeople.h"
 #include "llviewercontrol.h"		// for gSavedSettings
 #include "llviewermenu.h"			// for gMenuHolder
@@ -1263,6 +1265,31 @@ void	LLPanelPeople::onOpen(const LLSD& key)
 		reSelectedCurrentTab();
 }
 
+void LLPanelPeople::notifyChildren(const LLSD& info)
+{
+	if (info.has("task-panel-action") && info["task-panel-action"].asString() == "handle-tri-state")
+	{
+		LLSideTrayPanelContainer* container = dynamic_cast<LLSideTrayPanelContainer*>(getParent());
+		if (!container)
+		{
+			llwarns << "Cannot find People panel container" << llendl;
+			return;
+		}
+
+		if (container->getCurrentPanelIndex() > 0) 
+		{
+			// if not on the default panel, switch to it
+			container->onOpen(LLSD().insert(LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME, getName()));
+		}
+		else
+			LLSideTray::getInstance()->collapseSideBar();
+
+		return; // this notification is only supposed to be handled by task panels
+	}
+
+	LLPanel::notifyChildren(info);
+}
+
 void LLPanelPeople::showAccordion(const std::string name, bool show)
 {
 	if(name.empty())
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index a369bcd3e2a..d9dd76f3acd 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -50,8 +50,8 @@ class LLPanelPeople : public LLPanel
 	virtual ~LLPanelPeople();
 
 	/*virtual*/ BOOL 	postBuild();
-
-	virtual void	onOpen(const LLSD& key);
+	/*virtual*/ void	onOpen(const LLSD& key);
+	/*virtual*/ void	notifyChildren(const LLSD& info);
 
 	// internals
 	class Updater;
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index 02f45c1b487..4d152a13f30 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -158,28 +158,14 @@ void LLPanelProfile::onOpen(const LLSD& key)
 }
 
 //*TODO redo panel toggling
-void LLPanelProfile::togglePanel(LLPanel* panel)
+void LLPanelProfile::togglePanel(LLPanel* panel, const LLSD& key)
 {
 	// TRUE - we need to open/expand "panel"
 	bool expand = getChildList()->front() != panel;  // mTabCtrl->getVisible();
 
 	if (expand)
 	{
-		if (panel->getParent() != this)
-		{
-			addChild(panel);
-		}
-		else
-		{
-			sendChildToFront(panel);
-		}
-
-		panel->setVisible(TRUE);
-
-		LLRect new_rect = getRect();
-		panel->reshape(new_rect.getWidth(), new_rect.getHeight());
-		new_rect.setLeftTopAndSize(0, new_rect.getHeight(), new_rect.getWidth(), new_rect.getHeight());
-		panel->setRect(new_rect);
+		openPanel(panel, key);
 	}
 	else 
 	{
diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h
index e216eb70f26..067beb248b9 100644
--- a/indra/newview/llpanelprofile.h
+++ b/indra/newview/llpanelprofile.h
@@ -51,7 +51,7 @@ class LLPanelProfile : public LLPanel
 
 	/*virtual*/ void onOpen(const LLSD& key);
 
-	virtual void togglePanel(LLPanel*);
+	virtual void togglePanel(LLPanel*, const LLSD& key = LLSD());
 
 	virtual void openPanel(LLPanel* panel, const LLSD& params);
 
diff --git a/indra/newview/llpanelprofileview.cpp b/indra/newview/llpanelprofileview.cpp
index d4ab5013f95..08aea8cfd83 100644
--- a/indra/newview/llpanelprofileview.cpp
+++ b/indra/newview/llpanelprofileview.cpp
@@ -193,8 +193,10 @@ void LLPanelProfileView::onAvatarNameCached(const LLUUID& id, const std::string&
 	getChild<LLTextBox>("user_name", FALSE)->setValue(first_name + " " + last_name);
 }
 
-void LLPanelProfileView::togglePanel(LLPanel* panel)
+void LLPanelProfileView::togglePanel(LLPanel* panel, const LLSD& key)
 {
+	// *TODO: unused method?
+
 	LLPanelProfile::togglePanel(panel);
 	if(FALSE == panel->getVisible())
 	{
diff --git a/indra/newview/llpanelprofileview.h b/indra/newview/llpanelprofileview.h
index 45c2fc116e7..5dc617d4a04 100644
--- a/indra/newview/llpanelprofileview.h
+++ b/indra/newview/llpanelprofileview.h
@@ -64,7 +64,7 @@ class LLPanelProfileView : public LLPanelProfile
 	
 	/*virtual*/ BOOL postBuild();
 
-	/*virtual*/ void togglePanel(LLPanel* panel);
+	/*virtual*/ void togglePanel(LLPanel* panel, const LLSD& key = LLSD());
 
 	BOOL handleDragAndDrop(S32 x, S32 y, MASK mask,
 						   BOOL drop, EDragAndDropType cargo_type,
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 7711f3c7330..0b832a8239b 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -435,35 +435,16 @@ void		LLSideTray::processTriState ()
 		expandSideBar();
 	else
 	{
-		//!!!!!!!!!!!!!!!!!
-		//** HARDCODED!!!!!
-		//!!!!!!!!!!!!!!!!!
-
-		//there is no common way to determine "default" panel for tab
-		//so default panels for now will be hardcoded
-
-		//hardcoded for people tab and profile tab
-
-		/*if(mActiveTab == getTab("sidebar_people"))
-		{
-			LLSideTrayPanelContainer* container = findChild<LLSideTrayPanelContainer>("panel_container");
-			if(container && container->getCurrentPanelIndex()>0)
-			{
-				container->onOpen(LLSD().insert("sub_panel_name","panel_people"));
-			}
-			else
-				collapseSideBar();
-		}
-		else if(mActiveTab == getTab("sidebar_me"))
-		{
-			LLTabContainer* tab_container = findChild<LLTabContainer>("tabs");
-			if(tab_container && tab_container->getCurrentPanelIndex()>0)
-				tab_container->selectFirstTab();
-			else
-				collapseSideBar();
-		}
-		else*/
-			collapseSideBar();
+#if 0 // *TODO: EXT-2092
+		
+		// Tell the active task panel to switch to its default view
+		// or collapse side tray if already on the default view.
+		LLSD info;
+		info["task-panel-action"] = "handle-tri-state";
+		mActiveTab->notifyChildren(info);
+#else
+		collapseSideBar();
+#endif
 	}
 }
 
-- 
GitLab


From 88a56949d5b121132e3a068c72ab370834d72ceb Mon Sep 17 00:00:00 2001
From: "Eric M. Tulla (BigPapi)" <tulla@lindenlab.com>
Date: Tue, 24 Nov 2009 15:43:29 -0500
Subject: [PATCH 556/557] made task inventory offers work the old way, and
 disabled inv slurls for them.

---
 indra/newview/llviewerinventory.cpp           |   2 +-
 indra/newview/llviewermessage.cpp             | 271 +++++++++++++-----
 indra/newview/llviewermessage.h               |   1 +
 .../skins/default/xui/en/notifications.xml    |   8 -
 4 files changed, 208 insertions(+), 74 deletions(-)

diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index ad3828bba60..c6ec25c1cb3 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -80,7 +80,7 @@ class LLInventoryHandler : public LLCommandHandler
 		}
 		
 		const std::string verb = params[1].asString();
-		//if (verb == "select")
+		if (verb == "select")
 		{
 			std::vector<LLUUID> items_to_open;
 			items_to_open.push_back(inventory_id);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 7eed40589b6..eaffa752981 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1130,48 +1130,9 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
 
 	std::string from_string; // Used in the pop-up.
 	std::string chatHistory_string;  // Used in chat history.
-	if (mFromObject == TRUE)
-	{
-		if (mFromGroup)
-		{
-			std::string group_name;
-			if (gCacheName->getGroupName(mFromID, group_name))
-			{
-				from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+"'" 
-							+ mFromName + LLTrans::getString("'") +" " + LLTrans::getString("InvOfferOwnedByGroup") 
-				            + " "+ "'" + group_name + "'";
-				
-				chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByGroup") 
-								   + " " + group_name + "'";
-			}
-			else
-			{
-				from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+"'"
-				            + mFromName +"'"+ " " + LLTrans::getString("InvOfferOwnedByUnknownGroup");
-				chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByUnknownGroup");
-			}
-		}
-		else
-		{
-			std::string first_name, last_name;
-			if (gCacheName->getName(mFromID, first_name, last_name))
-			{
-				from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+ LLTrans::getString("'") + mFromName 
-							+ LLTrans::getString("'")+" " + LLTrans::getString("InvOfferOwnedBy") + first_name + " " + last_name;
-				chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedBy") + " " + first_name + " " + last_name;
-			}
-			else
-			{
-				from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+LLTrans::getString("'") 
-				            + mFromName + LLTrans::getString("'")+" " + LLTrans::getString("InvOfferOwnedByUnknownUser");
-				chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByUnknownUser");
-			}
-		}
-	}
-	else
-	{
-		from_string = chatHistory_string = mFromName;
-	}
+	
+	// TODO: when task inventory offers can also be handled the new way, migrate the code that sets these strings here:
+	from_string = chatHistory_string = mFromName;
 	
 	bool busy=FALSE;
 	
@@ -1281,8 +1242,182 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
 	return false;
 }
 
+bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const LLSD& response)
+{
+	LLChat chat;
+	std::string log_message;
+	S32 button = LLNotification::getSelectedOption(notification, response);
+	
+	// For muting, we need to add the mute, then decline the offer.
+	// This must be done here because:
+	// * callback may be called immediately,
+	// * adding the mute sends a message,
+	// * we can't build two messages at once.
+	if (2 == button)
+	{
+		gCacheName->get(mFromID, mFromGroup, &inventory_offer_mute_callback);
+	}
+	
+	LLMessageSystem* msg = gMessageSystem;
+	msg->newMessageFast(_PREHASH_ImprovedInstantMessage);
+	msg->nextBlockFast(_PREHASH_AgentData);
+	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+	msg->nextBlockFast(_PREHASH_MessageBlock);
+	msg->addBOOLFast(_PREHASH_FromGroup, FALSE);
+	msg->addUUIDFast(_PREHASH_ToAgentID, mFromID);
+	msg->addU8Fast(_PREHASH_Offline, IM_ONLINE);
+	msg->addUUIDFast(_PREHASH_ID, mTransactionID);
+	msg->addU32Fast(_PREHASH_Timestamp, NO_TIMESTAMP); // no timestamp necessary
+	std::string name;
+	LLAgentUI::buildFullname(name);
+	msg->addStringFast(_PREHASH_FromAgentName, name);
+	msg->addStringFast(_PREHASH_Message, ""); 
+	msg->addU32Fast(_PREHASH_ParentEstateID, 0);
+	msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null);
+	msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent());
+	LLInventoryObserver* opener = NULL;
+	LLViewerInventoryCategory* catp = NULL;
+	catp = (LLViewerInventoryCategory*)gInventory.getCategory(mObjectID);
+	LLViewerInventoryItem* itemp = NULL;
+	if(!catp)
+	{
+		itemp = (LLViewerInventoryItem*)gInventory.getItem(mObjectID);
+	}
+	
+	std::string from_string; // Used in the pop-up.
+	std::string chatHistory_string;  // Used in chat history.
+	if (mFromObject == TRUE)
+	{
+		if (mFromGroup)
+		{
+			std::string group_name;
+			if (gCacheName->getGroupName(mFromID, group_name))
+			{
+				from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+"'" 
+				+ mFromName + LLTrans::getString("'") +" " + LLTrans::getString("InvOfferOwnedByGroup") 
+				+ " "+ "'" + group_name + "'";
+				
+				chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByGroup") 
+				+ " " + group_name + "'";
+			}
+			else
+			{
+				from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+"'"
+				+ mFromName +"'"+ " " + LLTrans::getString("InvOfferOwnedByUnknownGroup");
+				chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByUnknownGroup");
+			}
+		}
+		else
+		{
+			std::string first_name, last_name;
+			if (gCacheName->getName(mFromID, first_name, last_name))
+			{
+				from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+ LLTrans::getString("'") + mFromName 
+				+ LLTrans::getString("'")+" " + LLTrans::getString("InvOfferOwnedBy") + first_name + " " + last_name;
+				chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedBy") + " " + first_name + " " + last_name;
+			}
+			else
+			{
+				from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+LLTrans::getString("'") 
+				+ mFromName + LLTrans::getString("'")+" " + LLTrans::getString("InvOfferOwnedByUnknownUser");
+				chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByUnknownUser");
+			}
+		}
+	}
+	else
+	{
+		from_string = chatHistory_string = mFromName;
+	}
+	
+	bool busy=FALSE;
+	
+	switch(button)
+	{
+		case IOR_ACCEPT:
+			// ACCEPT. The math for the dialog works, because the accept
+			// for inventory_offered, task_inventory_offer or
+			// group_notice_inventory is 1 greater than the offer integer value.
+			// Generates IM_INVENTORY_ACCEPTED, IM_TASK_INVENTORY_ACCEPTED, 
+			// or IM_GROUP_NOTICE_INVENTORY_ACCEPTED
+			msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 1));
+			msg->addBinaryDataFast(_PREHASH_BinaryBucket, &(mFolderID.mData),
+								   sizeof(mFolderID.mData));
+			// send the message
+			msg->sendReliable(mHost);
+			
+			//don't spam them if they are getting flooded
+			if (check_offer_throttle(mFromName, true))
+			{
+				log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString(".");
+				chat.mText = log_message;
+				LLFloaterChat::addChatHistory(chat);
+			}
+			
+			// we will want to open this item when it comes back.
+			LL_DEBUGS("Messaging") << "Initializing an opener for tid: " << mTransactionID
+			<< LL_ENDL;
+			switch (mIM)
+		{
+			case IM_TASK_INVENTORY_OFFERED:
+			case IM_GROUP_NOTICE:
+			case IM_GROUP_NOTICE_REQUESTED:
+			{
+				// This is an offer from a task or group.
+				// We don't use a new instance of an opener
+				// We instead use the singular observer gOpenTaskOffer
+				// Since it already exists, we don't need to actually do anything
+			}
+				break;
+			default:
+				LL_WARNS("Messaging") << "inventory_offer_callback: unknown offer type" << LL_ENDL;
+				break;
+		}	// end switch (mIM)
+			break;
+			
+		case IOR_BUSY:
+			//Busy falls through to decline.  Says to make busy message.
+			busy=TRUE;
+		case IOR_MUTE:
+			// MUTE falls through to decline
+		case IOR_DECLINE:
+			// DECLINE. The math for the dialog works, because the decline
+			// for inventory_offered, task_inventory_offer or
+			// group_notice_inventory is 2 greater than the offer integer value.
+			// Generates IM_INVENTORY_DECLINED, IM_TASK_INVENTORY_DECLINED,
+			// or IM_GROUP_NOTICE_INVENTORY_DECLINED
+		default:
+			// close button probably (or any of the fall-throughs from above)
+			msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 2));
+			msg->addBinaryDataFast(_PREHASH_BinaryBucket, EMPTY_BINARY_BUCKET, EMPTY_BINARY_BUCKET_SIZE);
+			// send the message
+			msg->sendReliable(mHost);
+			
+			log_message = LLTrans::getString("InvOfferYouDecline") + " " + mDesc + " " + LLTrans::getString("InvOfferFrom") + " " + mFromName +".";
+			chat.mText = log_message;
+			if( LLMuteList::getInstance()->isMuted(mFromID ) && ! LLMuteList::getInstance()->isLinden(mFromName) )  // muting for SL-42269
+			{
+				chat.mMuted = TRUE;
+			}
+			LLFloaterChat::addChatHistory(chat);
+			
+			if (busy &&	(!mFromGroup && !mFromObject))
+			{
+				busy_message(msg,mFromID);
+			}
+			break;
+	}
+	
+	if(opener)
+	{
+		gInventory.addObserver(opener);
+	}
+	
+	delete this;
+	return false;
+}
 
-void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)
+void inventory_offer_handler(LLOfferInfo* info)
 {
 	//Until throttling is implmented, busy mode should reject inventory instead of silently
 	//accepting it.  SEE SL-39554
@@ -1369,38 +1504,44 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)
 	args["OBJECTFROMNAME"] = info->mFromName;
 	args["NAME"] = info->mFromName;
 	args["NAME_SLURL"] = LLSLURL::buildCommand("agent", info->mFromID, "about");
-	std::string verb = "highlight?name=" + msg;
+	std::string verb = "select?name=" + msg;
 	args["ITEM_SLURL"] = LLSLURL::buildCommand("inventory", info->mObjectID, verb.c_str());
 
 	LLNotification::Params p("ObjectGiveItem");
-	p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, info, _1, _2));
 
-	if (from_task)
+	// Object -> Agent Inventory Offer
+	if (info->mFromObject)
 	{
+		// Inventory Slurls don't currently work for non agent transfers, so only display the object name.
+		args["ITEM_SLURL"] = msg;
+		// Note: sets inventory_task_offer_callback as the callback
+		p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_task_offer_callback, info, _1, _2));
 		p.name = name_found ? "ObjectGiveItem" : "ObjectGiveItemUnknownUser";
 	}
-	else
+	else // Agent -> Agent Inventory Offer
 	{
+		// Note: sets inventory_offer_callback as the callback
+		p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, info, _1, _2));
 		p.name = "UserGiveItem";
+		
+		// Prefetch the item into your local inventory.
+		LLInventoryFetchObserver::item_ref_t items;
+		items.push_back(info->mObjectID);
+		LLInventoryFetchObserver* fetch_item = new LLInventoryFetchObserver();
+		fetch_item->fetchItems(items);
+		if(fetch_item->isEverythingComplete())
+		{
+			fetch_item->done();
+		}
+		else
+		{
+			gInventory.addObserver(fetch_item);
+		}
+		
+		// In viewer 2 we're now auto receiving inventory offers and messaging as such (not sending reject messages).
+		info->send_auto_receive_response();
 	}
 	
-	// Prefetch the item into your local inventory.
-	LLInventoryFetchObserver::item_ref_t items;
-	items.push_back(info->mObjectID);
-	LLInventoryFetchObserver* fetch_item = new LLInventoryFetchObserver();
-	fetch_item->fetchItems(items);
-	if(fetch_item->isEverythingComplete())
-	{
-		fetch_item->done();
-	}
-	else
-	{
-		gInventory.addObserver(fetch_item);
-	}
-	
-	// In viewer 2 we're now auto receiving inventory offers and messaging as such (not sending reject messages).
-	info->send_auto_receive_response();
-	
 	// Pop up inv offer notification and let the user accept (keep), or reject (and silently delete) the inventory.
 	LLNotifications::instance().add(p);
 }
@@ -1897,7 +2038,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			}
 			else
 			{
-				inventory_offer_handler(info, dialog == IM_TASK_INVENTORY_OFFERED);
+				inventory_offer_handler(info);
 			}
 		}
 		break;
diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h
index 2d8930d2fe3..1a98828010f 100644
--- a/indra/newview/llviewermessage.h
+++ b/indra/newview/llviewermessage.h
@@ -222,6 +222,7 @@ struct LLOfferInfo
 	LLSD asLLSD();
 	void send_auto_receive_response(void);
 	bool inventory_offer_callback(const LLSD& notification, const LLSD& response);
+	bool inventory_task_offer_callback(const LLSD& notification, const LLSD& response);
 
 };
 
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index eb0db2683f9..3e622d779cb 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -4973,10 +4973,6 @@ An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has given you [OBJECTTYPE
        index="0"
        name="Keep"
        text="Keep"/>
-	  <button
-       index="4"
-       name="Show"
-       text="Show"/> 
       <button
        index="1"
        name="Discard"
@@ -4999,10 +4995,6 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you [O
        index="0"
        name="Keep"
        text="Keep"/>
-	  <button
-       index="4"
-       name="Show"
-       text="Show"/> 
       <button
        index="1"
        name="Discard"
-- 
GitLab


From de78ec1345648fb90c71fd8cc97a9134fc016803 Mon Sep 17 00:00:00 2001
From: Bryan O'Sullivan <bos@lindenlab.com>
Date: Tue, 24 Nov 2009 15:31:34 -0800
Subject: [PATCH 557/557] Nuke the last few references to the long-dead LCD
 code.

---
 indra/llui/llconsole.cpp      | 5 -----
 indra/newview/llappviewer.cpp | 7 -------
 2 files changed, 12 deletions(-)

diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp
index 48c76cf105c..fa0abd55d02 100644
--- a/indra/llui/llconsole.cpp
+++ b/indra/llui/llconsole.cpp
@@ -392,9 +392,4 @@ void LLConsole::addLine(const LLWString& wline, F32 size, const LLColor4 &color)
 	Paragraph paragraph(wline, color, mTimer.getElapsedTimeF32(), mFont,  (F32)getRect().getWidth() );
 	
 	mParagraphs.push_back ( paragraph );
-	
-#if LL_WINDOWS && LL_LCD_COMPILE
-	// add to LCD screen
-	AddNewDebugConsoleToLCD(wline);
-#endif	
 }
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index fa0ea557ba5..edad76a072d 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -799,13 +799,6 @@ bool LLAppViewer::init()
 	// call all self-registered classes
 	LLInitClassList::instance().fireCallbacks();
 
-	#if LL_LCD_COMPILE
-		// start up an LCD window on a logitech keyboard, if there is one
-		HINSTANCE hInstance = GetModuleHandle(NULL);
-		gLcdScreen = new LLLCD(hInstance);
-		CreateLCDDebugWindows();
-#endif
-
 	LLFolderViewItem::initClass(); // SJB: Needs to happen after initWindow(), not sure why but related to fonts
 		
 	gGLManager.getGLInfo(gDebugInfo);
-- 
GitLab